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