diff options
author | Peter Ujfalusi <peter.ujfalusi@ti.com> | 2015-06-04 09:04:29 -0400 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2015-06-05 13:53:36 -0400 |
commit | d20b098dd98ec9e0a205ad59e32d93a636a783b3 (patch) | |
tree | b516eb33dc61304ef205c38e182c8dbee1e24811 | |
parent | 7d78502502f3984894c0bb8d330ef894f2c2c04c (diff) |
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: Peter Ujfalusi <peter.ujfalusi@ti.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r-- | sound/soc/codecs/tas2552.c | 38 | ||||
-rw-r--r-- | sound/soc/codecs/tas2552.h | 10 |
2 files changed, 48 insertions, 0 deletions
diff --git a/sound/soc/codecs/tas2552.c b/sound/soc/codecs/tas2552.c index 9c081344bd90..13b435f9a9b1 100644 --- a/sound/soc/codecs/tas2552.c +++ b/sound/soc/codecs/tas2552.c | |||
@@ -166,7 +166,45 @@ static int tas2552_hw_params(struct snd_pcm_substream *substream, | |||
166 | struct tas2552_data *tas2552 = dev_get_drvdata(codec->dev); | 166 | struct tas2552_data *tas2552 = dev_get_drvdata(codec->dev); |
167 | int sample_rate, pll_clk; | 167 | int sample_rate, pll_clk; |
168 | int d; | 168 | int d; |
169 | int cpf; | ||
169 | u8 p, j; | 170 | u8 p, j; |
171 | u8 ser_ctrl1_reg; | ||
172 | |||
173 | switch (params_width(params)) { | ||
174 | case 16: | ||
175 | ser_ctrl1_reg = TAS2552_WORDLENGTH_16BIT; | ||
176 | cpf = 32 + tas2552->tdm_delay; | ||
177 | break; | ||
178 | case 20: | ||
179 | ser_ctrl1_reg = TAS2552_WORDLENGTH_20BIT; | ||
180 | cpf = 64 + tas2552->tdm_delay; | ||
181 | break; | ||
182 | case 24: | ||
183 | ser_ctrl1_reg = TAS2552_WORDLENGTH_24BIT; | ||
184 | cpf = 64 + tas2552->tdm_delay; | ||
185 | break; | ||
186 | case 32: | ||
187 | ser_ctrl1_reg = TAS2552_WORDLENGTH_32BIT; | ||
188 | cpf = 64 + tas2552->tdm_delay; | ||
189 | break; | ||
190 | default: | ||
191 | dev_err(codec->dev, "Not supported sample size: %d\n", | ||
192 | params_width(params)); | ||
193 | return -EINVAL; | ||
194 | } | ||
195 | |||
196 | if (cpf <= 32) | ||
197 | ser_ctrl1_reg |= TAS2552_CLKSPERFRAME_32; | ||
198 | else if (cpf <= 64) | ||
199 | ser_ctrl1_reg |= TAS2552_CLKSPERFRAME_64; | ||
200 | else if (cpf <= 128) | ||
201 | ser_ctrl1_reg |= TAS2552_CLKSPERFRAME_128; | ||
202 | else | ||
203 | ser_ctrl1_reg |= TAS2552_CLKSPERFRAME_256; | ||
204 | |||
205 | snd_soc_update_bits(codec, TAS2552_SER_CTRL_1, | ||
206 | TAS2552_WORDLENGTH_MASK | TAS2552_CLKSPERFRAME_MASK, | ||
207 | ser_ctrl1_reg); | ||
170 | 208 | ||
171 | if (!tas2552->pll_clkin) | 209 | if (!tas2552->pll_clkin) |
172 | return -EINVAL; | 210 | return -EINVAL; |
diff --git a/sound/soc/codecs/tas2552.h b/sound/soc/codecs/tas2552.h index 5bdc7eaaddea..de0ab0d27520 100644 --- a/sound/soc/codecs/tas2552.h +++ b/sound/soc/codecs/tas2552.h | |||
@@ -66,11 +66,21 @@ | |||
66 | #define TAS2552_SDOUT_TRISTATE (1 << 2) | 66 | #define TAS2552_SDOUT_TRISTATE (1 << 2) |
67 | 67 | ||
68 | /* Serial Interface Control Register Masks */ | 68 | /* Serial Interface Control Register Masks */ |
69 | #define TAS2552_WORDLENGTH_16BIT (0x0 << 0) | ||
70 | #define TAS2552_WORDLENGTH_20BIT (0x1 << 0) | ||
71 | #define TAS2552_WORDLENGTH_24BIT (0x2 << 0) | ||
72 | #define TAS2552_WORDLENGTH_32BIT (0x3 << 0) | ||
73 | #define TAS2552_WORDLENGTH_MASK TAS2552_WORDLENGTH_32BIT | ||
69 | #define TAS2552_DATAFORMAT_I2S (0x0 << 2) | 74 | #define TAS2552_DATAFORMAT_I2S (0x0 << 2) |
70 | #define TAS2552_DATAFORMAT_DSP (0x1 << 2) | 75 | #define TAS2552_DATAFORMAT_DSP (0x1 << 2) |
71 | #define TAS2552_DATAFORMAT_RIGHT_J (0x2 << 2) | 76 | #define TAS2552_DATAFORMAT_RIGHT_J (0x2 << 2) |
72 | #define TAS2552_DATAFORMAT_LEFT_J (0x3 << 2) | 77 | #define TAS2552_DATAFORMAT_LEFT_J (0x3 << 2) |
73 | #define TAS2552_DATAFORMAT_MASK TAS2552_DATAFORMAT_LEFT_J | 78 | #define TAS2552_DATAFORMAT_MASK TAS2552_DATAFORMAT_LEFT_J |
79 | #define TAS2552_CLKSPERFRAME_32 (0x0 << 4) | ||
80 | #define TAS2552_CLKSPERFRAME_64 (0x1 << 4) | ||
81 | #define TAS2552_CLKSPERFRAME_128 (0x2 << 4) | ||
82 | #define TAS2552_CLKSPERFRAME_256 (0x3 << 4) | ||
83 | #define TAS2552_CLKSPERFRAME_MASK TAS2552_CLKSPERFRAME_256 | ||
74 | #define TAS2552_BCLKDIR (1 << 6) | 84 | #define TAS2552_BCLKDIR (1 << 6) |
75 | #define TAS2552_WCLKDIR (1 << 7) | 85 | #define TAS2552_WCLKDIR (1 << 7) |
76 | 86 | ||