aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/dma/sirf-dma.c
diff options
context:
space:
mode:
authorBarry Song <Baohua.Song@csr.com>2012-11-01 10:54:43 -0400
committerVinod Koul <vinod.koul@intel.com>2013-01-08 01:05:03 -0500
commitf7d935dcc34fae9ad4a39f2cf8e2a96199c48948 (patch)
tree900ccbbe1963162bcdb3009e60ad596d75db3e40 /drivers/dma/sirf-dma.c
parent91f8aecc501e456c97a6f49f7ea3797e874d5d89 (diff)
dmaengine: sirf: enable the driver support new SiRFmarco SoC
The driver supports old up SiRFprimaII SoCs, this patch makes it support the new SiRFmarco as well. SiRFmarco, as a SMP SoC, adds new DMA_INT_EN_CLR and DMA_CH_LOOP_CTRL_CLR registers, to disable IRQ/Channel, we should write 1 to the corresponding bit in the two CLEAR register. Tested on SiRFmarco using SPI driver: $ /mnt/spidev-sirftest -D /dev/spidev32766.0 spi mode: 0 bits per word: 8 max speed: 500000 Hz (500 KHz) 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 $ cat /proc/interrupts CPU0 CPU1 32: 1593 0 GIC sirfsoc_timer0 33: 0 3533 GIC sirfsoc_timer1 44: 0 0 GIC sirfsoc_dma 45: 16 0 GIC sirfsoc_dma 47: 6 0 GIC sirfsoc_spi 50: 5654 0 GIC sirfsoc-uart ... Signed-off-by: Barry Song <Baohua.Song@csr.com> Signed-off-by: Vinod Koul <vinod.koul@linux.intel.com>
Diffstat (limited to 'drivers/dma/sirf-dma.c')
-rw-r--r--drivers/dma/sirf-dma.c25
1 files changed, 19 insertions, 6 deletions
diff --git a/drivers/dma/sirf-dma.c b/drivers/dma/sirf-dma.c
index c3de6edb9651..3c210ba9f938 100644
--- a/drivers/dma/sirf-dma.c
+++ b/drivers/dma/sirf-dma.c
@@ -32,7 +32,9 @@
32#define SIRFSOC_DMA_CH_VALID 0x140 32#define SIRFSOC_DMA_CH_VALID 0x140
33#define SIRFSOC_DMA_CH_INT 0x144 33#define SIRFSOC_DMA_CH_INT 0x144
34#define SIRFSOC_DMA_INT_EN 0x148 34#define SIRFSOC_DMA_INT_EN 0x148
35#define SIRFSOC_DMA_INT_EN_CLR 0x14C
35#define SIRFSOC_DMA_CH_LOOP_CTRL 0x150 36#define SIRFSOC_DMA_CH_LOOP_CTRL 0x150
37#define SIRFSOC_DMA_CH_LOOP_CTRL_CLR 0x15C
36 38
37#define SIRFSOC_DMA_MODE_CTRL_BIT 4 39#define SIRFSOC_DMA_MODE_CTRL_BIT 4
38#define SIRFSOC_DMA_DIR_CTRL_BIT 5 40#define SIRFSOC_DMA_DIR_CTRL_BIT 5
@@ -76,6 +78,7 @@ struct sirfsoc_dma {
76 struct sirfsoc_dma_chan channels[SIRFSOC_DMA_CHANNELS]; 78 struct sirfsoc_dma_chan channels[SIRFSOC_DMA_CHANNELS];
77 void __iomem *base; 79 void __iomem *base;
78 int irq; 80 int irq;
81 bool is_marco;
79}; 82};
80 83
81#define DRV_NAME "sirfsoc_dma" 84#define DRV_NAME "sirfsoc_dma"
@@ -288,13 +291,19 @@ static int sirfsoc_dma_terminate_all(struct sirfsoc_dma_chan *schan)
288 int cid = schan->chan.chan_id; 291 int cid = schan->chan.chan_id;
289 unsigned long flags; 292 unsigned long flags;
290 293
291 writel_relaxed(readl_relaxed(sdma->base + SIRFSOC_DMA_INT_EN) & 294 if (!sdma->is_marco) {
292 ~(1 << cid), sdma->base + SIRFSOC_DMA_INT_EN); 295 writel_relaxed(readl_relaxed(sdma->base + SIRFSOC_DMA_INT_EN) &
293 writel_relaxed(1 << cid, sdma->base + SIRFSOC_DMA_CH_VALID); 296 ~(1 << cid), sdma->base + SIRFSOC_DMA_INT_EN);
294 297 writel_relaxed(readl_relaxed(sdma->base + SIRFSOC_DMA_CH_LOOP_CTRL)
295 writel_relaxed(readl_relaxed(sdma->base + SIRFSOC_DMA_CH_LOOP_CTRL) 298 & ~((1 << cid) | 1 << (cid + 16)),
296 & ~((1 << cid) | 1 << (cid + 16)),
297 sdma->base + SIRFSOC_DMA_CH_LOOP_CTRL); 299 sdma->base + SIRFSOC_DMA_CH_LOOP_CTRL);
300 } else {
301 writel_relaxed(1 << cid, sdma->base + SIRFSOC_DMA_INT_EN_CLR);
302 writel_relaxed((1 << cid) | 1 << (cid + 16),
303 sdma->base + SIRFSOC_DMA_CH_LOOP_CTRL_CLR);
304 }
305
306 writel_relaxed(1 << cid, sdma->base + SIRFSOC_DMA_CH_VALID);
298 307
299 spin_lock_irqsave(&schan->lock, flags); 308 spin_lock_irqsave(&schan->lock, flags);
300 list_splice_tail_init(&schan->active, &schan->free); 309 list_splice_tail_init(&schan->active, &schan->free);
@@ -568,6 +577,9 @@ static int sirfsoc_dma_probe(struct platform_device *op)
568 return -ENOMEM; 577 return -ENOMEM;
569 } 578 }
570 579
580 if (of_device_is_compatible(dn, "sirf,marco-dmac"))
581 sdma->is_marco = true;
582
571 if (of_property_read_u32(dn, "cell-index", &id)) { 583 if (of_property_read_u32(dn, "cell-index", &id)) {
572 dev_err(dev, "Fail to get DMAC index\n"); 584 dev_err(dev, "Fail to get DMAC index\n");
573 return -ENODEV; 585 return -ENODEV;
@@ -668,6 +680,7 @@ static int __devexit sirfsoc_dma_remove(struct platform_device *op)
668 680
669static struct of_device_id sirfsoc_dma_match[] = { 681static struct of_device_id sirfsoc_dma_match[] = {
670 { .compatible = "sirf,prima2-dmac", }, 682 { .compatible = "sirf,prima2-dmac", },
683 { .compatible = "sirf,marco-dmac", },
671 {}, 684 {},
672}; 685};
673 686