Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * Copyright 2019 NXP
0004  *
0005  */
0006 
0007 #ifndef _FSL_ASRC_COMMON_H
0008 #define _FSL_ASRC_COMMON_H
0009 
0010 /* directions */
0011 #define IN  0
0012 #define OUT 1
0013 
0014 enum asrc_pair_index {
0015     ASRC_INVALID_PAIR = -1,
0016     ASRC_PAIR_A = 0,
0017     ASRC_PAIR_B = 1,
0018     ASRC_PAIR_C = 2,
0019     ASRC_PAIR_D = 3,
0020 };
0021 
0022 #define PAIR_CTX_NUM  0x4
0023 
0024 /**
0025  * fsl_asrc_pair: ASRC Pair common data
0026  *
0027  * @asrc: pointer to its parent module
0028  * @error: error record
0029  * @index: pair index (ASRC_PAIR_A, ASRC_PAIR_B, ASRC_PAIR_C)
0030  * @channels: occupied channel number
0031  * @desc: input and output dma descriptors
0032  * @dma_chan: inputer and output DMA channels
0033  * @dma_data: private dma data
0034  * @pos: hardware pointer position
0035  * @req_dma_chan: flag to release dev_to_dev chan
0036  * @private: pair private area
0037  */
0038 struct fsl_asrc_pair {
0039     struct fsl_asrc *asrc;
0040     unsigned int error;
0041 
0042     enum asrc_pair_index index;
0043     unsigned int channels;
0044 
0045     struct dma_async_tx_descriptor *desc[2];
0046     struct dma_chan *dma_chan[2];
0047     struct imx_dma_data dma_data;
0048     unsigned int pos;
0049     bool req_dma_chan;
0050 
0051     void *private;
0052 };
0053 
0054 /**
0055  * fsl_asrc: ASRC common data
0056  *
0057  * @dma_params_rx: DMA parameters for receive channel
0058  * @dma_params_tx: DMA parameters for transmit channel
0059  * @pdev: platform device pointer
0060  * @regmap: regmap handler
0061  * @paddr: physical address to the base address of registers
0062  * @mem_clk: clock source to access register
0063  * @ipg_clk: clock source to drive peripheral
0064  * @spba_clk: SPBA clock (optional, depending on SoC design)
0065  * @lock: spin lock for resource protection
0066  * @pair: pair pointers
0067  * @channel_avail: non-occupied channel numbers
0068  * @asrc_rate: default sample rate for ASoC Back-Ends
0069  * @asrc_format: default sample format for ASoC Back-Ends
0070  * @use_edma: edma is used
0071  * @get_dma_channel: function pointer
0072  * @request_pair: function pointer
0073  * @release_pair: function pointer
0074  * @get_fifo_addr: function pointer
0075  * @pair_priv_size: size of pair private struct.
0076  * @private: private data structure
0077  */
0078 struct fsl_asrc {
0079     struct snd_dmaengine_dai_dma_data dma_params_rx;
0080     struct snd_dmaengine_dai_dma_data dma_params_tx;
0081     struct platform_device *pdev;
0082     struct regmap *regmap;
0083     unsigned long paddr;
0084     struct clk *mem_clk;
0085     struct clk *ipg_clk;
0086     struct clk *spba_clk;
0087     spinlock_t lock;      /* spin lock for resource protection */
0088 
0089     struct fsl_asrc_pair *pair[PAIR_CTX_NUM];
0090     unsigned int channel_avail;
0091 
0092     int asrc_rate;
0093     snd_pcm_format_t asrc_format;
0094     bool use_edma;
0095 
0096     struct dma_chan *(*get_dma_channel)(struct fsl_asrc_pair *pair, bool dir);
0097     int (*request_pair)(int channels, struct fsl_asrc_pair *pair);
0098     void (*release_pair)(struct fsl_asrc_pair *pair);
0099     int (*get_fifo_addr)(u8 dir, enum asrc_pair_index index);
0100     size_t pair_priv_size;
0101 
0102     void *private;
0103 };
0104 
0105 #define DRV_NAME "fsl-asrc-dai"
0106 extern struct snd_soc_component_driver fsl_asrc_component;
0107 
0108 #endif /* _FSL_ASRC_COMMON_H */