diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-11-20 16:20:24 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-11-20 16:20:24 -0500 |
commit | e6d69a60b77a6ea8d5f9d41765c7571bb8d45531 (patch) | |
tree | 4ea3fe7c49a864da2ce7ffb51a703661826dc15d /drivers/dma/amba-pl08x.c | |
parent | 5a1efc6e68a095917277459091fafba6a6baef17 (diff) | |
parent | df12a3178d340319b1955be6b973a4eb84aff754 (diff) |
Merge branch 'next' of git://git.infradead.org/users/vkoul/slave-dma
Pull slave-dmaengine changes from Vinod Koul:
"This brings for slave dmaengine:
- Change dma notification flag to DMA_COMPLETE from DMA_SUCCESS as
dmaengine can only transfer and not verify validaty of dma
transfers
- Bunch of fixes across drivers:
- cppi41 driver fixes from Daniel
- 8 channel freescale dma engine support and updated bindings from
Hongbo
- msx-dma fixes and cleanup by Markus
- DMAengine updates from Dan:
- Bartlomiej and Dan finalized a rework of the dma address unmap
implementation.
- In the course of testing 1/ a collection of enhancements to
dmatest fell out. Notably basic performance statistics, and
fixed / enhanced test control through new module parameters
'run', 'wait', 'noverify', and 'verbose'. Thanks to Andriy and
Linus [Walleij] for their review.
- Testing the raid related corner cases of 1/ triggered bugs in
the recently added 16-source operation support in the ioatdma
driver.
- Some minor fixes / cleanups to mv_xor and ioatdma"
* 'next' of git://git.infradead.org/users/vkoul/slave-dma: (99 commits)
dma: mv_xor: Fix mis-usage of mmio 'base' and 'high_base' registers
dma: mv_xor: Remove unneeded NULL address check
ioat: fix ioat3_irq_reinit
ioat: kill msix_single_vector support
raid6test: add new corner case for ioatdma driver
ioatdma: clean up sed pool kmem_cache
ioatdma: fix selection of 16 vs 8 source path
ioatdma: fix sed pool selection
ioatdma: Fix bug in selftest after removal of DMA_MEMSET.
dmatest: verbose mode
dmatest: convert to dmaengine_unmap_data
dmatest: add a 'wait' parameter
dmatest: add basic performance metrics
dmatest: add support for skipping verification and random data setup
dmatest: use pseudo random numbers
dmatest: support xor-only, or pq-only channels in tests
dmatest: restore ability to start test at module load and init
dmatest: cleanup redundant "dmatest: " prefixes
dmatest: replace stored results mechanism, with uniform messages
Revert "dmatest: append verify result to results"
...
Diffstat (limited to 'drivers/dma/amba-pl08x.c')
-rw-r--r-- | drivers/dma/amba-pl08x.c | 39 |
1 files changed, 4 insertions, 35 deletions
diff --git a/drivers/dma/amba-pl08x.c b/drivers/dma/amba-pl08x.c index e51a9832ef0d..16a2aa28f856 100644 --- a/drivers/dma/amba-pl08x.c +++ b/drivers/dma/amba-pl08x.c | |||
@@ -1164,42 +1164,12 @@ static void pl08x_free_txd(struct pl08x_driver_data *pl08x, | |||
1164 | kfree(txd); | 1164 | kfree(txd); |
1165 | } | 1165 | } |
1166 | 1166 | ||
1167 | static void pl08x_unmap_buffers(struct pl08x_txd *txd) | ||
1168 | { | ||
1169 | struct device *dev = txd->vd.tx.chan->device->dev; | ||
1170 | struct pl08x_sg *dsg; | ||
1171 | |||
1172 | if (!(txd->vd.tx.flags & DMA_COMPL_SKIP_SRC_UNMAP)) { | ||
1173 | if (txd->vd.tx.flags & DMA_COMPL_SRC_UNMAP_SINGLE) | ||
1174 | list_for_each_entry(dsg, &txd->dsg_list, node) | ||
1175 | dma_unmap_single(dev, dsg->src_addr, dsg->len, | ||
1176 | DMA_TO_DEVICE); | ||
1177 | else { | ||
1178 | list_for_each_entry(dsg, &txd->dsg_list, node) | ||
1179 | dma_unmap_page(dev, dsg->src_addr, dsg->len, | ||
1180 | DMA_TO_DEVICE); | ||
1181 | } | ||
1182 | } | ||
1183 | if (!(txd->vd.tx.flags & DMA_COMPL_SKIP_DEST_UNMAP)) { | ||
1184 | if (txd->vd.tx.flags & DMA_COMPL_DEST_UNMAP_SINGLE) | ||
1185 | list_for_each_entry(dsg, &txd->dsg_list, node) | ||
1186 | dma_unmap_single(dev, dsg->dst_addr, dsg->len, | ||
1187 | DMA_FROM_DEVICE); | ||
1188 | else | ||
1189 | list_for_each_entry(dsg, &txd->dsg_list, node) | ||
1190 | dma_unmap_page(dev, dsg->dst_addr, dsg->len, | ||
1191 | DMA_FROM_DEVICE); | ||
1192 | } | ||
1193 | } | ||
1194 | |||
1195 | static void pl08x_desc_free(struct virt_dma_desc *vd) | 1167 | static void pl08x_desc_free(struct virt_dma_desc *vd) |
1196 | { | 1168 | { |
1197 | struct pl08x_txd *txd = to_pl08x_txd(&vd->tx); | 1169 | struct pl08x_txd *txd = to_pl08x_txd(&vd->tx); |
1198 | struct pl08x_dma_chan *plchan = to_pl08x_chan(vd->tx.chan); | 1170 | struct pl08x_dma_chan *plchan = to_pl08x_chan(vd->tx.chan); |
1199 | 1171 | ||
1200 | if (!plchan->slave) | 1172 | dma_descriptor_unmap(txd); |
1201 | pl08x_unmap_buffers(txd); | ||
1202 | |||
1203 | if (!txd->done) | 1173 | if (!txd->done) |
1204 | pl08x_release_mux(plchan); | 1174 | pl08x_release_mux(plchan); |
1205 | 1175 | ||
@@ -1252,7 +1222,7 @@ static enum dma_status pl08x_dma_tx_status(struct dma_chan *chan, | |||
1252 | size_t bytes = 0; | 1222 | size_t bytes = 0; |
1253 | 1223 | ||
1254 | ret = dma_cookie_status(chan, cookie, txstate); | 1224 | ret = dma_cookie_status(chan, cookie, txstate); |
1255 | if (ret == DMA_SUCCESS) | 1225 | if (ret == DMA_COMPLETE) |
1256 | return ret; | 1226 | return ret; |
1257 | 1227 | ||
1258 | /* | 1228 | /* |
@@ -1267,7 +1237,7 @@ static enum dma_status pl08x_dma_tx_status(struct dma_chan *chan, | |||
1267 | 1237 | ||
1268 | spin_lock_irqsave(&plchan->vc.lock, flags); | 1238 | spin_lock_irqsave(&plchan->vc.lock, flags); |
1269 | ret = dma_cookie_status(chan, cookie, txstate); | 1239 | ret = dma_cookie_status(chan, cookie, txstate); |
1270 | if (ret != DMA_SUCCESS) { | 1240 | if (ret != DMA_COMPLETE) { |
1271 | vd = vchan_find_desc(&plchan->vc, cookie); | 1241 | vd = vchan_find_desc(&plchan->vc, cookie); |
1272 | if (vd) { | 1242 | if (vd) { |
1273 | /* On the issued list, so hasn't been processed yet */ | 1243 | /* On the issued list, so hasn't been processed yet */ |
@@ -2138,8 +2108,7 @@ static int pl08x_probe(struct amba_device *adev, const struct amba_id *id) | |||
2138 | writel(0x000000FF, pl08x->base + PL080_ERR_CLEAR); | 2108 | writel(0x000000FF, pl08x->base + PL080_ERR_CLEAR); |
2139 | writel(0x000000FF, pl08x->base + PL080_TC_CLEAR); | 2109 | writel(0x000000FF, pl08x->base + PL080_TC_CLEAR); |
2140 | 2110 | ||
2141 | ret = request_irq(adev->irq[0], pl08x_irq, IRQF_DISABLED, | 2111 | ret = request_irq(adev->irq[0], pl08x_irq, 0, DRIVER_NAME, pl08x); |
2142 | DRIVER_NAME, pl08x); | ||
2143 | if (ret) { | 2112 | if (ret) { |
2144 | dev_err(&adev->dev, "%s failed to request interrupt %d\n", | 2113 | dev_err(&adev->dev, "%s failed to request interrupt %d\n", |
2145 | __func__, adev->irq[0]); | 2114 | __func__, adev->irq[0]); |