diff options
author | Jorge Eduardo Candelaria <jorge.candelaria@ti.com> | 2010-12-20 12:32:47 -0500 |
---|---|---|
committer | Liam Girdwood <lrg@slimlogic.co.uk> | 2010-12-23 09:38:05 -0500 |
commit | d4686c654bb1d7ea226578d5725ca34911d6e34c (patch) | |
tree | e077816b547c14b15812864347c43ce843ff39d3 /sound/soc/omap/omap-mcbsp.c | |
parent | 991e02b4469c2e92cc98aa5b04fbde981671b74c (diff) |
ASoC: mcbsp: Add McBSP support for OMAP4
This patch adds McBSP support for the OMAP4 CPU
Signed-off-by: Jorge Eduardo Candelaria <jorge.candelaria@ti.com>
Signed-off-by: Margarita Olaya Cabrera <magi.olaya@ti.com>
Acked-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Acked-by: Peter Ujfalusi <peter.ujfalusi@nokia.com>
Acked-by: Jarkko Nikula <jhnikula@gmail.com>
Signed-off-by: Liam Girdwood <lrg@slimlogic.co.uk>
Diffstat (limited to 'sound/soc/omap/omap-mcbsp.c')
-rw-r--r-- | sound/soc/omap/omap-mcbsp.c | 35 |
1 files changed, 32 insertions, 3 deletions
diff --git a/sound/soc/omap/omap-mcbsp.c b/sound/soc/omap/omap-mcbsp.c index 7e84f24b9a88..d203f4da18a0 100644 --- a/sound/soc/omap/omap-mcbsp.c +++ b/sound/soc/omap/omap-mcbsp.c | |||
@@ -102,6 +102,17 @@ static const int omap24xx_dma_reqs[][2] = { | |||
102 | static const int omap24xx_dma_reqs[][2] = {}; | 102 | static const int omap24xx_dma_reqs[][2] = {}; |
103 | #endif | 103 | #endif |
104 | 104 | ||
105 | #if defined(CONFIG_ARCH_OMAP4) | ||
106 | static const int omap44xx_dma_reqs[][2] = { | ||
107 | { OMAP44XX_DMA_MCBSP1_TX, OMAP44XX_DMA_MCBSP1_RX }, | ||
108 | { OMAP44XX_DMA_MCBSP2_TX, OMAP44XX_DMA_MCBSP2_RX }, | ||
109 | { OMAP44XX_DMA_MCBSP3_TX, OMAP44XX_DMA_MCBSP3_RX }, | ||
110 | { OMAP44XX_DMA_MCBSP4_TX, OMAP44XX_DMA_MCBSP4_RX }, | ||
111 | }; | ||
112 | #else | ||
113 | static const int omap44xx_dma_reqs[][2] = {}; | ||
114 | #endif | ||
115 | |||
105 | #if defined(CONFIG_ARCH_OMAP2420) | 116 | #if defined(CONFIG_ARCH_OMAP2420) |
106 | static const unsigned long omap2420_mcbsp_port[][2] = { | 117 | static const unsigned long omap2420_mcbsp_port[][2] = { |
107 | { OMAP24XX_MCBSP1_BASE + OMAP_MCBSP_REG_DXR1, | 118 | { OMAP24XX_MCBSP1_BASE + OMAP_MCBSP_REG_DXR1, |
@@ -147,6 +158,21 @@ static const unsigned long omap34xx_mcbsp_port[][2] = { | |||
147 | static const unsigned long omap34xx_mcbsp_port[][2] = {}; | 158 | static const unsigned long omap34xx_mcbsp_port[][2] = {}; |
148 | #endif | 159 | #endif |
149 | 160 | ||
161 | #if defined(CONFIG_ARCH_OMAP4) | ||
162 | static const unsigned long omap44xx_mcbsp_port[][2] = { | ||
163 | { OMAP44XX_MCBSP1_BASE + OMAP_MCBSP_REG_DXR, | ||
164 | OMAP44XX_MCBSP1_BASE + OMAP_MCBSP_REG_DRR }, | ||
165 | { OMAP44XX_MCBSP2_BASE + OMAP_MCBSP_REG_DXR, | ||
166 | OMAP44XX_MCBSP2_BASE + OMAP_MCBSP_REG_DRR }, | ||
167 | { OMAP44XX_MCBSP3_BASE + OMAP_MCBSP_REG_DXR, | ||
168 | OMAP44XX_MCBSP3_BASE + OMAP_MCBSP_REG_DRR }, | ||
169 | { OMAP44XX_MCBSP4_BASE + OMAP_MCBSP_REG_DXR, | ||
170 | OMAP44XX_MCBSP4_BASE + OMAP_MCBSP_REG_DRR }, | ||
171 | }; | ||
172 | #else | ||
173 | static const unsigned long omap44xx_mcbsp_port[][2] = {}; | ||
174 | #endif | ||
175 | |||
150 | static void omap_mcbsp_set_threshold(struct snd_pcm_substream *substream) | 176 | static void omap_mcbsp_set_threshold(struct snd_pcm_substream *substream) |
151 | { | 177 | { |
152 | struct snd_soc_pcm_runtime *rtd = substream->private_data; | 178 | struct snd_soc_pcm_runtime *rtd = substream->private_data; |
@@ -224,7 +250,7 @@ static int omap_mcbsp_dai_startup(struct snd_pcm_substream *substream, | |||
224 | * 2 channels (stereo): size is 128 / 2 = 64 frames (2 * 64 words) | 250 | * 2 channels (stereo): size is 128 / 2 = 64 frames (2 * 64 words) |
225 | * 4 channels: size is 128 / 4 = 32 frames (4 * 32 words) | 251 | * 4 channels: size is 128 / 4 = 32 frames (4 * 32 words) |
226 | */ | 252 | */ |
227 | if (cpu_is_omap343x()) { | 253 | if (cpu_is_omap343x() || cpu_is_omap44xx()) { |
228 | /* | 254 | /* |
229 | * Rule for the buffer size. We should not allow | 255 | * Rule for the buffer size. We should not allow |
230 | * smaller buffer than the FIFO size to avoid underruns | 256 | * smaller buffer than the FIFO size to avoid underruns |
@@ -332,6 +358,9 @@ static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream, | |||
332 | } else if (cpu_is_omap343x()) { | 358 | } else if (cpu_is_omap343x()) { |
333 | dma = omap24xx_dma_reqs[bus_id][substream->stream]; | 359 | dma = omap24xx_dma_reqs[bus_id][substream->stream]; |
334 | port = omap34xx_mcbsp_port[bus_id][substream->stream]; | 360 | port = omap34xx_mcbsp_port[bus_id][substream->stream]; |
361 | } else if (cpu_is_omap44xx()) { | ||
362 | dma = omap44xx_dma_reqs[bus_id][substream->stream]; | ||
363 | port = omap44xx_mcbsp_port[bus_id][substream->stream]; | ||
335 | } else { | 364 | } else { |
336 | return -ENODEV; | 365 | return -ENODEV; |
337 | } | 366 | } |
@@ -498,11 +527,11 @@ static int omap_mcbsp_dai_set_dai_fmt(struct snd_soc_dai *cpu_dai, | |||
498 | regs->spcr2 |= XINTM(3) | FREE; | 527 | regs->spcr2 |= XINTM(3) | FREE; |
499 | regs->spcr1 |= RINTM(3); | 528 | regs->spcr1 |= RINTM(3); |
500 | /* RFIG and XFIG are not defined in 34xx */ | 529 | /* RFIG and XFIG are not defined in 34xx */ |
501 | if (!cpu_is_omap34xx()) { | 530 | if (!cpu_is_omap34xx() && !cpu_is_omap44xx()) { |
502 | regs->rcr2 |= RFIG; | 531 | regs->rcr2 |= RFIG; |
503 | regs->xcr2 |= XFIG; | 532 | regs->xcr2 |= XFIG; |
504 | } | 533 | } |
505 | if (cpu_is_omap2430() || cpu_is_omap34xx()) { | 534 | if (cpu_is_omap2430() || cpu_is_omap34xx() || cpu_is_omap44xx()) { |
506 | regs->xccr = DXENDLY(1) | XDMAEN | XDISABLE; | 535 | regs->xccr = DXENDLY(1) | XDMAEN | XDISABLE; |
507 | regs->rccr = RFULL_CYCLE | RDMAEN | RDISABLE; | 536 | regs->rccr = RFULL_CYCLE | RDMAEN | RDISABLE; |
508 | } | 537 | } |