Signed-off-by: Eduardo Valentin <[email protected]>
---
 sound/soc/omap/omap-pcm.c |   21 +++++++++++++++++----
 1 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/sound/soc/omap/omap-pcm.c b/sound/soc/omap/omap-pcm.c
index a30e7a0..f4903e0 100644
--- a/sound/soc/omap/omap-pcm.c
+++ b/sound/soc/omap/omap-pcm.c
@@ -51,6 +51,7 @@ struct omap_runtime_data {
        struct omap_pcm_dma_data        *dma_data;
        int                             dma_ch;
        int                             period_index;
+       int                             dma_op_mode;
 };
 
 static void omap_pcm_dma_irq(int ch, u16 stat, void *data)
@@ -145,7 +146,9 @@ static int omap_pcm_prepare(struct snd_pcm_substream 
*substream)
 
        memset(&dma_params, 0, sizeof(dma_params));
 
-       if (cpu_is_omap34xx())
+       /* TODO: Currently, MODE_ELEMENT == MODE_FRAME */
+       if (cpu_is_omap34xx() &&
+                       (prtd->dma_op_mode == MCBSP_DMA_MODE_THRESHOLD))
                sync_mode = OMAP_DMA_SYNC_FRAME;
        else
                sync_mode = OMAP_DMA_SYNC_ELEMENT;
@@ -198,9 +201,16 @@ static int omap_pcm_trigger(struct snd_pcm_substream 
*substream, int cmd)
        unsigned long flags;
        int ret = 0;
        unsigned int bus_id = *(unsigned int *)rtd->dai->cpu_dai->private_data;
-       u16 samples = snd_pcm_lib_period_bytes(substream) >> 1;
+       u16 samples;
 
        spin_lock_irqsave(&prtd->lock, flags);
+
+       /* TODO: Currently, MODE_ELEMENT == MODE_FRAME */
+       if (prtd->dma_op_mode == MCBSP_DMA_MODE_THRESHOLD)
+               samples = snd_pcm_lib_period_bytes(substream) >> 1;
+       else
+               samples = 1;
+
        switch (cmd) {
        case SNDRV_PCM_TRIGGER_START:
        case SNDRV_PCM_TRIGGER_RESUME:
@@ -257,10 +267,12 @@ static int omap_pcm_open(struct snd_pcm_substream 
*substream)
        struct omap_runtime_data *prtd;
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
        unsigned int bus_id = *(unsigned int *)rtd->dai->cpu_dai->private_data;
+       int dma_op_mode = omap_mcbsp_get_dma_op_mode(bus_id);
        int ret;
        int max_period;
 
-       if (cpu_is_omap34xx()) {
+       /* TODO: Currently, MODE_ELEMENT == MODE_FRAME */
+       if (cpu_is_omap34xx() && (dma_op_mode == MCBSP_DMA_MODE_THRESHOLD)) {
                if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
                        max_period = omap_mcbsp_get_max_tx_threshold(bus_id);
                else
@@ -268,7 +280,7 @@ static int omap_pcm_open(struct snd_pcm_substream 
*substream)
                max_period++;
                max_period <<= 1;
        } else {
-               omap_pcm_hardware.period_bytes_max = 64 * 1024;
+               max_period = 64 * 1024;
        }
 
        omap_pcm_hardware.period_bytes_max = max_period;
@@ -286,6 +298,7 @@ static int omap_pcm_open(struct snd_pcm_substream 
*substream)
                ret = -ENOMEM;
                goto out;
        }
+       prtd->dma_op_mode = dma_op_mode;
        spin_lock_init(&prtd->lock);
        runtime->private_data = prtd;
 
-- 
1.6.2.GIT

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to