OMAP: McBSP: Add 32-bit mode support
Sergey Lapin [Thu, 13 May 2010 15:48:16 +0000 (19:48 +0400)]
This patchs should allow to use 32-bit samples on e.g. TLV320AIC3x codec,
or others.

Signed-off-by: Sergey Lapin <slapin@ossfans.org>
Acked-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Acked-by: Peter Ujfalusi <peter.ujfalusi@nokia.com>
Signed-off-by: Liam Girdwood <lrg@slimlogic.co.uk>

sound/soc/omap/omap-mcbsp.c

index 2d33a89..6f44cb4 100644 (file)
@@ -320,8 +320,18 @@ static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream,
        omap_mcbsp_dai_dma_params[id][substream->stream].dma_req = dma;
        omap_mcbsp_dai_dma_params[id][substream->stream].port_addr = port;
        omap_mcbsp_dai_dma_params[id][substream->stream].sync_mode = sync_mode;
-       omap_mcbsp_dai_dma_params[id][substream->stream].data_type =
-                                                       OMAP_DMA_DATA_TYPE_S16;
+       switch (params_format(params)) {
+       case SNDRV_PCM_FORMAT_S16_LE:
+               omap_mcbsp_dai_dma_params[id][substream->stream].data_type =
+                        OMAP_DMA_DATA_TYPE_S16;
+               break;
+       case SNDRV_PCM_FORMAT_S32_LE:
+               omap_mcbsp_dai_dma_params[id][substream->stream].data_type =
+                        OMAP_DMA_DATA_TYPE_S32;
+               break;
+       default:
+               return -EINVAL;
+       }
 
        snd_soc_dai_set_dma_data(cpu_dai, substream,
                &omap_mcbsp_dai_dma_params[id][substream->stream]);
@@ -356,6 +366,14 @@ static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream,
                regs->xcr2      |= XWDLEN2(OMAP_MCBSP_WORD_16);
                regs->xcr1      |= XWDLEN1(OMAP_MCBSP_WORD_16);
                break;
+       case SNDRV_PCM_FORMAT_S32_LE:
+               /* Set word lengths */
+               wlen = 32;
+               regs->rcr2      |= RWDLEN2(OMAP_MCBSP_WORD_32);
+               regs->rcr1      |= RWDLEN1(OMAP_MCBSP_WORD_32);
+               regs->xcr2      |= XWDLEN2(OMAP_MCBSP_WORD_32);
+               regs->xcr1      |= XWDLEN1(OMAP_MCBSP_WORD_32);
+               break;
        default:
                /* Unsupported PCM format */
                return -EINVAL;
@@ -659,13 +677,15 @@ static struct snd_soc_dai_ops omap_mcbsp_dai_ops = {
                .channels_min = 1,                              \
                .channels_max = 16,                             \
                .rates = OMAP_MCBSP_RATES,                      \
-               .formats = SNDRV_PCM_FMTBIT_S16_LE,             \
+               .formats = SNDRV_PCM_FMTBIT_S16_LE |            \
+                          SNDRV_PCM_FMTBIT_S32_LE,             \
        },                                                      \
        .capture = {                                            \
                .channels_min = 1,                              \
                .channels_max = 16,                             \
                .rates = OMAP_MCBSP_RATES,                      \
-               .formats = SNDRV_PCM_FMTBIT_S16_LE,             \
+               .formats = SNDRV_PCM_FMTBIT_S16_LE |            \
+                          SNDRV_PCM_FMTBIT_S32_LE,             \
        },                                                      \
        .ops = &omap_mcbsp_dai_ops,                             \
        .private_data = &mcbsp_data[(link_id)].bus_id,          \