diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/m68knommu/Kconfig | 1 | ||||
-rw-r--r-- | arch/m68knommu/kernel/dma.c | 37 |
2 files changed, 35 insertions, 3 deletions
diff --git a/arch/m68knommu/Kconfig b/arch/m68knommu/Kconfig index 4beb59dfc6ec..534376299a99 100644 --- a/arch/m68knommu/Kconfig +++ b/arch/m68knommu/Kconfig | |||
@@ -16,6 +16,7 @@ config MMU | |||
16 | 16 | ||
17 | config NO_DMA | 17 | config NO_DMA |
18 | bool | 18 | bool |
19 | depends on !COLDFIRE | ||
19 | default y | 20 | default y |
20 | 21 | ||
21 | config FPU | 22 | config FPU |
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 | ||
15 | void *dma_alloc_coherent(struct device *dev, size_t size, | 14 | void *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 | ||
39 | void dma_sync_single_for_cpu(struct device *dev, dma_addr_t handle, size_t size, enum dma_data_direction dir) | 38 | void 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 | |||
55 | EXPORT_SYMBOL(dma_sync_single_for_device); | ||
56 | dma_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 | } |
63 | EXPORT_SYMBOL(dma_map_single); | ||
42 | 64 | ||
65 | dma_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 | } | ||
73 | EXPORT_SYMBOL(dma_map_page); | ||