sunxi-daudio.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413
  1. /*
  2. * Copyright (c) 2019-2025 Allwinner Technology Co., Ltd. ALL rights reserved.
  3. *
  4. * Allwinner is a trademark of Allwinner Technology Co.,Ltd., registered in
  5. * the the people's Republic of China and other countries.
  6. * All Allwinner Technology Co.,Ltd. trademarks are used with permission.
  7. *
  8. * DISCLAIMER
  9. * THIRD PARTY LICENCES MAY BE REQUIRED TO IMPLEMENT THE SOLUTION/PRODUCT.
  10. * IF YOU NEED TO INTEGRATE THIRD PARTY’S TECHNOLOGY (SONY, DTS, DOLBY, AVS OR MPEGLA, ETC.)
  11. * IN ALLWINNERS’SDK OR PRODUCTS, YOU SHALL BE SOLELY RESPONSIBLE TO OBTAIN
  12. * ALL APPROPRIATELY REQUIRED THIRD PARTY LICENCES.
  13. * ALLWINNER SHALL HAVE NO WARRANTY, INDEMNITY OR OTHER OBLIGATIONS WITH RESPECT TO MATTERS
  14. * COVERED UNDER ANY REQUIRED THIRD PARTY LICENSE.
  15. * YOU ARE SOLELY RESPONSIBLE FOR YOUR USAGE OF THIRD PARTY’S TECHNOLOGY.
  16. *
  17. *
  18. * THIS SOFTWARE IS PROVIDED BY ALLWINNER"AS IS" AND TO THE MAXIMUM EXTENT
  19. * PERMITTED BY LAW, ALLWINNER EXPRESSLY DISCLAIMS ALL WARRANTIES OF ANY KIND,
  20. * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION REGARDING
  21. * THE TITLE, NON-INFRINGEMENT, ACCURACY, CONDITION, COMPLETENESS, PERFORMANCE
  22. * OR MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  23. * IN NO EVENT SHALL ALLWINNER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  24. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  25. * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  26. * LOSS OF USE, DATA, OR PROFITS, OR BUSINESS INTERRUPTION)
  27. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  28. * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  29. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
  30. * OF THE POSSIBILITY OF SUCH DAMAGE.
  31. */
  32. #ifndef __SUNXI_DAUDIO_H_
  33. #define __SUNXI_DAUDIO_H_
  34. #include <aw_common.h>
  35. #include <hal_clk.h>
  36. #include <hal_reset.h>
  37. #include <hal_gpio.h>
  38. #include <sound/snd_core.h>
  39. #include <sound/snd_pcm.h>
  40. #include <sound/snd_io.h>
  41. #define DAUDIO_NAME_LEN (26)
  42. /* DAUDIO register definition */
  43. #define SUNXI_DAUDIO_CTL 0x00
  44. #define SUNXI_DAUDIO_FMT0 0x04
  45. #define SUNXI_DAUDIO_FMT1 0x08
  46. #define SUNXI_DAUDIO_INTSTA 0x0C
  47. #define SUNXI_DAUDIO_RXFIFO 0x10
  48. #define SUNXI_DAUDIO_FIFOCTL 0x14
  49. #define SUNXI_DAUDIO_FIFOSTA 0x18
  50. #define SUNXI_DAUDIO_INTCTL 0x1C
  51. #define SUNXI_DAUDIO_TXFIFO 0x20
  52. #define SUNXI_DAUDIO_CLKDIV 0x24
  53. #define SUNXI_DAUDIO_TXCNT 0x28
  54. #define SUNXI_DAUDIO_RXCNT 0x2C
  55. #define SUNXI_DAUDIO_CHCFG 0x30
  56. #define SUNXI_DAUDIO_TX0CHSEL 0x34
  57. #define SUNXI_DAUDIO_TX1CHSEL 0x38
  58. #define SUNXI_DAUDIO_TX2CHSEL 0x3C
  59. #define SUNXI_DAUDIO_TX3CHSEL 0x40
  60. #define SUNXI_DAUDIO_TX0CHMAP0 0x44
  61. #define SUNXI_DAUDIO_TX0CHMAP1 0x48
  62. #define SUNXI_DAUDIO_TX1CHMAP0 0x4C
  63. #define SUNXI_DAUDIO_TX1CHMAP1 0x50
  64. #define SUNXI_DAUDIO_TX2CHMAP0 0x54
  65. #define SUNXI_DAUDIO_TX2CHMAP1 0x58
  66. #define SUNXI_DAUDIO_TX3CHMAP0 0x5C
  67. #define SUNXI_DAUDIO_TX3CHMAP1 0x60
  68. #define SUNXI_DAUDIO_RXCHSEL 0x64
  69. #define SUNXI_DAUDIO_RXCHMAP0 0x68
  70. #define SUNXI_DAUDIO_RXCHMAP1 0x6C
  71. #define SUNXI_DAUDIO_RXCHMAP2 0x70
  72. #define SUNXI_DAUDIO_RXCHMAP3 0x74
  73. #define SUNXI_DAUDIO_DEBUG 0x78
  74. #define SUNXI_DAUDIO_REV 0x7C
  75. #define SUNXI_DAUDIO_ASRC_MCLKCFG 0x80
  76. #define SUNXI_DAUDIO_ASRC_FSOUTCFG 0x84
  77. #define SUNXI_DAUDIO_ASRC_FSIN_EXTCFG 0x88
  78. #define SUNXI_DAUDIO_ASRC_ASRCEN 0x8C
  79. #define SUNXI_DAUDIO_ASRC_MANCFG 0x90
  80. #define SUNXI_DAUDIO_ASRC_RATIOSTAT 0x94
  81. #define SUNXI_DAUDIO_ASRC_FIFOSTAT 0x98
  82. #define SUNXI_DAUDIO_ASRC_MBISTCFG 0x9C
  83. #define SUNXI_DAUDIO_ASRC_MBISTSTA 0xA0
  84. /* SUNXI_DAUDIO_CTL:0x00 */
  85. #define RX_SYNC_EN 21
  86. #define RX_EN_MUX 20
  87. #define BCLK_OUT 18
  88. #define LRCK_OUT 17
  89. #define LRCKR_CTL 16
  90. #define SDO3_EN 11
  91. #define SDO2_EN 10
  92. #define SDO1_EN 9
  93. #define SDO0_EN 8
  94. #define MUTE_CTL 6
  95. #define MODE_SEL 4
  96. #define LOOP_EN 3
  97. #define CTL_TXEN 2
  98. #define CTL_RXEN 1
  99. #define GLOBAL_EN 0
  100. /* SUNXI_DAUDIO_FMT0:0x04 */
  101. #define SDI_SYNC_SEL 31
  102. #define LRCK_WIDTH 30
  103. #define LRCKR_PERIOD 20
  104. #define LRCK_POLARITY 19
  105. #define LRCK_PERIOD 8
  106. #define BRCK_POLARITY 7
  107. #define DAUDIO_SAMPLE_RESOLUTION 4
  108. #define EDGE_TRANSFER 3
  109. #define SLOT_WIDTH 0
  110. /* SUNXI_DAUDIO_FMT1:0x08 */
  111. #define RX_MLS 7
  112. #define TX_MLS 6
  113. #define SEXT 4
  114. #define RX_PDM 2
  115. #define TX_PDM 0
  116. /* SUNXI_DAUDIO_INTSTA:0x0C */
  117. #define TXU_INT 6
  118. #define TXO_INT 5
  119. #define TXE_INT 4
  120. #define RXU_INT 2
  121. #define RXO_INT 1
  122. #define RXA_INT 0
  123. /* SUNXI_DAUDIO_FIFOCTL:0x14 */
  124. #define HUB_EN 31
  125. #define FIFO_CTL_FTX 25
  126. #define FIFO_CTL_FRX 24
  127. #define TXTL 12
  128. #define RXTL 4
  129. #define TXIM 2
  130. #define RXOM 0
  131. /* SUNXI_DAUDIO_FIFOSTA:0x18 */
  132. #define FIFO_TXE 28
  133. #define FIFO_TX_CNT 16
  134. #define FIFO_RXA 8
  135. #define FIFO_RX_CNT 0
  136. /* SUNXI_DAUDIO_INTCTL:0x1C */
  137. #define TXDRQEN 7
  138. #define TXUI_EN 6
  139. #define TXOI_EN 5
  140. #define TXEI_EN 4
  141. #define RXDRQEN 3
  142. #define RXUIEN 2
  143. #define RXOIEN 1
  144. #define RXAIEN 0
  145. /* SUNXI_DAUDIO_CLKDIV:0x24 */
  146. #define MCLKOUT_EN 8
  147. #define BCLK_DIV 4
  148. #define MCLK_DIV 0
  149. /* SUNXI_DAUDIO_CHCFG:0x30 */
  150. #define TX_SLOT_HIZ 9
  151. #define TX_STATE 8
  152. #define RX_SLOT_NUM 4
  153. #define TX_SLOT_NUM 0
  154. /* SUNXI_DAUDIO_TXnCHSEL:0X34+n*0x04 */
  155. #define TX_OFFSET 20
  156. #define TX_CHSEL 16
  157. #define TX_CHEN 0
  158. /* SUNXI_DAUDIO_RXCHSEL */
  159. #define RX_OFFSET 20
  160. #define RX_CHSEL 16
  161. /* sun8iw10 CHMAP default setting */
  162. #define SUNXI_DEFAULT_CHMAP0 0xFEDCBA98
  163. #define SUNXI_DEFAULT_CHMAP1 0x76543210
  164. /* RXCHMAP default setting */
  165. #define SUNXI_DEFAULT_CHMAP 0x76543210
  166. /* Shift & Mask define */
  167. /* SUNXI_DAUDIO_CTL:0x00 */
  168. #define SUNXI_DAUDIO_MODE_CTL_MASK 3
  169. #define SUNXI_DAUDIO_MODE_CTL_PCM 0
  170. #define SUNXI_DAUDIO_MODE_CTL_I2S 1
  171. #define SUNXI_DAUDIO_MODE_CTL_LEFT 1
  172. #define SUNXI_DAUDIO_MODE_CTL_RIGHT 2
  173. #define SUNXI_DAUDIO_MODE_CTL_REVD 3
  174. /* combine LRCK_CLK & BCLK setting */
  175. #define SUNXI_DAUDIO_LRCK_OUT_MASK 3
  176. #define SUNXI_DAUDIO_LRCK_OUT_DISABLE 0
  177. #define SUNXI_DAUDIO_LRCK_OUT_ENABLE 3
  178. /* SUNXI_DAUDIO_FMT0 */
  179. #define SUNXI_DAUDIO_LRCK_PERIOD_MASK 0x3FF
  180. #define SUNXI_DAUDIO_SLOT_WIDTH_MASK 7
  181. /* Left Blank */
  182. #define SUNXI_DAUDIO_SR_MASK 7
  183. #define SUNXI_DAUDIO_SR_16BIT 3
  184. #define SUNXI_DAUDIO_SR_24BIT 5
  185. #define SUNXI_DAUDIO_SR_32BIT 7
  186. #define SUNXI_DAUDIO_LRCK_POLARITY_NOR 0
  187. #define SUNXI_DAUDIO_LRCK_POLARITY_INV 1
  188. #define SUNXI_DAUDIO_BCLK_POLARITY_NOR 0
  189. #define SUNXI_DAUDIO_BCLK_POLARITY_INV 1
  190. /* SUNXI_DAUDIO_FMT1 */
  191. #define SUNXI_DAUDIO_FMT1_DEF 0x30
  192. /* SUNXI_DAUDIO_FIFOCTL */
  193. #define SUNXI_DAUDIO_TXIM_MASK 1
  194. #define SUNXI_DAUDIO_TXIM_VALID_MSB 0
  195. #define SUNXI_DAUDIO_TXIM_VALID_LSB 1
  196. /* Left Blank */
  197. #define SUNXI_DAUDIO_RXOM_MASK 3
  198. /* Expanding 0 at LSB of RX_FIFO */
  199. #define SUNXI_DAUDIO_RXOM_EXP0 0
  200. /* Expanding sample bit at MSB of RX_FIFO */
  201. #define SUNXI_DAUDIO_RXOM_EXPH 1
  202. /* Fill RX_FIFO low word be 0 */
  203. #define SUNXI_DAUDIO_RXOM_TUNL 2
  204. /* Fill RX_FIFO high word be higher sample bit */
  205. #define SUNXI_DAUDIO_RXOM_TUNH 3
  206. /* SUNXI_DAUDIO_CLKDIV */
  207. #define SUNXI_DAUDIO_BCLK_DIV_MASK 0xF
  208. #define SUNXI_DAUDIO_BCLK_DIV_1 1
  209. #define SUNXI_DAUDIO_BCLK_DIV_2 2
  210. #define SUNXI_DAUDIO_BCLK_DIV_3 3
  211. #define SUNXI_DAUDIO_BCLK_DIV_4 4
  212. #define SUNXI_DAUDIO_BCLK_DIV_5 5
  213. #define SUNXI_DAUDIO_BCLK_DIV_6 6
  214. #define SUNXI_DAUDIO_BCLK_DIV_7 7
  215. #define SUNXI_DAUDIO_BCLK_DIV_8 8
  216. #define SUNXI_DAUDIO_BCLK_DIV_9 9
  217. #define SUNXI_DAUDIO_BCLK_DIV_10 10
  218. #define SUNXI_DAUDIO_BCLK_DIV_11 11
  219. #define SUNXI_DAUDIO_BCLK_DIV_12 12
  220. #define SUNXI_DAUDIO_BCLK_DIV_13 13
  221. #define SUNXI_DAUDIO_BCLK_DIV_14 14
  222. #define SUNXI_DAUDIO_BCLK_DIV_15 15
  223. /* Left Blank */
  224. #define SUNXI_DAUDIO_MCLK_DIV_MASK 0xF
  225. #define SUNXI_DAUDIO_MCLK_DIV_1 1
  226. #define SUNXI_DAUDIO_MCLK_DIV_2 2
  227. #define SUNXI_DAUDIO_MCLK_DIV_3 3
  228. #define SUNXI_DAUDIO_MCLK_DIV_4 4
  229. #define SUNXI_DAUDIO_MCLK_DIV_5 5
  230. #define SUNXI_DAUDIO_MCLK_DIV_6 6
  231. #define SUNXI_DAUDIO_MCLK_DIV_7 7
  232. #define SUNXI_DAUDIO_MCLK_DIV_8 8
  233. #define SUNXI_DAUDIO_MCLK_DIV_9 9
  234. #define SUNXI_DAUDIO_MCLK_DIV_10 10
  235. #define SUNXI_DAUDIO_MCLK_DIV_11 11
  236. #define SUNXI_DAUDIO_MCLK_DIV_12 12
  237. #define SUNXI_DAUDIO_MCLK_DIV_13 13
  238. #define SUNXI_DAUDIO_MCLK_DIV_14 14
  239. #define SUNXI_DAUDIO_MCLK_DIV_15 15
  240. /* SUNXI_DAUDIO_CHCFG */
  241. #define SUNXI_DAUDIO_TX_SLOT_MASK 0XF
  242. #define SUNXI_DAUDIO_RX_SLOT_MASK 0XF
  243. /* SUNXI_DAUDIO_TX0CHSEL: */
  244. #define SUNXI_DAUDIO_TX_OFFSET_MASK 3
  245. #define SUNXI_DAUDIO_TX_OFFSET_0 0
  246. #define SUNXI_DAUDIO_TX_OFFSET_1 1
  247. /* Left Blank */
  248. #define SUNXI_DAUDIO_TX_CHEN_MASK 0xFFFF
  249. #define SUNXI_DAUDIO_TX_CHSEL_MASK 0xF
  250. /* SUNXI_DAUDIO_RXCHSEL */
  251. #define SUNXI_DAUDIO_RX_OFFSET_MASK 3
  252. #define SUNXI_DAUDIO_RX_CHSEL_MASK 0XF
  253. #define DAUDIO_RXCH_DEF_MAP(x) (x << ((x%4)<<3))
  254. #define DAUDIO_RXCHMAP(x) (0x1f << ((x%4)<<3))
  255. /* SUNXI_DAUDIO_ASRC_MCLKCFG:0x80 */
  256. #define DAUDIO_ASRC_MCLK_GATE 16
  257. #define DAUDIO_ASRC_MCLK_RATIO 0
  258. /* SUNXI_DAUDIO_ASRC_FSOUTCFG:0x84 */
  259. #define DAUDIO_ASRC_FSOUT_GATE 20
  260. #define DAUDIO_ASRC_FSOUT_CLKSRC 16
  261. #define DAUDIO_ASRC_FSOUT_CLKDIV1 4
  262. #define DAUDIO_ASRC_FSOUT_CLKDIV2 0
  263. /* SUNXI_DAUDIO_ASRC_FSIN_EXTCFG:0x88 */
  264. #define DAUDIO_ASRC_FSIN_EXTEN 16
  265. #define DAUDIO_ASRC_FSIN_EXTCYCLE 0
  266. /* SUNXI_DAUDIO_ASRC_ASRCEN:0x8C */
  267. #define DAUDIO_ASRC_ASRCEN 0
  268. /* SUNXI_DAUDIO_ASRC_MANCFG:0x90 */
  269. #define DAUDIO_ASRC_MANRATIOEN 31
  270. #define DAUDIO_ASRC_MAN_RATIO 0
  271. /* SUNXI_DAUDIO_ASRC_RATIOSTAT:0x94 */
  272. /* SUNXI_DAUDIO_ASRC_FIFOSTAT:0x98 */
  273. /* SUNXI_DAUDIO_ASRC_MBISTCFG:0x9C */
  274. /* SUNXI_DAUDIO_ASRC_MBISTSTA:0xA0 */
  275. /* DRQ Type */
  276. #ifndef DRQDST_DAUDIO_0_TX
  277. #define DRQDST_DAUDIO_0_TX 3
  278. #endif
  279. #ifndef DRQDST_DAUDIO_1_TX
  280. #define DRQDST_DAUDIO_1_TX 4
  281. #endif
  282. #ifndef DRQDST_DAUDIO_2_TX
  283. #define DRQDST_DAUDIO_2_TX 4
  284. #endif
  285. #ifndef DRQSRC_DAUDIO_0_RX
  286. #define DRQSRC_DAUDIO_0_RX 3
  287. #endif
  288. #ifndef DRQSRC_DAUDIO_1_RX
  289. #define DRQSRC_DAUDIO_1_RX 4
  290. #endif
  291. #ifndef DRQSRC_DAUDIO_2_RX
  292. #define DRQSRC_DAUDIO_2_RX 4
  293. #endif
  294. #define SUNXI_DAUDIO_RATES (SNDRV_PCM_RATE_8000_192000 \
  295. | SNDRV_PCM_RATE_KNOT)
  296. #define SUNXI_DAUDIO_DRQDST(sunxi_daudio, x) \
  297. ((sunxi_daudio)->playback_dma_param.dma_drq_type_num = \
  298. DRQDST_DAUDIO_##x##_TX)
  299. #define SUNXI_DAUDIO_DRQSRC(sunxi_daudio, x) \
  300. ((sunxi_daudio)->capture_dma_param.dma_drq_type_num = \
  301. DRQSRC_DAUDIO_##x##_RX)
  302. /*to clear FIFO*/
  303. #define SUNXI_DAUDIO_FTX_TIMES 1
  304. /* SUNXI_DAUDIO_HUB_ENABLE: Whether to use the hub mode */
  305. #define SUNXI_DAUDIO_HUB_ENABLE
  306. enum sunxi_daudio_clk_parent {
  307. SUNXI_MODULE_CLK_PLL_AUDIO,
  308. SUNXI_MODULE_CLK_PLL_AUDIOX4,
  309. };
  310. struct sunxi_daudio_param {
  311. uint8_t tdm_num;
  312. uint8_t daudio_master;
  313. uint8_t audio_format;
  314. uint8_t signal_inversion;
  315. uint16_t pcm_lrck_period;
  316. uint8_t msb_lsb_first:1;
  317. uint8_t sign_extend:2;
  318. uint8_t tx_data_mode:2;
  319. uint8_t rx_data_mode:2;
  320. uint8_t slot_width_select;
  321. uint8_t frametype;
  322. uint8_t tdm_config;
  323. uint16_t mclk_div;
  324. uint16_t playback_pcm_kbytes;
  325. uint16_t capture_pcm_kbytes;
  326. };
  327. struct daudio_pinctrl {
  328. gpio_pin_t gpio_pin;
  329. uint8_t mux;
  330. uint8_t driv_level;
  331. };
  332. struct sunxi_daudio_info {
  333. struct snd_platform *platform;
  334. hal_clk_t pllclk;
  335. hal_clk_t moduleclk;
  336. hal_clk_t busclk;
  337. hal_clk_t pllclk1;
  338. hal_clk_t asrcclk;
  339. struct reset_control *rstclk;
  340. struct daudio_pinctrl *pinctrl;
  341. uint8_t pinctrl_num;
  342. struct sunxi_daudio_param param;
  343. struct sunxi_dma_params playback_dma_param;
  344. struct sunxi_dma_params capture_dma_param;
  345. uint8_t global_enable;
  346. unsigned int hub_mode;
  347. bool playback_en;
  348. bool capture_en;
  349. int asrc_en;
  350. };
  351. #if defined(CONFIG_ARCH_SUN8IW18P1)
  352. #include "platforms/daudio-sun8iw18.h"
  353. #endif
  354. #if defined(CONFIG_ARCH_SUN8IW19)
  355. #include "platforms/daudio-sun8iw19.h"
  356. #endif
  357. #if defined(CONFIG_ARCH_SUN8IW20) || defined(CONFIG_SOC_SUN20IW1)
  358. #include "platforms/daudio-sun8iw20.h"
  359. #endif
  360. #endif /* __SUNXI_DAUDIO_H_ */