aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/dma/at_hdmac.c3
-rw-r--r--drivers/dma/ep93xx_dma.c4
-rw-r--r--drivers/dma/imx-dma.c2
-rw-r--r--drivers/dma/imx-sdma.c2
-rw-r--r--drivers/dma/mmp_tdma.c2
-rw-r--r--drivers/dma/mxs-dma.c2
-rw-r--r--drivers/dma/omap-dma.c45
-rw-r--r--drivers/dma/pl330.c2
-rw-r--r--drivers/dma/sa11x0-dma.c2
-rw-r--r--drivers/dma/sirf-dma.c2
-rw-r--r--drivers/dma/ste_dma40.c3
-rw-r--r--drivers/dma/tegra20-apb-dma.c2
12 files changed, 51 insertions, 20 deletions
diff --git a/drivers/dma/at_hdmac.c b/drivers/dma/at_hdmac.c
index 17d6958342e7..13a02f4425b0 100644
--- a/drivers/dma/at_hdmac.c
+++ b/drivers/dma/at_hdmac.c
@@ -852,12 +852,13 @@ atc_dma_cyclic_fill_desc(struct dma_chan *chan, struct at_desc *desc,
852 * @buf_len: total number of bytes for the entire buffer 852 * @buf_len: total number of bytes for the entire buffer
853 * @period_len: number of bytes for each period 853 * @period_len: number of bytes for each period
854 * @direction: transfer direction, to or from device 854 * @direction: transfer direction, to or from device
855 * @flags: tx descriptor status flags
855 * @context: transfer context (ignored) 856 * @context: transfer context (ignored)
856 */ 857 */
857static struct dma_async_tx_descriptor * 858static struct dma_async_tx_descriptor *
858atc_prep_dma_cyclic(struct dma_chan *chan, dma_addr_t buf_addr, size_t buf_len, 859atc_prep_dma_cyclic(struct dma_chan *chan, dma_addr_t buf_addr, size_t buf_len,
859 size_t period_len, enum dma_transfer_direction direction, 860 size_t period_len, enum dma_transfer_direction direction,
860 void *context) 861 unsigned long flags, void *context)
861{ 862{
862 struct at_dma_chan *atchan = to_at_dma_chan(chan); 863 struct at_dma_chan *atchan = to_at_dma_chan(chan);
863 struct at_dma_slave *atslave = chan->private; 864 struct at_dma_slave *atslave = chan->private;
diff --git a/drivers/dma/ep93xx_dma.c b/drivers/dma/ep93xx_dma.c
index 64256f644252..bcfde400904f 100644
--- a/drivers/dma/ep93xx_dma.c
+++ b/drivers/dma/ep93xx_dma.c
@@ -1120,6 +1120,7 @@ fail:
1120 * @buf_len: length of the buffer (in bytes) 1120 * @buf_len: length of the buffer (in bytes)
1121 * @period_len: length of a single period 1121 * @period_len: length of a single period
1122 * @dir: direction of the operation 1122 * @dir: direction of the operation
1123 * @flags: tx descriptor status flags
1123 * @context: operation context (ignored) 1124 * @context: operation context (ignored)
1124 * 1125 *
1125 * Prepares a descriptor for cyclic DMA operation. This means that once the 1126 * Prepares a descriptor for cyclic DMA operation. This means that once the
@@ -1133,7 +1134,8 @@ fail:
1133static struct dma_async_tx_descriptor * 1134static struct dma_async_tx_descriptor *
1134ep93xx_dma_prep_dma_cyclic(struct dma_chan *chan, dma_addr_t dma_addr, 1135ep93xx_dma_prep_dma_cyclic(struct dma_chan *chan, dma_addr_t dma_addr,
1135 size_t buf_len, size_t period_len, 1136 size_t buf_len, size_t period_len,
1136 enum dma_transfer_direction dir, void *context) 1137 enum dma_transfer_direction dir, unsigned long flags,
1138 void *context)
1137{ 1139{
1138 struct ep93xx_dma_chan *edmac = to_ep93xx_dma_chan(chan); 1140 struct ep93xx_dma_chan *edmac = to_ep93xx_dma_chan(chan);
1139 struct ep93xx_dma_desc *desc, *first; 1141 struct ep93xx_dma_desc *desc, *first;
diff --git a/drivers/dma/imx-dma.c b/drivers/dma/imx-dma.c
index 2a3fab289db0..f11b5b2b1a1c 100644
--- a/drivers/dma/imx-dma.c
+++ b/drivers/dma/imx-dma.c
@@ -801,7 +801,7 @@ static struct dma_async_tx_descriptor *imxdma_prep_slave_sg(
801static struct dma_async_tx_descriptor *imxdma_prep_dma_cyclic( 801static struct dma_async_tx_descriptor *imxdma_prep_dma_cyclic(
802 struct dma_chan *chan, dma_addr_t dma_addr, size_t buf_len, 802 struct dma_chan *chan, dma_addr_t dma_addr, size_t buf_len,
803 size_t period_len, enum dma_transfer_direction direction, 803 size_t period_len, enum dma_transfer_direction direction,
804 void *context) 804 unsigned long flags, void *context)
805{ 805{
806 struct imxdma_channel *imxdmac = to_imxdma_chan(chan); 806 struct imxdma_channel *imxdmac = to_imxdma_chan(chan);
807 struct imxdma_engine *imxdma = imxdmac->imxdma; 807 struct imxdma_engine *imxdma = imxdmac->imxdma;
diff --git a/drivers/dma/imx-sdma.c b/drivers/dma/imx-sdma.c
index 1b781d6ac425..c099ca0846f4 100644
--- a/drivers/dma/imx-sdma.c
+++ b/drivers/dma/imx-sdma.c
@@ -1012,7 +1012,7 @@ err_out:
1012static struct dma_async_tx_descriptor *sdma_prep_dma_cyclic( 1012static struct dma_async_tx_descriptor *sdma_prep_dma_cyclic(
1013 struct dma_chan *chan, dma_addr_t dma_addr, size_t buf_len, 1013 struct dma_chan *chan, dma_addr_t dma_addr, size_t buf_len,
1014 size_t period_len, enum dma_transfer_direction direction, 1014 size_t period_len, enum dma_transfer_direction direction,
1015 void *context) 1015 unsigned long flags, void *context)
1016{ 1016{
1017 struct sdma_channel *sdmac = to_sdma_chan(chan); 1017 struct sdma_channel *sdmac = to_sdma_chan(chan);
1018 struct sdma_engine *sdma = sdmac->sdma; 1018 struct sdma_engine *sdma = sdmac->sdma;
diff --git a/drivers/dma/mmp_tdma.c b/drivers/dma/mmp_tdma.c
index 07fa48688ba9..6d9c82e891d7 100644
--- a/drivers/dma/mmp_tdma.c
+++ b/drivers/dma/mmp_tdma.c
@@ -358,7 +358,7 @@ struct mmp_tdma_desc *mmp_tdma_alloc_descriptor(struct mmp_tdma_chan *tdmac)
358static struct dma_async_tx_descriptor *mmp_tdma_prep_dma_cyclic( 358static struct dma_async_tx_descriptor *mmp_tdma_prep_dma_cyclic(
359 struct dma_chan *chan, dma_addr_t dma_addr, size_t buf_len, 359 struct dma_chan *chan, dma_addr_t dma_addr, size_t buf_len,
360 size_t period_len, enum dma_transfer_direction direction, 360 size_t period_len, enum dma_transfer_direction direction,
361 void *context) 361 unsigned long flags, void *context)
362{ 362{
363 struct mmp_tdma_chan *tdmac = to_mmp_tdma_chan(chan); 363 struct mmp_tdma_chan *tdmac = to_mmp_tdma_chan(chan);
364 struct mmp_tdma_desc *desc; 364 struct mmp_tdma_desc *desc;
diff --git a/drivers/dma/mxs-dma.c b/drivers/dma/mxs-dma.c
index 7f41b25805fa..734a4eb84d65 100644
--- a/drivers/dma/mxs-dma.c
+++ b/drivers/dma/mxs-dma.c
@@ -531,7 +531,7 @@ err_out:
531static struct dma_async_tx_descriptor *mxs_dma_prep_dma_cyclic( 531static struct dma_async_tx_descriptor *mxs_dma_prep_dma_cyclic(
532 struct dma_chan *chan, dma_addr_t dma_addr, size_t buf_len, 532 struct dma_chan *chan, dma_addr_t dma_addr, size_t buf_len,
533 size_t period_len, enum dma_transfer_direction direction, 533 size_t period_len, enum dma_transfer_direction direction,
534 void *context) 534 unsigned long flags, void *context)
535{ 535{
536 struct mxs_dma_chan *mxs_chan = to_mxs_dma_chan(chan); 536 struct mxs_dma_chan *mxs_chan = to_mxs_dma_chan(chan);
537 struct mxs_dma_engine *mxs_dma = mxs_chan->mxs_dma; 537 struct mxs_dma_engine *mxs_dma = mxs_chan->mxs_dma;
diff --git a/drivers/dma/omap-dma.c b/drivers/dma/omap-dma.c
index 2e1662777661..bb2d8e7029eb 100644
--- a/drivers/dma/omap-dma.c
+++ b/drivers/dma/omap-dma.c
@@ -36,6 +36,7 @@ struct omap_chan {
36 struct dma_slave_config cfg; 36 struct dma_slave_config cfg;
37 unsigned dma_sig; 37 unsigned dma_sig;
38 bool cyclic; 38 bool cyclic;
39 bool paused;
39 40
40 int dma_ch; 41 int dma_ch;
41 struct omap_desc *desc; 42 struct omap_desc *desc;
@@ -367,7 +368,8 @@ static struct dma_async_tx_descriptor *omap_dma_prep_slave_sg(
367 368
368static struct dma_async_tx_descriptor *omap_dma_prep_dma_cyclic( 369static struct dma_async_tx_descriptor *omap_dma_prep_dma_cyclic(
369 struct dma_chan *chan, dma_addr_t buf_addr, size_t buf_len, 370 struct dma_chan *chan, dma_addr_t buf_addr, size_t buf_len,
370 size_t period_len, enum dma_transfer_direction dir, void *context) 371 size_t period_len, enum dma_transfer_direction dir, unsigned long flags,
372 void *context)
371{ 373{
372 struct omap_chan *c = to_omap_dma_chan(chan); 374 struct omap_chan *c = to_omap_dma_chan(chan);
373 enum dma_slave_buswidth dev_width; 375 enum dma_slave_buswidth dev_width;
@@ -415,7 +417,10 @@ static struct dma_async_tx_descriptor *omap_dma_prep_dma_cyclic(
415 d->dev_addr = dev_addr; 417 d->dev_addr = dev_addr;
416 d->fi = burst; 418 d->fi = burst;
417 d->es = es; 419 d->es = es;
418 d->sync_mode = OMAP_DMA_SYNC_PACKET; 420 if (burst)
421 d->sync_mode = OMAP_DMA_SYNC_PACKET;
422 else
423 d->sync_mode = OMAP_DMA_SYNC_ELEMENT;
419 d->sync_type = sync_type; 424 d->sync_type = sync_type;
420 d->periph_port = OMAP_DMA_PORT_MPUI; 425 d->periph_port = OMAP_DMA_PORT_MPUI;
421 d->sg[0].addr = buf_addr; 426 d->sg[0].addr = buf_addr;
@@ -426,7 +431,10 @@ static struct dma_async_tx_descriptor *omap_dma_prep_dma_cyclic(
426 if (!c->cyclic) { 431 if (!c->cyclic) {
427 c->cyclic = true; 432 c->cyclic = true;
428 omap_dma_link_lch(c->dma_ch, c->dma_ch); 433 omap_dma_link_lch(c->dma_ch, c->dma_ch);
429 omap_enable_dma_irq(c->dma_ch, OMAP_DMA_FRAME_IRQ); 434
435 if (flags & DMA_PREP_INTERRUPT)
436 omap_enable_dma_irq(c->dma_ch, OMAP_DMA_FRAME_IRQ);
437
430 omap_disable_dma_irq(c->dma_ch, OMAP_DMA_BLOCK_IRQ); 438 omap_disable_dma_irq(c->dma_ch, OMAP_DMA_BLOCK_IRQ);
431 } 439 }
432 440
@@ -435,7 +443,7 @@ static struct dma_async_tx_descriptor *omap_dma_prep_dma_cyclic(
435 omap_set_dma_dest_burst_mode(c->dma_ch, OMAP_DMA_DATA_BURST_16); 443 omap_set_dma_dest_burst_mode(c->dma_ch, OMAP_DMA_DATA_BURST_16);
436 } 444 }
437 445
438 return vchan_tx_prep(&c->vc, &d->vd, DMA_CTRL_ACK | DMA_PREP_INTERRUPT); 446 return vchan_tx_prep(&c->vc, &d->vd, flags);
439} 447}
440 448
441static int omap_dma_slave_config(struct omap_chan *c, struct dma_slave_config *cfg) 449static int omap_dma_slave_config(struct omap_chan *c, struct dma_slave_config *cfg)
@@ -469,11 +477,14 @@ static int omap_dma_terminate_all(struct omap_chan *c)
469 */ 477 */
470 if (c->desc) { 478 if (c->desc) {
471 c->desc = NULL; 479 c->desc = NULL;
472 omap_stop_dma(c->dma_ch); 480 /* Avoid stopping the dma twice */
481 if (!c->paused)
482 omap_stop_dma(c->dma_ch);
473 } 483 }
474 484
475 if (c->cyclic) { 485 if (c->cyclic) {
476 c->cyclic = false; 486 c->cyclic = false;
487 c->paused = false;
477 omap_dma_unlink_lch(c->dma_ch, c->dma_ch); 488 omap_dma_unlink_lch(c->dma_ch, c->dma_ch);
478 } 489 }
479 490
@@ -486,14 +497,30 @@ static int omap_dma_terminate_all(struct omap_chan *c)
486 497
487static int omap_dma_pause(struct omap_chan *c) 498static int omap_dma_pause(struct omap_chan *c)
488{ 499{
489 /* FIXME: not supported by platform private API */ 500 /* Pause/Resume only allowed with cyclic mode */
490 return -EINVAL; 501 if (!c->cyclic)
502 return -EINVAL;
503
504 if (!c->paused) {
505 omap_stop_dma(c->dma_ch);
506 c->paused = true;
507 }
508
509 return 0;
491} 510}
492 511
493static int omap_dma_resume(struct omap_chan *c) 512static int omap_dma_resume(struct omap_chan *c)
494{ 513{
495 /* FIXME: not supported by platform private API */ 514 /* Pause/Resume only allowed with cyclic mode */
496 return -EINVAL; 515 if (!c->cyclic)
516 return -EINVAL;
517
518 if (c->paused) {
519 omap_start_dma(c->dma_ch);
520 c->paused = false;
521 }
522
523 return 0;
497} 524}
498 525
499static int omap_dma_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd, 526static int omap_dma_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd,
diff --git a/drivers/dma/pl330.c b/drivers/dma/pl330.c
index 5d3bbcd279b4..169c0dbd71ae 100644
--- a/drivers/dma/pl330.c
+++ b/drivers/dma/pl330.c
@@ -2685,7 +2685,7 @@ static inline int get_burst_len(struct dma_pl330_desc *desc, size_t len)
2685static struct dma_async_tx_descriptor *pl330_prep_dma_cyclic( 2685static struct dma_async_tx_descriptor *pl330_prep_dma_cyclic(
2686 struct dma_chan *chan, dma_addr_t dma_addr, size_t len, 2686 struct dma_chan *chan, dma_addr_t dma_addr, size_t len,
2687 size_t period_len, enum dma_transfer_direction direction, 2687 size_t period_len, enum dma_transfer_direction direction,
2688 void *context) 2688 unsigned long flags, void *context)
2689{ 2689{
2690 struct dma_pl330_desc *desc; 2690 struct dma_pl330_desc *desc;
2691 struct dma_pl330_chan *pch = to_pchan(chan); 2691 struct dma_pl330_chan *pch = to_pchan(chan);
diff --git a/drivers/dma/sa11x0-dma.c b/drivers/dma/sa11x0-dma.c
index f5a73606217e..b893159c1ecb 100644
--- a/drivers/dma/sa11x0-dma.c
+++ b/drivers/dma/sa11x0-dma.c
@@ -614,7 +614,7 @@ static struct dma_async_tx_descriptor *sa11x0_dma_prep_slave_sg(
614 614
615static struct dma_async_tx_descriptor *sa11x0_dma_prep_dma_cyclic( 615static struct dma_async_tx_descriptor *sa11x0_dma_prep_dma_cyclic(
616 struct dma_chan *chan, dma_addr_t addr, size_t size, size_t period, 616 struct dma_chan *chan, dma_addr_t addr, size_t size, size_t period,
617 enum dma_transfer_direction dir, void *context) 617 enum dma_transfer_direction dir, unsigned long flags, void *context)
618{ 618{
619 struct sa11x0_dma_chan *c = to_sa11x0_dma_chan(chan); 619 struct sa11x0_dma_chan *c = to_sa11x0_dma_chan(chan);
620 struct sa11x0_dma_desc *txd; 620 struct sa11x0_dma_desc *txd;
diff --git a/drivers/dma/sirf-dma.c b/drivers/dma/sirf-dma.c
index 434ad31174f2..3eed8b35b0f1 100644
--- a/drivers/dma/sirf-dma.c
+++ b/drivers/dma/sirf-dma.c
@@ -489,7 +489,7 @@ err_dir:
489static struct dma_async_tx_descriptor * 489static struct dma_async_tx_descriptor *
490sirfsoc_dma_prep_cyclic(struct dma_chan *chan, dma_addr_t addr, 490sirfsoc_dma_prep_cyclic(struct dma_chan *chan, dma_addr_t addr,
491 size_t buf_len, size_t period_len, 491 size_t buf_len, size_t period_len,
492 enum dma_transfer_direction direction, void *context) 492 enum dma_transfer_direction direction, unsigned long flags, void *context)
493{ 493{
494 struct sirfsoc_dma_chan *schan = dma_chan_to_sirfsoc_dma_chan(chan); 494 struct sirfsoc_dma_chan *schan = dma_chan_to_sirfsoc_dma_chan(chan);
495 struct sirfsoc_dma_desc *sdesc = NULL; 495 struct sirfsoc_dma_desc *sdesc = NULL;
diff --git a/drivers/dma/ste_dma40.c b/drivers/dma/ste_dma40.c
index 000d309602b2..eee8d9b9a20b 100644
--- a/drivers/dma/ste_dma40.c
+++ b/drivers/dma/ste_dma40.c
@@ -2347,7 +2347,8 @@ static struct dma_async_tx_descriptor *d40_prep_slave_sg(struct dma_chan *chan,
2347static struct dma_async_tx_descriptor * 2347static struct dma_async_tx_descriptor *
2348dma40_prep_dma_cyclic(struct dma_chan *chan, dma_addr_t dma_addr, 2348dma40_prep_dma_cyclic(struct dma_chan *chan, dma_addr_t dma_addr,
2349 size_t buf_len, size_t period_len, 2349 size_t buf_len, size_t period_len,
2350 enum dma_transfer_direction direction, void *context) 2350 enum dma_transfer_direction direction, unsigned long flags,
2351 void *context)
2351{ 2352{
2352 unsigned int periods = buf_len / period_len; 2353 unsigned int periods = buf_len / period_len;
2353 struct dma_async_tx_descriptor *txd; 2354 struct dma_async_tx_descriptor *txd;
diff --git a/drivers/dma/tegra20-apb-dma.c b/drivers/dma/tegra20-apb-dma.c
index 4708467e4d83..45fbeed1c1a5 100644
--- a/drivers/dma/tegra20-apb-dma.c
+++ b/drivers/dma/tegra20-apb-dma.c
@@ -990,7 +990,7 @@ static struct dma_async_tx_descriptor *tegra_dma_prep_slave_sg(
990struct dma_async_tx_descriptor *tegra_dma_prep_dma_cyclic( 990struct dma_async_tx_descriptor *tegra_dma_prep_dma_cyclic(
991 struct dma_chan *dc, dma_addr_t buf_addr, size_t buf_len, 991 struct dma_chan *dc, dma_addr_t buf_addr, size_t buf_len,
992 size_t period_len, enum dma_transfer_direction direction, 992 size_t period_len, enum dma_transfer_direction direction,
993 void *context) 993 unsigned long flags, void *context)
994{ 994{
995 struct tegra_dma_channel *tdc = to_tegra_dma_chan(dc); 995 struct tegra_dma_channel *tdc = to_tegra_dma_chan(dc);
996 struct tegra_dma_desc *dma_desc = NULL; 996 struct tegra_dma_desc *dma_desc = NULL;