ASoC: davinci: let platform data define edma queue numbers
authorSekhar Nori <nsekhar@ti.com>
Mon, 19 Jul 2010 07:01:16 +0000 (12:31 +0530)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Tue, 20 Jul 2010 08:57:20 +0000 (09:57 +0100)
Currently the EDMA queue to be used by for servicing ASP through
internal RAM is fixed to EDMAQ_0 and that to service internal RAM
from external RAM is fixed to EDMAQ_1.

This may not be the desirable configuration on all platforms. For
example, on DM365, queue 0 has large fifo size and is more suitable
for video transfers. Having audio and video transfers on the same
queue may lead to starvation on audio side.

platform data as defined currently passes a queue number to the driver
but that remains unused inside the driver.

Fix this by defining one queue each for ASP and RAM transfers in the
platform data and using it inside the driver.

Since EDMAQ_0 maps to 0, thats the queue that will be used if
the asp queue number is not initialized. None of the platforms
currently utilize ping-pong transfers through internal RAM so that
functionality remains unchanged too.

This patch has been tested on DM644x and OMAP-L138 EVMs.

Signed-off-by: Sekhar Nori <nsekhar@ti.com>
Acked-by: Liam Girdwood <lrg@slimlogic.co.uk>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
arch/arm/mach-davinci/board-da830-evm.c
arch/arm/mach-davinci/board-da850-evm.c
arch/arm/mach-davinci/board-dm646x-evm.c
arch/arm/mach-davinci/include/mach/asp.h
sound/soc/davinci/davinci-i2s.c
sound/soc/davinci/davinci-mcasp.c
sound/soc/davinci/davinci-pcm.c
sound/soc/davinci/davinci-pcm.h

index 212d97084bd71dc11bbda9308574f1c3cbc4ea3e..bc384d3561da8162a150a16adf9223c97e896d61 100644 (file)
@@ -208,7 +208,7 @@ static struct snd_platform_data da830_evm_snd_data = {
        .num_serializer = ARRAY_SIZE(da830_iis_serializer_direction),
        .tdm_slots      = 2,
        .serial_dir     = da830_iis_serializer_direction,
-       .eventq_no      = EVENTQ_0,
+       .asp_chan_q     = EVENTQ_0,
        .version        = MCASP_VERSION_2,
        .txnumevt       = 1,
        .rxnumevt       = 1,
index 2ec3095ffb7b564e61a54bcc4e366f32b87e671c..d4ec18d0b4a4fc7a58c95f054b50511e4e448731 100644 (file)
@@ -342,7 +342,7 @@ static struct snd_platform_data da850_evm_snd_data = {
        .num_serializer = ARRAY_SIZE(da850_iis_serializer_direction),
        .tdm_slots      = 2,
        .serial_dir     = da850_iis_serializer_direction,
-       .eventq_no      = EVENTQ_1,
+       .asp_chan_q     = EVENTQ_1,
        .version        = MCASP_VERSION_2,
        .txnumevt       = 1,
        .rxnumevt       = 1,
index 6d8889342c9f8b978886bff64f5848b5f5fa7ce0..87521f2d69c740d632606e31b8bc4868c89f4e56 100644 (file)
@@ -323,7 +323,7 @@ static struct snd_platform_data dm646x_evm_snd_data[] = {
                .num_serializer = ARRAY_SIZE(dm646x_iis_serializer_direction),
                .tdm_slots      = 2,
                .serial_dir     = dm646x_iis_serializer_direction,
-               .eventq_no      = EVENTQ_0,
+               .asp_chan_q     = EVENTQ_0,
        },
        {
                .tx_dma_offset  = 0x400,
@@ -332,7 +332,7 @@ static struct snd_platform_data dm646x_evm_snd_data[] = {
                .num_serializer = ARRAY_SIZE(dm646x_dit_serializer_direction),
                .tdm_slots      = 32,
                .serial_dir     = dm646x_dit_serializer_direction,
-               .eventq_no      = EVENTQ_0,
+               .asp_chan_q     = EVENTQ_0,
        },
 };
 
index b12c69edeea5f29734b7ed75c38f797c89478381..9aa240909a2cf4f9dac7bc1afc560712d9020ba2 100644 (file)
@@ -52,7 +52,8 @@
 struct snd_platform_data {
        u32 tx_dma_offset;
        u32 rx_dma_offset;
-       enum dma_event_q eventq_no;     /* event queue number */
+       enum dma_event_q asp_chan_q;    /* event queue number for ASP channel */
+       enum dma_event_q ram_chan_q;    /* event queue number for RAM channel */
        unsigned int codec_fmt;
        /*
         * Allowing this is more efficient and eliminates left and right swaps
index b251bc9a981292d21f07b371a6c478a4ae7cfd30..9e8932abf158b7f8d22660081fd73183a73a4469 100644 (file)
@@ -648,6 +648,8 @@ static int davinci_i2s_probe(struct platform_device *pdev)
        struct snd_platform_data *pdata = pdev->dev.platform_data;
        struct davinci_mcbsp_dev *dev;
        struct resource *mem, *ioarea, *res;
+       enum dma_event_q asp_chan_q = EVENTQ_0;
+       enum dma_event_q ram_chan_q = EVENTQ_1;
        int ret;
 
        mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -676,7 +678,15 @@ static int davinci_i2s_probe(struct platform_device *pdev)
                        pdata->sram_size_capture;
                dev->clk_input_pin = pdata->clk_input_pin;
                dev->i2s_accurate_sck = pdata->i2s_accurate_sck;
+               asp_chan_q = pdata->asp_chan_q;
+               ram_chan_q = pdata->ram_chan_q;
        }
+
+       dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK].asp_chan_q   = asp_chan_q;
+       dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK].ram_chan_q   = ram_chan_q;
+       dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].asp_chan_q    = asp_chan_q;
+       dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].ram_chan_q    = ram_chan_q;
+
        dev->clk = clk_get(&pdev->dev, NULL);
        if (IS_ERR(dev->clk)) {
                ret = -ENODEV;
index d3955096d87214e842d3ba25d0e45aedf3fbcc12..b24720894af64a183a68aec1925a77419b5d0ad5 100644 (file)
@@ -890,7 +890,8 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
        dev->rxnumevt = pdata->rxnumevt;
 
        dma_data = &dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK];
-       dma_data->eventq_no = pdata->eventq_no;
+       dma_data->asp_chan_q = pdata->asp_chan_q;
+       dma_data->ram_chan_q = pdata->ram_chan_q;
        dma_data->dma_addr = (dma_addr_t) (pdata->tx_dma_offset +
                                                        io_v2p(dev->base));
 
@@ -904,7 +905,8 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
        dma_data->channel = res->start;
 
        dma_data = &dev->dma_params[SNDRV_PCM_STREAM_CAPTURE];
-       dma_data->eventq_no = pdata->eventq_no;
+       dma_data->asp_chan_q = pdata->asp_chan_q;
+       dma_data->ram_chan_q = pdata->ram_chan_q;
        dma_data->dma_addr = (dma_addr_t)(pdata->rx_dma_offset +
                                                        io_v2p(dev->base));
 
index def454e42fcb988ff003679efd5c315a62c3f005..a7124116d2e01aea6832f158db798a8e16c93bfd 100644 (file)
@@ -381,7 +381,7 @@ static int request_ping_pong(struct snd_pcm_substream *substream,
        /* Request ram master channel */
        link = prtd->ram_channel = edma_alloc_channel(EDMA_CHANNEL_ANY,
                                  davinci_pcm_dma_irq, substream,
-                                 EVENTQ_1);
+                                 prtd->params->ram_chan_q);
        if (link < 0)
                goto exit1;
 
@@ -477,7 +477,8 @@ static int davinci_pcm_dma_request(struct snd_pcm_substream *substream)
 
        /* Request asp master DMA channel */
        link = prtd->asp_channel = edma_alloc_channel(params->channel,
-                       davinci_pcm_dma_irq, substream, EVENTQ_0);
+                       davinci_pcm_dma_irq, substream,
+                       prtd->params->asp_chan_q);
        if (link < 0)
                goto exit1;
 
index 0764944cf10f4250dd802400c77bde414eac3226..b799a02333d83b10a896d639ce1c73679ab06bec 100644 (file)
@@ -21,7 +21,8 @@ struct davinci_pcm_dma_params {
        unsigned short acnt;
        dma_addr_t dma_addr;            /* device physical address for DMA */
        unsigned sram_size;
-       enum dma_event_q eventq_no;     /* event queue number */
+       enum dma_event_q asp_chan_q;    /* event queue number for ASP channel */
+       enum dma_event_q ram_chan_q;    /* event queue number for RAM channel */
        unsigned char data_type;        /* xfer data type */
        unsigned char convert_mono_stereo;
        unsigned int fifo_level;