Commit 01b37e94 authored by Wolfram Sang's avatar Wolfram Sang Committed by Mark Brown

ASoC: tlv320aic32x4: always enable dividers

Dividers (such as MDAC) are always needed, independent of the codec
being I2S master or slave. Needed on a custom board where the codec has
to be slave.
Signed-off-by: default avatarWolfram Sang <w.sang@pengutronix.de>
Acked-by: default avatarJavier Martin <javier.martin@vista-silicon.com>
Signed-off-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
parent bb362e2e
...@@ -60,7 +60,6 @@ struct aic32x4_rate_divs { ...@@ -60,7 +60,6 @@ struct aic32x4_rate_divs {
struct aic32x4_priv { struct aic32x4_priv {
u32 sysclk; u32 sysclk;
s32 master;
u8 page_no; u8 page_no;
void *control_data; void *control_data;
u32 power_cfg; u32 power_cfg;
...@@ -369,7 +368,6 @@ static int aic32x4_set_dai_sysclk(struct snd_soc_dai *codec_dai, ...@@ -369,7 +368,6 @@ static int aic32x4_set_dai_sysclk(struct snd_soc_dai *codec_dai,
static int aic32x4_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) static int aic32x4_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
{ {
struct snd_soc_codec *codec = codec_dai->codec; struct snd_soc_codec *codec = codec_dai->codec;
struct aic32x4_priv *aic32x4 = snd_soc_codec_get_drvdata(codec);
u8 iface_reg_1; u8 iface_reg_1;
u8 iface_reg_2; u8 iface_reg_2;
u8 iface_reg_3; u8 iface_reg_3;
...@@ -384,11 +382,9 @@ static int aic32x4_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) ...@@ -384,11 +382,9 @@ static int aic32x4_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
/* set master/slave audio interface */ /* set master/slave audio interface */
switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
case SND_SOC_DAIFMT_CBM_CFM: case SND_SOC_DAIFMT_CBM_CFM:
aic32x4->master = 1;
iface_reg_1 |= AIC32X4_BCLKMASTER | AIC32X4_WCLKMASTER; iface_reg_1 |= AIC32X4_BCLKMASTER | AIC32X4_WCLKMASTER;
break; break;
case SND_SOC_DAIFMT_CBS_CFS: case SND_SOC_DAIFMT_CBS_CFS:
aic32x4->master = 0;
break; break;
default: default:
printk(KERN_ERR "aic32x4: invalid DAI master/slave interface\n"); printk(KERN_ERR "aic32x4: invalid DAI master/slave interface\n");
...@@ -526,64 +522,58 @@ static int aic32x4_mute(struct snd_soc_dai *dai, int mute) ...@@ -526,64 +522,58 @@ static int aic32x4_mute(struct snd_soc_dai *dai, int mute)
static int aic32x4_set_bias_level(struct snd_soc_codec *codec, static int aic32x4_set_bias_level(struct snd_soc_codec *codec,
enum snd_soc_bias_level level) enum snd_soc_bias_level level)
{ {
struct aic32x4_priv *aic32x4 = snd_soc_codec_get_drvdata(codec);
switch (level) { switch (level) {
case SND_SOC_BIAS_ON: case SND_SOC_BIAS_ON:
if (aic32x4->master) { /* Switch on PLL */
/* Switch on PLL */ snd_soc_update_bits(codec, AIC32X4_PLLPR,
snd_soc_update_bits(codec, AIC32X4_PLLPR, AIC32X4_PLLEN, AIC32X4_PLLEN);
AIC32X4_PLLEN, AIC32X4_PLLEN);
/* Switch on NDAC Divider */
/* Switch on NDAC Divider */ snd_soc_update_bits(codec, AIC32X4_NDAC,
snd_soc_update_bits(codec, AIC32X4_NDAC, AIC32X4_NDACEN, AIC32X4_NDACEN);
AIC32X4_NDACEN, AIC32X4_NDACEN);
/* Switch on MDAC Divider */
/* Switch on MDAC Divider */ snd_soc_update_bits(codec, AIC32X4_MDAC,
snd_soc_update_bits(codec, AIC32X4_MDAC, AIC32X4_MDACEN, AIC32X4_MDACEN);
AIC32X4_MDACEN, AIC32X4_MDACEN);
/* Switch on NADC Divider */
/* Switch on NADC Divider */ snd_soc_update_bits(codec, AIC32X4_NADC,
snd_soc_update_bits(codec, AIC32X4_NADC, AIC32X4_NADCEN, AIC32X4_NADCEN);
AIC32X4_NADCEN, AIC32X4_NADCEN);
/* Switch on MADC Divider */
/* Switch on MADC Divider */ snd_soc_update_bits(codec, AIC32X4_MADC,
snd_soc_update_bits(codec, AIC32X4_MADC, AIC32X4_MADCEN, AIC32X4_MADCEN);
AIC32X4_MADCEN, AIC32X4_MADCEN);
/* Switch on BCLK_N Divider */
/* Switch on BCLK_N Divider */ snd_soc_update_bits(codec, AIC32X4_BCLKN,
snd_soc_update_bits(codec, AIC32X4_BCLKN, AIC32X4_BCLKEN, AIC32X4_BCLKEN);
AIC32X4_BCLKEN, AIC32X4_BCLKEN);
}
break; break;
case SND_SOC_BIAS_PREPARE: case SND_SOC_BIAS_PREPARE:
break; break;
case SND_SOC_BIAS_STANDBY: case SND_SOC_BIAS_STANDBY:
if (aic32x4->master) { /* Switch off PLL */
/* Switch off PLL */ snd_soc_update_bits(codec, AIC32X4_PLLPR,
snd_soc_update_bits(codec, AIC32X4_PLLPR, AIC32X4_PLLEN, 0);
AIC32X4_PLLEN, 0);
/* Switch off NDAC Divider */
/* Switch off NDAC Divider */ snd_soc_update_bits(codec, AIC32X4_NDAC,
snd_soc_update_bits(codec, AIC32X4_NDAC, AIC32X4_NDACEN, 0);
AIC32X4_NDACEN, 0);
/* Switch off MDAC Divider */
/* Switch off MDAC Divider */ snd_soc_update_bits(codec, AIC32X4_MDAC,
snd_soc_update_bits(codec, AIC32X4_MDAC, AIC32X4_MDACEN, 0);
AIC32X4_MDACEN, 0);
/* Switch off NADC Divider */
/* Switch off NADC Divider */ snd_soc_update_bits(codec, AIC32X4_NADC,
snd_soc_update_bits(codec, AIC32X4_NADC, AIC32X4_NADCEN, 0);
AIC32X4_NADCEN, 0);
/* Switch off MADC Divider */
/* Switch off MADC Divider */ snd_soc_update_bits(codec, AIC32X4_MADC,
snd_soc_update_bits(codec, AIC32X4_MADC, AIC32X4_MADCEN, 0);
AIC32X4_MADCEN, 0);
/* Switch off BCLK_N Divider */
/* Switch off BCLK_N Divider */ snd_soc_update_bits(codec, AIC32X4_BCLKN,
snd_soc_update_bits(codec, AIC32X4_BCLKN, AIC32X4_BCLKEN, 0);
AIC32X4_BCLKEN, 0);
}
break; break;
case SND_SOC_BIAS_OFF: case SND_SOC_BIAS_OFF:
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment