/* SPDX-License-Identifier: GPL-2.0 */
/*
* Copyright 2019 NXP
*
*/
#ifndef _FSL_ASRC_COMMON_H
#define _FSL_ASRC_COMMON_H
/* directions */
#define IN 0
#define OUT 1
enum asrc_pair_index {
ASRC_INVALID_PAIR = -1 ,
ASRC_PAIR_A = 0 ,
ASRC_PAIR_B = 1 ,
ASRC_PAIR_C = 2 ,
ASRC_PAIR_D = 3 ,
};
#define PAIR_CTX_NUM 0 x4
/**
* struct fsl_asrc_m2m_cap - capability data
* @ fmt_in : input sample format
* @ fmt_out : output sample format
* @ chan_min : minimum channel number
* @ chan_max : maximum channel number
* @ rate_in : minimum rate
* @ rate_out : maximum rete
*/
struct fsl_asrc_m2m_cap {
u64 fmt_in;
u64 fmt_out;
int chan_min;
int chan_max;
const unsigned int *rate_in;
int rate_in_count;
const unsigned int *rate_out;
int rate_out_count;
};
/**
* fsl_asrc_pair : ASRC Pair common data
*
* @ asrc : pointer to its parent module
* @ error : error record
* @ index : pair index ( ASRC_PAIR_A , ASRC_PAIR_B , ASRC_PAIR_C )
* @ channels : occupied channel number
* @ desc : input and output dma descriptors
* @ dma_chan : inputer and output DMA channels
* @ dma_data : private dma data
* @ pos : hardware pointer position
* @ req_dma_chan : flag to release dev_to_dev chan
* @ private : pair private area
* @ complete : dma task complete
* @ sample_format : format of m2m
* @ rate : rate of m2m
* @ buf_len : buffer length of m2m
* @ dma_buffer : buffer pointers
* @ first_convert : start of conversion
* @ ratio_mod_flag : flag for new ratio modifier
* @ ratio_mod : ratio modification
*/
struct fsl_asrc_pair {
struct fsl_asrc *asrc;
unsigned int error;
enum asrc_pair_index index;
unsigned int channels;
struct dma_async_tx_descriptor *desc[2 ];
struct dma_chan *dma_chan[2 ];
struct imx_dma_data dma_data;
unsigned int pos;
bool req_dma_chan;
void *private ;
/* used for m2m */
struct completion complete[2 ];
snd_pcm_format_t sample_format[2 ];
unsigned int rate[2 ];
unsigned int buf_len[2 ];
struct snd_dma_buffer dma_buffer[2 ];
unsigned int first_convert;
bool ratio_mod_flag;
unsigned int ratio_mod;
};
/**
* fsl_asrc : ASRC common data
*
* @ dma_params_rx : DMA parameters for receive channel
* @ dma_params_tx : DMA parameters for transmit channel
* @ pdev : platform device pointer
* @ regmap : regmap handler
* @ paddr : physical address to the base address of registers
* @ mem_clk : clock source to access register
* @ ipg_clk : clock source to drive peripheral
* @ spba_clk : SPBA clock ( optional , depending on SoC design )
* @ card : compress sound card
* @ lock : spin lock for resource protection
* @ pair : pair pointers
* @ channel_avail : non - occupied channel numbers
* @ asrc_rate : default sample rate for ASoC Back - Ends
* @ asrc_format : default sample format for ASoC Back - Ends
* @ use_edma : edma is used
* @ get_dma_channel : function pointer
* @ request_pair : function pointer
* @ release_pair : function pointer
* @ get_fifo_addr : function pointer
* @ m2m_get_cap : function pointer
* @ m2m_prepare : function pointer
* @ m2m_start : function pointer
* @ m2m_unprepare : function pointer
* @ m2m_stop : function pointer
* @ m2m_calc_out_len : function pointer
* @ m2m_get_maxburst : function pointer
* @ m2m_pair_suspend : function pointer
* @ m2m_pair_resume : function pointer
* @ m2m_set_ratio_mod : function pointer
* @ get_output_fifo_size : function pointer
* @ pair_priv_size : size of pair private struct .
* @ private : private data structure
*/
struct fsl_asrc {
struct snd_dmaengine_dai_dma_data dma_params_rx;
struct snd_dmaengine_dai_dma_data dma_params_tx;
struct platform_device *pdev;
struct regmap *regmap;
unsigned long paddr;
struct clk *mem_clk;
struct clk *ipg_clk;
struct clk *spba_clk;
struct snd_card *card;
spinlock_t lock; /* spin lock for resource protection */
struct fsl_asrc_pair *pair[PAIR_CTX_NUM];
unsigned int channel_avail;
int asrc_rate;
snd_pcm_format_t asrc_format;
bool use_edma;
struct dma_chan *(*get_dma_channel)(struct fsl_asrc_pair *pair, bool dir);
int (*request_pair)(int channels, struct fsl_asrc_pair *pair);
void (*release_pair)(struct fsl_asrc_pair *pair);
int (*get_fifo_addr)(u8 dir, enum asrc_pair_index index);
int (*m2m_get_cap)(struct fsl_asrc_m2m_cap *cap);
int (*m2m_prepare)(struct fsl_asrc_pair *pair);
int (*m2m_start)(struct fsl_asrc_pair *pair);
int (*m2m_unprepare)(struct fsl_asrc_pair *pair);
int (*m2m_stop)(struct fsl_asrc_pair *pair);
int (*m2m_calc_out_len)(struct fsl_asrc_pair *pair, int input_buffer_length);
int (*m2m_get_maxburst)(u8 dir, struct fsl_asrc_pair *pair);
int (*m2m_pair_suspend)(struct fsl_asrc_pair *pair);
int (*m2m_pair_resume)(struct fsl_asrc_pair *pair);
int (*m2m_set_ratio_mod)(struct fsl_asrc_pair *pair, int val);
unsigned int (*get_output_fifo_size)(struct fsl_asrc_pair *pair);
size_t pair_priv_size;
void *private ;
};
#define DRV_NAME "fsl-asrc-dai"
extern struct snd_soc_component_driver fsl_asrc_component;
int fsl_asrc_m2m_init(struct fsl_asrc *asrc);
void fsl_asrc_m2m_exit(struct fsl_asrc *asrc);
int fsl_asrc_m2m_resume(struct fsl_asrc *asrc);
int fsl_asrc_m2m_suspend(struct fsl_asrc *asrc);
#endif /* _FSL_ASRC_COMMON_H */
Messung V0.5 in Prozent C=88 H=97 G=92
¤ Dauer der Verarbeitung: 0.3 Sekunden
¤
*© Formatika GbR, Deutschland