reset-th1520.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  4. * Author: Michal Wilczynski <m.wilczynski@samsung.com>
  5. */
  6. #include <linux/of.h>
  7. #include <linux/platform_device.h>
  8. #include <linux/reset-controller.h>
  9. #include <linux/regmap.h>
  10. #include <dt-bindings/reset/thead,th1520-reset.h>
  11. /* register offset in RSTGEN_R */
  12. #define TH1520_BROM_RST_CFG 0x0
  13. #define TH1520_C910_RST_CFG 0x4
  14. #define TH1520_CHIP_DBG_RST_CFG 0xc
  15. #define TH1520_AXI4_CPUSYS2_RST_CFG 0x10
  16. #define TH1520_X2H_CPUSYS_RST_CFG 0x18
  17. #define TH1520_AHB2_CPUSYS_RST_CFG 0x1c
  18. #define TH1520_APB3_CPUSYS_RST_CFG 0x20
  19. #define TH1520_MBOX0_RST_CFG 0x24
  20. #define TH1520_MBOX1_RST_CFG 0x28
  21. #define TH1520_MBOX2_RST_CFG 0x2c
  22. #define TH1520_MBOX3_RST_CFG 0x30
  23. #define TH1520_WDT0_RST_CFG 0x34
  24. #define TH1520_WDT1_RST_CFG 0x38
  25. #define TH1520_TIMER0_RST_CFG 0x3c
  26. #define TH1520_TIMER1_RST_CFG 0x40
  27. #define TH1520_PERISYS_AHB_RST_CFG 0x44
  28. #define TH1520_PERISYS_APB1_RST_CFG 0x48
  29. #define TH1520_PERISYS_APB2_RST_CFG 0x4c
  30. #define TH1520_GMAC0_RST_CFG 0x68
  31. #define TH1520_UART0_RST_CFG 0x70
  32. #define TH1520_UART1_RST_CFG 0x74
  33. #define TH1520_UART2_RST_CFG 0x78
  34. #define TH1520_UART3_RST_CFG 0x7c
  35. #define TH1520_UART4_RST_CFG 0x80
  36. #define TH1520_UART5_RST_CFG 0x84
  37. #define TH1520_QSPI0_RST_CFG 0x8c
  38. #define TH1520_QSPI1_RST_CFG 0x90
  39. #define TH1520_SPI_RST_CFG 0x94
  40. #define TH1520_I2C0_RST_CFG 0x98
  41. #define TH1520_I2C1_RST_CFG 0x9c
  42. #define TH1520_I2C2_RST_CFG 0xa0
  43. #define TH1520_I2C3_RST_CFG 0xa4
  44. #define TH1520_I2C4_RST_CFG 0xa8
  45. #define TH1520_I2C5_RST_CFG 0xac
  46. #define TH1520_GPIO0_RST_CFG 0xb0
  47. #define TH1520_GPIO1_RST_CFG 0xb4
  48. #define TH1520_GPIO2_RST_CFG 0xb8
  49. #define TH1520_PWM_RST_CFG 0xc0
  50. #define TH1520_PADCTRL0_APSYS_RST_CFG 0xc4
  51. #define TH1520_CPU2PERI_X2H_RST_CFG 0xcc
  52. #define TH1520_CPU2AON_X2H_RST_CFG 0xe4
  53. #define TH1520_AON2CPU_A2X_RST_CFG 0xfc
  54. #define TH1520_NPUSYS_AXI_RST_CFG 0x128
  55. #define TH1520_CPU2VP_X2P_RST_CFG 0x12c
  56. #define TH1520_CPU2VI_X2H_RST_CFG 0x138
  57. #define TH1520_BMU_C910_RST_CFG 0x148
  58. #define TH1520_DMAC_CPUSYS_RST_CFG 0x14c
  59. #define TH1520_SPINLOCK_RST_CFG 0x178
  60. #define TH1520_CFG2TEE_X2H_RST_CFG 0x188
  61. #define TH1520_DSMART_RST_CFG 0x18c
  62. #define TH1520_GPIO3_RST_CFG 0x1a8
  63. #define TH1520_I2S_RST_CFG 0x1ac
  64. #define TH1520_IMG_NNA_RST_CFG 0x1b0
  65. #define TH1520_PERI_APB3_RST_CFG 0x1dc
  66. #define TH1520_VP_SUBSYS_RST_CFG 0x1ec
  67. #define TH1520_PERISYS_APB4_RST_CFG 0x1f8
  68. #define TH1520_GMAC1_RST_CFG 0x204
  69. #define TH1520_GMAC_AXI_RST_CFG 0x208
  70. #define TH1520_PADCTRL1_APSYS_RST_CFG 0x20c
  71. #define TH1520_VOSYS_AXI_RST_CFG 0x210
  72. #define TH1520_VOSYS_X2X_RST_CFG 0x214
  73. #define TH1520_MISC2VP_X2X_RST_CFG 0x218
  74. #define TH1520_SUBSYS_RST_CFG 0x220
  75. /* register offset in DSP_REGMAP */
  76. #define TH1520_DSPSYS_RST_CFG 0x0
  77. /* register offset in MISCSYS_REGMAP */
  78. #define TH1520_EMMC_RST_CFG 0x0
  79. #define TH1520_MISCSYS_AXI_RST_CFG 0x8
  80. #define TH1520_SDIO0_RST_CFG 0xc
  81. #define TH1520_SDIO1_RST_CFG 0x10
  82. #define TH1520_USB3_DRD_RST_CFG 0x14
  83. /* register offset in VISYS_REGMAP */
  84. #define TH1520_VISYS_RST_CFG 0x0
  85. #define TH1520_VISYS_2_RST_CFG 0x4
  86. /* register offset in VOSYS_REGMAP */
  87. #define TH1520_GPU_RST_CFG 0x0
  88. #define TH1520_GPU_RST_CFG_MASK GENMASK(1, 0)
  89. #define TH1520_DPU_RST_CFG 0x4
  90. #define TH1520_DSI0_RST_CFG 0x8
  91. #define TH1520_DSI1_RST_CFG 0xc
  92. #define TH1520_HDMI_RST_CFG 0x14
  93. #define TH1520_AXI4_VO_DW_AXI_RST_CFG 0x18
  94. #define TH1520_X2H_X4_VOSYS_DW_RST_CFG 0x20
  95. /* register values */
  96. #define TH1520_GPU_SW_GPU_RST BIT(0)
  97. #define TH1520_GPU_SW_CLKGEN_RST BIT(1)
  98. #define TH1520_DPU_SW_DPU_HRST BIT(0)
  99. #define TH1520_DPU_SW_DPU_ARST BIT(1)
  100. #define TH1520_DPU_SW_DPU_CRST BIT(2)
  101. #define TH1520_DSI_SW_DSI_PRST BIT(0)
  102. #define TH1520_HDMI_SW_MAIN_RST BIT(0)
  103. #define TH1520_HDMI_SW_PRST BIT(1)
  104. /* register offset in VPSYS_REGMAP */
  105. #define TH1520_AXIBUS_RST_CFG 0x0
  106. #define TH1520_FCE_RST_CFG 0x4
  107. #define TH1520_G2D_RST_CFG 0x8
  108. #define TH1520_VDEC_RST_CFG 0xc
  109. #define TH1520_VENC_RST_CFG 0x10
  110. struct th1520_reset_map {
  111. u32 bit;
  112. u32 reg;
  113. };
  114. struct th1520_reset_priv {
  115. struct reset_controller_dev rcdev;
  116. struct regmap *map;
  117. const struct th1520_reset_map *resets;
  118. };
  119. struct th1520_reset_data {
  120. const struct th1520_reset_map *resets;
  121. size_t num;
  122. };
  123. static const struct th1520_reset_map th1520_resets[] = {
  124. [TH1520_RESET_ID_GPU] = {
  125. .bit = TH1520_GPU_SW_GPU_RST,
  126. .reg = TH1520_GPU_RST_CFG,
  127. },
  128. [TH1520_RESET_ID_GPU_CLKGEN] = {
  129. .bit = TH1520_GPU_SW_CLKGEN_RST,
  130. .reg = TH1520_GPU_RST_CFG,
  131. },
  132. [TH1520_RESET_ID_DPU_AHB] = {
  133. .bit = TH1520_DPU_SW_DPU_HRST,
  134. .reg = TH1520_DPU_RST_CFG,
  135. },
  136. [TH1520_RESET_ID_DPU_AXI] = {
  137. .bit = TH1520_DPU_SW_DPU_ARST,
  138. .reg = TH1520_DPU_RST_CFG,
  139. },
  140. [TH1520_RESET_ID_DPU_CORE] = {
  141. .bit = TH1520_DPU_SW_DPU_CRST,
  142. .reg = TH1520_DPU_RST_CFG,
  143. },
  144. [TH1520_RESET_ID_DSI0_APB] = {
  145. .bit = TH1520_DSI_SW_DSI_PRST,
  146. .reg = TH1520_DSI0_RST_CFG,
  147. },
  148. [TH1520_RESET_ID_DSI1_APB] = {
  149. .bit = TH1520_DSI_SW_DSI_PRST,
  150. .reg = TH1520_DSI1_RST_CFG,
  151. },
  152. [TH1520_RESET_ID_HDMI] = {
  153. .bit = TH1520_HDMI_SW_MAIN_RST,
  154. .reg = TH1520_HDMI_RST_CFG,
  155. },
  156. [TH1520_RESET_ID_HDMI_APB] = {
  157. .bit = TH1520_HDMI_SW_PRST,
  158. .reg = TH1520_HDMI_RST_CFG,
  159. },
  160. [TH1520_RESET_ID_VOAXI] = {
  161. .bit = BIT(0),
  162. .reg = TH1520_AXI4_VO_DW_AXI_RST_CFG,
  163. },
  164. [TH1520_RESET_ID_VOAXI_APB] = {
  165. .bit = BIT(1),
  166. .reg = TH1520_AXI4_VO_DW_AXI_RST_CFG,
  167. },
  168. [TH1520_RESET_ID_X2H_DPU_AXI] = {
  169. .bit = BIT(0),
  170. .reg = TH1520_X2H_X4_VOSYS_DW_RST_CFG,
  171. },
  172. [TH1520_RESET_ID_X2H_DPU_AHB] = {
  173. .bit = BIT(1),
  174. .reg = TH1520_X2H_X4_VOSYS_DW_RST_CFG,
  175. },
  176. [TH1520_RESET_ID_X2H_DPU1_AXI] = {
  177. .bit = BIT(2),
  178. .reg = TH1520_X2H_X4_VOSYS_DW_RST_CFG,
  179. },
  180. [TH1520_RESET_ID_X2H_DPU1_AHB] = {
  181. .bit = BIT(3),
  182. .reg = TH1520_X2H_X4_VOSYS_DW_RST_CFG,
  183. },
  184. };
  185. static const struct th1520_reset_map th1520_ap_resets[] = {
  186. [TH1520_RESET_ID_BROM] = {
  187. .bit = BIT(0),
  188. .reg = TH1520_BROM_RST_CFG,
  189. },
  190. [TH1520_RESET_ID_C910_TOP] = {
  191. .bit = BIT(0),
  192. .reg = TH1520_C910_RST_CFG,
  193. },
  194. [TH1520_RESET_ID_NPU] = {
  195. .bit = BIT(0),
  196. .reg = TH1520_IMG_NNA_RST_CFG,
  197. },
  198. [TH1520_RESET_ID_WDT0] = {
  199. .bit = BIT(0),
  200. .reg = TH1520_WDT0_RST_CFG,
  201. },
  202. [TH1520_RESET_ID_WDT1] = {
  203. .bit = BIT(0),
  204. .reg = TH1520_WDT1_RST_CFG,
  205. },
  206. [TH1520_RESET_ID_C910_C0] = {
  207. .bit = BIT(1),
  208. .reg = TH1520_C910_RST_CFG,
  209. },
  210. [TH1520_RESET_ID_C910_C1] = {
  211. .bit = BIT(2),
  212. .reg = TH1520_C910_RST_CFG,
  213. },
  214. [TH1520_RESET_ID_C910_C2] = {
  215. .bit = BIT(3),
  216. .reg = TH1520_C910_RST_CFG,
  217. },
  218. [TH1520_RESET_ID_C910_C3] = {
  219. .bit = BIT(4),
  220. .reg = TH1520_C910_RST_CFG,
  221. },
  222. [TH1520_RESET_ID_CHIP_DBG_CORE] = {
  223. .bit = BIT(0),
  224. .reg = TH1520_CHIP_DBG_RST_CFG,
  225. },
  226. [TH1520_RESET_ID_CHIP_DBG_AXI] = {
  227. .bit = BIT(1),
  228. .reg = TH1520_CHIP_DBG_RST_CFG,
  229. },
  230. [TH1520_RESET_ID_AXI4_CPUSYS2_AXI] = {
  231. .bit = BIT(0),
  232. .reg = TH1520_AXI4_CPUSYS2_RST_CFG,
  233. },
  234. [TH1520_RESET_ID_AXI4_CPUSYS2_APB] = {
  235. .bit = BIT(1),
  236. .reg = TH1520_AXI4_CPUSYS2_RST_CFG,
  237. },
  238. [TH1520_RESET_ID_X2H_CPUSYS] = {
  239. .bit = BIT(0),
  240. .reg = TH1520_X2H_CPUSYS_RST_CFG,
  241. },
  242. [TH1520_RESET_ID_AHB2_CPUSYS] = {
  243. .bit = BIT(0),
  244. .reg = TH1520_AHB2_CPUSYS_RST_CFG,
  245. },
  246. [TH1520_RESET_ID_APB3_CPUSYS] = {
  247. .bit = BIT(0),
  248. .reg = TH1520_APB3_CPUSYS_RST_CFG,
  249. },
  250. [TH1520_RESET_ID_MBOX0_APB] = {
  251. .bit = BIT(0),
  252. .reg = TH1520_MBOX0_RST_CFG,
  253. },
  254. [TH1520_RESET_ID_MBOX1_APB] = {
  255. .bit = BIT(0),
  256. .reg = TH1520_MBOX1_RST_CFG,
  257. },
  258. [TH1520_RESET_ID_MBOX2_APB] = {
  259. .bit = BIT(0),
  260. .reg = TH1520_MBOX2_RST_CFG,
  261. },
  262. [TH1520_RESET_ID_MBOX3_APB] = {
  263. .bit = BIT(0),
  264. .reg = TH1520_MBOX3_RST_CFG,
  265. },
  266. [TH1520_RESET_ID_TIMER0_APB] = {
  267. .bit = BIT(0),
  268. .reg = TH1520_TIMER0_RST_CFG,
  269. },
  270. [TH1520_RESET_ID_TIMER0_CORE] = {
  271. .bit = BIT(1),
  272. .reg = TH1520_TIMER0_RST_CFG,
  273. },
  274. [TH1520_RESET_ID_TIMER1_APB] = {
  275. .bit = BIT(0),
  276. .reg = TH1520_TIMER1_RST_CFG,
  277. },
  278. [TH1520_RESET_ID_TIMER1_CORE] = {
  279. .bit = BIT(1),
  280. .reg = TH1520_TIMER1_RST_CFG,
  281. },
  282. [TH1520_RESET_ID_PERISYS_AHB] = {
  283. .bit = BIT(0),
  284. .reg = TH1520_PERISYS_AHB_RST_CFG,
  285. },
  286. [TH1520_RESET_ID_PERISYS_APB1] = {
  287. .bit = BIT(0),
  288. .reg = TH1520_PERISYS_APB1_RST_CFG,
  289. },
  290. [TH1520_RESET_ID_PERISYS_APB2] = {
  291. .bit = BIT(0),
  292. .reg = TH1520_PERISYS_APB2_RST_CFG,
  293. },
  294. [TH1520_RESET_ID_GMAC0_APB] = {
  295. .bit = BIT(0),
  296. .reg = TH1520_GMAC0_RST_CFG,
  297. },
  298. [TH1520_RESET_ID_GMAC0_AHB] = {
  299. .bit = BIT(1),
  300. .reg = TH1520_GMAC0_RST_CFG,
  301. },
  302. [TH1520_RESET_ID_GMAC0_CLKGEN] = {
  303. .bit = BIT(2),
  304. .reg = TH1520_GMAC0_RST_CFG,
  305. },
  306. [TH1520_RESET_ID_GMAC0_AXI] = {
  307. .bit = BIT(3),
  308. .reg = TH1520_GMAC0_RST_CFG,
  309. },
  310. [TH1520_RESET_ID_UART0_APB] = {
  311. .bit = BIT(0),
  312. .reg = TH1520_UART0_RST_CFG,
  313. },
  314. [TH1520_RESET_ID_UART0_IF] = {
  315. .bit = BIT(1),
  316. .reg = TH1520_UART0_RST_CFG,
  317. },
  318. [TH1520_RESET_ID_UART1_APB] = {
  319. .bit = BIT(0),
  320. .reg = TH1520_UART1_RST_CFG,
  321. },
  322. [TH1520_RESET_ID_UART1_IF] = {
  323. .bit = BIT(1),
  324. .reg = TH1520_UART1_RST_CFG,
  325. },
  326. [TH1520_RESET_ID_UART2_APB] = {
  327. .bit = BIT(0),
  328. .reg = TH1520_UART2_RST_CFG,
  329. },
  330. [TH1520_RESET_ID_UART2_IF] = {
  331. .bit = BIT(1),
  332. .reg = TH1520_UART2_RST_CFG,
  333. },
  334. [TH1520_RESET_ID_UART3_APB] = {
  335. .bit = BIT(0),
  336. .reg = TH1520_UART3_RST_CFG,
  337. },
  338. [TH1520_RESET_ID_UART3_IF] = {
  339. .bit = BIT(1),
  340. .reg = TH1520_UART3_RST_CFG,
  341. },
  342. [TH1520_RESET_ID_UART4_APB] = {
  343. .bit = BIT(0),
  344. .reg = TH1520_UART4_RST_CFG,
  345. },
  346. [TH1520_RESET_ID_UART4_IF] = {
  347. .bit = BIT(1),
  348. .reg = TH1520_UART4_RST_CFG,
  349. },
  350. [TH1520_RESET_ID_UART5_APB] = {
  351. .bit = BIT(0),
  352. .reg = TH1520_UART5_RST_CFG,
  353. },
  354. [TH1520_RESET_ID_UART5_IF] = {
  355. .bit = BIT(1),
  356. .reg = TH1520_UART5_RST_CFG,
  357. },
  358. [TH1520_RESET_ID_QSPI0_IF] = {
  359. .bit = BIT(0),
  360. .reg = TH1520_QSPI0_RST_CFG,
  361. },
  362. [TH1520_RESET_ID_QSPI0_APB] = {
  363. .bit = BIT(1),
  364. .reg = TH1520_QSPI0_RST_CFG,
  365. },
  366. [TH1520_RESET_ID_QSPI1_IF] = {
  367. .bit = BIT(0),
  368. .reg = TH1520_QSPI1_RST_CFG,
  369. },
  370. [TH1520_RESET_ID_QSPI1_APB] = {
  371. .bit = BIT(1),
  372. .reg = TH1520_QSPI1_RST_CFG,
  373. },
  374. [TH1520_RESET_ID_SPI_IF] = {
  375. .bit = BIT(0),
  376. .reg = TH1520_SPI_RST_CFG,
  377. },
  378. [TH1520_RESET_ID_SPI_APB] = {
  379. .bit = BIT(1),
  380. .reg = TH1520_SPI_RST_CFG,
  381. },
  382. [TH1520_RESET_ID_I2C0_APB] = {
  383. .bit = BIT(0),
  384. .reg = TH1520_I2C0_RST_CFG,
  385. },
  386. [TH1520_RESET_ID_I2C0_CORE] = {
  387. .bit = BIT(1),
  388. .reg = TH1520_I2C0_RST_CFG,
  389. },
  390. [TH1520_RESET_ID_I2C1_APB] = {
  391. .bit = BIT(0),
  392. .reg = TH1520_I2C1_RST_CFG,
  393. },
  394. [TH1520_RESET_ID_I2C1_CORE] = {
  395. .bit = BIT(1),
  396. .reg = TH1520_I2C1_RST_CFG,
  397. },
  398. [TH1520_RESET_ID_I2C2_APB] = {
  399. .bit = BIT(0),
  400. .reg = TH1520_I2C2_RST_CFG,
  401. },
  402. [TH1520_RESET_ID_I2C2_CORE] = {
  403. .bit = BIT(1),
  404. .reg = TH1520_I2C2_RST_CFG,
  405. },
  406. [TH1520_RESET_ID_I2C3_APB] = {
  407. .bit = BIT(0),
  408. .reg = TH1520_I2C3_RST_CFG,
  409. },
  410. [TH1520_RESET_ID_I2C3_CORE] = {
  411. .bit = BIT(1),
  412. .reg = TH1520_I2C3_RST_CFG,
  413. },
  414. [TH1520_RESET_ID_I2C4_APB] = {
  415. .bit = BIT(0),
  416. .reg = TH1520_I2C4_RST_CFG,
  417. },
  418. [TH1520_RESET_ID_I2C4_CORE] = {
  419. .bit = BIT(1),
  420. .reg = TH1520_I2C4_RST_CFG,
  421. },
  422. [TH1520_RESET_ID_I2C5_APB] = {
  423. .bit = BIT(0),
  424. .reg = TH1520_I2C5_RST_CFG,
  425. },
  426. [TH1520_RESET_ID_I2C5_CORE] = {
  427. .bit = BIT(1),
  428. .reg = TH1520_I2C5_RST_CFG,
  429. },
  430. [TH1520_RESET_ID_GPIO0_DB] = {
  431. .bit = BIT(0),
  432. .reg = TH1520_GPIO0_RST_CFG,
  433. },
  434. [TH1520_RESET_ID_GPIO0_APB] = {
  435. .bit = BIT(1),
  436. .reg = TH1520_GPIO0_RST_CFG,
  437. },
  438. [TH1520_RESET_ID_GPIO1_DB] = {
  439. .bit = BIT(0),
  440. .reg = TH1520_GPIO1_RST_CFG,
  441. },
  442. [TH1520_RESET_ID_GPIO1_APB] = {
  443. .bit = BIT(1),
  444. .reg = TH1520_GPIO1_RST_CFG,
  445. },
  446. [TH1520_RESET_ID_GPIO2_DB] = {
  447. .bit = BIT(0),
  448. .reg = TH1520_GPIO2_RST_CFG,
  449. },
  450. [TH1520_RESET_ID_GPIO2_APB] = {
  451. .bit = BIT(1),
  452. .reg = TH1520_GPIO2_RST_CFG,
  453. },
  454. [TH1520_RESET_ID_PWM_COUNTER] = {
  455. .bit = BIT(0),
  456. .reg = TH1520_PWM_RST_CFG,
  457. },
  458. [TH1520_RESET_ID_PWM_APB] = {
  459. .bit = BIT(1),
  460. .reg = TH1520_PWM_RST_CFG,
  461. },
  462. [TH1520_RESET_ID_PADCTRL0_APB] = {
  463. .bit = BIT(0),
  464. .reg = TH1520_PADCTRL0_APSYS_RST_CFG,
  465. },
  466. [TH1520_RESET_ID_CPU2PERI_X2H] = {
  467. .bit = BIT(1),
  468. .reg = TH1520_CPU2PERI_X2H_RST_CFG,
  469. },
  470. [TH1520_RESET_ID_CPU2AON_X2H] = {
  471. .bit = BIT(0),
  472. .reg = TH1520_CPU2AON_X2H_RST_CFG,
  473. },
  474. [TH1520_RESET_ID_AON2CPU_A2X] = {
  475. .bit = BIT(0),
  476. .reg = TH1520_AON2CPU_A2X_RST_CFG,
  477. },
  478. [TH1520_RESET_ID_NPUSYS_AXI] = {
  479. .bit = BIT(0),
  480. .reg = TH1520_NPUSYS_AXI_RST_CFG,
  481. },
  482. [TH1520_RESET_ID_NPUSYS_AXI_APB] = {
  483. .bit = BIT(1),
  484. .reg = TH1520_NPUSYS_AXI_RST_CFG,
  485. },
  486. [TH1520_RESET_ID_CPU2VP_X2P] = {
  487. .bit = BIT(0),
  488. .reg = TH1520_CPU2VP_X2P_RST_CFG,
  489. },
  490. [TH1520_RESET_ID_CPU2VI_X2H] = {
  491. .bit = BIT(0),
  492. .reg = TH1520_CPU2VI_X2H_RST_CFG,
  493. },
  494. [TH1520_RESET_ID_BMU_AXI] = {
  495. .bit = BIT(0),
  496. .reg = TH1520_BMU_C910_RST_CFG,
  497. },
  498. [TH1520_RESET_ID_BMU_APB] = {
  499. .bit = BIT(1),
  500. .reg = TH1520_BMU_C910_RST_CFG,
  501. },
  502. [TH1520_RESET_ID_DMAC_CPUSYS_AXI] = {
  503. .bit = BIT(0),
  504. .reg = TH1520_DMAC_CPUSYS_RST_CFG,
  505. },
  506. [TH1520_RESET_ID_DMAC_CPUSYS_AHB] = {
  507. .bit = BIT(1),
  508. .reg = TH1520_DMAC_CPUSYS_RST_CFG,
  509. },
  510. [TH1520_RESET_ID_SPINLOCK] = {
  511. .bit = BIT(0),
  512. .reg = TH1520_SPINLOCK_RST_CFG,
  513. },
  514. [TH1520_RESET_ID_CFG2TEE] = {
  515. .bit = BIT(0),
  516. .reg = TH1520_CFG2TEE_X2H_RST_CFG,
  517. },
  518. [TH1520_RESET_ID_DSMART] = {
  519. .bit = BIT(0),
  520. .reg = TH1520_DSMART_RST_CFG,
  521. },
  522. [TH1520_RESET_ID_GPIO3_DB] = {
  523. .bit = BIT(0),
  524. .reg = TH1520_GPIO3_RST_CFG,
  525. },
  526. [TH1520_RESET_ID_GPIO3_APB] = {
  527. .bit = BIT(1),
  528. .reg = TH1520_GPIO3_RST_CFG,
  529. },
  530. [TH1520_RESET_ID_PERI_I2S] = {
  531. .bit = BIT(0),
  532. .reg = TH1520_I2S_RST_CFG,
  533. },
  534. [TH1520_RESET_ID_PERI_APB3] = {
  535. .bit = BIT(0),
  536. .reg = TH1520_PERI_APB3_RST_CFG,
  537. },
  538. [TH1520_RESET_ID_PERI2PERI1_APB] = {
  539. .bit = BIT(1),
  540. .reg = TH1520_PERI_APB3_RST_CFG,
  541. },
  542. [TH1520_RESET_ID_VPSYS_APB] = {
  543. .bit = BIT(0),
  544. .reg = TH1520_VP_SUBSYS_RST_CFG,
  545. },
  546. [TH1520_RESET_ID_PERISYS_APB4] = {
  547. .bit = BIT(0),
  548. .reg = TH1520_PERISYS_APB4_RST_CFG,
  549. },
  550. [TH1520_RESET_ID_GMAC1_APB] = {
  551. .bit = BIT(0),
  552. .reg = TH1520_GMAC1_RST_CFG,
  553. },
  554. [TH1520_RESET_ID_GMAC1_AHB] = {
  555. .bit = BIT(1),
  556. .reg = TH1520_GMAC1_RST_CFG,
  557. },
  558. [TH1520_RESET_ID_GMAC1_CLKGEN] = {
  559. .bit = BIT(2),
  560. .reg = TH1520_GMAC1_RST_CFG,
  561. },
  562. [TH1520_RESET_ID_GMAC1_AXI] = {
  563. .bit = BIT(3),
  564. .reg = TH1520_GMAC1_RST_CFG,
  565. },
  566. [TH1520_RESET_ID_GMAC_AXI] = {
  567. .bit = BIT(0),
  568. .reg = TH1520_GMAC_AXI_RST_CFG,
  569. },
  570. [TH1520_RESET_ID_GMAC_AXI_APB] = {
  571. .bit = BIT(1),
  572. .reg = TH1520_GMAC_AXI_RST_CFG,
  573. },
  574. [TH1520_RESET_ID_PADCTRL1_APB] = {
  575. .bit = BIT(0),
  576. .reg = TH1520_PADCTRL1_APSYS_RST_CFG,
  577. },
  578. [TH1520_RESET_ID_VOSYS_AXI] = {
  579. .bit = BIT(0),
  580. .reg = TH1520_VOSYS_AXI_RST_CFG,
  581. },
  582. [TH1520_RESET_ID_VOSYS_AXI_APB] = {
  583. .bit = BIT(1),
  584. .reg = TH1520_VOSYS_AXI_RST_CFG,
  585. },
  586. [TH1520_RESET_ID_VOSYS_AXI_X2X] = {
  587. .bit = BIT(0),
  588. .reg = TH1520_VOSYS_X2X_RST_CFG,
  589. },
  590. [TH1520_RESET_ID_MISC2VP_X2X] = {
  591. .bit = BIT(0),
  592. .reg = TH1520_MISC2VP_X2X_RST_CFG,
  593. },
  594. [TH1520_RESET_ID_DSPSYS] = {
  595. .bit = BIT(0),
  596. .reg = TH1520_SUBSYS_RST_CFG,
  597. },
  598. [TH1520_RESET_ID_VISYS] = {
  599. .bit = BIT(1),
  600. .reg = TH1520_SUBSYS_RST_CFG,
  601. },
  602. [TH1520_RESET_ID_VOSYS] = {
  603. .bit = BIT(2),
  604. .reg = TH1520_SUBSYS_RST_CFG,
  605. },
  606. [TH1520_RESET_ID_VPSYS] = {
  607. .bit = BIT(3),
  608. .reg = TH1520_SUBSYS_RST_CFG,
  609. },
  610. };
  611. static const struct th1520_reset_map th1520_dsp_resets[] = {
  612. [TH1520_RESET_ID_X2X_DSP1] = {
  613. .bit = BIT(0),
  614. .reg = TH1520_DSPSYS_RST_CFG,
  615. },
  616. [TH1520_RESET_ID_X2X_DSP0] = {
  617. .bit = BIT(1),
  618. .reg = TH1520_DSPSYS_RST_CFG,
  619. },
  620. [TH1520_RESET_ID_X2X_SLAVE_DSP1] = {
  621. .bit = BIT(2),
  622. .reg = TH1520_DSPSYS_RST_CFG,
  623. },
  624. [TH1520_RESET_ID_X2X_SLAVE_DSP0] = {
  625. .bit = BIT(3),
  626. .reg = TH1520_DSPSYS_RST_CFG,
  627. },
  628. [TH1520_RESET_ID_DSP0_CORE] = {
  629. .bit = BIT(8),
  630. .reg = TH1520_DSPSYS_RST_CFG,
  631. },
  632. [TH1520_RESET_ID_DSP0_DEBUG] = {
  633. .bit = BIT(9),
  634. .reg = TH1520_DSPSYS_RST_CFG,
  635. },
  636. [TH1520_RESET_ID_DSP0_APB] = {
  637. .bit = BIT(10),
  638. .reg = TH1520_DSPSYS_RST_CFG,
  639. },
  640. [TH1520_RESET_ID_DSP1_CORE] = {
  641. .bit = BIT(12),
  642. .reg = TH1520_DSPSYS_RST_CFG,
  643. },
  644. [TH1520_RESET_ID_DSP1_DEBUG] = {
  645. .bit = BIT(13),
  646. .reg = TH1520_DSPSYS_RST_CFG,
  647. },
  648. [TH1520_RESET_ID_DSP1_APB] = {
  649. .bit = BIT(14),
  650. .reg = TH1520_DSPSYS_RST_CFG,
  651. },
  652. [TH1520_RESET_ID_DSPSYS_APB] = {
  653. .bit = BIT(16),
  654. .reg = TH1520_DSPSYS_RST_CFG,
  655. },
  656. [TH1520_RESET_ID_AXI4_DSPSYS_SLV] = {
  657. .bit = BIT(20),
  658. .reg = TH1520_DSPSYS_RST_CFG,
  659. },
  660. [TH1520_RESET_ID_AXI4_DSPSYS] = {
  661. .bit = BIT(24),
  662. .reg = TH1520_DSPSYS_RST_CFG,
  663. },
  664. [TH1520_RESET_ID_AXI4_DSP_RS] = {
  665. .bit = BIT(26),
  666. .reg = TH1520_DSPSYS_RST_CFG,
  667. },
  668. };
  669. static const struct th1520_reset_map th1520_misc_resets[] = {
  670. [TH1520_RESET_ID_EMMC_SDIO_CLKGEN] = {
  671. .bit = BIT(0),
  672. .reg = TH1520_EMMC_RST_CFG,
  673. },
  674. [TH1520_RESET_ID_EMMC] = {
  675. .bit = BIT(1),
  676. .reg = TH1520_EMMC_RST_CFG,
  677. },
  678. [TH1520_RESET_ID_MISCSYS_AXI] = {
  679. .bit = BIT(0),
  680. .reg = TH1520_MISCSYS_AXI_RST_CFG,
  681. },
  682. [TH1520_RESET_ID_MISCSYS_AXI_APB] = {
  683. .bit = BIT(1),
  684. .reg = TH1520_MISCSYS_AXI_RST_CFG,
  685. },
  686. [TH1520_RESET_ID_SDIO0] = {
  687. .bit = BIT(0),
  688. .reg = TH1520_SDIO0_RST_CFG,
  689. },
  690. [TH1520_RESET_ID_SDIO1] = {
  691. .bit = BIT(1),
  692. .reg = TH1520_SDIO1_RST_CFG,
  693. },
  694. [TH1520_RESET_ID_USB3_APB] = {
  695. .bit = BIT(0),
  696. .reg = TH1520_USB3_DRD_RST_CFG,
  697. },
  698. [TH1520_RESET_ID_USB3_PHY] = {
  699. .bit = BIT(1),
  700. .reg = TH1520_USB3_DRD_RST_CFG,
  701. },
  702. [TH1520_RESET_ID_USB3_VCC] = {
  703. .bit = BIT(2),
  704. .reg = TH1520_USB3_DRD_RST_CFG,
  705. },
  706. };
  707. static const struct th1520_reset_map th1520_vi_resets[] = {
  708. [TH1520_RESET_ID_ISP0] = {
  709. .bit = BIT(0),
  710. .reg = TH1520_VISYS_RST_CFG,
  711. },
  712. [TH1520_RESET_ID_ISP1] = {
  713. .bit = BIT(4),
  714. .reg = TH1520_VISYS_RST_CFG,
  715. },
  716. [TH1520_RESET_ID_CSI0_APB] = {
  717. .bit = BIT(16),
  718. .reg = TH1520_VISYS_RST_CFG,
  719. },
  720. [TH1520_RESET_ID_CSI1_APB] = {
  721. .bit = BIT(17),
  722. .reg = TH1520_VISYS_RST_CFG,
  723. },
  724. [TH1520_RESET_ID_CSI2_APB] = {
  725. .bit = BIT(18),
  726. .reg = TH1520_VISYS_RST_CFG,
  727. },
  728. [TH1520_RESET_ID_MIPI_FIFO] = {
  729. .bit = BIT(20),
  730. .reg = TH1520_VISYS_RST_CFG,
  731. },
  732. [TH1520_RESET_ID_ISP_VENC_APB] = {
  733. .bit = BIT(24),
  734. .reg = TH1520_VISYS_RST_CFG,
  735. },
  736. [TH1520_RESET_ID_VIPRE_APB] = {
  737. .bit = BIT(28),
  738. .reg = TH1520_VISYS_RST_CFG,
  739. },
  740. [TH1520_RESET_ID_VIPRE_AXI] = {
  741. .bit = BIT(29),
  742. .reg = TH1520_VISYS_RST_CFG,
  743. },
  744. [TH1520_RESET_ID_DW200_APB] = {
  745. .bit = BIT(31),
  746. .reg = TH1520_VISYS_RST_CFG,
  747. },
  748. [TH1520_RESET_ID_VISYS3_AXI] = {
  749. .bit = BIT(8),
  750. .reg = TH1520_VISYS_2_RST_CFG,
  751. },
  752. [TH1520_RESET_ID_VISYS2_AXI] = {
  753. .bit = BIT(9),
  754. .reg = TH1520_VISYS_2_RST_CFG,
  755. },
  756. [TH1520_RESET_ID_VISYS1_AXI] = {
  757. .bit = BIT(10),
  758. .reg = TH1520_VISYS_2_RST_CFG,
  759. },
  760. [TH1520_RESET_ID_VISYS_AXI] = {
  761. .bit = BIT(12),
  762. .reg = TH1520_VISYS_2_RST_CFG,
  763. },
  764. [TH1520_RESET_ID_VISYS_APB] = {
  765. .bit = BIT(16),
  766. .reg = TH1520_VISYS_2_RST_CFG,
  767. },
  768. [TH1520_RESET_ID_ISP_VENC_AXI] = {
  769. .bit = BIT(20),
  770. .reg = TH1520_VISYS_2_RST_CFG,
  771. },
  772. };
  773. static const struct th1520_reset_map th1520_vp_resets[] = {
  774. [TH1520_RESET_ID_VPSYS_AXI_APB] = {
  775. .bit = BIT(0),
  776. .reg = TH1520_AXIBUS_RST_CFG,
  777. },
  778. [TH1520_RESET_ID_VPSYS_AXI] = {
  779. .bit = BIT(1),
  780. .reg = TH1520_AXIBUS_RST_CFG,
  781. },
  782. [TH1520_RESET_ID_FCE_APB] = {
  783. .bit = BIT(0),
  784. .reg = TH1520_FCE_RST_CFG,
  785. },
  786. [TH1520_RESET_ID_FCE_CORE] = {
  787. .bit = BIT(1),
  788. .reg = TH1520_FCE_RST_CFG,
  789. },
  790. [TH1520_RESET_ID_FCE_X2X_MASTER] = {
  791. .bit = BIT(4),
  792. .reg = TH1520_FCE_RST_CFG,
  793. },
  794. [TH1520_RESET_ID_FCE_X2X_SLAVE] = {
  795. .bit = BIT(5),
  796. .reg = TH1520_FCE_RST_CFG,
  797. },
  798. [TH1520_RESET_ID_G2D_APB] = {
  799. .bit = BIT(0),
  800. .reg = TH1520_G2D_RST_CFG,
  801. },
  802. [TH1520_RESET_ID_G2D_ACLK] = {
  803. .bit = BIT(1),
  804. .reg = TH1520_G2D_RST_CFG,
  805. },
  806. [TH1520_RESET_ID_G2D_CORE] = {
  807. .bit = BIT(2),
  808. .reg = TH1520_G2D_RST_CFG,
  809. },
  810. [TH1520_RESET_ID_VDEC_APB] = {
  811. .bit = BIT(0),
  812. .reg = TH1520_VDEC_RST_CFG,
  813. },
  814. [TH1520_RESET_ID_VDEC_ACLK] = {
  815. .bit = BIT(1),
  816. .reg = TH1520_VDEC_RST_CFG,
  817. },
  818. [TH1520_RESET_ID_VDEC_CORE] = {
  819. .bit = BIT(2),
  820. .reg = TH1520_VDEC_RST_CFG,
  821. },
  822. [TH1520_RESET_ID_VENC_APB] = {
  823. .bit = BIT(0),
  824. .reg = TH1520_VENC_RST_CFG,
  825. },
  826. [TH1520_RESET_ID_VENC_CORE] = {
  827. .bit = BIT(1),
  828. .reg = TH1520_VENC_RST_CFG,
  829. },
  830. };
  831. static inline struct th1520_reset_priv *
  832. to_th1520_reset(struct reset_controller_dev *rcdev)
  833. {
  834. return container_of(rcdev, struct th1520_reset_priv, rcdev);
  835. }
  836. static int th1520_reset_assert(struct reset_controller_dev *rcdev,
  837. unsigned long id)
  838. {
  839. struct th1520_reset_priv *priv = to_th1520_reset(rcdev);
  840. const struct th1520_reset_map *reset;
  841. reset = &priv->resets[id];
  842. return regmap_update_bits(priv->map, reset->reg, reset->bit, 0);
  843. }
  844. static int th1520_reset_deassert(struct reset_controller_dev *rcdev,
  845. unsigned long id)
  846. {
  847. struct th1520_reset_priv *priv = to_th1520_reset(rcdev);
  848. const struct th1520_reset_map *reset;
  849. reset = &priv->resets[id];
  850. return regmap_update_bits(priv->map, reset->reg, reset->bit,
  851. reset->bit);
  852. }
  853. static const struct reset_control_ops th1520_reset_ops = {
  854. .assert = th1520_reset_assert,
  855. .deassert = th1520_reset_deassert,
  856. };
  857. static const struct regmap_config th1520_reset_regmap_config = {
  858. .reg_bits = 32,
  859. .val_bits = 32,
  860. .reg_stride = 4,
  861. };
  862. static int th1520_reset_probe(struct platform_device *pdev)
  863. {
  864. const struct th1520_reset_data *data;
  865. struct device *dev = &pdev->dev;
  866. struct th1520_reset_priv *priv;
  867. void __iomem *base;
  868. int ret;
  869. data = device_get_match_data(dev);
  870. priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
  871. if (!priv)
  872. return -ENOMEM;
  873. base = devm_platform_ioremap_resource(pdev, 0);
  874. if (IS_ERR(base))
  875. return PTR_ERR(base);
  876. priv->map = devm_regmap_init_mmio(dev, base,
  877. &th1520_reset_regmap_config);
  878. if (IS_ERR(priv->map))
  879. return PTR_ERR(priv->map);
  880. if (of_device_is_compatible(dev->of_node, "thead,th1520-reset")) {
  881. /* Initialize GPU resets to asserted state */
  882. ret = regmap_update_bits(priv->map, TH1520_GPU_RST_CFG,
  883. TH1520_GPU_RST_CFG_MASK, 0);
  884. if (ret)
  885. return ret;
  886. }
  887. priv->rcdev.owner = THIS_MODULE;
  888. priv->rcdev.nr_resets = data->num;
  889. priv->rcdev.ops = &th1520_reset_ops;
  890. priv->rcdev.of_node = dev->of_node;
  891. priv->resets = data->resets;
  892. return devm_reset_controller_register(dev, &priv->rcdev);
  893. }
  894. static const struct th1520_reset_data th1520_reset_data = {
  895. .resets = th1520_resets,
  896. .num = ARRAY_SIZE(th1520_resets),
  897. };
  898. static const struct th1520_reset_data th1520_ap_reset_data = {
  899. .resets = th1520_ap_resets,
  900. .num = ARRAY_SIZE(th1520_ap_resets),
  901. };
  902. static const struct th1520_reset_data th1520_dsp_reset_data = {
  903. .resets = th1520_dsp_resets,
  904. .num = ARRAY_SIZE(th1520_dsp_resets),
  905. };
  906. static const struct th1520_reset_data th1520_misc_reset_data = {
  907. .resets = th1520_misc_resets,
  908. .num = ARRAY_SIZE(th1520_misc_resets),
  909. };
  910. static const struct th1520_reset_data th1520_vi_reset_data = {
  911. .resets = th1520_vi_resets,
  912. .num = ARRAY_SIZE(th1520_vi_resets),
  913. };
  914. static const struct th1520_reset_data th1520_vp_reset_data = {
  915. .resets = th1520_vp_resets,
  916. .num = ARRAY_SIZE(th1520_vp_resets),
  917. };
  918. static const struct of_device_id th1520_reset_match[] = {
  919. { .compatible = "thead,th1520-reset", .data = &th1520_reset_data },
  920. { .compatible = "thead,th1520-reset-ap", .data = &th1520_ap_reset_data },
  921. { .compatible = "thead,th1520-reset-dsp", .data = &th1520_dsp_reset_data },
  922. { .compatible = "thead,th1520-reset-misc", .data = &th1520_misc_reset_data },
  923. { .compatible = "thead,th1520-reset-vi", .data = &th1520_vi_reset_data },
  924. { .compatible = "thead,th1520-reset-vp", .data = &th1520_vp_reset_data },
  925. { /* sentinel */ }
  926. };
  927. MODULE_DEVICE_TABLE(of, th1520_reset_match);
  928. static struct platform_driver th1520_reset_driver = {
  929. .driver = {
  930. .name = "th1520-reset",
  931. .of_match_table = th1520_reset_match,
  932. },
  933. .probe = th1520_reset_probe,
  934. };
  935. module_platform_driver(th1520_reset_driver);
  936. MODULE_AUTHOR("Michal Wilczynski <m.wilczynski@samsung.com>");
  937. MODULE_DESCRIPTION("T-HEAD TH1520 SoC reset controller");
  938. MODULE_LICENSE("GPL");