/* 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* @get_dma_channel: function pointer110* @request_pair: function pointer111* @release_pair: function pointer112* @get_fifo_addr: function pointer113* @m2m_get_cap: function pointer114* @m2m_prepare: function pointer115* @m2m_start: function pointer116* @m2m_unprepare: function pointer117* @m2m_stop: function pointer118* @m2m_calc_out_len: function pointer119* @m2m_get_maxburst: function pointer120* @m2m_pair_suspend: function pointer121* @m2m_pair_resume: function pointer122* @m2m_set_ratio_mod: function pointer123* @get_output_fifo_size: function pointer124* @pair_priv_size: size of pair private struct.125* @private: private data structure126*/127struct fsl_asrc {128struct snd_dmaengine_dai_dma_data dma_params_rx;129struct snd_dmaengine_dai_dma_data dma_params_tx;130struct platform_device *pdev;131struct regmap *regmap;132unsigned long paddr;133struct clk *mem_clk;134struct clk *ipg_clk;135struct clk *spba_clk;136struct snd_card *card;137spinlock_t lock; /* spin lock for resource protection */138139struct fsl_asrc_pair *pair[PAIR_CTX_NUM];140unsigned int channel_avail;141142int asrc_rate;143snd_pcm_format_t asrc_format;144bool use_edma;145146struct dma_chan *(*get_dma_channel)(struct fsl_asrc_pair *pair, bool dir);147int (*request_pair)(int channels, struct fsl_asrc_pair *pair);148void (*release_pair)(struct fsl_asrc_pair *pair);149int (*get_fifo_addr)(u8 dir, enum asrc_pair_index index);150int (*m2m_get_cap)(struct fsl_asrc_m2m_cap *cap);151152int (*m2m_prepare)(struct fsl_asrc_pair *pair);153int (*m2m_start)(struct fsl_asrc_pair *pair);154int (*m2m_unprepare)(struct fsl_asrc_pair *pair);155int (*m2m_stop)(struct fsl_asrc_pair *pair);156157int (*m2m_calc_out_len)(struct fsl_asrc_pair *pair, int input_buffer_length);158int (*m2m_get_maxburst)(u8 dir, struct fsl_asrc_pair *pair);159int (*m2m_pair_suspend)(struct fsl_asrc_pair *pair);160int (*m2m_pair_resume)(struct fsl_asrc_pair *pair);161int (*m2m_set_ratio_mod)(struct fsl_asrc_pair *pair, int val);162163unsigned int (*get_output_fifo_size)(struct fsl_asrc_pair *pair);164size_t pair_priv_size;165166void *private;167};168169#define DRV_NAME "fsl-asrc-dai"170extern struct snd_soc_component_driver fsl_asrc_component;171172int fsl_asrc_m2m_init(struct fsl_asrc *asrc);173void fsl_asrc_m2m_exit(struct fsl_asrc *asrc);174int fsl_asrc_m2m_resume(struct fsl_asrc *asrc);175int fsl_asrc_m2m_suspend(struct fsl_asrc *asrc);176177#endif /* _FSL_ASRC_COMMON_H */178179180