diff options
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 |