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

Commit d3c53d2a authored by Vatsal Bucha's avatar Vatsal Bucha Committed by Gerrit - the friendly Code Review server
Browse files

ASoC: sdm660_cdc: Fix mute if compander is disabled



Compander disable sequence does not get called
after headphone playback on fm. This results in
mute at one channel and low volume at other channel.
Low volume is resolved by setting analog mode to manual
while compander is off.
Also compander clock should be disabled at the end to
resolve mute issue.

CRs-Fixed: 2102126
Change-Id: I68e72f3b333117a8fdf379db30dc24de9bed7270
Signed-off-by: default avatarVatsal Bucha <vbucha@codeaurora.org>
parent 1cbd1cdf
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -2619,6 +2619,17 @@ static int msm_anlg_cdc_codec_enable_micbias(struct snd_soc_dapm_widget *w,
	return 0;
}

static void set_compander_mode(void *handle, int val)
{
	struct sdm660_cdc_priv *handle_cdc = handle;
	struct snd_soc_codec *codec = handle_cdc->codec;

	if (get_codec_version(handle_cdc) >= DIANGU) {
		snd_soc_update_bits(codec,
			MSM89XX_PMIC_ANALOG_RX_COM_BIAS_DAC,
			0x08, val);
	};
}
static void update_clkdiv(void *handle, int val)
{
	struct sdm660_cdc_priv *handle_cdc = handle;
@@ -4636,6 +4647,7 @@ static int msm_anlg_cdc_probe(struct platform_device *pdev)
	BLOCKING_INIT_NOTIFIER_HEAD(&sdm660_cdc->notifier_mbhc);

	sdm660_cdc->dig_plat_data.handle = (void *) sdm660_cdc;
	sdm660_cdc->dig_plat_data.set_compander_mode = set_compander_mode;
	sdm660_cdc->dig_plat_data.update_clkdiv = update_clkdiv;
	sdm660_cdc->dig_plat_data.get_cdc_version = get_cdc_version;
	sdm660_cdc->dig_plat_data.register_notifier =
+1 −0
Original line number Diff line number Diff line
@@ -168,6 +168,7 @@ struct msm_dig_ctrl_data {

struct msm_dig_ctrl_platform_data {
	void *handle;
	void (*set_compander_mode)(void *handle, int val);
	void (*update_clkdiv)(void *handle, int val);
	int (*get_cdc_version)(void *handle);
	int (*register_notifier)(void *handle,
+48 −41
Original line number Diff line number Diff line
@@ -214,18 +214,27 @@ static int msm_dig_cdc_codec_config_compander(struct snd_soc_codec *codec,
					      int interp_n, int event)
{
	struct msm_dig_priv *dig_cdc = snd_soc_codec_get_drvdata(codec);
	int comp_ch_bits_set = 0x03;

	dev_dbg(codec->dev, "%s: event %d shift %d, enabled %d\n",
		__func__, event, interp_n,
		dig_cdc->comp_enabled[interp_n]);

	/* compander is not enabled */
	if (!dig_cdc->comp_enabled[interp_n])
	/* compander is invalid */
	if (dig_cdc->comp_enabled[interp_n] != COMPANDER_1 &&
	    dig_cdc->comp_enabled[interp_n]) {
		dev_dbg(codec->dev, "%s: Invalid compander %d\n", __func__,
			dig_cdc->comp_enabled[interp_n]);
		return 0;
	}

	switch (dig_cdc->comp_enabled[interp_n]) {
	case COMPANDER_1:
	if (SND_SOC_DAPM_EVENT_ON(event)) {
		/* compander is not enabled */
		if (!dig_cdc->comp_enabled[interp_n]) {
			dig_cdc->set_compander_mode(dig_cdc->handle, 0x00);
			return 0;
		};
		dig_cdc->set_compander_mode(dig_cdc->handle, 0x08);
		/* Enable Compander Clock */
		snd_soc_update_bits(codec,
			MSM89XX_CDC_CORE_COMP0_B2_CTL, 0x0F, 0x09);
@@ -253,21 +262,18 @@ static int msm_dig_cdc_codec_config_compander(struct snd_soc_codec *codec,
		if (dig_cdc->codec_hph_comp_gpio)
			dig_cdc->codec_hph_comp_gpio(0, codec);

			snd_soc_update_bits(codec,
				MSM89XX_CDC_CORE_COMP0_B2_CTL, 0x0F, 0x05);
		snd_soc_update_bits(codec,
			MSM89XX_CDC_CORE_COMP0_B1_CTL,
			1 << interp_n, 0);
		comp_ch_bits_set = snd_soc_read(codec,
					 MSM89XX_CDC_CORE_COMP0_B1_CTL);
		if ((comp_ch_bits_set & 0x03) == 0x00) {
			snd_soc_update_bits(codec,
				MSM89XX_CDC_CORE_COMP0_B2_CTL, 0x0F, 0x05);
			 snd_soc_update_bits(codec,
				MSM89XX_CDC_CORE_CLK_RX_B2_CTL, 0x01, 0x00);
		}
		break;
	default:
		dev_dbg(codec->dev, "%s: Invalid compander %d\n", __func__,
				dig_cdc->comp_enabled[interp_n]);
		break;
	};

	}
	return 0;
}

@@ -2107,6 +2113,7 @@ static int msm_dig_cdc_probe(struct platform_device *pdev)
			msm_dig_cdc->dig_base, &msm_digital_regmap_config);

	msm_dig_cdc->update_clkdiv = pdata->update_clkdiv;
	msm_dig_cdc->set_compander_mode = pdata->set_compander_mode;
	msm_dig_cdc->get_cdc_version = pdata->get_cdc_version;
	msm_dig_cdc->handle = pdata->handle;
	msm_dig_cdc->register_notifier = pdata->register_notifier;
+2 −0
Original line number Diff line number Diff line
@@ -49,6 +49,7 @@ struct msm_dig_priv {
	u32 mute_mask;
	int dapm_bias_off;
	void *handle;
	void (*set_compander_mode)(void *handle, int val);
	void (*update_clkdiv)(void *handle, int val);
	int (*get_cdc_version)(void *handle);
	int (*register_notifier)(void *handle,
@@ -58,6 +59,7 @@ struct msm_dig_priv {

struct dig_ctrl_platform_data {
	void *handle;
	void (*set_compander_mode)(void *handle, int val);
	void (*update_clkdiv)(void *handle, int val);
	int (*get_cdc_version)(void *handle);
	int (*register_notifier)(void *handle,