diff options
Diffstat (limited to 'arch/arm/mm/consistent.c')
-rw-r--r-- | arch/arm/mm/consistent.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/arch/arm/mm/consistent.c b/arch/arm/mm/consistent.c index 8a1bfcd50087..50e6b6bfb2e2 100644 --- a/arch/arm/mm/consistent.c +++ b/arch/arm/mm/consistent.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <linux/device.h> | 18 | #include <linux/device.h> |
19 | #include <linux/dma-mapping.h> | 19 | #include <linux/dma-mapping.h> |
20 | 20 | ||
21 | #include <asm/memory.h> | ||
21 | #include <asm/cacheflush.h> | 22 | #include <asm/cacheflush.h> |
22 | #include <asm/tlbflush.h> | 23 | #include <asm/tlbflush.h> |
23 | #include <asm/sizes.h> | 24 | #include <asm/sizes.h> |
@@ -272,6 +273,17 @@ __dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp, | |||
272 | void * | 273 | void * |
273 | dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp) | 274 | dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp) |
274 | { | 275 | { |
276 | if (arch_is_coherent()) { | ||
277 | void *virt; | ||
278 | |||
279 | virt = kmalloc(size, gfp); | ||
280 | if (!virt) | ||
281 | return NULL; | ||
282 | *handle = virt_to_dma(dev, virt); | ||
283 | |||
284 | return virt; | ||
285 | } | ||
286 | |||
275 | return __dma_alloc(dev, size, handle, gfp, | 287 | return __dma_alloc(dev, size, handle, gfp, |
276 | pgprot_noncached(pgprot_kernel)); | 288 | pgprot_noncached(pgprot_kernel)); |
277 | } | 289 | } |
@@ -350,6 +362,11 @@ void dma_free_coherent(struct device *dev, size_t size, void *cpu_addr, dma_addr | |||
350 | 362 | ||
351 | WARN_ON(irqs_disabled()); | 363 | WARN_ON(irqs_disabled()); |
352 | 364 | ||
365 | if (arch_is_coherent()) { | ||
366 | kfree(cpu_addr); | ||
367 | return; | ||
368 | } | ||
369 | |||
353 | size = PAGE_ALIGN(size); | 370 | size = PAGE_ALIGN(size); |
354 | 371 | ||
355 | spin_lock_irqsave(&consistent_lock, flags); | 372 | spin_lock_irqsave(&consistent_lock, flags); |