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

Commit 32f451a9 authored by Meng Wang's avatar Meng Wang Committed by Matt Wagantall
Browse files

Asoc: wcd9335: change class-H control sequence



With current Class-H control sequence, it causes pop.
Update WCD9335 Class-H control sequence for ear and headphone to
meet the maximum performance.
Change delay when enabling HPH to meet the maximum performance.

Change-Id: I66470a8a3f73fd05cfb13e028ff58606c0605fd2
Signed-off-by: default avatarMeng Wang <mwang@codeaurora.org>
parent 75638e61
Loading
Loading
Loading
Loading
+8 −8
Original line number Original line Diff line number Diff line
@@ -2004,12 +2004,12 @@ static int tasha_codec_hphr_dac_event(struct snd_soc_dapm_widget *w,
			     hph_mode);
			     hph_mode);
		break;
		break;
	case SND_SOC_DAPM_POST_PMU:
	case SND_SOC_DAPM_POST_PMU:
		/* 100us required as per HW requirement */
		/* 1000us required as per HW requirement */
		usleep_range(100, 110);
		usleep_range(1000, 1100);
		break;
		break;
	case SND_SOC_DAPM_POST_PMD:
	case SND_SOC_DAPM_POST_PMD:
		/* 100us required as per HW requirement */
		/* 1000us required as per HW requirement */
		usleep_range(100, 110);
		usleep_range(1000, 1100);
		wcd_clsh_fsm(codec, &tasha->clsh_d,
		wcd_clsh_fsm(codec, &tasha->clsh_d,
			     WCD_CLSH_EVENT_POST_PA,
			     WCD_CLSH_EVENT_POST_PA,
			     WCD_CLSH_STATE_HPHR,
			     WCD_CLSH_STATE_HPHR,
@@ -2049,12 +2049,12 @@ static int tasha_codec_hphl_dac_event(struct snd_soc_dapm_widget *w,
			     hph_mode);
			     hph_mode);
		break;
		break;
	case SND_SOC_DAPM_POST_PMU:
	case SND_SOC_DAPM_POST_PMU:
		/* 100us required as per HW requirement */
		/* 1000us required as per HW requirement */
		usleep_range(100, 110);
		usleep_range(1000, 1100);
		break;
		break;
	case SND_SOC_DAPM_POST_PMD:
	case SND_SOC_DAPM_POST_PMD:
		/* 100us required as per HW requirement */
		/* 1000us required as per HW requirement */
		usleep_range(100, 110);
		usleep_range(1000, 1100);
		wcd_clsh_fsm(codec, &tasha->clsh_d,
		wcd_clsh_fsm(codec, &tasha->clsh_d,
			     WCD_CLSH_EVENT_POST_PA,
			     WCD_CLSH_EVENT_POST_PA,
			     WCD_CLSH_STATE_HPHL,
			     WCD_CLSH_STATE_HPHL,
+15 −15
Original line number Original line Diff line number Diff line
@@ -19,7 +19,7 @@
#include <linux/mfd/wcd9xxx/wcd9xxx_registers.h>
#include <linux/mfd/wcd9xxx/wcd9xxx_registers.h>
#include "wcd9xxx-common-v2.h"
#include "wcd9xxx-common-v2.h"


#define WCD_USLEEP_RANGE 5
#define WCD_USLEEP_RANGE 50


static void (*clsh_state_fp[NUM_CLSH_STATES])(struct snd_soc_codec *,
static void (*clsh_state_fp[NUM_CLSH_STATES])(struct snd_soc_codec *,
					      struct wcd_clsh_cdc_data *,
					      struct wcd_clsh_cdc_data *,
@@ -165,10 +165,10 @@ static void wcd_clsh_buck_ctrl(struct snd_soc_codec *codec,
	dev_dbg(codec->dev, "%s: buck_users %d, enable %d, mode: %s",
	dev_dbg(codec->dev, "%s: buck_users %d, enable %d, mode: %s",
		__func__, clsh_d->buck_users, enable, mode_to_str(mode));
		__func__, clsh_d->buck_users, enable, mode_to_str(mode));
	/*
	/*
	 * 50us sleep is required after buck enable/disable
	 * 500us sleep is required after buck enable/disable
	 * as per HW requirement
	 * as per HW requirement
	 */
	 */
	usleep_range(50, 50 + WCD_USLEEP_RANGE);
	usleep_range(500, 500 + WCD_USLEEP_RANGE);
}
}


static void wcd_clsh_flyback_ctrl(struct snd_soc_codec *codec,
static void wcd_clsh_flyback_ctrl(struct snd_soc_codec *codec,
@@ -192,10 +192,10 @@ static void wcd_clsh_flyback_ctrl(struct snd_soc_codec *codec,
	dev_dbg(codec->dev, "%s: flyback_users %d, enable %d, mode: %s",
	dev_dbg(codec->dev, "%s: flyback_users %d, enable %d, mode: %s",
		__func__, clsh_d->flyback_users, enable, mode_to_str(mode));
		__func__, clsh_d->flyback_users, enable, mode_to_str(mode));
	/*
	/*
	 * 50us sleep is required after flyback enable/disable
	 * 500us sleep is required after flyback enable/disable
	 * as per HW requirement
	 * as per HW requirement
	 */
	 */
	usleep_range(50, 50 + WCD_USLEEP_RANGE);
	usleep_range(500, 500 + WCD_USLEEP_RANGE);
}
}


static void wcd_clsh_set_hph_mode(struct snd_soc_codec *codec,
static void wcd_clsh_set_hph_mode(struct snd_soc_codec *codec,
@@ -516,10 +516,6 @@ static void wcd_clsh_state_hph_r(struct snd_soc_codec *codec,
		wcd_clsh_set_hph_mode(codec, mode);
		wcd_clsh_set_hph_mode(codec, mode);
	} else {
	} else {
		wcd_clsh_set_hph_mode(codec, CLS_H_NORMAL);
		wcd_clsh_set_hph_mode(codec, CLS_H_NORMAL);
		/* buck and flyback set to default mode and disable */
		wcd_clsh_buck_ctrl(codec, clsh_d, CLS_H_NORMAL, false);
		wcd_clsh_flyback_ctrl(codec, clsh_d, CLS_H_NORMAL, false);
		wcd_clsh_set_buck_regulator_mode(codec, CLS_H_NORMAL);


		if (mode != CLS_AB) {
		if (mode != CLS_AB) {
			snd_soc_update_bits(codec,
			snd_soc_update_bits(codec,
@@ -527,6 +523,10 @@ static void wcd_clsh_state_hph_r(struct snd_soc_codec *codec,
					    0x40, 0x00);
					    0x40, 0x00);
			wcd_enable_clsh_block(codec, clsh_d, false);
			wcd_enable_clsh_block(codec, clsh_d, false);
		}
		}
		/* buck and flyback set to default mode and disable */
		wcd_clsh_buck_ctrl(codec, clsh_d, CLS_H_NORMAL, false);
		wcd_clsh_flyback_ctrl(codec, clsh_d, CLS_H_NORMAL, false);
		wcd_clsh_set_buck_regulator_mode(codec, CLS_H_NORMAL);
	}
	}
}
}


@@ -564,10 +564,6 @@ static void wcd_clsh_state_hph_l(struct snd_soc_codec *codec,
		wcd_clsh_set_hph_mode(codec, mode);
		wcd_clsh_set_hph_mode(codec, mode);
	} else {
	} else {
		wcd_clsh_set_hph_mode(codec, CLS_H_NORMAL);
		wcd_clsh_set_hph_mode(codec, CLS_H_NORMAL);
		/* set buck and flyback to Default Mode */
		wcd_clsh_buck_ctrl(codec, clsh_d, CLS_H_NORMAL, false);
		wcd_clsh_flyback_ctrl(codec, clsh_d, CLS_H_NORMAL, false);
		wcd_clsh_set_buck_regulator_mode(codec, CLS_H_NORMAL);


		if (mode != CLS_AB) {
		if (mode != CLS_AB) {
			snd_soc_update_bits(codec,
			snd_soc_update_bits(codec,
@@ -575,6 +571,10 @@ static void wcd_clsh_state_hph_l(struct snd_soc_codec *codec,
					    0x40, 0x00);
					    0x40, 0x00);
			wcd_enable_clsh_block(codec, clsh_d, false);
			wcd_enable_clsh_block(codec, clsh_d, false);
		}
		}
		/* set buck and flyback to Default Mode */
		wcd_clsh_buck_ctrl(codec, clsh_d, CLS_H_NORMAL, false);
		wcd_clsh_flyback_ctrl(codec, clsh_d, CLS_H_NORMAL, false);
		wcd_clsh_set_buck_regulator_mode(codec, CLS_H_NORMAL);
	}
	}
}
}


@@ -599,12 +599,12 @@ static void wcd_clsh_state_ear(struct snd_soc_codec *codec,
		wcd_clsh_flyback_ctrl(codec, clsh_d, mode, true);
		wcd_clsh_flyback_ctrl(codec, clsh_d, mode, true);
		wcd_clsh_buck_ctrl(codec, clsh_d, mode, true);
		wcd_clsh_buck_ctrl(codec, clsh_d, mode, true);
	} else {
	} else {
		wcd_clsh_buck_ctrl(codec, clsh_d, mode, false);
		wcd_clsh_flyback_ctrl(codec, clsh_d, mode, false);
		snd_soc_update_bits(codec,
		snd_soc_update_bits(codec,
				    WCD9XXX_A_CDC_RX0_RX_PATH_CFG0,
				    WCD9XXX_A_CDC_RX0_RX_PATH_CFG0,
				    0x40, 0x00);
				    0x40, 0x00);
		wcd_enable_clsh_block(codec, clsh_d, false);
		wcd_enable_clsh_block(codec, clsh_d, false);
		wcd_clsh_buck_ctrl(codec, clsh_d, mode, false);
		wcd_clsh_flyback_ctrl(codec, clsh_d, mode, false);
	}
	}
}
}