[alsa-devel] [RFC][PATCH] pxa2xx-ac97: switch AC unit to correct state before probing
Dmitry Baryshkov
dbaryshkov at gmail.com
Mon Nov 10 20:11:24 CET 2008
Hi,
I've stumbled upon a problem with my tosa unit. The bootloader leaves
ac97 in some partially enabled state, so when request_irq enables the
AC97 irq, I see a unending storm of irq requests. I've come with the
following patch (against 2.6.27, if the idea is OK, I'll rebase against
2.6.28-rc).
From: Dmitry Baryshkov <dbaryshkov at gmail.com>
If AC97 unit is in partially enabled state, early request_irq can trigger
IRQ storm or even full hang up. Workaround this by forcibly switching ACLINK off
at the start of the probe.
Signed-off-by: Dmitry Baryshkov <dbaryshkov at gmail.com>
---
sound/soc/pxa/pxa2xx-ac97.c | 30 +++++++++++++++++-------------
1 files changed, 17 insertions(+), 13 deletions(-)
diff --git a/sound/soc/pxa/pxa2xx-ac97.c b/sound/soc/pxa/pxa2xx-ac97.c
index d94a495..259c6e1 100644
--- a/sound/soc/pxa/pxa2xx-ac97.c
+++ b/sound/soc/pxa/pxa2xx-ac97.c
@@ -315,10 +315,6 @@ static int pxa2xx_ac97_probe(struct platform_device *pdev,
{
int ret;
- ret = request_irq(IRQ_AC97, pxa2xx_ac97_irq, IRQF_DISABLED, "AC97", NULL);
- if (ret < 0)
- goto err;
-
pxa_gpio_mode(GPIO31_SYNC_AC97_MD);
pxa_gpio_mode(GPIO30_SDATA_OUT_AC97_MD);
pxa_gpio_mode(GPIO28_BITCLK_AC97_MD);
@@ -331,28 +327,36 @@ static int pxa2xx_ac97_probe(struct platform_device *pdev,
if (IS_ERR(ac97conf_clk)) {
ret = PTR_ERR(ac97conf_clk);
ac97conf_clk = NULL;
- goto err_irq;
+ goto err_conf;
}
#endif
+ GCR = GCR_ACLINK_OFF;
+
ac97_clk = clk_get(&pdev->dev, "AC97CLK");
if (IS_ERR(ac97_clk)) {
ret = PTR_ERR(ac97_clk);
ac97_clk = NULL;
- goto err_irq;
+ goto err_clk;
}
clk_enable(ac97_clk);
+
+ ret = request_irq(IRQ_AC97, pxa2xx_ac97_irq, IRQF_DISABLED, "AC97", NULL);
+ if (ret < 0)
+ goto err_irq;
+
return 0;
- err_irq:
+err_irq:
GCR |= GCR_ACLINK_OFF;
+ clk_disable(ac97_clk);
+ clk_put(ac97_clk);
+ ac97_clk = NULL;
+err_clk:
#ifdef CONFIG_PXA27x
- if (ac97conf_clk) {
- clk_put(ac97conf_clk);
- ac97conf_clk = NULL;
- }
+ clk_put(ac97conf_clk);
+ ac97conf_clk = NULL;
+err_conf:
#endif
- free_irq(IRQ_AC97, NULL);
- err:
return ret;
}
--
1.5.6.5
--
With best wishes
Dmitry
More information about the Alsa-devel
mailing list