[T106][ZXW-22]7520V3SCV2.01.01.02P42U09_VEC_V0.8_AP_VEC origin source commit

Change-Id: Ic6e05d89ecd62fc34f82b23dcf306c93764aec4b
diff --git a/boot/common/src/uboot/drivers/wdt/wdt.c b/boot/common/src/uboot/drivers/wdt/wdt.c
new file mode 100644
index 0000000..5353df5
--- /dev/null
+++ b/boot/common/src/uboot/drivers/wdt/wdt.c
@@ -0,0 +1,159 @@
+/*******************************************************************************

+ * Copyright (C) 2016, ZXIC Corporation.

+ *

+ * File Name:

+ * File Mark:

+ * Description:

+ * Others:

+ * Version:       1.0

+ * Author:        zxic

+ * Date:		  2016.12.15

+ * modify

+  ********************************************************************************/

+

+/****************************************************************************

+* 	                                           Include files

+****************************************************************************/

+#include <malloc.h> 

+#include <errno.h>

+#include <asm/io.h> 

+#include <linux/mtd/mtd.h>

+#include <asm-generic/ioctl.h>

+#include <config.h>

+#include <common.h>

+#include <command.h>

+#include <boot_mode.h>

+#include <watchdog.h>

+#include <asm/arch/lsp_crpm.h>

+

+/****************************************************************************

+* 	                                           Local Macros

+****************************************************************************/

+/*used in wdt*/

+#define WDT_DIABLE		(0x44495341) /*ascii: DISA*/

+#define WDT_OFF 		(0x57445446) //ascii:WDTF

+

+#define WDT_REBOOT_RECORD_BASE	(0x102410)

+

+/*open and close wdt function for long time operation in boot.*/

+#define RM_WDT_BASE	(0x00148000)

+#define RM_WDT_START_REG  (0x0014801C)  /* Watchdog start or stop register */

+

+#define WDT_RESET_TYPE			(TOP_SYSCLK_BASE+0x2c)

+#define RM_MOD_RST					(TOP_SYSCLK_BASE+0x74)

+

+#define reg32(addr)			(*(volatile unsigned long *)(addr))

+

+

+/****************************************************************************

+* 	                                           Local Types

+****************************************************************************/

+

+

+/****************************************************************************

+* 	                                           Global Value

+****************************************************************************/

+

+

+/****************************************************************************

+* 	                                           Local Funcs

+****************************************************************************/

+

+int wdt_open(void)

+{

+	reg32(RM_WDT_START_REG) = 0x12340001;//open

+	return 0;

+}

+

+int wdt_close(void)

+{

+	reg32(RM_WDT_START_REG) = 0x12340000;//close

+	return 0;

+}

+void wdt_restart(void)

+{

+	volatile u32 tmp = 0;

+

+	//reset

+	reg32(WDT_RESET_TYPE) |= (0x3); 

+	//reg32(RM_MOD_RST) &=~(0x3<<12);

+	//reg32(RM_MOD_RST) |=(0x3<<12);

+	

+	//clk sel default, clk div

+	tmp =reg32(RM_WDT_BASE + 0x04);

+	tmp &=~(0xff<<8);

+	tmp |=(31<<8);

+	reg32(RM_WDT_BASE + 0x04) = 0x12340000|tmp;

+	

+	/*set value int */

+	reg32(RM_WDT_BASE + 0x14) = 0x12340000|0x8;

+

+	/*set load value*/

+	reg32(RM_WDT_BASE + 0x08) = 0x12340000|0x10;

+	

+	/*refresh config*/		

+	tmp =reg32(RM_WDT_BASE + 0x18);

+	tmp ^=0x3f;

+	reg32(RM_WDT_BASE + 0x18) = 0x12340000|tmp;

+	

+   	/*wait for refresh ack*/

+	while(1)

+	{

+		if(((reg32(RM_WDT_BASE + 0x10)>>4)&0x3f) == tmp)

+			break;

+	}

+

+	/*start  wdt*/

+	reg32(RM_WDT_START_REG) =0x12340001;

+	while(1);

+}

+

+int wdt_get_reboot_reason(void)

+{

+	if(reg32(WDT_REBOOT_RECORD_BASE) == 1)

+		printf( "[sys_entry_wdt]: PS watchdog reset! global_cnt = %d; core_cnt = %d\n", (int)reg32(WDT_REBOOT_RECORD_BASE+0x8), (int)reg32(WDT_REBOOT_RECORD_BASE+0xc));

+	else if(reg32(WDT_REBOOT_RECORD_BASE) == 2)

+		printf( "[sys_entry_wdt]: AP watchdog reset! global_cnt = %d; core_cnt = %d\n", (int)reg32(WDT_REBOOT_RECORD_BASE+0x8), (int)reg32(WDT_REBOOT_RECORD_BASE+0xc));

+	else if(reg32(WDT_REBOOT_RECORD_BASE) == 3)

+		printf( "[sys_entry_wdt]: PHY watchdog reset! global_cnt = %d; core_cnt = %d\n", (int)reg32(WDT_REBOOT_RECORD_BASE+0x8), (int)reg32(WDT_REBOOT_RECORD_BASE+0xc));

+	else if(reg32(WDT_REBOOT_RECORD_BASE) == 4)

+		printf( "[sys_entry_wdt]: Rpm watchdog reset! global_cnt = %d; core_cnt = %d\n", (int)reg32(WDT_REBOOT_RECORD_BASE+0x8), (int)reg32(WDT_REBOOT_RECORD_BASE+0xc));

+	else

+		printf( "[sys_entry_wdt]: watchdog no reset!\n");

+

+	return 0;

+}

+

+int wdt_init(void)

+{

+	unsigned int *poweron_type = (unsigned int *)POWERON_TYPE_ADDR;	 //ÁÙʱʹÓÃ

+

+	/*ap wdt disbale*/

+	/*¸ù¾ÝÆô¶¯ÀàÐÍ£¬¹Ø±Õ²»¼ÓÔØºËµÄwatchdog*/

+	#ifndef CONFIG_ZX297520V3E_WATCH_CAP	

+	reg32(WDT_AP_SWITCH_ADDR) = WDT_DIABLE;	// larry

+	#endif

+	//reg32(WDT_NV_ADDR) = WDT_OFF;

+	

+	if(*poweron_type == POWER_ON_FOTA)

+	{

+		/*turn off PS PHY AP watchdog monitor and close m0 wdt*/

+		reg32(WDT_NV_ADDR) = WDT_OFF;

+		reg32(WDT_PS_SWITCH_ADDR) = WDT_DIABLE;

+		reg32(WDT_PHY_SWITCH_ADDR) = WDT_DIABLE;

+		reg32(WDT_AP_SWITCH_ADDR) = WDT_DIABLE;

+		printf( "[sys_entry]: turn off PS PHY AP watchdog monitor and close m0 wdt! \n");

+	}

+	else if(*poweron_type == POWER_ON_CHARGING)

+	{

+		/*turn off PHY watchdog monitor*/

+		reg32(WDT_PHY_SWITCH_ADDR) = WDT_DIABLE;

+		printf( "[sys_entry]: turn off PHY watchdog monitor! \n");

+

+	}

+

+	return 0;

+}

+

+

+