1 /** 2 * DOC: EP93xx DMA M2P memory to peripheral and peripheral to memory engine 3 * 4 * The EP93xx DMA M2P subsystem handles DMA transfers between memory and 5 * peripherals. DMA M2P channels are available for audio, UARTs and IrDA. 6 * See chapter 10 of the EP93xx users guide for full details on the DMA M2P 7 * engine. 8 * 9 * See sound/soc/ep93xx/ep93xx-pcm.c for an example use of the DMA M2P code. 10 * 11 */ 12 13 #ifndef __ASM_ARCH_DMA_H 14 #define __ASM_ARCH_DMA_H 15 16 #include <linux/list.h> 17 #include <linux/types.h> 18 19 /** 20 * struct ep93xx_dma_buffer - Information about a buffer to be transferred 21 * using the DMA M2P engine 22 * 23 * @list: Entry in DMA buffer list 24 * @bus_addr: Physical address of the buffer 25 * @size: Size of the buffer in bytes 26 */ 27 struct ep93xx_dma_buffer { 28 struct list_head list; 29 u32 bus_addr; 30 u16 size; 31 }; 32 33 /** 34 * struct ep93xx_dma_m2p_client - Information about a DMA M2P client 35 * 36 * @name: Unique name for this client 37 * @flags: Client flags 38 * @cookie: User data to pass to callback functions 39 * @buffer_started: Non NULL function to call when a transfer is started. 40 * The arguments are the user data cookie and the DMA 41 * buffer which is starting. 42 * @buffer_finished: Non NULL function to call when a transfer is completed. 43 * The arguments are the user data cookie, the DMA buffer 44 * which has completed, and a boolean flag indicating if 45 * the transfer had an error. 46 */ 47 struct ep93xx_dma_m2p_client { 48 char *name; 49 u8 flags; 50 void *cookie; 51 void (*buffer_started)(void *cookie, 52 struct ep93xx_dma_buffer *buf); 53 void (*buffer_finished)(void *cookie, 54 struct ep93xx_dma_buffer *buf, 55 int bytes, int error); 56 57 /* private: Internal use only */ 58 void *channel; 59 }; 60 61 /* DMA M2P ports */ 62 #define EP93XX_DMA_M2P_PORT_I2S1 0x00 63 #define EP93XX_DMA_M2P_PORT_I2S2 0x01 64 #define EP93XX_DMA_M2P_PORT_AAC1 0x02 65 #define EP93XX_DMA_M2P_PORT_AAC2 0x03 66 #define EP93XX_DMA_M2P_PORT_AAC3 0x04 67 #define EP93XX_DMA_M2P_PORT_I2S3 0x05 68 #define EP93XX_DMA_M2P_PORT_UART1 0x06 69 #define EP93XX_DMA_M2P_PORT_UART2 0x07 70 #define EP93XX_DMA_M2P_PORT_UART3 0x08 71 #define EP93XX_DMA_M2P_PORT_IRDA 0x09 72 #define EP93XX_DMA_M2P_PORT_MASK 0x0f 73 74 /* DMA M2P client flags */ 75 #define EP93XX_DMA_M2P_TX 0x00 /* Memory to peripheral */ 76 #define EP93XX_DMA_M2P_RX 0x10 /* Peripheral to memory */ 77 78 /* 79 * DMA M2P client error handling flags. See the EP93xx users guide 80 * documentation on the DMA M2P CONTROL register for more details 81 */ 82 #define EP93XX_DMA_M2P_ABORT_ON_ERROR 0x20 /* Abort on peripheral error */ 83 #define EP93XX_DMA_M2P_IGNORE_ERROR 0x40 /* Ignore peripheral errors */ 84 #define EP93XX_DMA_M2P_ERROR_MASK 0x60 /* Mask of error bits */ 85 86 /** 87 * ep93xx_dma_m2p_client_register - Register a client with the DMA M2P 88 * subsystem 89 * 90 * @m2p: Client information to register 91 * returns 0 on success 92 * 93 * The DMA M2P subsystem allocates a channel and an interrupt line for the DMA 94 * client 95 */ 96 int ep93xx_dma_m2p_client_register(struct ep93xx_dma_m2p_client *m2p); 97 98 /** 99 * ep93xx_dma_m2p_client_unregister - Unregister a client from the DMA M2P 100 * subsystem 101 * 102 * @m2p: Client to unregister 103 * 104 * Any transfers currently in progress will be completed in hardware, but 105 * ignored in software. 106 */ 107 void ep93xx_dma_m2p_client_unregister(struct ep93xx_dma_m2p_client *m2p); 108 109 /** 110 * ep93xx_dma_m2p_submit - Submit a DMA M2P transfer 111 * 112 * @m2p: DMA Client to submit the transfer on 113 * @buf: DMA Buffer to submit 114 * 115 * If the current or next transfer positions are free on the M2P client then 116 * the transfer is started immediately. If not, the transfer is added to the 117 * list of pending transfers. This function must not be called from the 118 * buffer_finished callback for an M2P channel. 119 * 120 */ 121 void ep93xx_dma_m2p_submit(struct ep93xx_dma_m2p_client *m2p, 122 struct ep93xx_dma_buffer *buf); 123 124 /** 125 * ep93xx_dma_m2p_submit_recursive - Put a DMA transfer on the pending list 126 * for an M2P channel 127 * 128 * @m2p: DMA Client to submit the transfer on 129 * @buf: DMA Buffer to submit 130 * 131 * This function must only be called from the buffer_finished callback for an 132 * M2P channel. It is commonly used to add the next transfer in a chained list 133 * of DMA transfers. 134 */ 135 void ep93xx_dma_m2p_submit_recursive(struct ep93xx_dma_m2p_client *m2p, 136 struct ep93xx_dma_buffer *buf); 137 138 /** 139 * ep93xx_dma_m2p_flush - Flush all pending transfers on a DMA M2P client 140 * 141 * @m2p: DMA client to flush transfers on 142 * 143 * Any transfers currently in progress will be completed in hardware, but 144 * ignored in software. 145 * 146 */ 147 void ep93xx_dma_m2p_flush(struct ep93xx_dma_m2p_client *m2p); 148 149 #endif /* __ASM_ARCH_DMA_H */ 150