pinctrl_rk3188.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Pinctrl driver for Rockchip RK3188 SoCs
  4. * Copyright (c) 2016 Heiko Stuebner <heiko@sntech.de>
  5. */
  6. #include <common.h>
  7. #include <dm.h>
  8. #include <errno.h>
  9. #include <syscon.h>
  10. #include <asm/io.h>
  11. #include <asm/arch/clock.h>
  12. #include <asm/arch/grf_rk3188.h>
  13. #include <asm/arch/hardware.h>
  14. #include <asm/arch/periph.h>
  15. #include <asm/arch/pmu_rk3188.h>
  16. #include <dm/pinctrl.h>
  17. #include <dm/root.h>
  18. DECLARE_GLOBAL_DATA_PTR;
  19. /* GRF_GPIO0D_IOMUX */
  20. enum {
  21. GPIO0D7_SHIFT = 14,
  22. GPIO0D7_MASK = 1,
  23. GPIO0D7_GPIO = 0,
  24. GPIO0D7_SPI1_CSN0,
  25. GPIO0D6_SHIFT = 12,
  26. GPIO0D6_MASK = 1,
  27. GPIO0D6_GPIO = 0,
  28. GPIO0D6_SPI1_CLK,
  29. GPIO0D5_SHIFT = 10,
  30. GPIO0D5_MASK = 1,
  31. GPIO0D5_GPIO = 0,
  32. GPIO0D5_SPI1_TXD,
  33. GPIO0D4_SHIFT = 8,
  34. GPIO0D4_MASK = 1,
  35. GPIO0D4_GPIO = 0,
  36. GPIO0D4_SPI0_RXD,
  37. GPIO0D3_SHIFT = 6,
  38. GPIO0D3_MASK = 3,
  39. GPIO0D3_GPIO = 0,
  40. GPIO0D3_FLASH_CSN3,
  41. GPIO0D3_EMMC_RSTN_OUT,
  42. GPIO0D2_SHIFT = 4,
  43. GPIO0D2_MASK = 3,
  44. GPIO0D2_GPIO = 0,
  45. GPIO0D2_FLASH_CSN2,
  46. GPIO0D2_EMMC_CMD,
  47. GPIO0D1_SHIFT = 2,
  48. GPIO0D1_MASK = 1,
  49. GPIO0D1_GPIO = 0,
  50. GPIO0D1_FLASH_CSN1,
  51. GPIO0D0_SHIFT = 0,
  52. GPIO0D0_MASK = 3,
  53. GPIO0D0_GPIO = 0,
  54. GPIO0D0_FLASH_DQS,
  55. GPIO0D0_EMMC_CLKOUT
  56. };
  57. /* GRF_GPIO1A_IOMUX */
  58. enum {
  59. GPIO1A7_SHIFT = 14,
  60. GPIO1A7_MASK = 3,
  61. GPIO1A7_GPIO = 0,
  62. GPIO1A7_UART1_RTS_N,
  63. GPIO1A7_SPI0_CSN0,
  64. GPIO1A6_SHIFT = 12,
  65. GPIO1A6_MASK = 3,
  66. GPIO1A6_GPIO = 0,
  67. GPIO1A6_UART1_CTS_N,
  68. GPIO1A6_SPI0_CLK,
  69. GPIO1A5_SHIFT = 10,
  70. GPIO1A5_MASK = 3,
  71. GPIO1A5_GPIO = 0,
  72. GPIO1A5_UART1_SOUT,
  73. GPIO1A5_SPI0_TXD,
  74. GPIO1A4_SHIFT = 8,
  75. GPIO1A4_MASK = 3,
  76. GPIO1A4_GPIO = 0,
  77. GPIO1A4_UART1_SIN,
  78. GPIO1A4_SPI0_RXD,
  79. GPIO1A3_SHIFT = 6,
  80. GPIO1A3_MASK = 1,
  81. GPIO1A3_GPIO = 0,
  82. GPIO1A3_UART0_RTS_N,
  83. GPIO1A2_SHIFT = 4,
  84. GPIO1A2_MASK = 1,
  85. GPIO1A2_GPIO = 0,
  86. GPIO1A2_UART0_CTS_N,
  87. GPIO1A1_SHIFT = 2,
  88. GPIO1A1_MASK = 1,
  89. GPIO1A1_GPIO = 0,
  90. GPIO1A1_UART0_SOUT,
  91. GPIO1A0_SHIFT = 0,
  92. GPIO1A0_MASK = 1,
  93. GPIO1A0_GPIO = 0,
  94. GPIO1A0_UART0_SIN,
  95. };
  96. /* GRF_GPIO1B_IOMUX */
  97. enum {
  98. GPIO1B7_SHIFT = 14,
  99. GPIO1B7_MASK = 1,
  100. GPIO1B7_GPIO = 0,
  101. GPIO1B7_SPI0_CSN1,
  102. GPIO1B6_SHIFT = 12,
  103. GPIO1B6_MASK = 3,
  104. GPIO1B6_GPIO = 0,
  105. GPIO1B6_SPDIF_TX,
  106. GPIO1B6_SPI1_CSN1,
  107. GPIO1B5_SHIFT = 10,
  108. GPIO1B5_MASK = 3,
  109. GPIO1B5_GPIO = 0,
  110. GPIO1B5_UART3_RTS_N,
  111. GPIO1B5_RESERVED,
  112. GPIO1B4_SHIFT = 8,
  113. GPIO1B4_MASK = 3,
  114. GPIO1B4_GPIO = 0,
  115. GPIO1B4_UART3_CTS_N,
  116. GPIO1B4_GPS_RFCLK,
  117. GPIO1B3_SHIFT = 6,
  118. GPIO1B3_MASK = 3,
  119. GPIO1B3_GPIO = 0,
  120. GPIO1B3_UART3_SOUT,
  121. GPIO1B3_GPS_SIG,
  122. GPIO1B2_SHIFT = 4,
  123. GPIO1B2_MASK = 3,
  124. GPIO1B2_GPIO = 0,
  125. GPIO1B2_UART3_SIN,
  126. GPIO1B2_GPS_MAG,
  127. GPIO1B1_SHIFT = 2,
  128. GPIO1B1_MASK = 3,
  129. GPIO1B1_GPIO = 0,
  130. GPIO1B1_UART2_SOUT,
  131. GPIO1B1_JTAG_TDO,
  132. GPIO1B0_SHIFT = 0,
  133. GPIO1B0_MASK = 3,
  134. GPIO1B0_GPIO = 0,
  135. GPIO1B0_UART2_SIN,
  136. GPIO1B0_JTAG_TDI,
  137. };
  138. /* GRF_GPIO1D_IOMUX */
  139. enum {
  140. GPIO1D7_SHIFT = 14,
  141. GPIO1D7_MASK = 1,
  142. GPIO1D7_GPIO = 0,
  143. GPIO1D7_I2C4_SCL,
  144. GPIO1D6_SHIFT = 12,
  145. GPIO1D6_MASK = 1,
  146. GPIO1D6_GPIO = 0,
  147. GPIO1D6_I2C4_SDA,
  148. GPIO1D5_SHIFT = 10,
  149. GPIO1D5_MASK = 1,
  150. GPIO1D5_GPIO = 0,
  151. GPIO1D5_I2C2_SCL,
  152. GPIO1D4_SHIFT = 8,
  153. GPIO1D4_MASK = 1,
  154. GPIO1D4_GPIO = 0,
  155. GPIO1D4_I2C2_SDA,
  156. GPIO1D3_SHIFT = 6,
  157. GPIO1D3_MASK = 1,
  158. GPIO1D3_GPIO = 0,
  159. GPIO1D3_I2C1_SCL,
  160. GPIO1D2_SHIFT = 4,
  161. GPIO1D2_MASK = 1,
  162. GPIO1D2_GPIO = 0,
  163. GPIO1D2_I2C1_SDA,
  164. GPIO1D1_SHIFT = 2,
  165. GPIO1D1_MASK = 1,
  166. GPIO1D1_GPIO = 0,
  167. GPIO1D1_I2C0_SCL,
  168. GPIO1D0_SHIFT = 0,
  169. GPIO1D0_MASK = 1,
  170. GPIO1D0_GPIO = 0,
  171. GPIO1D0_I2C0_SDA,
  172. };
  173. /* GRF_GPIO3A_IOMUX */
  174. enum {
  175. GPIO3A7_SHIFT = 14,
  176. GPIO3A7_MASK = 1,
  177. GPIO3A7_GPIO = 0,
  178. GPIO3A7_SDMMC0_DATA3,
  179. GPIO3A6_SHIFT = 12,
  180. GPIO3A6_MASK = 1,
  181. GPIO3A6_GPIO = 0,
  182. GPIO3A6_SDMMC0_DATA2,
  183. GPIO3A5_SHIFT = 10,
  184. GPIO3A5_MASK = 1,
  185. GPIO3A5_GPIO = 0,
  186. GPIO3A5_SDMMC0_DATA1,
  187. GPIO3A4_SHIFT = 8,
  188. GPIO3A4_MASK = 1,
  189. GPIO3A4_GPIO = 0,
  190. GPIO3A4_SDMMC0_DATA0,
  191. GPIO3A3_SHIFT = 6,
  192. GPIO3A3_MASK = 1,
  193. GPIO3A3_GPIO = 0,
  194. GPIO3A3_SDMMC0_CMD,
  195. GPIO3A2_SHIFT = 4,
  196. GPIO3A2_MASK = 1,
  197. GPIO3A2_GPIO = 0,
  198. GPIO3A2_SDMMC0_CLKOUT,
  199. GPIO3A1_SHIFT = 2,
  200. GPIO3A1_MASK = 1,
  201. GPIO3A1_GPIO = 0,
  202. GPIO3A1_SDMMC0_PWREN,
  203. GPIO3A0_SHIFT = 0,
  204. GPIO3A0_MASK = 1,
  205. GPIO3A0_GPIO = 0,
  206. GPIO3A0_SDMMC0_RSTN,
  207. };
  208. /* GRF_GPIO3B_IOMUX */
  209. enum {
  210. GPIO3B7_SHIFT = 14,
  211. GPIO3B7_MASK = 3,
  212. GPIO3B7_GPIO = 0,
  213. GPIO3B7_CIF_DATA11,
  214. GPIO3B7_I2C3_SCL,
  215. GPIO3B6_SHIFT = 12,
  216. GPIO3B6_MASK = 3,
  217. GPIO3B6_GPIO = 0,
  218. GPIO3B6_CIF_DATA10,
  219. GPIO3B6_I2C3_SDA,
  220. GPIO3B5_SHIFT = 10,
  221. GPIO3B5_MASK = 3,
  222. GPIO3B5_GPIO = 0,
  223. GPIO3B5_CIF_DATA1,
  224. GPIO3B5_HSADC_DATA9,
  225. GPIO3B4_SHIFT = 8,
  226. GPIO3B4_MASK = 3,
  227. GPIO3B4_GPIO = 0,
  228. GPIO3B4_CIF_DATA0,
  229. GPIO3B4_HSADC_DATA8,
  230. GPIO3B3_SHIFT = 6,
  231. GPIO3B3_MASK = 1,
  232. GPIO3B3_GPIO = 0,
  233. GPIO3B3_CIF_CLKOUT,
  234. GPIO3B2_SHIFT = 4,
  235. GPIO3B2_MASK = 1,
  236. GPIO3B2_GPIO = 0,
  237. /* no muxes */
  238. GPIO3B1_SHIFT = 2,
  239. GPIO3B1_MASK = 1,
  240. GPIO3B1_GPIO = 0,
  241. GPIO3B1_SDMMC0_WRITE_PRT,
  242. GPIO3B0_SHIFT = 0,
  243. GPIO3B0_MASK = 1,
  244. GPIO3B0_GPIO = 0,
  245. GPIO3B0_SDMMC_DETECT_N,
  246. };
  247. /* GRF_GPIO3C_IOMUX */
  248. enum {
  249. GPIO3C7_SHIFT = 14,
  250. GPIO3C7_MASK = 3,
  251. GPIO3C7_GPIO = 0,
  252. GPIO3C7_SDMMC1_WRITE_PRT,
  253. GPIO3C7_RMII_CRS_DVALID,
  254. GPIO3C7_RESERVED,
  255. GPIO3C6_SHIFT = 12,
  256. GPIO3C6_MASK = 3,
  257. GPIO3C6_GPIO = 0,
  258. GPIO3C6_SDMMC1_DECTN,
  259. GPIO3C6_RMII_RX_ERR,
  260. GPIO3C6_RESERVED,
  261. GPIO3C5_SHIFT = 10,
  262. GPIO3C5_MASK = 3,
  263. GPIO3C5_GPIO = 0,
  264. GPIO3C5_SDMMC1_CLKOUT,
  265. GPIO3C5_RMII_CLKOUT,
  266. GPIO3C5_RMII_CLKIN,
  267. GPIO3C4_SHIFT = 8,
  268. GPIO3C4_MASK = 3,
  269. GPIO3C4_GPIO = 0,
  270. GPIO3C4_SDMMC1_DATA3,
  271. GPIO3C4_RMII_RXD1,
  272. GPIO3C4_RESERVED,
  273. GPIO3C3_SHIFT = 6,
  274. GPIO3C3_MASK = 3,
  275. GPIO3C3_GPIO = 0,
  276. GPIO3C3_SDMMC1_DATA2,
  277. GPIO3C3_RMII_RXD0,
  278. GPIO3C3_RESERVED,
  279. GPIO3C2_SHIFT = 4,
  280. GPIO3C2_MASK = 3,
  281. GPIO3C2_GPIO = 0,
  282. GPIO3C2_SDMMC1_DATA1,
  283. GPIO3C2_RMII_TXD0,
  284. GPIO3C2_RESERVED,
  285. GPIO3C1_SHIFT = 2,
  286. GPIO3C1_MASK = 3,
  287. GPIO3C1_GPIO = 0,
  288. GPIO3C1_SDMMC1_DATA0,
  289. GPIO3C1_RMII_TXD1,
  290. GPIO3C1_RESERVED,
  291. GPIO3C0_SHIFT = 0,
  292. GPIO3C0_MASK = 3,
  293. GPIO3C0_GPIO = 0,
  294. GPIO3C0_SDMMC1_CMD,
  295. GPIO3C0_RMII_TX_EN,
  296. GPIO3C0_RESERVED,
  297. };
  298. /* GRF_GPIO3D_IOMUX */
  299. enum {
  300. GPIO3D6_SHIFT = 12,
  301. GPIO3D6_MASK = 3,
  302. GPIO3D6_GPIO = 0,
  303. GPIO3D6_PWM_3,
  304. GPIO3D6_JTAG_TMS,
  305. GPIO3D6_HOST_DRV_VBUS,
  306. GPIO3D5_SHIFT = 10,
  307. GPIO3D5_MASK = 3,
  308. GPIO3D5_GPIO = 0,
  309. GPIO3D5_PWM_2,
  310. GPIO3D5_JTAG_TCK,
  311. GPIO3D5_OTG_DRV_VBUS,
  312. GPIO3D4_SHIFT = 8,
  313. GPIO3D4_MASK = 3,
  314. GPIO3D4_GPIO = 0,
  315. GPIO3D4_PWM_1,
  316. GPIO3D4_JTAG_TRSTN,
  317. GPIO3D3_SHIFT = 6,
  318. GPIO3D3_MASK = 3,
  319. GPIO3D3_GPIO = 0,
  320. GPIO3D3_PWM_0,
  321. GPIO3D2_SHIFT = 4,
  322. GPIO3D2_MASK = 3,
  323. GPIO3D2_GPIO = 0,
  324. GPIO3D2_SDMMC1_INT_N,
  325. GPIO3D1_SHIFT = 2,
  326. GPIO3D1_MASK = 3,
  327. GPIO3D1_GPIO = 0,
  328. GPIO3D1_SDMMC1_BACKEND_PWR,
  329. GPIO3D1_MII_MDCLK,
  330. GPIO3D0_SHIFT = 0,
  331. GPIO3D0_MASK = 3,
  332. GPIO3D0_GPIO = 0,
  333. GPIO3D0_SDMMC1_PWR_EN,
  334. GPIO3D0_MII_MD,
  335. };
  336. struct rk3188_pinctrl_priv {
  337. struct rk3188_grf *grf;
  338. struct rk3188_pmu *pmu;
  339. int num_banks;
  340. };
  341. /**
  342. * Encode variants of iomux registers into a type variable
  343. */
  344. #define IOMUX_GPIO_ONLY BIT(0)
  345. /**
  346. * @type: iomux variant using IOMUX_* constants
  347. * @offset: if initialized to -1 it will be autocalculated, by specifying
  348. * an initial offset value the relevant source offset can be reset
  349. * to a new value for autocalculating the following iomux registers.
  350. */
  351. struct rockchip_iomux {
  352. u8 type;
  353. s16 offset;
  354. };
  355. /**
  356. * @reg: register offset of the gpio bank
  357. * @nr_pins: number of pins in this bank
  358. * @bank_num: number of the bank, to account for holes
  359. * @name: name of the bank
  360. * @iomux: array describing the 4 iomux sources of the bank
  361. */
  362. struct rockchip_pin_bank {
  363. u16 reg;
  364. u8 nr_pins;
  365. u8 bank_num;
  366. char *name;
  367. struct rockchip_iomux iomux[4];
  368. };
  369. #define PIN_BANK(id, pins, label) \
  370. { \
  371. .bank_num = id, \
  372. .nr_pins = pins, \
  373. .name = label, \
  374. .iomux = { \
  375. { .offset = -1 }, \
  376. { .offset = -1 }, \
  377. { .offset = -1 }, \
  378. { .offset = -1 }, \
  379. }, \
  380. }
  381. #define PIN_BANK_IOMUX_FLAGS(id, pins, label, iom0, iom1, iom2, iom3) \
  382. { \
  383. .bank_num = id, \
  384. .nr_pins = pins, \
  385. .name = label, \
  386. .iomux = { \
  387. { .type = iom0, .offset = -1 }, \
  388. { .type = iom1, .offset = -1 }, \
  389. { .type = iom2, .offset = -1 }, \
  390. { .type = iom3, .offset = -1 }, \
  391. }, \
  392. }
  393. #ifndef CONFIG_SPL_BUILD
  394. static struct rockchip_pin_bank rk3188_pin_banks[] = {
  395. PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_GPIO_ONLY, 0, 0, 0),
  396. PIN_BANK(1, 32, "gpio1"),
  397. PIN_BANK(2, 32, "gpio2"),
  398. PIN_BANK(3, 32, "gpio3"),
  399. };
  400. #endif
  401. static void pinctrl_rk3188_pwm_config(struct rk3188_grf *grf, int pwm_id)
  402. {
  403. switch (pwm_id) {
  404. case PERIPH_ID_PWM0:
  405. rk_clrsetreg(&grf->gpio3d_iomux, GPIO3D3_MASK << GPIO3D3_SHIFT,
  406. GPIO3D3_PWM_0 << GPIO3D3_SHIFT);
  407. break;
  408. case PERIPH_ID_PWM1:
  409. rk_clrsetreg(&grf->gpio3d_iomux, GPIO3D4_MASK << GPIO3D4_SHIFT,
  410. GPIO3D4_PWM_1 << GPIO3D4_SHIFT);
  411. break;
  412. case PERIPH_ID_PWM2:
  413. rk_clrsetreg(&grf->gpio3d_iomux, GPIO3D5_MASK << GPIO3D5_SHIFT,
  414. GPIO3D5_PWM_2 << GPIO3D5_SHIFT);
  415. break;
  416. case PERIPH_ID_PWM3:
  417. rk_clrsetreg(&grf->gpio3d_iomux, GPIO3D6_MASK << GPIO3D6_SHIFT,
  418. GPIO3D6_PWM_3 << GPIO3D6_SHIFT);
  419. break;
  420. default:
  421. debug("pwm id = %d iomux error!\n", pwm_id);
  422. break;
  423. }
  424. }
  425. static void pinctrl_rk3188_i2c_config(struct rk3188_grf *grf,
  426. struct rk3188_pmu *pmu, int i2c_id)
  427. {
  428. switch (i2c_id) {
  429. case PERIPH_ID_I2C0:
  430. rk_clrsetreg(&grf->gpio1d_iomux,
  431. GPIO1D1_MASK << GPIO1D1_SHIFT |
  432. GPIO1D0_MASK << GPIO1D0_SHIFT,
  433. GPIO1D1_I2C0_SCL << GPIO1D1_SHIFT |
  434. GPIO1D0_I2C0_SDA << GPIO1D0_SHIFT);
  435. /* enable new i2c controller */
  436. rk_clrsetreg(&grf->soc_con1, 1 << RKI2C0_SEL_SHIFT,
  437. 1 << RKI2C0_SEL_SHIFT);
  438. break;
  439. case PERIPH_ID_I2C1:
  440. rk_clrsetreg(&grf->gpio1d_iomux,
  441. GPIO1D3_MASK << GPIO1D3_SHIFT |
  442. GPIO1D2_MASK << GPIO1D2_SHIFT,
  443. GPIO1D3_I2C1_SCL << GPIO1D2_SHIFT |
  444. GPIO1D2_I2C1_SDA << GPIO1D2_SHIFT);
  445. rk_clrsetreg(&grf->soc_con1, 1 << RKI2C1_SEL_SHIFT,
  446. 1 << RKI2C1_SEL_SHIFT);
  447. break;
  448. case PERIPH_ID_I2C2:
  449. rk_clrsetreg(&grf->gpio1d_iomux,
  450. GPIO1D5_MASK << GPIO1D5_SHIFT |
  451. GPIO1D4_MASK << GPIO1D4_SHIFT,
  452. GPIO1D5_I2C2_SCL << GPIO1D5_SHIFT |
  453. GPIO1D4_I2C2_SDA << GPIO1D4_SHIFT);
  454. rk_clrsetreg(&grf->soc_con1, 1 << RKI2C2_SEL_SHIFT,
  455. 1 << RKI2C2_SEL_SHIFT);
  456. break;
  457. case PERIPH_ID_I2C3:
  458. rk_clrsetreg(&grf->gpio3b_iomux,
  459. GPIO3B7_MASK << GPIO3B7_SHIFT |
  460. GPIO3B6_MASK << GPIO3B6_SHIFT,
  461. GPIO3B7_I2C3_SCL << GPIO3B7_SHIFT |
  462. GPIO3B6_I2C3_SDA << GPIO3B6_SHIFT);
  463. rk_clrsetreg(&grf->soc_con1, 1 << RKI2C3_SEL_SHIFT,
  464. 1 << RKI2C3_SEL_SHIFT);
  465. break;
  466. case PERIPH_ID_I2C4:
  467. rk_clrsetreg(&grf->gpio1d_iomux,
  468. GPIO1D7_MASK << GPIO1D7_SHIFT |
  469. GPIO1D6_MASK << GPIO1D6_SHIFT,
  470. GPIO1D7_I2C4_SCL << GPIO1D7_SHIFT |
  471. GPIO1D6_I2C4_SDA << GPIO1D6_SHIFT);
  472. rk_clrsetreg(&grf->soc_con1, 1 << RKI2C4_SEL_SHIFT,
  473. 1 << RKI2C4_SEL_SHIFT);
  474. break;
  475. default:
  476. debug("i2c id = %d iomux error!\n", i2c_id);
  477. break;
  478. }
  479. }
  480. static int pinctrl_rk3188_spi_config(struct rk3188_grf *grf,
  481. enum periph_id spi_id, int cs)
  482. {
  483. switch (spi_id) {
  484. case PERIPH_ID_SPI0:
  485. switch (cs) {
  486. case 0:
  487. rk_clrsetreg(&grf->gpio1a_iomux,
  488. GPIO1A7_MASK << GPIO1A7_SHIFT,
  489. GPIO1A7_SPI0_CSN0 << GPIO1A7_SHIFT);
  490. break;
  491. case 1:
  492. rk_clrsetreg(&grf->gpio1b_iomux,
  493. GPIO1B7_MASK << GPIO1B7_SHIFT,
  494. GPIO1B7_SPI0_CSN1 << GPIO1B7_SHIFT);
  495. break;
  496. default:
  497. goto err;
  498. }
  499. rk_clrsetreg(&grf->gpio1a_iomux,
  500. GPIO1A4_MASK << GPIO1A4_SHIFT |
  501. GPIO1A5_MASK << GPIO1A5_SHIFT |
  502. GPIO1A6_MASK << GPIO1A6_SHIFT,
  503. GPIO1A4_SPI0_RXD << GPIO1A4_SHIFT |
  504. GPIO1A5_SPI0_TXD << GPIO1A5_SHIFT |
  505. GPIO1A6_SPI0_CLK << GPIO1A6_SHIFT);
  506. break;
  507. case PERIPH_ID_SPI1:
  508. switch (cs) {
  509. case 0:
  510. rk_clrsetreg(&grf->gpio0d_iomux,
  511. GPIO0D7_MASK << GPIO0D7_SHIFT,
  512. GPIO0D7_SPI1_CSN0 << GPIO0D7_SHIFT);
  513. break;
  514. case 1:
  515. rk_clrsetreg(&grf->gpio1b_iomux,
  516. GPIO1B6_MASK << GPIO1B6_SHIFT,
  517. GPIO1B6_SPI1_CSN1 << GPIO1B6_SHIFT);
  518. break;
  519. default:
  520. goto err;
  521. }
  522. rk_clrsetreg(&grf->gpio0d_iomux,
  523. GPIO0D4_MASK << GPIO0D4_SHIFT |
  524. GPIO0D5_MASK << GPIO0D5_SHIFT |
  525. GPIO0D6_MASK << GPIO0D6_SHIFT,
  526. GPIO0D4_SPI0_RXD << GPIO0D4_SHIFT |
  527. GPIO0D5_SPI1_TXD << GPIO0D5_SHIFT |
  528. GPIO0D6_SPI1_CLK << GPIO0D6_SHIFT);
  529. break;
  530. default:
  531. goto err;
  532. }
  533. return 0;
  534. err:
  535. debug("rkspi: periph%d cs=%d not supported", spi_id, cs);
  536. return -ENOENT;
  537. }
  538. static void pinctrl_rk3188_uart_config(struct rk3188_grf *grf, int uart_id)
  539. {
  540. switch (uart_id) {
  541. case PERIPH_ID_UART0:
  542. rk_clrsetreg(&grf->gpio1a_iomux,
  543. GPIO1A3_MASK << GPIO1A3_SHIFT |
  544. GPIO1A2_MASK << GPIO1A2_SHIFT |
  545. GPIO1A1_MASK << GPIO1A1_SHIFT |
  546. GPIO1A0_MASK << GPIO1A0_SHIFT,
  547. GPIO1A3_UART0_RTS_N << GPIO1A3_SHIFT |
  548. GPIO1A2_UART0_CTS_N << GPIO1A2_SHIFT |
  549. GPIO1A1_UART0_SOUT << GPIO1A1_SHIFT |
  550. GPIO1A0_UART0_SIN << GPIO1A0_SHIFT);
  551. break;
  552. case PERIPH_ID_UART1:
  553. rk_clrsetreg(&grf->gpio1a_iomux,
  554. GPIO1A7_MASK << GPIO1A7_SHIFT |
  555. GPIO1A6_MASK << GPIO1A6_SHIFT |
  556. GPIO1A5_MASK << GPIO1A5_SHIFT |
  557. GPIO1A4_MASK << GPIO1A4_SHIFT,
  558. GPIO1A7_UART1_RTS_N << GPIO1A7_SHIFT |
  559. GPIO1A6_UART1_CTS_N << GPIO1A6_SHIFT |
  560. GPIO1A5_UART1_SOUT << GPIO1A5_SHIFT |
  561. GPIO1A4_UART1_SIN << GPIO1A4_SHIFT);
  562. break;
  563. case PERIPH_ID_UART2:
  564. rk_clrsetreg(&grf->gpio1b_iomux,
  565. GPIO1B1_MASK << GPIO1B1_SHIFT |
  566. GPIO1B0_MASK << GPIO1B0_SHIFT,
  567. GPIO1B1_UART2_SOUT << GPIO1B1_SHIFT |
  568. GPIO1B0_UART2_SIN << GPIO1B0_SHIFT);
  569. break;
  570. case PERIPH_ID_UART3:
  571. rk_clrsetreg(&grf->gpio1b_iomux,
  572. GPIO1B5_MASK << GPIO1B5_SHIFT |
  573. GPIO1B4_MASK << GPIO1B4_SHIFT |
  574. GPIO1B3_MASK << GPIO1B3_SHIFT |
  575. GPIO1B2_MASK << GPIO1B2_SHIFT,
  576. GPIO1B5_UART3_RTS_N << GPIO1B5_SHIFT |
  577. GPIO1B4_UART3_CTS_N << GPIO1B4_SHIFT |
  578. GPIO1B3_UART3_SOUT << GPIO1B3_SHIFT |
  579. GPIO1B2_UART3_SIN << GPIO1B2_SHIFT);
  580. break;
  581. default:
  582. debug("uart id = %d iomux error!\n", uart_id);
  583. break;
  584. }
  585. }
  586. static void pinctrl_rk3188_sdmmc_config(struct rk3188_grf *grf, int mmc_id)
  587. {
  588. switch (mmc_id) {
  589. case PERIPH_ID_EMMC:
  590. rk_clrsetreg(&grf->soc_con0, 1 << EMMC_FLASH_SEL_SHIFT,
  591. 1 << EMMC_FLASH_SEL_SHIFT);
  592. rk_clrsetreg(&grf->gpio0d_iomux,
  593. GPIO0D2_MASK << GPIO0D2_SHIFT |
  594. GPIO0D0_MASK << GPIO0D0_SHIFT,
  595. GPIO0D2_EMMC_CMD << GPIO0D2_SHIFT |
  596. GPIO0D0_EMMC_CLKOUT << GPIO0D0_SHIFT);
  597. break;
  598. case PERIPH_ID_SDCARD:
  599. rk_clrsetreg(&grf->gpio3b_iomux,
  600. GPIO3B0_MASK << GPIO3B0_SHIFT,
  601. GPIO3B0_SDMMC_DETECT_N << GPIO3B0_SHIFT);
  602. rk_clrsetreg(&grf->gpio3a_iomux,
  603. GPIO3A7_MASK << GPIO3A7_SHIFT |
  604. GPIO3A6_MASK << GPIO3A6_SHIFT |
  605. GPIO3A5_MASK << GPIO3A5_SHIFT |
  606. GPIO3A4_MASK << GPIO3A4_SHIFT |
  607. GPIO3A3_MASK << GPIO3A3_SHIFT |
  608. GPIO3A3_MASK << GPIO3A2_SHIFT,
  609. GPIO3A7_SDMMC0_DATA3 << GPIO3A7_SHIFT |
  610. GPIO3A6_SDMMC0_DATA2 << GPIO3A6_SHIFT |
  611. GPIO3A5_SDMMC0_DATA1 << GPIO3A5_SHIFT |
  612. GPIO3A4_SDMMC0_DATA0 << GPIO3A4_SHIFT |
  613. GPIO3A3_SDMMC0_CMD << GPIO3A3_SHIFT |
  614. GPIO3A2_SDMMC0_CLKOUT << GPIO3A2_SHIFT);
  615. break;
  616. default:
  617. debug("mmc id = %d iomux error!\n", mmc_id);
  618. break;
  619. }
  620. }
  621. static int rk3188_pinctrl_request(struct udevice *dev, int func, int flags)
  622. {
  623. struct rk3188_pinctrl_priv *priv = dev_get_priv(dev);
  624. debug("%s: func=%x, flags=%x\n", __func__, func, flags);
  625. switch (func) {
  626. case PERIPH_ID_PWM0:
  627. case PERIPH_ID_PWM1:
  628. case PERIPH_ID_PWM2:
  629. case PERIPH_ID_PWM3:
  630. case PERIPH_ID_PWM4:
  631. pinctrl_rk3188_pwm_config(priv->grf, func);
  632. break;
  633. case PERIPH_ID_I2C0:
  634. case PERIPH_ID_I2C1:
  635. case PERIPH_ID_I2C2:
  636. case PERIPH_ID_I2C3:
  637. case PERIPH_ID_I2C4:
  638. case PERIPH_ID_I2C5:
  639. pinctrl_rk3188_i2c_config(priv->grf, priv->pmu, func);
  640. break;
  641. case PERIPH_ID_SPI0:
  642. case PERIPH_ID_SPI1:
  643. case PERIPH_ID_SPI2:
  644. pinctrl_rk3188_spi_config(priv->grf, func, flags);
  645. break;
  646. case PERIPH_ID_UART0:
  647. case PERIPH_ID_UART1:
  648. case PERIPH_ID_UART2:
  649. case PERIPH_ID_UART3:
  650. case PERIPH_ID_UART4:
  651. pinctrl_rk3188_uart_config(priv->grf, func);
  652. break;
  653. break;
  654. case PERIPH_ID_SDMMC0:
  655. case PERIPH_ID_SDMMC1:
  656. pinctrl_rk3188_sdmmc_config(priv->grf, func);
  657. break;
  658. default:
  659. return -EINVAL;
  660. }
  661. return 0;
  662. }
  663. static int rk3188_pinctrl_get_periph_id(struct udevice *dev,
  664. struct udevice *periph)
  665. {
  666. #if !CONFIG_IS_ENABLED(OF_PLATDATA)
  667. u32 cell[3];
  668. int ret;
  669. ret = dev_read_u32_array(periph, "interrupts", cell, ARRAY_SIZE(cell));
  670. if (ret < 0)
  671. return -EINVAL;
  672. switch (cell[1]) {
  673. case 44:
  674. return PERIPH_ID_SPI0;
  675. case 45:
  676. return PERIPH_ID_SPI1;
  677. case 46:
  678. return PERIPH_ID_SPI2;
  679. case 60:
  680. return PERIPH_ID_I2C0;
  681. case 62: /* Note strange order */
  682. return PERIPH_ID_I2C1;
  683. case 61:
  684. return PERIPH_ID_I2C2;
  685. case 63:
  686. return PERIPH_ID_I2C3;
  687. case 64:
  688. return PERIPH_ID_I2C4;
  689. case 65:
  690. return PERIPH_ID_I2C5;
  691. }
  692. #endif
  693. return -ENOENT;
  694. }
  695. static int rk3188_pinctrl_set_state_simple(struct udevice *dev,
  696. struct udevice *periph)
  697. {
  698. int func;
  699. func = rk3188_pinctrl_get_periph_id(dev, periph);
  700. if (func < 0)
  701. return func;
  702. return rk3188_pinctrl_request(dev, func, 0);
  703. }
  704. #ifndef CONFIG_SPL_BUILD
  705. int rk3188_pinctrl_get_pin_info(struct rk3188_pinctrl_priv *priv,
  706. int banknum, int ind, u32 **addrp, uint *shiftp,
  707. uint *maskp)
  708. {
  709. struct rockchip_pin_bank *bank = &rk3188_pin_banks[banknum];
  710. uint muxnum;
  711. u32 *addr;
  712. for (muxnum = 0; muxnum < 4; muxnum++) {
  713. struct rockchip_iomux *mux = &bank->iomux[muxnum];
  714. if (ind >= 8) {
  715. ind -= 8;
  716. continue;
  717. }
  718. addr = &priv->grf->gpio0c_iomux - 2;
  719. addr += mux->offset;
  720. *shiftp = ind & 7;
  721. *maskp = 3;
  722. *shiftp *= 2;
  723. debug("%s: addr=%p, mask=%x, shift=%x\n", __func__, addr,
  724. *maskp, *shiftp);
  725. *addrp = addr;
  726. return 0;
  727. }
  728. return -EINVAL;
  729. }
  730. static int rk3188_pinctrl_get_gpio_mux(struct udevice *dev, int banknum,
  731. int index)
  732. {
  733. struct rk3188_pinctrl_priv *priv = dev_get_priv(dev);
  734. uint shift;
  735. uint mask;
  736. u32 *addr;
  737. int ret;
  738. ret = rk3188_pinctrl_get_pin_info(priv, banknum, index, &addr, &shift,
  739. &mask);
  740. if (ret)
  741. return ret;
  742. return (readl(addr) & mask) >> shift;
  743. }
  744. static int rk3188_pinctrl_set_pins(struct udevice *dev, int banknum, int index,
  745. int muxval, int flags)
  746. {
  747. struct rk3188_pinctrl_priv *priv = dev_get_priv(dev);
  748. uint shift, ind = index;
  749. uint mask;
  750. u32 *addr;
  751. int ret;
  752. debug("%s: %x %x %x %x\n", __func__, banknum, index, muxval, flags);
  753. ret = rk3188_pinctrl_get_pin_info(priv, banknum, index, &addr, &shift,
  754. &mask);
  755. if (ret)
  756. return ret;
  757. rk_clrsetreg(addr, mask << shift, muxval << shift);
  758. /* Handle pullup/pulldown */
  759. if (flags) {
  760. uint val = 0;
  761. if (flags & (1 << PIN_CONFIG_BIAS_PULL_UP))
  762. val = 1;
  763. else if (flags & (1 << PIN_CONFIG_BIAS_PULL_DOWN))
  764. val = 2;
  765. ind = index >> 3;
  766. if (banknum == 0 && index < 12) {
  767. addr = &priv->pmu->gpio0_p[ind];
  768. shift = (index & 7) * 2;
  769. } else if (banknum == 0 && index >= 12) {
  770. addr = &priv->grf->gpio0_p[ind - 1];
  771. /*
  772. * The bits in the grf-registers have an inverse
  773. * ordering with the lowest pin being in bits 15:14
  774. * and the highest pin in bits 1:0 .
  775. */
  776. shift = (7 - (index & 7)) * 2;
  777. } else {
  778. addr = &priv->grf->gpio1_p[banknum - 1][ind];
  779. shift = (7 - (index & 7)) * 2;
  780. }
  781. debug("%s: addr=%p, val=%x, shift=%x\n", __func__, addr, val,
  782. shift);
  783. rk_clrsetreg(addr, 3 << shift, val << shift);
  784. }
  785. return 0;
  786. }
  787. static int rk3188_pinctrl_set_state(struct udevice *dev, struct udevice *config)
  788. {
  789. const void *blob = gd->fdt_blob;
  790. int pcfg_node, ret, flags, count, i;
  791. u32 cell[60], *ptr;
  792. debug("%s: %s %s\n", __func__, dev->name, config->name);
  793. ret = fdtdec_get_int_array_count(blob, dev_of_offset(config),
  794. "rockchip,pins", cell,
  795. ARRAY_SIZE(cell));
  796. if (ret < 0) {
  797. debug("%s: bad array %d\n", __func__, ret);
  798. return -EINVAL;
  799. }
  800. count = ret;
  801. for (i = 0, ptr = cell; i < count; i += 4, ptr += 4) {
  802. pcfg_node = fdt_node_offset_by_phandle(blob, ptr[3]);
  803. if (pcfg_node < 0)
  804. return -EINVAL;
  805. flags = pinctrl_decode_pin_config(blob, pcfg_node);
  806. if (flags < 0)
  807. return flags;
  808. ret = rk3188_pinctrl_set_pins(dev, ptr[0], ptr[1], ptr[2],
  809. flags);
  810. if (ret)
  811. return ret;
  812. }
  813. return 0;
  814. }
  815. #endif
  816. static struct pinctrl_ops rk3188_pinctrl_ops = {
  817. #ifndef CONFIG_SPL_BUILD
  818. .set_state = rk3188_pinctrl_set_state,
  819. .get_gpio_mux = rk3188_pinctrl_get_gpio_mux,
  820. #endif
  821. .set_state_simple = rk3188_pinctrl_set_state_simple,
  822. .request = rk3188_pinctrl_request,
  823. .get_periph_id = rk3188_pinctrl_get_periph_id,
  824. };
  825. #ifndef CONFIG_SPL_BUILD
  826. static int rk3188_pinctrl_parse_tables(struct rk3188_pinctrl_priv *priv,
  827. struct rockchip_pin_bank *banks,
  828. int count)
  829. {
  830. struct rockchip_pin_bank *bank;
  831. uint reg, muxnum, banknum;
  832. reg = 0;
  833. for (banknum = 0; banknum < count; banknum++) {
  834. bank = &banks[banknum];
  835. bank->reg = reg;
  836. debug("%s: bank %d, reg %x\n", __func__, banknum, reg * 4);
  837. for (muxnum = 0; muxnum < 4; muxnum++) {
  838. struct rockchip_iomux *mux = &bank->iomux[muxnum];
  839. mux->offset = reg;
  840. reg += 1;
  841. }
  842. }
  843. return 0;
  844. }
  845. #endif
  846. static int rk3188_pinctrl_probe(struct udevice *dev)
  847. {
  848. struct rk3188_pinctrl_priv *priv = dev_get_priv(dev);
  849. int ret = 0;
  850. priv->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
  851. priv->pmu = syscon_get_first_range(ROCKCHIP_SYSCON_PMU);
  852. debug("%s: grf=%p, pmu=%p\n", __func__, priv->grf, priv->pmu);
  853. #ifndef CONFIG_SPL_BUILD
  854. ret = rk3188_pinctrl_parse_tables(priv, rk3188_pin_banks,
  855. ARRAY_SIZE(rk3188_pin_banks));
  856. #endif
  857. return ret;
  858. }
  859. static const struct udevice_id rk3188_pinctrl_ids[] = {
  860. { .compatible = "rockchip,rk3188-pinctrl" },
  861. { }
  862. };
  863. U_BOOT_DRIVER(pinctrl_rk3188) = {
  864. .name = "rockchip_rk3188_pinctrl",
  865. .id = UCLASS_PINCTRL,
  866. .of_match = rk3188_pinctrl_ids,
  867. .priv_auto_alloc_size = sizeof(struct rk3188_pinctrl_priv),
  868. .ops = &rk3188_pinctrl_ops,
  869. #if !CONFIG_IS_ENABLED(OF_PLATDATA)
  870. .bind = dm_scan_fdt_dev,
  871. #endif
  872. .probe = rk3188_pinctrl_probe,
  873. };