grf.c 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. /*
  2. * Copyright (c) 2006-2022, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2022-11-21 GuEe-GUI first version
  9. */
  10. #include <rthw.h>
  11. #include <rtthread.h>
  12. #include <rtdevice.h>
  13. #define DBG_TAG "soc.rockchip.grf"
  14. #define DBG_LVL DBG_INFO
  15. #include <rtdbg.h>
  16. #include "rockchip.h"
  17. struct rockchip_grf_value
  18. {
  19. const char *desc;
  20. rt_uint32_t reg;
  21. rt_uint32_t val;
  22. };
  23. struct rockchip_grf_info
  24. {
  25. const struct rockchip_grf_value *values;
  26. int values_nr;
  27. rt_err_t (*reset)(struct rt_syscon *grf);
  28. };
  29. #define PX30_GRF_SOC_CON5 0x414
  30. static const struct rockchip_grf_value px30_defaults[] =
  31. {
  32. /*
  33. * Postponing auto jtag/sdmmc switching by 5 seconds.
  34. * The counter value is calculated based on 24MHz clock.
  35. */
  36. { "jtag switching delay", PX30_GRF_SOC_CON5, 0x7270E00},
  37. };
  38. static const struct rockchip_grf_info px30_grf =
  39. {
  40. .values = px30_defaults,
  41. .values_nr = RT_ARRAY_SIZE(px30_defaults),
  42. };
  43. #define RK3036_GRF_SOC_CON0 0x140
  44. static const struct rockchip_grf_value rk3036_defaults[] =
  45. {
  46. /*
  47. * Disable auto jtag/sdmmc switching that causes issues with the
  48. * clock-framework and the mmc controllers making them unreliable.
  49. */
  50. { "jtag switching", RK3036_GRF_SOC_CON0, HIWORD_UPDATE(0, 1, 11) },
  51. };
  52. static const struct rockchip_grf_info rk3036_grf =
  53. {
  54. .values = rk3036_defaults,
  55. .values_nr = RT_ARRAY_SIZE(rk3036_defaults),
  56. };
  57. #define RK3128_GRF_SOC_CON0 0x140
  58. static const struct rockchip_grf_value rk3128_defaults[] =
  59. {
  60. { "jtag switching", RK3128_GRF_SOC_CON0, HIWORD_UPDATE(0, 1, 8) },
  61. };
  62. static const struct rockchip_grf_info rk3128_grf =
  63. {
  64. .values = rk3128_defaults,
  65. .values_nr = RT_ARRAY_SIZE(rk3128_defaults),
  66. };
  67. #define RK3228_GRF_SOC_CON6 0x418
  68. static const struct rockchip_grf_value rk3228_defaults[] =
  69. {
  70. { "jtag switching", RK3228_GRF_SOC_CON6, HIWORD_UPDATE(0, 1, 8) },
  71. };
  72. static const struct rockchip_grf_info rk3228_grf =
  73. {
  74. .values = rk3228_defaults,
  75. .values_nr = RT_ARRAY_SIZE(rk3228_defaults),
  76. };
  77. #define RK3288_GRF_SOC_CON0 0x244
  78. #define RK3288_GRF_SOC_CON2 0x24c
  79. static const struct rockchip_grf_value rk3288_defaults[] =
  80. {
  81. { "jtag switching", RK3288_GRF_SOC_CON0, HIWORD_UPDATE(0, 1, 12) },
  82. { "pwm select", RK3288_GRF_SOC_CON2, HIWORD_UPDATE(1, 1, 0) },
  83. };
  84. static const struct rockchip_grf_info rk3288_grf =
  85. {
  86. .values = rk3288_defaults,
  87. .values_nr = RT_ARRAY_SIZE(rk3288_defaults),
  88. };
  89. #define RK3328_GRF_SOC_CON4 0x410
  90. static const struct rockchip_grf_value rk3328_defaults[] =
  91. {
  92. { "jtag switching", RK3328_GRF_SOC_CON4, HIWORD_UPDATE(0, 1, 12) },
  93. };
  94. static const struct rockchip_grf_info rk3328_grf =
  95. {
  96. .values = rk3328_defaults,
  97. .values_nr = RT_ARRAY_SIZE(rk3328_defaults),
  98. };
  99. #define RK3308_GRF_SOC_CON3 0x30c
  100. #define RK3308_GRF_SOC_CON13 0x608
  101. static const struct rockchip_grf_value rk3308_defaults[] =
  102. {
  103. { "uart dma mask", RK3308_GRF_SOC_CON3, HIWORD_UPDATE(0, 0x1f, 10) },
  104. { "uart2 auto switching", RK3308_GRF_SOC_CON13, HIWORD_UPDATE(0, 0x1, 12) },
  105. };
  106. static const struct rockchip_grf_info rk3308_grf =
  107. {
  108. .values = rk3308_defaults,
  109. .values_nr = RT_ARRAY_SIZE(rk3308_defaults),
  110. };
  111. #define RK3368_GRF_SOC_CON15 0x43c
  112. static const struct rockchip_grf_value rk3368_defaults[] =
  113. {
  114. { "jtag switching", RK3368_GRF_SOC_CON15, HIWORD_UPDATE(0, 1, 13) },
  115. };
  116. static const struct rockchip_grf_info rk3368_grf =
  117. {
  118. .values = rk3368_defaults,
  119. .values_nr = RT_ARRAY_SIZE(rk3368_defaults),
  120. };
  121. #define RK3399_GRF_SOC_CON7 0xe21c
  122. static const struct rockchip_grf_value rk3399_defaults[] =
  123. {
  124. { "jtag switching", RK3399_GRF_SOC_CON7, HIWORD_UPDATE(0, 1, 12) },
  125. };
  126. static const struct rockchip_grf_info rk3399_grf =
  127. {
  128. .values = rk3399_defaults,
  129. .values_nr = RT_ARRAY_SIZE(rk3399_defaults),
  130. };
  131. #define RK3566_GRF_USB3OTG0_CON1 0x0104
  132. static const struct rockchip_grf_value rk3566_defaults[] =
  133. {
  134. { "usb3otg port switch", RK3566_GRF_USB3OTG0_CON1, HIWORD_UPDATE(0, 1, 12) },
  135. { "usb3otg clock switch", RK3566_GRF_USB3OTG0_CON1, HIWORD_UPDATE(1, 1, 7) },
  136. { "usb3otg disable usb3", RK3566_GRF_USB3OTG0_CON1, HIWORD_UPDATE(1, 1, 0) },
  137. };
  138. static const struct rockchip_grf_info rk3566_pipegrf =
  139. {
  140. .values = rk3566_defaults,
  141. .values_nr = RT_ARRAY_SIZE(rk3566_defaults),
  142. };
  143. static rt_err_t rk3568_edp_phy_grf_reset(struct rt_syscon *grf)
  144. {
  145. rt_err_t err;
  146. rt_uint32_t status;
  147. if ((err = rt_syscon_read(grf, 0x0030, &status)))
  148. {
  149. return err;
  150. }
  151. if (!RT_FIELD_GET(0x1, status))
  152. {
  153. rt_syscon_write(grf, 0x0028, 0x00070007);
  154. rt_syscon_write(grf, 0x0000, 0x0ff10ff1);
  155. }
  156. return RT_EOK;
  157. }
  158. static const struct rockchip_grf_info rk3568_edp_phy_grf =
  159. {
  160. .reset = rk3568_edp_phy_grf_reset,
  161. };
  162. #define RK3588_GRF_SOC_CON6 0x0318
  163. static const struct rockchip_grf_value rk3588_defaults[] =
  164. {
  165. { "jtag switching", RK3588_GRF_SOC_CON6, HIWORD_UPDATE(0, 1, 14) },
  166. };
  167. static const struct rockchip_grf_info rk3588_sysgrf =
  168. {
  169. .values = rk3588_defaults,
  170. .values_nr = RT_ARRAY_SIZE(rk3588_defaults),
  171. };
  172. #define DELAY_ONE_SECOND 0x16e3600
  173. #define RV1126_GRF1_SDDETFLT_CON 0x10254
  174. #define RV1126_GRF1_UART2RX_LOW_CON 0x10258
  175. #define RV1126_GRF1_IOFUNC_CON1 0x10264
  176. #define RV1126_GRF1_IOFUNC_CON3 0x1026c
  177. #define RV1126_JTAG_GROUP0 0x0 /* mux to sdmmc*/
  178. #define RV1126_JTAG_GROUP1 0x1 /* mux to uart2 */
  179. #define FORCE_JTAG_ENABLE 0x1
  180. #define FORCE_JTAG_DISABLE 0x0
  181. static const struct rockchip_grf_value rv1126_defaults[] =
  182. {
  183. { "jtag group0 force", RV1126_GRF1_IOFUNC_CON3, HIWORD_UPDATE(FORCE_JTAG_DISABLE, 1, 4) },
  184. { "jtag group1 force", RV1126_GRF1_IOFUNC_CON3, HIWORD_UPDATE(FORCE_JTAG_DISABLE, 1, 5) },
  185. { "jtag group1 tms low delay", RV1126_GRF1_UART2RX_LOW_CON, DELAY_ONE_SECOND },
  186. { "switch to jtag groupx", RV1126_GRF1_IOFUNC_CON1, HIWORD_UPDATE(RV1126_JTAG_GROUP0, 1, 15) },
  187. { "jtag group0 switching delay", RV1126_GRF1_SDDETFLT_CON, DELAY_ONE_SECOND * 5 },
  188. };
  189. static const struct rockchip_grf_info rv1126_grf =
  190. {
  191. .values = rv1126_defaults,
  192. .values_nr = RT_ARRAY_SIZE(rv1126_defaults),
  193. };
  194. static rt_err_t rockchip_grf_probe(struct rt_platform_device *pdev)
  195. {
  196. rt_err_t err;
  197. struct rt_syscon *grf;
  198. struct rt_ofw_node *np = pdev->parent.ofw_node;
  199. const struct rockchip_grf_info *grf_info = pdev->id->data;
  200. grf = rt_syscon_find_by_ofw_node(np);
  201. if (!grf)
  202. {
  203. return -RT_EINVAL;
  204. }
  205. for (int i = 0; i < grf_info->values_nr; ++i)
  206. {
  207. rt_err_t err;
  208. const struct rockchip_grf_value *val = &grf_info->values[i];
  209. err = rt_syscon_write(grf, val->reg, val->val);
  210. LOG_D("%s: adjusting %6x to %10x", val->desc, val->reg, val->val);
  211. if (err)
  212. {
  213. LOG_E("%s: write %6x to %10x fail", val->desc, val->reg, val->val);
  214. }
  215. }
  216. if (grf_info->reset && (err = grf_info->reset(grf)))
  217. {
  218. return err;
  219. }
  220. return RT_EOK;
  221. }
  222. static const struct rt_ofw_node_id rockchip_grf_ofw_ids[] =
  223. {
  224. { .compatible = "rockchip,px30-grf", .data = &px30_grf, },
  225. { .compatible = "rockchip,rk3036-grf", .data = &rk3036_grf, },
  226. { .compatible = "rockchip,rk3128-grf", .data = &rk3128_grf, },
  227. { .compatible = "rockchip,rk3228-grf", .data = &rk3228_grf, },
  228. { .compatible = "rockchip,rk3288-grf", .data = &rk3288_grf, },
  229. { .compatible = "rockchip,rk3308-grf", .data = &rk3308_grf, },
  230. { .compatible = "rockchip,rk3328-grf", .data = &rk3328_grf, },
  231. { .compatible = "rockchip,rk3368-grf", .data = &rk3368_grf, },
  232. { .compatible = "rockchip,rk3399-grf", .data = &rk3399_grf, },
  233. { .compatible = "rockchip,rk3566-pipe-grf", .data = &rk3566_pipegrf, },
  234. { .compatible = "rockchip,rk3568-edp-phy-grf", .data = &rk3568_edp_phy_grf, },
  235. { .compatible = "rockchip,rk3588-sys-grf", .data = &rk3588_sysgrf, },
  236. { .compatible = "rockchip,rv1126-grf", .data = &rv1126_grf, },
  237. { /* sentinel */ }
  238. };
  239. static struct rt_platform_driver rockchip_grf_driver =
  240. {
  241. .name = "rockchip-grf",
  242. .ids = rockchip_grf_ofw_ids,
  243. .probe = rockchip_grf_probe,
  244. };
  245. static int rockchip_grf_drv_register(void)
  246. {
  247. rt_platform_driver_register(&rockchip_grf_driver);
  248. return 0;
  249. }
  250. INIT_PLATFORM_EXPORT(rockchip_grf_drv_register);