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