blob: 1cde8275f4f905ee8a2c3eeadc3045a01850ae9a [file] [log] [blame]
Wolfgang Denk83c15852006-10-24 14:21:16 +02001/*
2 * Copyright (C) 2006 Atmel Corporation
3 *
Wolfgang Denkd79de1d2013-07-08 09:37:19 +02004 * SPDX-License-Identifier: GPL-2.0+
Wolfgang Denk83c15852006-10-24 14:21:16 +02005 */
6#ifndef __ASM_AVR32_DMA_MAPPING_H
7#define __ASM_AVR32_DMA_MAPPING_H
8
9#include <asm/io.h>
Olav Morkencbc6ce02009-01-23 12:56:27 +010010#include <asm/arch/cacheflush.h>
Wolfgang Denk83c15852006-10-24 14:21:16 +020011
12enum dma_data_direction {
13 DMA_BIDIRECTIONAL = 0,
14 DMA_TO_DEVICE = 1,
15 DMA_FROM_DEVICE = 2,
16};
Andreas Bießmannf9977202015-02-06 23:06:39 +010017
18static inline void *dma_alloc_coherent(size_t len, unsigned long *handle)
19{
20 *handle = (unsigned long)memalign(ARCH_DMA_MINALIGN, len);
21 return (void *)*handle;
22}
Wolfgang Denk83c15852006-10-24 14:21:16 +020023
24static inline unsigned long dma_map_single(volatile void *vaddr, size_t len,
25 enum dma_data_direction dir)
26{
27 extern void __bad_dma_data_direction(void);
28
29 switch (dir) {
30 case DMA_BIDIRECTIONAL:
Andreas Bießmannd1461212014-06-12 22:07:52 +020031 flush_dcache_range((unsigned long)vaddr,
32 (unsigned long)vaddr + len);
Wolfgang Denk83c15852006-10-24 14:21:16 +020033 break;
34 case DMA_TO_DEVICE:
35 dcache_clean_range(vaddr, len);
36 break;
37 case DMA_FROM_DEVICE:
Andreas Bießmannd1461212014-06-12 22:07:52 +020038 invalidate_dcache_range((unsigned long)vaddr,
39 (unsigned long)vaddr + len);
Wolfgang Denk83c15852006-10-24 14:21:16 +020040 break;
41 default:
42 /* This will cause a linker error */
43 __bad_dma_data_direction();
44 }
45
46 return virt_to_phys(vaddr);
47}
48
49static inline void dma_unmap_single(volatile void *vaddr, size_t len,
50 unsigned long paddr)
51{
52
53}
54
55#endif /* __ASM_AVR32_DMA_MAPPING_H */