162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright 2019 NXP 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#ifndef _FSL_ASRC_COMMON_H 862306a36Sopenharmony_ci#define _FSL_ASRC_COMMON_H 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci/* directions */ 1162306a36Sopenharmony_ci#define IN 0 1262306a36Sopenharmony_ci#define OUT 1 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_cienum asrc_pair_index { 1562306a36Sopenharmony_ci ASRC_INVALID_PAIR = -1, 1662306a36Sopenharmony_ci ASRC_PAIR_A = 0, 1762306a36Sopenharmony_ci ASRC_PAIR_B = 1, 1862306a36Sopenharmony_ci ASRC_PAIR_C = 2, 1962306a36Sopenharmony_ci ASRC_PAIR_D = 3, 2062306a36Sopenharmony_ci}; 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci#define PAIR_CTX_NUM 0x4 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci/** 2562306a36Sopenharmony_ci * fsl_asrc_pair: ASRC Pair common data 2662306a36Sopenharmony_ci * 2762306a36Sopenharmony_ci * @asrc: pointer to its parent module 2862306a36Sopenharmony_ci * @error: error record 2962306a36Sopenharmony_ci * @index: pair index (ASRC_PAIR_A, ASRC_PAIR_B, ASRC_PAIR_C) 3062306a36Sopenharmony_ci * @channels: occupied channel number 3162306a36Sopenharmony_ci * @desc: input and output dma descriptors 3262306a36Sopenharmony_ci * @dma_chan: inputer and output DMA channels 3362306a36Sopenharmony_ci * @dma_data: private dma data 3462306a36Sopenharmony_ci * @pos: hardware pointer position 3562306a36Sopenharmony_ci * @req_dma_chan: flag to release dev_to_dev chan 3662306a36Sopenharmony_ci * @private: pair private area 3762306a36Sopenharmony_ci */ 3862306a36Sopenharmony_cistruct fsl_asrc_pair { 3962306a36Sopenharmony_ci struct fsl_asrc *asrc; 4062306a36Sopenharmony_ci unsigned int error; 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci enum asrc_pair_index index; 4362306a36Sopenharmony_ci unsigned int channels; 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci struct dma_async_tx_descriptor *desc[2]; 4662306a36Sopenharmony_ci struct dma_chan *dma_chan[2]; 4762306a36Sopenharmony_ci struct imx_dma_data dma_data; 4862306a36Sopenharmony_ci unsigned int pos; 4962306a36Sopenharmony_ci bool req_dma_chan; 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci void *private; 5262306a36Sopenharmony_ci}; 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci/** 5562306a36Sopenharmony_ci * fsl_asrc: ASRC common data 5662306a36Sopenharmony_ci * 5762306a36Sopenharmony_ci * @dma_params_rx: DMA parameters for receive channel 5862306a36Sopenharmony_ci * @dma_params_tx: DMA parameters for transmit channel 5962306a36Sopenharmony_ci * @pdev: platform device pointer 6062306a36Sopenharmony_ci * @regmap: regmap handler 6162306a36Sopenharmony_ci * @paddr: physical address to the base address of registers 6262306a36Sopenharmony_ci * @mem_clk: clock source to access register 6362306a36Sopenharmony_ci * @ipg_clk: clock source to drive peripheral 6462306a36Sopenharmony_ci * @spba_clk: SPBA clock (optional, depending on SoC design) 6562306a36Sopenharmony_ci * @lock: spin lock for resource protection 6662306a36Sopenharmony_ci * @pair: pair pointers 6762306a36Sopenharmony_ci * @channel_avail: non-occupied channel numbers 6862306a36Sopenharmony_ci * @asrc_rate: default sample rate for ASoC Back-Ends 6962306a36Sopenharmony_ci * @asrc_format: default sample format for ASoC Back-Ends 7062306a36Sopenharmony_ci * @use_edma: edma is used 7162306a36Sopenharmony_ci * @get_dma_channel: function pointer 7262306a36Sopenharmony_ci * @request_pair: function pointer 7362306a36Sopenharmony_ci * @release_pair: function pointer 7462306a36Sopenharmony_ci * @get_fifo_addr: function pointer 7562306a36Sopenharmony_ci * @pair_priv_size: size of pair private struct. 7662306a36Sopenharmony_ci * @private: private data structure 7762306a36Sopenharmony_ci */ 7862306a36Sopenharmony_cistruct fsl_asrc { 7962306a36Sopenharmony_ci struct snd_dmaengine_dai_dma_data dma_params_rx; 8062306a36Sopenharmony_ci struct snd_dmaengine_dai_dma_data dma_params_tx; 8162306a36Sopenharmony_ci struct platform_device *pdev; 8262306a36Sopenharmony_ci struct regmap *regmap; 8362306a36Sopenharmony_ci unsigned long paddr; 8462306a36Sopenharmony_ci struct clk *mem_clk; 8562306a36Sopenharmony_ci struct clk *ipg_clk; 8662306a36Sopenharmony_ci struct clk *spba_clk; 8762306a36Sopenharmony_ci spinlock_t lock; /* spin lock for resource protection */ 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci struct fsl_asrc_pair *pair[PAIR_CTX_NUM]; 9062306a36Sopenharmony_ci unsigned int channel_avail; 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci int asrc_rate; 9362306a36Sopenharmony_ci snd_pcm_format_t asrc_format; 9462306a36Sopenharmony_ci bool use_edma; 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci struct dma_chan *(*get_dma_channel)(struct fsl_asrc_pair *pair, bool dir); 9762306a36Sopenharmony_ci int (*request_pair)(int channels, struct fsl_asrc_pair *pair); 9862306a36Sopenharmony_ci void (*release_pair)(struct fsl_asrc_pair *pair); 9962306a36Sopenharmony_ci int (*get_fifo_addr)(u8 dir, enum asrc_pair_index index); 10062306a36Sopenharmony_ci size_t pair_priv_size; 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci void *private; 10362306a36Sopenharmony_ci}; 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci#define DRV_NAME "fsl-asrc-dai" 10662306a36Sopenharmony_ciextern struct snd_soc_component_driver fsl_asrc_component; 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci#endif /* _FSL_ASRC_COMMON_H */ 109