1 // SPDX-License-Identifier: GPL-2.0 2 3 #ifndef __SPRD_MCDT_H 4 #define __SPRD_MCDT_H 5 6 enum sprd_mcdt_channel_type { 7 SPRD_MCDT_DAC_CHAN, 8 SPRD_MCDT_ADC_CHAN, 9 SPRD_MCDT_UNKNOWN_CHAN, 10 }; 11 12 enum sprd_mcdt_dma_chan { 13 SPRD_MCDT_DMA_CH0, 14 SPRD_MCDT_DMA_CH1, 15 SPRD_MCDT_DMA_CH2, 16 SPRD_MCDT_DMA_CH3, 17 SPRD_MCDT_DMA_CH4, 18 }; 19 20 struct sprd_mcdt_chan_callback { 21 void (*notify)(void *data); 22 void *data; 23 }; 24 25 /** 26 * struct sprd_mcdt_chan - this struct represents a single channel instance 27 * @mcdt: the mcdt controller 28 * @id: channel id 29 * @fifo_phys: channel fifo physical address which is used for DMA transfer 30 * @type: channel type 31 * @cb: channel fifo interrupt's callback interface to notify the fifo events 32 * @dma_enable: indicate if use DMA mode to transfer data 33 * @int_enable: indicate if use interrupt mode to notify users to read or 34 * write data manually 35 * @list: used to link into the global list 36 * 37 * Note: users should not modify any members of this structure. 38 */ 39 struct sprd_mcdt_chan { 40 struct sprd_mcdt_dev *mcdt; 41 u8 id; 42 unsigned long fifo_phys; 43 enum sprd_mcdt_channel_type type; 44 enum sprd_mcdt_dma_chan dma_chan; 45 struct sprd_mcdt_chan_callback *cb; 46 bool dma_enable; 47 bool int_enable; 48 struct list_head list; 49 }; 50 51 #if IS_ENABLED(CONFIG_SND_SOC_SPRD_MCDT) 52 struct sprd_mcdt_chan *sprd_mcdt_request_chan(u8 channel, 53 enum sprd_mcdt_channel_type type); 54 void sprd_mcdt_free_chan(struct sprd_mcdt_chan *chan); 55 56 int sprd_mcdt_chan_write(struct sprd_mcdt_chan *chan, char *tx_buf, u32 size); 57 int sprd_mcdt_chan_read(struct sprd_mcdt_chan *chan, char *rx_buf, u32 size); 58 int sprd_mcdt_chan_int_enable(struct sprd_mcdt_chan *chan, u32 water_mark, 59 struct sprd_mcdt_chan_callback *cb); 60 void sprd_mcdt_chan_int_disable(struct sprd_mcdt_chan *chan); 61 62 int sprd_mcdt_chan_dma_enable(struct sprd_mcdt_chan *chan, 63 enum sprd_mcdt_dma_chan dma_chan, u32 water_mark); 64 void sprd_mcdt_chan_dma_disable(struct sprd_mcdt_chan *chan); 65 66 #else 67 68 struct sprd_mcdt_chan *sprd_mcdt_request_chan(u8 channel, 69 enum sprd_mcdt_channel_type type) 70 { 71 return NULL; 72 } 73 74 void sprd_mcdt_free_chan(struct sprd_mcdt_chan *chan) 75 { } 76 77 int sprd_mcdt_chan_write(struct sprd_mcdt_chan *chan, char *tx_buf, u32 size) 78 { 79 return -EINVAL; 80 } 81 82 int sprd_mcdt_chan_read(struct sprd_mcdt_chan *chan, char *rx_buf, u32 size) 83 { 84 return 0; 85 } 86 87 int sprd_mcdt_chan_int_enable(struct sprd_mcdt_chan *chan, u32 water_mark, 88 struct sprd_mcdt_chan_callback *cb) 89 { 90 return -EINVAL; 91 } 92 93 void sprd_mcdt_chan_int_disable(struct sprd_mcdt_chan *chan) 94 { } 95 96 int sprd_mcdt_chan_dma_enable(struct sprd_mcdt_chan *chan, 97 enum sprd_mcdt_dma_chan dma_chan, u32 water_mark) 98 { 99 return -EINVAL; 100 } 101 102 void sprd_mcdt_chan_dma_disable(struct sprd_mcdt_chan *chan) 103 { } 104 105 #endif 106 107 #endif /* __SPRD_MCDT_H */ 108