aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Ujfalusi <peter.ujfalusi@ti.com>2015-06-04 09:04:23 -0400
committerMark Brown <broonie@kernel.org>2015-06-05 13:53:34 -0400
commit4c331373b99de9c65dcba8633f73fa3efc20d01f (patch)
tree238568d87ccfaf628f87d9483565146a19faefc6
parent9d87a8888c0b2a3b2ec1204e0488935f021d6968 (diff)
ASoC: tas2552: Correct dai format support
DSP_A mode require one bit delay from the FS, DSP_B is without data delay. When checking the requested format, also match the bit and fs inversion flag along with the format since it is not possible to change inversion. Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com> Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r--sound/soc/codecs/tas2552.c29
1 files changed, 15 insertions, 14 deletions
diff --git a/sound/soc/codecs/tas2552.c b/sound/soc/codecs/tas2552.c
index 34495241c674..2f4c2b52a9fa 100644
--- a/sound/soc/codecs/tas2552.c
+++ b/sound/soc/codecs/tas2552.c
@@ -188,11 +188,14 @@ static int tas2552_hw_params(struct snd_pcm_substream *substream,
188 return 0; 188 return 0;
189} 189}
190 190
191#define TAS2552_DAI_FMT_MASK (TAS2552_BIT_CLK_MASK | \
192 TAS2552_WORD_CLK_MASK | \
193 TAS2552_DATA_FORMAT_MASK)
191static int tas2552_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) 194static int tas2552_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
192{ 195{
193 struct snd_soc_codec *codec = dai->codec; 196 struct snd_soc_codec *codec = dai->codec;
197 u8 delay = 0;
194 u8 serial_format; 198 u8 serial_format;
195 u8 serial_control_mask;
196 199
197 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { 200 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
198 case SND_SOC_DAIFMT_CBS_CFS: 201 case SND_SOC_DAIFMT_CBS_CFS:
@@ -212,19 +215,19 @@ static int tas2552_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
212 return -EINVAL; 215 return -EINVAL;
213 } 216 }
214 217
215 serial_control_mask = TAS2552_BIT_CLK_MASK | TAS2552_WORD_CLK_MASK; 218 switch (fmt & (SND_SOC_DAIFMT_FORMAT_MASK |
216 219 SND_SOC_DAIFMT_INV_MASK)) {
217 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { 220 case (SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF):
218 case SND_SOC_DAIFMT_I2S:
219 serial_format &= TAS2552_DAIFMT_I2S_MASK;
220 break; 221 break;
221 case SND_SOC_DAIFMT_DSP_A: 222 case (SND_SOC_DAIFMT_DSP_A | SND_SOC_DAIFMT_IB_NF):
223 delay = 1;
224 case (SND_SOC_DAIFMT_DSP_B | SND_SOC_DAIFMT_IB_NF):
222 serial_format |= TAS2552_DAIFMT_DSP; 225 serial_format |= TAS2552_DAIFMT_DSP;
223 break; 226 break;
224 case SND_SOC_DAIFMT_RIGHT_J: 227 case (SND_SOC_DAIFMT_RIGHT_J | SND_SOC_DAIFMT_NB_NF):
225 serial_format |= TAS2552_DAIFMT_RIGHT_J; 228 serial_format |= TAS2552_DAIFMT_RIGHT_J;
226 break; 229 break;
227 case SND_SOC_DAIFMT_LEFT_J: 230 case (SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_NB_NF):
228 serial_format |= TAS2552_DAIFMT_LEFT_J; 231 serial_format |= TAS2552_DAIFMT_LEFT_J;
229 break; 232 break;
230 default: 233 default:
@@ -232,11 +235,9 @@ static int tas2552_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
232 return -EINVAL; 235 return -EINVAL;
233 } 236 }
234 237
235 if (fmt & SND_SOC_DAIFMT_FORMAT_MASK) 238 snd_soc_update_bits(codec, TAS2552_SER_CTRL_1, TAS2552_DAI_FMT_MASK,
236 serial_control_mask |= TAS2552_DATA_FORMAT_MASK; 239 serial_format);
237 240 snd_soc_write(codec, TAS2552_SER_CTRL_2, delay);
238 snd_soc_update_bits(codec, TAS2552_SER_CTRL_1, serial_control_mask,
239 serial_format);
240 241
241 return 0; 242 return 0;
242} 243}