diff options
author | Manjula Gupta <magupta@nvidia.com> | 2011-04-06 15:59:11 +0530 |
---|---|---|
committer | Varun Colbert <vcolbert@nvidia.com> | 2011-04-11 11:11:27 -0700 |
commit | aa6214d5c4f9e0e2aea9a3f923255bda29c2f447 (patch) | |
tree | ce3eaa3b269ce694bde1350a64f6a341215da650 /sound/soc/tegra/tegra_wired_jack.c | |
parent | f994ecd2aef906490a935edc9711d51ab49209ec (diff) |
ASOC: tegra: Restore jack switch state after Suspendtegra-10.11.7
Adds a function to restore jack state after suspend, it will notify
the upper layer about the current states of the jack after suspend.
In suspend state the notifier function doesn't get triggered, leaving the
system in an unknown state. This function will be called on resume after
suspend.
Fix for Bug: 804328
Change-Id: I89ab32a6d775904fb1a71725d4e1fbda89002431
Reviewed-on: http://git-master/r/26853
Reviewed-by: Sumit Bhattacharya <sumitb@nvidia.com>
Tested-by: Sumit Bhattacharya <sumitb@nvidia.com>
Reviewed-by: Boris Suvorov <bsuvorov@nvidia.com>
Tested-by: Boris Suvorov <bsuvorov@nvidia.com>
Reviewed-by: Varun Colbert <vcolbert@nvidia.com>
Diffstat (limited to 'sound/soc/tegra/tegra_wired_jack.c')
-rw-r--r-- | sound/soc/tegra/tegra_wired_jack.c | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/sound/soc/tegra/tegra_wired_jack.c b/sound/soc/tegra/tegra_wired_jack.c index a3c5fa7afc08..211d69e45818 100644 --- a/sound/soc/tegra/tegra_wired_jack.c +++ b/sound/soc/tegra/tegra_wired_jack.c @@ -38,6 +38,14 @@ struct wired_jack_conf tegra_wired_jack_conf = { -1, -1, -1, -1, 0, NULL, NULL }; +/* Based on hp_gpio and mic_gpio, hp_gpio is active low */ +enum { + HEADSET_WITHOUT_MIC = 0x00, + HEADSET_WITH_MIC = 0x01, + NO_DEVICE = 0x10, + MIC = 0x11, +}; + /* jack */ static struct snd_soc_jack *tegra_wired_jack; @@ -83,7 +91,7 @@ void tegra_switch_set_state(int state) switch_set_state(&wired_switch_dev, state); } -static int wired_swith_notify(struct notifier_block *self, +static int wired_switch_notify(struct notifier_block *self, unsigned long action, void* dev) { int state = 0; @@ -97,6 +105,8 @@ static int wired_swith_notify(struct notifier_block *self, if (tegra_wired_jack_conf.cdc_irq != -1) mic_gpio = gpio_get_value(tegra_wired_jack_conf.cdc_irq); + pr_debug("hp_gpio:%d, mic_gpio:%d\n", hp_gpio, mic_gpio); + flag = (hp_gpio << 4) | mic_gpio; switch (action) { @@ -115,16 +125,16 @@ static int wired_swith_notify(struct notifier_block *self, break; default: switch (flag) { - case 0x010: + case NO_DEVICE: state = 0; break; - case 0x01: + case HEADSET_WITH_MIC: state = 1; break; - case 0x11: + case MIC: /* mic: would not report */ break; - case 0x00: + case HEADSET_WITHOUT_MIC: state = 2; break; default: @@ -137,8 +147,14 @@ static int wired_swith_notify(struct notifier_block *self, return NOTIFY_OK; } + +void tegra_jack_resume(void) +{ + wired_switch_notify(NULL, SND_JACK_NO_TYPE_SPECIFIED, NULL); +} + static struct notifier_block wired_switch_nb = { - .notifier_call = wired_swith_notify, + .notifier_call = wired_switch_notify, }; #endif |