diff options
Diffstat (limited to 'include/dma.h')
-rw-r--r-- | include/dma.h | 83 |
1 files changed, 54 insertions, 29 deletions
diff --git a/include/dma.h b/include/dma.h index 26c71d812e..4fcd114bb6 100644 --- a/include/dma.h +++ b/include/dma.h @@ -8,11 +8,12 @@ #include <malloc.h> #include <xfuncs.h> -#include <linux/kernel.h> +#include <linux/align.h> #include <dma-dir.h> #include <asm/dma.h> -#include <driver.h> +#include <asm/io.h> +#include <device.h> #define DMA_ADDRESS_BROKEN NULL @@ -20,24 +21,25 @@ #define DMA_ALIGNMENT 32 #endif -#ifndef dma_alloc +#ifdef CONFIG_HAS_DMA +void *dma_alloc(size_t size); +void *dma_zalloc(size_t size); +#else static inline void *dma_alloc(size_t size) { - return xmemalign(DMA_ALIGNMENT, ALIGN(size, DMA_ALIGNMENT)); + return malloc(size); +} + +static inline void *dma_zalloc(size_t size) +{ + return calloc(size, 1); } #endif -#ifndef dma_free static inline void dma_free(void *mem) { free(mem); } -#endif - -dma_addr_t dma_map_single(struct device *dev, void *ptr, size_t size, - enum dma_data_direction dir); -void dma_unmap_single(struct device *dev, dma_addr_t addr, size_t size, - enum dma_data_direction dir); #define DMA_BIT_MASK(n) (((n) == 64) ? ~0ULL : ((1ULL<<(n))-1)) @@ -56,38 +58,61 @@ static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) (dev->dma_mask && dma_addr > dev->dma_mask); } -#ifndef __PBL__ -/* streaming DMA - implement the below calls to support HAS_DMA */ -#ifndef dma_sync_single_for_cpu -void dma_sync_single_for_cpu(dma_addr_t address, size_t size, - enum dma_data_direction dir); +static inline dma_addr_t cpu_to_dma(struct device *dev, void *cpu_addr) +{ + if (dev && dev->dma_offset) + return (unsigned long)cpu_addr - dev->dma_offset; + + return virt_to_phys(cpu_addr); +} + +static inline void *dma_to_cpu(struct device *dev, dma_addr_t addr) +{ + if (dev && dev->dma_offset) + return (void *)(addr + dev->dma_offset); + + return phys_to_virt(addr); +} + +#ifndef arch_sync_dma_for_cpu +void arch_sync_dma_for_cpu(void *vaddr, size_t size, + enum dma_data_direction dir); #endif -#ifndef dma_sync_single_for_device -void dma_sync_single_for_device(dma_addr_t address, size_t size, - enum dma_data_direction dir); +#ifndef arch_sync_dma_for_device +void arch_sync_dma_for_device(void *vaddr, size_t size, + enum dma_data_direction dir); #endif + +#ifndef __PBL__ +void dma_sync_single_for_cpu(struct device *dev, dma_addr_t address, + size_t size, enum dma_data_direction dir); + +void dma_sync_single_for_device(struct device *dev, dma_addr_t address, + size_t size, enum dma_data_direction dir); #else -#ifndef dma_sync_single_for_cpu /* * assumes buffers are in coherent/uncached memory, e.g. because * MMU is only enabled in barebox_arm_entry which hasn't run yet. */ -static inline void dma_sync_single_for_cpu(dma_addr_t address, size_t size, - enum dma_data_direction dir) +static inline void dma_sync_single_for_cpu(struct device *dev, dma_addr_t address, + size_t size, enum dma_data_direction dir) { - barrier_data((void *)address); + barrier_data(address); } -#endif -#ifndef dma_sync_single_for_device -static inline void dma_sync_single_for_device(dma_addr_t address, size_t size, - enum dma_data_direction dir) +static inline void dma_sync_single_for_device(struct device *dev, dma_addr_t address, + size_t size, enum dma_data_direction dir) { - barrier_data((void *)address); + barrier_data(address); } #endif -#endif + +dma_addr_t dma_map_single(struct device *dev, void *ptr, + size_t size, enum dma_data_direction dir); + +void dma_unmap_single(struct device *dev, dma_addr_t dma_addr, + size_t size, enum dma_data_direction dir); #ifndef dma_alloc_coherent void *dma_alloc_coherent(size_t size, dma_addr_t *dma_handle); |