wdt_v2.c 28 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141
  1. /* Copyright Statement:
  2. *
  3. * This software/firmware and related documentation ("MediaTek Software") are
  4. * protected under relevant copyright laws. The information contained herein is
  5. * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
  6. * the prior written permission of MediaTek inc. and/or its licensors, any
  7. * reproduction, modification, use or disclosure of MediaTek Software, and
  8. * information contained herein, in whole or in part, shall be strictly
  9. * prohibited.
  10. *
  11. * MediaTek Inc. (C) 2010. All rights reserved.
  12. *
  13. * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  14. * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  15. * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
  16. * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
  17. * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
  18. * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
  19. * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
  20. * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
  21. * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
  22. * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
  23. * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
  24. * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
  25. * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
  26. * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
  27. * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
  28. * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
  29. * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
  30. * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
  31. * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
  32. *
  33. * The following software/firmware and/or related documentation ("MediaTek
  34. * Software") have been modified by MediaTek Inc. All revisions are subject to
  35. * any receiver's applicable license agreements with MediaTek Inc.
  36. */
  37. /* Use PMIC common API for PMIC full reset detection */
  38. #define CFG_APWDT_PMIC_FULL_RST_COMMON_API 1
  39. /* Timestamp for WDT */
  40. #define CFG_APWDT_DBG_TIMESTAMP 0
  41. #include "typedefs.h"
  42. #include "platform.h"
  43. #include "wdt.h"
  44. #include "dramc_common.h"
  45. #include "dramc_register.h"
  46. #include "dramc_pi_api.h"
  47. #include "emi_hw.h"
  48. #include "pmic.h"
  49. #include "pal_log.h"
  50. #include "dconfig_env.h"
  51. #if !CFG_APWDT_PMIC_FULL_RST_COMMON_API
  52. #include "upmu_hw.h"
  53. #endif
  54. #define RGUTAG "[RGU] "
  55. #define RGULOG(fmt, arg...) pal_log_info(RGUTAG fmt, ##arg)
  56. #define RGULOG_NO_MODULE_NAME(fmt, arg...) pal_log_info(fmt, ##arg)
  57. #define WDT_TIMEOUT_DEFAULT_VAL (10)
  58. unsigned int g_rgu_status = RE_BOOT_REASON_UNKNOW;
  59. #if defined(CFG_APWDT) && (CFG_APWDT == V2)
  60. static unsigned int timeout;
  61. static unsigned int rgu_mode;
  62. static int g_rgu_inited = 0;
  63. static char *g_doe_apwdt_en = NULL;
  64. #if CONFIG_WDT_DBG_TIMESTAMP
  65. #include "timer.h"
  66. static ulong time;
  67. #endif
  68. static void mtk_wdt_check_last_stage(void)
  69. {
  70. unsigned int reg;
  71. unsigned int last_stage;
  72. /* check reboot source */
  73. reg = DRV_Reg32(MTK_WDT_NONRST_REG2);
  74. RGULOG("rst from: ");
  75. last_stage = (reg >> MTK_WDT_NONRST2_STAGE_OFS) & RGU_STAGE_MASK;
  76. if (last_stage == RGU_STAGE_PRELOADER)
  77. RGULOG_NO_MODULE_NAME("pl\n");
  78. else if (last_stage == RGU_STAGE_LK)
  79. RGULOG_NO_MODULE_NAME("lk\n");
  80. else if (last_stage == RGU_STAGE_KERNEL)
  81. RGULOG_NO_MODULE_NAME("kernel\n");
  82. else
  83. RGULOG_NO_MODULE_NAME("?\n");
  84. reg = (reg & ~(RGU_STAGE_MASK << MTK_WDT_NONRST2_LAST_STAGE_OFS)) |
  85. (last_stage << MTK_WDT_NONRST2_LAST_STAGE_OFS);
  86. DRV_WriteReg32(MTK_WDT_NONRST_REG2, reg);
  87. }
  88. static void mtk_wdt_mark_stage(unsigned int stage)
  89. {
  90. unsigned int reg = DRV_Reg32(MTK_WDT_NONRST_REG2);
  91. reg = (reg & ~(RGU_STAGE_MASK << MTK_WDT_NONRST2_STAGE_OFS))
  92. | (stage << MTK_WDT_NONRST2_STAGE_OFS);
  93. DRV_WriteReg32(MTK_WDT_NONRST_REG2, reg);
  94. }
  95. static void mtk_wdt_reset_deglitch_enable(void)
  96. {
  97. DRV_WriteReg32(MTK_WDT_RSTDEG_EN1, MTK_WDT_RSTDEG_EN1_KEY);
  98. DRV_WriteReg32(MTK_WDT_RSTDEG_EN2, MTK_WDT_RSTDEG_EN2_KEY |
  99. (MTK_WDT_RSTDEG_CLOCK_32K << MTK_WDT_RSTDEG_CLOCK_SELETC_SHIFT) |
  100. (MTK_WDT_RSTDEG_LATENCY_230NS_183US << MTK_WDT_RSTDEG_LATENCY_SHIFT));
  101. RGULOG("%s: MTK_WDT_RSTDEG_EN1(%x), MTK_WDT_RSTDEG_EN2(%x)\n", __func__,
  102. READ_REG(MTK_WDT_RSTDEG_EN1), READ_REG(MTK_WDT_RSTDEG_EN2));
  103. }
  104. void mtk_wdt_disable(void)
  105. {
  106. u32 tmp;
  107. tmp = DRV_Reg32(MTK_WDT_MODE);
  108. tmp &= ~MTK_WDT_MODE_ENABLE; /* disable watchdog */
  109. tmp |= (MTK_WDT_MODE_KEY); /* need key then write is allowed */
  110. DRV_WriteReg32(MTK_WDT_MODE, tmp);
  111. }
  112. void mtk_wdt_enable(void)
  113. {
  114. u32 tmp;
  115. tmp = DRV_Reg32(MTK_WDT_MODE);
  116. tmp |= MTK_WDT_MODE_ENABLE; /* enable watchdog */
  117. tmp |= (MTK_WDT_MODE_KEY); /* need key then write is allowed */
  118. DRV_WriteReg32(MTK_WDT_MODE, tmp);
  119. }
  120. static void mtk_wdt_reset(char mode)
  121. {
  122. /* Watchdog Rest */
  123. unsigned int wdt_mode_val;
  124. DRV_WriteReg32(MTK_WDT_RESTART, MTK_WDT_RESTART_KEY);
  125. /*set latch register to 0 before sw reset*/
  126. /* DRV_WriteReg32(MTK_WDT_LATCH_CTL, (MTK_WDT_LENGTH_CTL_KEY | 0x0)); */
  127. wdt_mode_val = DRV_Reg32(MTK_WDT_MODE);
  128. /* clear autorestart bit: autoretart: 1, bypass power key, 0: not bypass power key */
  129. #if CFG_USB_AUTO_DETECT
  130. wdt_mode_val &= (~MTK_WDT_MODE_AUTO_RESTART);
  131. #endif
  132. /* make sure WDT mode is hw reboot mode, can not config isr mode */
  133. wdt_mode_val &= (~(MTK_WDT_MODE_IRQ|MTK_WDT_MODE_DUAL_MODE));
  134. if (mode) { /* mode != 0 means by pass power key reboot, We using auto_restart bit as by pass power key flag */
  135. wdt_mode_val = wdt_mode_val | (MTK_WDT_MODE_KEY|MTK_WDT_MODE_EXTEN|MTK_WDT_MODE_AUTO_RESTART);
  136. DRV_WriteReg32(MTK_WDT_MODE, wdt_mode_val);
  137. } else{
  138. wdt_mode_val = wdt_mode_val | (MTK_WDT_MODE_KEY|MTK_WDT_MODE_EXTEN);
  139. DRV_WriteReg32(MTK_WDT_MODE, wdt_mode_val);
  140. }
  141. RGULOG("mtk_wdt_reset WDT MODE=%x\n", DRV_Reg32(MTK_WDT_MODE));
  142. gpt_busy_wait_us(100);
  143. DRV_WriteReg32(MTK_WDT_SWRST, MTK_WDT_SWRST_KEY);
  144. }
  145. static unsigned int mtk_wdt_get_status(void)
  146. {
  147. static unsigned int wdt_sta = 0;
  148. static unsigned int wdt_sta_handled = 0;
  149. unsigned int reg;
  150. /*
  151. * Note:
  152. * Because WDT_STA register will be cleared after writing WDT_MODE,
  153. * we use a static variable to keep orinigal WDT_STA.
  154. *
  155. * After reset, static varialbe will always be clear to 0,
  156. * so only read WDT_STA when static variable is 0 is OK
  157. *
  158. * Use "wdt_sta_handled" to indicate if WDT_STATUS is preserved.
  159. * Do not use "wdt_sta" as indication because dummy handling will be
  160. * executed in case WDT_STATUS is 0 originally.
  161. */
  162. if (wdt_sta_handled == 0) {
  163. wdt_sta = DRV_Reg32(MTK_WDT_STATUS);
  164. wdt_sta_handled = 1;
  165. /* Check if any special flag is in non-reset register */
  166. reg = DRV_Reg32(MTK_WDT_NONRST_REG2);
  167. /* Check SSPM reset flag */
  168. if (reg & MTK_WDT_NONRST2_SSPM_RESET) {
  169. RGULOG("NONRST_REG2: SSPM reset flag found, 0x%x\n", reg);
  170. wdt_sta = wdt_sta | MTK_WDT_STATUS_SSPM_RST;
  171. /* clear deliberate SW reset flag */
  172. reg = reg & ~(MTK_WDT_NONRST2_SSPM_RESET);
  173. DRV_WriteReg32(MTK_WDT_NONRST_REG2, reg);
  174. }
  175. }
  176. return wdt_sta;
  177. }
  178. static unsigned int mtk_wdt_get_debug_ctl(void)
  179. {
  180. static unsigned int wdt_debug_ctl = 0;
  181. /*
  182. * Note:
  183. * Because some bits in register DEBUG_CTL will be cleared after
  184. * writing WDT_MODE, we use a static variable to keep original DEBUG_CTL.
  185. *
  186. * Effected Bits:
  187. * 16: ddr_reserve_success
  188. * 18: emi_dcs_success
  189. * 20: dvfsrc_success
  190. */
  191. if (wdt_debug_ctl == 0)
  192. wdt_debug_ctl = DRV_Reg32(MTK_WDT_DEBUG_CTL);
  193. return wdt_debug_ctl;
  194. }
  195. void mtk_wdt_keep_essential_info(void)
  196. {
  197. mtk_wdt_get_status();
  198. mtk_wdt_get_debug_ctl();
  199. }
  200. int mtk_wdt_boot_check(void);
  201. static void mtk_wdt_check_trig_reboot_reason(void)
  202. {
  203. int ret;
  204. /* check bypass power key info */
  205. ret = mtk_wdt_boot_check();
  206. /* 3. By pass power key info */
  207. RGULOG("bypass pwrkey: ");
  208. if (ret == WDT_BY_PASS_PWK_REBOOT)
  209. RGULOG_NO_MODULE_NAME("set\n");
  210. else if (ret == WDT_NORMAL_REBOOT)
  211. RGULOG_NO_MODULE_NAME("NOT set\n");
  212. else
  213. RGULOG_NO_MODULE_NAME("wdt does not trigger rst\n");
  214. }
  215. static void mtk_wdt_mode_config(BOOL dual_mode_en,
  216. BOOL irq,
  217. BOOL ext_en,
  218. BOOL ext_pol,
  219. BOOL wdt_en)
  220. {
  221. unsigned int tmp;
  222. /* RGULOG(" mtk_wdt_mode_config mode value=%x\n",DRV_Reg32(MTK_WDT_MODE)); */
  223. tmp = DRV_Reg32(MTK_WDT_MODE);
  224. tmp |= MTK_WDT_MODE_KEY;
  225. /* Bit 0 : Whether enable watchdog or not */
  226. if (wdt_en == TRUE)
  227. tmp |= MTK_WDT_MODE_ENABLE;
  228. else
  229. tmp &= ~MTK_WDT_MODE_ENABLE;
  230. /* Bit 1 : Configure extern reset signal polarity. */
  231. if (ext_pol == TRUE)
  232. tmp |= MTK_WDT_MODE_EXT_POL;
  233. else
  234. tmp &= ~MTK_WDT_MODE_EXT_POL;
  235. /* Bit 2 : Whether enable external reset signal */
  236. if (ext_en == TRUE)
  237. tmp |= MTK_WDT_MODE_EXTEN;
  238. else
  239. tmp &= ~MTK_WDT_MODE_EXTEN;
  240. /* Bit 3 : Whether generating interrupt instead of reset signal */
  241. if (irq == TRUE)
  242. tmp |= MTK_WDT_MODE_IRQ;
  243. else
  244. tmp &= ~MTK_WDT_MODE_IRQ;
  245. /* Bit 6 : Whether enable debug module reset */
  246. if (dual_mode_en == TRUE)
  247. tmp |= MTK_WDT_MODE_DUAL_MODE;
  248. else
  249. tmp &= ~MTK_WDT_MODE_DUAL_MODE;
  250. /* Bit 4: WDT_Auto_restart, this is a reserved bit, we use it as bypass powerkey flag. */
  251. /* Because HW reboot always need reboot to kernel, we set it always. */
  252. tmp |= MTK_WDT_MODE_AUTO_RESTART;
  253. DRV_WriteReg32(MTK_WDT_MODE, tmp);
  254. /* dual_mode(1); //always dual mode */
  255. /* mdelay(100); */
  256. RGULOG("mtk_wdt_mode_config mode value=%x, tmp:%x\n", DRV_Reg32(MTK_WDT_MODE), tmp);
  257. }
  258. /* EXPORT_SYMBOL(mtk_wdt_mode_config); */
  259. static void mtk_wdt_set_time_out_value(UINT32 value)
  260. {
  261. /*
  262. * TimeOut = BitField 15:5
  263. * Key = BitField 4:0 = 0x08
  264. */
  265. /* sec * 32768 / 512 = sec * 64 = sec * 1 << 6 */
  266. timeout = (unsigned int)(value * (1 << 6));
  267. timeout = timeout << 5;
  268. DRV_WriteReg32(MTK_WDT_LENGTH, (timeout | MTK_WDT_LENGTH_KEY));
  269. }
  270. void mtk_wdt_timestamp_init(void)
  271. {
  272. #if CONFIG_WDT_DBG_TIMESTAMP
  273. RGULOG("init done! elapsed time: %d ms\n", get_timer(time));
  274. time = get_timer(0);
  275. #endif
  276. }
  277. void mtk_wdt_timestamp_update(void)
  278. {
  279. #if CONFIG_WDT_DBG_TIMESTAMP
  280. ulong time_elapse;
  281. time_elapse = get_timer(time);
  282. if (time_elapse) {
  283. /*
  284. * Since wdt kicking may be very frequency, set threshold to avoid
  285. * lousy message.
  286. *
  287. * Preloader does not reset system while WDT timeout, thus debug message
  288. * shall appear for timeout cases (long elapsed time).
  289. */
  290. if (time_elapse > 5)
  291. RGULOG("kick wdt! elapsed time: %d ms\n", get_timer(time));
  292. time = get_timer(0);
  293. }
  294. #endif
  295. }
  296. void mtk_wdt_restart(void)
  297. {
  298. /* Reset WatchDogTimer's counting value to time out value */
  299. /* ie., keepalive() */
  300. DRV_WriteReg32(MTK_WDT_RESTART, MTK_WDT_RESTART_KEY);
  301. mtk_wdt_timestamp_update();
  302. }
  303. void mtk_wdt_sw_reset(void)
  304. {
  305. RGULOG("WDT SW RESET\n");
  306. /* DRV_WriteReg32 (0x70025000, 0x2201); */
  307. /* DRV_WriteReg32 (0x70025008, 0x1971); */
  308. /* DRV_WriteReg32 (0x7002501C, 0x1209); */
  309. mtk_wdt_reset(1);/* NOTE here, this reset will cause by pass power key */
  310. /* system will reset */
  311. while (1)
  312. {
  313. RGULOG("SW reset happen ...\n");
  314. };
  315. }
  316. static void mtk_wdt_hw_reset(void)
  317. {
  318. RGULOG("WDT_HW_Reset_test\n");
  319. /* 1. set WDT timeout 1 secs, 1*64*512/32768 = 1sec */
  320. mtk_wdt_set_time_out_value(1);
  321. /* 2. enable WDT debug reset enable, generating irq disable, ext reset disable */
  322. /* ext reset signal low, wdt enalbe */
  323. mtk_wdt_mode_config(TRUE, FALSE, FALSE, FALSE, TRUE);
  324. /* 3. reset the watch dog timer to the value set in WDT_LENGTH register */
  325. mtk_wdt_restart();
  326. /* 4. system will reset */
  327. while (1);
  328. }
  329. int mtk_wdt_boot_check(void)
  330. {
  331. unsigned int wdt_sta = mtk_wdt_get_status();
  332. int ret = WDT_NOT_WDT_REBOOT;
  333. /*
  334. * For DA download hope to timeout reboot, and boot to u-boot/kernel configurable reason,
  335. * we set both timeout reboot and software reboot can check whether bypass power key.
  336. */
  337. if (wdt_sta & (MTK_WDT_STATUS_HWWDT_RST | MTK_WDT_STATUS_SWWDT_RST |
  338. MTK_WDT_STATUS_SPM_THERMAL_RST | MTK_WDT_STATUS_SPMWDT_RST |
  339. MTK_WDT_STATUS_THERMAL_DIRECT_RST | MTK_WDT_STATUS_SECURITY_RST |
  340. MTK_WDT_STATUS_DEBUGWDT_RST | MTK_WDT_STATUS_EINT_RST |
  341. MTK_WDT_STATUS_SYSRST_RST | MTK_WDT_STATUS_DVFSP_RST |
  342. MTK_WDT_STATUS_SSPM_RST)) {
  343. if (rgu_mode & MTK_WDT_MODE_AUTO_RESTART) {
  344. /* HW or SW reboot, and auto restart is set, means bypass power key */
  345. ret = WDT_BY_PASS_PWK_REBOOT;
  346. } else {
  347. /* HW or SW reboot, but auto restart is not set, means NOT bypass power key */
  348. ret = WDT_NORMAL_REBOOT;
  349. }
  350. } else {
  351. /*
  352. * For PMIC full reset, return "bypass pwr key reboot" to help AEE works.
  353. * I.e., Prevent entering charger mode.
  354. */
  355. if (mtk_wdt_is_pmic_full_reset()) {
  356. RGULOG("PMIC full rst: true\n");
  357. ret = WDT_BY_PASS_PWK_REBOOT;
  358. }
  359. }
  360. return ret;
  361. }
  362. int mtk_wdt_is_pmic_full_reset(void)
  363. {
  364. #if CFG_APWDT_PMIC_FULL_RST_COMMON_API
  365. unsigned int val;
  366. /* Use PMIC common API for PMIC full reset detection */
  367. val = is_pmic_cold_reset();
  368. #else
  369. static unsigned int val = 0;
  370. static unsigned int handled = 0;
  371. /*
  372. * PMIC common API may be failed in some platforms.
  373. *
  374. * Use a non-volatile register (reset only after battery is removed)
  375. * for PMIC full reset detection.
  376. *
  377. * In such platforms, use bit 0 in register PMIC_RG_RSV_SWREG.
  378. */
  379. if (!handled) {
  380. pmic_read_interface(PMIC_RG_RSV_SWREG_ADDR, &val, 0x1, 0);
  381. if (val)
  382. pmic_config_interface(PMIC_RG_RSV_SWREG_ADDR, 0, 0x1, 0);
  383. RGULOG("PMIC full rst: %d\n", val);
  384. handled = 1;
  385. }
  386. #endif
  387. return val ? 1 : 0;
  388. }
  389. void mtk_arch_reset(char mode)
  390. {
  391. RGULOG("mtk_arch_reset at pre-loader!\n");
  392. /* mtk_wdt_hw_reset(); */
  393. mtk_wdt_reset(mode);
  394. while (1);
  395. }
  396. int rgu_dram_reserved(int enable)
  397. {
  398. volatile unsigned int tmp = 0, ret = 0;
  399. /*
  400. * DDR reserved mode may be switched on/off anytime by caller.
  401. *
  402. * DDR reserved mode switch on/off flow will modify register MODE.
  403. * Since register STATUS and some bits in DEBUG_CTL will be reset
  404. * if register MODE has any changes. Keep those register values first
  405. * before register MODE is written later.
  406. */
  407. mtk_wdt_keep_essential_info();
  408. if (enable == 1)
  409. {
  410. /* enable ddr reserved mode */
  411. tmp = READ_REG(MTK_WDT_MODE);
  412. tmp |= (MTK_WDT_MODE_DDR_RESERVE|MTK_WDT_MODE_KEY);
  413. WRITE_REG(tmp, MTK_WDT_MODE);
  414. } else if (enable == 0)
  415. {
  416. /* disable ddr reserved mode, set reset mode,
  417. disable watchdog output reset signal */
  418. tmp = READ_REG(MTK_WDT_MODE);
  419. tmp &= (~MTK_WDT_MODE_DDR_RESERVE);
  420. tmp |= MTK_WDT_MODE_KEY;
  421. WRITE_REG(tmp, MTK_WDT_MODE);
  422. } else
  423. {
  424. RGULOG("Wrong input %d, should be 1(enable) or 0(disable) in %s\n", enable, __func__);
  425. ret = -1;
  426. }
  427. RGULOG("%s: MTK_WDT_MODE(%x)\n", __func__, tmp);
  428. return ret;
  429. }
  430. int rgu_is_reserve_ddr_enabled(void)
  431. {
  432. unsigned int wdt_mode;
  433. wdt_mode = READ_REG(MTK_WDT_MODE);
  434. if (wdt_mode & MTK_WDT_MODE_DDR_RESERVE)
  435. return 1;
  436. else
  437. return 0;
  438. }
  439. int rgu_is_dram_slf(void)
  440. {
  441. unsigned int wdt_dbg_ctrl;
  442. wdt_dbg_ctrl = READ_REG(MTK_WDT_DEBUG_CTL);
  443. if (wdt_dbg_ctrl & MTK_DDR_SREF_STA) {
  444. RGULOG("DDR is in self-refresh. %x\n", wdt_dbg_ctrl);
  445. return 1;
  446. } else {
  447. RGULOG("DDR is not in self-refresh. %x\n", wdt_dbg_ctrl);
  448. return 0;
  449. }
  450. }
  451. int rgu_wait_for_reg_update_done(unsigned int reg_addr, unsigned mask, unsigned target_val)
  452. {
  453. unsigned timeout_ms = 5;
  454. unsigned int read_val;
  455. unsigned int read_times = 0;
  456. unsigned int elapsed_ms = 0;
  457. while (1) {
  458. read_val = READ_REG(reg_addr);
  459. if (target_val == (read_val & mask))
  460. break;
  461. read_times++;
  462. if (read_times && 0 == (read_times % 100)) {
  463. mdelay(1);
  464. elapsed_ms += 1;
  465. if (elapsed_ms > timeout_ms) {
  466. RGULOG("%s: ERROR! Update reg 0x%x timeout! Mask: 0x%x Target: 0x%x\n",
  467. __func__, reg_addr, mask, target_val);
  468. return -1;
  469. }
  470. }
  471. }
  472. return 0;
  473. }
  474. int rgu_update_reg(unsigned int reg, u32 func, u32 bits)
  475. {
  476. volatile unsigned int val;
  477. int ret;
  478. val = READ_REG(reg);
  479. if (func == RGU_REG_SET)
  480. val |= bits;
  481. else if (func == RGU_REG_CLR)
  482. val &= (~bits);
  483. else
  484. return -1;
  485. /* add unlock key */
  486. if (reg == MTK_WDT_DEBUG_CTL)
  487. val |= MTK_DEBUG_CTL_KEY;
  488. else if (reg == MTK_WDT_DEBUG_CTL2)
  489. val |= MTK_DEBUG_CTL2_KEY;
  490. else {
  491. RGULOG("%s: Invalid! Set bit 0x%x in reg 0x%x fail!\n", __func__,
  492. bits, reg);
  493. return -1;
  494. }
  495. /* update register */
  496. WRITE_REG(val, reg);
  497. /* wait until register updating done */
  498. if (func == RGU_REG_SET)
  499. val = bits;
  500. else
  501. val = 0;
  502. /*
  503. * Must ensure waiting-done API has timeout mechanism
  504. * because in some scenarios with security feature toggled,
  505. * below registers will be read-only. Writting operation
  506. * will get timeout here.
  507. *
  508. * DEBUG_CTL / DEBUG_CLT2 / DDR_RESERVE_MODE bit in MODE
  509. */
  510. ret = rgu_wait_for_reg_update_done(reg, bits, val);
  511. RGULOG("%s: %d, bits: 0x%x, addr: 0x%x, val: 0x%x\n", __func__,
  512. func, bits, reg, READ_REG(reg));
  513. return ret;
  514. }
  515. int rgu_is_reserve_ddr_mode_success(void)
  516. {
  517. unsigned int wdt_dbg_ctrl;
  518. /*
  519. * MTK_DDR_RESERVE_RTA bit will be reset by modifying register MODE.
  520. * Read DEBUG_CTL value kept by mtk_wdt_get_debug_ctl().
  521. */
  522. wdt_dbg_ctrl = mtk_wdt_get_debug_ctl();
  523. if (wdt_dbg_ctrl & MTK_DDR_RESERVE_RTA) {
  524. RGULOG("WDT DDR reserve mode success! %x\n", wdt_dbg_ctrl);
  525. return 1;
  526. } else {
  527. RGULOG("WDT DDR reserve mode FAIL! %x\n", wdt_dbg_ctrl);
  528. return 0;
  529. }
  530. }
  531. int rgu_cfg_emi_dcs_en(int enable)
  532. {
  533. volatile unsigned int tmp;
  534. int ret;
  535. if (enable == 1) {
  536. ret = rgu_update_reg(MTK_WDT_DEBUG_CTL2,
  537. RGU_REG_SET, MTK_RGU_EMI_DCS_EN);
  538. } else if (enable == 0) {
  539. ret = rgu_update_reg(MTK_WDT_DEBUG_CTL2,
  540. RGU_REG_CLR, MTK_RGU_EMI_DCS_EN);
  541. } else
  542. ret = -1;
  543. return ret;
  544. }
  545. int rgu_release_rg_dramc_conf_iso(void)
  546. {
  547. int ret;
  548. int success;
  549. ret = rgu_update_reg(MTK_WDT_DEBUG_CTL,
  550. RGU_REG_CLR, MTK_RG_CONF_ISO);
  551. success = rgu_is_reserve_ddr_mode_success();
  552. RGULOG("DDR RESERVE Success %d\n", success);
  553. return ret;
  554. }
  555. int rgu_release_rg_dramc_iso(void)
  556. {
  557. return rgu_update_reg(MTK_WDT_DEBUG_CTL, RGU_REG_CLR, MTK_RG_DRAMC_ISO);
  558. }
  559. int rgu_release_rg_dramc_sref(void)
  560. {
  561. return rgu_update_reg(MTK_WDT_DEBUG_CTL, RGU_REG_CLR, MTK_RG_DRAMC_SREF);
  562. }
  563. int rgu_is_emi_dcs_success(void)
  564. {
  565. unsigned int wdt_dbg_ctrl;
  566. unsigned int success;
  567. /*
  568. * MTK_RGU_EMI_DCS_SUCCESS bit will be reset by modifying register MODE.
  569. * Read DEBUG_CTL value kept by mtk_wdt_get_debug_ctl().
  570. */
  571. wdt_dbg_ctrl = mtk_wdt_get_debug_ctl();
  572. success = (wdt_dbg_ctrl & MTK_RGU_EMI_DCS_SUCCESS) >> MTK_RGU_EMI_DCS_SUCCESS_OFFSET;
  573. RGULOG("EMI_DCS_SUCCESS %d\n", success);
  574. return success;
  575. }
  576. int rgu_is_emi_dcs_enable(void)
  577. {
  578. unsigned int reg;
  579. reg = READ_REG(MTK_WDT_DEBUG_CTL2);
  580. if (reg & MTK_RGU_EMI_DCS_EN)
  581. return 1;
  582. else
  583. return 0;
  584. }
  585. int rgu_is_dvfsrc_success(void)
  586. {
  587. unsigned int wdt_dbg_ctrl;
  588. unsigned int success;
  589. /*
  590. * MTK_RGU_EMI_DCS_SUCCESS bit will be reset by modifying register MODE.
  591. * Read DEBUG_CTL value kept by mtk_wdt_get_debug_ctl().
  592. */
  593. wdt_dbg_ctrl = mtk_wdt_get_debug_ctl();
  594. success = (wdt_dbg_ctrl & MTK_RGU_DVFSRC_SUCCESS) >> MTK_RGU_DVFSRC_SUCCESS_OFFSET;
  595. RGULOG("DVFSRC_SUCCESS %d\n", success);
  596. return success;
  597. }
  598. int rgu_is_dvfsrc_enable(void)
  599. {
  600. unsigned int reg;
  601. reg = READ_REG(MTK_WDT_DEBUG_CTL2);
  602. if (reg & MTK_RGU_DVFSRC_EN)
  603. return 1;
  604. else
  605. return 0;
  606. }
  607. void rgu_swsys_reset(WD_SYS_RST_TYPE reset_type)
  608. {
  609. if (reset_type == WD_MD_RST) {
  610. unsigned int wdt_dbg_ctrl;
  611. wdt_dbg_ctrl = READ_REG(MTK_WDT_SWSYSRST);
  612. wdt_dbg_ctrl |= MTK_WDT_SWSYS_RST_KEY;
  613. wdt_dbg_ctrl |= 0x80; /* 1<<7 */
  614. WRITE_REG(wdt_dbg_ctrl, MTK_WDT_SWSYSRST);
  615. udelay(1000);
  616. wdt_dbg_ctrl = READ_REG(MTK_WDT_SWSYSRST);
  617. wdt_dbg_ctrl |= MTK_WDT_SWSYS_RST_KEY;
  618. wdt_dbg_ctrl &= (~0x80); /* ~(1<<7) */
  619. WRITE_REG(wdt_dbg_ctrl, MTK_WDT_SWSYSRST);
  620. /* RGULOG("rgu pl md reset\n"); */
  621. }
  622. }
  623. int mtk_wdt_request_en_set(int mark_bit, WD_REQ_CTL en)
  624. {
  625. unsigned int tmp, ext_req_con;
  626. if ((mark_bit != MTK_WDT_STATUS_SSPM_RST) &&
  627. (mark_bit != MTK_WDT_STATUS_SYSRST_RST) &&
  628. (mark_bit != MTK_WDT_STATUS_EINT_RST) &&
  629. (mark_bit != MTK_WDT_STATUS_SPM_THERMAL_RST))
  630. return -1;
  631. tmp = READ_REG(MTK_WDT_REQ_MODE);
  632. tmp |= MTK_WDT_REQ_MODE_KEY;
  633. if (en == WD_REQ_EN)
  634. tmp |= (mark_bit);
  635. if (en == WD_REQ_DIS)
  636. tmp &= ~(mark_bit);
  637. WRITE_REG(tmp, MTK_WDT_REQ_MODE);
  638. return 0;
  639. }
  640. int mtk_wdt_request_mode_set(int mark_bit, WD_REQ_MODE mode)
  641. {
  642. unsigned int tmp;
  643. if ((mark_bit != MTK_WDT_STATUS_SSPM_RST) &&
  644. (mark_bit != MTK_WDT_STATUS_SYSRST_RST) &&
  645. (mark_bit != MTK_WDT_STATUS_EINT_RST) &&
  646. (mark_bit != MTK_WDT_STATUS_SPM_THERMAL_RST))
  647. return -1;
  648. tmp = READ_REG(MTK_WDT_REQ_IRQ_EN);
  649. tmp |= MTK_WDT_REQ_IRQ_KEY;
  650. if (mode == WD_REQ_IRQ_MODE)
  651. tmp |= (mark_bit);
  652. if (mode == WD_REQ_RST_MODE)
  653. tmp &= ~(mark_bit);
  654. WRITE_REG(tmp, MTK_WDT_REQ_IRQ_EN);
  655. return 0;
  656. }
  657. void mtk_wdt_pre_init(void)
  658. {
  659. unsigned int wdt_ctrl;
  660. unsigned int nonrst;
  661. /* skip if platform already run mtk_wdt_pre_init in early stage*/
  662. if (g_rgu_inited == 1) {
  663. RGULOG("WDT is already inited\n");
  664. return;
  665. }
  666. /* get last stage and mark current stage to preloader */
  667. mtk_wdt_check_last_stage();
  668. mtk_wdt_mark_stage(RGU_STAGE_PRELOADER);
  669. /*
  670. * Since RGU init flow will modify WDT_MODE which will reset WDT_STA and some bits
  671. * in WDT_DEBUG_CTL, preserve these registers in static global variable first.
  672. */
  673. mtk_wdt_keep_essential_info();
  674. /* Dump RGU regisers */
  675. RGULOG("MODE: 0x%x\n", DRV_Reg32(MTK_WDT_MODE));
  676. RGULOG("STA: 0x%x\n", mtk_wdt_get_status());
  677. RGULOG("LENGTH: 0x%x\n", DRV_Reg32(MTK_WDT_LENGTH));
  678. RGULOG("INTERVAL: 0x%x\n", DRV_Reg32(MTK_WDT_INTERVAL));
  679. RGULOG("SWSYSRST: 0x%x\n", DRV_Reg32(MTK_WDT_SWSYSRST));
  680. RGULOG("LATCH_CTL: 0x%x\n", DRV_Reg32(MTK_WDT_LATCH_CTL));
  681. RGULOG("NONRST_REG2: 0x%x\n", DRV_Reg32(MTK_WDT_NONRST_REG2));
  682. RGULOG("DEBUG_CTL: 0x%x\n", mtk_wdt_get_debug_ctl());
  683. rgu_mode = DRV_Reg32(MTK_WDT_MODE);
  684. mtk_wdt_mode_config(FALSE, FALSE, FALSE, FALSE, FALSE); /* Wirte Mode register will clear status register */
  685. /* Setting timeout 10s */
  686. mtk_wdt_set_time_out_value(WDT_TIMEOUT_DEFAULT_VAL);
  687. #if (!CFG_APWDT_DISABLE)
  688. /* Config HW reboot mode */
  689. #if MTK_DOE_CONFIG_ENV_SUPPORT
  690. g_doe_apwdt_en = dconfig_getenv("apwdt_en");
  691. #endif
  692. if (g_doe_apwdt_en == NULL || *g_doe_apwdt_en == '1') {
  693. mtk_wdt_mode_config(TRUE, TRUE, TRUE, FALSE, TRUE);
  694. mtk_wdt_restart();
  695. }
  696. #endif
  697. mtk_wdt_timestamp_init();
  698. mtk_wdt_reset_deglitch_enable();
  699. /* Configure WDT_LATCH_CTL */
  700. wdt_ctrl = READ_REG(MTK_WDT_LATCH_CTL);
  701. wdt_ctrl |= MTK_LATCH_CTL_KEY;
  702. wdt_ctrl |= MTK_RG_LATH_EN;
  703. wdt_ctrl |= MTK_RG_MCU_LATH_EN | MTK_RG_SPM_LATH_EN;
  704. wdt_ctrl |= MTK_RG_GPU_EXT_OFF_EN | MTK_RG_MD_EXT_OFF_EN;
  705. wdt_ctrl &= ~(MTK_RG_MCU_LATCH_SELECT | MTK_RG_SPM_LATCH_SELECT);
  706. wdt_ctrl |= MTK_RG_DRAMC_LATH_EN;
  707. wdt_ctrl |= MTK_RG_DEBUGSYS_LATCH_EN;
  708. wdt_ctrl |= (MTK_RG_DRAMC_RD_TEST_EN | MTK_RG_DRAMC_RDWT_TEST_EN);
  709. WRITE_REG(wdt_ctrl, MTK_WDT_LATCH_CTL);
  710. /* Configure WDT_LATCH_CTL2 */
  711. wdt_ctrl = READ_REG(MTK_WDT_LATCH_CTL2);
  712. wdt_ctrl |= MTK_LATCH_CTL2_KEY;
  713. /* DFD feature */
  714. wdt_ctrl |= MTK_RG_MCU_DFD_EN;
  715. wdt_ctrl &= ~(MTK_RG_MCU_DFD_TIMEOUT_MASK << MTK_RG_MCU_DFD_TIMEOUT_OFS);
  716. wdt_ctrl |= (MTK_RG_MCU_DFD_TIMEOUT_VALUE << MTK_RG_MCU_DFD_TIMEOUT_OFS);
  717. WRITE_REG(wdt_ctrl, MTK_WDT_LATCH_CTL2);
  718. /*
  719. * Configure WDT_DEBUG_CTL
  720. *
  721. * Release DDR reserve mode related control.
  722. *
  723. * Release DCS EN/PAUSE and DVFSRC EN/PAUSE in RGU initialization.
  724. * NOTE: This job must be done earlier than DVS/DVFSRC initialization.
  725. */
  726. rgu_update_reg(MTK_WDT_DEBUG_CTL, RGU_REG_CLR,
  727. MTK_RGU_EMI_DCS_PAUSE | MTK_RGU_DVFSRC_PAUSE);
  728. rgu_update_reg(MTK_WDT_DEBUG_CTL2, RGU_REG_CLR,
  729. MTK_RGU_EMI_DCS_EN | MTK_RGU_DVFSRC_EN);
  730. RGULOG("%s: MTK_WDT_DEBUG_CTL(0x%x)\n", __func__,
  731. READ_REG(MTK_WDT_DEBUG_CTL));
  732. RGULOG("%s: MTK_WDT_DEBUG_CTL2(0x%x)\n", __func__,
  733. READ_REG(MTK_WDT_DEBUG_CTL2));
  734. RGULOG("%s: MTK_WDT_LATCH_CTL(0x%x)\n", __func__,
  735. READ_REG(MTK_WDT_LATCH_CTL));
  736. /* disable spm thermal rst */
  737. mtk_wdt_request_en_set(MTK_WDT_STATUS_SPM_THERMAL_RST, WD_REQ_DIS);
  738. mtk_wdt_request_mode_set(MTK_WDT_STATUS_SPM_THERMAL_RST, WD_REQ_RST_MODE);
  739. /* disable sysrst */
  740. mtk_wdt_request_en_set(MTK_WDT_STATUS_SYSRST_RST, WD_REQ_DIS);
  741. /* disable irq of sysrst */
  742. mtk_wdt_request_mode_set(MTK_WDT_STATUS_SYSRST_RST, WD_REQ_RST_MODE);
  743. /* disable irq of eint */
  744. mtk_wdt_request_mode_set(MTK_WDT_STATUS_EINT_RST, WD_REQ_RST_MODE);
  745. RGULOG("%s: MTK_WDT_REQ_MODE(%x), MTK_WDT_REQ_IRQ_EN(%x)\n", __func__,
  746. READ_REG(MTK_WDT_REQ_MODE), READ_REG(MTK_WDT_REQ_IRQ_EN));
  747. mtk_wdt_timestamp_update();
  748. g_rgu_inited = 1;
  749. }
  750. void mtk_wdt_init(void)
  751. {
  752. unsigned int wdt_sta;
  753. if (g_rgu_inited == 0) {
  754. mtk_wdt_pre_init();
  755. } else {
  756. /* RGU clock source might be changed since pre_init which might
  757. * make rgu work abnormal due clock source switch. We restart wdt
  758. * by disable and enable it again */
  759. mtk_wdt_mode_config(FALSE, FALSE, FALSE, FALSE, FALSE);
  760. mtk_wdt_set_time_out_value(WDT_TIMEOUT_DEFAULT_VAL);
  761. #if (!CFG_APWDT_DISABLE)
  762. /* Config HW reboot mode */
  763. mtk_wdt_mode_config(TRUE, TRUE, TRUE, FALSE, TRUE);
  764. mtk_wdt_restart();
  765. #endif
  766. }
  767. wdt_sta = mtk_wdt_get_status();
  768. if ((wdt_sta & MTK_WDT_STATUS_HWWDT_RST) && (rgu_mode & MTK_WDT_MODE_AUTO_RESTART)) {
  769. /* Time out reboot always by pass power key */
  770. g_rgu_status = RE_BOOT_BY_WDT_HW;
  771. } else if (wdt_sta & MTK_WDT_STATUS_SWWDT_RST)
  772. g_rgu_status = RE_BOOT_BY_WDT_SW;
  773. else
  774. g_rgu_status = RE_BOOT_REASON_UNKNOW;
  775. if (wdt_sta & MTK_WDT_STATUS_IRQWDT_RST)
  776. g_rgu_status |= RE_BOOT_WITH_INTTERUPT;
  777. if (wdt_sta & MTK_WDT_STATUS_SPM_THERMAL_RST)
  778. g_rgu_status |= RE_BOOT_BY_SPM_THERMAL;
  779. if (wdt_sta & MTK_WDT_STATUS_SPMWDT_RST)
  780. g_rgu_status |= RE_BOOT_BY_SPM;
  781. if (wdt_sta & MTK_WDT_STATUS_THERMAL_DIRECT_RST)
  782. g_rgu_status |= RE_BOOT_BY_THERMAL_DIRECT;
  783. if (wdt_sta & MTK_WDT_STATUS_DEBUGWDT_RST)
  784. g_rgu_status |= RE_BOOT_BY_DEBUG;
  785. if (wdt_sta & MTK_WDT_STATUS_SECURITY_RST)
  786. g_rgu_status |= RE_BOOT_BY_SECURITY;
  787. if (wdt_sta & MTK_WDT_STATUS_SYSRST_RST)
  788. g_rgu_status |= RE_BOOT_BY_SYSRST;
  789. if (wdt_sta & MTK_WDT_STATUS_SSPM_RST)
  790. g_rgu_status |= RE_BOOT_BY_SSPM_RST;
  791. /* SW workaround to avoid EINT_RST be triggered with other RST behavior */
  792. if ((wdt_sta & MTK_WDT_STATUS_EINT_RST) && (g_rgu_status == RE_BOOT_REASON_UNKNOW))
  793. g_rgu_status |= RE_BOOT_BY_EINT;
  794. if (mtk_wdt_is_pmic_full_reset())
  795. g_rgu_status |= RE_BOOT_BY_PMIC_FULL_RST;
  796. RGULOG("g_rgu_status: %d (0x%x)\n", g_rgu_status, g_rgu_status);
  797. mtk_wdt_check_trig_reboot_reason();
  798. #if MTK_DOE_CONFIG_ENV_SUPPORT
  799. if (g_doe_apwdt_en == NULL)
  800. g_doe_apwdt_en = dconfig_getenv("apwdt_en");
  801. if (g_doe_apwdt_en != NULL && *g_doe_apwdt_en == '0')
  802. mtk_wdt_disable();
  803. #endif
  804. }
  805. #else /* Using dummy WDT functions */
  806. void mtk_wdt_pre_init(void)
  807. {
  808. RGULOG("PL WDT Dummy pre_init called\n");
  809. }
  810. void mtk_wdt_init(void)
  811. {
  812. RGULOG("PL WDT Dummy init called\n");
  813. }
  814. BOOL mtk_is_rgu_trigger_reset(void)
  815. {
  816. RGULOG("PL Dummy mtk_is_rgu_trigger_reset called\n");
  817. return FALSE;
  818. }
  819. void mtk_arch_reset(char mode)
  820. {
  821. RGULOG("PL WDT Dummy arch reset called\n");
  822. }
  823. int mtk_wdt_boot_check(void)
  824. {
  825. RGULOG("PL WDT Dummy mtk_wdt_boot_check called\n");
  826. return 0;
  827. }
  828. void mtk_wdt_disable(void)
  829. {
  830. RGULOG("UB WDT Dummy mtk_wdt_disable called\n");
  831. }
  832. void mtk_wdt_restart(void)
  833. {
  834. RGULOG("UB WDT Dummy mtk_wdt_restart called\n");
  835. }
  836. static void mtk_wdt_sw_reset(void)
  837. {
  838. /* RGULOG("UB WDT Dummy mtk_wdt_sw_reset called\n"); */
  839. }
  840. static void mtk_wdt_hw_reset(void)
  841. {
  842. RGULOG("UB WDT Dummy mtk_wdt_hw_reset called\n");
  843. }
  844. int rgu_dram_reserved(int enable)
  845. {
  846. volatile unsigned int ret = 0;
  847. RGULOG("dummy RGU %s\n", __func__);
  848. return ret;
  849. }
  850. int rgu_is_reserve_ddr_enabled(void)
  851. {
  852. RGULOG("dummy RGU %s\n", __func__);
  853. return 0;
  854. }
  855. int rgu_is_dram_slf(void)
  856. {
  857. RGULOG("dummy RGU %s\n", __func__);
  858. return 0;
  859. }
  860. int rgu_release_rg_dramc_conf_iso(void)
  861. {
  862. RGULOG("dummy RGU %s\n", __func__);
  863. return 0;
  864. }
  865. int rgu_release_rg_dram_setting(void)
  866. {
  867. RGULOG("dummy RGU %s\n", __func__);
  868. return 0;
  869. }
  870. int rgu_release_rg_dramc_iso(void)
  871. {
  872. RGULOG("dummy RGU %s\n", __func__);
  873. return 0;
  874. }
  875. int rgu_release_rg_dramc_sref(void)
  876. {
  877. RGULOG("dummy RGU %s\n", __func__);
  878. return 0;
  879. }
  880. int rgu_is_reserve_ddr_mode_success(void)
  881. {
  882. RGULOG("dummy RGU %s\n", __func__);
  883. return 0;
  884. }
  885. void rgu_swsys_reset(WD_SYS_RST_TYPE reset_type)
  886. {
  887. /* RGULOG("dummy RGU %s\n", __func__); */
  888. }
  889. int mtk_wdt_request_en_set(int mark_bit, WD_REQ_CTL en)
  890. {
  891. RGULOG("dummy RGU %s\n", __func__);
  892. }
  893. int mtk_wdt_request_mode_set(int mark_bit, WD_REQ_MODE mode)
  894. {
  895. RGULOG("dummy RGU %s\n", __func__);
  896. }
  897. #endif