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

Commit 50ba2946 authored by Damir Didjusto's avatar Damir Didjusto Committed by Gerrit - the friendly Code Review server
Browse files

ASoC: wcd9306: Add ability to enable regulator by the codec



Add support in codec driver to enable the regulator
that controls the 5V supply to the speaker.

Change-Id: Ifbbf6b2af1cd2534abacbfe5d22c6aed98e38be0
Signed-off-by: default avatarDamir Didjusto <damird@codeaurora.org>
parent a650b745
Loading
Loading
Loading
Loading
+23 −1
Original line number Original line Diff line number Diff line
@@ -242,6 +242,7 @@ struct tapan_priv {
	u8 aux_r_gain;
	u8 aux_r_gain;


	bool spkr_pa_widget_on;
	bool spkr_pa_widget_on;
	struct regulator *spkdrv_reg;


	/* resmgr module */
	/* resmgr module */
	struct wcd9xxx_resmgr resmgr;
	struct wcd9xxx_resmgr resmgr;
@@ -2307,12 +2308,22 @@ static int tapan_codec_enable_vdd_spkr(struct snd_soc_dapm_widget *w,
{
{
	struct snd_soc_codec *codec = w->codec;
	struct snd_soc_codec *codec = w->codec;
	struct wcd9xxx *core = dev_get_drvdata(codec->dev->parent);
	struct wcd9xxx *core = dev_get_drvdata(codec->dev->parent);
	struct tapan_priv *priv = snd_soc_codec_get_drvdata(codec);
	int ret = 0;


	dev_dbg(codec->dev, "%s: %s %d\n", __func__, w->name, event);
	dev_dbg(codec->dev, "%s: %s %d\n", __func__, w->name, event);


	WARN_ONCE(!priv->spkdrv_reg, "SPKDRV supply %s isn't defined\n",
		WCD9XXX_VDD_SPKDRV_NAME);
	switch (event) {
	switch (event) {
	case SND_SOC_DAPM_PRE_PMU:
	case SND_SOC_DAPM_PRE_PMU:

		if (priv->spkdrv_reg) {
			ret = regulator_enable(priv->spkdrv_reg);
			if (ret)
				dev_err(codec->dev,
					"%s Failed to enable spkdrv reg %s\n",
					__func__, WCD9XXX_VDD_SPKDRV_NAME);
		}
		if (spkr_drv_wrnd > 0) {
		if (spkr_drv_wrnd > 0) {
			WARN_ON(!(snd_soc_read(codec, TAPAN_A_SPKR_DRV_EN) &
			WARN_ON(!(snd_soc_read(codec, TAPAN_A_SPKR_DRV_EN) &
				  0x80));
				  0x80));
@@ -2333,6 +2344,13 @@ static int tapan_codec_enable_vdd_spkr(struct snd_soc_dapm_widget *w,
			snd_soc_update_bits(codec, TAPAN_A_SPKR_DRV_EN, 0x80,
			snd_soc_update_bits(codec, TAPAN_A_SPKR_DRV_EN, 0x80,
					    0x80);
					    0x80);
		}
		}
		if (priv->spkdrv_reg) {
			ret = regulator_disable(priv->spkdrv_reg);
			if (ret)
				dev_err(codec->dev,
					"%s: Failed to disable spkdrv_reg %s\n",
					__func__, WCD9XXX_VDD_SPKDRV_NAME);
		}
		break;
		break;
	}
	}
	return 0;
	return 0;
@@ -5504,6 +5522,8 @@ static int tapan_codec_probe(struct snd_soc_codec *codec)
		goto err_pdata;
		goto err_pdata;
	}
	}


	tapan->spkdrv_reg =
		tapan_codec_find_regulator(codec, WCD9XXX_VDD_SPKDRV_NAME);
	if (spkr_drv_wrnd > 0) {
	if (spkr_drv_wrnd > 0) {
		WCD9XXX_BG_CLK_LOCK(&tapan->resmgr);
		WCD9XXX_BG_CLK_LOCK(&tapan->resmgr);
		wcd9xxx_resmgr_get_bandgap(&tapan->resmgr,
		wcd9xxx_resmgr_get_bandgap(&tapan->resmgr,
@@ -5603,6 +5623,8 @@ static int tapan_codec_remove(struct snd_soc_codec *codec)
	for (index = 0; index < CP_REG_MAX; index++)
	for (index = 0; index < CP_REG_MAX; index++)
		tapan->cp_regulators[index] = NULL;
		tapan->cp_regulators[index] = NULL;


	tapan->spkdrv_reg = NULL;

	kfree(tapan);
	kfree(tapan);
	return 0;
	return 0;
}
}