diff options
-rw-r--r-- | sound/soc/tegra/tegra_i2s.c | 1 | ||||
-rw-r--r-- | sound/soc/tegra/tegra_soc.h | 1 | ||||
-rw-r--r-- | sound/soc/tegra/tegra_wired_jack.c | 28 |
3 files changed, 24 insertions, 6 deletions
diff --git a/sound/soc/tegra/tegra_i2s.c b/sound/soc/tegra/tegra_i2s.c index 004384041e99..e460a76968f6 100644 --- a/sound/soc/tegra/tegra_i2s.c +++ b/sound/soc/tegra/tegra_i2s.c @@ -366,6 +366,7 @@ int tegra_i2s_resume(struct snd_soc_dai *cpu_dai) tegra_das_set_all_regs(&info->das_regs); i2s_set_all_regs(cpu_dai->id, &info->i2s_regs); + tegra_jack_resume(); return 0; } diff --git a/sound/soc/tegra/tegra_soc.h b/sound/soc/tegra/tegra_soc.h index 817aed035d89..8dd2efaa6d13 100644 --- a/sound/soc/tegra/tegra_soc.h +++ b/sound/soc/tegra/tegra_soc.h @@ -118,6 +118,7 @@ void tegra_controls_exit(void); int tegra_jack_init(struct snd_soc_codec *codec); void tegra_jack_exit(void); +void tegra_jack_resume(void); void tegra_switch_set_state(int state); void setup_i2s_dma_request(struct snd_pcm_substream *substream, 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 |