sysctl_rst.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635
  1. /* Copyright (c) 2023, Canaan Bright Sight Co., Ltd
  2. *
  3. * Redistribution and use in source and binary forms, with or without
  4. * modification, are permitted provided that the following conditions are met:
  5. * 1. Redistributions of source code must retain the above copyright
  6. * notice, this list of conditions and the following disclaimer.
  7. * 2. Redistributions in binary form must reproduce the above copyright
  8. * notice, this list of conditions and the following disclaimer in the
  9. * documentation and/or other materials provided with the distribution.
  10. *
  11. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
  12. * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
  13. * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  14. * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  15. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
  16. * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  17. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
  18. * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  19. * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  20. * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  21. * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  22. * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  23. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  24. */
  25. #include <rtthread.h>
  26. #include <stdbool.h>
  27. #include "sysctl_rst.h"
  28. #include "ioremap.h"
  29. #include "board.h"
  30. volatile sysctl_rst_t* sysctl_rst = (volatile sysctl_rst_t*)RMU_BASE_ADDR;
  31. static bool sysctl_reset_cpu(volatile uint32_t *reset_reg, uint8_t reset_bit, uint8_t done_bit)
  32. {
  33. /* clear done bit */
  34. *reset_reg |= (1 << done_bit);
  35. *reset_reg |= (1 << (done_bit + 0x10)); /* write enable */
  36. /* usleep(100); */
  37. rt_thread_delay(1);
  38. /* set reset bit */
  39. *reset_reg |= (1 << reset_bit);
  40. *reset_reg |= (1 << (reset_bit + 0x10)); /* write enable */
  41. /* usleep(100); */
  42. rt_thread_delay(1);
  43. /* clear reset bit */
  44. if(0x9110100c == (uint64_t)reset_reg)
  45. {
  46. *reset_reg &= ~(1 << reset_bit);
  47. *reset_reg |= (1 << (reset_bit + 0x10)); /* write enable */
  48. }
  49. /* usleep(100); */
  50. rt_thread_delay(1);
  51. /* check done bit */
  52. if(*reset_reg & (1 << done_bit))
  53. return true;
  54. else
  55. return false;
  56. }
  57. static bool sysctl_reset_hw_done(volatile uint32_t *reset_reg, uint8_t reset_bit, uint8_t done_bit)
  58. {
  59. *reset_reg |= (1 << done_bit); /* clear done bit */
  60. /* usleep(100); */
  61. rt_thread_delay(1);
  62. *reset_reg |= (1 << reset_bit); /* set reset bit */
  63. /* usleep(100); */
  64. rt_thread_delay(1);
  65. /* check done bit */
  66. if(*reset_reg & (1 << done_bit))
  67. return true;
  68. else
  69. return false;
  70. }
  71. static bool sysctl_reset_sw_done(volatile uint32_t *reset_reg, uint8_t reset_bit, uint32_t reset_en)
  72. {
  73. if(0 == reset_en)
  74. {
  75. if((0x91101020 == (uint64_t)reset_reg) || (0x91101024 == (uint64_t)reset_reg) || (0x91101080 == (uint64_t)reset_reg) || (0x91101064 == (uint64_t)reset_reg))
  76. {
  77. *reset_reg &= ~(1 << reset_bit); /* set reset bit, 0 is assert */
  78. }
  79. else
  80. {
  81. *reset_reg |= (1 << reset_bit); /* set reset bit, 1 is assert */
  82. }
  83. }
  84. else
  85. {
  86. *reset_reg |= (1 << reset_bit) | (1 << reset_en); /* set reset bit */
  87. }
  88. /* usleep(100); */
  89. rt_thread_delay(1);
  90. if((0x91101004 != (uint64_t)reset_reg) && (0x9110100c != (uint64_t)reset_reg))
  91. {
  92. if(0x911010a8 == (uint64_t)reset_reg)
  93. {
  94. *reset_reg &= ~(1 << reset_bit); /* clear reset bit, 0 is clear */
  95. }
  96. else
  97. {
  98. *reset_reg |= (1 << reset_bit); /* clear reset bit, 1 is clear */
  99. }
  100. }
  101. /* usleep(100); */
  102. rt_thread_delay(1);
  103. return true;
  104. }
  105. bool sysctl_reset(sysctl_reset_e reset)
  106. {
  107. switch(reset)
  108. {
  109. case SYSCTL_RESET_CPU0_CORE:
  110. return sysctl_reset_cpu((volatile uint32_t *)&sysctl_rst->cpu0_rst_ctl, 0, 12);
  111. case SYSCTL_RESET_CPU1_CORE:
  112. return sysctl_reset_cpu((volatile uint32_t *)&sysctl_rst->cpu1_rst_ctl, 0, 12);
  113. case SYSCTL_RESET_AI:
  114. return sysctl_reset_hw_done((volatile uint32_t *)&sysctl_rst->ai_rst_ctl, 0, 31);
  115. case SYSCTL_RESET_VPU:
  116. return sysctl_reset_hw_done((volatile uint32_t *)&sysctl_rst->vpu_rst_ctl, 0, 31);
  117. case SYSCTL_RESET_HS:
  118. return sysctl_reset_hw_done((volatile uint32_t *)&sysctl_rst->hisys_rst_ctl, 0, 4);
  119. case SYSCTL_RESET_HS_AHB:
  120. return sysctl_reset_hw_done((volatile uint32_t *)&sysctl_rst->hisys_rst_ctl, 1, 5);
  121. case SYSCTL_RESET_SDIO0:
  122. return sysctl_reset_hw_done((volatile uint32_t *)&sysctl_rst->sdc_rst_ctl, 0, 28);
  123. case SYSCTL_RESET_SDIO1:
  124. return sysctl_reset_hw_done((volatile uint32_t *)&sysctl_rst->sdc_rst_ctl, 1, 29);
  125. case SYSCTL_RESET_SDIO_AXI:
  126. return sysctl_reset_hw_done((volatile uint32_t *)&sysctl_rst->sdc_rst_ctl, 2, 30);
  127. case SYSCTL_RESET_USB0:
  128. return sysctl_reset_hw_done((volatile uint32_t *)&sysctl_rst->usb_rst_ctl, 0, 28);
  129. case SYSCTL_RESET_USB1:
  130. return sysctl_reset_hw_done((volatile uint32_t *)&sysctl_rst->usb_rst_ctl, 1, 29);
  131. case SYSCTL_RESET_USB0_AHB:
  132. return sysctl_reset_hw_done((volatile uint32_t *)&sysctl_rst->usb_rst_ctl, 0, 30);
  133. case SYSCTL_RESET_USB1_AHB:
  134. return sysctl_reset_hw_done((volatile uint32_t *)&sysctl_rst->usb_rst_ctl, 1, 31);
  135. case SYSCTL_RESET_SPI0:
  136. return sysctl_reset_hw_done((volatile uint32_t *)&sysctl_rst->spi_rst_ctl, 0, 28);
  137. case SYSCTL_RESET_SPI1:
  138. return sysctl_reset_hw_done((volatile uint32_t *)&sysctl_rst->spi_rst_ctl, 1, 29);
  139. case SYSCTL_RESET_SPI2:
  140. return sysctl_reset_hw_done((volatile uint32_t *)&sysctl_rst->spi_rst_ctl, 2, 30);
  141. case SYSCTL_RESET_SEC:
  142. return sysctl_reset_hw_done((volatile uint32_t *)&sysctl_rst->sec_rst_ctl, 0, 31);
  143. case SYSCTL_RESET_PDMA:
  144. return sysctl_reset_hw_done((volatile uint32_t *)&sysctl_rst->dma_rst_ctl, 0, 28);
  145. case SYSCTL_RESET_SDMA:
  146. return sysctl_reset_hw_done((volatile uint32_t *)&sysctl_rst->dma_rst_ctl, 1, 29);
  147. case SYSCTL_RESET_DECOMPRESS:
  148. return sysctl_reset_hw_done((volatile uint32_t *)&sysctl_rst->decompress_rst_ctl, 0, 31);
  149. case SYSCTL_RESET_SRAM:
  150. return sysctl_reset_hw_done((volatile uint32_t *)&sysctl_rst->sram_rst_ctl, 0, 28);
  151. case SYSCTL_RESET_SHRM_AXIM:
  152. return sysctl_reset_hw_done((volatile uint32_t *)&sysctl_rst->sram_rst_ctl, 2, 30);
  153. case SYSCTL_RESET_SHRM_AXIS:
  154. return sysctl_reset_hw_done((volatile uint32_t *)&sysctl_rst->sram_rst_ctl, 3, 31);
  155. case SYSCTL_RESET_NONAI2D:
  156. return sysctl_reset_hw_done((volatile uint32_t *)&sysctl_rst->nonai2d_rst_ctl, 0, 31);
  157. case SYSCTL_RESET_MCTL:
  158. return sysctl_reset_hw_done((volatile uint32_t *)&sysctl_rst->mctl_rst_ctl, 0, 31);
  159. case SYSCTL_RESET_ISP:
  160. return sysctl_reset_hw_done((volatile uint32_t *)&sysctl_rst->isp_rst_ctl, 6, 29);
  161. case SYSCTL_RESET_ISP_DW:
  162. return sysctl_reset_hw_done((volatile uint32_t *)&sysctl_rst->isp_rst_ctl, 5, 28);
  163. case SYSCTL_RESET_DPU:
  164. return sysctl_reset_hw_done((volatile uint32_t *)&sysctl_rst->dpu_rst_ctl, 0, 31);
  165. case SYSCTL_RESET_DISP:
  166. return sysctl_reset_hw_done((volatile uint32_t *)&sysctl_rst->disp_rst_ctl, 0, 31);
  167. case SYSCTL_RESET_GPU:
  168. return sysctl_reset_hw_done((volatile uint32_t *)&sysctl_rst->v2p5d_rst_ctl, 0, 31);
  169. case SYSCTL_RESET_AUDIO:
  170. return sysctl_reset_hw_done((volatile uint32_t *)&sysctl_rst->audio_rst_ctl, 0, 31);
  171. case SYSCTL_RESET_TIMER0:
  172. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->soc_ctl_rst_ctl, 0, 0);
  173. case SYSCTL_RESET_TIMER1:
  174. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->soc_ctl_rst_ctl, 1, 0);
  175. case SYSCTL_RESET_TIMER2:
  176. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->soc_ctl_rst_ctl, 2, 0);
  177. case SYSCTL_RESET_TIMER3:
  178. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->soc_ctl_rst_ctl, 3, 0);
  179. case SYSCTL_RESET_TIMER4:
  180. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->soc_ctl_rst_ctl, 4, 0);
  181. case SYSCTL_RESET_TIMER5:
  182. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->soc_ctl_rst_ctl, 5, 0);
  183. case SYSCTL_RESET_TIMER_APB:
  184. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->soc_ctl_rst_ctl, 6, 0);
  185. case SYSCTL_RESET_HDI:
  186. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->soc_ctl_rst_ctl, 7, 0);
  187. case SYSCTL_RESET_WDT0:
  188. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->soc_ctl_rst_ctl, 12, 0);
  189. case SYSCTL_RESET_WDT1:
  190. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->soc_ctl_rst_ctl, 13, 0);
  191. case SYSCTL_RESET_WDT0_APB:
  192. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->soc_ctl_rst_ctl, 14, 0);
  193. case SYSCTL_RESET_WDT1_APB:
  194. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->soc_ctl_rst_ctl, 15, 0);
  195. case SYSCTL_RESET_TS_APB:
  196. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->soc_ctl_rst_ctl, 16, 0);
  197. case SYSCTL_RESET_MAILBOX:
  198. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->soc_ctl_rst_ctl, 17, 0);
  199. case SYSCTL_RESET_STC:
  200. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->soc_ctl_rst_ctl, 18, 0);
  201. case SYSCTL_RESET_PMU:
  202. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->soc_ctl_rst_ctl, 19, 0);
  203. case SYSCTL_RESET_LS_APB:
  204. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->losys_rst_ctl, 0, 0);
  205. case SYSCTL_RESET_UART0:
  206. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->losys_rst_ctl, 1, 0);
  207. case SYSCTL_RESET_UART1:
  208. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->losys_rst_ctl, 2, 0);
  209. case SYSCTL_RESET_UART2:
  210. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->losys_rst_ctl, 3, 0);
  211. case SYSCTL_RESET_UART3:
  212. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->losys_rst_ctl, 4, 0);
  213. case SYSCTL_RESET_UART4:
  214. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->losys_rst_ctl, 5, 0);
  215. case SYSCTL_RESET_I2C0:
  216. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->losys_rst_ctl, 6, 0);
  217. case SYSCTL_RESET_I2C1:
  218. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->losys_rst_ctl, 7, 0);
  219. case SYSCTL_RESET_I2C2:
  220. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->losys_rst_ctl, 8, 0);
  221. case SYSCTL_RESET_I2C3:
  222. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->losys_rst_ctl, 9, 0);
  223. case SYSCTL_RESET_I2C4:
  224. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->losys_rst_ctl, 10, 0);
  225. case SYSCTL_RESET_JAMLINK0_APB:
  226. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->losys_rst_ctl, 11, 0);
  227. case SYSCTL_RESET_JAMLINK1_APB:
  228. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->losys_rst_ctl, 12, 0);
  229. case SYSCTL_RESET_JAMLINK2_APB:
  230. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->losys_rst_ctl, 13, 0);
  231. case SYSCTL_RESET_JAMLINK3_APB:
  232. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->losys_rst_ctl, 14, 0);
  233. case SYSCTL_RESET_CODEC_APB:
  234. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->losys_rst_ctl, 17, 0);
  235. case SYSCTL_RESET_GPIO_DB:
  236. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->losys_rst_ctl, 18, 0);
  237. case SYSCTL_RESET_GPIO_APB:
  238. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->losys_rst_ctl, 19, 0);
  239. case SYSCTL_RESET_ADC:
  240. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->losys_rst_ctl, 20, 0);
  241. case SYSCTL_RESET_ADC_APB:
  242. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->losys_rst_ctl, 21, 0);
  243. case SYSCTL_RESET_PWM_APB:
  244. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->losys_rst_ctl, 22, 0);
  245. case SYSCTL_RESET_CPU0_FLUSH:
  246. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->cpu0_rst_ctl, 4, 20);
  247. case SYSCTL_RESET_CPU1_FLUSH:
  248. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->cpu1_rst_ctl, 4, 20);
  249. case SYSCTL_RESET_SHRM_APB:
  250. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->sram_rst_ctl, 1, 0);
  251. case SYSCTL_RESET_CSI0_APB:
  252. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->isp_rst_ctl, 0, 0);
  253. case SYSCTL_RESET_CSI1_APB:
  254. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->isp_rst_ctl, 1, 0);
  255. case SYSCTL_RESET_CSI2_APB:
  256. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->isp_rst_ctl, 2, 0);
  257. case SYSCTL_RESET_CSI_DPHY_APB:
  258. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->isp_rst_ctl, 3, 0);
  259. case SYSCTL_RESET_ISP_AHB:
  260. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->isp_rst_ctl, 4, 0);
  261. case SYSCTL_RESET_M0:
  262. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->isp_rst_ctl, 7, 0);
  263. case SYSCTL_RESET_M1:
  264. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->isp_rst_ctl, 8, 0);
  265. case SYSCTL_RESET_M2:
  266. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->isp_rst_ctl, 9, 0);
  267. case SYSCTL_RESET_SPI2AXI:
  268. return sysctl_reset_sw_done((volatile uint32_t *)&sysctl_rst->spi2axi_rst_ctl, 0, 0);
  269. default:
  270. return false;
  271. }
  272. }
  273. bool sysctl_set_reset_time(sysctl_reset_time_e reset, uint32_t tim0, uint32_t tim1, uint32_t tim2)
  274. {
  275. volatile uint32_t ret;
  276. switch(reset)
  277. {
  278. case SYSCTL_RESET_TIME_CPU0:
  279. {
  280. if((tim1 > 0xF) || (tim2 > 0xF))
  281. {
  282. return false;
  283. }
  284. else
  285. {
  286. ret = sysctl_rst->cpu0_rst_tim;
  287. ret &= 0xf0000fff;
  288. sysctl_rst->cpu0_rst_tim = ret | ((tim1 << 12) | (tim2 << 20));
  289. return true;
  290. }
  291. }
  292. case SYSCTL_RESET_TIME_CPU0_APB:
  293. {
  294. if((tim1 > 0xF) || (tim2 > 0xF))
  295. {
  296. return false;
  297. }
  298. else
  299. {
  300. ret = sysctl_rst->cpu0_rst_tim;
  301. ret &= 0xfffff00f;
  302. sysctl_rst->cpu0_rst_tim = ret | ((tim1 << 4) | (tim2 << 8));
  303. return true;
  304. }
  305. }
  306. case SYSCTL_RESET_TIME_CPU1:
  307. {
  308. if((tim1 > 0xF) || (tim2 > 0xF))
  309. {
  310. return false;
  311. }
  312. else
  313. {
  314. ret = sysctl_rst->cpu1_rst_tim;
  315. ret &= 0xfff00fff;
  316. sysctl_rst->cpu1_rst_tim = ret | ((tim1 << 12) | (tim2 << 16));
  317. return true;
  318. }
  319. }
  320. case SYSCTL_RESET_TIME_CPU1_APB:
  321. {
  322. if((tim1 > 0xF) || (tim2 > 0xF))
  323. {
  324. return false;
  325. }
  326. else
  327. {
  328. ret = sysctl_rst->cpu1_rst_tim;
  329. ret &= 0xfffff00f;
  330. sysctl_rst->cpu1_rst_tim = ret | ((tim1 << 4) | (tim2 << 8));
  331. return true;
  332. }
  333. }
  334. case SYSCTL_RESET_TIME_AI:
  335. {
  336. if((tim1 > 0xF) || (tim2 > 0xF))
  337. {
  338. return false;
  339. }
  340. else
  341. {
  342. ret = sysctl_rst->ai_rst_tim;
  343. ret &= 0xfffff00f;
  344. sysctl_rst->ai_rst_tim = ret | ((tim1 << 4) | (tim2 << 8));
  345. return true;
  346. }
  347. }
  348. case SYSCTL_RESET_TIME_VPU:
  349. {
  350. if((tim1 > 0xF) || (tim2 > 0xF))
  351. {
  352. return false;
  353. }
  354. else
  355. {
  356. ret = sysctl_rst->vpu_rst_tim;
  357. ret &= 0xfffff00f;
  358. sysctl_rst->vpu_rst_tim = ret | ((tim1 << 4) | (tim2 << 8));
  359. return true;
  360. }
  361. }
  362. case SYSCTL_RESET_TIME_HS_HCLK:
  363. {
  364. if((tim1 > 0x1F) || (tim2 > 0xF))
  365. {
  366. return false;
  367. }
  368. else
  369. {
  370. ret = sysctl_rst->hisys_hclk_tim;
  371. ret &= 0xfff0f0ff;
  372. sysctl_rst->hisys_hclk_tim = ret | ((tim1 << 8) | (tim2 << 16));
  373. return true;
  374. }
  375. }
  376. case SYSCTL_RESET_TIME_SDCTL:
  377. {
  378. if((tim1 > 0x1F) || (tim2 > 0xF))
  379. {
  380. return false;
  381. }
  382. else
  383. {
  384. ret = sysctl_rst->sdctl_rst_tim;
  385. ret &= 0xfff0f0ff;
  386. sysctl_rst->sdctl_rst_tim = ret | ((tim1 << 8) | (tim2 << 16));
  387. return true;
  388. }
  389. }
  390. case SYSCTL_RESET_TIME_USB:
  391. {
  392. if((tim1 > 0xF) || (tim2 > 0xF))
  393. {
  394. return false;
  395. }
  396. else
  397. {
  398. ret = sysctl_rst->usb_rst_tim;
  399. ret &= 0xffffff00;
  400. sysctl_rst->usb_rst_tim = ret | ((tim1 << 0) | (tim2 << 4));
  401. return true;
  402. }
  403. }
  404. case SYSCTL_RESET_TIME_USB_AHB:
  405. {
  406. if((tim1 > 0xF) || (tim2 > 0xF))
  407. {
  408. return false;
  409. }
  410. else
  411. {
  412. ret = sysctl_rst->usb_rst_tim;
  413. ret &= 0xff0000ff;
  414. sysctl_rst->usb_rst_tim = ret | ((tim1 << 8) | (tim2 << 16));
  415. return true;
  416. }
  417. }
  418. case SYSCTL_RESET_TIME_SPI:
  419. {
  420. if((tim1 > 0x3F) || (tim2 > 0xF))
  421. {
  422. return false;
  423. }
  424. else
  425. {
  426. ret = sysctl_rst->spi_rst_tim;
  427. ret &= 0xfff0f0ff;
  428. sysctl_rst->spi_rst_tim = ret | ((tim1 << 8) | (tim2 << 16));
  429. return true;
  430. }
  431. }
  432. case SYSCTL_RESET_TIME_SEC_SYS:
  433. {
  434. if((tim1 > 0xFF) || (tim2 > 0xF))
  435. {
  436. return false;
  437. }
  438. else
  439. {
  440. ret = sysctl_rst->sec_sys_rst_tim;
  441. ret &= 0xfff0f0ff;
  442. sysctl_rst->sec_sys_rst_tim = ret | ((tim1 << 8) | (tim2 << 16));
  443. return true;
  444. }
  445. }
  446. case SYSCTL_RESET_TIME_DMAC:
  447. {
  448. if((tim1 > 0x7) || (tim2 > 0x7))
  449. {
  450. return false;
  451. }
  452. else
  453. {
  454. ret = sysctl_rst->dmac_rst_tim;
  455. ret &= 0xfff0f0ff;
  456. sysctl_rst->dmac_rst_tim = ret | ((tim1 << 8) | (tim2 << 16));
  457. return true;
  458. }
  459. }
  460. case SYSCTL_RESET_TIME_DECOMPRESS:
  461. {
  462. if((tim1 > 0x7) || (tim2 > 0x7))
  463. {
  464. return false;
  465. }
  466. else
  467. {
  468. ret = sysctl_rst->decompress_rst_tim;
  469. ret &= 0xfff0f0ff;
  470. sysctl_rst->decompress_rst_tim = ret | ((tim1 << 8) | (tim2 << 16));
  471. return true;
  472. }
  473. }
  474. case SYSCTL_RESET_TIME_SRAM:
  475. {
  476. if((tim1 > 0xF) || (tim2 > 0xF))
  477. {
  478. return false;
  479. }
  480. else
  481. {
  482. ret = sysctl_rst->sram_rst_tim;
  483. ret &= 0xfff0f0ff;
  484. sysctl_rst->sram_rst_tim = ret | ((tim1 << 8) | (tim2 << 16));
  485. return true;
  486. }
  487. }
  488. case SYSCTL_RESET_TIME_NONAI2D:
  489. {
  490. if((tim1 > 0xF) || (tim2 > 0xF))
  491. {
  492. return false;
  493. }
  494. else
  495. {
  496. ret = sysctl_rst->nonai2d_rst_tim;
  497. ret &= 0xfff0f0ff;
  498. sysctl_rst->nonai2d_rst_tim = ret | ((tim1 << 8) | (tim2 << 16));
  499. return true;
  500. }
  501. }
  502. case SYSCTL_RESET_TIME_MCTL:
  503. {
  504. if(tim0 > 0xF)
  505. {
  506. return false;
  507. }
  508. else
  509. {
  510. ret = sysctl_rst->mctl_rst_tim;
  511. ret &= 0xffffffc0;
  512. sysctl_rst->mctl_rst_tim = ret | (tim0 << 0);
  513. return true;
  514. }
  515. }
  516. case SYSCTL_RESET_TIME_ISP:
  517. {
  518. if((tim0 > 0xFF) || (tim1 > 0xF) || (tim2 > 0xF))
  519. {
  520. return false;
  521. }
  522. else
  523. {
  524. ret = sysctl_rst->isp_rst_tim;
  525. ret &= 0xfff0f0f0;
  526. sysctl_rst->isp_rst_tim = ret | ((tim0 << 0) | (tim1 << 8) | (tim2 << 16));
  527. return true;
  528. }
  529. }
  530. case SYSCTL_RESET_TIME_ISP_DW:
  531. {
  532. if((tim0 > 0xFF) || (tim1 > 0xF) || (tim2 > 0xF))
  533. {
  534. return false;
  535. }
  536. else
  537. {
  538. ret = sysctl_rst->isp_dw_rst_tim;
  539. ret &= 0xfff0f0f0;
  540. sysctl_rst->isp_dw_rst_tim = ret | ((tim0 << 0) | (tim1 << 8) | (tim2 << 16));
  541. return true;
  542. }
  543. }
  544. case SYSCTL_RESET_TIME_DPU:
  545. {
  546. if((tim1 > 0xF) || (tim2 > 0xF))
  547. {
  548. return false;
  549. }
  550. else
  551. {
  552. ret = sysctl_rst->dpu_rst_tim;
  553. ret &= 0xfff0f0ff;
  554. sysctl_rst->dpu_rst_tim = ret | ((tim1 << 8) | (tim2 << 16));
  555. return true;
  556. }
  557. }
  558. case SYSCTL_RESET_TIME_DISP_SYS:
  559. {
  560. if((tim0 > 0xFF) || (tim1 > 0xFF) || (tim2 > 0xF))
  561. {
  562. return false;
  563. }
  564. else
  565. {
  566. ret = sysctl_rst->disp_sys_rst_tim;
  567. ret &= 0xfff0f0f0;
  568. sysctl_rst->disp_sys_rst_tim = ret | ((tim0 << 0) | (tim1 << 8) | (tim2 << 16));
  569. return true;
  570. }
  571. }
  572. case SYSCTL_RESET_TIME_V2P5D_SYS:
  573. {
  574. if((tim0 > 0xFF) || (tim1 > 0xFF) || (tim2 > 0xF))
  575. {
  576. return false;
  577. }
  578. else
  579. {
  580. ret = sysctl_rst->v2p5d_sys_rst_tim;
  581. ret &= 0xfff0f0f0;
  582. sysctl_rst->v2p5d_sys_rst_tim = ret | ((tim0 << 0) | (tim1 << 8) | (tim2 << 16));
  583. return true;
  584. }
  585. }
  586. case SYSCTL_RESET_TIME_AUDIO:
  587. {
  588. if((tim1 > 0xF) || (tim2 > 0xF))
  589. {
  590. return false;
  591. }
  592. else
  593. {
  594. ret = sysctl_rst->audio_rst_tim;
  595. ret &= 0xfffff00f;
  596. sysctl_rst->audio_rst_tim = ret | ((tim1 << 4) | (tim2 << 8));
  597. return true;
  598. }
  599. }
  600. default:
  601. return false;
  602. }
  603. }
  604. int rt_hw_sysctl_rst_init(void)
  605. {
  606. sysctl_rst = rt_ioremap((void*)RMU_BASE_ADDR, RMU_IO_SIZE);
  607. if(!sysctl_rst)
  608. {
  609. rt_kprintf("sysctl_rst ioremap error\n");
  610. return -1;
  611. }
  612. return 0;
  613. }
  614. INIT_BOARD_EXPORT(rt_hw_sysctl_rst_init);