aboutsummaryrefslogtreecommitdiffstats
path: root/arch/m68knommu/kernel/dma.c
diff options
context:
space:
mode:
authorGreg Ungerer <gerg@uclinux.org>2009-04-17 09:11:38 -0400
committerGreg Ungerer <gerg@uclinux.org>2009-04-22 00:45:08 -0400
commitec40f95db753d3bfdbcc43b1505ecf7980cb6492 (patch)
treecd0428f11e60ff188c41133a82a92ca4035752be /arch/m68knommu/kernel/dma.c
parent830c072b1ea0078396c42db120452fc36516ed1d (diff)
m68knommu: fix DMA support for ColdFire
ColdFire CPU family members support DMA (all those with the FEC ethernet core use it, the rest have dedicated DMA engines). The code support is just missing a handful of routines for it to be usable by drivers. Add the missing dma_ functions. Signed-off-by: Greg Ungerer <gerg@uclinux.org>
Diffstat (limited to 'arch/m68knommu/kernel/dma.c')
-rw-r--r--arch/m68knommu/kernel/dma.c37
1 files changed, 34 insertions, 3 deletions
diff --git a/arch/m68knommu/kernel/dma.c b/arch/m68knommu/kernel/dma.c
index 936125806638..aaf38bbbb6cd 100644
--- a/arch/m68knommu/kernel/dma.c
+++ b/arch/m68knommu/kernel/dma.c
@@ -7,10 +7,9 @@
7 7
8#include <linux/types.h> 8#include <linux/types.h>
9#include <linux/mm.h> 9#include <linux/mm.h>
10#include <linux/string.h>
11#include <linux/device.h> 10#include <linux/device.h>
12#include <linux/dma-mapping.h> 11#include <linux/dma-mapping.h>
13#include <asm/io.h> 12#include <asm/cacheflush.h>
14 13
15void *dma_alloc_coherent(struct device *dev, size_t size, 14void *dma_alloc_coherent(struct device *dev, size_t size,
16 dma_addr_t *dma_handle, gfp_t gfp) 15 dma_addr_t *dma_handle, gfp_t gfp)
@@ -36,7 +35,39 @@ void dma_free_coherent(struct device *dev, size_t size,
36 free_pages((unsigned long)vaddr, get_order(size)); 35 free_pages((unsigned long)vaddr, get_order(size));
37} 36}
38 37
39void dma_sync_single_for_cpu(struct device *dev, dma_addr_t handle, size_t size, enum dma_data_direction dir) 38void dma_sync_single_for_device(struct device *dev, dma_addr_t handle,
39 size_t size, enum dma_data_direction dir)
40{ 40{
41 switch (dir) {
42 case DMA_TO_DEVICE:
43 flush_dcache_range(handle, size);
44 break;
45 case DMA_FROM_DEVICE:
46 /* Should be clear already */
47 break;
48 default:
49 if (printk_ratelimit())
50 printk("dma_sync_single_for_device: unsupported dir %u\n", dir);
51 break;
52 }
53}
54
55EXPORT_SYMBOL(dma_sync_single_for_device);
56dma_addr_t dma_map_single(struct device *dev, void *addr, size_t size,
57 enum dma_data_direction dir)
58{
59 dma_addr_t handle = virt_to_phys(addr);
60 flush_dcache_range(handle, size);
61 return handle;
41} 62}
63EXPORT_SYMBOL(dma_map_single);
42 64
65dma_addr_t dma_map_page(struct device *dev, struct page *page,
66 unsigned long offset, size_t size,
67 enum dma_data_direction dir)
68{
69 dma_addr_t handle = page_to_phys(page) + offset;
70 dma_sync_single_for_device(dev, handle, size, dir);
71 return handle;
72}
73EXPORT_SYMBOL(dma_map_page);