aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-02-04 13:54:26 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2012-02-04 13:54:26 -0500
commit4554c135a0a017f4cd96f7c0612cb7ca78c68d08 (patch)
tree7233d0c493223fb3769c4dd0668bd8da4fd02241
parent82bdc843c2be0ce199e8e247dfb2a17248cbd6c4 (diff)
parent94ac27a54be6a14948f0a9b3f542b4ff1faac232 (diff)
Merge branch 'fixes' of git://git.infradead.org/users/vkoul/slave-dma
* 'fixes' of git://git.infradead.org/users/vkoul/slave-dma: i.MX SDMA: Fix burstsize settings ARM: mach-shmobile: both USB DMAC instances on sh7372 are slave-only dma: sh_dma: not all SH DMAC implementations support MEMCPY at_hdmac: bugfix for enabling channel irq dmaengine: fix missing 'cnt' in ?: in dmatest
-rw-r--r--arch/arm/mach-shmobile/setup-sh7372.c2
-rw-r--r--drivers/dma/at_hdmac.c4
-rw-r--r--drivers/dma/at_hdmac_regs.h17
-rw-r--r--drivers/dma/dmatest.c2
-rw-r--r--drivers/dma/imx-sdma.c6
-rw-r--r--drivers/dma/shdma.c3
-rw-r--r--include/linux/sh_dma.h1
7 files changed, 20 insertions, 15 deletions
diff --git a/arch/arm/mach-shmobile/setup-sh7372.c b/arch/arm/mach-shmobile/setup-sh7372.c
index 6fcf304d3cdf..a83cf51fc099 100644
--- a/arch/arm/mach-shmobile/setup-sh7372.c
+++ b/arch/arm/mach-shmobile/setup-sh7372.c
@@ -662,6 +662,7 @@ static struct sh_dmae_pdata usb_dma0_platform_data = {
662 .dmaor_is_32bit = 1, 662 .dmaor_is_32bit = 1,
663 .needs_tend_set = 1, 663 .needs_tend_set = 1,
664 .no_dmars = 1, 664 .no_dmars = 1,
665 .slave_only = 1,
665}; 666};
666 667
667static struct resource sh7372_usb_dmae0_resources[] = { 668static struct resource sh7372_usb_dmae0_resources[] = {
@@ -723,6 +724,7 @@ static struct sh_dmae_pdata usb_dma1_platform_data = {
723 .dmaor_is_32bit = 1, 724 .dmaor_is_32bit = 1,
724 .needs_tend_set = 1, 725 .needs_tend_set = 1,
725 .no_dmars = 1, 726 .no_dmars = 1,
727 .slave_only = 1,
726}; 728};
727 729
728static struct resource sh7372_usb_dmae1_resources[] = { 730static struct resource sh7372_usb_dmae1_resources[] = {
diff --git a/drivers/dma/at_hdmac.c b/drivers/dma/at_hdmac.c
index 97f87b29b9f3..f4aed5fc2cb6 100644
--- a/drivers/dma/at_hdmac.c
+++ b/drivers/dma/at_hdmac.c
@@ -1343,7 +1343,7 @@ static int __init at_dma_probe(struct platform_device *pdev)
1343 1343
1344 tasklet_init(&atchan->tasklet, atc_tasklet, 1344 tasklet_init(&atchan->tasklet, atc_tasklet,
1345 (unsigned long)atchan); 1345 (unsigned long)atchan);
1346 atc_enable_irq(atchan); 1346 atc_enable_chan_irq(atdma, i);
1347 } 1347 }
1348 1348
1349 /* set base routines */ 1349 /* set base routines */
@@ -1410,7 +1410,7 @@ static int __exit at_dma_remove(struct platform_device *pdev)
1410 struct at_dma_chan *atchan = to_at_dma_chan(chan); 1410 struct at_dma_chan *atchan = to_at_dma_chan(chan);
1411 1411
1412 /* Disable interrupts */ 1412 /* Disable interrupts */
1413 atc_disable_irq(atchan); 1413 atc_disable_chan_irq(atdma, chan->chan_id);
1414 tasklet_disable(&atchan->tasklet); 1414 tasklet_disable(&atchan->tasklet);
1415 1415
1416 tasklet_kill(&atchan->tasklet); 1416 tasklet_kill(&atchan->tasklet);
diff --git a/drivers/dma/at_hdmac_regs.h b/drivers/dma/at_hdmac_regs.h
index dcaedfc181cf..a8d3277d60b5 100644
--- a/drivers/dma/at_hdmac_regs.h
+++ b/drivers/dma/at_hdmac_regs.h
@@ -327,28 +327,27 @@ static void atc_dump_lli(struct at_dma_chan *atchan, struct at_lli *lli)
327} 327}
328 328
329 329
330static void atc_setup_irq(struct at_dma_chan *atchan, int on) 330static void atc_setup_irq(struct at_dma *atdma, int chan_id, int on)
331{ 331{
332 struct at_dma *atdma = to_at_dma(atchan->chan_common.device); 332 u32 ebci;
333 u32 ebci;
334 333
335 /* enable interrupts on buffer transfer completion & error */ 334 /* enable interrupts on buffer transfer completion & error */
336 ebci = AT_DMA_BTC(atchan->chan_common.chan_id) 335 ebci = AT_DMA_BTC(chan_id)
337 | AT_DMA_ERR(atchan->chan_common.chan_id); 336 | AT_DMA_ERR(chan_id);
338 if (on) 337 if (on)
339 dma_writel(atdma, EBCIER, ebci); 338 dma_writel(atdma, EBCIER, ebci);
340 else 339 else
341 dma_writel(atdma, EBCIDR, ebci); 340 dma_writel(atdma, EBCIDR, ebci);
342} 341}
343 342
344static inline void atc_enable_irq(struct at_dma_chan *atchan) 343static void atc_enable_chan_irq(struct at_dma *atdma, int chan_id)
345{ 344{
346 atc_setup_irq(atchan, 1); 345 atc_setup_irq(atdma, chan_id, 1);
347} 346}
348 347
349static inline void atc_disable_irq(struct at_dma_chan *atchan) 348static void atc_disable_chan_irq(struct at_dma *atdma, int chan_id)
350{ 349{
351 atc_setup_irq(atchan, 0); 350 atc_setup_irq(atdma, chan_id, 0);
352} 351}
353 352
354 353
diff --git a/drivers/dma/dmatest.c b/drivers/dma/dmatest.c
index 2b8661b54eaf..24225f0fdcd8 100644
--- a/drivers/dma/dmatest.c
+++ b/drivers/dma/dmatest.c
@@ -599,7 +599,7 @@ static int dmatest_add_channel(struct dma_chan *chan)
599 } 599 }
600 if (dma_has_cap(DMA_PQ, dma_dev->cap_mask)) { 600 if (dma_has_cap(DMA_PQ, dma_dev->cap_mask)) {
601 cnt = dmatest_add_threads(dtc, DMA_PQ); 601 cnt = dmatest_add_threads(dtc, DMA_PQ);
602 thread_count += cnt > 0 ?: 0; 602 thread_count += cnt > 0 ? cnt : 0;
603 } 603 }
604 604
605 pr_info("dmatest: Started %u threads using %s\n", 605 pr_info("dmatest: Started %u threads using %s\n",
diff --git a/drivers/dma/imx-sdma.c b/drivers/dma/imx-sdma.c
index a8af379680c1..8bc5acf36ee5 100644
--- a/drivers/dma/imx-sdma.c
+++ b/drivers/dma/imx-sdma.c
@@ -1102,11 +1102,13 @@ static int sdma_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd,
1102 case DMA_SLAVE_CONFIG: 1102 case DMA_SLAVE_CONFIG:
1103 if (dmaengine_cfg->direction == DMA_DEV_TO_MEM) { 1103 if (dmaengine_cfg->direction == DMA_DEV_TO_MEM) {
1104 sdmac->per_address = dmaengine_cfg->src_addr; 1104 sdmac->per_address = dmaengine_cfg->src_addr;
1105 sdmac->watermark_level = dmaengine_cfg->src_maxburst; 1105 sdmac->watermark_level = dmaengine_cfg->src_maxburst *
1106 dmaengine_cfg->src_addr_width;
1106 sdmac->word_size = dmaengine_cfg->src_addr_width; 1107 sdmac->word_size = dmaengine_cfg->src_addr_width;
1107 } else { 1108 } else {
1108 sdmac->per_address = dmaengine_cfg->dst_addr; 1109 sdmac->per_address = dmaengine_cfg->dst_addr;
1109 sdmac->watermark_level = dmaengine_cfg->dst_maxburst; 1110 sdmac->watermark_level = dmaengine_cfg->dst_maxburst *
1111 dmaengine_cfg->dst_addr_width;
1110 sdmac->word_size = dmaengine_cfg->dst_addr_width; 1112 sdmac->word_size = dmaengine_cfg->dst_addr_width;
1111 } 1113 }
1112 sdmac->direction = dmaengine_cfg->direction; 1114 sdmac->direction = dmaengine_cfg->direction;
diff --git a/drivers/dma/shdma.c b/drivers/dma/shdma.c
index 54043cd831c8..812fd76e9c18 100644
--- a/drivers/dma/shdma.c
+++ b/drivers/dma/shdma.c
@@ -1262,7 +1262,8 @@ static int __init sh_dmae_probe(struct platform_device *pdev)
1262 1262
1263 INIT_LIST_HEAD(&shdev->common.channels); 1263 INIT_LIST_HEAD(&shdev->common.channels);
1264 1264
1265 dma_cap_set(DMA_MEMCPY, shdev->common.cap_mask); 1265 if (!pdata->slave_only)
1266 dma_cap_set(DMA_MEMCPY, shdev->common.cap_mask);
1266 if (pdata->slave && pdata->slave_num) 1267 if (pdata->slave && pdata->slave_num)
1267 dma_cap_set(DMA_SLAVE, shdev->common.cap_mask); 1268 dma_cap_set(DMA_SLAVE, shdev->common.cap_mask);
1268 1269
diff --git a/include/linux/sh_dma.h b/include/linux/sh_dma.h
index 8cd7fe59cf1a..425450b980b8 100644
--- a/include/linux/sh_dma.h
+++ b/include/linux/sh_dma.h
@@ -70,6 +70,7 @@ struct sh_dmae_pdata {
70 unsigned int needs_tend_set:1; 70 unsigned int needs_tend_set:1;
71 unsigned int no_dmars:1; 71 unsigned int no_dmars:1;
72 unsigned int chclr_present:1; 72 unsigned int chclr_present:1;
73 unsigned int slave_only:1;
73}; 74};
74 75
75/* DMA register */ 76/* DMA register */