ASoC: tegra-alt: Set driver params iff clock is ON

Enable the module clock before the setting of any parameters.
Fix I2S Loopback, MVC volume & mute, Mixer Gain parameters.

Bug 200075850

Change-Id: Ieaa532be286de09a47d02db6dbe25db039cccaf3
Signed-off-by: Arun Shamanna Lakshmi <aruns@nvidia.com>
Reviewed-on: http://git-master/r/715943
Reviewed-by: Uday Gupta <udayg@nvidia.com>
Reviewed-by: Viraj Karandikar <vkarandikar@nvidia.com>
This commit is contained in:
Arun Shamanna Lakshmi
2015-03-10 13:44:34 -07:00
committed by Sameer Pujar
parent 127bb19825
commit f981c5f62f
3 changed files with 35 additions and 1 deletions

View File

@@ -621,8 +621,37 @@ static struct snd_soc_dai_driver tegra210_i2s_dais[] = {
} }
}; };
static int tegra210_i2s_loopback_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
struct tegra210_i2s *i2s = snd_soc_codec_get_drvdata(codec);
ucontrol->value.integer.value[0] = i2s->loopback;
return 0;
}
static int tegra210_i2s_loopback_put(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
struct tegra210_i2s *i2s = snd_soc_codec_get_drvdata(codec);
i2s->loopback = ucontrol->value.integer.value[0];
pm_runtime_get_sync(codec->dev);
regmap_update_bits(i2s->regmap, TEGRA210_I2S_CTRL,
TEGRA210_I2S_CTRL_LPBK_MASK,
i2s->loopback << TEGRA210_I2S_CTRL_LPBK_SHIFT);
pm_runtime_put(codec->dev);
return 0;
}
static const struct snd_kcontrol_new tegra210_i2s_controls[] = { static const struct snd_kcontrol_new tegra210_i2s_controls[] = {
SOC_SINGLE("Loopback", TEGRA210_I2S_CTRL, 8, 1, 0), SOC_SINGLE_EXT("Loopback", SND_SOC_NOPM, 0, 1, 0,
tegra210_i2s_loopback_get, tegra210_i2s_loopback_put),
}; };
static const struct snd_soc_dapm_widget tegra210_i2s_widgets[] = { static const struct snd_soc_dapm_widget tegra210_i2s_widgets[] = {
@@ -804,6 +833,7 @@ static int tegra210_i2s_platform_probe(struct platform_device *pdev)
i2s->tx_mask = i2s->rx_mask = 0xFFFF; i2s->tx_mask = i2s->rx_mask = 0xFFFF;
i2s->bclk_ratio = 2; i2s->bclk_ratio = 2;
i2s->enable_cya = false; i2s->enable_cya = false;
i2s->loopback = 0;
i2s->clk_i2s = devm_clk_get(&pdev->dev, NULL); i2s->clk_i2s = devm_clk_get(&pdev->dev, NULL);
if (IS_ERR(i2s->clk_i2s)) { if (IS_ERR(i2s->clk_i2s)) {

View File

@@ -159,6 +159,7 @@ static int tegra210_mixer_put_gain(struct snd_kcontrol *kcontrol,
unsigned int reg = mc->reg; unsigned int reg = mc->reg;
unsigned int ret, i; unsigned int ret, i;
pm_runtime_get_sync(codec->dev);
/* write default gain config poly coefficients */ /* write default gain config poly coefficients */
for (i = 0; i < 14; i++) for (i = 0; i < 14; i++)
tegra210_mixer_write_ram(mixer, reg + i, mixer->gain_coeff[i]); tegra210_mixer_write_ram(mixer, reg + i, mixer->gain_coeff[i]);
@@ -168,6 +169,7 @@ static int tegra210_mixer_put_gain(struct snd_kcontrol *kcontrol,
ucontrol->value.integer.value[0]); ucontrol->value.integer.value[0]);
ret |= tegra210_mixer_write_ram(mixer, reg + 0x0f, ret |= tegra210_mixer_write_ram(mixer, reg + 0x0f,
ucontrol->value.integer.value[0]); ucontrol->value.integer.value[0]);
pm_runtime_put(codec->dev);
/* save gain */ /* save gain */
i = (reg - TEGRA210_MIXER_AHUBRAMCTL_GAIN_CONFIG_RAM_ADDR_0) / i = (reg - TEGRA210_MIXER_AHUBRAMCTL_GAIN_CONFIG_RAM_ADDR_0) /

View File

@@ -137,6 +137,7 @@ static int tegra210_mvc_put_vol(struct snd_kcontrol *kcontrol,
unsigned int reg = mc->reg; unsigned int reg = mc->reg;
unsigned int ret, value, wait = 0xffff; unsigned int ret, value, wait = 0xffff;
pm_runtime_get_sync(codec->dev);
/* check if VOLUME_SWITCH is triggered*/ /* check if VOLUME_SWITCH is triggered*/
do { do {
regmap_read(mvc->regmap, regmap_read(mvc->regmap,
@@ -157,6 +158,7 @@ static int tegra210_mvc_put_vol(struct snd_kcontrol *kcontrol,
ret |= regmap_update_bits(mvc->regmap, TEGRA210_MVC_SWITCH, ret |= regmap_update_bits(mvc->regmap, TEGRA210_MVC_SWITCH,
TEGRA210_MVC_VOLUME_SWITCH_MASK, TEGRA210_MVC_VOLUME_SWITCH_MASK,
TEGRA210_MVC_VOLUME_SWITCH_TRIGGER); TEGRA210_MVC_VOLUME_SWITCH_TRIGGER);
pm_runtime_put(codec->dev);
return ret; return ret;
} }