asoc: tegra: ALC5640 machine: Fix ext mic detect issue
Manoj Gangwal [Fri, 16 Mar 2012 13:25:26 +0000 (18:25 +0530)]
Enable/disable the ext mic depending on the jack notification
for insertion/removal comes.This is done to save the Audio power.

Bug 955019

Signed-off-by: Manoj Gangwal <mgangwal@nvidia.com>
(cherry picked from commit 7a22037fd4a274637a5bdb18a8c5452fe58aad32)
Change-Id: I1a8b47c4e9c424a914f546b48c86a6fb07d8e42a
Reviewed-on: http://git-master/r/93956
Reviewed-by: Simone Willett <swillett@nvidia.com>
Tested-by: Simone Willett <swillett@nvidia.com>

sound/soc/tegra/tegra_rt5640.c

index 9fed84b..e7d5880 100644 (file)
@@ -277,11 +277,14 @@ static int tegra_rt5640_jack_notifier(struct notifier_block *self,
        struct snd_soc_codec *codec = jack->codec;
        struct snd_soc_card *card = codec->card;
        struct tegra_rt5640 *machine = snd_soc_card_get_drvdata(card);
+       struct tegra_rt5640_platform_data *pdata = machine->pdata;
        enum headset_state state = BIT_NO_HEADSET;
        unsigned char status_jack;
 
        if (jack == &tegra_rt5640_hp_jack) {
                if (action) {
+                       /* Enable ext mic; enable signal is active-low */
+                       gpio_direction_output(pdata->gpio_ext_mic_en, 0);
                        if (!strncmp(machine->pdata->codec_name, "rt5639", 6))
                                status_jack = rt5639_headset_detect(codec, 1);
                        else if (!strncmp(machine->pdata->codec_name, "rt5640",
@@ -302,6 +305,8 @@ static int tegra_rt5640_jack_notifier(struct notifier_block *self,
                                                        SND_JACK_MICROPHONE;
                        }
                } else {
+                       /* Disable ext mic; enable signal is active-low */
+                       gpio_direction_output(pdata->gpio_ext_mic_en, 1);
                        if (!strncmp(machine->pdata->codec_name, "rt5639", 6))
                                rt5639_headset_detect(codec, 0);
                        else if (!strncmp(machine->pdata->codec_name, "rt5640",