The error from hdmi_audio_probe() wasn't handled properly, and it may leave some resources leaked or mapped. Fix it and also clean up the error paths. Signed-off-by: Takashi Iwai <tiwai@xxxxxxx> --- sound/x86/intel_hdmi_lpe_audio.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/sound/x86/intel_hdmi_lpe_audio.c b/sound/x86/intel_hdmi_lpe_audio.c index 18a2ae6796b8..0c11d82eb99b 100644 --- a/sound/x86/intel_hdmi_lpe_audio.c +++ b/sound/x86/intel_hdmi_lpe_audio.c @@ -422,16 +422,14 @@ static int hdmi_lpe_audio_probe(struct platform_device *pdev) NULL); if (ret < 0) { dev_err(&hlpe_pdev->dev, "request_irq failed\n"); - iounmap(mmio_start); - return -ENODEV; + goto error_irq; } /* alloc and save context */ ctx = kzalloc(sizeof(*ctx), GFP_KERNEL); if (ctx == NULL) { - free_irq(irq, NULL); - iounmap(mmio_start); - return -ENOMEM; + ret = -ENOMEM; + goto error_ctx; } ctx->irq = irq; @@ -454,15 +452,16 @@ static int hdmi_lpe_audio_probe(struct platform_device *pdev) if (pdata == NULL) { dev_err(&hlpe_pdev->dev, "%s: quit: pdata not allocated by i915!!\n", __func__); - kfree(ctx); - free_irq(irq, NULL); - iounmap(mmio_start); - return -ENOMEM; + ret = -ENOMEM; + goto error_probe; } platform_set_drvdata(pdev, ctx); ret = hdmi_audio_probe(pdev, &ctx->had); + if (ret < 0) + goto error_probe; + dev_dbg(&hlpe_pdev->dev, "hdmi lpe audio: setting pin eld notify callback\n"); /* The Audio driver is loading now and we need to notify @@ -483,6 +482,14 @@ static int hdmi_lpe_audio_probe(struct platform_device *pdev) spin_unlock_irqrestore(&pdata->lpe_audio_slock, flag_irq); return ret; + + error_probe: + kfree(ctx); + error_ctx: + free_irq(irq, NULL); + error_irq: + iounmap(mmio_start); + return ret; } /** -- 2.11.0 _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel