Pass the EDMA CC instance through Audio platform data. Also, modify the EDMA
APIs in audio driver to take EDMA CC instance as argument.

Signed-off-by: Sudhakar Rajashekhara <[email protected]>
---
 sound/soc/davinci/davinci-evm.c |    2 ++
 sound/soc/davinci/davinci-i2s.c |    2 ++
 sound/soc/davinci/davinci-pcm.c |   38 ++++++++++++++++++++------------------
 sound/soc/davinci/davinci-pcm.h |    2 ++
 4 files changed, 26 insertions(+), 18 deletions(-)

diff --git a/sound/soc/davinci/davinci-evm.c b/sound/soc/davinci/davinci-evm.c
index a3fd627..6e7a209 100644
--- a/sound/soc/davinci/davinci-evm.c
+++ b/sound/soc/davinci/davinci-evm.c
@@ -177,6 +177,7 @@ static struct resource evm_snd_resources[] = {
 static struct evm_snd_platform_data evm_snd_data = {
        .tx_dma_ch      = DAVINCI_DMA_ASP0_TX,
        .rx_dma_ch      = DAVINCI_DMA_ASP0_RX,
+       .cc_inst        = 0,
 };
 
 /* DM335 EVM uses ASP1; line-out is a stereo mini-jack */
@@ -191,6 +192,7 @@ static struct resource dm335evm_snd_resources[] = {
 static struct evm_snd_platform_data dm335evm_snd_data = {
        .tx_dma_ch      = DAVINCI_DMA_ASP1_TX,
        .rx_dma_ch      = DAVINCI_DMA_ASP1_RX,
+       .cc_inst        = 0,
 };
 
 static struct platform_device *evm_snd_device;
diff --git a/sound/soc/davinci/davinci-i2s.c b/sound/soc/davinci/davinci-i2s.c
index 7b482c5..4e00188 100644
--- a/sound/soc/davinci/davinci-i2s.c
+++ b/sound/soc/davinci/davinci-i2s.c
@@ -480,11 +480,13 @@ static int davinci_i2s_probe(struct platform_device *pdev,
 
        dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK] = &davinci_i2s_pcm_out;
        dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK]->channel = pdata->tx_dma_ch;
+       dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK]->cc_inst = pdata->cc_inst;
        dev->dma_params[SNDRV_PCM_STREAM_PLAYBACK]->dma_addr =
            (dma_addr_t)(io_v2p(dev->base) + DAVINCI_MCBSP_DXR_REG);
 
        dev->dma_params[SNDRV_PCM_STREAM_CAPTURE] = &davinci_i2s_pcm_in;
        dev->dma_params[SNDRV_PCM_STREAM_CAPTURE]->channel = pdata->rx_dma_ch;
+       dev->dma_params[SNDRV_PCM_STREAM_CAPTURE]->cc_inst = pdata->cc_inst;
        dev->dma_params[SNDRV_PCM_STREAM_CAPTURE]->dma_addr =
            (dma_addr_t)(io_v2p(dev->base) + DAVINCI_MCBSP_DRR_REG);
 
diff --git a/sound/soc/davinci/davinci-pcm.c b/sound/soc/davinci/davinci-pcm.c
index 7c983ca..fc3981c 100644
--- a/sound/soc/davinci/davinci-pcm.c
+++ b/sound/soc/davinci/davinci-pcm.c
@@ -98,11 +98,12 @@ static void davinci_pcm_enqueue_dma(struct 
snd_pcm_substream *substream)
                dst_bidx = data_type;
        }
 
-       edma_set_src(lch, src, INCR, W8BIT);
-       edma_set_dest(lch, dst, INCR, W8BIT);
-       edma_set_src_index(lch, src_bidx, 0);
-       edma_set_dest_index(lch, dst_bidx, 0);
-       edma_set_transfer_params(lch, data_type, count, 1, 0, ASYNC);
+       edma_set_src(prtd->params->cc_inst, lch, src, INCR, W8BIT);
+       edma_set_dest(prtd->params->cc_inst, lch, dst, INCR, W8BIT);
+       edma_set_src_index(prtd->params->cc_inst, lch, src_bidx, 0);
+       edma_set_dest_index(prtd->params->cc_inst, lch, dst_bidx, 0);
+       edma_set_transfer_params(prtd->params->cc_inst, lch, data_type, count,
+                               1, 0, ASYNC);
 
        prtd->period++;
        if (unlikely(prtd->period >= runtime->periods))
@@ -142,7 +143,8 @@ static int davinci_pcm_dma_request(struct snd_pcm_substream 
*substream)
        prtd->params = dma_data;
 
        /* Request master DMA channel */
-       ret = edma_alloc_channel(prtd->params->channel,
+       ret = edma_alloc_channel(prtd->params->cc_inst,
+                                 prtd->params->channel,
                                  davinci_pcm_dma_irq, substream,
                                  EVENTQ_0);
        if (ret < 0)
@@ -150,9 +152,9 @@ static int davinci_pcm_dma_request(struct snd_pcm_substream 
*substream)
        prtd->master_lch = ret;
 
        /* Request parameter RAM reload slot */
-       ret = edma_alloc_slot(EDMA_SLOT_ANY);
+       ret = edma_alloc_slot(prtd->params->cc_inst, EDMA_SLOT_ANY);
        if (ret < 0) {
-               edma_free_channel(prtd->master_lch);
+               edma_free_channel(prtd->params->cc_inst, prtd->master_lch);
                return ret;
        }
        prtd->slave_lch = ret;
@@ -166,10 +168,10 @@ static int davinci_pcm_dma_request(struct 
snd_pcm_substream *substream)
         * the buffer and its length (ccnt) ... use it as a template
         * so davinci_pcm_enqueue_dma() takes less time in IRQ.
         */
-       edma_read_slot(prtd->slave_lch, &p_ram);
+       edma_read_slot(prtd->params->cc_inst, prtd->slave_lch, &p_ram);
        p_ram.opt |= TCINTEN | EDMA_TCC(prtd->master_lch);
        p_ram.link_bcntrld = prtd->slave_lch << 5;
-       edma_write_slot(prtd->slave_lch, &p_ram);
+       edma_write_slot(prtd->params->cc_inst, prtd->slave_lch, &p_ram);
 
        return 0;
 }
@@ -185,12 +187,12 @@ static int davinci_pcm_trigger(struct snd_pcm_substream 
*substream, int cmd)
        case SNDRV_PCM_TRIGGER_START:
        case SNDRV_PCM_TRIGGER_RESUME:
        case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
-               edma_start(prtd->master_lch);
+               edma_start(prtd->params->cc_inst, prtd->master_lch);
                break;
        case SNDRV_PCM_TRIGGER_STOP:
        case SNDRV_PCM_TRIGGER_SUSPEND:
        case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
-               edma_stop(prtd->master_lch);
+               edma_stop(prtd->params->cc_inst, prtd->master_lch);
                break;
        default:
                ret = -EINVAL;
@@ -211,8 +213,8 @@ static int davinci_pcm_prepare(struct snd_pcm_substream 
*substream)
        davinci_pcm_enqueue_dma(substream);
 
        /* Copy self-linked parameter RAM entry into master channel */
-       edma_read_slot(prtd->slave_lch, &temp);
-       edma_write_slot(prtd->master_lch, &temp);
+       edma_read_slot(prtd->params->cc_inst, prtd->slave_lch, &temp);
+       edma_write_slot(prtd->params->cc_inst, prtd->master_lch, &temp);
 
        return 0;
 }
@@ -228,7 +230,7 @@ davinci_pcm_pointer(struct snd_pcm_substream *substream)
 
        spin_lock(&prtd->lock);
 
-       edma_get_position(prtd->master_lch, &src, &dst);
+       edma_get_position(prtd->params->cc_inst, prtd->master_lch, &src, &dst);
        if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
                count = src - runtime->dma_addr;
        else
@@ -273,10 +275,10 @@ static int davinci_pcm_close(struct snd_pcm_substream 
*substream)
        struct snd_pcm_runtime *runtime = substream->runtime;
        struct davinci_runtime_data *prtd = runtime->private_data;
 
-       edma_unlink(prtd->slave_lch);
+       edma_unlink(prtd->params->cc_inst, prtd->slave_lch);
 
-       edma_free_slot(prtd->slave_lch);
-       edma_free_channel(prtd->master_lch);
+       edma_free_slot(prtd->params->cc_inst, prtd->slave_lch);
+       edma_free_channel(prtd->params->cc_inst, prtd->master_lch);
 
        kfree(prtd);
 
diff --git a/sound/soc/davinci/davinci-pcm.h b/sound/soc/davinci/davinci-pcm.h
index 62cb4eb..d2cd332 100644
--- a/sound/soc/davinci/davinci-pcm.h
+++ b/sound/soc/davinci/davinci-pcm.h
@@ -17,11 +17,13 @@ struct davinci_pcm_dma_params {
        int channel;            /* sync dma channel ID */
        dma_addr_t dma_addr;    /* device physical address for DMA */
        unsigned int data_type; /* xfer data type */
+       u8 cc_inst;
 };
 
 struct evm_snd_platform_data {
        int tx_dma_ch;
        int rx_dma_ch;
+       u8 cc_inst;
 };
 
 extern struct snd_soc_platform davinci_soc_platform;
-- 
1.5.6

_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source

Reply via email to