board.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602
  1. /*
  2. * Copyright (c) 2019 Actions Semiconductor Co., Ltd
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. /**
  7. * @file
  8. * @brief board init functions
  9. */
  10. #include <kernel.h>
  11. #include <init.h>
  12. #include <device.h>
  13. #include <soc.h>
  14. #include "board.h"
  15. #include <drivers/gpio.h>
  16. #include <board_cfg.h>
  17. #define CONFIG_GPIO_HIGHZ (0x1000)
  18. static const struct acts_pin_config board_pin_config[] = {
  19. /*UART0 */
  20. #if IS_ENABLED(CONFIG_UART_0)
  21. /* uart0 tx */
  22. PIN_MFP_SET(GPIO_28, UART0_MFP_CFG),
  23. /* uart0 rx */
  24. PIN_MFP_SET(GPIO_29, UART0_MFP_CFG),
  25. #endif
  26. /*UART1 */
  27. #if IS_ENABLED(CONFIG_UART_1)
  28. /* uart1 tx */
  29. PIN_MFP_SET(GPIO_16, UART1_MFP_CFG),
  30. /* uart1 rx */
  31. PIN_MFP_SET(GPIO_17, UART1_MFP_CFG),
  32. #endif
  33. #if IS_ENABLED(CONFIG_SPI_FLASH_0)
  34. /* SPI0 CS */
  35. PIN_MFP_SET(GPIO_0, SPINOR_MFP_CFG),
  36. /* SPI0 MISO */
  37. PIN_MFP_SET(GPIO_1, SPINOR_MFP_CFG),
  38. /* SPI0 CLK */
  39. PIN_MFP_SET(GPIO_2, SPINOR_MFP_CFG),
  40. /* SPI0 MOSI */
  41. PIN_MFP_SET(GPIO_3, SPINOR_MFP_CFG),
  42. /* SPI0 IO2 */
  43. PIN_MFP_SET(GPIO_6, SPINOR_MFP_PU_CFG),
  44. /* SPI0 IO3 */
  45. PIN_MFP_SET(GPIO_7, SPINOR_MFP_PU_CFG),
  46. #endif
  47. #if IS_ENABLED(CONFIG_I2CMT_0)
  48. /* I2C CLK*/
  49. PIN_MFP_SET(GPIO_18, I2CMT_MFP_CFG(MFP0_I2CMT)),
  50. /* I2C DATA*/
  51. PIN_MFP_SET(GPIO_19, I2CMT_MFP_CFG(MFP0_I2CMT)),
  52. #endif
  53. #if IS_ENABLED(CONFIG_I2CMT_1)
  54. /* I2C CLK*/
  55. PIN_MFP_SET(GPIO_55, I2CMT_MFP_CFG(MFP1_I2CMT)),
  56. /* I2C DATA*/
  57. PIN_MFP_SET(GPIO_56, I2CMT_MFP_CFG(MFP1_I2CMT)),
  58. #endif
  59. #if IS_ENABLED(CONFIG_I2C_0)
  60. /* I2C CLK*/
  61. PIN_MFP_SET(GPIO_57, I2C_MFP_CFG(MFP0_I2C)),
  62. /* I2C DATA*/
  63. PIN_MFP_SET(GPIO_58, I2C_MFP_CFG(MFP0_I2C)),
  64. #endif
  65. #if IS_ENABLED(CONFIG_I2C_1)
  66. /* I2C CLK*/
  67. PIN_MFP_SET(GPIO_51, I2C_MFP_CFG(MFP1_I2C)),
  68. /* I2C DATA*/
  69. PIN_MFP_SET(GPIO_52, I2C_MFP_CFG(MFP1_I2C)),
  70. #endif
  71. #if IS_ENABLED(CONFIG_I2C_2)
  72. /* I2C CLK*/
  73. PIN_MFP_SET(GPIO_61, I2C_MFP_CFG(MFP2_I2C)),
  74. /* I2C DATA*/
  75. PIN_MFP_SET(GPIO_62, I2C_MFP_CFG(MFP2_I2C)),
  76. #endif
  77. #if IS_ENABLED(CONFIG_I2C_3)
  78. /* I2C CLK*/
  79. PIN_MFP_SET(GPIO_60, I2C_MFP_CFG(MFP3_I2C)),
  80. /* I2C DATA*/
  81. PIN_MFP_SET(GPIO_59, I2C_MFP_CFG(MFP3_I2C)),
  82. #endif
  83. #if IS_ENABLED(CONFIG_CEC)
  84. PIN_MFP_SET(GPIO_12, CEC_MFP_CFG),
  85. #endif
  86. #if IS_ENABLED(CONFIG_SPINAND_3)
  87. /*SPI3 IO2*/
  88. PIN_MFP_SET(GPIO_8, SPINAND_MFP_PU_CFG),
  89. /*SPI3 IO3*/
  90. PIN_MFP_SET(GPIO_9, SPINAND_MFP_PU_CFG),
  91. /*SPI3 SS*/
  92. PIN_MFP_SET(GPIO_10, SPINAND_MFP_CFG),
  93. /*SPI3 CLK*/
  94. PIN_MFP_SET(GPIO_11, SPINAND_MFP_CFG),
  95. /*SPI3 IO1*/
  96. PIN_MFP_SET(GPIO_12, SPINAND_MFP_CFG),
  97. /*SPI3 IO0*/
  98. PIN_MFP_SET(GPIO_13, SPINAND_MFP_CFG),
  99. #endif
  100. #if IS_ENABLED(CONFIG_AUDIO_I2SRX_0)
  101. /*I2SRX0 mclk*/
  102. PIN_MFP_SET(GPIO_53, I2SRX_MFP_CFG),
  103. /*I2SRX0 bclk*/
  104. PIN_MFP_SET(GPIO_54, I2SRX_MFP_CFG),
  105. /*I2SRX0 lrclk*/
  106. PIN_MFP_SET(GPIO_55, I2SRX_MFP_CFG),
  107. /*I2SRX0 d0*/
  108. PIN_MFP_SET(GPIO_56, I2SRX_MFP_CFG),
  109. #endif
  110. #if IS_ENABLED(CONFIG_SPI_1)
  111. /*SPI SS*/
  112. PIN_MFP_SET(GPIO_24, SPI_MFP_CFG(MFP_SPI1)),
  113. /* SPI CLK*/
  114. PIN_MFP_SET(GPIO_25, SPI_MFP_CFG(MFP_SPI1)),
  115. /* SPI MISO*/
  116. PIN_MFP_SET(GPIO_26, SPI_MFP_CFG(MFP_SPI1)),
  117. /* SPI MOSI*/
  118. PIN_MFP_SET(GPIO_27, SPI_MFP_CFG(MFP_SPI1)),
  119. #endif
  120. #if IS_ENABLED(CONFIG_SPI_2)
  121. /*SPI SS*/
  122. PIN_MFP_SET(GPIO_30, SPI_MFP_CFG(MFP_SPI2)),
  123. /* SPI CLK*/
  124. PIN_MFP_SET(GPIO_31, SPI_MFP_CFG(MFP_SPI2)),
  125. /* SPI MISO*/
  126. PIN_MFP_SET(GPIO_32, SPI_MFP_CFG(MFP_SPI2)),
  127. /* SPI MOSI*/
  128. PIN_MFP_SET(GPIO_33, SPI_MFP_CFG(MFP_SPI2)),
  129. #endif
  130. #if IS_ENABLED(CONFIG_SPI_3)
  131. /*SPI SS*/
  132. PIN_MFP_SET(GPIO_20, SPI_MFP_CFG(MFP_SPI3)),
  133. /* SPI CLK*/
  134. PIN_MFP_SET(GPIO_21, SPI_MFP_CFG(MFP_SPI3)),
  135. /* SPI MISO*/
  136. PIN_MFP_SET(GPIO_22, SPI_MFP_CFG(MFP_SPI3)),
  137. /* SPI MOSI*/
  138. PIN_MFP_SET(GPIO_23, SPI_MFP_CFG(MFP_SPI3)),
  139. #endif
  140. #if IS_ENABLED(CONFIG_SPIMT_0)
  141. /* SPI SS*/
  142. PIN_MFP_SET(GPIO_49, SPIMT_MFP_CFG(MFP0_SPIMT)),
  143. /* SPI CLK*/
  144. PIN_MFP_SET(GPIO_50, SPIMT_MFP_CFG(MFP0_SPIMT)),
  145. /* SPI MISO*/
  146. PIN_MFP_SET(GPIO_51, SPIMT_MFP_CFG(MFP0_SPIMT)),
  147. /* SPI MOSI*/
  148. PIN_MFP_SET(GPIO_52, SPIMT_MFP_CFG(MFP0_SPIMT)),
  149. /* SPI SS1*/
  150. PIN_MFP_SET(GPIO_61, SPIMT_MFP_CFG(MFP0_SPIMT)),
  151. #endif
  152. #if IS_ENABLED(CONFIG_SPIMT_1)
  153. /* SPI SS*/
  154. PIN_MFP_SET(GPIO_53, SPIMT_MFP_CFG(MFP1_SPIMT)),
  155. /* SPI CLK*/
  156. PIN_MFP_SET(GPIO_54, SPIMT_MFP_CFG(MFP1_SPIMT)),
  157. /* SPI MISO*/
  158. PIN_MFP_SET(GPIO_55, SPIMT_MFP_CFG(MFP1_SPIMT)),
  159. /* SPI MOSI*/
  160. PIN_MFP_SET(GPIO_56, SPIMT_MFP_CFG(MFP1_SPIMT)),
  161. #endif
  162. };
  163. #if IS_ENABLED(CONFIG_MMC_0)
  164. static const struct acts_pin_config board_mmc0_config[] = {
  165. /* MMC0 CMD*/
  166. PIN_MFP_SET(GPIO_25, SDC0_MFP_CFG_VAL),
  167. /* MMC0 CLK*/
  168. PIN_MFP_SET(GPIO_24, (GPIO_CTL_MFP(SDC0_MFP_SEL)|GPIO_CTL_PADDRV_LEVEL(3))),
  169. /* MMC0 DATA0 */
  170. PIN_MFP_SET(GPIO_18, SDC0_MFP_CFG_VAL),
  171. /* MMC0 DATA1 */
  172. PIN_MFP_SET(GPIO_19, SDC0_MFP_CFG_VAL),
  173. /* MMC0 DATA2 */
  174. PIN_MFP_SET(GPIO_20, SDC0_MFP_CFG_VAL),
  175. /* MMC0 DATA3 */
  176. PIN_MFP_SET(GPIO_21, SDC0_MFP_CFG_VAL),
  177. };
  178. #endif
  179. #if IS_ENABLED(CONFIG_AUDIO_SPDIFTX_0)
  180. static const struct acts_pin_config board_spdiftx0_config[] = {
  181. PIN_MFP_SET(GPIO_9, SPDIFTX_MFP_CFG),
  182. };
  183. #endif
  184. #if IS_ENABLED(CONFIG_AUDIO_SPDIFRX_0)
  185. static const struct acts_pin_config board_spdifrx0_config[] = {
  186. PIN_MFP_SET(GPIO_13, SPDIFRX_MFP_CFG)
  187. };
  188. #endif
  189. #if IS_ENABLED(CONFIG_AUDIO_I2STX_0)
  190. static const struct acts_pin_config board_i2stx0_config[] = {
  191. /*I2STX0 mclk*/
  192. PIN_MFP_SET(GPIO_49, I2STX_MFP_CFG),
  193. /*I2STX0 bclk*/
  194. PIN_MFP_SET(GPIO_50, I2STX_MFP_CFG),
  195. /*I2STX0 lrclk*/
  196. PIN_MFP_SET(GPIO_51, I2STX_MFP_CFG),
  197. /*I2STX0 d0*/
  198. PIN_MFP_SET(GPIO_52, I2STX_MFP_CFG),
  199. };
  200. #endif
  201. #if IS_ENABLED(CONFIG_SPINAND_0)
  202. static const struct acts_pin_config board_spinand_spi0_config[] = {
  203. /* IOVCC1 poweron */
  204. PIN_MFP_SET(CONFIG_SPINAND_POWER_GPIO, 0x1F),
  205. /* SPI0 CS */
  206. PIN_MFP_SET(GPIO_0, SPINOR_MFP_CFG),
  207. /* SPI0 MISO */
  208. PIN_MFP_SET(GPIO_1, SPINOR_MFP_CFG),
  209. /* SPI0 CLK */
  210. PIN_MFP_SET(GPIO_2, SPINOR_MFP_CFG),
  211. /* SPI0 MOSI */
  212. PIN_MFP_SET(GPIO_3, SPINOR_MFP_CFG),
  213. /* SPI0 IO2 */
  214. PIN_MFP_SET(GPIO_6, SPINOR_MFP_PU_CFG),
  215. /* SPI0 IO3 */
  216. PIN_MFP_SET(GPIO_7, SPINOR_MFP_PU_CFG),
  217. };
  218. static const struct acts_pin_config board_spinand_spi0_gpiohighz_config[] = {
  219. /* IOVCC1 poweroff */
  220. PIN_MFP_SET(CONFIG_SPINAND_POWER_GPIO, CONFIG_GPIO_HIGHZ),
  221. /*SPI0 CS*/
  222. PIN_MFP_SET(GPIO_0, CONFIG_GPIO_HIGHZ),
  223. /*SPI0 MISO*/
  224. PIN_MFP_SET(GPIO_1, CONFIG_GPIO_HIGHZ),
  225. /*SPI0 CLK*/
  226. PIN_MFP_SET(GPIO_2, CONFIG_GPIO_HIGHZ),
  227. /*SPI0 MOSI*/
  228. PIN_MFP_SET(GPIO_3, CONFIG_GPIO_HIGHZ),
  229. /*SPI0 IO2*/
  230. PIN_MFP_SET(GPIO_6, CONFIG_GPIO_HIGHZ),
  231. /*SPI0 IO3*/
  232. PIN_MFP_SET(GPIO_7, CONFIG_GPIO_HIGHZ),
  233. };
  234. #endif
  235. #if IS_ENABLED(CONFIG_PWM)
  236. /* Look at CONFIG_PWM_PIN_CHAN_MAP select the available pwm gpio */
  237. static const struct pwm_acts_pin_config board_pwm_config[] = {
  238. /* GPIO57 used as pwm channel 1*/
  239. PWM_PIN_MFP_SET(GPIO_57, 1, PWM_MFP_CFG),
  240. };
  241. #endif
  242. #if IS_ENABLED(CONFIG_ACTS_BATTERY_NTC)
  243. /* GPIO20 and GPIO_23 are used as lradc2, they can't be used at the same time */
  244. static const struct acts_pin_config board_ntc_config[] = {
  245. PIN_MFP_SET(GPIO_20, BATNTC_MFP_CFG),
  246. PIN_MFP_SET(GPIO_23, CONFIG_GPIO_HIGHZ),
  247. };
  248. static const struct acts_pin_config board_ntc_ref_config[] = {
  249. PIN_MFP_SET(GPIO_20, CONFIG_GPIO_HIGHZ),
  250. /* GPIO23 must be a not use GPIO, use as lradc2 to get ntc scale value */
  251. PIN_MFP_SET(GPIO_23, BATNTC_REF_MFP_CFG),
  252. };
  253. static const struct acts_pin_config board_ntc_disable_config[] = {
  254. PIN_MFP_SET(GPIO_20, CONFIG_GPIO_HIGHZ),
  255. PIN_MFP_SET(GPIO_23, CONFIG_GPIO_HIGHZ),
  256. };
  257. #endif
  258. #if IS_ENABLED(CONFIG_PANEL)
  259. static const struct acts_pin_config board_lcd_pin_config[] = {
  260. /* lcd cs */
  261. PIN_MFP_SET(GPIO_30, (GPIO_CTL_MFP(LCD_MFP_SEL)|GPIO_CTL_PULLUP)),
  262. /* lcd scl */
  263. PIN_MFP_SET(GPIO_34, LCD_MFP_CLK_SEL),
  264. /* lcd_d0*/
  265. PIN_MFP_SET(GPIO_14, LCD_MFP_SEL),
  266. /* lcd_d1*/
  267. PIN_MFP_SET(GPIO_15, LCD_MFP_SEL),
  268. /* lcd_d2*/
  269. PIN_MFP_SET(GPIO_16, LCD_MFP_SEL),
  270. /* lcd_d3*/
  271. PIN_MFP_SET(GPIO_17, LCD_MFP_SEL),
  272. /* lcd power: IOVCC2 */
  273. PIN_MFP_SET(GPIO_33, 0x1F),
  274. };
  275. #endif
  276. #if IS_ENABLED(CONFIG_ADCKEY)
  277. #define CONFIG_ADCKEY_GPIO
  278. #ifdef CONFIG_ADCKEY_GPIO
  279. #define CONFIG_ADCKEY_GPIO_NUM (GPIO_21)
  280. #else
  281. #define CONFIG_ADCKEY_WIO_NUM (WIO_0)
  282. #define CONFIG_ADCKEY_WIO_MFP (3)
  283. #endif
  284. static void board_adckey_pinmux_init(void)
  285. {
  286. #ifdef CONFIG_ADCKEY_GPIO
  287. acts_pinmux_set(CONFIG_ADCKEY_GPIO_NUM, ADCKEY_MFP_CFG);
  288. #else
  289. sys_write32(CONFIG_ADCKEY_WIO_MFP, WIO0_CTL + (CONFIG_ADCKEY_WIO_NUM * 4));
  290. #endif
  291. }
  292. #endif
  293. static int board_early_init(const struct device *arg)
  294. {
  295. ARG_UNUSED(arg);
  296. acts_pinmux_setup_pins(board_pin_config, ARRAY_SIZE(board_pin_config));
  297. #if IS_ENABLED(CONFIG_MMC_0)
  298. acts_pinmux_setup_pins(board_mmc0_config, ARRAY_SIZE(board_mmc0_config));
  299. #endif
  300. #if IS_ENABLED(CONFIG_ADCKEY)
  301. board_adckey_pinmux_init();
  302. #endif
  303. #if IS_ENABLED(CONFIG_PANEL)
  304. acts_pinmux_setup_pins(board_lcd_pin_config, ARRAY_SIZE(board_lcd_pin_config));
  305. #endif
  306. #ifdef CONFIG_RTT_CONSOLE
  307. jtag_set();
  308. #endif
  309. return 0;
  310. }
  311. static int board_later_init(const struct device *arg)
  312. {
  313. ARG_UNUSED(arg);
  314. printk("%s %d: \n", __func__, __LINE__);
  315. return 0;
  316. }
  317. /* UART registers struct */
  318. struct acts_uart_reg {
  319. volatile uint32_t ctrl;
  320. volatile uint32_t rxdat;
  321. volatile uint32_t txdat;
  322. volatile uint32_t stat;
  323. volatile uint32_t br;
  324. } ;
  325. void uart_poll_out_ch(int c)
  326. {
  327. struct acts_uart_reg *uart = (struct acts_uart_reg*)UART0_REG_BASE;
  328. /* Wait for transmitter to be ready */
  329. while (uart->stat & BIT(6));
  330. /* send a character */
  331. uart->txdat = (uint32_t)c;
  332. }
  333. /*for early printk*/
  334. int arch_printk_char_out(int c)
  335. {
  336. if ('\n' == c)
  337. uart_poll_out_ch('\r');
  338. uart_poll_out_ch(c);
  339. return 0;
  340. }
  341. #if 1 //TODO:
  342. static const audio_input_map_t board_audio_input_map[] = {
  343. {AUDIO_LINE_IN0, ADC_CH_INPUT0P, ADC_CH_DISABLE, ADC_CH_INPUT0N, ADC_CH_DISABLE},
  344. {AUDIO_LINE_IN1, ADC_CH_INPUT0NP_DIFF, ADC_CH_INPUT1NP_DIFF, ADC_CH_DISABLE, ADC_CH_DISABLE},
  345. {AUDIO_LINE_IN2, ADC_CH_DISABLE, ADC_CH_INPUT1P, ADC_CH_DISABLE, ADC_CH_INPUT1N},
  346. {AUDIO_ANALOG_MIC0, ADC_CH_INPUT0NP_DIFF, ADC_CH_DISABLE, ADC_CH_DISABLE, ADC_CH_DISABLE},
  347. {AUDIO_ANALOG_MIC1, ADC_CH_INPUT0NP_DIFF, ADC_CH_DISABLE, ADC_CH_DISABLE, ADC_CH_DISABLE},
  348. {AUDIO_ANALOG_MIC2, ADC_CH_INPUT0NP_DIFF, ADC_CH_INPUT1NP_DIFF, ADC_CH_DISABLE, ADC_CH_DISABLE},
  349. {AUDIO_ANALOG_FM0, ADC_CH_INPUT0P, ADC_CH_DISABLE, ADC_CH_INPUT0N, ADC_CH_DISABLE},
  350. {AUDIO_DIGITAL_MIC0, ADC_CH_DMIC, ADC_CH_DMIC, ADC_CH_DISABLE, ADC_CH_DISABLE},
  351. };
  352. int board_audio_device_mapping(audio_input_map_t *input_map)
  353. {
  354. int i;
  355. if (!input_map)
  356. return -EINVAL;
  357. for (i = 0; i < ARRAY_SIZE(board_audio_input_map); i++) {
  358. if (input_map->audio_dev == board_audio_input_map[i].audio_dev) {
  359. input_map->ch0_input = board_audio_input_map[i].ch0_input;
  360. input_map->ch1_input = board_audio_input_map[i].ch1_input;
  361. input_map->ch2_input = board_audio_input_map[i].ch2_input;
  362. input_map->ch3_input = board_audio_input_map[i].ch3_input;
  363. break;
  364. }
  365. }
  366. if (i == ARRAY_SIZE(board_audio_input_map)) {
  367. printk("can not find out audio dev 0x%x\n", input_map->audio_dev);
  368. return -ENOENT;
  369. }
  370. return 0;
  371. }
  372. #endif
  373. #ifdef CONFIG_BOARD_EXTERNAL_PA_ENABLE
  374. #define EXTERN_PA_CTL1_PIN 53
  375. #define EXTERN_PA_CTL_SLEEP_OFF_TIME_MS 160
  376. #define EXTERN_PA_CTL_SLEEP_ON_TIME_MS 20
  377. //#define EXTERN_PA_EIO_CTRL_PIN (0)
  378. //#define EXTERN_PA_EIO_CTRL_PIN_NAME CONFIG_EXTEND_GPIO_NAME
  379. int board_extern_pa_ctl(u8_t pa_class, bool is_on)
  380. {
  381. #ifdef EXTERN_PA_CTL1_PIN
  382. const struct device *pa_gpio_dev;
  383. pa_gpio_dev = device_get_binding(CONFIG_GPIO_PIN2NAME(EXTERN_PA_CTL1_PIN));
  384. if (!pa_gpio_dev)
  385. return -EINVAL;
  386. #endif
  387. #ifdef EXTERN_PA_EIO_CTRL_PIN
  388. const struct device *egpio_dev;
  389. egpio_dev = device_get_binding(EXTERN_PA_EIO_CTRL_PIN_NAME);
  390. if (!egpio_dev)
  391. return -EINVAL;
  392. #endif
  393. if (!is_on) {
  394. /* external PA power off */
  395. printk("audio external PA power off\n");
  396. #ifdef EXTERN_PA_CTL1_PIN
  397. gpio_pin_configure(pa_gpio_dev, EXTERN_PA_CTL1_PIN % 32, GPIO_OUTPUT);
  398. gpio_pin_set(pa_gpio_dev, EXTERN_PA_CTL1_PIN % 32, 0);
  399. /* XA7191D PA spec depicts that shall disable PA for above 150ms when switch work mode */
  400. k_sleep(K_MSEC(EXTERN_PA_CTL_SLEEP_OFF_TIME_MS));
  401. #endif
  402. #ifdef EXTERN_PA_EIO_CTRL_PIN
  403. gpio_pin_configure(egpio_dev, EXTERN_PA_EIO_CTRL_PIN % 32, GPIO_OUTPUT);
  404. gpio_pin_set(egpio_dev, EXTERN_PA_EIO_CTRL_PIN % 32, 0);
  405. #endif
  406. } else {
  407. /* external PA power off */
  408. printk("audio external PA power on\n");
  409. #ifdef EXTERN_PA_CTL1_PIN
  410. gpio_pin_configure(pa_gpio_dev, EXTERN_PA_CTL1_PIN % 32, GPIO_OUTPUT);
  411. gpio_pin_set(pa_gpio_dev, EXTERN_PA_CTL1_PIN % 32, 1);
  412. k_sleep(K_MSEC(EXTERN_PA_CTL_SLEEP_ON_TIME_MS));
  413. #endif
  414. #ifdef EXTERN_PA_EIO_CTRL_PIN
  415. gpio_pin_configure(egpio_dev, EXTERN_PA_EIO_CTRL_PIN % 32, GPIO_OUTPUT);
  416. gpio_pin_set(egpio_dev, EXTERN_PA_EIO_CTRL_PIN % 32, 1);
  417. #endif
  418. }
  419. return 0;
  420. }
  421. #endif
  422. void board_get_mmc0_pinmux_info(struct board_pinmux_info *pinmux_info)
  423. {
  424. #if IS_ENABLED(CONFIG_MMC_0)
  425. pinmux_info->pins_config = board_mmc0_config;
  426. pinmux_info->pins_num = ARRAY_SIZE(board_mmc0_config);
  427. #endif
  428. }
  429. void board_get_spdiftx0_pinmux_info(struct board_pinmux_info *pinmux_info)
  430. {
  431. #if IS_ENABLED(CONFIG_AUDIO_SPDIFTX_0)
  432. pinmux_info->pins_config = board_spdiftx0_config;
  433. pinmux_info->pins_num = ARRAY_SIZE(board_spdiftx0_config);
  434. #endif
  435. }
  436. void board_get_spdifrx0_pinmux_info(struct board_pinmux_info *pinmux_info)
  437. {
  438. #if IS_ENABLED(CONFIG_AUDIO_SPDIFRX_0)
  439. pinmux_info->pins_config = board_spdifrx0_config;
  440. pinmux_info->pins_num = ARRAY_SIZE(board_spdifrx0_config);
  441. #endif
  442. }
  443. void board_get_i2stx0_pinmux_info(struct board_pinmux_info *pinmux_info)
  444. {
  445. #if IS_ENABLED(CONFIG_AUDIO_I2STX_0)
  446. pinmux_info->pins_config = board_i2stx0_config;
  447. pinmux_info->pins_num = ARRAY_SIZE(board_i2stx0_config);
  448. #endif
  449. }
  450. void board_get_pwm_pinmux_info(struct board_pwm_pinmux_info *pinmux_info)
  451. {
  452. #if IS_ENABLED(CONFIG_PWM)
  453. pinmux_info->pins_config = board_pwm_config;
  454. pinmux_info->pins_num = ARRAY_SIZE(board_pwm_config);
  455. #endif
  456. }
  457. void board_get_spinand_pinmux_info(struct board_pinmux_info *pinmux_info)
  458. {
  459. #if IS_ENABLED(CONFIG_SPINAND_0)
  460. pinmux_info->pins_config = board_spinand_spi0_config;
  461. pinmux_info->pins_num = ARRAY_SIZE(board_spinand_spi0_config);
  462. #endif
  463. }
  464. void board_get_spinand_gpiohighz_info(struct board_pinmux_info *pinmux_info)
  465. {
  466. #if IS_ENABLED(CONFIG_SPINAND_0)
  467. pinmux_info->pins_config = board_spinand_spi0_gpiohighz_config;
  468. pinmux_info->pins_num = ARRAY_SIZE(board_spinand_spi0_gpiohighz_config);
  469. #endif
  470. }
  471. void board_set_ntc_pinmux_info(bool enable, bool use_as_ntc)
  472. {
  473. #if IS_ENABLED(CONFIG_ACTS_BATTERY_NTC)
  474. if (enable) {
  475. if (use_as_ntc)
  476. acts_pinmux_setup_pins(board_ntc_config, ARRAY_SIZE(board_ntc_config));
  477. else
  478. acts_pinmux_setup_pins(board_ntc_ref_config, ARRAY_SIZE(board_ntc_ref_config));
  479. } else {
  480. acts_pinmux_setup_pins(board_ntc_disable_config, ARRAY_SIZE(board_ntc_disable_config));
  481. }
  482. #endif
  483. }
  484. #if IS_ENABLED(CONFIG_PANEL)
  485. static uint32_t lcd_pin_backup[3];
  486. void board_lcd_suspend(bool aod_en, bool early_suspend)
  487. {
  488. if (early_suspend) {
  489. lcd_pin_backup[0] = sys_read32(GPION_CTL(35)); /* lcd te */
  490. sys_write32(CONFIG_GPIO_HIGHZ, GPION_CTL(35));
  491. if (aod_en == false) {
  492. lcd_pin_backup[1] = sys_read32(GPION_CTL(21)); /* lcd power */
  493. sys_write32(CONFIG_GPIO_HIGHZ, GPION_CTL(21));
  494. lcd_pin_backup[2] = sys_read32(GPION_CTL(32)); /* lcd reset */
  495. sys_write32(CONFIG_GPIO_HIGHZ, GPION_CTL(32));
  496. sys_write32(CONFIG_GPIO_HIGHZ, GPION_CTL(30)); /* lcd cs */
  497. sys_write32(CONFIG_GPIO_HIGHZ, GPION_CTL(33)); /* lcd power IOVCC2 */
  498. }
  499. }
  500. sys_write32(CONFIG_GPIO_HIGHZ, GPION_CTL(34)); /* lcd scl */
  501. sys_write32(CONFIG_GPIO_HIGHZ, GPION_CTL(14)); /* lcd d0 */
  502. sys_write32(CONFIG_GPIO_HIGHZ, GPION_CTL(15)); /* lcd d1 */
  503. sys_write32(CONFIG_GPIO_HIGHZ, GPION_CTL(16)); /* lcd d2 */
  504. sys_write32(CONFIG_GPIO_HIGHZ, GPION_CTL(17)); /* lcd d3 */
  505. }
  506. void board_lcd_resume(bool aod_en, bool late_resume)
  507. {
  508. acts_pinmux_setup_pins(board_lcd_pin_config, ARRAY_SIZE(board_lcd_pin_config));
  509. if (late_resume) {
  510. sys_write32(lcd_pin_backup[0], GPION_CTL(35)); /* lcd te */
  511. if (aod_en == false) {
  512. sys_write32(lcd_pin_backup[1], GPION_CTL(21)); /* lcd GND_LEDK */
  513. sys_write32(lcd_pin_backup[2], GPION_CTL(32)); /* lcd reset */
  514. }
  515. }
  516. }
  517. #endif /* CONFIG_PANEL */
  518. SYS_INIT(board_early_init, PRE_KERNEL_1, 5);
  519. SYS_INIT(board_later_init, POST_KERNEL, 5);