18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright 2019 NXP 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci */ 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#ifndef _FSL_ASRC_COMMON_H 88c2ecf20Sopenharmony_ci#define _FSL_ASRC_COMMON_H 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci/* directions */ 118c2ecf20Sopenharmony_ci#define IN 0 128c2ecf20Sopenharmony_ci#define OUT 1 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_cienum asrc_pair_index { 158c2ecf20Sopenharmony_ci ASRC_INVALID_PAIR = -1, 168c2ecf20Sopenharmony_ci ASRC_PAIR_A = 0, 178c2ecf20Sopenharmony_ci ASRC_PAIR_B = 1, 188c2ecf20Sopenharmony_ci ASRC_PAIR_C = 2, 198c2ecf20Sopenharmony_ci ASRC_PAIR_D = 3, 208c2ecf20Sopenharmony_ci}; 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_ci#define PAIR_CTX_NUM 0x4 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci/** 258c2ecf20Sopenharmony_ci * fsl_asrc_pair: ASRC Pair common data 268c2ecf20Sopenharmony_ci * 278c2ecf20Sopenharmony_ci * @asrc: pointer to its parent module 288c2ecf20Sopenharmony_ci * @error: error record 298c2ecf20Sopenharmony_ci * @index: pair index (ASRC_PAIR_A, ASRC_PAIR_B, ASRC_PAIR_C) 308c2ecf20Sopenharmony_ci * @channels: occupied channel number 318c2ecf20Sopenharmony_ci * @desc: input and output dma descriptors 328c2ecf20Sopenharmony_ci * @dma_chan: inputer and output DMA channels 338c2ecf20Sopenharmony_ci * @dma_data: private dma data 348c2ecf20Sopenharmony_ci * @pos: hardware pointer position 358c2ecf20Sopenharmony_ci * @req_dma_chan: flag to release dev_to_dev chan 368c2ecf20Sopenharmony_ci * @private: pair private area 378c2ecf20Sopenharmony_ci */ 388c2ecf20Sopenharmony_cistruct fsl_asrc_pair { 398c2ecf20Sopenharmony_ci struct fsl_asrc *asrc; 408c2ecf20Sopenharmony_ci unsigned int error; 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci enum asrc_pair_index index; 438c2ecf20Sopenharmony_ci unsigned int channels; 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ci struct dma_async_tx_descriptor *desc[2]; 468c2ecf20Sopenharmony_ci struct dma_chan *dma_chan[2]; 478c2ecf20Sopenharmony_ci struct imx_dma_data dma_data; 488c2ecf20Sopenharmony_ci unsigned int pos; 498c2ecf20Sopenharmony_ci bool req_dma_chan; 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ci void *private; 528c2ecf20Sopenharmony_ci}; 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_ci/** 558c2ecf20Sopenharmony_ci * fsl_asrc: ASRC common data 568c2ecf20Sopenharmony_ci * 578c2ecf20Sopenharmony_ci * @dma_params_rx: DMA parameters for receive channel 588c2ecf20Sopenharmony_ci * @dma_params_tx: DMA parameters for transmit channel 598c2ecf20Sopenharmony_ci * @pdev: platform device pointer 608c2ecf20Sopenharmony_ci * @regmap: regmap handler 618c2ecf20Sopenharmony_ci * @paddr: physical address to the base address of registers 628c2ecf20Sopenharmony_ci * @mem_clk: clock source to access register 638c2ecf20Sopenharmony_ci * @ipg_clk: clock source to drive peripheral 648c2ecf20Sopenharmony_ci * @spba_clk: SPBA clock (optional, depending on SoC design) 658c2ecf20Sopenharmony_ci * @lock: spin lock for resource protection 668c2ecf20Sopenharmony_ci * @pair: pair pointers 678c2ecf20Sopenharmony_ci * @channel_avail: non-occupied channel numbers 688c2ecf20Sopenharmony_ci * @asrc_rate: default sample rate for ASoC Back-Ends 698c2ecf20Sopenharmony_ci * @asrc_format: default sample format for ASoC Back-Ends 708c2ecf20Sopenharmony_ci * @use_edma: edma is used 718c2ecf20Sopenharmony_ci * @get_dma_channel: function pointer 728c2ecf20Sopenharmony_ci * @request_pair: function pointer 738c2ecf20Sopenharmony_ci * @release_pair: function pointer 748c2ecf20Sopenharmony_ci * @get_fifo_addr: function pointer 758c2ecf20Sopenharmony_ci * @pair_priv_size: size of pair private struct. 768c2ecf20Sopenharmony_ci * @private: private data structure 778c2ecf20Sopenharmony_ci */ 788c2ecf20Sopenharmony_cistruct fsl_asrc { 798c2ecf20Sopenharmony_ci struct snd_dmaengine_dai_dma_data dma_params_rx; 808c2ecf20Sopenharmony_ci struct snd_dmaengine_dai_dma_data dma_params_tx; 818c2ecf20Sopenharmony_ci struct platform_device *pdev; 828c2ecf20Sopenharmony_ci struct regmap *regmap; 838c2ecf20Sopenharmony_ci unsigned long paddr; 848c2ecf20Sopenharmony_ci struct clk *mem_clk; 858c2ecf20Sopenharmony_ci struct clk *ipg_clk; 868c2ecf20Sopenharmony_ci struct clk *spba_clk; 878c2ecf20Sopenharmony_ci spinlock_t lock; /* spin lock for resource protection */ 888c2ecf20Sopenharmony_ci 898c2ecf20Sopenharmony_ci struct fsl_asrc_pair *pair[PAIR_CTX_NUM]; 908c2ecf20Sopenharmony_ci unsigned int channel_avail; 918c2ecf20Sopenharmony_ci 928c2ecf20Sopenharmony_ci int asrc_rate; 938c2ecf20Sopenharmony_ci snd_pcm_format_t asrc_format; 948c2ecf20Sopenharmony_ci bool use_edma; 958c2ecf20Sopenharmony_ci 968c2ecf20Sopenharmony_ci struct dma_chan *(*get_dma_channel)(struct fsl_asrc_pair *pair, bool dir); 978c2ecf20Sopenharmony_ci int (*request_pair)(int channels, struct fsl_asrc_pair *pair); 988c2ecf20Sopenharmony_ci void (*release_pair)(struct fsl_asrc_pair *pair); 998c2ecf20Sopenharmony_ci int (*get_fifo_addr)(u8 dir, enum asrc_pair_index index); 1008c2ecf20Sopenharmony_ci size_t pair_priv_size; 1018c2ecf20Sopenharmony_ci 1028c2ecf20Sopenharmony_ci void *private; 1038c2ecf20Sopenharmony_ci}; 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_ci#define DRV_NAME "fsl-asrc-dai" 1068c2ecf20Sopenharmony_ciextern struct snd_soc_component_driver fsl_asrc_component; 1078c2ecf20Sopenharmony_ci 1088c2ecf20Sopenharmony_ci#endif /* _FSL_ASRC_COMMON_H */ 109