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 |