18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci
38c2ecf20Sopenharmony_ci#ifndef __SPRD_MCDT_H
48c2ecf20Sopenharmony_ci#define __SPRD_MCDT_H
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_cienum sprd_mcdt_channel_type {
78c2ecf20Sopenharmony_ci	SPRD_MCDT_DAC_CHAN,
88c2ecf20Sopenharmony_ci	SPRD_MCDT_ADC_CHAN,
98c2ecf20Sopenharmony_ci	SPRD_MCDT_UNKNOWN_CHAN,
108c2ecf20Sopenharmony_ci};
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_cienum sprd_mcdt_dma_chan {
138c2ecf20Sopenharmony_ci	SPRD_MCDT_DMA_CH0,
148c2ecf20Sopenharmony_ci	SPRD_MCDT_DMA_CH1,
158c2ecf20Sopenharmony_ci	SPRD_MCDT_DMA_CH2,
168c2ecf20Sopenharmony_ci	SPRD_MCDT_DMA_CH3,
178c2ecf20Sopenharmony_ci	SPRD_MCDT_DMA_CH4,
188c2ecf20Sopenharmony_ci};
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_cistruct sprd_mcdt_chan_callback {
218c2ecf20Sopenharmony_ci	void (*notify)(void *data);
228c2ecf20Sopenharmony_ci	void *data;
238c2ecf20Sopenharmony_ci};
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_ci/**
268c2ecf20Sopenharmony_ci * struct sprd_mcdt_chan - this struct represents a single channel instance
278c2ecf20Sopenharmony_ci * @mcdt: the mcdt controller
288c2ecf20Sopenharmony_ci * @id: channel id
298c2ecf20Sopenharmony_ci * @fifo_phys: channel fifo physical address which is used for DMA transfer
308c2ecf20Sopenharmony_ci * @type: channel type
318c2ecf20Sopenharmony_ci * @cb: channel fifo interrupt's callback interface to notify the fifo events
328c2ecf20Sopenharmony_ci * @dma_enable: indicate if use DMA mode to transfer data
338c2ecf20Sopenharmony_ci * @int_enable: indicate if use interrupt mode to notify users to read or
348c2ecf20Sopenharmony_ci * write data manually
358c2ecf20Sopenharmony_ci * @list: used to link into the global list
368c2ecf20Sopenharmony_ci *
378c2ecf20Sopenharmony_ci * Note: users should not modify any members of this structure.
388c2ecf20Sopenharmony_ci */
398c2ecf20Sopenharmony_cistruct sprd_mcdt_chan {
408c2ecf20Sopenharmony_ci	struct sprd_mcdt_dev *mcdt;
418c2ecf20Sopenharmony_ci	u8 id;
428c2ecf20Sopenharmony_ci	unsigned long fifo_phys;
438c2ecf20Sopenharmony_ci	enum sprd_mcdt_channel_type type;
448c2ecf20Sopenharmony_ci	enum sprd_mcdt_dma_chan dma_chan;
458c2ecf20Sopenharmony_ci	struct sprd_mcdt_chan_callback *cb;
468c2ecf20Sopenharmony_ci	bool dma_enable;
478c2ecf20Sopenharmony_ci	bool int_enable;
488c2ecf20Sopenharmony_ci	struct list_head list;
498c2ecf20Sopenharmony_ci};
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_SND_SOC_SPRD_MCDT)
528c2ecf20Sopenharmony_cistruct sprd_mcdt_chan *sprd_mcdt_request_chan(u8 channel,
538c2ecf20Sopenharmony_ci					      enum sprd_mcdt_channel_type type);
548c2ecf20Sopenharmony_civoid sprd_mcdt_free_chan(struct sprd_mcdt_chan *chan);
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_ciint sprd_mcdt_chan_write(struct sprd_mcdt_chan *chan, char *tx_buf, u32 size);
578c2ecf20Sopenharmony_ciint sprd_mcdt_chan_read(struct sprd_mcdt_chan *chan, char *rx_buf, u32 size);
588c2ecf20Sopenharmony_ciint sprd_mcdt_chan_int_enable(struct sprd_mcdt_chan *chan, u32 water_mark,
598c2ecf20Sopenharmony_ci			      struct sprd_mcdt_chan_callback *cb);
608c2ecf20Sopenharmony_civoid sprd_mcdt_chan_int_disable(struct sprd_mcdt_chan *chan);
618c2ecf20Sopenharmony_ci
628c2ecf20Sopenharmony_ciint sprd_mcdt_chan_dma_enable(struct sprd_mcdt_chan *chan,
638c2ecf20Sopenharmony_ci			      enum sprd_mcdt_dma_chan dma_chan, u32 water_mark);
648c2ecf20Sopenharmony_civoid sprd_mcdt_chan_dma_disable(struct sprd_mcdt_chan *chan);
658c2ecf20Sopenharmony_ci
668c2ecf20Sopenharmony_ci#else
678c2ecf20Sopenharmony_ci
688c2ecf20Sopenharmony_cistruct sprd_mcdt_chan *sprd_mcdt_request_chan(u8 channel,
698c2ecf20Sopenharmony_ci					      enum sprd_mcdt_channel_type type)
708c2ecf20Sopenharmony_ci{
718c2ecf20Sopenharmony_ci	return NULL;
728c2ecf20Sopenharmony_ci}
738c2ecf20Sopenharmony_ci
748c2ecf20Sopenharmony_civoid sprd_mcdt_free_chan(struct sprd_mcdt_chan *chan)
758c2ecf20Sopenharmony_ci{ }
768c2ecf20Sopenharmony_ci
778c2ecf20Sopenharmony_ciint sprd_mcdt_chan_write(struct sprd_mcdt_chan *chan, char *tx_buf, u32 size)
788c2ecf20Sopenharmony_ci{
798c2ecf20Sopenharmony_ci	return -EINVAL;
808c2ecf20Sopenharmony_ci}
818c2ecf20Sopenharmony_ci
828c2ecf20Sopenharmony_ciint sprd_mcdt_chan_read(struct sprd_mcdt_chan *chan, char *rx_buf, u32 size)
838c2ecf20Sopenharmony_ci{
848c2ecf20Sopenharmony_ci	return 0;
858c2ecf20Sopenharmony_ci}
868c2ecf20Sopenharmony_ci
878c2ecf20Sopenharmony_ciint sprd_mcdt_chan_int_enable(struct sprd_mcdt_chan *chan, u32 water_mark,
888c2ecf20Sopenharmony_ci			      struct sprd_mcdt_chan_callback *cb)
898c2ecf20Sopenharmony_ci{
908c2ecf20Sopenharmony_ci	return -EINVAL;
918c2ecf20Sopenharmony_ci}
928c2ecf20Sopenharmony_ci
938c2ecf20Sopenharmony_civoid sprd_mcdt_chan_int_disable(struct sprd_mcdt_chan *chan)
948c2ecf20Sopenharmony_ci{ }
958c2ecf20Sopenharmony_ci
968c2ecf20Sopenharmony_ciint sprd_mcdt_chan_dma_enable(struct sprd_mcdt_chan *chan,
978c2ecf20Sopenharmony_ci			      enum sprd_mcdt_dma_chan dma_chan, u32 water_mark)
988c2ecf20Sopenharmony_ci{
998c2ecf20Sopenharmony_ci	return -EINVAL;
1008c2ecf20Sopenharmony_ci}
1018c2ecf20Sopenharmony_ci
1028c2ecf20Sopenharmony_civoid sprd_mcdt_chan_dma_disable(struct sprd_mcdt_chan *chan)
1038c2ecf20Sopenharmony_ci{ }
1048c2ecf20Sopenharmony_ci
1058c2ecf20Sopenharmony_ci#endif
1068c2ecf20Sopenharmony_ci
1078c2ecf20Sopenharmony_ci#endif /* __SPRD_MCDT_H */
108