aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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}