soc.c 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. /*
  2. * Copyright (c) 2016 Open-RnD Sp. z o.o.
  3. * Copyright (c) 2016 Linaro Limited.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0
  6. */
  7. /**
  8. * @file
  9. * @brief System/hardware module for ATJ215X processor
  10. */
  11. #include <device.h>
  12. #include <init.h>
  13. #include <arch/cpu.h>
  14. #include "soc.h"
  15. #include "soc_atp.h"
  16. #include <linker/linker-defs.h>
  17. //#include <arch/arm/aarch32/cortex_m/cmsis.h>
  18. static void jtag_config(unsigned int group_id)
  19. {
  20. printk("jtag switch to group=%d\n", group_id);
  21. if (group_id < 3)
  22. sys_write32((sys_read32(JTAG_CTL) & ~(3 << 0)) | (group_id << 0) | (1 << 4), JTAG_CTL);
  23. }
  24. void jtag_set(void)
  25. {
  26. jtag_config(0);
  27. }
  28. /**
  29. * \brief clear watchdog
  30. */
  31. void soc_watchdog_clear(void)
  32. {
  33. sys_set_bit(WD_CTL, 0);
  34. }
  35. static void wd_check_wdreset_cnt(void)
  36. {
  37. uint32_t reset_cnt;
  38. soc_watchdog_clear();
  39. soc_pstore_get(SOC_PSTORE_TAG_WD_RESET_CNT, &reset_cnt);
  40. printk("wd cnt=%d, WD_CTL=0x%x\n", reset_cnt, sys_read32(WD_CTL));
  41. if(reset_cnt > 10){
  42. printk("reboot ota\n");
  43. soc_pstore_set(SOC_PSTORE_TAG_WD_RESET_CNT, 0);
  44. sys_pm_reboot(REBOOT_TYPE_GOTO_OTA);
  45. }else{
  46. reset_cnt++;
  47. soc_pstore_set(SOC_PSTORE_TAG_WD_RESET_CNT, reset_cnt);
  48. }
  49. }
  50. /**
  51. * \brief if boot to main clear wd reset cnt
  52. */
  53. void wd_clear_wdreset_cnt(void)
  54. {
  55. soc_pstore_set(SOC_PSTORE_TAG_WD_RESET_CNT, 0);
  56. }
  57. __sleepfunc int soc_dvfs_opt(void)
  58. {
  59. return (sys_read32(UID1) >> 17) & 0x7;
  60. }
  61. uint8_t ipmsg_btc_get_ic_pkt(void)
  62. {
  63. uint32_t val;
  64. val = sys_read32(UID1);
  65. return (uint8_t)((val >> 24) & 0xF); /* bit24~27: IC Package */
  66. }
  67. #if 0
  68. static void cpu_init(void)
  69. {
  70. int i;
  71. unsigned int val;
  72. printk("rc192 cal\n");
  73. sys_write32(0x80011481, RC192M_CTL);
  74. soc_udelay(20);
  75. sys_write32(0x8001148d, RC192M_CTL);
  76. soc_udelay(200);
  77. while(1){
  78. if(sys_read32(RC192M_CTL)& (1<<24)){
  79. for(i = 0; i < 3; i++){ // 3 cal done is ok
  80. soc_udelay(20);
  81. if(!(sys_read32(RC192M_CTL)& (1<<24)))
  82. break;
  83. }
  84. if(i == 3)
  85. break;
  86. }
  87. }
  88. val = (sys_read32(RC192M_CTL) & (0x7f<<25)) >> 25;
  89. if(val)
  90. val -= 1;
  91. sys_write32(0x80011001 | (val<<4) , RC192M_CTL);
  92. soc_udelay(200);
  93. sys_write32(0x215, CMU_SYSCLK);// CPU rcM256/2 =128, ahb div 1
  94. }
  95. #endif
  96. __sleepfunc static void leopard_set_hosc_ctrl()
  97. {
  98. /*
  99. IO_WRITE(HOSC_CTL, (0x601f1b6 | (CAP<<17)));
  100. 如果是首次配置(HOSC_CTL[25]: 0->1)需要将CPUCLK切换到RC4M,等待HOSC_CTL[28]为1后再将CPUCLK切回HOSC/COREPLL
  101. */
  102. uint32_t val;
  103. /* switch cpuclk src to 4MRC */
  104. val = sys_read32(CMU_SYSCLK);
  105. sys_write32(val & ~0x7, CMU_SYSCLK);
  106. /* update HOSC_CTL & wait HOSC_READY */
  107. sys_write32(0x600f7f6 | (sys_read32(HOSC_CTL) & HOSC_CTL_HOSC_CAP_MASK), HOSC_CTL);
  108. while(!(sys_read32(HOSC_CTL) & (1<< HOSC_CTL_HOSC_READY)));
  109. /* backup cpuclk src to COREPLL */
  110. sys_write32(val, CMU_SYSCLK);
  111. }
  112. /**
  113. * @brief Perform basic hardware initialization at boot.
  114. *
  115. * This needs to be run from the very beginning.
  116. * So the init priority has to be 0 (zero).
  117. *
  118. * @return 0
  119. */
  120. static int leopard_init(const struct device *arg)
  121. {
  122. uint32_t key;
  123. uint32_t val;
  124. ARG_UNUSED(arg);
  125. soc_udelay(50);
  126. leopard_set_hosc_ctrl();
  127. soc_udelay(10);
  128. key = irq_lock();
  129. /* Install default handler that simply resets the CPU
  130. * if configured in the kernel, NOP otherwise
  131. */
  132. NMI_INIT();
  133. irq_unlock(key);
  134. soc_powergate_init();
  135. sys_write32(0x10e, CMU_GPUCLK);//COREPLL/1.5
  136. acts_clock_peripheral_enable(CLOCK_ID_GPU); //for the gpu reset, because the gpu is in an unstable state
  137. soc_udelay(1);
  138. acts_reset_peripheral_deassert(RESET_ID_GPU);
  139. soc_udelay(1);
  140. acts_reset_peripheral_assert(RESET_ID_GPU);//
  141. soc_udelay(2);
  142. acts_clock_peripheral_disable(CLOCK_ID_GPU);//
  143. /* disable gpu power gating */
  144. //sys_write32(sys_read32(PWRGATE_DIG) & ~(0x1 << 25), PWRGATE_DIG);
  145. if(soc_powergate_is_poweron(POWERGATE_GPU_PG_DEV))
  146. soc_powergate_set(POWERGATE_GPU_PG_DEV, false);
  147. //cpu_init();
  148. wd_check_wdreset_cnt();
  149. /* Update CMSIS SystemCoreClock variable (HCLK) */
  150. /* At reset, system core clock is set to 16 MHz from HSI */
  151. //SystemCoreClock = 16000000;
  152. //while(!arg);
  153. //sys_write32(0x0, WIO0_CTL); //default set wio0 to gpio func
  154. /*for lowpower*/
  155. //sys_write32(0x30F, SPI1_CLKGATING);
  156. /* init ppi */
  157. ppi_init();
  158. /* Initialize SDMA */
  159. acts_reset_peripheral_assert(RESET_ID_SDMA);
  160. acts_clock_peripheral_enable(CLOCK_ID_SDMA);
  161. acts_reset_peripheral_deassert(RESET_ID_SDMA);
  162. /* Enable SDMA, DE access SPI0 NOR and SPI1 PSRAM, and GPU accessing SPI1 PSRAM */
  163. //sys_write32(sys_read32(SPICACHE_CTL) | BIT(10) | BIT(11), SPICACHE_CTL);
  164. sys_write32((sys_read32(SPICACHE_CTL) & ~(0x3 << 5)) | (0x1 << 5) | BIT(10) | BIT(11), SPICACHE_CTL);
  165. if (soc_dvfs_opt()) {
  166. sys_write32((sys_read32(SPI1_DELAYCHAIN) & ~(0x3f << 8)) \
  167. | (SPI1_DELAYCHAIN_CLKOUT << 8), SPI1_DELAYCHAIN);
  168. sys_write32(sys_read32(SPI1_CACHE_CTL) | BIT(8) | BIT(10) | BIT(11) | BIT(14) | BIT(15), SPI1_CACHE_CTL);
  169. } else {
  170. sys_write32(sys_read32(SPI1_CACHE_CTL) | BIT(8) | BIT(10) | BIT(11) | BIT(14) /*| BIT(15)*/, SPI1_CACHE_CTL);
  171. }
  172. sys_write32(BIT(24) | (0<<4) | (0xa<<8) | (0x1<<0), SPI1_GPU_CTL);
  173. /* Share RAM clock, select HOSC(32MHZ)*/
  174. val = sys_read32(CMU_MEMCLKSRC0);
  175. val = (val & ~(7 << 25)) | (1 << 25);
  176. sys_write32(val, CMU_MEMCLKSRC0);
  177. val = sys_read32(CMU_MEMCLKEN0);
  178. val |= (1 << 25);
  179. sys_write32(val, CMU_MEMCLKEN0);
  180. val = 0;
  181. if(soc_atp_get_pmu_calib(12, &val)){
  182. printk("get psram pg fail\n");
  183. }else{
  184. printk("psram=%d, 0x%x\n", val, sys_read32(VOUT_CTL0));
  185. if(val){
  186. sys_clear_bit(VOUT_CTL0, 31);
  187. printk("VOUT0= 0x%x\n", sys_read32(VOUT_CTL0) );
  188. }
  189. }
  190. printk("apm=%d\n", soc_psram_is_apm());
  191. //val = sys_read32(VOUT_CTL1_S1M) ;
  192. //val = (val & ~(0xFff)) | 0xedd; // vdd set 1.2
  193. //sys_write32(val, VOUT_CTL1_S1M);
  194. //sys_write32(0x12, CMU_SYSCLK);// cpu 200
  195. return 0;
  196. }
  197. SYS_INIT(leopard_init, PRE_KERNEL_1, 0);
  198. /*if CONFIG_WDOG_ACTS enable , wd driver call wd_clear_wdreset_cnt */
  199. #ifndef CONFIG_WDOG_ACTS
  200. /**
  201. * @brief Perform basic hardware initialization at boot.
  202. *
  203. * before boot to main clear wd reset cnt
  204. * @return 0
  205. */
  206. static int wd_reset_cnt_init(const struct device *arg)
  207. {
  208. wd_clear_wdreset_cnt();
  209. sys_write32(0, WD_CTL); /*disable watch dog*/
  210. return 0;
  211. }
  212. SYS_INIT(wd_reset_cnt_init, APPLICATION, 91);
  213. #endif