reset-eic7700.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright 2025, Beijing ESWIN Computing Technology Co., Ltd..
  4. * All rights reserved.
  5. *
  6. * ESWIN Reset Driver
  7. *
  8. * Authors:
  9. * Yifeng Huang <huangyifeng@eswincomputing.com>
  10. * Xuyang Dong <dongxuyang@eswincomputing.com>
  11. */
  12. #include <linux/err.h>
  13. #include <linux/init.h>
  14. #include <linux/of.h>
  15. #include <linux/platform_device.h>
  16. #include <linux/regmap.h>
  17. #include <linux/reset-controller.h>
  18. #include <linux/slab.h>
  19. #include <linux/types.h>
  20. #include <dt-bindings/reset/eswin,eic7700-reset.h>
  21. #define SYSCRG_CLEAR_BOOT_INFO_OFFSET 0xC
  22. #define CLEAR_BOOT_FLAG_BIT BIT(0)
  23. #define SYSCRG_RESET_OFFSET 0x100
  24. /**
  25. * struct eic7700_reset_data - reset controller information structure
  26. * @rcdev: reset controller entity
  27. * @regmap: regmap handle containing the memory-mapped reset registers
  28. */
  29. struct eic7700_reset_data {
  30. struct reset_controller_dev rcdev;
  31. struct regmap *regmap;
  32. };
  33. static const struct regmap_config eic7700_regmap_config = {
  34. .reg_bits = 32,
  35. .val_bits = 32,
  36. .reg_stride = 4,
  37. .max_register = 0x1fc,
  38. };
  39. struct eic7700_reg {
  40. u32 reg;
  41. u32 bit;
  42. };
  43. static inline struct eic7700_reset_data *
  44. to_eic7700_reset_data(struct reset_controller_dev *rcdev)
  45. {
  46. return container_of(rcdev, struct eic7700_reset_data, rcdev);
  47. }
  48. #define EIC7700_RESET(id, reg, bit)[id] = \
  49. { SYSCRG_RESET_OFFSET + (reg) * sizeof(u32), BIT(bit) }
  50. /* mapping table for reset ID to register offset and reset bit */
  51. static const struct eic7700_reg eic7700_reset[] = {
  52. EIC7700_RESET(EIC7700_RESET_NOC_NSP, 0, 0),
  53. EIC7700_RESET(EIC7700_RESET_NOC_CFG, 0, 1),
  54. EIC7700_RESET(EIC7700_RESET_RNOC_NSP, 0, 2),
  55. EIC7700_RESET(EIC7700_RESET_SNOC_TCU, 0, 3),
  56. EIC7700_RESET(EIC7700_RESET_SNOC_U84, 0, 4),
  57. EIC7700_RESET(EIC7700_RESET_SNOC_PCIE_XSR, 0, 5),
  58. EIC7700_RESET(EIC7700_RESET_SNOC_PCIE_XMR, 0, 6),
  59. EIC7700_RESET(EIC7700_RESET_SNOC_PCIE_PR, 0, 7),
  60. EIC7700_RESET(EIC7700_RESET_SNOC_NPU, 0, 8),
  61. EIC7700_RESET(EIC7700_RESET_SNOC_JTAG, 0, 9),
  62. EIC7700_RESET(EIC7700_RESET_SNOC_DSP, 0, 10),
  63. EIC7700_RESET(EIC7700_RESET_SNOC_DDRC1_P2, 0, 11),
  64. EIC7700_RESET(EIC7700_RESET_SNOC_DDRC1_P1, 0, 12),
  65. EIC7700_RESET(EIC7700_RESET_SNOC_DDRC0_P2, 0, 13),
  66. EIC7700_RESET(EIC7700_RESET_SNOC_DDRC0_P1, 0, 14),
  67. EIC7700_RESET(EIC7700_RESET_SNOC_D2D, 0, 15),
  68. EIC7700_RESET(EIC7700_RESET_SNOC_AON, 0, 16),
  69. EIC7700_RESET(EIC7700_RESET_GPU_AXI, 1, 0),
  70. EIC7700_RESET(EIC7700_RESET_GPU_CFG, 1, 1),
  71. EIC7700_RESET(EIC7700_RESET_GPU_GRAY, 1, 2),
  72. EIC7700_RESET(EIC7700_RESET_GPU_JONES, 1, 3),
  73. EIC7700_RESET(EIC7700_RESET_GPU_SPU, 1, 4),
  74. EIC7700_RESET(EIC7700_RESET_DSP_AXI, 2, 0),
  75. EIC7700_RESET(EIC7700_RESET_DSP_CFG, 2, 1),
  76. EIC7700_RESET(EIC7700_RESET_DSP_DIV4, 2, 2),
  77. EIC7700_RESET(EIC7700_RESET_DSP_DIV0, 2, 4),
  78. EIC7700_RESET(EIC7700_RESET_DSP_DIV1, 2, 5),
  79. EIC7700_RESET(EIC7700_RESET_DSP_DIV2, 2, 6),
  80. EIC7700_RESET(EIC7700_RESET_DSP_DIV3, 2, 7),
  81. EIC7700_RESET(EIC7700_RESET_D2D_AXI, 3, 0),
  82. EIC7700_RESET(EIC7700_RESET_D2D_CFG, 3, 1),
  83. EIC7700_RESET(EIC7700_RESET_D2D_PRST, 3, 2),
  84. EIC7700_RESET(EIC7700_RESET_D2D_RAW_PCS, 3, 4),
  85. EIC7700_RESET(EIC7700_RESET_D2D_RX, 3, 5),
  86. EIC7700_RESET(EIC7700_RESET_D2D_TX, 3, 6),
  87. EIC7700_RESET(EIC7700_RESET_D2D_CORE, 3, 7),
  88. EIC7700_RESET(EIC7700_RESET_DDR1_ARST, 4, 0),
  89. EIC7700_RESET(EIC7700_RESET_DDR1_TRACE, 4, 6),
  90. EIC7700_RESET(EIC7700_RESET_DDR0_ARST, 4, 16),
  91. EIC7700_RESET(EIC7700_RESET_DDR_CFG, 4, 21),
  92. EIC7700_RESET(EIC7700_RESET_DDR0_TRACE, 4, 22),
  93. EIC7700_RESET(EIC7700_RESET_DDR_CORE, 4, 23),
  94. EIC7700_RESET(EIC7700_RESET_DDR_PRST, 4, 26),
  95. EIC7700_RESET(EIC7700_RESET_TCU_AXI, 5, 0),
  96. EIC7700_RESET(EIC7700_RESET_TCU_CFG, 5, 1),
  97. EIC7700_RESET(EIC7700_RESET_TCU_TBU0, 5, 4),
  98. EIC7700_RESET(EIC7700_RESET_TCU_TBU1, 5, 5),
  99. EIC7700_RESET(EIC7700_RESET_TCU_TBU2, 5, 6),
  100. EIC7700_RESET(EIC7700_RESET_TCU_TBU3, 5, 7),
  101. EIC7700_RESET(EIC7700_RESET_TCU_TBU4, 5, 8),
  102. EIC7700_RESET(EIC7700_RESET_TCU_TBU5, 5, 9),
  103. EIC7700_RESET(EIC7700_RESET_TCU_TBU6, 5, 10),
  104. EIC7700_RESET(EIC7700_RESET_TCU_TBU7, 5, 11),
  105. EIC7700_RESET(EIC7700_RESET_TCU_TBU8, 5, 12),
  106. EIC7700_RESET(EIC7700_RESET_TCU_TBU9, 5, 13),
  107. EIC7700_RESET(EIC7700_RESET_TCU_TBU10, 5, 14),
  108. EIC7700_RESET(EIC7700_RESET_TCU_TBU11, 5, 15),
  109. EIC7700_RESET(EIC7700_RESET_TCU_TBU12, 5, 16),
  110. EIC7700_RESET(EIC7700_RESET_TCU_TBU13, 5, 17),
  111. EIC7700_RESET(EIC7700_RESET_TCU_TBU14, 5, 18),
  112. EIC7700_RESET(EIC7700_RESET_TCU_TBU15, 5, 19),
  113. EIC7700_RESET(EIC7700_RESET_TCU_TBU16, 5, 20),
  114. EIC7700_RESET(EIC7700_RESET_NPU_AXI, 6, 0),
  115. EIC7700_RESET(EIC7700_RESET_NPU_CFG, 6, 1),
  116. EIC7700_RESET(EIC7700_RESET_NPU_CORE, 6, 2),
  117. EIC7700_RESET(EIC7700_RESET_NPU_E31CORE, 6, 3),
  118. EIC7700_RESET(EIC7700_RESET_NPU_E31BUS, 6, 4),
  119. EIC7700_RESET(EIC7700_RESET_NPU_E31DBG, 6, 5),
  120. EIC7700_RESET(EIC7700_RESET_NPU_LLC, 6, 6),
  121. EIC7700_RESET(EIC7700_RESET_HSP_AXI, 7, 0),
  122. EIC7700_RESET(EIC7700_RESET_HSP_CFG, 7, 1),
  123. EIC7700_RESET(EIC7700_RESET_HSP_POR, 7, 2),
  124. EIC7700_RESET(EIC7700_RESET_MSHC0_PHY, 7, 3),
  125. EIC7700_RESET(EIC7700_RESET_MSHC1_PHY, 7, 4),
  126. EIC7700_RESET(EIC7700_RESET_MSHC2_PHY, 7, 5),
  127. EIC7700_RESET(EIC7700_RESET_MSHC0_TXRX, 7, 6),
  128. EIC7700_RESET(EIC7700_RESET_MSHC1_TXRX, 7, 7),
  129. EIC7700_RESET(EIC7700_RESET_MSHC2_TXRX, 7, 8),
  130. EIC7700_RESET(EIC7700_RESET_SATA_ASIC0, 7, 9),
  131. EIC7700_RESET(EIC7700_RESET_SATA_OOB, 7, 10),
  132. EIC7700_RESET(EIC7700_RESET_SATA_PMALIVE, 7, 11),
  133. EIC7700_RESET(EIC7700_RESET_SATA_RBC, 7, 12),
  134. EIC7700_RESET(EIC7700_RESET_DMA0, 7, 13),
  135. EIC7700_RESET(EIC7700_RESET_HSP_DMA, 7, 14),
  136. EIC7700_RESET(EIC7700_RESET_USB0_VAUX, 7, 15),
  137. EIC7700_RESET(EIC7700_RESET_USB1_VAUX, 7, 16),
  138. EIC7700_RESET(EIC7700_RESET_HSP_SD1_PRST, 7, 17),
  139. EIC7700_RESET(EIC7700_RESET_HSP_SD0_PRST, 7, 18),
  140. EIC7700_RESET(EIC7700_RESET_HSP_EMMC_PRST, 7, 19),
  141. EIC7700_RESET(EIC7700_RESET_HSP_DMA_PRST, 7, 20),
  142. EIC7700_RESET(EIC7700_RESET_HSP_SD1_ARST, 7, 21),
  143. EIC7700_RESET(EIC7700_RESET_HSP_SD0_ARST, 7, 22),
  144. EIC7700_RESET(EIC7700_RESET_HSP_EMMC_ARST, 7, 23),
  145. EIC7700_RESET(EIC7700_RESET_HSP_DMA_ARST, 7, 24),
  146. EIC7700_RESET(EIC7700_RESET_HSP_ETH1_ARST, 7, 25),
  147. EIC7700_RESET(EIC7700_RESET_HSP_ETH0_ARST, 7, 26),
  148. EIC7700_RESET(EIC7700_RESET_SATA_ARST, 7, 27),
  149. EIC7700_RESET(EIC7700_RESET_PCIE_CFG, 8, 0),
  150. EIC7700_RESET(EIC7700_RESET_PCIE_POWEUP, 8, 1),
  151. EIC7700_RESET(EIC7700_RESET_PCIE_PERST, 8, 2),
  152. EIC7700_RESET(EIC7700_RESET_I2C0, 9, 0),
  153. EIC7700_RESET(EIC7700_RESET_I2C1, 9, 1),
  154. EIC7700_RESET(EIC7700_RESET_I2C2, 9, 2),
  155. EIC7700_RESET(EIC7700_RESET_I2C3, 9, 3),
  156. EIC7700_RESET(EIC7700_RESET_I2C4, 9, 4),
  157. EIC7700_RESET(EIC7700_RESET_I2C5, 9, 5),
  158. EIC7700_RESET(EIC7700_RESET_I2C6, 9, 6),
  159. EIC7700_RESET(EIC7700_RESET_I2C7, 9, 7),
  160. EIC7700_RESET(EIC7700_RESET_I2C8, 9, 8),
  161. EIC7700_RESET(EIC7700_RESET_I2C9, 9, 9),
  162. EIC7700_RESET(EIC7700_RESET_FAN, 10, 0),
  163. EIC7700_RESET(EIC7700_RESET_PVT0, 11, 0),
  164. EIC7700_RESET(EIC7700_RESET_PVT1, 11, 1),
  165. EIC7700_RESET(EIC7700_RESET_MBOX0, 12, 0),
  166. EIC7700_RESET(EIC7700_RESET_MBOX1, 12, 1),
  167. EIC7700_RESET(EIC7700_RESET_MBOX2, 12, 2),
  168. EIC7700_RESET(EIC7700_RESET_MBOX3, 12, 3),
  169. EIC7700_RESET(EIC7700_RESET_MBOX4, 12, 4),
  170. EIC7700_RESET(EIC7700_RESET_MBOX5, 12, 5),
  171. EIC7700_RESET(EIC7700_RESET_MBOX6, 12, 6),
  172. EIC7700_RESET(EIC7700_RESET_MBOX7, 12, 7),
  173. EIC7700_RESET(EIC7700_RESET_MBOX8, 12, 8),
  174. EIC7700_RESET(EIC7700_RESET_MBOX9, 12, 9),
  175. EIC7700_RESET(EIC7700_RESET_MBOX10, 12, 10),
  176. EIC7700_RESET(EIC7700_RESET_MBOX11, 12, 11),
  177. EIC7700_RESET(EIC7700_RESET_MBOX12, 12, 12),
  178. EIC7700_RESET(EIC7700_RESET_MBOX13, 12, 13),
  179. EIC7700_RESET(EIC7700_RESET_MBOX14, 12, 14),
  180. EIC7700_RESET(EIC7700_RESET_MBOX15, 12, 15),
  181. EIC7700_RESET(EIC7700_RESET_UART0, 13, 0),
  182. EIC7700_RESET(EIC7700_RESET_UART1, 13, 1),
  183. EIC7700_RESET(EIC7700_RESET_UART2, 13, 2),
  184. EIC7700_RESET(EIC7700_RESET_UART3, 13, 3),
  185. EIC7700_RESET(EIC7700_RESET_UART4, 13, 4),
  186. EIC7700_RESET(EIC7700_RESET_GPIO0, 14, 0),
  187. EIC7700_RESET(EIC7700_RESET_GPIO1, 14, 1),
  188. EIC7700_RESET(EIC7700_RESET_TIMER, 15, 0),
  189. EIC7700_RESET(EIC7700_RESET_SSI0, 16, 0),
  190. EIC7700_RESET(EIC7700_RESET_SSI1, 16, 1),
  191. EIC7700_RESET(EIC7700_RESET_WDT0, 17, 0),
  192. EIC7700_RESET(EIC7700_RESET_WDT1, 17, 1),
  193. EIC7700_RESET(EIC7700_RESET_WDT2, 17, 2),
  194. EIC7700_RESET(EIC7700_RESET_WDT3, 17, 3),
  195. EIC7700_RESET(EIC7700_RESET_LSP_CFG, 18, 0),
  196. EIC7700_RESET(EIC7700_RESET_U84_CORE0, 19, 0),
  197. EIC7700_RESET(EIC7700_RESET_U84_CORE1, 19, 1),
  198. EIC7700_RESET(EIC7700_RESET_U84_CORE2, 19, 2),
  199. EIC7700_RESET(EIC7700_RESET_U84_CORE3, 19, 3),
  200. EIC7700_RESET(EIC7700_RESET_U84_BUS, 19, 4),
  201. EIC7700_RESET(EIC7700_RESET_U84_DBG, 19, 5),
  202. EIC7700_RESET(EIC7700_RESET_U84_TRACECOM, 19, 6),
  203. EIC7700_RESET(EIC7700_RESET_U84_TRACE0, 19, 8),
  204. EIC7700_RESET(EIC7700_RESET_U84_TRACE1, 19, 9),
  205. EIC7700_RESET(EIC7700_RESET_U84_TRACE2, 19, 10),
  206. EIC7700_RESET(EIC7700_RESET_U84_TRACE3, 19, 11),
  207. EIC7700_RESET(EIC7700_RESET_SCPU_CORE, 20, 0),
  208. EIC7700_RESET(EIC7700_RESET_SCPU_BUS, 20, 1),
  209. EIC7700_RESET(EIC7700_RESET_SCPU_DBG, 20, 2),
  210. EIC7700_RESET(EIC7700_RESET_LPCPU_CORE, 21, 0),
  211. EIC7700_RESET(EIC7700_RESET_LPCPU_BUS, 21, 1),
  212. EIC7700_RESET(EIC7700_RESET_LPCPU_DBG, 21, 2),
  213. EIC7700_RESET(EIC7700_RESET_VC_CFG, 22, 0),
  214. EIC7700_RESET(EIC7700_RESET_VC_AXI, 22, 1),
  215. EIC7700_RESET(EIC7700_RESET_VC_MONCFG, 22, 2),
  216. EIC7700_RESET(EIC7700_RESET_JD_CFG, 23, 0),
  217. EIC7700_RESET(EIC7700_RESET_JD_AXI, 23, 1),
  218. EIC7700_RESET(EIC7700_RESET_JE_CFG, 24, 0),
  219. EIC7700_RESET(EIC7700_RESET_JE_AXI, 24, 1),
  220. EIC7700_RESET(EIC7700_RESET_VD_CFG, 25, 0),
  221. EIC7700_RESET(EIC7700_RESET_VD_AXI, 25, 1),
  222. EIC7700_RESET(EIC7700_RESET_VE_AXI, 26, 0),
  223. EIC7700_RESET(EIC7700_RESET_VE_CFG, 26, 1),
  224. EIC7700_RESET(EIC7700_RESET_G2D_CORE, 27, 0),
  225. EIC7700_RESET(EIC7700_RESET_G2D_CFG, 27, 1),
  226. EIC7700_RESET(EIC7700_RESET_G2D_AXI, 27, 2),
  227. EIC7700_RESET(EIC7700_RESET_VI_AXI, 28, 0),
  228. EIC7700_RESET(EIC7700_RESET_VI_CFG, 28, 1),
  229. EIC7700_RESET(EIC7700_RESET_VI_DWE, 28, 2),
  230. EIC7700_RESET(EIC7700_RESET_DVP, 29, 0),
  231. EIC7700_RESET(EIC7700_RESET_ISP0, 30, 0),
  232. EIC7700_RESET(EIC7700_RESET_ISP1, 31, 0),
  233. EIC7700_RESET(EIC7700_RESET_SHUTTR0, 32, 0),
  234. EIC7700_RESET(EIC7700_RESET_SHUTTR1, 32, 1),
  235. EIC7700_RESET(EIC7700_RESET_SHUTTR2, 32, 2),
  236. EIC7700_RESET(EIC7700_RESET_SHUTTR3, 32, 3),
  237. EIC7700_RESET(EIC7700_RESET_SHUTTR4, 32, 4),
  238. EIC7700_RESET(EIC7700_RESET_SHUTTR5, 32, 5),
  239. EIC7700_RESET(EIC7700_RESET_VO_MIPI, 33, 0),
  240. EIC7700_RESET(EIC7700_RESET_VO_PRST, 33, 1),
  241. EIC7700_RESET(EIC7700_RESET_VO_HDMI_PRST, 33, 3),
  242. EIC7700_RESET(EIC7700_RESET_VO_HDMI_PHY, 33, 4),
  243. EIC7700_RESET(EIC7700_RESET_VO_HDMI, 33, 5),
  244. EIC7700_RESET(EIC7700_RESET_VO_I2S, 34, 0),
  245. EIC7700_RESET(EIC7700_RESET_VO_I2S_PRST, 34, 1),
  246. EIC7700_RESET(EIC7700_RESET_VO_AXI, 35, 0),
  247. EIC7700_RESET(EIC7700_RESET_VO_CFG, 35, 1),
  248. EIC7700_RESET(EIC7700_RESET_VO_DC, 35, 2),
  249. EIC7700_RESET(EIC7700_RESET_VO_DC_PRST, 35, 3),
  250. EIC7700_RESET(EIC7700_RESET_BOOTSPI_HRST, 36, 0),
  251. EIC7700_RESET(EIC7700_RESET_BOOTSPI, 36, 1),
  252. EIC7700_RESET(EIC7700_RESET_ANO1, 37, 0),
  253. EIC7700_RESET(EIC7700_RESET_ANO0, 38, 0),
  254. EIC7700_RESET(EIC7700_RESET_DMA1_ARST, 39, 0),
  255. EIC7700_RESET(EIC7700_RESET_DMA1_HRST, 39, 1),
  256. EIC7700_RESET(EIC7700_RESET_FPRT, 40, 0),
  257. EIC7700_RESET(EIC7700_RESET_HBLOCK, 41, 0),
  258. EIC7700_RESET(EIC7700_RESET_SECSR, 42, 0),
  259. EIC7700_RESET(EIC7700_RESET_OTP, 43, 0),
  260. EIC7700_RESET(EIC7700_RESET_PKA, 44, 0),
  261. EIC7700_RESET(EIC7700_RESET_SPACC, 45, 0),
  262. EIC7700_RESET(EIC7700_RESET_TRNG, 46, 0),
  263. EIC7700_RESET(EIC7700_RESET_TIMER0_0, 48, 0),
  264. EIC7700_RESET(EIC7700_RESET_TIMER0_1, 48, 1),
  265. EIC7700_RESET(EIC7700_RESET_TIMER0_2, 48, 2),
  266. EIC7700_RESET(EIC7700_RESET_TIMER0_3, 48, 3),
  267. EIC7700_RESET(EIC7700_RESET_TIMER0_4, 48, 4),
  268. EIC7700_RESET(EIC7700_RESET_TIMER0_5, 48, 5),
  269. EIC7700_RESET(EIC7700_RESET_TIMER0_6, 48, 6),
  270. EIC7700_RESET(EIC7700_RESET_TIMER0_7, 48, 7),
  271. EIC7700_RESET(EIC7700_RESET_TIMER0_N, 48, 8),
  272. EIC7700_RESET(EIC7700_RESET_TIMER1_0, 49, 0),
  273. EIC7700_RESET(EIC7700_RESET_TIMER1_1, 49, 1),
  274. EIC7700_RESET(EIC7700_RESET_TIMER1_2, 49, 2),
  275. EIC7700_RESET(EIC7700_RESET_TIMER1_3, 49, 3),
  276. EIC7700_RESET(EIC7700_RESET_TIMER1_4, 49, 4),
  277. EIC7700_RESET(EIC7700_RESET_TIMER1_5, 49, 5),
  278. EIC7700_RESET(EIC7700_RESET_TIMER1_6, 49, 6),
  279. EIC7700_RESET(EIC7700_RESET_TIMER1_7, 49, 7),
  280. EIC7700_RESET(EIC7700_RESET_TIMER1_N, 49, 8),
  281. EIC7700_RESET(EIC7700_RESET_TIMER2_0, 50, 0),
  282. EIC7700_RESET(EIC7700_RESET_TIMER2_1, 50, 1),
  283. EIC7700_RESET(EIC7700_RESET_TIMER2_2, 50, 2),
  284. EIC7700_RESET(EIC7700_RESET_TIMER2_3, 50, 3),
  285. EIC7700_RESET(EIC7700_RESET_TIMER2_4, 50, 4),
  286. EIC7700_RESET(EIC7700_RESET_TIMER2_5, 50, 5),
  287. EIC7700_RESET(EIC7700_RESET_TIMER2_6, 50, 6),
  288. EIC7700_RESET(EIC7700_RESET_TIMER2_7, 50, 7),
  289. EIC7700_RESET(EIC7700_RESET_TIMER2_N, 50, 8),
  290. EIC7700_RESET(EIC7700_RESET_TIMER3_0, 51, 0),
  291. EIC7700_RESET(EIC7700_RESET_TIMER3_1, 51, 1),
  292. EIC7700_RESET(EIC7700_RESET_TIMER3_2, 51, 2),
  293. EIC7700_RESET(EIC7700_RESET_TIMER3_3, 51, 3),
  294. EIC7700_RESET(EIC7700_RESET_TIMER3_4, 51, 4),
  295. EIC7700_RESET(EIC7700_RESET_TIMER3_5, 51, 5),
  296. EIC7700_RESET(EIC7700_RESET_TIMER3_6, 51, 6),
  297. EIC7700_RESET(EIC7700_RESET_TIMER3_7, 51, 7),
  298. EIC7700_RESET(EIC7700_RESET_TIMER3_N, 51, 8),
  299. EIC7700_RESET(EIC7700_RESET_RTC, 52, 0),
  300. EIC7700_RESET(EIC7700_RESET_MNOC_SNOC_NSP, 53, 0),
  301. EIC7700_RESET(EIC7700_RESET_MNOC_VC, 53, 1),
  302. EIC7700_RESET(EIC7700_RESET_MNOC_CFG, 53, 2),
  303. EIC7700_RESET(EIC7700_RESET_MNOC_HSP, 53, 3),
  304. EIC7700_RESET(EIC7700_RESET_MNOC_GPU, 53, 4),
  305. EIC7700_RESET(EIC7700_RESET_MNOC_DDRC1_P3, 53, 5),
  306. EIC7700_RESET(EIC7700_RESET_MNOC_DDRC0_P3, 53, 6),
  307. EIC7700_RESET(EIC7700_RESET_RNOC_VO, 54, 0),
  308. EIC7700_RESET(EIC7700_RESET_RNOC_VI, 54, 1),
  309. EIC7700_RESET(EIC7700_RESET_RNOC_SNOC_NSP, 54, 2),
  310. EIC7700_RESET(EIC7700_RESET_RNOC_CFG, 54, 3),
  311. EIC7700_RESET(EIC7700_RESET_MNOC_DDRC1_P4, 54, 4),
  312. EIC7700_RESET(EIC7700_RESET_MNOC_DDRC0_P4, 54, 5),
  313. EIC7700_RESET(EIC7700_RESET_CNOC_VO_CFG, 55, 0),
  314. EIC7700_RESET(EIC7700_RESET_CNOC_VI_CFG, 55, 1),
  315. EIC7700_RESET(EIC7700_RESET_CNOC_VC_CFG, 55, 2),
  316. EIC7700_RESET(EIC7700_RESET_CNOC_TCU_CFG, 55, 3),
  317. EIC7700_RESET(EIC7700_RESET_CNOC_PCIE_CFG, 55, 4),
  318. EIC7700_RESET(EIC7700_RESET_CNOC_NPU_CFG, 55, 5),
  319. EIC7700_RESET(EIC7700_RESET_CNOC_LSP_CFG, 55, 6),
  320. EIC7700_RESET(EIC7700_RESET_CNOC_HSP_CFG, 55, 7),
  321. EIC7700_RESET(EIC7700_RESET_CNOC_GPU_CFG, 55, 8),
  322. EIC7700_RESET(EIC7700_RESET_CNOC_DSPT_CFG, 55, 9),
  323. EIC7700_RESET(EIC7700_RESET_CNOC_DDRT1_CFG, 55, 10),
  324. EIC7700_RESET(EIC7700_RESET_CNOC_DDRT0_CFG, 55, 11),
  325. EIC7700_RESET(EIC7700_RESET_CNOC_D2D_CFG, 55, 12),
  326. EIC7700_RESET(EIC7700_RESET_CNOC_CFG, 55, 13),
  327. EIC7700_RESET(EIC7700_RESET_CNOC_CLMM_CFG, 55, 14),
  328. EIC7700_RESET(EIC7700_RESET_CNOC_AON_CFG, 55, 15),
  329. EIC7700_RESET(EIC7700_RESET_LNOC_CFG, 56, 0),
  330. EIC7700_RESET(EIC7700_RESET_LNOC_NPU_LLC, 56, 1),
  331. EIC7700_RESET(EIC7700_RESET_LNOC_DDRC1_P0, 56, 2),
  332. EIC7700_RESET(EIC7700_RESET_LNOC_DDRC0_P0, 56, 3),
  333. };
  334. static int eic7700_reset_assert(struct reset_controller_dev *rcdev,
  335. unsigned long id)
  336. {
  337. struct eic7700_reset_data *data = to_eic7700_reset_data(rcdev);
  338. return regmap_clear_bits(data->regmap, eic7700_reset[id].reg,
  339. eic7700_reset[id].bit);
  340. }
  341. static int eic7700_reset_deassert(struct reset_controller_dev *rcdev,
  342. unsigned long id)
  343. {
  344. struct eic7700_reset_data *data = to_eic7700_reset_data(rcdev);
  345. return regmap_set_bits(data->regmap, eic7700_reset[id].reg,
  346. eic7700_reset[id].bit);
  347. }
  348. static int eic7700_reset_reset(struct reset_controller_dev *rcdev,
  349. unsigned long id)
  350. {
  351. int ret;
  352. ret = eic7700_reset_assert(rcdev, id);
  353. if (ret)
  354. return ret;
  355. usleep_range(10, 15);
  356. return eic7700_reset_deassert(rcdev, id);
  357. }
  358. static const struct reset_control_ops eic7700_reset_ops = {
  359. .reset = eic7700_reset_reset,
  360. .assert = eic7700_reset_assert,
  361. .deassert = eic7700_reset_deassert,
  362. };
  363. static const struct of_device_id eic7700_reset_dt_ids[] = {
  364. { .compatible = "eswin,eic7700-reset", },
  365. { /* sentinel */ }
  366. };
  367. static int eic7700_reset_probe(struct platform_device *pdev)
  368. {
  369. struct eic7700_reset_data *data;
  370. struct device *dev = &pdev->dev;
  371. void __iomem *base;
  372. data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
  373. if (!data)
  374. return -ENOMEM;
  375. base = devm_platform_ioremap_resource(pdev, 0);
  376. if (IS_ERR(base))
  377. return PTR_ERR(base);
  378. data->regmap = devm_regmap_init_mmio(dev, base, &eic7700_regmap_config);
  379. if (IS_ERR(data->regmap))
  380. return dev_err_probe(dev, PTR_ERR(data->regmap),
  381. "failed to get regmap!\n");
  382. data->rcdev.owner = THIS_MODULE;
  383. data->rcdev.ops = &eic7700_reset_ops;
  384. data->rcdev.of_node = dev->of_node;
  385. data->rcdev.of_reset_n_cells = 1;
  386. data->rcdev.dev = dev;
  387. data->rcdev.nr_resets = ARRAY_SIZE(eic7700_reset);
  388. /* clear boot flag so u84 and scpu could be reseted by software */
  389. regmap_set_bits(data->regmap, SYSCRG_CLEAR_BOOT_INFO_OFFSET,
  390. CLEAR_BOOT_FLAG_BIT);
  391. msleep(50);
  392. return devm_reset_controller_register(dev, &data->rcdev);
  393. }
  394. static struct platform_driver eic7700_reset_driver = {
  395. .probe = eic7700_reset_probe,
  396. .driver = {
  397. .name = "eic7700-reset",
  398. .of_match_table = eic7700_reset_dt_ids,
  399. },
  400. };
  401. builtin_platform_driver(eic7700_reset_driver);