aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEduardo Valentin <eduardo.valentin@nokia.com>2009-08-20 09:18:26 -0400
committerMark Brown <broonie@opensource.wolfsonmicro.com>2009-08-20 15:10:29 -0400
commita0a499c5792b8656cd51e11d5e0db9fb21640f58 (patch)
treeb1c3a22544c398be2b97a91da31b05068b8bc74d
parentcaebc0cb3ba1e88f5311fbe7aa58b8dff18dd763 (diff)
ASoC: OMAP: Use DMA operating mode of McBSP
Configures DMA sync mode depending on McBSP operating mode value. The value is configurable by McBSP instance. So, depending on McBSP operating mode, the DMA sync mode is passed from omap-mcbsp to omap-pcm. Besides that, it also configures McBSP threshold value depending on which McBSP mode is activated. Signed-off-by: Eduardo Valentin <eduardo.valentin@nokia.com> Acked-by: Jarkko Nikula <jhnikula@gmail.com> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
-rw-r--r--sound/soc/omap/omap-mcbsp.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/sound/soc/omap/omap-mcbsp.c b/sound/soc/omap/omap-mcbsp.c
index 580de5a8dba6..f5387d962f5d 100644
--- a/sound/soc/omap/omap-mcbsp.c
+++ b/sound/soc/omap/omap-mcbsp.c
@@ -144,7 +144,14 @@ static void omap_mcbsp_set_threshold(struct snd_pcm_substream *substream)
144 struct snd_soc_pcm_runtime *rtd = substream->private_data; 144 struct snd_soc_pcm_runtime *rtd = substream->private_data;
145 struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; 145 struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
146 struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data); 146 struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data);
147 int samples = snd_pcm_lib_period_bytes(substream) >> 1; 147 int dma_op_mode = omap_mcbsp_get_dma_op_mode(mcbsp_data->bus_id);
148 int samples;
149
150 /* TODO: Currently, MODE_ELEMENT == MODE_FRAME */
151 if (dma_op_mode == MCBSP_DMA_MODE_THRESHOLD)
152 samples = snd_pcm_lib_period_bytes(substream) >> 1;
153 else
154 samples = 1;
148 155
149 /* Configure McBSP internal buffer usage */ 156 /* Configure McBSP internal buffer usage */
150 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) 157 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
@@ -166,6 +173,7 @@ static int omap_mcbsp_dai_startup(struct snd_pcm_substream *substream,
166 err = omap_mcbsp_request(bus_id); 173 err = omap_mcbsp_request(bus_id);
167 174
168 if (cpu_is_omap343x()) { 175 if (cpu_is_omap343x()) {
176 int dma_op_mode = omap_mcbsp_get_dma_op_mode(bus_id);
169 int max_period; 177 int max_period;
170 178
171 /* 179 /*
@@ -187,7 +195,8 @@ static int omap_mcbsp_dai_startup(struct snd_pcm_substream *substream,
187 max_period++; 195 max_period++;
188 max_period <<= 1; 196 max_period <<= 1;
189 197
190 snd_pcm_hw_constraint_minmax(substream->runtime, 198 if (dma_op_mode == MCBSP_DMA_MODE_THRESHOLD)
199 snd_pcm_hw_constraint_minmax(substream->runtime,
191 SNDRV_PCM_HW_PARAM_PERIOD_BYTES, 200 SNDRV_PCM_HW_PARAM_PERIOD_BYTES,
192 32, max_period); 201 32, max_period);
193 } 202 }
@@ -269,7 +278,10 @@ static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream,
269 port = omap34xx_mcbsp_port[bus_id][substream->stream]; 278 port = omap34xx_mcbsp_port[bus_id][substream->stream];
270 omap_mcbsp_dai_dma_params[id][substream->stream].set_threshold = 279 omap_mcbsp_dai_dma_params[id][substream->stream].set_threshold =
271 omap_mcbsp_set_threshold; 280 omap_mcbsp_set_threshold;
272 sync_mode = OMAP_DMA_SYNC_FRAME; 281 /* TODO: Currently, MODE_ELEMENT == MODE_FRAME */
282 if (omap_mcbsp_get_dma_op_mode(bus_id) ==
283 MCBSP_DMA_MODE_THRESHOLD)
284 sync_mode = OMAP_DMA_SYNC_FRAME;
273 } else { 285 } else {
274 return -ENODEV; 286 return -ENODEV;
275 } 287 }