|
@@ -144,7 +144,14 @@ static void omap_mcbsp_set_threshold(struct snd_pcm_substream *substream)
|
|
|
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
|
|
struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
|
|
|
struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data);
|
|
|
- int samples = snd_pcm_lib_period_bytes(substream) >> 1;
|
|
|
+ int dma_op_mode = omap_mcbsp_get_dma_op_mode(mcbsp_data->bus_id);
|
|
|
+ int samples;
|
|
|
+
|
|
|
+ /* TODO: Currently, MODE_ELEMENT == MODE_FRAME */
|
|
|
+ if (dma_op_mode == MCBSP_DMA_MODE_THRESHOLD)
|
|
|
+ samples = snd_pcm_lib_period_bytes(substream) >> 1;
|
|
|
+ else
|
|
|
+ samples = 1;
|
|
|
|
|
|
/* Configure McBSP internal buffer usage */
|
|
|
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
|
|
@@ -166,6 +173,7 @@ static int omap_mcbsp_dai_startup(struct snd_pcm_substream *substream,
|
|
|
err = omap_mcbsp_request(bus_id);
|
|
|
|
|
|
if (cpu_is_omap343x()) {
|
|
|
+ int dma_op_mode = omap_mcbsp_get_dma_op_mode(bus_id);
|
|
|
int max_period;
|
|
|
|
|
|
/*
|
|
@@ -187,7 +195,8 @@ static int omap_mcbsp_dai_startup(struct snd_pcm_substream *substream,
|
|
|
max_period++;
|
|
|
max_period <<= 1;
|
|
|
|
|
|
- snd_pcm_hw_constraint_minmax(substream->runtime,
|
|
|
+ if (dma_op_mode == MCBSP_DMA_MODE_THRESHOLD)
|
|
|
+ snd_pcm_hw_constraint_minmax(substream->runtime,
|
|
|
SNDRV_PCM_HW_PARAM_PERIOD_BYTES,
|
|
|
32, max_period);
|
|
|
}
|
|
@@ -269,7 +278,10 @@ static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream,
|
|
|
port = omap34xx_mcbsp_port[bus_id][substream->stream];
|
|
|
omap_mcbsp_dai_dma_params[id][substream->stream].set_threshold =
|
|
|
omap_mcbsp_set_threshold;
|
|
|
- sync_mode = OMAP_DMA_SYNC_FRAME;
|
|
|
+ /* TODO: Currently, MODE_ELEMENT == MODE_FRAME */
|
|
|
+ if (omap_mcbsp_get_dma_op_mode(bus_id) ==
|
|
|
+ MCBSP_DMA_MODE_THRESHOLD)
|
|
|
+ sync_mode = OMAP_DMA_SYNC_FRAME;
|
|
|
} else {
|
|
|
return -ENODEV;
|
|
|
}
|