ALSA: x86: Fix possible stale interrupt calls
authorTakashi Iwai <tiwai@suse.de>
Mon, 30 Jan 2017 16:40:04 +0000 (17:40 +0100)
committerTakashi Iwai <tiwai@suse.de>
Fri, 3 Feb 2017 16:23:37 +0000 (17:23 +0100)
Registering the irq handler at the too early place may cause a system
stall because the irq handler may be triggered before the other
initializations.  Move the irq handler registration to the later point.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/x86/intel_hdmi_lpe_audio.c

index 54cc30f034f3e8f1c5e9654a7732c6d163f40ea9..f5249b0a4ce46fe793b5dd8dd2883ffad86d90b3 100644 (file)
@@ -400,16 +400,6 @@ static int hdmi_lpe_audio_probe(struct platform_device *pdev)
                return -EACCES;
        }
 
-       /* setup interrupt handler */
-       ret = request_irq(irq, display_pipe_interrupt_handler,
-                       0,
-                       pdev->name,
-                       NULL);
-       if (ret < 0) {
-               dev_err(&hlpe_pdev->dev, "request_irq failed\n");
-               goto error_irq;
-       }
-
        /* alloc and save context */
        ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
        if (ctx == NULL) {
@@ -438,11 +428,21 @@ 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__);
                ret = -ENOMEM;
-               goto error_probe;
+               goto error_irq;
        }
 
        platform_set_drvdata(pdev, ctx);
 
+       /* setup interrupt handler */
+       ret = request_irq(irq, display_pipe_interrupt_handler,
+                       0,
+                       pdev->name,
+                       NULL);
+       if (ret < 0) {
+               dev_err(&hlpe_pdev->dev, "request_irq failed\n");
+               goto error_irq;
+       }
+
        ret = hdmi_audio_probe(pdev, &ctx->had);
        if (ret < 0)
                goto error_probe;
@@ -469,10 +469,10 @@ static int hdmi_lpe_audio_probe(struct platform_device *pdev)
        return ret;
 
  error_probe:
-       kfree(ctx);
- error_ctx:
        free_irq(irq, NULL);
  error_irq:
+       kfree(ctx);
+ error_ctx:
        iounmap(mmio_start);
        return ret;
 }