/* SPDX-License-Identifier: GPL-2.0 */1/*2* Copyright 2019 NXP3*4*/56#ifndef _FSL_ASRC_COMMON_H7#define _FSL_ASRC_COMMON_H89/* directions */10#define IN 011#define OUT 11213enum asrc_pair_index {14ASRC_INVALID_PAIR = -1,15ASRC_PAIR_A = 0,16ASRC_PAIR_B = 1,17ASRC_PAIR_C = 2,18ASRC_PAIR_D = 3,19};2021#define PAIR_CTX_NUM 0x42223/**24* struct fsl_asrc_m2m_cap - capability data25* @fmt_in: input sample format26* @fmt_out: output sample format27* @chan_min: minimum channel number28* @chan_max: maximum channel number29* @rate_in: minimum rate30* @rate_out: maximum rete31*/32struct fsl_asrc_m2m_cap {33u64 fmt_in;34u64 fmt_out;35int chan_min;36int chan_max;37const unsigned int *rate_in;38int rate_in_count;39const unsigned int *rate_out;40int rate_out_count;41};4243/**44* fsl_asrc_pair: ASRC Pair common data45*46* @asrc: pointer to its parent module47* @error: error record48* @index: pair index (ASRC_PAIR_A, ASRC_PAIR_B, ASRC_PAIR_C)49* @channels: occupied channel number50* @desc: input and output dma descriptors51* @dma_chan: inputer and output DMA channels52* @dma_data: private dma data53* @pos: hardware pointer position54* @req_dma_chan: flag to release dev_to_dev chan55* @private: pair private area56* @complete: dma task complete57* @sample_format: format of m2m58* @rate: rate of m2m59* @buf_len: buffer length of m2m60* @dma_buffer: buffer pointers61* @first_convert: start of conversion62* @ratio_mod_flag: flag for new ratio modifier63* @ratio_mod: ratio modification64*/65struct fsl_asrc_pair {66struct fsl_asrc *asrc;67unsigned int error;6869enum asrc_pair_index index;70unsigned int channels;7172struct dma_async_tx_descriptor *desc[2];73struct dma_chan *dma_chan[2];74struct imx_dma_data dma_data;75unsigned int pos;76bool req_dma_chan;7778void *private;7980/* used for m2m */81struct completion complete[2];82snd_pcm_format_t sample_format[2];83unsigned int rate[2];84unsigned int buf_len[2];85struct snd_dma_buffer dma_buffer[2];86unsigned int first_convert;87bool ratio_mod_flag;88unsigned int ratio_mod;89};9091/**92* fsl_asrc: ASRC common data93*94* @dma_params_rx: DMA parameters for receive channel95* @dma_params_tx: DMA parameters for transmit channel96* @pdev: platform device pointer97* @regmap: regmap handler98* @paddr: physical address to the base address of registers99* @mem_clk: clock source to access register100* @ipg_clk: clock source to drive peripheral101* @spba_clk: SPBA clock (optional, depending on SoC design)102* @card: compress sound card103* @lock: spin lock for resource protection104* @pair: pair pointers105* @channel_avail: non-occupied channel numbers106* @asrc_rate: default sample rate for ASoC Back-Ends107* @asrc_format: default sample format for ASoC Back-Ends108* @use_edma: edma is used109* @start_before_dma: start asrc before dma110* @get_dma_channel: function pointer111* @request_pair: function pointer112* @release_pair: function pointer113* @get_fifo_addr: function pointer114* @m2m_get_cap: function pointer115* @m2m_prepare: function pointer116* @m2m_start: function pointer117* @m2m_unprepare: function pointer118* @m2m_stop: function pointer119* @m2m_output_ready: function pointer, check output fifo ready or not120* @m2m_calc_out_len: function pointer121* @m2m_get_maxburst: function pointer122* @m2m_pair_suspend: function pointer123* @m2m_pair_resume: function pointer124* @m2m_set_ratio_mod: function pointer125* @get_output_fifo_size: function pointer126* @pair_priv_size: size of pair private struct.127* @private: private data structure128*/129struct fsl_asrc {130struct snd_dmaengine_dai_dma_data dma_params_rx;131struct snd_dmaengine_dai_dma_data dma_params_tx;132struct platform_device *pdev;133struct regmap *regmap;134unsigned long paddr;135struct clk *mem_clk;136struct clk *ipg_clk;137struct clk *spba_clk;138struct snd_card *card;139spinlock_t lock; /* spin lock for resource protection */140141struct fsl_asrc_pair *pair[PAIR_CTX_NUM];142unsigned int channel_avail;143144int asrc_rate;145snd_pcm_format_t asrc_format;146bool use_edma;147bool start_before_dma;148149struct dma_chan *(*get_dma_channel)(struct fsl_asrc_pair *pair, bool dir);150int (*request_pair)(int channels, struct fsl_asrc_pair *pair);151void (*release_pair)(struct fsl_asrc_pair *pair);152int (*get_fifo_addr)(u8 dir, enum asrc_pair_index index);153int (*m2m_get_cap)(struct fsl_asrc_m2m_cap *cap);154155int (*m2m_prepare)(struct fsl_asrc_pair *pair);156int (*m2m_start)(struct fsl_asrc_pair *pair);157int (*m2m_unprepare)(struct fsl_asrc_pair *pair);158int (*m2m_stop)(struct fsl_asrc_pair *pair);159bool (*m2m_output_ready)(struct fsl_asrc_pair *pair);160161int (*m2m_calc_out_len)(struct fsl_asrc_pair *pair, int input_buffer_length);162int (*m2m_get_maxburst)(u8 dir, struct fsl_asrc_pair *pair);163int (*m2m_pair_suspend)(struct fsl_asrc_pair *pair);164int (*m2m_pair_resume)(struct fsl_asrc_pair *pair);165int (*m2m_set_ratio_mod)(struct fsl_asrc_pair *pair, int val);166167unsigned int (*get_output_fifo_size)(struct fsl_asrc_pair *pair);168size_t pair_priv_size;169170void *private;171};172173#define DRV_NAME "fsl-asrc-dai"174extern struct snd_soc_component_driver fsl_asrc_component;175176int fsl_asrc_m2m_init(struct fsl_asrc *asrc);177void fsl_asrc_m2m_exit(struct fsl_asrc *asrc);178int fsl_asrc_m2m_resume(struct fsl_asrc *asrc);179int fsl_asrc_m2m_suspend(struct fsl_asrc *asrc);180181#endif /* _FSL_ASRC_COMMON_H */182183184