diff options
author | Russell King <rmk+kernel@arm.linux.org.uk> | 2009-11-19 10:54:45 -0500 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2009-11-24 12:41:34 -0500 |
commit | 04da56943b416dd9fe7058abf8d5b9153164b3e9 (patch) | |
tree | 24541a1e46b9f660d3b33845d1e31b0d0c4918d0 /arch/arm/mm/dma-mapping.c | |
parent | 3e82d012e9281a0b6388ff2356e8396b9d781e1c (diff) |
ARM: dma-mapping: fix nommu dma_alloc_coherent()
The nommu version of dma_alloc_coherent was using kmalloc/kfree to manage
the memory. dma_alloc_coherent() is expected to work with a granularity
of a page, so this is wrong. Fix it by using the helper functions now
provided.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Acked-by: Greg Ungerer <gerg@uclinux.org>
Diffstat (limited to 'arch/arm/mm/dma-mapping.c')
-rw-r--r-- | arch/arm/mm/dma-mapping.c | 25 |
1 files changed, 9 insertions, 16 deletions
diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index a67130873431..62b4240b34b3 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c | |||
@@ -212,24 +212,17 @@ static void * | |||
212 | __dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp, | 212 | __dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp, |
213 | pgprot_t prot) | 213 | pgprot_t prot) |
214 | { | 214 | { |
215 | void *virt; | 215 | struct page *page; |
216 | u64 mask = get_coherent_dma_mask(dev); | ||
217 | |||
218 | if (!mask) | ||
219 | goto error; | ||
220 | 216 | ||
221 | if (mask < 0xffffffffULL) | 217 | *handle = ~0; |
222 | gfp |= GFP_DMA; | 218 | size = PAGE_ALIGN(size); |
223 | virt = kmalloc(size, gfp); | ||
224 | if (!virt) | ||
225 | goto error; | ||
226 | 219 | ||
227 | *handle = virt_to_dma(dev, virt); | 220 | page = __dma_alloc_buffer(dev, size, gfp); |
228 | return virt; | 221 | if (!page) |
222 | return NULL; | ||
229 | 223 | ||
230 | error: | 224 | *handle = page_to_dma(dev, page); |
231 | *handle = ~0; | 225 | return page_address(page); |
232 | return NULL; | ||
233 | } | 226 | } |
234 | #endif /* CONFIG_MMU */ | 227 | #endif /* CONFIG_MMU */ |
235 | 228 | ||
@@ -406,7 +399,7 @@ void dma_free_coherent(struct device *dev, size_t size, void *cpu_addr, dma_addr | |||
406 | { | 399 | { |
407 | if (dma_release_from_coherent(dev, get_order(size), cpu_addr)) | 400 | if (dma_release_from_coherent(dev, get_order(size), cpu_addr)) |
408 | return; | 401 | return; |
409 | kfree(cpu_addr); | 402 | __dma_free_buffer(dma_to_page(dev, handle), PAGE_ALIGN(size)); |
410 | } | 403 | } |
411 | #endif /* CONFIG_MMU */ | 404 | #endif /* CONFIG_MMU */ |
412 | EXPORT_SYMBOL(dma_free_coherent); | 405 | EXPORT_SYMBOL(dma_free_coherent); |