diff options
author | Sumit Bhattacharya <sumitb@nvidia.com> | 2011-08-03 17:13:43 +0530 |
---|---|---|
committer | Manish Tuteja <mtuteja@nvidia.com> | 2011-08-04 07:12:45 -0700 |
commit | 54ad1d53ec1f855e133a3c912e0a8c94b4a4c7e1 (patch) | |
tree | 415968457b040da6d38ccb174a27263090216773 | |
parent | aaadcb7a4f8501dc71c6185e111fab1427bb7286 (diff) |
asoc: tegra: Fix wired jack resume
Calling of snd_soc_jack_add_gpios() from tegra_jack_resume()
causes kernel warning since parentless device registration is
not allowed during PM transaction. Modify wired_jack supend/
resume functions to disable IRQs during suspend and enable
them during resume and report the current jack state to
snd_soc_jack interface to ensure jack events happened during
suspend state are not missed.
Bug 850424
Change-Id: Idde4504096a0793729adaafed3da70f08be91101
Reviewed-on: http://git-master/r/44747
Tested-by: Sumit Bhattacharya <sumitb@nvidia.com>
Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>
-rw-r--r-- | sound/soc/tegra/tegra_wired_jack.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/sound/soc/tegra/tegra_wired_jack.c b/sound/soc/tegra/tegra_wired_jack.c index 1150d337bd34..fe8340955e56 100644 --- a/sound/soc/tegra/tegra_wired_jack.c +++ b/sound/soc/tegra/tegra_wired_jack.c @@ -130,16 +130,24 @@ static int wired_switch_notify(struct notifier_block *self, void tegra_jack_suspend(void) { - snd_soc_jack_free_gpios(tegra_wired_jack, - ARRAY_SIZE(wired_jack_gpios), - wired_jack_gpios); + int i; + for (i = 0; i < ARRAY_SIZE(wired_jack_gpios); i++) + disable_irq(gpio_to_irq(wired_jack_gpios[i].gpio)); } void tegra_jack_resume(void) { - snd_soc_jack_add_gpios(tegra_wired_jack, - ARRAY_SIZE(wired_jack_gpios), - wired_jack_gpios); + int i, val; + for (i = 0; i < ARRAY_SIZE(wired_jack_gpios); i++) { + val = gpio_get_value(wired_jack_gpios[i].gpio); + val = wired_jack_gpios[i].invert ? !val : val; + val = val ? wired_jack_gpios[i].report : 0; + + snd_soc_jack_report(tegra_wired_jack, val, + wired_jack_gpios[i].report); + + enable_irq(gpio_to_irq(wired_jack_gpios[i].gpio)); + } } static struct notifier_block wired_switch_nb = { |