ASoC: omap-mcbsp: Save, and use wlen for threshold configuration
authorPeter Ujfalusi <peter.ujfalusi@nokia.com>
Thu, 3 Jun 2010 04:39:35 +0000 (07:39 +0300)
committerLiam Girdwood <lrg@slimlogic.co.uk>
Thu, 3 Jun 2010 15:12:40 +0000 (16:12 +0100)
Save the word length configuration of McBSP, and use that information
to calculate, and configure the threshold in McBSP.
Previously the calculation was only correct when the stream had 16bit
audio.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@nokia.com>
Acked-by: Jarkko Nikula <jhnikula@gmail.com>
Acked-by: Mark Brown <broonie@opensource.wolsfonmicro.com>
Acked-by: Tony Lindgren <tony@atomide.com>
Signed-off-by: Liam Girdwood <lrg@slimlogic.co.uk>
sound/soc/omap/omap-mcbsp.c

index 6f44cb4d30b88791f3b81ea9bc7a7b98599e1a66..b06d8f1620d76bbe099bb0803b82592c3c4be492 100644 (file)
@@ -59,6 +59,7 @@ struct omap_mcbsp_data {
        int                             configured;
        unsigned int                    in_freq;
        int                             clk_div;
+       int                             wlen;
 };
 
 #define to_mcbsp(priv) container_of((priv), struct omap_mcbsp_data, bus_id)
@@ -155,19 +156,21 @@ static void omap_mcbsp_set_threshold(struct snd_pcm_substream *substream)
        struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
        struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data);
        int dma_op_mode = omap_mcbsp_get_dma_op_mode(mcbsp_data->bus_id);
-       int samples;
+       int words;
 
        /* TODO: Currently, MODE_ELEMENT == MODE_FRAME */
        if (dma_op_mode == MCBSP_DMA_MODE_THRESHOLD)
-               samples = snd_pcm_lib_period_bytes(substream) >> 1;
+               /* The FIFO size depends on the McBSP word configuration */
+               words = snd_pcm_lib_period_bytes(substream) /
+                                                       (mcbsp_data->wlen / 8);
        else
-               samples = 1;
+               words = 1;
 
        /* Configure McBSP internal buffer usage */
        if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-               omap_mcbsp_set_tx_threshold(mcbsp_data->bus_id, samples - 1);
+               omap_mcbsp_set_tx_threshold(mcbsp_data->bus_id, words);
        else
-               omap_mcbsp_set_rx_threshold(mcbsp_data->bus_id, samples - 1);
+               omap_mcbsp_set_rx_threshold(mcbsp_data->bus_id, words);
 }
 
 static int omap_mcbsp_dai_startup(struct snd_pcm_substream *substream,
@@ -409,6 +412,7 @@ static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream,
        }
 
        omap_mcbsp_config(bus_id, &mcbsp_data->regs);
+       mcbsp_data->wlen = wlen;
        mcbsp_data->configured = 1;
 
        return 0;