Audio: Check for jack status during boot time for HP_DET gpio pin only
authorVaibhav Agarwal <vaibhav.agarwal@intel.com>
Mon, 12 Mar 2012 09:51:44 +0000 (15:21 +0530)
committerbuildbot <buildbot@intel.com>
Fri, 30 Mar 2012 14:51:18 +0000 (07:51 -0700)
BZ: 27809

During clv_soc_jack_add_gpio(), clv_soc_jack_gpio_detect() is
executed irrespective of GPIO pin. (Headset detection, button press)
This caused, erroneous jack status reported to above layer during
boot time.

The solution is to verify jack status during boot time for HP_DET
gpio pin only.

This patch also contains some changes in clv_machine, cs42l73 driver
to be used as a loadable module.

Change-Id: I943fc6efb40bf16a6ecf2763c7263cbaeec9556c
Signed-off-by: Vaibhav Agarwal <vaibhav.agarwal@intel.com>
Reviewed-on: http://android.intel.com:8080/39830
Reviewed-by: Koul, Vinod <vinod.koul@intel.com>
Reviewed-by: M, Arulselvan <arulselvan.m@intel.com>
Tested-by: M, Arulselvan <arulselvan.m@intel.com>
Reviewed-by: buildbot <buildbot@intel.com>
Tested-by: buildbot <buildbot@intel.com>
sound/soc/codecs/cs42l73.c
sound/soc/mid-x86/clv_machine.c

index 3b25f35..64dc63b 100644 (file)
@@ -1289,7 +1289,10 @@ static __devexit int cs42l73_i2c_remove(struct i2c_client *client)
        struct cs42l73_private *cs42l73 = i2c_get_clientdata(client);
 
        snd_soc_unregister_codec(&client->dev);
-       kfree(cs42l73);
+
+       /* No need for kfree(cs42l73), as it'll be automatically freed
+        * once driver detach. Refer  devm_kzalloc() for details
+        */
 
        return 0;
 }
index 82c6fc8..7297cf0 100644 (file)
@@ -237,7 +237,8 @@ int clv_soc_jack_add_gpio(struct snd_soc_jack *jack,
        gpio_export(gpio->gpio, false);
 #endif
        /* Update initial jack status */
-       clv_soc_jack_gpio_detect(gpio);
+       if (gpio->gpio == CS42L73_HPSENSE_GPIO)
+               clv_soc_jack_gpio_detect(gpio);
        return 0;
 
 err:
@@ -436,8 +437,8 @@ static int snd_clv_mc_probe(struct ipc_device *ipcdev)
                goto unalloc;
        }
        vsp_mode = 1;
-       ipc_set_drvdata(ipcdev, mc_drv_ctx);
-       dev_set_drvdata(&ipcdev->dev, &snd_soc_card_clv);
+       ipc_set_drvdata(ipcdev, &snd_soc_card_clv);
+       snd_soc_card_set_drvdata(&snd_soc_card_clv, mc_drv_ctx);
        pr_debug("successfully exited probe\n");
        return ret_val;
 
@@ -448,13 +449,15 @@ unalloc:
 
 static int __devexit snd_clv_mc_remove(struct ipc_device *ipcdev)
 {
-       struct mfld_mc_private *mc_drv_ctx = ipc_get_drvdata(ipcdev);
+       struct snd_soc_card *soc_card = ipc_get_drvdata(ipcdev);
+       struct mfld_mc_private *mc_drv_ctx = snd_soc_card_get_drvdata(soc_card);
 
        pr_debug("In %s\n", __func__);
+       kfree(mc_drv_ctx);
        snd_soc_jack_free_gpios(&clv_jack, 1, &hs_jack_gpio);
        snd_soc_jack_free_gpios(&clv_jack, 1, &hs_button_gpio);
-       snd_soc_unregister_card(&snd_soc_card_clv);
-       kfree(mc_drv_ctx);
+       snd_soc_card_set_drvdata(soc_card, NULL);
+       snd_soc_unregister_card(soc_card);
        ipc_set_drvdata(ipcdev, NULL);
        return 0;
 }