aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Ujfalusi <peter.ujfalusi@ti.com>2015-06-04 09:04:29 -0400
committerMark Brown <broonie@kernel.org>2015-06-05 13:53:36 -0400
commitd20b098dd98ec9e0a205ad59e32d93a636a783b3 (patch)
treeb516eb33dc61304ef205c38e182c8dbee1e24811
parent7d78502502f3984894c0bb8d330ef894f2c2c04c (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.c38
-rw-r--r--sound/soc/codecs/tas2552.h10
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