Message ID | 1411037324-5996-1-git-send-email-jarkko.nikula@linux.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Thu, Sep 18, 2014 at 01:48:44PM +0300, Jarkko Nikula wrote: > --- > for-next, I don't think this is critical enough for stable. > --- > @@ -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); If this is a fix for -next shouldn't we be doing the proper fix and moving the resource acquisition to the bus probe?
On 09/18/2014 08:54 PM, Mark Brown wrote: > On Thu, Sep 18, 2014 at 01:48:44PM +0300, Jarkko Nikula wrote: > >> --- >> for-next, I don't think this is critical enough for stable. >> --- >> @@ -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); > If this is a fix for -next shouldn't we be doing the proper fix and > moving the resource acquisition to the bus probe? Fair enough. I'll cook another version.
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);
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 <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(+)