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

Commit 7eb661ba authored by Phani Kumar Uppalapati's avatar Phani Kumar Uppalapati
Browse files

ASoC: wcd934x: Update DSD register sequence for v1.1



Update DSD playback register sequence for wcd934x
codec version 1.1.

Change-Id: I993273bcf26f8f53f6d9c8cccec5c4b17c8a0e95
Signed-off-by: default avatarPhani Kumar Uppalapati <phaniu@codeaurora.org>
parent 216150a2
Loading
Loading
Loading
Loading
+30 −3
Original line number Diff line number Diff line
@@ -28,6 +28,9 @@
#define DSD_VOLUME_STEP_DELAY_US    ((1000 * DSD_VOLUME_UPDATE_DELAY_MS) / \
				     (2 * DSD_VOLUME_STEPS))

#define TAVIL_VERSION_1_0  0
#define TAVIL_VERSION_1_1  1

static const DECLARE_TLV_DB_MINMAX(tavil_dsd_db_scale, DSD_VOLUME_MIN_M110dB,
				   DSD_VOLUME_MAX_0dB);

@@ -369,6 +372,14 @@ static void tavil_dsd_data_pull(struct snd_soc_codec *codec, int dsd_num,
	}
}

static void tavil_dsd_update_volume(struct tavil_dsd_config *dsd_conf)
{
	snd_soc_update_bits(dsd_conf->codec, WCD934X_CDC_TOP_TOP_CFG0,
			    0x01, 0x01);
	snd_soc_update_bits(dsd_conf->codec, WCD934X_CDC_TOP_TOP_CFG0,
			    0x01, 0x00);
}

static int tavil_enable_dsd(struct snd_soc_dapm_widget *w,
			    struct snd_kcontrol *kcontrol, int event)
{
@@ -429,6 +440,8 @@ static int tavil_enable_dsd(struct snd_soc_dapm_widget *w,
			/* Apply Gain */
			snd_soc_write(codec, WCD934X_CDC_DSD0_CFG1,
				      dsd_conf->volume[DSD0]);
			if (dsd_conf->version == TAVIL_VERSION_1_1)
				tavil_dsd_update_volume(dsd_conf);

		} else if (w->shift == DSD1) {
			snd_soc_update_bits(codec, WCD934X_CDC_DSD1_PATH_CTL,
@@ -440,6 +453,8 @@ static int tavil_enable_dsd(struct snd_soc_dapm_widget *w,
			/* Apply Gain */
			snd_soc_write(codec, WCD934X_CDC_DSD1_CFG1,
				      dsd_conf->volume[DSD1]);
			if (dsd_conf->version == TAVIL_VERSION_1_1)
				tavil_dsd_update_volume(dsd_conf);
		}
		/* 10msec sleep required after DSD clock is set */
		usleep_range(10000, 10100);
@@ -538,16 +553,23 @@ static int tavil_dsd_vol_put(struct snd_kcontrol *kcontrol,
			snd_soc_write(codec,
				      WCD934X_CDC_DSD0_CFG1 + 16 * dsd_idx,
				      nv1);
			if (dsd_conf->version == TAVIL_VERSION_1_1)
				tavil_dsd_update_volume(dsd_conf);

			/* sleep required after each volume step */
			usleep_range(DSD_VOLUME_STEP_DELAY_US,
				     (DSD_VOLUME_STEP_DELAY_US +
				      DSD_VOLUME_USLEEP_MARGIN_US));
		}
		if (nv1 != nv[dsd_idx])
		if (nv1 != nv[dsd_idx]) {
			snd_soc_write(codec,
				      WCD934X_CDC_DSD0_CFG1 + 16 * dsd_idx,
				      nv[dsd_idx]);

			if (dsd_conf->version == TAVIL_VERSION_1_1)
				tavil_dsd_update_volume(dsd_conf);
		}

		dsd_conf->volume[dsd_idx] = nv[dsd_idx];
	}

@@ -629,9 +651,14 @@ struct tavil_dsd_config *tavil_dsd_init(struct snd_soc_codec *codec)

	dsd_conf->codec = codec;

	/* Read version */
	dsd_conf->version = snd_soc_read(codec,
					 WCD934X_CHIP_TIER_CTRL_CHIP_ID_BYTE0);
	/* DSD registers init */
	if (dsd_conf->version == TAVIL_VERSION_1_0) {
		snd_soc_update_bits(codec, WCD934X_CDC_DSD0_CFG2, 0x02, 0x00);
		snd_soc_update_bits(codec, WCD934X_CDC_DSD1_CFG2, 0x02, 0x00);
	}
	/* DSD0: Mute EN */
	snd_soc_update_bits(codec, WCD934X_CDC_DSD0_CFG2, 0x04, 0x04);
	/* DSD1: Mute EN */
+1 −0
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ struct tavil_dsd_config {
	u32 base_sample_rate[DSD_MAX];
	int volume[DSD_MAX];
	struct mutex vol_mutex;
	int version;
};

#ifdef CONFIG_SND_SOC_WCD934X_DSD
+21 −6
Original line number Diff line number Diff line
@@ -7784,7 +7784,11 @@ static const struct wcd_resmgr_cb tavil_resmgr_cb = {
	.cdc_rco_ctrl = __tavil_codec_internal_rco_ctrl,
};

static const struct tavil_reg_mask_val tavil_codec_mclk2_defaults[] = {
static const struct tavil_reg_mask_val tavil_codec_mclk2_1_1_defaults[] = {
	{WCD934X_CLK_SYS_MCLK2_PRG1, 0x60, 0x20},
};

static const struct tavil_reg_mask_val tavil_codec_mclk2_1_0_defaults[] = {
	/*
	 * PLL Settings:
	 * Clock Root: MCLK2,
@@ -8330,11 +8334,22 @@ static void tavil_mclk2_reg_defaults(struct tavil_priv *tavil)
	int i;
	struct snd_soc_codec *codec = tavil->codec;

	if (TAVIL_IS_1_0(tavil->wcd9xxx)) {
		/* MCLK2 configuration */
		for (i = 0; i < ARRAY_SIZE(tavil_codec_mclk2_1_0_defaults); i++)
			snd_soc_update_bits(codec,
					tavil_codec_mclk2_1_0_defaults[i].reg,
					tavil_codec_mclk2_1_0_defaults[i].mask,
					tavil_codec_mclk2_1_0_defaults[i].val);
	}
	if (TAVIL_IS_1_1(tavil->wcd9xxx)) {
		/* MCLK2 configuration */
	for (i = 0; i < ARRAY_SIZE(tavil_codec_mclk2_defaults); i++)
		snd_soc_update_bits(codec, tavil_codec_mclk2_defaults[i].reg,
				    tavil_codec_mclk2_defaults[i].mask,
				    tavil_codec_mclk2_defaults[i].val);
		for (i = 0; i < ARRAY_SIZE(tavil_codec_mclk2_1_1_defaults); i++)
			snd_soc_update_bits(codec,
					tavil_codec_mclk2_1_1_defaults[i].reg,
					tavil_codec_mclk2_1_1_defaults[i].mask,
					tavil_codec_mclk2_1_1_defaults[i].val);
	}
}

static int tavil_soc_codec_probe(struct snd_soc_codec *codec)