Loading sound/soc/codecs/wcd9306.c +9 −0 Original line number Original line Diff line number Diff line Loading @@ -1863,6 +1863,7 @@ static int tapan_codec_enable_adc(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) struct snd_kcontrol *kcontrol, int event) { { struct snd_soc_codec *codec = w->codec; struct snd_soc_codec *codec = w->codec; struct tapan_priv *tapan = snd_soc_codec_get_drvdata(codec); u16 adc_reg; u16 adc_reg; u8 init_bit_shift; u8 init_bit_shift; Loading Loading @@ -1890,6 +1891,9 @@ static int tapan_codec_enable_adc(struct snd_soc_dapm_widget *w, switch (event) { switch (event) { case SND_SOC_DAPM_PRE_PMU: case SND_SOC_DAPM_PRE_PMU: if (w->reg == TAPAN_A_TX_3_EN) wcd9xxx_resmgr_notifier_call(&tapan->resmgr, WCD9XXX_EVENT_PRE_TX_3_ON); snd_soc_update_bits(codec, adc_reg, 1 << init_bit_shift, snd_soc_update_bits(codec, adc_reg, 1 << init_bit_shift, 1 << init_bit_shift); 1 << init_bit_shift); break; break; Loading @@ -1898,6 +1902,11 @@ static int tapan_codec_enable_adc(struct snd_soc_dapm_widget *w, snd_soc_update_bits(codec, adc_reg, 1 << init_bit_shift, 0x00); snd_soc_update_bits(codec, adc_reg, 1 << init_bit_shift, 0x00); break; break; case SND_SOC_DAPM_POST_PMD: if (w->reg == TAPAN_A_TX_3_EN) wcd9xxx_resmgr_notifier_call(&tapan->resmgr, WCD9XXX_EVENT_POST_TX_3_OFF); break; } } return 0; return 0; } } Loading sound/soc/codecs/wcd9xxx-mbhc.c +26 −2 Original line number Original line Diff line number Diff line Loading @@ -4263,7 +4263,8 @@ static int wcd9xxx_event_notify(struct notifier_block *self, unsigned long val, if (mbhc->hph_status & SND_JACK_OC_HPHL) if (mbhc->hph_status & SND_JACK_OC_HPHL) hphlocp_off_report(mbhc, SND_JACK_OC_HPHL); hphlocp_off_report(mbhc, SND_JACK_OC_HPHL); if (!(mbhc->event_state & if (!(mbhc->event_state & (1 << MBHC_EVENT_PA_HPHL | 1 << MBHC_EVENT_PA_HPHR))) (1 << MBHC_EVENT_PA_HPHL | 1 << MBHC_EVENT_PA_HPHR | 1 << MBHC_EVENT_PRE_TX_3_ON))) wcd9xxx_switch_micbias(mbhc, 0); wcd9xxx_switch_micbias(mbhc, 0); break; break; case WCD9XXX_EVENT_POST_HPHR_PA_OFF: case WCD9XXX_EVENT_POST_HPHR_PA_OFF: Loading @@ -4274,7 +4275,8 @@ static int wcd9xxx_event_notify(struct notifier_block *self, unsigned long val, if (mbhc->hph_status & SND_JACK_OC_HPHR) if (mbhc->hph_status & SND_JACK_OC_HPHR) hphrocp_off_report(mbhc, SND_JACK_OC_HPHL); hphrocp_off_report(mbhc, SND_JACK_OC_HPHL); if (!(mbhc->event_state & if (!(mbhc->event_state & (1 << MBHC_EVENT_PA_HPHL | 1 << MBHC_EVENT_PA_HPHR))) (1 << MBHC_EVENT_PA_HPHL | 1 << MBHC_EVENT_PA_HPHR | 1 << MBHC_EVENT_PRE_TX_3_ON))) wcd9xxx_switch_micbias(mbhc, 0); wcd9xxx_switch_micbias(mbhc, 0); break; break; /* Clock usage change */ /* Clock usage change */ Loading Loading @@ -4356,6 +4358,28 @@ static int wcd9xxx_event_notify(struct notifier_block *self, unsigned long val, case WCD9XXX_EVENT_POST_BG_MBHC_ON: case WCD9XXX_EVENT_POST_BG_MBHC_ON: /* Not used for now */ /* Not used for now */ break; break; case WCD9XXX_EVENT_PRE_TX_3_ON: /* * if polling is ON, mbhc micbias not enabled * switch micbias source to VDDIO */ set_bit(MBHC_EVENT_PRE_TX_3_ON, &mbhc->event_state); if (!(snd_soc_read(codec, mbhc->mbhc_bias_regs.ctl_reg) & 0x80) && mbhc->polling_active && !mbhc->mbhc_micbias_switched) wcd9xxx_switch_micbias(mbhc, 1); break; case WCD9XXX_EVENT_POST_TX_3_OFF: /* * Switch back to micbias if HPH PA or TX3 path * is disabled */ clear_bit(MBHC_EVENT_PRE_TX_3_ON, &mbhc->event_state); if (mbhc->polling_active && mbhc->mbhc_micbias_switched && !(mbhc->event_state & (1 << MBHC_EVENT_PA_HPHL | 1 << MBHC_EVENT_PA_HPHR))) wcd9xxx_switch_micbias(mbhc, 0); break; default: default: WARN(1, "Unknown event %d\n", event); WARN(1, "Unknown event %d\n", event); ret = -EINVAL; ret = -EINVAL; Loading sound/soc/codecs/wcd9xxx-mbhc.h +2 −0 Original line number Original line Diff line number Diff line Loading @@ -123,6 +123,8 @@ enum wcd9xxx_mbhc_clk_freq { enum wcd9xxx_mbhc_event_state { enum wcd9xxx_mbhc_event_state { MBHC_EVENT_PA_HPHL, MBHC_EVENT_PA_HPHL, MBHC_EVENT_PA_HPHR, MBHC_EVENT_PA_HPHR, MBHC_EVENT_PRE_TX_3_ON, MBHC_EVENT_POST_TX_3_OFF, }; }; struct wcd9xxx_mbhc_general_cfg { struct wcd9xxx_mbhc_general_cfg { Loading sound/soc/codecs/wcd9xxx-resmgr.c +3 −0 Original line number Original line Diff line number Diff line Loading @@ -92,6 +92,9 @@ static char wcd9xxx_event_string[][64] = { "WCD9XXX_EVENT_POST_RESUME", "WCD9XXX_EVENT_POST_RESUME", "WCD9XXX_EVENT_PRE_TX_3_ON", "WCD9XXX_EVENT_POST_TX_3_OFF", "WCD9XXX_EVENT_LAST", "WCD9XXX_EVENT_LAST", }; }; Loading sound/soc/codecs/wcd9xxx-resmgr.h +3 −0 Original line number Original line Diff line number Diff line Loading @@ -105,6 +105,9 @@ enum wcd9xxx_notify_event { WCD9XXX_EVENT_POST_RESUME, WCD9XXX_EVENT_POST_RESUME, WCD9XXX_EVENT_PRE_TX_3_ON, WCD9XXX_EVENT_POST_TX_3_OFF, WCD9XXX_EVENT_LAST, WCD9XXX_EVENT_LAST, }; }; Loading Loading
sound/soc/codecs/wcd9306.c +9 −0 Original line number Original line Diff line number Diff line Loading @@ -1863,6 +1863,7 @@ static int tapan_codec_enable_adc(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) struct snd_kcontrol *kcontrol, int event) { { struct snd_soc_codec *codec = w->codec; struct snd_soc_codec *codec = w->codec; struct tapan_priv *tapan = snd_soc_codec_get_drvdata(codec); u16 adc_reg; u16 adc_reg; u8 init_bit_shift; u8 init_bit_shift; Loading Loading @@ -1890,6 +1891,9 @@ static int tapan_codec_enable_adc(struct snd_soc_dapm_widget *w, switch (event) { switch (event) { case SND_SOC_DAPM_PRE_PMU: case SND_SOC_DAPM_PRE_PMU: if (w->reg == TAPAN_A_TX_3_EN) wcd9xxx_resmgr_notifier_call(&tapan->resmgr, WCD9XXX_EVENT_PRE_TX_3_ON); snd_soc_update_bits(codec, adc_reg, 1 << init_bit_shift, snd_soc_update_bits(codec, adc_reg, 1 << init_bit_shift, 1 << init_bit_shift); 1 << init_bit_shift); break; break; Loading @@ -1898,6 +1902,11 @@ static int tapan_codec_enable_adc(struct snd_soc_dapm_widget *w, snd_soc_update_bits(codec, adc_reg, 1 << init_bit_shift, 0x00); snd_soc_update_bits(codec, adc_reg, 1 << init_bit_shift, 0x00); break; break; case SND_SOC_DAPM_POST_PMD: if (w->reg == TAPAN_A_TX_3_EN) wcd9xxx_resmgr_notifier_call(&tapan->resmgr, WCD9XXX_EVENT_POST_TX_3_OFF); break; } } return 0; return 0; } } Loading
sound/soc/codecs/wcd9xxx-mbhc.c +26 −2 Original line number Original line Diff line number Diff line Loading @@ -4263,7 +4263,8 @@ static int wcd9xxx_event_notify(struct notifier_block *self, unsigned long val, if (mbhc->hph_status & SND_JACK_OC_HPHL) if (mbhc->hph_status & SND_JACK_OC_HPHL) hphlocp_off_report(mbhc, SND_JACK_OC_HPHL); hphlocp_off_report(mbhc, SND_JACK_OC_HPHL); if (!(mbhc->event_state & if (!(mbhc->event_state & (1 << MBHC_EVENT_PA_HPHL | 1 << MBHC_EVENT_PA_HPHR))) (1 << MBHC_EVENT_PA_HPHL | 1 << MBHC_EVENT_PA_HPHR | 1 << MBHC_EVENT_PRE_TX_3_ON))) wcd9xxx_switch_micbias(mbhc, 0); wcd9xxx_switch_micbias(mbhc, 0); break; break; case WCD9XXX_EVENT_POST_HPHR_PA_OFF: case WCD9XXX_EVENT_POST_HPHR_PA_OFF: Loading @@ -4274,7 +4275,8 @@ static int wcd9xxx_event_notify(struct notifier_block *self, unsigned long val, if (mbhc->hph_status & SND_JACK_OC_HPHR) if (mbhc->hph_status & SND_JACK_OC_HPHR) hphrocp_off_report(mbhc, SND_JACK_OC_HPHL); hphrocp_off_report(mbhc, SND_JACK_OC_HPHL); if (!(mbhc->event_state & if (!(mbhc->event_state & (1 << MBHC_EVENT_PA_HPHL | 1 << MBHC_EVENT_PA_HPHR))) (1 << MBHC_EVENT_PA_HPHL | 1 << MBHC_EVENT_PA_HPHR | 1 << MBHC_EVENT_PRE_TX_3_ON))) wcd9xxx_switch_micbias(mbhc, 0); wcd9xxx_switch_micbias(mbhc, 0); break; break; /* Clock usage change */ /* Clock usage change */ Loading Loading @@ -4356,6 +4358,28 @@ static int wcd9xxx_event_notify(struct notifier_block *self, unsigned long val, case WCD9XXX_EVENT_POST_BG_MBHC_ON: case WCD9XXX_EVENT_POST_BG_MBHC_ON: /* Not used for now */ /* Not used for now */ break; break; case WCD9XXX_EVENT_PRE_TX_3_ON: /* * if polling is ON, mbhc micbias not enabled * switch micbias source to VDDIO */ set_bit(MBHC_EVENT_PRE_TX_3_ON, &mbhc->event_state); if (!(snd_soc_read(codec, mbhc->mbhc_bias_regs.ctl_reg) & 0x80) && mbhc->polling_active && !mbhc->mbhc_micbias_switched) wcd9xxx_switch_micbias(mbhc, 1); break; case WCD9XXX_EVENT_POST_TX_3_OFF: /* * Switch back to micbias if HPH PA or TX3 path * is disabled */ clear_bit(MBHC_EVENT_PRE_TX_3_ON, &mbhc->event_state); if (mbhc->polling_active && mbhc->mbhc_micbias_switched && !(mbhc->event_state & (1 << MBHC_EVENT_PA_HPHL | 1 << MBHC_EVENT_PA_HPHR))) wcd9xxx_switch_micbias(mbhc, 0); break; default: default: WARN(1, "Unknown event %d\n", event); WARN(1, "Unknown event %d\n", event); ret = -EINVAL; ret = -EINVAL; Loading
sound/soc/codecs/wcd9xxx-mbhc.h +2 −0 Original line number Original line Diff line number Diff line Loading @@ -123,6 +123,8 @@ enum wcd9xxx_mbhc_clk_freq { enum wcd9xxx_mbhc_event_state { enum wcd9xxx_mbhc_event_state { MBHC_EVENT_PA_HPHL, MBHC_EVENT_PA_HPHL, MBHC_EVENT_PA_HPHR, MBHC_EVENT_PA_HPHR, MBHC_EVENT_PRE_TX_3_ON, MBHC_EVENT_POST_TX_3_OFF, }; }; struct wcd9xxx_mbhc_general_cfg { struct wcd9xxx_mbhc_general_cfg { Loading
sound/soc/codecs/wcd9xxx-resmgr.c +3 −0 Original line number Original line Diff line number Diff line Loading @@ -92,6 +92,9 @@ static char wcd9xxx_event_string[][64] = { "WCD9XXX_EVENT_POST_RESUME", "WCD9XXX_EVENT_POST_RESUME", "WCD9XXX_EVENT_PRE_TX_3_ON", "WCD9XXX_EVENT_POST_TX_3_OFF", "WCD9XXX_EVENT_LAST", "WCD9XXX_EVENT_LAST", }; }; Loading
sound/soc/codecs/wcd9xxx-resmgr.h +3 −0 Original line number Original line Diff line number Diff line Loading @@ -105,6 +105,9 @@ enum wcd9xxx_notify_event { WCD9XXX_EVENT_POST_RESUME, WCD9XXX_EVENT_POST_RESUME, WCD9XXX_EVENT_PRE_TX_3_ON, WCD9XXX_EVENT_POST_TX_3_OFF, WCD9XXX_EVENT_LAST, WCD9XXX_EVENT_LAST, }; }; Loading