summaryrefslogtreecommitdiff
path: root/sound
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2017-01-30 19:40:04 +0300
committerTakashi Iwai <tiwai@suse.de>2017-02-03 19:23:37 +0300
commit033e925f68c92d058f2be67f941804e7e4f06f7c (patch)
treead7207e50d1cf63bbdad220cb27c3665ecebe04d /sound
parent437af8f2946231ee141bc2a8d37063a8bb6047b0 (diff)
downloadlinux-033e925f68c92d058f2be67f941804e7e4f06f7c.tar.xz
ALSA: x86: Fix possible stale interrupt calls
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>
Diffstat (limited to 'sound')
-rw-r--r--sound/x86/intel_hdmi_lpe_audio.c26
1 files changed, 13 insertions, 13 deletions
diff --git a/sound/x86/intel_hdmi_lpe_audio.c b/sound/x86/intel_hdmi_lpe_audio.c
index 54cc30f034f3..f5249b0a4ce4 100644
--- a/sound/x86/intel_hdmi_lpe_audio.c
+++ b/sound/x86/intel_hdmi_lpe_audio.c
@@ -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;
}