pinctrl_rk3399.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * (C) Copyright 2016 Rockchip Electronics Co., Ltd
  4. */
  5. #include <common.h>
  6. #include <dm.h>
  7. #include <errno.h>
  8. #include <syscon.h>
  9. #include <asm/io.h>
  10. #include <asm/arch/grf_rk3399.h>
  11. #include <asm/arch/hardware.h>
  12. #include <asm/arch/periph.h>
  13. #include <asm/arch/clock.h>
  14. #include <dm/pinctrl.h>
  15. struct rk3399_pinctrl_priv {
  16. struct rk3399_grf_regs *grf;
  17. struct rk3399_pmugrf_regs *pmugrf;
  18. };
  19. static void pinctrl_rk3399_pwm_config(struct rk3399_grf_regs *grf,
  20. struct rk3399_pmugrf_regs *pmugrf, int pwm_id)
  21. {
  22. switch (pwm_id) {
  23. case PERIPH_ID_PWM0:
  24. rk_clrsetreg(&grf->gpio4c_iomux,
  25. GRF_GPIO4C2_SEL_MASK,
  26. GRF_PWM_0 << GRF_GPIO4C2_SEL_SHIFT);
  27. break;
  28. case PERIPH_ID_PWM1:
  29. rk_clrsetreg(&grf->gpio4c_iomux,
  30. GRF_GPIO4C6_SEL_MASK,
  31. GRF_PWM_1 << GRF_GPIO4C6_SEL_SHIFT);
  32. break;
  33. case PERIPH_ID_PWM2:
  34. rk_clrsetreg(&pmugrf->gpio1c_iomux,
  35. PMUGRF_GPIO1C3_SEL_MASK,
  36. PMUGRF_PWM_2 << PMUGRF_GPIO1C3_SEL_SHIFT);
  37. break;
  38. case PERIPH_ID_PWM3:
  39. if (readl(&pmugrf->soc_con0) & (1 << 5))
  40. rk_clrsetreg(&pmugrf->gpio1b_iomux,
  41. PMUGRF_GPIO1B6_SEL_MASK,
  42. PMUGRF_PWM_3B << PMUGRF_GPIO1B6_SEL_SHIFT);
  43. else
  44. rk_clrsetreg(&pmugrf->gpio0a_iomux,
  45. PMUGRF_GPIO0A6_SEL_MASK,
  46. PMUGRF_PWM_3A << PMUGRF_GPIO0A6_SEL_SHIFT);
  47. break;
  48. default:
  49. debug("pwm id = %d iomux error!\n", pwm_id);
  50. break;
  51. }
  52. }
  53. static void pinctrl_rk3399_i2c_config(struct rk3399_grf_regs *grf,
  54. struct rk3399_pmugrf_regs *pmugrf,
  55. int i2c_id)
  56. {
  57. switch (i2c_id) {
  58. case PERIPH_ID_I2C0:
  59. rk_clrsetreg(&pmugrf->gpio1b_iomux,
  60. PMUGRF_GPIO1B7_SEL_MASK,
  61. PMUGRF_I2C0PMU_SDA << PMUGRF_GPIO1B7_SEL_SHIFT);
  62. rk_clrsetreg(&pmugrf->gpio1c_iomux,
  63. PMUGRF_GPIO1C0_SEL_MASK,
  64. PMUGRF_I2C0PMU_SCL << PMUGRF_GPIO1C0_SEL_SHIFT);
  65. break;
  66. case PERIPH_ID_I2C1:
  67. rk_clrsetreg(&grf->gpio4a_iomux,
  68. GRF_GPIO4A1_SEL_MASK,
  69. GRF_I2C1_SDA << GRF_GPIO4A1_SEL_SHIFT);
  70. rk_clrsetreg(&grf->gpio4a_iomux,
  71. GRF_GPIO4A2_SEL_MASK,
  72. GRF_I2C1_SCL << GRF_GPIO4A2_SEL_SHIFT);
  73. break;
  74. case PERIPH_ID_I2C2:
  75. rk_clrsetreg(&grf->gpio2a_iomux,
  76. GRF_GPIO2A0_SEL_MASK,
  77. GRF_I2C2_SDA << GRF_GPIO2A0_SEL_SHIFT);
  78. rk_clrsetreg(&grf->gpio2a_iomux,
  79. GRF_GPIO2A1_SEL_MASK,
  80. GRF_I2C2_SCL << GRF_GPIO2A1_SEL_SHIFT);
  81. break;
  82. case PERIPH_ID_I2C3:
  83. rk_clrsetreg(&grf->gpio4c_iomux,
  84. GRF_GPIO4C0_SEL_MASK,
  85. GRF_HDMII2C_SCL << GRF_GPIO4C0_SEL_SHIFT);
  86. rk_clrsetreg(&grf->gpio4c_iomux,
  87. GRF_GPIO4C1_SEL_MASK,
  88. GRF_HDMII2C_SDA << GRF_GPIO4C1_SEL_SHIFT);
  89. break;
  90. case PERIPH_ID_I2C4:
  91. rk_clrsetreg(&pmugrf->gpio1b_iomux,
  92. PMUGRF_GPIO1B3_SEL_MASK,
  93. PMUGRF_I2C4_SDA << PMUGRF_GPIO1B3_SEL_SHIFT);
  94. rk_clrsetreg(&pmugrf->gpio1b_iomux,
  95. PMUGRF_GPIO1B4_SEL_MASK,
  96. PMUGRF_I2C4_SCL << PMUGRF_GPIO1B4_SEL_SHIFT);
  97. break;
  98. case PERIPH_ID_I2C7:
  99. rk_clrsetreg(&grf->gpio2a_iomux,
  100. GRF_GPIO2A7_SEL_MASK,
  101. GRF_I2C7_SDA << GRF_GPIO2A7_SEL_SHIFT);
  102. rk_clrsetreg(&grf->gpio2b_iomux,
  103. GRF_GPIO2B0_SEL_MASK,
  104. GRF_I2C7_SCL << GRF_GPIO2B0_SEL_SHIFT);
  105. break;
  106. case PERIPH_ID_I2C6:
  107. rk_clrsetreg(&grf->gpio2b_iomux,
  108. GRF_GPIO2B1_SEL_MASK,
  109. GRF_I2C6_SDA << GRF_GPIO2B1_SEL_SHIFT);
  110. rk_clrsetreg(&grf->gpio2b_iomux,
  111. GRF_GPIO2B2_SEL_MASK,
  112. GRF_I2C6_SDA << GRF_GPIO2B2_SEL_SHIFT);
  113. break;
  114. case PERIPH_ID_I2C8:
  115. rk_clrsetreg(&pmugrf->gpio1c_iomux,
  116. PMUGRF_GPIO1C4_SEL_MASK,
  117. PMUGRF_I2C8PMU_SDA << PMUGRF_GPIO1C4_SEL_SHIFT);
  118. rk_clrsetreg(&pmugrf->gpio1c_iomux,
  119. PMUGRF_GPIO1C5_SEL_MASK,
  120. PMUGRF_I2C8PMU_SCL << PMUGRF_GPIO1C5_SEL_SHIFT);
  121. break;
  122. case PERIPH_ID_I2C5:
  123. default:
  124. debug("i2c id = %d iomux error!\n", i2c_id);
  125. break;
  126. }
  127. }
  128. static void pinctrl_rk3399_lcdc_config(struct rk3399_grf_regs *grf, int lcd_id)
  129. {
  130. switch (lcd_id) {
  131. case PERIPH_ID_LCDC0:
  132. break;
  133. default:
  134. debug("lcdc id = %d iomux error!\n", lcd_id);
  135. break;
  136. }
  137. }
  138. static int pinctrl_rk3399_spi_config(struct rk3399_grf_regs *grf,
  139. struct rk3399_pmugrf_regs *pmugrf,
  140. enum periph_id spi_id, int cs)
  141. {
  142. switch (spi_id) {
  143. case PERIPH_ID_SPI0:
  144. switch (cs) {
  145. case 0:
  146. rk_clrsetreg(&grf->gpio3a_iomux,
  147. GRF_GPIO3A7_SEL_MASK,
  148. GRF_SPI0NORCODEC_CSN0
  149. << GRF_GPIO3A7_SEL_SHIFT);
  150. break;
  151. case 1:
  152. rk_clrsetreg(&grf->gpio3b_iomux,
  153. GRF_GPIO3B0_SEL_MASK,
  154. GRF_SPI0NORCODEC_CSN1
  155. << GRF_GPIO3B0_SEL_SHIFT);
  156. break;
  157. default:
  158. goto err;
  159. }
  160. rk_clrsetreg(&grf->gpio3a_iomux,
  161. GRF_GPIO3A4_SEL_MASK | GRF_GPIO3A5_SEL_SHIFT
  162. | GRF_GPIO3A6_SEL_SHIFT,
  163. GRF_SPI0NORCODEC_RXD << GRF_GPIO3A4_SEL_SHIFT
  164. | GRF_SPI0NORCODEC_RXD << GRF_GPIO3A5_SEL_SHIFT
  165. | GRF_SPI0NORCODEC_RXD << GRF_GPIO3A6_SEL_SHIFT);
  166. break;
  167. case PERIPH_ID_SPI1:
  168. if (cs != 0)
  169. goto err;
  170. rk_clrsetreg(&pmugrf->gpio1a_iomux,
  171. PMUGRF_GPIO1A7_SEL_MASK,
  172. PMUGRF_SPI1EC_RXD << PMUGRF_GPIO1A7_SEL_SHIFT);
  173. rk_clrsetreg(&pmugrf->gpio1b_iomux,
  174. PMUGRF_GPIO1B0_SEL_MASK | PMUGRF_GPIO1B1_SEL_MASK
  175. | PMUGRF_GPIO1B2_SEL_MASK,
  176. PMUGRF_SPI1EC_TXD << PMUGRF_GPIO1B0_SEL_SHIFT
  177. | PMUGRF_SPI1EC_CLK << PMUGRF_GPIO1B1_SEL_SHIFT
  178. | PMUGRF_SPI1EC_CSN0 << PMUGRF_GPIO1B2_SEL_SHIFT);
  179. break;
  180. case PERIPH_ID_SPI2:
  181. if (cs != 0)
  182. goto err;
  183. rk_clrsetreg(&grf->gpio2b_iomux,
  184. GRF_GPIO2B1_SEL_MASK | GRF_GPIO2B2_SEL_MASK
  185. | GRF_GPIO2B3_SEL_MASK | GRF_GPIO2B4_SEL_MASK,
  186. GRF_SPI2TPM_RXD << GRF_GPIO2B1_SEL_SHIFT
  187. | GRF_SPI2TPM_TXD << GRF_GPIO2B2_SEL_SHIFT
  188. | GRF_SPI2TPM_CLK << GRF_GPIO2B3_SEL_SHIFT
  189. | GRF_SPI2TPM_CSN0 << GRF_GPIO2B4_SEL_SHIFT);
  190. break;
  191. case PERIPH_ID_SPI5:
  192. if (cs != 0)
  193. goto err;
  194. rk_clrsetreg(&grf->gpio2c_iomux,
  195. GRF_GPIO2C4_SEL_MASK | GRF_GPIO2C5_SEL_MASK
  196. | GRF_GPIO2C6_SEL_MASK | GRF_GPIO2C7_SEL_MASK,
  197. GRF_SPI5EXPPLUS_RXD << GRF_GPIO2C4_SEL_SHIFT
  198. | GRF_SPI5EXPPLUS_TXD << GRF_GPIO2C5_SEL_SHIFT
  199. | GRF_SPI5EXPPLUS_CLK << GRF_GPIO2C6_SEL_SHIFT
  200. | GRF_SPI5EXPPLUS_CSN0 << GRF_GPIO2C7_SEL_SHIFT);
  201. break;
  202. default:
  203. printf("%s: spi_id %d is not supported.\n", __func__, spi_id);
  204. goto err;
  205. }
  206. return 0;
  207. err:
  208. debug("rkspi: periph%d cs=%d not supported", spi_id, cs);
  209. return -ENOENT;
  210. }
  211. static void pinctrl_rk3399_uart_config(struct rk3399_grf_regs *grf,
  212. struct rk3399_pmugrf_regs *pmugrf,
  213. int uart_id)
  214. {
  215. switch (uart_id) {
  216. case PERIPH_ID_UART2:
  217. /* Using channel-C by default */
  218. rk_clrsetreg(&grf->gpio4c_iomux,
  219. GRF_GPIO4C3_SEL_MASK,
  220. GRF_UART2DGBC_SIN << GRF_GPIO4C3_SEL_SHIFT);
  221. rk_clrsetreg(&grf->gpio4c_iomux,
  222. GRF_GPIO4C4_SEL_MASK,
  223. GRF_UART2DBGC_SOUT << GRF_GPIO4C4_SEL_SHIFT);
  224. break;
  225. case PERIPH_ID_UART0:
  226. case PERIPH_ID_UART1:
  227. case PERIPH_ID_UART3:
  228. case PERIPH_ID_UART4:
  229. default:
  230. debug("uart id = %d iomux error!\n", uart_id);
  231. break;
  232. }
  233. }
  234. static void pinctrl_rk3399_sdmmc_config(struct rk3399_grf_regs *grf, int mmc_id)
  235. {
  236. switch (mmc_id) {
  237. case PERIPH_ID_EMMC:
  238. break;
  239. case PERIPH_ID_SDCARD:
  240. rk_clrsetreg(&grf->gpio4b_iomux,
  241. GRF_GPIO4B0_SEL_MASK | GRF_GPIO4B1_SEL_MASK
  242. | GRF_GPIO4B2_SEL_MASK | GRF_GPIO4B3_SEL_MASK
  243. | GRF_GPIO4B4_SEL_MASK | GRF_GPIO4B5_SEL_MASK,
  244. GRF_SDMMC_DATA0 << GRF_GPIO4B0_SEL_SHIFT
  245. | GRF_SDMMC_DATA1 << GRF_GPIO4B1_SEL_SHIFT
  246. | GRF_SDMMC_DATA2 << GRF_GPIO4B2_SEL_SHIFT
  247. | GRF_SDMMC_DATA3 << GRF_GPIO4B3_SEL_SHIFT
  248. | GRF_SDMMC_CLKOUT << GRF_GPIO4B4_SEL_SHIFT
  249. | GRF_SDMMC_CMD << GRF_GPIO4B5_SEL_SHIFT);
  250. break;
  251. default:
  252. debug("mmc id = %d iomux error!\n", mmc_id);
  253. break;
  254. }
  255. }
  256. #if CONFIG_IS_ENABLED(GMAC_ROCKCHIP)
  257. static void pinctrl_rk3399_gmac_config(struct rk3399_grf_regs *grf, int mmc_id)
  258. {
  259. rk_clrsetreg(&grf->gpio3a_iomux,
  260. GRF_GPIO3A0_SEL_MASK | GRF_GPIO3A1_SEL_MASK |
  261. GRF_GPIO3A2_SEL_MASK | GRF_GPIO3A3_SEL_MASK |
  262. GRF_GPIO3A4_SEL_MASK | GRF_GPIO3A5_SEL_MASK |
  263. GRF_GPIO3A6_SEL_MASK | GRF_GPIO3A7_SEL_MASK,
  264. GRF_MAC_TXD2 << GRF_GPIO3A0_SEL_SHIFT |
  265. GRF_MAC_TXD3 << GRF_GPIO3A1_SEL_SHIFT |
  266. GRF_MAC_RXD2 << GRF_GPIO3A2_SEL_SHIFT |
  267. GRF_MAC_RXD3 << GRF_GPIO3A3_SEL_SHIFT |
  268. GRF_MAC_TXD0 << GRF_GPIO3A4_SEL_SHIFT |
  269. GRF_MAC_TXD1 << GRF_GPIO3A5_SEL_SHIFT |
  270. GRF_MAC_RXD0 << GRF_GPIO3A6_SEL_SHIFT |
  271. GRF_MAC_RXD1 << GRF_GPIO3A7_SEL_SHIFT);
  272. rk_clrsetreg(&grf->gpio3b_iomux,
  273. GRF_GPIO3B0_SEL_MASK | GRF_GPIO3B1_SEL_MASK |
  274. GRF_GPIO3B3_SEL_MASK |
  275. GRF_GPIO3B4_SEL_MASK | GRF_GPIO3B5_SEL_MASK |
  276. GRF_GPIO3B6_SEL_MASK,
  277. GRF_MAC_MDC << GRF_GPIO3B0_SEL_SHIFT |
  278. GRF_MAC_RXDV << GRF_GPIO3B1_SEL_SHIFT |
  279. GRF_MAC_CLK << GRF_GPIO3B3_SEL_SHIFT |
  280. GRF_MAC_TXEN << GRF_GPIO3B4_SEL_SHIFT |
  281. GRF_MAC_MDIO << GRF_GPIO3B5_SEL_SHIFT |
  282. GRF_MAC_RXCLK << GRF_GPIO3B6_SEL_SHIFT);
  283. rk_clrsetreg(&grf->gpio3c_iomux,
  284. GRF_GPIO3C1_SEL_MASK,
  285. GRF_MAC_TXCLK << GRF_GPIO3C1_SEL_SHIFT);
  286. /* Set drive strength for GMAC tx io, value 3 means 13mA */
  287. rk_clrsetreg(&grf->gpio3_e[0],
  288. GRF_GPIO3A0_E_MASK | GRF_GPIO3A1_E_MASK |
  289. GRF_GPIO3A4_E_MASK | GRF_GPIO3A5_E0_MASK,
  290. 3 << GRF_GPIO3A0_E_SHIFT |
  291. 3 << GRF_GPIO3A1_E_SHIFT |
  292. 3 << GRF_GPIO3A4_E_SHIFT |
  293. 1 << GRF_GPIO3A5_E0_SHIFT);
  294. rk_clrsetreg(&grf->gpio3_e[1],
  295. GRF_GPIO3A5_E12_MASK,
  296. 1 << GRF_GPIO3A5_E12_SHIFT);
  297. rk_clrsetreg(&grf->gpio3_e[2],
  298. GRF_GPIO3B4_E_MASK,
  299. 3 << GRF_GPIO3B4_E_SHIFT);
  300. rk_clrsetreg(&grf->gpio3_e[4],
  301. GRF_GPIO3C1_E_MASK,
  302. 3 << GRF_GPIO3C1_E_SHIFT);
  303. }
  304. #endif
  305. #if !defined(CONFIG_SPL_BUILD)
  306. static void pinctrl_rk3399_hdmi_config(struct rk3399_grf_regs *grf, int hdmi_id)
  307. {
  308. switch (hdmi_id) {
  309. case PERIPH_ID_HDMI:
  310. rk_clrsetreg(&grf->gpio4c_iomux,
  311. GRF_GPIO4C0_SEL_MASK | GRF_GPIO4C1_SEL_MASK,
  312. (GRF_HDMII2C_SCL << GRF_GPIO4C0_SEL_SHIFT) |
  313. (GRF_HDMII2C_SDA << GRF_GPIO4C1_SEL_SHIFT));
  314. break;
  315. default:
  316. debug("%s: hdmi_id = %d unsupported\n", __func__, hdmi_id);
  317. break;
  318. }
  319. }
  320. #endif
  321. static int rk3399_pinctrl_request(struct udevice *dev, int func, int flags)
  322. {
  323. struct rk3399_pinctrl_priv *priv = dev_get_priv(dev);
  324. debug("%s: func=%x, flags=%x\n", __func__, func, flags);
  325. switch (func) {
  326. case PERIPH_ID_PWM0:
  327. case PERIPH_ID_PWM1:
  328. case PERIPH_ID_PWM2:
  329. case PERIPH_ID_PWM3:
  330. case PERIPH_ID_PWM4:
  331. pinctrl_rk3399_pwm_config(priv->grf, priv->pmugrf, func);
  332. break;
  333. case PERIPH_ID_I2C0:
  334. case PERIPH_ID_I2C1:
  335. case PERIPH_ID_I2C2:
  336. case PERIPH_ID_I2C3:
  337. case PERIPH_ID_I2C4:
  338. case PERIPH_ID_I2C5:
  339. case PERIPH_ID_I2C6:
  340. case PERIPH_ID_I2C7:
  341. case PERIPH_ID_I2C8:
  342. pinctrl_rk3399_i2c_config(priv->grf, priv->pmugrf, func);
  343. break;
  344. case PERIPH_ID_SPI0:
  345. case PERIPH_ID_SPI1:
  346. case PERIPH_ID_SPI2:
  347. case PERIPH_ID_SPI3:
  348. case PERIPH_ID_SPI4:
  349. case PERIPH_ID_SPI5:
  350. pinctrl_rk3399_spi_config(priv->grf, priv->pmugrf, func, flags);
  351. break;
  352. case PERIPH_ID_UART0:
  353. case PERIPH_ID_UART1:
  354. case PERIPH_ID_UART2:
  355. case PERIPH_ID_UART3:
  356. case PERIPH_ID_UART4:
  357. pinctrl_rk3399_uart_config(priv->grf, priv->pmugrf, func);
  358. break;
  359. case PERIPH_ID_LCDC0:
  360. case PERIPH_ID_LCDC1:
  361. pinctrl_rk3399_lcdc_config(priv->grf, func);
  362. break;
  363. case PERIPH_ID_SDMMC0:
  364. case PERIPH_ID_SDMMC1:
  365. pinctrl_rk3399_sdmmc_config(priv->grf, func);
  366. break;
  367. #if CONFIG_IS_ENABLED(GMAC_ROCKCHIP)
  368. case PERIPH_ID_GMAC:
  369. pinctrl_rk3399_gmac_config(priv->grf, func);
  370. break;
  371. #endif
  372. #if !defined(CONFIG_SPL_BUILD)
  373. case PERIPH_ID_HDMI:
  374. pinctrl_rk3399_hdmi_config(priv->grf, func);
  375. break;
  376. #endif
  377. default:
  378. return -EINVAL;
  379. }
  380. return 0;
  381. }
  382. static int rk3399_pinctrl_get_periph_id(struct udevice *dev,
  383. struct udevice *periph)
  384. {
  385. #if !CONFIG_IS_ENABLED(OF_PLATDATA)
  386. u32 cell[3];
  387. int ret;
  388. ret = dev_read_u32_array(periph, "interrupts", cell, ARRAY_SIZE(cell));
  389. if (ret < 0)
  390. return -EINVAL;
  391. switch (cell[1]) {
  392. case 68:
  393. return PERIPH_ID_SPI0;
  394. case 53:
  395. return PERIPH_ID_SPI1;
  396. case 52:
  397. return PERIPH_ID_SPI2;
  398. case 132:
  399. return PERIPH_ID_SPI5;
  400. case 57:
  401. return PERIPH_ID_I2C0;
  402. case 59: /* Note strange order */
  403. return PERIPH_ID_I2C1;
  404. case 35:
  405. return PERIPH_ID_I2C2;
  406. case 34:
  407. return PERIPH_ID_I2C3;
  408. case 56:
  409. return PERIPH_ID_I2C4;
  410. case 38:
  411. return PERIPH_ID_I2C5;
  412. case 37:
  413. return PERIPH_ID_I2C6;
  414. case 36:
  415. return PERIPH_ID_I2C7;
  416. case 58:
  417. return PERIPH_ID_I2C8;
  418. case 65:
  419. return PERIPH_ID_SDMMC1;
  420. #if CONFIG_IS_ENABLED(GMAC_ROCKCHIP)
  421. case 12:
  422. return PERIPH_ID_GMAC;
  423. #endif
  424. #if !defined(CONFIG_SPL_BUILD)
  425. case 23:
  426. return PERIPH_ID_HDMI;
  427. #endif
  428. }
  429. #endif
  430. return -ENOENT;
  431. }
  432. static int rk3399_pinctrl_set_state_simple(struct udevice *dev,
  433. struct udevice *periph)
  434. {
  435. int func;
  436. func = rk3399_pinctrl_get_periph_id(dev, periph);
  437. if (func < 0)
  438. return func;
  439. return rk3399_pinctrl_request(dev, func, 0);
  440. }
  441. static struct pinctrl_ops rk3399_pinctrl_ops = {
  442. .set_state_simple = rk3399_pinctrl_set_state_simple,
  443. .request = rk3399_pinctrl_request,
  444. .get_periph_id = rk3399_pinctrl_get_periph_id,
  445. };
  446. static int rk3399_pinctrl_probe(struct udevice *dev)
  447. {
  448. struct rk3399_pinctrl_priv *priv = dev_get_priv(dev);
  449. int ret = 0;
  450. priv->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
  451. priv->pmugrf = syscon_get_first_range(ROCKCHIP_SYSCON_PMUGRF);
  452. debug("%s: grf=%p, pmugrf=%p\n", __func__, priv->grf, priv->pmugrf);
  453. return ret;
  454. }
  455. static const struct udevice_id rk3399_pinctrl_ids[] = {
  456. { .compatible = "rockchip,rk3399-pinctrl" },
  457. { }
  458. };
  459. U_BOOT_DRIVER(pinctrl_rk3399) = {
  460. .name = "rockchip_rk3399_pinctrl",
  461. .id = UCLASS_PINCTRL,
  462. .of_match = rk3399_pinctrl_ids,
  463. .priv_auto_alloc_size = sizeof(struct rk3399_pinctrl_priv),
  464. .ops = &rk3399_pinctrl_ops,
  465. #if !CONFIG_IS_ENABLED(OF_PLATDATA)
  466. .bind = dm_scan_fdt_dev,
  467. #endif
  468. .probe = rk3399_pinctrl_probe,
  469. };