]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
soc: codecs: max98090: fix interrupt registration
authorShreshtha Sahu <ssahu@nvidia.com>
Mon, 21 Apr 2014 12:05:50 +0000 (17:35 +0530)
committerBharat Nihalani <bnihalani@nvidia.com>
Tue, 6 May 2014 14:17:51 +0000 (07:17 -0700)
This patch clears previous interrupt and installs interrupt
handler at the end of device probe. Also it enables jack
detection only after handler is installed. This prevents,
false/stale interrupt generation and hence device access
by interrupt handler even before device probe has completed.

Bug 1464724

Change-Id: I5988b500bb5e197c095eb64e254829635115994c
Signed-off-by: Shreshtha Sahu <ssahu@nvidia.com>
Reviewed-on: http://git-master/r/398891
Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>
Tested-by: Bharat Nihalani <bnihalani@nvidia.com>
sound/soc/codecs/max98090.c

index 6cb4102c41c0b52ad097e380137d5a042f18d546..3eda6a9c934e64e77e38352bee7ff0d62146a51d 100644 (file)
@@ -3756,19 +3756,8 @@ static int max98090_probe(struct snd_soc_codec *codec)
 
        INIT_DELAYED_WORK(&max98090->jack_work, max98090_jack_work);
 
-       /* Enable jack detection */
-       snd_soc_write(codec, M98090_REG_3D_CFG_JACK,
-               M98090_JDETEN_MASK | M98090_JDEB_25MS);
-
        max98090_handle_pdata(codec);
 
-       /* Register for interrupts */
-       if ((request_threaded_irq(audio_int, NULL,
-               max98090_interrupt, IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
-               "max98090_interrupt", codec)) < 0) {
-               dev_info(codec->dev, "request_irq failed\n");
-       }
-
 #ifdef MAX98090_HIGH_PERFORMANCE
        /* High Performance */
        snd_soc_update_bits(codec, M98090_REG_43_DAC_CFG,
@@ -3799,6 +3788,20 @@ static int max98090_probe(struct snd_soc_codec *codec)
 
        max98090_add_widgets(codec);
 
+       /* Clear existing interrupts */
+       snd_soc_read(codec, M98090_REG_01_IRQ_STATUS);
+
+       /* Register for interrupts */
+       if ((request_threaded_irq(audio_int, NULL,
+               max98090_interrupt, IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
+               "max98090_interrupt", codec)) < 0) {
+               dev_info(codec->dev, "request_irq failed\n");
+       }
+
+       /* Enable jack detection */
+       snd_soc_write(codec, M98090_REG_3D_CFG_JACK,
+               M98090_JDETEN_MASK | M98090_JDEB_25MS);
+
 err_access:
        return ret;
 }