Commit d20b098d authored by Peter Ujfalusi's avatar Peter Ujfalusi Committed by Mark Brown

ASoC: tas2552: Add support for word length configuration

Configure the word length based on the params_width of the stream.
Also configure the clock per frame value which is used when tas2552 is bus
master.
Signed-off-by: default avatarPeter Ujfalusi <peter.ujfalusi@ti.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 7d785025
...@@ -166,7 +166,45 @@ static int tas2552_hw_params(struct snd_pcm_substream *substream, ...@@ -166,7 +166,45 @@ static int tas2552_hw_params(struct snd_pcm_substream *substream,
struct tas2552_data *tas2552 = dev_get_drvdata(codec->dev); struct tas2552_data *tas2552 = dev_get_drvdata(codec->dev);
int sample_rate, pll_clk; int sample_rate, pll_clk;
int d; int d;
int cpf;
u8 p, j; u8 p, j;
u8 ser_ctrl1_reg;
switch (params_width(params)) {
case 16:
ser_ctrl1_reg = TAS2552_WORDLENGTH_16BIT;
cpf = 32 + tas2552->tdm_delay;
break;
case 20:
ser_ctrl1_reg = TAS2552_WORDLENGTH_20BIT;
cpf = 64 + tas2552->tdm_delay;
break;
case 24:
ser_ctrl1_reg = TAS2552_WORDLENGTH_24BIT;
cpf = 64 + tas2552->tdm_delay;
break;
case 32:
ser_ctrl1_reg = TAS2552_WORDLENGTH_32BIT;
cpf = 64 + tas2552->tdm_delay;
break;
default:
dev_err(codec->dev, "Not supported sample size: %d\n",
params_width(params));
return -EINVAL;
}
if (cpf <= 32)
ser_ctrl1_reg |= TAS2552_CLKSPERFRAME_32;
else if (cpf <= 64)
ser_ctrl1_reg |= TAS2552_CLKSPERFRAME_64;
else if (cpf <= 128)
ser_ctrl1_reg |= TAS2552_CLKSPERFRAME_128;
else
ser_ctrl1_reg |= TAS2552_CLKSPERFRAME_256;
snd_soc_update_bits(codec, TAS2552_SER_CTRL_1,
TAS2552_WORDLENGTH_MASK | TAS2552_CLKSPERFRAME_MASK,
ser_ctrl1_reg);
if (!tas2552->pll_clkin) if (!tas2552->pll_clkin)
return -EINVAL; return -EINVAL;
......
...@@ -66,11 +66,21 @@ ...@@ -66,11 +66,21 @@
#define TAS2552_SDOUT_TRISTATE (1 << 2) #define TAS2552_SDOUT_TRISTATE (1 << 2)
/* Serial Interface Control Register Masks */ /* Serial Interface Control Register Masks */
#define TAS2552_WORDLENGTH_16BIT (0x0 << 0)
#define TAS2552_WORDLENGTH_20BIT (0x1 << 0)
#define TAS2552_WORDLENGTH_24BIT (0x2 << 0)
#define TAS2552_WORDLENGTH_32BIT (0x3 << 0)
#define TAS2552_WORDLENGTH_MASK TAS2552_WORDLENGTH_32BIT
#define TAS2552_DATAFORMAT_I2S (0x0 << 2) #define TAS2552_DATAFORMAT_I2S (0x0 << 2)
#define TAS2552_DATAFORMAT_DSP (0x1 << 2) #define TAS2552_DATAFORMAT_DSP (0x1 << 2)
#define TAS2552_DATAFORMAT_RIGHT_J (0x2 << 2) #define TAS2552_DATAFORMAT_RIGHT_J (0x2 << 2)
#define TAS2552_DATAFORMAT_LEFT_J (0x3 << 2) #define TAS2552_DATAFORMAT_LEFT_J (0x3 << 2)
#define TAS2552_DATAFORMAT_MASK TAS2552_DATAFORMAT_LEFT_J #define TAS2552_DATAFORMAT_MASK TAS2552_DATAFORMAT_LEFT_J
#define TAS2552_CLKSPERFRAME_32 (0x0 << 4)
#define TAS2552_CLKSPERFRAME_64 (0x1 << 4)
#define TAS2552_CLKSPERFRAME_128 (0x2 << 4)
#define TAS2552_CLKSPERFRAME_256 (0x3 << 4)
#define TAS2552_CLKSPERFRAME_MASK TAS2552_CLKSPERFRAME_256
#define TAS2552_BCLKDIR (1 << 6) #define TAS2552_BCLKDIR (1 << 6)
#define TAS2552_WCLKDIR (1 << 7) #define TAS2552_WCLKDIR (1 << 7)
......
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