This checks if the gpio is valid and frees it during unload of the
codec module.

Signed-off-by: Marc Dietrich <[email protected]>
---
Hi Andrey, Leon,

attached patch fixes an issure seen by Paul Ferster on IRC (oops after module 
unload/reload and hp jack pluged in).

 sound/soc/tegra/tegra_alc5632.c |   40 ++++++++++++++++++++------------------
 1 files changed, 21 insertions(+), 19 deletions(-)

diff --git a/sound/soc/tegra/tegra_alc5632.c b/sound/soc/tegra/tegra_alc5632.c
index f6b9e5a..6c8dfa2 100644
--- a/sound/soc/tegra/tegra_alc5632.c
+++ b/sound/soc/tegra/tegra_alc5632.c
@@ -38,9 +38,7 @@
 
 #define DRV_NAME "tegra-snd-alc5632"
 
-#define GPIO_SPKR_EN   BIT(0)
-#define GPIO_INT_MIC_EN        BIT(1)
-#define GPIO_EXT_MIC_EN        BIT(2)
+#define GPIO_HP_DET    BIT(0)
 
 struct tegra_alc5632 {
        struct tegra_asoc_utils_data util_data;
@@ -122,12 +120,10 @@ static struct snd_soc_jack_pin 
tegra_alc5632_hp_jack_pins[] = {
        },
 };
 
-static struct snd_soc_jack_gpio tegra_alc5632_hp_jack_gpios[] = {
-       {
-               .name = "headphone detect",
-               .report = SND_JACK_HEADPHONE,
-               .debounce_time = 150,
-       }
+static struct snd_soc_jack_gpio tegra_alc5632_hp_jack_gpio = {
+       .name = "headphone detect",
+       .report = SND_JACK_HEADPHONE,
+       .debounce_time = 150,
 };
 
 /* static struct snd_soc_jack tegra_alc5632_mic_jack;
@@ -226,16 +222,18 @@ static int tegra_alc5632_asoc_init(struct 
snd_soc_pcm_runtime *rtd)
        snd_soc_dapm_add_routes(dapm, tegra_alc5632_audio_map,
                                ARRAY_SIZE(tegra_alc5632_audio_map));
 
-       tegra_alc5632_hp_jack_gpios[0].gpio = pdata->gpio_hp_det;
-
-       snd_soc_jack_new(codec, "Headphone Jack", SND_JACK_HEADPHONE,
-                        &tegra_alc5632_hp_jack);
-       snd_soc_jack_add_pins(&tegra_alc5632_hp_jack,
-                             ARRAY_SIZE(tegra_alc5632_hp_jack_pins),
-                             tegra_alc5632_hp_jack_pins);
-       snd_soc_jack_add_gpios(&tegra_alc5632_hp_jack,
-                              ARRAY_SIZE(tegra_alc5632_hp_jack_gpios),
-                              tegra_alc5632_hp_jack_gpios);
+       if (gpio_is_valid(pdata->gpio_hp_det)) {
+               tegra_alc5632_hp_jack_gpio.gpio = pdata->gpio_hp_det;
+
+               snd_soc_jack_new(codec, "Headphone Jack", SND_JACK_HEADPHONE,
+                                &tegra_alc5632_hp_jack);
+               snd_soc_jack_add_pins(&tegra_alc5632_hp_jack,
+                                       ARRAY_SIZE(tegra_alc5632_hp_jack_pins),
+                                       tegra_alc5632_hp_jack_pins);
+               snd_soc_jack_add_gpios(&tegra_alc5632_hp_jack, 1,
+                                       &tegra_alc5632_hp_jack_gpio);
+               alc5632->gpio_requested |= GPIO_HP_DET;
+       }
 
 /*     snd_soc_dapm_force_enable_pin(dapm, "Mic Bias1"); */
 
@@ -326,6 +324,10 @@ static int __devexit 
tegra_snd_tegra_alc5632_remove(struct platform_device *pdev
        struct snd_soc_card *card = platform_get_drvdata(pdev);
        struct tegra_alc5632 *alc5632 = snd_soc_card_get_drvdata(card);
 
+       if (alc5632->gpio_requested & GPIO_HP_DET)
+               snd_soc_jack_free_gpios(&tegra_alc5632_hp_jack, 1,
+                       &tegra_alc5632_hp_jack_gpio);
+
        snd_soc_unregister_card(card);
 
        snd_soc_card_set_drvdata(card, NULL);
-- 
1.7.5.4



_______________________________________________
Mailing list: https://launchpad.net/~ac100
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~ac100
More help   : https://help.launchpad.net/ListHelp

Reply via email to