Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e6123cce authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "ASoC: wcd9330: Correct HPH turn on and shutdown sequences"

parents b691a491 c7ab82e8
Loading
Loading
Loading
Loading
+31 −9
Original line number Diff line number Diff line
@@ -49,6 +49,7 @@ enum {
	ADC4_TXFE,
	ADC5_TXFE,
	ADC6_TXFE,
	HPH_DELAY,
};

#define TOMTOM_MAD_SLIMBUS_TX_PORT 12
@@ -59,7 +60,7 @@ enum {
#define TOMTOM_BIT_ADJ_SHIFT_PORT1_6 4
#define TOMTOM_BIT_ADJ_SHIFT_PORT7_10 5

#define TOMTOM_HPH_PA_SETTLE_COMP_ON 5000
#define TOMTOM_HPH_PA_SETTLE_COMP_ON 10000
#define TOMTOM_HPH_PA_SETTLE_COMP_OFF 13000
#define TOMTOM_HPH_PA_RAMP_DELAY 30000

@@ -4324,14 +4325,22 @@ static int tomtom_hph_pa_event(struct snd_soc_dapm_widget *w,

	switch (event) {
	case SND_SOC_DAPM_PRE_PMU:
		set_bit(HPH_DELAY, &tomtom->status_mask);
		/* Let MBHC module know PA is turning on */
		wcd9xxx_resmgr_notifier_call(&tomtom->resmgr, e_pre_on);
		break;

	case SND_SOC_DAPM_POST_PMU:
		if (test_bit(HPH_DELAY, &tomtom->status_mask)) {
			/*
			 * Make sure to wait 10ms after enabling HPHR_HPHL
			 * in register 0x1AB
			*/
			usleep_range(pa_settle_time, pa_settle_time + 1000);
		pr_debug("%s: sleep %d us after %s PA enable\n", __func__,
				pa_settle_time, w->name);
			clear_bit(HPH_DELAY, &tomtom->status_mask);
			pr_debug("%s: sleep %d us after %s PA enable\n",
				__func__, pa_settle_time, w->name);
		}
		if (!high_perf_mode && !tomtom->uhqa_mode) {
			wcd9xxx_clsh_fsm(codec, &tomtom->clsh_d,
						 req_clsh_state,
@@ -4340,12 +4349,23 @@ static int tomtom_hph_pa_event(struct snd_soc_dapm_widget *w,
		}
		break;

	case SND_SOC_DAPM_PRE_PMD:
		set_bit(HPH_DELAY, &tomtom->status_mask);
		break;

	case SND_SOC_DAPM_POST_PMD:
		/* Let MBHC module know PA turned off */
		wcd9xxx_resmgr_notifier_call(&tomtom->resmgr, e_post_off);
		if (test_bit(HPH_DELAY, &tomtom->status_mask)) {
			/*
			 * Make sure to wait 10ms after disabling HPHR_HPHL
			 * in register 0x1AB
			*/
			usleep_range(pa_settle_time, pa_settle_time + 1000);
		pr_debug("%s: sleep %d us after %s PA disable\n", __func__,
				pa_settle_time, w->name);
			clear_bit(HPH_DELAY, &tomtom->status_mask);
			pr_debug("%s: sleep %d us after %s PA disable\n",
				__func__, pa_settle_time, w->name);
		}

		break;
	}
@@ -6502,7 +6522,8 @@ static const struct snd_soc_dapm_widget tomtom_dapm_widgets[] = {
	SND_SOC_DAPM_OUTPUT("HEADPHONE"),
	SND_SOC_DAPM_PGA_E("HPHL", TOMTOM_A_RX_HPH_CNP_EN, 5, 0, NULL, 0,
		tomtom_hph_pa_event, SND_SOC_DAPM_PRE_PMU |
		SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
		SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD |
		SND_SOC_DAPM_POST_PMD),
	SND_SOC_DAPM_MIXER_E("HPHL DAC", TOMTOM_A_RX_HPH_L_DAC_CTL, 7, 0,
		hphl_switch, ARRAY_SIZE(hphl_switch), tomtom_hphl_dac_event,
		SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
@@ -6510,7 +6531,8 @@ static const struct snd_soc_dapm_widget tomtom_dapm_widgets[] = {

	SND_SOC_DAPM_PGA_E("HPHR", TOMTOM_A_RX_HPH_CNP_EN, 4, 0, NULL, 0,
		tomtom_hph_pa_event, SND_SOC_DAPM_PRE_PMU |
		SND_SOC_DAPM_POST_PMU |	SND_SOC_DAPM_POST_PMD),
		SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD |
		SND_SOC_DAPM_POST_PMD),

	SND_SOC_DAPM_DAC_E("HPHR DAC", NULL, TOMTOM_A_RX_HPH_R_DAC_CTL, 7, 0,
		tomtom_hphr_dac_event,
+7 −14
Original line number Diff line number Diff line
@@ -1202,6 +1202,7 @@ static void wcd9xxx_clsh_state_hph_l(struct snd_soc_codec *codec,
		wcd9xxx_chargepump_request(codec, true);
		wcd9xxx_enable_anc_delay(codec, true);
		wcd9xxx_clsh_comp_req(codec, clsh_d, CLSH_COMPUTE_HPH_L, true);
		wcd9xxx_clsh_comp_req(codec, clsh_d, CLSH_COMPUTE_HPH_R, true);
		wcd9xxx_set_buck_mode(codec, BUCK_VREF_0P494V);
		wcd9xxx_enable_buck(codec, clsh_d, true);
		wcd9xxx_set_fclk_get_ncp(codec, clsh_d, NCP_FCLK_LEVEL_8);
@@ -1211,8 +1212,9 @@ static void wcd9xxx_clsh_state_hph_l(struct snd_soc_codec *codec,
		wcd9xxx_set_fclk_put_ncp(codec, clsh_d, NCP_FCLK_LEVEL_8);
		wcd9xxx_enable_buck(codec, clsh_d, false);
		wcd9xxx_clsh_comp_req(codec, clsh_d, CLSH_COMPUTE_HPH_L, false);
		wcd9xxx_chargepump_request(codec, false);
		wcd9xxx_clsh_comp_req(codec, clsh_d, CLSH_COMPUTE_HPH_R, false);
		wcd9xxx_enable_clsh_block(codec, clsh_d, false);
		wcd9xxx_chargepump_request(codec, false);
	}
}

@@ -1228,6 +1230,7 @@ static void wcd9xxx_clsh_state_hph_r(struct snd_soc_codec *codec,
		wcd9xxx_enable_clsh_block(codec, clsh_d, true);
		wcd9xxx_chargepump_request(codec, true);
		wcd9xxx_enable_anc_delay(codec, true);
		wcd9xxx_clsh_comp_req(codec, clsh_d, CLSH_COMPUTE_HPH_L, true);
		wcd9xxx_clsh_comp_req(codec, clsh_d, CLSH_COMPUTE_HPH_R, true);
		wcd9xxx_set_buck_mode(codec, BUCK_VREF_0P494V);
		wcd9xxx_enable_buck(codec, clsh_d, true);
@@ -1237,9 +1240,10 @@ static void wcd9xxx_clsh_state_hph_r(struct snd_soc_codec *codec,
	} else {
		wcd9xxx_set_fclk_put_ncp(codec, clsh_d, NCP_FCLK_LEVEL_8);
		wcd9xxx_enable_buck(codec, clsh_d, false);
		wcd9xxx_clsh_comp_req(codec, clsh_d, CLSH_COMPUTE_HPH_L, false);
		wcd9xxx_clsh_comp_req(codec, clsh_d, CLSH_COMPUTE_HPH_R, false);
		wcd9xxx_chargepump_request(codec, false);
		wcd9xxx_enable_clsh_block(codec, clsh_d, false);
		wcd9xxx_chargepump_request(codec, false);
	}
}

@@ -1250,20 +1254,9 @@ static void wcd9xxx_clsh_state_hph_st(struct snd_soc_codec *codec,
	pr_debug("%s: enter %s\n", __func__, is_enable ? "enable" : "disable");

	if (is_enable) {
		if (req_state == WCD9XXX_CLSH_STATE_HPHL)
			wcd9xxx_clsh_comp_req(codec, clsh_d,
						CLSH_COMPUTE_HPH_L, true);
		if (req_state == WCD9XXX_CLSH_STATE_HPHR)
			wcd9xxx_clsh_comp_req(codec, clsh_d,
						CLSH_COMPUTE_HPH_R, true);
		dev_dbg(codec->dev, "%s: stub fallback to hph_st\n", __func__);
	} else {
		dev_dbg(codec->dev, "%s: stub fallback to hph_st\n", __func__);
		if (req_state == WCD9XXX_CLSH_STATE_HPHL)
			wcd9xxx_clsh_comp_req(codec, clsh_d,
						CLSH_COMPUTE_HPH_L, false);
		if (req_state == WCD9XXX_CLSH_STATE_HPHR)
			wcd9xxx_clsh_comp_req(codec, clsh_d,
						CLSH_COMPUTE_HPH_R, false);
	}
}