pinctrl_rk3128.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Pinctrl driver for Rockchip 3128 SoCs
  4. * (C) Copyright 2017 Rockchip Electronics Co., Ltd
  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_rk3128.h>
  13. #include <asm/arch/hardware.h>
  14. #include <asm/arch/periph.h>
  15. #include <dm/pinctrl.h>
  16. DECLARE_GLOBAL_DATA_PTR;
  17. struct rk3128_pinctrl_priv {
  18. struct rk3128_grf *grf;
  19. };
  20. static void pinctrl_rk3128_i2c_config(struct rk3128_grf *grf, int i2c_id)
  21. {
  22. switch (i2c_id) {
  23. case PERIPH_ID_I2C0:
  24. rk_clrsetreg(&grf->gpio0a_iomux,
  25. GPIO0A1_MASK | GPIO0A0_MASK,
  26. GPIO0A1_I2C0_SDA << GPIO0A1_SHIFT |
  27. GPIO0A0_I2C0_SCL << GPIO0A0_SHIFT);
  28. break;
  29. case PERIPH_ID_I2C1:
  30. rk_clrsetreg(&grf->gpio0a_iomux,
  31. GPIO0A3_MASK | GPIO0A2_MASK,
  32. GPIO0A3_I2C1_SDA << GPIO0A3_SHIFT |
  33. GPIO0A2_I2C1_SCL << GPIO0A2_SHIFT);
  34. break;
  35. case PERIPH_ID_I2C2:
  36. rk_clrsetreg(&grf->gpio2c_iomux2,
  37. GPIO2C5_MASK | GPIO2C4_MASK,
  38. GPIO2C5_I2C2_SCL << GPIO2C5_SHIFT |
  39. GPIO2C4_I2C2_SDA << GPIO2C4_SHIFT);
  40. break;
  41. case PERIPH_ID_I2C3:
  42. rk_clrsetreg(&grf->gpio0a_iomux,
  43. GPIO0A7_MASK | GPIO0A6_MASK,
  44. GPIO0A7_I2C3_SDA << GPIO0A7_SHIFT |
  45. GPIO0A6_I2C3_SCL << GPIO0A6_SHIFT);
  46. break;
  47. }
  48. }
  49. static void pinctrl_rk3128_sdmmc_config(struct rk3128_grf *grf, int mmc_id)
  50. {
  51. switch (mmc_id) {
  52. case PERIPH_ID_EMMC:
  53. rk_clrsetreg(&grf->gpio1d_iomux, 0xffff,
  54. GPIO1D7_EMMC_D7 << GPIO1D7_SHIFT |
  55. GPIO1D6_EMMC_D6 << GPIO1D6_SHIFT |
  56. GPIO1D5_EMMC_D5 << GPIO1D5_SHIFT |
  57. GPIO1D4_EMMC_D4 << GPIO1D4_SHIFT |
  58. GPIO1D3_EMMC_D3 << GPIO1D3_SHIFT |
  59. GPIO1D2_EMMC_D2 << GPIO1D2_SHIFT |
  60. GPIO1D1_EMMC_D1 << GPIO1D1_SHIFT |
  61. GPIO1D0_EMMC_D0 << GPIO1D0_SHIFT);
  62. rk_clrsetreg(&grf->gpio2a_iomux,
  63. GPIO2A5_MASK | GPIO2A7_MASK,
  64. GPIO2A5_EMMC_PWREN << GPIO2A5_SHIFT |
  65. GPIO2A7_EMMC_CLKOUT << GPIO2A7_SHIFT);
  66. break;
  67. case PERIPH_ID_SDCARD:
  68. rk_clrsetreg(&grf->gpio1c_iomux, 0x0fff,
  69. GPIO1C5_MMC0_D3 << GPIO1C5_SHIFT |
  70. GPIO1C4_MMC0_D2 << GPIO1C4_SHIFT |
  71. GPIO1C3_MMC0_D1 << GPIO1C3_SHIFT |
  72. GPIO1C2_MMC0_D0 << GPIO1C2_SHIFT |
  73. GPIO1C1_MMC0_DETN << GPIO1C1_SHIFT |
  74. GPIO1C0_MMC0_CLKOUT << GPIO1C0_SHIFT);
  75. break;
  76. }
  77. }
  78. static int rk3128_pinctrl_request(struct udevice *dev, int func, int flags)
  79. {
  80. struct rk3128_pinctrl_priv *priv = dev_get_priv(dev);
  81. debug("%s: func=%x, flags=%x\n", __func__, func, flags);
  82. switch (func) {
  83. case PERIPH_ID_I2C0:
  84. case PERIPH_ID_I2C1:
  85. case PERIPH_ID_I2C2:
  86. case PERIPH_ID_I2C3:
  87. pinctrl_rk3128_i2c_config(priv->grf, func);
  88. break;
  89. case PERIPH_ID_SDMMC0:
  90. case PERIPH_ID_SDMMC1:
  91. pinctrl_rk3128_sdmmc_config(priv->grf, func);
  92. break;
  93. default:
  94. return -EINVAL;
  95. }
  96. return 0;
  97. }
  98. static int rk3128_pinctrl_get_periph_id(struct udevice *dev,
  99. struct udevice *periph)
  100. {
  101. u32 cell[3];
  102. int ret;
  103. ret = fdtdec_get_int_array(gd->fdt_blob, dev_of_offset(periph),
  104. "interrupts", cell, ARRAY_SIZE(cell));
  105. if (ret < 0)
  106. return -EINVAL;
  107. switch (cell[1]) {
  108. case 14:
  109. return PERIPH_ID_SDCARD;
  110. case 16:
  111. return PERIPH_ID_EMMC;
  112. case 20:
  113. return PERIPH_ID_UART0;
  114. case 21:
  115. return PERIPH_ID_UART1;
  116. case 22:
  117. return PERIPH_ID_UART2;
  118. case 23:
  119. return PERIPH_ID_SPI0;
  120. case 24:
  121. return PERIPH_ID_I2C0;
  122. case 25:
  123. return PERIPH_ID_I2C1;
  124. case 26:
  125. return PERIPH_ID_I2C2;
  126. case 27:
  127. return PERIPH_ID_I2C3;
  128. case 30:
  129. return PERIPH_ID_PWM0;
  130. }
  131. return -ENOENT;
  132. }
  133. static int rk3128_pinctrl_set_state_simple(struct udevice *dev,
  134. struct udevice *periph)
  135. {
  136. int func;
  137. func = rk3128_pinctrl_get_periph_id(dev, periph);
  138. if (func < 0)
  139. return func;
  140. return rk3128_pinctrl_request(dev, func, 0);
  141. }
  142. static struct pinctrl_ops rk3128_pinctrl_ops = {
  143. .set_state_simple = rk3128_pinctrl_set_state_simple,
  144. .request = rk3128_pinctrl_request,
  145. .get_periph_id = rk3128_pinctrl_get_periph_id,
  146. };
  147. static int rk3128_pinctrl_probe(struct udevice *dev)
  148. {
  149. struct rk3128_pinctrl_priv *priv = dev_get_priv(dev);
  150. priv->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
  151. debug("%s: grf=%p\n", __func__, priv->grf);
  152. return 0;
  153. }
  154. static const struct udevice_id rk3128_pinctrl_ids[] = {
  155. { .compatible = "rockchip,rk3128-pinctrl" },
  156. { }
  157. };
  158. U_BOOT_DRIVER(pinctrl_rk3128) = {
  159. .name = "pinctrl_rk3128",
  160. .id = UCLASS_PINCTRL,
  161. .of_match = rk3128_pinctrl_ids,
  162. .priv_auto_alloc_size = sizeof(struct rk3128_pinctrl_priv),
  163. .ops = &rk3128_pinctrl_ops,
  164. .bind = dm_scan_fdt_dev,
  165. .probe = rk3128_pinctrl_probe,
  166. };