q6afe.h 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef __Q6AFE_H__
  3. #define __Q6AFE_H__
  4. #define AFE_PORT_MAX 129
  5. #define MSM_AFE_PORT_TYPE_RX 0
  6. #define MSM_AFE_PORT_TYPE_TX 1
  7. #define AFE_MAX_PORTS AFE_PORT_MAX
  8. #define Q6AFE_MAX_MI2S_LINES 4
  9. #define AFE_MAX_CHAN_COUNT 8
  10. #define AFE_PORT_MAX_AUDIO_CHAN_CNT 0x8
  11. #define Q6AFE_LPASS_CLK_SRC_INTERNAL 1
  12. #define Q6AFE_LPASS_CLK_ROOT_DEFAULT 0
  13. #define LPAIF_DIG_CLK 1
  14. #define LPAIF_BIT_CLK 2
  15. #define LPAIF_OSR_CLK 3
  16. /* Clock ID for Primary I2S IBIT */
  17. #define Q6AFE_LPASS_CLK_ID_PRI_MI2S_IBIT 0x100
  18. /* Clock ID for Primary I2S EBIT */
  19. #define Q6AFE_LPASS_CLK_ID_PRI_MI2S_EBIT 0x101
  20. /* Clock ID for Secondary I2S IBIT */
  21. #define Q6AFE_LPASS_CLK_ID_SEC_MI2S_IBIT 0x102
  22. /* Clock ID for Secondary I2S EBIT */
  23. #define Q6AFE_LPASS_CLK_ID_SEC_MI2S_EBIT 0x103
  24. /* Clock ID for Tertiary I2S IBIT */
  25. #define Q6AFE_LPASS_CLK_ID_TER_MI2S_IBIT 0x104
  26. /* Clock ID for Tertiary I2S EBIT */
  27. #define Q6AFE_LPASS_CLK_ID_TER_MI2S_EBIT 0x105
  28. /* Clock ID for Quartnery I2S IBIT */
  29. #define Q6AFE_LPASS_CLK_ID_QUAD_MI2S_IBIT 0x106
  30. /* Clock ID for Quartnery I2S EBIT */
  31. #define Q6AFE_LPASS_CLK_ID_QUAD_MI2S_EBIT 0x107
  32. /* Clock ID for Speaker I2S IBIT */
  33. #define Q6AFE_LPASS_CLK_ID_SPEAKER_I2S_IBIT 0x108
  34. /* Clock ID for Speaker I2S EBIT */
  35. #define Q6AFE_LPASS_CLK_ID_SPEAKER_I2S_EBIT 0x109
  36. /* Clock ID for Speaker I2S OSR */
  37. #define Q6AFE_LPASS_CLK_ID_SPEAKER_I2S_OSR 0x10A
  38. /* Clock ID for QUINARY I2S IBIT */
  39. #define Q6AFE_LPASS_CLK_ID_QUI_MI2S_IBIT 0x10B
  40. /* Clock ID for QUINARY I2S EBIT */
  41. #define Q6AFE_LPASS_CLK_ID_QUI_MI2S_EBIT 0x10C
  42. /* Clock ID for SENARY I2S IBIT */
  43. #define Q6AFE_LPASS_CLK_ID_SEN_MI2S_IBIT 0x10D
  44. /* Clock ID for SENARY I2S EBIT */
  45. #define Q6AFE_LPASS_CLK_ID_SEN_MI2S_EBIT 0x10E
  46. /* Clock ID for INT0 I2S IBIT */
  47. #define Q6AFE_LPASS_CLK_ID_INT0_MI2S_IBIT 0x10F
  48. /* Clock ID for INT1 I2S IBIT */
  49. #define Q6AFE_LPASS_CLK_ID_INT1_MI2S_IBIT 0x110
  50. /* Clock ID for INT2 I2S IBIT */
  51. #define Q6AFE_LPASS_CLK_ID_INT2_MI2S_IBIT 0x111
  52. /* Clock ID for INT3 I2S IBIT */
  53. #define Q6AFE_LPASS_CLK_ID_INT3_MI2S_IBIT 0x112
  54. /* Clock ID for INT4 I2S IBIT */
  55. #define Q6AFE_LPASS_CLK_ID_INT4_MI2S_IBIT 0x113
  56. /* Clock ID for INT5 I2S IBIT */
  57. #define Q6AFE_LPASS_CLK_ID_INT5_MI2S_IBIT 0x114
  58. /* Clock ID for INT6 I2S IBIT */
  59. #define Q6AFE_LPASS_CLK_ID_INT6_MI2S_IBIT 0x115
  60. /* Clock ID for QUINARY MI2S OSR CLK */
  61. #define Q6AFE_LPASS_CLK_ID_QUI_MI2S_OSR 0x116
  62. /* Clock ID for Primary PCM IBIT */
  63. #define Q6AFE_LPASS_CLK_ID_PRI_PCM_IBIT 0x200
  64. /* Clock ID for Primary PCM EBIT */
  65. #define Q6AFE_LPASS_CLK_ID_PRI_PCM_EBIT 0x201
  66. /* Clock ID for Secondary PCM IBIT */
  67. #define Q6AFE_LPASS_CLK_ID_SEC_PCM_IBIT 0x202
  68. /* Clock ID for Secondary PCM EBIT */
  69. #define Q6AFE_LPASS_CLK_ID_SEC_PCM_EBIT 0x203
  70. /* Clock ID for Tertiary PCM IBIT */
  71. #define Q6AFE_LPASS_CLK_ID_TER_PCM_IBIT 0x204
  72. /* Clock ID for Tertiary PCM EBIT */
  73. #define Q6AFE_LPASS_CLK_ID_TER_PCM_EBIT 0x205
  74. /* Clock ID for Quartery PCM IBIT */
  75. #define Q6AFE_LPASS_CLK_ID_QUAD_PCM_IBIT 0x206
  76. /* Clock ID for Quartery PCM EBIT */
  77. #define Q6AFE_LPASS_CLK_ID_QUAD_PCM_EBIT 0x207
  78. /* Clock ID for Quinary PCM IBIT */
  79. #define Q6AFE_LPASS_CLK_ID_QUIN_PCM_IBIT 0x208
  80. /* Clock ID for Quinary PCM EBIT */
  81. #define Q6AFE_LPASS_CLK_ID_QUIN_PCM_EBIT 0x209
  82. /* Clock ID for QUINARY PCM OSR */
  83. #define Q6AFE_LPASS_CLK_ID_QUI_PCM_OSR 0x20A
  84. /** Clock ID for Primary TDM IBIT */
  85. #define Q6AFE_LPASS_CLK_ID_PRI_TDM_IBIT 0x200
  86. /** Clock ID for Primary TDM EBIT */
  87. #define Q6AFE_LPASS_CLK_ID_PRI_TDM_EBIT 0x201
  88. /** Clock ID for Secondary TDM IBIT */
  89. #define Q6AFE_LPASS_CLK_ID_SEC_TDM_IBIT 0x202
  90. /** Clock ID for Secondary TDM EBIT */
  91. #define Q6AFE_LPASS_CLK_ID_SEC_TDM_EBIT 0x203
  92. /** Clock ID for Tertiary TDM IBIT */
  93. #define Q6AFE_LPASS_CLK_ID_TER_TDM_IBIT 0x204
  94. /** Clock ID for Tertiary TDM EBIT */
  95. #define Q6AFE_LPASS_CLK_ID_TER_TDM_EBIT 0x205
  96. /** Clock ID for Quartery TDM IBIT */
  97. #define Q6AFE_LPASS_CLK_ID_QUAD_TDM_IBIT 0x206
  98. /** Clock ID for Quartery TDM EBIT */
  99. #define Q6AFE_LPASS_CLK_ID_QUAD_TDM_EBIT 0x207
  100. /** Clock ID for Quinary TDM IBIT */
  101. #define Q6AFE_LPASS_CLK_ID_QUIN_TDM_IBIT 0x208
  102. /** Clock ID for Quinary TDM EBIT */
  103. #define Q6AFE_LPASS_CLK_ID_QUIN_TDM_EBIT 0x209
  104. /** Clock ID for Quinary TDM OSR */
  105. #define Q6AFE_LPASS_CLK_ID_QUIN_TDM_OSR 0x20A
  106. /* Clock ID for MCLK1 */
  107. #define Q6AFE_LPASS_CLK_ID_MCLK_1 0x300
  108. /* Clock ID for MCLK2 */
  109. #define Q6AFE_LPASS_CLK_ID_MCLK_2 0x301
  110. /* Clock ID for MCLK3 */
  111. #define Q6AFE_LPASS_CLK_ID_MCLK_3 0x302
  112. /* Clock ID for MCLK4 */
  113. #define Q6AFE_LPASS_CLK_ID_MCLK_4 0x304
  114. /* Clock ID for Internal Digital Codec Core */
  115. #define Q6AFE_LPASS_CLK_ID_INTERNAL_DIGITAL_CODEC_CORE 0x303
  116. /* Clock ID for INT MCLK0 */
  117. #define Q6AFE_LPASS_CLK_ID_INT_MCLK_0 0x305
  118. /* Clock ID for INT MCLK1 */
  119. #define Q6AFE_LPASS_CLK_ID_INT_MCLK_1 0x306
  120. #define Q6AFE_LPASS_CLK_ID_WSA_CORE_MCLK 0x309
  121. #define Q6AFE_LPASS_CLK_ID_WSA_CORE_NPL_MCLK 0x30a
  122. #define Q6AFE_LPASS_CLK_ID_TX_CORE_MCLK 0x30c
  123. #define Q6AFE_LPASS_CLK_ID_TX_CORE_NPL_MCLK 0x30d
  124. #define Q6AFE_LPASS_CLK_ID_RX_CORE_MCLK 0x30e
  125. #define Q6AFE_LPASS_CLK_ID_RX_CORE_NPL_MCLK 0x30f
  126. #define Q6AFE_LPASS_CLK_ID_VA_CORE_MCLK 0x30b
  127. #define Q6AFE_LPASS_CLK_ID_VA_CORE_2X_MCLK 0x310
  128. #define Q6AFE_LPASS_CORE_AVTIMER_BLOCK 0x2
  129. #define Q6AFE_LPASS_CORE_HW_MACRO_BLOCK 0x3
  130. #define Q6AFE_LPASS_CORE_HW_DCODEC_BLOCK 0x4
  131. /* Clock attribute for invalid use (reserved for internal usage) */
  132. #define Q6AFE_LPASS_CLK_ATTRIBUTE_INVALID 0x0
  133. /* Clock attribute for no couple case */
  134. #define Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO 0x1
  135. /* Clock attribute for dividend couple case */
  136. #define Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_DIVIDEND 0x2
  137. /* Clock attribute for divisor couple case */
  138. #define Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_DIVISOR 0x3
  139. /* Clock attribute for invert and no couple case */
  140. #define Q6AFE_LPASS_CLK_ATTRIBUTE_INVERT_COUPLE_NO 0x4
  141. #define Q6AFE_CMAP_INVALID 0xFFFF
  142. struct q6afe_hdmi_cfg {
  143. u16 datatype;
  144. u16 channel_allocation;
  145. u32 sample_rate;
  146. u16 bit_width;
  147. };
  148. struct q6afe_slim_cfg {
  149. u32 sample_rate;
  150. u16 bit_width;
  151. u16 data_format;
  152. u16 num_channels;
  153. u8 ch_mapping[AFE_MAX_CHAN_COUNT];
  154. };
  155. struct q6afe_i2s_cfg {
  156. u32 sample_rate;
  157. u16 bit_width;
  158. u16 data_format;
  159. u16 num_channels;
  160. u32 sd_line_mask;
  161. int fmt;
  162. };
  163. struct q6afe_tdm_cfg {
  164. u16 num_channels;
  165. u32 sample_rate;
  166. u16 bit_width;
  167. u16 data_format;
  168. u16 sync_mode;
  169. u16 sync_src;
  170. u16 nslots_per_frame;
  171. u16 slot_width;
  172. u16 slot_mask;
  173. u32 data_align_type;
  174. u16 ch_mapping[AFE_MAX_CHAN_COUNT];
  175. };
  176. struct q6afe_cdc_dma_cfg {
  177. u16 sample_rate;
  178. u16 bit_width;
  179. u16 data_format;
  180. u16 num_channels;
  181. u16 active_channels_mask;
  182. };
  183. struct q6afe_port_config {
  184. struct q6afe_hdmi_cfg hdmi;
  185. struct q6afe_slim_cfg slim;
  186. struct q6afe_i2s_cfg i2s_cfg;
  187. struct q6afe_tdm_cfg tdm;
  188. struct q6afe_cdc_dma_cfg dma_cfg;
  189. };
  190. struct q6afe_port;
  191. struct q6afe_port *q6afe_port_get_from_id(struct device *dev, int id);
  192. int q6afe_port_start(struct q6afe_port *port);
  193. int q6afe_port_stop(struct q6afe_port *port);
  194. void q6afe_port_put(struct q6afe_port *port);
  195. int q6afe_get_port_id(int index);
  196. void q6afe_hdmi_port_prepare(struct q6afe_port *port,
  197. struct q6afe_hdmi_cfg *cfg);
  198. void q6afe_slim_port_prepare(struct q6afe_port *port,
  199. struct q6afe_slim_cfg *cfg);
  200. int q6afe_i2s_port_prepare(struct q6afe_port *port, struct q6afe_i2s_cfg *cfg);
  201. void q6afe_tdm_port_prepare(struct q6afe_port *port, struct q6afe_tdm_cfg *cfg);
  202. void q6afe_cdc_dma_port_prepare(struct q6afe_port *port,
  203. struct q6afe_cdc_dma_cfg *cfg);
  204. int q6afe_port_set_sysclk(struct q6afe_port *port, int clk_id,
  205. int clk_src, int clk_root,
  206. unsigned int freq, int dir);
  207. int q6afe_set_lpass_clock(struct device *dev, int clk_id, int attri,
  208. int clk_root, unsigned int freq);
  209. int q6afe_vote_lpass_core_hw(struct device *dev, uint32_t hw_block_id,
  210. const char *client_name, uint32_t *client_handle);
  211. int q6afe_unvote_lpass_core_hw(struct device *dev, uint32_t hw_block_id,
  212. uint32_t client_handle);
  213. #endif /* __Q6AFE_H__ */