diff options
-rw-r--r-- | arch/m68k/Kconfig | 2 | ||||
-rw-r--r-- | arch/m68k/include/asm/Kbuild | 1 | ||||
-rw-r--r-- | arch/m68k/include/asm/dma-mapping.h | 12 | ||||
-rw-r--r-- | arch/m68k/kernel/dma.c | 68 |
4 files changed, 11 insertions, 72 deletions
diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig index 785612b576f7..3f61327da2d5 100644 --- a/arch/m68k/Kconfig +++ b/arch/m68k/Kconfig | |||
@@ -2,6 +2,7 @@ | |||
2 | config M68K | 2 | config M68K |
3 | bool | 3 | bool |
4 | default y | 4 | default y |
5 | select ARCH_HAS_SYNC_DMA_FOR_DEVICE if HAS_DMA | ||
5 | select ARCH_MIGHT_HAVE_PC_PARPORT if ISA | 6 | select ARCH_MIGHT_HAVE_PC_PARPORT if ISA |
6 | select ARCH_NO_COHERENT_DMA_MMAP if !MMU | 7 | select ARCH_NO_COHERENT_DMA_MMAP if !MMU |
7 | select HAVE_IDE | 8 | select HAVE_IDE |
@@ -24,6 +25,7 @@ config M68K | |||
24 | select MODULES_USE_ELF_RELA | 25 | select MODULES_USE_ELF_RELA |
25 | select OLD_SIGSUSPEND3 | 26 | select OLD_SIGSUSPEND3 |
26 | select OLD_SIGACTION | 27 | select OLD_SIGACTION |
28 | select DMA_NONCOHERENT_OPS if HAS_DMA | ||
27 | 29 | ||
28 | config CPU_BIG_ENDIAN | 30 | config CPU_BIG_ENDIAN |
29 | def_bool y | 31 | def_bool y |
diff --git a/arch/m68k/include/asm/Kbuild b/arch/m68k/include/asm/Kbuild index 4d8d68c4e3dd..a4b8d3331a9e 100644 --- a/arch/m68k/include/asm/Kbuild +++ b/arch/m68k/include/asm/Kbuild | |||
@@ -1,6 +1,7 @@ | |||
1 | generic-y += barrier.h | 1 | generic-y += barrier.h |
2 | generic-y += compat.h | 2 | generic-y += compat.h |
3 | generic-y += device.h | 3 | generic-y += device.h |
4 | generic-y += dma-mapping.h | ||
4 | generic-y += emergency-restart.h | 5 | generic-y += emergency-restart.h |
5 | generic-y += exec.h | 6 | generic-y += exec.h |
6 | generic-y += extable.h | 7 | generic-y += extable.h |
diff --git a/arch/m68k/include/asm/dma-mapping.h b/arch/m68k/include/asm/dma-mapping.h deleted file mode 100644 index e3722ed04fbb..000000000000 --- a/arch/m68k/include/asm/dma-mapping.h +++ /dev/null | |||
@@ -1,12 +0,0 @@ | |||
1 | /* SPDX-License-Identifier: GPL-2.0 */ | ||
2 | #ifndef _M68K_DMA_MAPPING_H | ||
3 | #define _M68K_DMA_MAPPING_H | ||
4 | |||
5 | extern const struct dma_map_ops m68k_dma_ops; | ||
6 | |||
7 | static inline const struct dma_map_ops *get_arch_dma_ops(struct bus_type *bus) | ||
8 | { | ||
9 | return &m68k_dma_ops; | ||
10 | } | ||
11 | |||
12 | #endif /* _M68K_DMA_MAPPING_H */ | ||
diff --git a/arch/m68k/kernel/dma.c b/arch/m68k/kernel/dma.c index 463572c4943f..e99993c57d6b 100644 --- a/arch/m68k/kernel/dma.c +++ b/arch/m68k/kernel/dma.c | |||
@@ -6,7 +6,7 @@ | |||
6 | 6 | ||
7 | #undef DEBUG | 7 | #undef DEBUG |
8 | 8 | ||
9 | #include <linux/dma-mapping.h> | 9 | #include <linux/dma-noncoherent.h> |
10 | #include <linux/device.h> | 10 | #include <linux/device.h> |
11 | #include <linux/kernel.h> | 11 | #include <linux/kernel.h> |
12 | #include <linux/platform_device.h> | 12 | #include <linux/platform_device.h> |
@@ -19,7 +19,7 @@ | |||
19 | 19 | ||
20 | #if defined(CONFIG_MMU) && !defined(CONFIG_COLDFIRE) | 20 | #if defined(CONFIG_MMU) && !defined(CONFIG_COLDFIRE) |
21 | 21 | ||
22 | static void *m68k_dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, | 22 | void *arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, |
23 | gfp_t flag, unsigned long attrs) | 23 | gfp_t flag, unsigned long attrs) |
24 | { | 24 | { |
25 | struct page *page, **map; | 25 | struct page *page, **map; |
@@ -62,7 +62,7 @@ static void *m68k_dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, | |||
62 | return addr; | 62 | return addr; |
63 | } | 63 | } |
64 | 64 | ||
65 | static void m68k_dma_free(struct device *dev, size_t size, void *addr, | 65 | void arch_dma_free(struct device *dev, size_t size, void *addr, |
66 | dma_addr_t handle, unsigned long attrs) | 66 | dma_addr_t handle, unsigned long attrs) |
67 | { | 67 | { |
68 | pr_debug("dma_free_coherent: %p, %x\n", addr, handle); | 68 | pr_debug("dma_free_coherent: %p, %x\n", addr, handle); |
@@ -73,8 +73,8 @@ static void m68k_dma_free(struct device *dev, size_t size, void *addr, | |||
73 | 73 | ||
74 | #include <asm/cacheflush.h> | 74 | #include <asm/cacheflush.h> |
75 | 75 | ||
76 | static void *m68k_dma_alloc(struct device *dev, size_t size, | 76 | void *arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *dma_handle, |
77 | dma_addr_t *dma_handle, gfp_t gfp, unsigned long attrs) | 77 | gfp_t gfp, unsigned long attrs) |
78 | { | 78 | { |
79 | void *ret; | 79 | void *ret; |
80 | 80 | ||
@@ -89,7 +89,7 @@ static void *m68k_dma_alloc(struct device *dev, size_t size, | |||
89 | return ret; | 89 | return ret; |
90 | } | 90 | } |
91 | 91 | ||
92 | static void m68k_dma_free(struct device *dev, size_t size, void *vaddr, | 92 | void arch_dma_free(struct device *dev, size_t size, void *vaddr, |
93 | dma_addr_t dma_handle, unsigned long attrs) | 93 | dma_addr_t dma_handle, unsigned long attrs) |
94 | { | 94 | { |
95 | free_pages((unsigned long)vaddr, get_order(size)); | 95 | free_pages((unsigned long)vaddr, get_order(size)); |
@@ -97,8 +97,8 @@ static void m68k_dma_free(struct device *dev, size_t size, void *vaddr, | |||
97 | 97 | ||
98 | #endif /* CONFIG_MMU && !CONFIG_COLDFIRE */ | 98 | #endif /* CONFIG_MMU && !CONFIG_COLDFIRE */ |
99 | 99 | ||
100 | static void m68k_dma_sync_single_for_device(struct device *dev, | 100 | void arch_sync_dma_for_device(struct device *dev, phys_addr_t handle, |
101 | dma_addr_t handle, size_t size, enum dma_data_direction dir) | 101 | size_t size, enum dma_data_direction dir) |
102 | { | 102 | { |
103 | switch (dir) { | 103 | switch (dir) { |
104 | case DMA_BIDIRECTIONAL: | 104 | case DMA_BIDIRECTIONAL: |
@@ -115,58 +115,6 @@ static void m68k_dma_sync_single_for_device(struct device *dev, | |||
115 | } | 115 | } |
116 | } | 116 | } |
117 | 117 | ||
118 | static void m68k_dma_sync_sg_for_device(struct device *dev, | ||
119 | struct scatterlist *sglist, int nents, enum dma_data_direction dir) | ||
120 | { | ||
121 | int i; | ||
122 | struct scatterlist *sg; | ||
123 | |||
124 | for_each_sg(sglist, sg, nents, i) { | ||
125 | dma_sync_single_for_device(dev, sg->dma_address, sg->length, | ||
126 | dir); | ||
127 | } | ||
128 | } | ||
129 | |||
130 | static dma_addr_t m68k_dma_map_page(struct device *dev, struct page *page, | ||
131 | unsigned long offset, size_t size, enum dma_data_direction dir, | ||
132 | unsigned long attrs) | ||
133 | { | ||
134 | dma_addr_t handle = page_to_phys(page) + offset; | ||
135 | |||
136 | if (!(attrs & DMA_ATTR_SKIP_CPU_SYNC)) | ||
137 | dma_sync_single_for_device(dev, handle, size, dir); | ||
138 | |||
139 | return handle; | ||
140 | } | ||
141 | |||
142 | static int m68k_dma_map_sg(struct device *dev, struct scatterlist *sglist, | ||
143 | int nents, enum dma_data_direction dir, unsigned long attrs) | ||
144 | { | ||
145 | int i; | ||
146 | struct scatterlist *sg; | ||
147 | |||
148 | for_each_sg(sglist, sg, nents, i) { | ||
149 | sg->dma_address = sg_phys(sg); | ||
150 | |||
151 | if (attrs & DMA_ATTR_SKIP_CPU_SYNC) | ||
152 | continue; | ||
153 | |||
154 | dma_sync_single_for_device(dev, sg->dma_address, sg->length, | ||
155 | dir); | ||
156 | } | ||
157 | return nents; | ||
158 | } | ||
159 | |||
160 | const struct dma_map_ops m68k_dma_ops = { | ||
161 | .alloc = m68k_dma_alloc, | ||
162 | .free = m68k_dma_free, | ||
163 | .map_page = m68k_dma_map_page, | ||
164 | .map_sg = m68k_dma_map_sg, | ||
165 | .sync_single_for_device = m68k_dma_sync_single_for_device, | ||
166 | .sync_sg_for_device = m68k_dma_sync_sg_for_device, | ||
167 | }; | ||
168 | EXPORT_SYMBOL(m68k_dma_ops); | ||
169 | |||
170 | void arch_setup_pdev_archdata(struct platform_device *pdev) | 118 | void arch_setup_pdev_archdata(struct platform_device *pdev) |
171 | { | 119 | { |
172 | if (pdev->dev.coherent_dma_mask == DMA_MASK_NONE && | 120 | if (pdev->dev.coherent_dma_mask == DMA_MASK_NONE && |