fsl_asrc_common.h 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Copyright 2019 NXP
  4. *
  5. */
  6. #ifndef _FSL_ASRC_COMMON_H
  7. #define _FSL_ASRC_COMMON_H
  8. /* directions */
  9. #define IN 0
  10. #define OUT 1
  11. enum asrc_pair_index {
  12. ASRC_INVALID_PAIR = -1,
  13. ASRC_PAIR_A = 0,
  14. ASRC_PAIR_B = 1,
  15. ASRC_PAIR_C = 2,
  16. ASRC_PAIR_D = 3,
  17. };
  18. #define PAIR_CTX_NUM 0x4
  19. /**
  20. * struct fsl_asrc_m2m_cap - capability data
  21. * @fmt_in: input sample format
  22. * @fmt_out: output sample format
  23. * @chan_min: minimum channel number
  24. * @chan_max: maximum channel number
  25. * @rate_in: minimum rate
  26. * @rate_out: maximum rete
  27. */
  28. struct fsl_asrc_m2m_cap {
  29. u64 fmt_in;
  30. u64 fmt_out;
  31. int chan_min;
  32. int chan_max;
  33. const unsigned int *rate_in;
  34. int rate_in_count;
  35. const unsigned int *rate_out;
  36. int rate_out_count;
  37. };
  38. /**
  39. * fsl_asrc_pair: ASRC Pair common data
  40. *
  41. * @asrc: pointer to its parent module
  42. * @error: error record
  43. * @index: pair index (ASRC_PAIR_A, ASRC_PAIR_B, ASRC_PAIR_C)
  44. * @channels: occupied channel number
  45. * @desc: input and output dma descriptors
  46. * @dma_chan: inputer and output DMA channels
  47. * @dma_data: private dma data
  48. * @pos: hardware pointer position
  49. * @req_dma_chan: flag to release dev_to_dev chan
  50. * @private: pair private area
  51. * @complete: dma task complete
  52. * @sample_format: format of m2m
  53. * @rate: rate of m2m
  54. * @buf_len: buffer length of m2m
  55. * @dma_buffer: buffer pointers
  56. * @first_convert: start of conversion
  57. * @ratio_mod_flag: flag for new ratio modifier
  58. * @ratio_mod: ratio modification
  59. */
  60. struct fsl_asrc_pair {
  61. struct fsl_asrc *asrc;
  62. unsigned int error;
  63. enum asrc_pair_index index;
  64. unsigned int channels;
  65. struct dma_async_tx_descriptor *desc[2];
  66. struct dma_chan *dma_chan[2];
  67. struct imx_dma_data dma_data;
  68. unsigned int pos;
  69. bool req_dma_chan;
  70. void *private;
  71. /* used for m2m */
  72. struct completion complete[2];
  73. snd_pcm_format_t sample_format[2];
  74. unsigned int rate[2];
  75. unsigned int buf_len[2];
  76. struct snd_dma_buffer dma_buffer[2];
  77. unsigned int first_convert;
  78. bool ratio_mod_flag;
  79. unsigned int ratio_mod;
  80. };
  81. /**
  82. * fsl_asrc: ASRC common data
  83. *
  84. * @dma_params_rx: DMA parameters for receive channel
  85. * @dma_params_tx: DMA parameters for transmit channel
  86. * @pdev: platform device pointer
  87. * @regmap: regmap handler
  88. * @paddr: physical address to the base address of registers
  89. * @mem_clk: clock source to access register
  90. * @ipg_clk: clock source to drive peripheral
  91. * @spba_clk: SPBA clock (optional, depending on SoC design)
  92. * @card: compress sound card
  93. * @lock: spin lock for resource protection
  94. * @pair: pair pointers
  95. * @channel_avail: non-occupied channel numbers
  96. * @asrc_rate: default sample rate for ASoC Back-Ends
  97. * @asrc_format: default sample format for ASoC Back-Ends
  98. * @use_edma: edma is used
  99. * @start_before_dma: start asrc before dma
  100. * @get_dma_channel: function pointer
  101. * @request_pair: function pointer
  102. * @release_pair: function pointer
  103. * @get_fifo_addr: function pointer
  104. * @m2m_get_cap: function pointer
  105. * @m2m_prepare: function pointer
  106. * @m2m_start: function pointer
  107. * @m2m_unprepare: function pointer
  108. * @m2m_stop: function pointer
  109. * @m2m_output_ready: function pointer, check output fifo ready or not
  110. * @m2m_calc_out_len: function pointer
  111. * @m2m_get_maxburst: function pointer
  112. * @m2m_pair_suspend: function pointer
  113. * @m2m_pair_resume: function pointer
  114. * @m2m_set_ratio_mod: function pointer
  115. * @get_output_fifo_size: function pointer
  116. * @pair_priv_size: size of pair private struct.
  117. * @private: private data structure
  118. */
  119. struct fsl_asrc {
  120. struct snd_dmaengine_dai_dma_data dma_params_rx;
  121. struct snd_dmaengine_dai_dma_data dma_params_tx;
  122. struct platform_device *pdev;
  123. struct regmap *regmap;
  124. unsigned long paddr;
  125. struct clk *mem_clk;
  126. struct clk *ipg_clk;
  127. struct clk *spba_clk;
  128. struct snd_card *card;
  129. spinlock_t lock; /* spin lock for resource protection */
  130. struct fsl_asrc_pair *pair[PAIR_CTX_NUM];
  131. unsigned int channel_avail;
  132. int asrc_rate;
  133. snd_pcm_format_t asrc_format;
  134. bool use_edma;
  135. bool start_before_dma;
  136. struct dma_chan *(*get_dma_channel)(struct fsl_asrc_pair *pair, bool dir);
  137. int (*request_pair)(int channels, struct fsl_asrc_pair *pair);
  138. void (*release_pair)(struct fsl_asrc_pair *pair);
  139. int (*get_fifo_addr)(u8 dir, enum asrc_pair_index index);
  140. int (*m2m_get_cap)(struct fsl_asrc_m2m_cap *cap);
  141. int (*m2m_prepare)(struct fsl_asrc_pair *pair);
  142. int (*m2m_start)(struct fsl_asrc_pair *pair);
  143. int (*m2m_unprepare)(struct fsl_asrc_pair *pair);
  144. int (*m2m_stop)(struct fsl_asrc_pair *pair);
  145. bool (*m2m_output_ready)(struct fsl_asrc_pair *pair);
  146. int (*m2m_calc_out_len)(struct fsl_asrc_pair *pair, int input_buffer_length);
  147. int (*m2m_get_maxburst)(u8 dir, struct fsl_asrc_pair *pair);
  148. int (*m2m_pair_suspend)(struct fsl_asrc_pair *pair);
  149. int (*m2m_pair_resume)(struct fsl_asrc_pair *pair);
  150. int (*m2m_set_ratio_mod)(struct fsl_asrc_pair *pair, int val);
  151. unsigned int (*get_output_fifo_size)(struct fsl_asrc_pair *pair);
  152. size_t pair_priv_size;
  153. void *private;
  154. };
  155. #define DRV_NAME "fsl-asrc-dai"
  156. extern struct snd_soc_component_driver fsl_asrc_component;
  157. int fsl_asrc_m2m_init(struct fsl_asrc *asrc);
  158. void fsl_asrc_m2m_exit(struct fsl_asrc *asrc);
  159. int fsl_asrc_m2m_resume(struct fsl_asrc *asrc);
  160. int fsl_asrc_m2m_suspend(struct fsl_asrc *asrc);
  161. #endif /* _FSL_ASRC_COMMON_H */