ASoC: max98090: Move interrupt request from codec probe to i2c probe

Keep MAX98090 interrupt requested after i2c device probing as long as the
driver is loaded. This fixes the issue where subsequent codec probe
max98090_probe() call fails in interrupt request since interrupt wasn't
freed over codec remove-reprobe cycle.

Signed-off-by: Jarkko Nikula <jarkko.nikula@linux.intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
Jarkko Nikula 2014-09-19 14:48:17 +03:00 коммит произвёл Mark Brown
Родитель b8a3ee820f
Коммит 7a7f0ba03d
1 изменённых файлов: 16 добавлений и 13 удалений

Просмотреть файл

@ -2159,12 +2159,16 @@ static void max98090_jack_work(struct work_struct *work)
static irqreturn_t max98090_interrupt(int irq, void *data) static irqreturn_t max98090_interrupt(int irq, void *data)
{ {
struct snd_soc_codec *codec = data; struct max98090_priv *max98090 = data;
struct max98090_priv *max98090 = snd_soc_codec_get_drvdata(codec); struct snd_soc_codec *codec = max98090->codec;
int ret; int ret;
unsigned int mask; unsigned int mask;
unsigned int active; unsigned int active;
/* Treat interrupt before codec is initialized as spurious */
if (codec == NULL)
return IRQ_NONE;
dev_dbg(codec->dev, "***** max98090_interrupt *****\n"); dev_dbg(codec->dev, "***** max98090_interrupt *****\n");
ret = regmap_read(max98090->regmap, M98090_REG_INTERRUPT_S, &mask); ret = regmap_read(max98090->regmap, M98090_REG_INTERRUPT_S, &mask);
@ -2367,17 +2371,6 @@ static int max98090_probe(struct snd_soc_codec *codec)
snd_soc_write(codec, M98090_REG_JACK_DETECT, snd_soc_write(codec, M98090_REG_JACK_DETECT,
M98090_JDETEN_MASK | M98090_JDEB_25MS); M98090_JDETEN_MASK | M98090_JDEB_25MS);
/* Register for interrupts */
dev_dbg(codec->dev, "irq = %d\n", max98090->irq);
ret = devm_request_threaded_irq(codec->dev, max98090->irq, NULL,
max98090_interrupt, IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
"max98090_interrupt", codec);
if (ret < 0) {
dev_err(codec->dev, "request_irq failed: %d\n",
ret);
}
/* /*
* Clear any old interrupts. * Clear any old interrupts.
* An old interrupt ocurring prior to installing the ISR * An old interrupt ocurring prior to installing the ISR
@ -2417,6 +2410,7 @@ static int max98090_remove(struct snd_soc_codec *codec)
cancel_delayed_work_sync(&max98090->pll_det_enable_work); cancel_delayed_work_sync(&max98090->pll_det_enable_work);
cancel_work_sync(&max98090->pll_det_disable_work); cancel_work_sync(&max98090->pll_det_disable_work);
cancel_work_sync(&max98090->pll_work); cancel_work_sync(&max98090->pll_work);
max98090->codec = NULL;
return 0; return 0;
} }
@ -2478,6 +2472,15 @@ static int max98090_i2c_probe(struct i2c_client *i2c,
goto err_enable; goto err_enable;
} }
ret = devm_request_threaded_irq(&i2c->dev, max98090->irq, NULL,
max98090_interrupt, IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
"max98090_interrupt", max98090);
if (ret < 0) {
dev_err(&i2c->dev, "request_irq failed: %d\n",
ret);
return ret;
}
ret = snd_soc_register_codec(&i2c->dev, ret = snd_soc_register_codec(&i2c->dev,
&soc_codec_dev_max98090, max98090_dai, &soc_codec_dev_max98090, max98090_dai,
ARRAY_SIZE(max98090_dai)); ARRAY_SIZE(max98090_dai));