/* SPDX-License-Identifier: GPL-2.0 */ /* * Copyright 2019 NXP * */ #ifndef _FSL_ASRC_COMMON_H #define _FSL_ASRC_COMMON_H /* directions */ #define IN 0 #define OUT 1 enum asrc_pair_index { ASRC_INVALID_PAIR = -1, ASRC_PAIR_A = 0, ASRC_PAIR_B = 1, ASRC_PAIR_C = 2, ASRC_PAIR_D = 3, }; #define PAIR_CTX_NUM 0x4 /** * fsl_asrc_pair: ASRC Pair common data * * @asrc: pointer to its parent module * @error: error record * @index: pair index (ASRC_PAIR_A, ASRC_PAIR_B, ASRC_PAIR_C) * @channels: occupied channel number * @desc: input and output dma descriptors * @dma_chan: inputer and output DMA channels * @dma_data: private dma data * @pos: hardware pointer position * @req_dma_chan: flag to release dev_to_dev chan * @private: pair private area */ struct fsl_asrc_pair { struct fsl_asrc *asrc; unsigned int error; enum asrc_pair_index index; unsigned int channels; struct dma_async_tx_descriptor *desc[2]; struct dma_chan *dma_chan[2]; struct imx_dma_data dma_data; unsigned int pos; bool req_dma_chan; void *private; }; /** * fsl_asrc: ASRC common data * * @dma_params_rx: DMA parameters for receive channel * @dma_params_tx: DMA parameters for transmit channel * @pdev: platform device pointer * @regmap: regmap handler * @paddr: physical address to the base address of registers * @mem_clk: clock source to access register * @ipg_clk: clock source to drive peripheral * @spba_clk: SPBA clock (optional, depending on SoC design) * @lock: spin lock for resource protection * @pair: pair pointers * @channel_avail: non-occupied channel numbers * @asrc_rate: default sample rate for ASoC Back-Ends * @asrc_format: default sample format for ASoC Back-Ends * @use_edma: edma is used * @get_dma_channel: function pointer * @request_pair: function pointer * @release_pair: function pointer * @get_fifo_addr: function pointer * @pair_priv_size: size of pair private struct. * @private: private data structure */ struct fsl_asrc { struct snd_dmaengine_dai_dma_data dma_params_rx; struct snd_dmaengine_dai_dma_data dma_params_tx; struct platform_device *pdev; struct regmap *regmap; unsigned long paddr; struct clk *mem_clk; struct clk *ipg_clk; struct clk *spba_clk; spinlock_t lock; /* spin lock for resource protection */ struct fsl_asrc_pair *pair[PAIR_CTX_NUM]; unsigned int channel_avail; int asrc_rate; snd_pcm_format_t asrc_format; bool use_edma; struct dma_chan *(*get_dma_channel)(struct fsl_asrc_pair *pair, bool dir); int (*request_pair)(int channels, struct fsl_asrc_pair *pair); void (*release_pair)(struct fsl_asrc_pair *pair); int (*get_fifo_addr)(u8 dir, enum asrc_pair_index index); size_t pair_priv_size; void *private; }; #define DRV_NAME "fsl-asrc-dai" extern struct snd_soc_component_driver fsl_asrc_component; #endif /* _FSL_ASRC_COMMON_H */