q6afe.h 7.9 KB

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