diff options
Diffstat (limited to 'sound/soc')
-rw-r--r-- | sound/soc/omap/omap-mcbsp.c | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/sound/soc/omap/omap-mcbsp.c b/sound/soc/omap/omap-mcbsp.c index 9c09b94f0cf8..402a1eb7bd3f 100644 --- a/sound/soc/omap/omap-mcbsp.c +++ b/sound/soc/omap/omap-mcbsp.c | |||
@@ -214,8 +214,9 @@ static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream, | |||
214 | struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data); | 214 | struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data); |
215 | struct omap_mcbsp_reg_cfg *regs = &mcbsp_data->regs; | 215 | struct omap_mcbsp_reg_cfg *regs = &mcbsp_data->regs; |
216 | int dma, bus_id = mcbsp_data->bus_id, id = cpu_dai->id; | 216 | int dma, bus_id = mcbsp_data->bus_id, id = cpu_dai->id; |
217 | int wlen, channels; | 217 | int wlen, channels, wpf; |
218 | unsigned long port; | 218 | unsigned long port; |
219 | unsigned int format; | ||
219 | 220 | ||
220 | if (cpu_class_is_omap1()) { | 221 | if (cpu_class_is_omap1()) { |
221 | dma = omap1_dma_reqs[bus_id][substream->stream]; | 222 | dma = omap1_dma_reqs[bus_id][substream->stream]; |
@@ -243,18 +244,23 @@ static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream, | |||
243 | return 0; | 244 | return 0; |
244 | } | 245 | } |
245 | 246 | ||
246 | channels = params_channels(params); | 247 | format = mcbsp_data->fmt & SND_SOC_DAIFMT_FORMAT_MASK; |
248 | wpf = channels = params_channels(params); | ||
247 | switch (channels) { | 249 | switch (channels) { |
248 | case 2: | 250 | case 2: |
249 | /* Use dual-phase frames */ | 251 | if (format == SND_SOC_DAIFMT_I2S) { |
250 | regs->rcr2 |= RPHASE; | 252 | /* Use dual-phase frames */ |
251 | regs->xcr2 |= XPHASE; | 253 | regs->rcr2 |= RPHASE; |
254 | regs->xcr2 |= XPHASE; | ||
255 | /* Set 1 word per (McBSP) frame for phase1 and phase2 */ | ||
256 | wpf--; | ||
257 | regs->rcr2 |= RFRLEN2(wpf - 1); | ||
258 | regs->xcr2 |= XFRLEN2(wpf - 1); | ||
259 | } | ||
252 | case 1: | 260 | case 1: |
253 | /* Set 1 word per (McBSP) frame */ | 261 | /* Set word per (McBSP) frame for phase1 */ |
254 | regs->rcr2 |= RFRLEN2(1 - 1); | 262 | regs->rcr1 |= RFRLEN1(wpf - 1); |
255 | regs->rcr1 |= RFRLEN1(1 - 1); | 263 | regs->xcr1 |= XFRLEN1(wpf - 1); |
256 | regs->xcr2 |= XFRLEN2(1 - 1); | ||
257 | regs->xcr1 |= XFRLEN1(1 - 1); | ||
258 | break; | 264 | break; |
259 | default: | 265 | default: |
260 | /* Unsupported number of channels */ | 266 | /* Unsupported number of channels */ |
@@ -276,9 +282,9 @@ static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream, | |||
276 | } | 282 | } |
277 | 283 | ||
278 | /* Set FS period and length in terms of bit clock periods */ | 284 | /* Set FS period and length in terms of bit clock periods */ |
279 | switch (mcbsp_data->fmt & SND_SOC_DAIFMT_FORMAT_MASK) { | 285 | switch (format) { |
280 | case SND_SOC_DAIFMT_I2S: | 286 | case SND_SOC_DAIFMT_I2S: |
281 | regs->srgr2 |= FPER(wlen * 2 - 1); | 287 | regs->srgr2 |= FPER(wlen * channels - 1); |
282 | regs->srgr1 |= FWID(wlen - 1); | 288 | regs->srgr1 |= FWID(wlen - 1); |
283 | break; | 289 | break; |
284 | case SND_SOC_DAIFMT_DSP_B: | 290 | case SND_SOC_DAIFMT_DSP_B: |