Jarkko Nikula
2014-09-18 10:48:44 UTC
I was blind to see interrupt was requested in codec probe instead of i2c
probe when doing commit 4adeb0ccf86a ("ASoC: max98090: Fix missing free_irq")
and there is still a case where interrupt is kept requested. Although not as
fatal as original issue.
Since codec can be reprobed while driver is loaded the subsequent
max98090_probe() call will fail in interrupt request since it wasn't freed.
Fix this by explicitly freeing irq in max98090_remove().
Signed-off-by: Jarkko Nikula <***@linux.intel.com>
---
for-next, I don't think this is critical enough for stable.
---
sound/soc/codecs/max98090.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/sound/soc/codecs/max98090.c b/sound/soc/codecs/max98090.c
index f1543653a699..ccc1466c0440 100644
--- a/sound/soc/codecs/max98090.c
+++ b/sound/soc/codecs/max98090.c
@@ -2413,6 +2413,7 @@ static int max98090_remove(struct snd_soc_codec *codec)
{
struct max98090_priv *max98090 = snd_soc_codec_get_drvdata(codec);
+ devm_free_irq(codec->dev, max98090->irq, codec);
cancel_delayed_work_sync(&max98090->jack_work);
cancel_delayed_work_sync(&max98090->pll_det_enable_work);
cancel_work_sync(&max98090->pll_det_disable_work);
probe when doing commit 4adeb0ccf86a ("ASoC: max98090: Fix missing free_irq")
and there is still a case where interrupt is kept requested. Although not as
fatal as original issue.
Since codec can be reprobed while driver is loaded the subsequent
max98090_probe() call will fail in interrupt request since it wasn't freed.
Fix this by explicitly freeing irq in max98090_remove().
Signed-off-by: Jarkko Nikula <***@linux.intel.com>
---
for-next, I don't think this is critical enough for stable.
---
sound/soc/codecs/max98090.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/sound/soc/codecs/max98090.c b/sound/soc/codecs/max98090.c
index f1543653a699..ccc1466c0440 100644
--- a/sound/soc/codecs/max98090.c
+++ b/sound/soc/codecs/max98090.c
@@ -2413,6 +2413,7 @@ static int max98090_remove(struct snd_soc_codec *codec)
{
struct max98090_priv *max98090 = snd_soc_codec_get_drvdata(codec);
+ devm_free_irq(codec->dev, max98090->irq, codec);
cancel_delayed_work_sync(&max98090->jack_work);
cancel_delayed_work_sync(&max98090->pll_det_enable_work);
cancel_work_sync(&max98090->pll_det_disable_work);
--
2.1.0
2.1.0