xref: /linux/arch/m68k/kernel/dma.c (revision c532de5a67a70f8533d495f8f2aaa9a0491c3ad0)
1 /*
2  * This file is subject to the terms and conditions of the GNU General Public
3  * License.  See the file COPYING in the main directory of this archive
4  * for more details.
5  */
6 
7 #include <linux/dma-map-ops.h>
8 #include <linux/kernel.h>
9 #include <asm/cacheflush.h>
10 
11 #ifndef CONFIG_COLDFIRE
12 void arch_dma_prep_coherent(struct page *page, size_t size)
13 {
14 	cache_push(page_to_phys(page), size);
15 }
16 
17 pgprot_t pgprot_dmacoherent(pgprot_t prot)
18 {
19 	if (CPU_IS_040_OR_060) {
20 		pgprot_val(prot) &= ~_PAGE_CACHE040;
21 		pgprot_val(prot) |= _PAGE_GLOBAL040 | _PAGE_NOCACHE_S;
22 	} else {
23 		pgprot_val(prot) |= _PAGE_NOCACHE030;
24 	}
25 	return prot;
26 }
27 #endif /* CONFIG_MMU && !CONFIG_COLDFIRE */
28 
29 void arch_sync_dma_for_device(phys_addr_t handle, size_t size,
30 		enum dma_data_direction dir)
31 {
32 	switch (dir) {
33 	case DMA_BIDIRECTIONAL:
34 	case DMA_TO_DEVICE:
35 		cache_push(handle, size);
36 		break;
37 	case DMA_FROM_DEVICE:
38 		cache_clear(handle, size);
39 		break;
40 	default:
41 		pr_err_ratelimited("dma_sync_single_for_device: unsupported dir %u\n",
42 				   dir);
43 		break;
44 	}
45 }
46