Introduce macros to build IDs from controller and channel number, and to
extract them. Modify the edma_alloc_slot function to take an extra argument
for the controller.

Also, modify the MMC and ASoC drivers to reflect the above changes.

Signed-off-by: Sudhakar Rajashekhara <sudhakar....@ti.com>
---
 arch/arm/mach-davinci/devices.c           |    8 ++++----
 arch/arm/mach-davinci/dma.c               |   25 +++++++++++++++----------
 arch/arm/mach-davinci/include/mach/edma.h |    6 +++++-
 drivers/mmc/host/davinci_mmc.c            |   10 +++++-----
 sound/soc/davinci/davinci-evm.c           |    8 ++++----
 sound/soc/davinci/davinci-pcm.c           |    6 +++---
 6 files changed, 36 insertions(+), 27 deletions(-)

diff --git a/arch/arm/mach-davinci/devices.c b/arch/arm/mach-davinci/devices.c
index 5b21faf..0968722 100644
--- a/arch/arm/mach-davinci/devices.c
+++ b/arch/arm/mach-davinci/devices.c
@@ -90,10 +90,10 @@ static struct resource mmcsd0_resources[] = {
        },
        /* DMA channels: RX, then TX */
        {
-               .start = DAVINCI_DMA_MMCRXEVT,
+               .start = EDMA_CTLR_CHAN(0, DAVINCI_DMA_MMCRXEVT),
                .flags = IORESOURCE_DMA,
        }, {
-               .start = DAVINCI_DMA_MMCTXEVT,
+               .start = EDMA_CTLR_CHAN(0, DAVINCI_DMA_MMCTXEVT),
                .flags = IORESOURCE_DMA,
        },
 };
@@ -127,10 +127,10 @@ static struct resource mmcsd1_resources[] = {
        },
        /* DMA channels: RX, then TX */
        {
-               .start = 30,    /* rx */
+               .start = EDMA_CTLR_CHAN(0, 30), /* rx */
                .flags = IORESOURCE_DMA,
        }, {
-               .start = 31,    /* tx */
+               .start = EDMA_CTLR_CHAN(0, 31), /* tx */
                .flags = IORESOURCE_DMA,
        },
 };
diff --git a/arch/arm/mach-davinci/dma.c b/arch/arm/mach-davinci/dma.c
index 53f6c9b..fdfd59d 100644
--- a/arch/arm/mach-davinci/dma.c
+++ b/arch/arm/mach-davinci/dma.c
@@ -573,28 +573,33 @@ EXPORT_SYMBOL(edma_free_channel);
  *
  * Returns the number of the slot, else negative errno.
  */
-int edma_alloc_slot(int slot)
+int edma_alloc_slot(unsigned ctlr, int slot)
 {
+       if (slot >= 0)
+               slot = EDMA_CHAN(slot);
+
        if (slot < 0) {
-               slot = num_channels;
+               slot = edma_info[ctlr]->num_channels;
                for (;;) {
-                       slot = find_next_zero_bit(edma_inuse,
-                                       num_slots, slot);
-                       if (slot == num_slots)
+                       slot = find_next_zero_bit(edma_info[ctlr]->edma_inuse,
+                                       edma_info[ctlr]->num_slots, slot);
+                       if (slot == edma_info[ctlr]->num_slots)
                                return -ENOMEM;
-                       if (!test_and_set_bit(slot, edma_inuse))
+                       if (!test_and_set_bit(slot,
+                                               edma_info[ctlr]->edma_inuse))
                                break;
                }
-       } else if (slot < num_channels || slot >= num_slots) {
+       } else if (slot < edma_info[ctlr]->num_channels ||
+                       slot >= edma_info[ctlr]->num_slots) {
                return -EINVAL;
-       } else if (test_and_set_bit(slot, edma_inuse)) {
+       } else if (test_and_set_bit(slot, edma_info[ctlr]->edma_inuse)) {
                return -EBUSY;
        }
 
-       memcpy_toio(edmacc_regs_base + PARM_OFFSET(slot),
+       memcpy_toio(edmacc_regs_base[ctlr] + PARM_OFFSET(slot),
                        &dummy_paramset, PARM_SIZE);
 
-       return slot;
+       return EDMA_CTLR_CHAN(ctlr, slot);
 }
 EXPORT_SYMBOL(edma_alloc_slot);
 
diff --git a/arch/arm/mach-davinci/include/mach/edma.h 
b/arch/arm/mach-davinci/include/mach/edma.h
index 517ae36..aaeeb96 100644
--- a/arch/arm/mach-davinci/include/mach/edma.h
+++ b/arch/arm/mach-davinci/include/mach/edma.h
@@ -171,6 +171,10 @@ enum sync_dimension {
        ABSYNC = 1
 };
 
+#define EDMA_CTLR_CHAN(ctlr, chan)     (((ctlr) << 16) | (chan))
+#define EDMA_CTLR(i)                   ((i) >> 16)
+#define EDMA_CHAN_SLOT(i)              ((i) & 0xffff)
+
 #define EDMA_CHANNEL_ANY               -1      /* for edma_alloc_channel() */
 #define EDMA_SLOT_ANY                  -1      /* for edma_alloc_slot() */
 
@@ -181,7 +185,7 @@ int edma_alloc_channel(int channel,
 void edma_free_channel(unsigned channel);
 
 /* alloc/free parameter RAM slots */
-int edma_alloc_slot(int slot);
+int edma_alloc_slot(unsigned ctlr, int slot);
 void edma_free_slot(unsigned slot);
 
 /* calls that operate on part of a parameter RAM slot */
diff --git a/drivers/mmc/host/davinci_mmc.c b/drivers/mmc/host/davinci_mmc.c
index 9b23802..5babb1f 100644
--- a/drivers/mmc/host/davinci_mmc.c
+++ b/drivers/mmc/host/davinci_mmc.c
@@ -178,7 +178,7 @@ struct mmc_davinci_host {
        u32 buffer_bytes_left;
        u32 bytes_left;
 
-       u8 rxdma, txdma;
+       u32 rxdma, txdma;
        bool use_dma;
        bool do_dma;
 
@@ -190,7 +190,7 @@ struct mmc_davinci_host {
        struct edmacc_param     tx_template;
        struct edmacc_param     rx_template;
        unsigned                n_link;
-       u8                      links[NR_SG - 1];
+       u32                     links[NR_SG - 1];
 
        /* For PIO we walk scatterlists one segment at a time. */
        unsigned int            sg_len;
@@ -466,7 +466,7 @@ static void __init mmc_davinci_dma_setup(struct 
mmc_davinci_host *host,
        edma_read_slot(sync_dev, template);
 
        /* don't bother with irqs or chaining */
-       template->opt |= sync_dev << 12;
+       template->opt |= EDMA_CHAN_SLOT(sync_dev) << 12;
 }
 
 static void mmc_davinci_send_dma_request(struct mmc_davinci_host *host,
@@ -500,7 +500,7 @@ static void mmc_davinci_send_dma_request(struct 
mmc_davinci_host *host,
                unsigned        count = sg_dma_len(sg);
 
                template->link_bcntrld = sg_len
-                               ? (host->links[link] << 5)
+                               ? (EDMA_CHAN_SLOT(host->links[link]) << 5)
                                : 0xffff;
 
                if (count > bytes_left)
@@ -594,7 +594,7 @@ static int __init davinci_acquire_dma_channels(struct 
mmc_davinci_host *host)
         * channel as needed to handle a scatterlist.
         */
        for (i = 0; i < ARRAY_SIZE(host->links); i++) {
-               r = edma_alloc_slot(EDMA_SLOT_ANY);
+               r = edma_alloc_slot(EDMA_CTLR(host->txdma), EDMA_SLOT_ANY);
                if (r < 0) {
                        dev_dbg(mmc_dev(host->mmc), "dma PaRAM alloc --> %d\n",
                                r);
diff --git a/sound/soc/davinci/davinci-evm.c b/sound/soc/davinci/davinci-evm.c
index 4ddb13d..ea7a3ce 100644
--- a/sound/soc/davinci/davinci-evm.c
+++ b/sound/soc/davinci/davinci-evm.c
@@ -175,8 +175,8 @@ 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,
+       .tx_dma_ch      = EDMA_CTLR_CHAN(0, DAVINCI_DMA_ASP0_TX),
+       .rx_dma_ch      = EDMA_CTLR_CHAN(0, DAVINCI_DMA_ASP0_RX),
 };
 
 /* DM335 EVM uses ASP1; line-out is a stereo mini-jack */
@@ -189,8 +189,8 @@ 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,
+       .tx_dma_ch      = EDMA_CTLR_CHAN(0, DAVINCI_DMA_ASP1_TX),
+       .rx_dma_ch      = EDMA_CTLR_CHAN(0, DAVINCI_DMA_ASP1_RX),
 };
 
 static struct platform_device *evm_snd_device;
diff --git a/sound/soc/davinci/davinci-pcm.c b/sound/soc/davinci/davinci-pcm.c
index 48bd9e2..2a1985c 100644
--- a/sound/soc/davinci/davinci-pcm.c
+++ b/sound/soc/davinci/davinci-pcm.c
@@ -150,7 +150,7 @@ 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(EDMA_CTLR(prtd->master_lch), EDMA_SLOT_ANY);
        if (ret < 0) {
                edma_free_channel(prtd->master_lch);
                return ret;
@@ -167,8 +167,8 @@ static int davinci_pcm_dma_request(struct snd_pcm_substream 
*substream)
         * so davinci_pcm_enqueue_dma() takes less time in IRQ.
         */
        edma_read_slot(prtd->slave_lch, &p_ram);
-       p_ram.opt |= TCINTEN | EDMA_TCC(prtd->master_lch);
-       p_ram.link_bcntrld = prtd->slave_lch << 5;
+       p_ram.opt |= TCINTEN | EDMA_TCC(EDMA_CHAN_SLOT(prtd->master_lch));
+       p_ram.link_bcntrld = EDMA_CHAN_SLOT(prtd->slave_lch) << 5;
        edma_write_slot(prtd->slave_lch, &p_ram);
 
        return 0;
-- 
1.5.6

_______________________________________________
Davinci-linux-open-source mailing list
Davinci-linux-open-source@linux.davincidsp.com
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source

Reply via email to