aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/arm/common/dmabounce.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/arch/arm/common/dmabounce.c b/arch/arm/common/dmabounce.c
index 5797b1b100a1..39dd33ff6f37 100644
--- a/arch/arm/common/dmabounce.c
+++ b/arch/arm/common/dmabounce.c
@@ -302,12 +302,24 @@ unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,
302 302
303 DO_STATS ( device_info->bounce_count++ ); 303 DO_STATS ( device_info->bounce_count++ );
304 304
305 if ((dir == DMA_FROM_DEVICE) || 305 if (dir == DMA_FROM_DEVICE || dir == DMA_BIDIRECTIONAL) {
306 (dir == DMA_BIDIRECTIONAL)) { 306 unsigned long ptr;
307
307 dev_dbg(dev, 308 dev_dbg(dev,
308 "%s: copy back safe %p to unsafe %p size %d\n", 309 "%s: copy back safe %p to unsafe %p size %d\n",
309 __func__, buf->safe, buf->ptr, size); 310 __func__, buf->safe, buf->ptr, size);
310 memcpy(buf->ptr, buf->safe, size); 311 memcpy(buf->ptr, buf->safe, size);
312
313 /*
314 * DMA buffers must have the same cache properties
315 * as if they were really used for DMA - which means
316 * data must be written back to RAM. Note that
317 * we don't use dmac_flush_range() here for the
318 * bidirectional case because we know the cache
319 * lines will be coherent with the data written.
320 */
321 ptr = (unsigned long)buf->ptr;
322 dmac_clean_range(ptr, ptr + size);
311 } 323 }
312 free_safe_buffer(device_info, buf); 324 free_safe_buffer(device_info, buf);
313 } 325 }