ac100 team mailing list archive
-
ac100 team
-
Mailing list archive
-
Message #00576
Re: [PATCH] ASoC: alc5632: free hp gpio on module unload
On Sun, Jan 22, 2012 at 12:01, Marc Dietrich <marvin24@xxxxxx> wrote:
> This checks if the gpio is valid and frees it during unload of the
> codec module.
>
> Signed-off-by: Marc Dietrich <marvin24@xxxxxx>
> ---
> 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
>
Hi Mark,
Please, can you specify the branch you based your patch? The 3.0 doesn't
have such code.
It is too different from upstream and my 3.0 branch.
http://git.kernel.org/?p=linux/kernel/git/broonie/sound.git;a=blob;f=sound/soc/tegra/tegra_alc5632.c;h=4a0e805c4edd1b770cf84c85369be81d94375d2f;hb=refs/heads/for-next
http://gitorious.org/~leonro/ac100/leonro-marvin24s-kernel/blobs/a70eba97e8082bab91dc860c11836a023a20b8e2/sound/soc/tegra/tegra_alc5632.c
--
Leon Romanovsky | Independent Linux Consultant
www.leon.nu | leon@xxxxxxx
Follow ups
References