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

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

Merge "ASoC: wcd9335: Enable standalone ldo_h"

parents 44cfb318 979282a4
Loading
Loading
Loading
Loading
+104 −0
Original line number Diff line number Diff line
@@ -138,6 +138,7 @@ static int cpe_debug_mode;
#define DAPM_MICBIAS3_STANDALONE "MIC BIAS3 Standalone"
#define DAPM_MICBIAS4_STANDALONE "MIC BIAS4 Standalone"

#define DAPM_LDO_H_STANDALONE "LDO_H"
module_param(cpe_debug_mode, int,
	     S_IRUGO | S_IWUSR | S_IWGRP);
MODULE_PARM_DESC(cpe_debug_mode, "boot cpe in debug mode");
@@ -5861,6 +5862,55 @@ static int __tasha_codec_enable_micbias(struct snd_soc_dapm_widget *w,
	return 0;
}

static int tasha_codec_ldo_h_control(struct snd_soc_dapm_widget *w,
				     int event)
{
	struct snd_soc_codec *codec = w->codec;
	struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec);

	if (SND_SOC_DAPM_EVENT_ON(event)) {
		tasha->ldo_h_users++;

		if (tasha->ldo_h_users == 1)
			snd_soc_update_bits(codec, WCD9335_LDOH_MODE,
					    0x80, 0x80);
	}

	if (SND_SOC_DAPM_EVENT_OFF(event)) {
		tasha->ldo_h_users--;

		if (tasha->ldo_h_users < 0)
			tasha->ldo_h_users = 0;

		if (tasha->ldo_h_users == 0)
			snd_soc_update_bits(codec, WCD9335_LDOH_MODE,
					    0x80, 0x00);
	}

	return 0;
}

static int tasha_codec_force_enable_ldo_h(struct snd_soc_dapm_widget *w,
					  struct snd_kcontrol *kcontrol,
					  int event)
{
	struct snd_soc_codec *codec = w->codec;
	struct tasha_priv *tasha = snd_soc_codec_get_drvdata(codec);

	switch (event) {
	case SND_SOC_DAPM_PRE_PMU:
		wcd_resmgr_enable_master_bias(tasha->resmgr);
		tasha_codec_ldo_h_control(w, event);
		break;
	case SND_SOC_DAPM_POST_PMD:
		tasha_codec_ldo_h_control(w, event);
		wcd_resmgr_disable_master_bias(tasha->resmgr);
		break;
	}

	return 0;
}

static int tasha_codec_force_enable_micbias(struct snd_soc_dapm_widget *w,
					    struct snd_kcontrol *kcontrol,
					    int event)
@@ -5893,6 +5943,27 @@ static int tasha_codec_enable_micbias(struct snd_soc_dapm_widget *w,
	return __tasha_codec_enable_micbias(w, event);
}

static int tasha_codec_enable_standalone_ldo_h(struct snd_soc_codec *codec,
					       bool enable)
{
	int rc;

	if (enable)
		rc = snd_soc_dapm_force_enable_pin(&codec->dapm,
						   DAPM_LDO_H_STANDALONE);
	else
		rc = snd_soc_dapm_disable_pin(&codec->dapm,
					      DAPM_LDO_H_STANDALONE);

	if (!rc)
		snd_soc_dapm_sync(&codec->dapm);
	else
		dev_err(codec->dev, "%s: ldo_h force %s pin failed\n",
			__func__, (enable ? "enable" : "disable"));

	return rc;
}

/*
 * tasha_codec_enable_standalone_micbias - enable micbias standalone
 * @codec: pointer to codec instance
@@ -7430,6 +7501,34 @@ static const struct soc_enum tasha_conn_mad_enum =
	SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(tasha_conn_mad_text),
			    tasha_conn_mad_text);

static int tasha_enable_ldo_h_get(struct snd_kcontrol *kcontrol,
				  struct snd_ctl_elem_value *ucontrol)
{
	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
	u8 val = 0;

	if (codec)
		val = snd_soc_read(codec, WCD9335_LDOH_MODE) & 0x80;

	ucontrol->value.integer.value[0] = !!val;

	return 0;
}

static int tasha_enable_ldo_h_put(struct snd_kcontrol *kcontrol,
				  struct snd_ctl_elem_value *ucontrol)
{
	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
	int value = ucontrol->value.integer.value[0];
	bool enable;

	enable = !!value;
	if (codec)
		tasha_codec_enable_standalone_ldo_h(codec, enable);

	return 0;
}

static int tasha_mad_input_get(struct snd_kcontrol *kcontrol,
	struct snd_ctl_elem_value *ucontrol)
{
@@ -8173,6 +8272,8 @@ static const struct snd_kcontrol_new tasha_snd_controls[] = {

	SOC_ENUM_EXT("MAD Input", tasha_conn_mad_enum,
		     tasha_mad_input_get, tasha_mad_input_put),
	SOC_SINGLE_EXT("LDO_H Enable", SND_SOC_NOPM, 0, 1, 0,
			tasha_enable_ldo_h_get, tasha_enable_ldo_h_put),

	SOC_SINGLE_EXT("DMIC1_CLK_PIN_MODE", SND_SOC_NOPM, 17, 1, 0,
		       tasha_pinctl_mode_get, tasha_pinctl_mode_put),
@@ -10324,6 +10425,9 @@ static const struct snd_soc_dapm_widget tasha_dapm_widgets[] = {
	SND_SOC_DAPM_MICBIAS_E(DAPM_MICBIAS4_STANDALONE, SND_SOC_NOPM, 0, 0,
			       tasha_codec_force_enable_micbias,
			       SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
	SND_SOC_DAPM_SUPPLY(DAPM_LDO_H_STANDALONE, SND_SOC_NOPM, 0, 0,
			    tasha_codec_force_enable_ldo_h,
			    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),

	SND_SOC_DAPM_MUX("ANC0 FB MUX", SND_SOC_NOPM, 0, 0, &anc0_fb_mux),
	SND_SOC_DAPM_MUX("ANC1 FB MUX", SND_SOC_NOPM, 0, 0, &anc1_fb_mux),