aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2018-06-20 04:19:45 -0400
committerGeert Uytterhoeven <geert@linux-m68k.org>2018-07-23 09:07:12 -0400
commit9eb8be602bf8d550a33b4e1f9fac543bd5c89f4d (patch)
treee93f1d02f41d47e11a152e65139aa02214b53ae5
parenta8c5cb994341d4af6d75286fcb66684e53295135 (diff)
m68k: Use generic dma_noncoherent_ops
Switch to the generic noncoherent direct mapping implementation. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Greg Ungerer <gerg@linux-m68k.org> Tested-by: Greg Ungerer <gerg@linux-m68k.org> Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
-rw-r--r--arch/m68k/Kconfig2
-rw-r--r--arch/m68k/include/asm/Kbuild1
-rw-r--r--arch/m68k/include/asm/dma-mapping.h12
-rw-r--r--arch/m68k/kernel/dma.c68
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 @@
2config M68K 2config 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
28config CPU_BIG_ENDIAN 30config 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 @@
1generic-y += barrier.h 1generic-y += barrier.h
2generic-y += compat.h 2generic-y += compat.h
3generic-y += device.h 3generic-y += device.h
4generic-y += dma-mapping.h
4generic-y += emergency-restart.h 5generic-y += emergency-restart.h
5generic-y += exec.h 6generic-y += exec.h
6generic-y += extable.h 7generic-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
5extern const struct dma_map_ops m68k_dma_ops;
6
7static 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
22static void *m68k_dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, 22void *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
65static void m68k_dma_free(struct device *dev, size_t size, void *addr, 65void 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
76static void *m68k_dma_alloc(struct device *dev, size_t size, 76void *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
92static void m68k_dma_free(struct device *dev, size_t size, void *vaddr, 92void 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
100static void m68k_dma_sync_single_for_device(struct device *dev, 100void 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
118static 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
130static 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
142static 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
160const 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};
168EXPORT_SYMBOL(m68k_dma_ops);
169
170void arch_setup_pdev_archdata(struct platform_device *pdev) 118void 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 &&