diff options
-rw-r--r-- | sound/soc/codecs/tas2552.c | 29 |
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) | ||
191 | static int tas2552_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) | 194 | static 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 | } |