Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 | /* * Copyright (C) 2007-2013 ST-Ericsson * License terms: GNU General Public License (GPL) version 2 * DMA driver for COH 901 318 * Author: Per Friden <per.friden@stericsson.com> */ #ifndef COH901318_H #define COH901318_H #define MAX_DMA_PACKET_SIZE_SHIFT 11 #define MAX_DMA_PACKET_SIZE (1 << MAX_DMA_PACKET_SIZE_SHIFT) struct device; struct coh901318_pool { spinlock_t lock; struct dma_pool *dmapool; struct device *dev; #ifdef CONFIG_DEBUG_FS int debugfs_pool_counter; #endif }; /** * struct coh901318_lli - linked list item for DMAC * @control: control settings for DMAC * @src_addr: transfer source address * @dst_addr: transfer destination address * @link_addr: physical address to next lli * @virt_link_addr: virtual address of next lli (only used by pool_free) * @phy_this: physical address of current lli (only used by pool_free) */ struct coh901318_lli { u32 control; dma_addr_t src_addr; dma_addr_t dst_addr; dma_addr_t link_addr; void *virt_link_addr; dma_addr_t phy_this; }; /** * coh901318_pool_create() - Creates an dma pool for lli:s * @pool: pool handle * @dev: dma device * @lli_nbr: number of lli:s in the pool * @algin: address alignemtn of lli:s * returns 0 on success otherwise none zero */ int coh901318_pool_create(struct coh901318_pool *pool, struct device *dev, size_t lli_nbr, size_t align); /** * coh901318_pool_destroy() - Destroys the dma pool * @pool: pool handle * returns 0 on success otherwise none zero */ int coh901318_pool_destroy(struct coh901318_pool *pool); /** * coh901318_lli_alloc() - Allocates a linked list * * @pool: pool handle * @len: length to list * return: none NULL if success otherwise NULL */ struct coh901318_lli * coh901318_lli_alloc(struct coh901318_pool *pool, unsigned int len); /** * coh901318_lli_free() - Returns the linked list items to the pool * @pool: pool handle * @lli: reference to lli pointer to be freed */ void coh901318_lli_free(struct coh901318_pool *pool, struct coh901318_lli **lli); /** * coh901318_lli_fill_memcpy() - Prepares the lli:s for dma memcpy * @pool: pool handle * @lli: allocated lli * @src: src address * @size: transfer size * @dst: destination address * @ctrl_chained: ctrl for chained lli * @ctrl_last: ctrl for the last lli * returns number of CPU interrupts for the lli, negative on error. */ int coh901318_lli_fill_memcpy(struct coh901318_pool *pool, struct coh901318_lli *lli, dma_addr_t src, unsigned int size, dma_addr_t dst, u32 ctrl_chained, u32 ctrl_last); /** * coh901318_lli_fill_single() - Prepares the lli:s for dma single transfer * @pool: pool handle * @lli: allocated lli * @buf: transfer buffer * @size: transfer size * @dev_addr: address of periphal * @ctrl_chained: ctrl for chained lli * @ctrl_last: ctrl for the last lli * @dir: direction of transfer (to or from device) * returns number of CPU interrupts for the lli, negative on error. */ int coh901318_lli_fill_single(struct coh901318_pool *pool, struct coh901318_lli *lli, dma_addr_t buf, unsigned int size, dma_addr_t dev_addr, u32 ctrl_chained, u32 ctrl_last, enum dma_transfer_direction dir); /** * coh901318_lli_fill_single() - Prepares the lli:s for dma scatter list transfer * @pool: pool handle * @lli: allocated lli * @sg: scatter gather list * @nents: number of entries in sg * @dev_addr: address of periphal * @ctrl_chained: ctrl for chained lli * @ctrl: ctrl of middle lli * @ctrl_last: ctrl for the last lli * @dir: direction of transfer (to or from device) * @ctrl_irq_mask: ctrl mask for CPU interrupt * returns number of CPU interrupts for the lli, negative on error. */ int coh901318_lli_fill_sg(struct coh901318_pool *pool, struct coh901318_lli *lli, struct scatterlist *sg, unsigned int nents, dma_addr_t dev_addr, u32 ctrl_chained, u32 ctrl, u32 ctrl_last, enum dma_transfer_direction dir, u32 ctrl_irq_mask); #endif /* COH901318_H */ |