diff options
| -rw-r--r-- | drivers/dma/sh/rcar-dmac.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/drivers/dma/sh/rcar-dmac.c b/drivers/dma/sh/rcar-dmac.c index bb93038c48b9..711da01a200b 100644 --- a/drivers/dma/sh/rcar-dmac.c +++ b/drivers/dma/sh/rcar-dmac.c | |||
| @@ -325,6 +325,8 @@ static void rcar_dmac_chan_start_xfer(struct rcar_dmac_chan *chan) | |||
| 325 | rcar_dmac_chan_write(chan, RCAR_DMARS, chan->mid_rid); | 325 | rcar_dmac_chan_write(chan, RCAR_DMARS, chan->mid_rid); |
| 326 | 326 | ||
| 327 | if (desc->hwdescs.use) { | 327 | if (desc->hwdescs.use) { |
| 328 | struct rcar_dmac_xfer_chunk *chunk; | ||
| 329 | |||
| 328 | dev_dbg(chan->chan.device->dev, | 330 | dev_dbg(chan->chan.device->dev, |
| 329 | "chan%u: queue desc %p: %u@%pad\n", | 331 | "chan%u: queue desc %p: %u@%pad\n", |
| 330 | chan->index, desc, desc->nchunks, &desc->hwdescs.dma); | 332 | chan->index, desc, desc->nchunks, &desc->hwdescs.dma); |
| @@ -341,6 +343,18 @@ static void rcar_dmac_chan_start_xfer(struct rcar_dmac_chan *chan) | |||
| 341 | RCAR_DMACHCRB_DRST); | 343 | RCAR_DMACHCRB_DRST); |
| 342 | 344 | ||
| 343 | /* | 345 | /* |
| 346 | * Errata: When descriptor memory is accessed through an IOMMU | ||
| 347 | * the DMADAR register isn't initialized automatically from the | ||
| 348 | * first descriptor at beginning of transfer by the DMAC like it | ||
| 349 | * should. Initialize it manually with the destination address | ||
| 350 | * of the first chunk. | ||
| 351 | */ | ||
| 352 | chunk = list_first_entry(&desc->chunks, | ||
| 353 | struct rcar_dmac_xfer_chunk, node); | ||
| 354 | rcar_dmac_chan_write(chan, RCAR_DMADAR, | ||
| 355 | chunk->dst_addr & 0xffffffff); | ||
| 356 | |||
| 357 | /* | ||
| 344 | * Program the descriptor stage interrupt to occur after the end | 358 | * Program the descriptor stage interrupt to occur after the end |
| 345 | * of the first stage. | 359 | * of the first stage. |
| 346 | */ | 360 | */ |
