diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/dma/at_hdmac.c | 3 | ||||
-rw-r--r-- | drivers/dma/ep93xx_dma.c | 4 | ||||
-rw-r--r-- | drivers/dma/imx-dma.c | 2 | ||||
-rw-r--r-- | drivers/dma/imx-sdma.c | 2 | ||||
-rw-r--r-- | drivers/dma/mmp_tdma.c | 2 | ||||
-rw-r--r-- | drivers/dma/mxs-dma.c | 2 | ||||
-rw-r--r-- | drivers/dma/omap-dma.c | 45 | ||||
-rw-r--r-- | drivers/dma/pl330.c | 2 | ||||
-rw-r--r-- | drivers/dma/sa11x0-dma.c | 2 | ||||
-rw-r--r-- | drivers/dma/sirf-dma.c | 2 | ||||
-rw-r--r-- | drivers/dma/ste_dma40.c | 3 | ||||
-rw-r--r-- | drivers/dma/tegra20-apb-dma.c | 2 |
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 | */ |
857 | static struct dma_async_tx_descriptor * | 858 | static struct dma_async_tx_descriptor * |
858 | atc_prep_dma_cyclic(struct dma_chan *chan, dma_addr_t buf_addr, size_t buf_len, | 859 | atc_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: | |||
1133 | static struct dma_async_tx_descriptor * | 1134 | static struct dma_async_tx_descriptor * |
1134 | ep93xx_dma_prep_dma_cyclic(struct dma_chan *chan, dma_addr_t dma_addr, | 1135 | ep93xx_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( | |||
801 | static struct dma_async_tx_descriptor *imxdma_prep_dma_cyclic( | 801 | static 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: | |||
1012 | static struct dma_async_tx_descriptor *sdma_prep_dma_cyclic( | 1012 | static 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) | |||
358 | static struct dma_async_tx_descriptor *mmp_tdma_prep_dma_cyclic( | 358 | static 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: | |||
531 | static struct dma_async_tx_descriptor *mxs_dma_prep_dma_cyclic( | 531 | static 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 | ||
368 | static struct dma_async_tx_descriptor *omap_dma_prep_dma_cyclic( | 369 | static 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 | ||
441 | static int omap_dma_slave_config(struct omap_chan *c, struct dma_slave_config *cfg) | 449 | static 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 | ||
487 | static int omap_dma_pause(struct omap_chan *c) | 498 | static 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 | ||
493 | static int omap_dma_resume(struct omap_chan *c) | 512 | static 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 | ||
499 | static int omap_dma_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd, | 526 | static 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) | |||
2685 | static struct dma_async_tx_descriptor *pl330_prep_dma_cyclic( | 2685 | static 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 | ||
615 | static struct dma_async_tx_descriptor *sa11x0_dma_prep_dma_cyclic( | 615 | static 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: | |||
489 | static struct dma_async_tx_descriptor * | 489 | static struct dma_async_tx_descriptor * |
490 | sirfsoc_dma_prep_cyclic(struct dma_chan *chan, dma_addr_t addr, | 490 | sirfsoc_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, | |||
2347 | static struct dma_async_tx_descriptor * | 2347 | static struct dma_async_tx_descriptor * |
2348 | dma40_prep_dma_cyclic(struct dma_chan *chan, dma_addr_t dma_addr, | 2348 | dma40_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( | |||
990 | struct dma_async_tx_descriptor *tegra_dma_prep_dma_cyclic( | 990 | struct 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; |