xref: /rk3399_rockchip-uboot/drivers/watchdog/ulp_wdog.c (revision 02ccab1908c405fe1449457d4a0d343784a30acb)
1*253531bbSYe Li /*
2*253531bbSYe Li  * Copyright (C) 2016 Freescale Semiconductor, Inc.
3*253531bbSYe Li  *
4*253531bbSYe Li  * SPDX-License-Identifier:	GPL-2.0+
5*253531bbSYe Li  */
6*253531bbSYe Li 
7*253531bbSYe Li #include <common.h>
8*253531bbSYe Li #include <asm/io.h>
9*253531bbSYe Li #include <asm/arch/imx-regs.h>
10*253531bbSYe Li 
11*253531bbSYe Li /*
12*253531bbSYe Li  * MX7ULP WDOG Register Map
13*253531bbSYe Li  */
14*253531bbSYe Li struct wdog_regs {
15*253531bbSYe Li 	u8 cs1;
16*253531bbSYe Li 	u8 cs2;
17*253531bbSYe Li 	u16 reserve0;
18*253531bbSYe Li 	u32 cnt;
19*253531bbSYe Li 	u32 toval;
20*253531bbSYe Li 	u32 win;
21*253531bbSYe Li };
22*253531bbSYe Li 
23*253531bbSYe Li #ifndef CONFIG_WATCHDOG_TIMEOUT_MSECS
24*253531bbSYe Li #define CONFIG_WATCHDOG_TIMEOUT_MSECS 0x1500
25*253531bbSYe Li #endif
26*253531bbSYe Li 
27*253531bbSYe Li #define REFRESH_WORD0 0xA602 /* 1st refresh word */
28*253531bbSYe Li #define REFRESH_WORD1 0xB480 /* 2nd refresh word */
29*253531bbSYe Li 
30*253531bbSYe Li #define UNLOCK_WORD0 0xC520 /* 1st unlock word */
31*253531bbSYe Li #define UNLOCK_WORD1 0xD928 /* 2nd unlock word */
32*253531bbSYe Li 
33*253531bbSYe Li #define WDGCS1_WDGE                      (1<<7)
34*253531bbSYe Li #define WDGCS1_WDGUPDATE                 (1<<5)
35*253531bbSYe Li 
36*253531bbSYe Li #define WDGCS2_FLG                       (1<<6)
37*253531bbSYe Li 
38*253531bbSYe Li #define WDG_BUS_CLK                      (0x0)
39*253531bbSYe Li #define WDG_LPO_CLK                      (0x1)
40*253531bbSYe Li #define WDG_32KHZ_CLK                    (0x2)
41*253531bbSYe Li #define WDG_EXT_CLK                      (0x3)
42*253531bbSYe Li 
43*253531bbSYe Li DECLARE_GLOBAL_DATA_PTR;
44*253531bbSYe Li 
hw_watchdog_set_timeout(u16 val)45*253531bbSYe Li void hw_watchdog_set_timeout(u16 val)
46*253531bbSYe Li {
47*253531bbSYe Li 	/* setting timeout value */
48*253531bbSYe Li 	struct wdog_regs *wdog = (struct wdog_regs *)WDOG_BASE_ADDR;
49*253531bbSYe Li 
50*253531bbSYe Li 	writel(val, &wdog->toval);
51*253531bbSYe Li }
52*253531bbSYe Li 
hw_watchdog_reset(void)53*253531bbSYe Li void hw_watchdog_reset(void)
54*253531bbSYe Li {
55*253531bbSYe Li 	struct wdog_regs *wdog = (struct wdog_regs *)WDOG_BASE_ADDR;
56*253531bbSYe Li 
57*253531bbSYe Li 	writel(REFRESH_WORD0, &wdog->cnt);
58*253531bbSYe Li 	writel(REFRESH_WORD1, &wdog->cnt);
59*253531bbSYe Li }
60*253531bbSYe Li 
hw_watchdog_init(void)61*253531bbSYe Li void hw_watchdog_init(void)
62*253531bbSYe Li {
63*253531bbSYe Li 	u8 val;
64*253531bbSYe Li 	struct wdog_regs *wdog = (struct wdog_regs *)WDOG_BASE_ADDR;
65*253531bbSYe Li 
66*253531bbSYe Li 	writel(UNLOCK_WORD0, &wdog->cnt);
67*253531bbSYe Li 	writel(UNLOCK_WORD1, &wdog->cnt);
68*253531bbSYe Li 
69*253531bbSYe Li 	val = readb(&wdog->cs2);
70*253531bbSYe Li 	val |= WDGCS2_FLG;
71*253531bbSYe Li 	writeb(val, &wdog->cs2);
72*253531bbSYe Li 
73*253531bbSYe Li 	hw_watchdog_set_timeout(CONFIG_WATCHDOG_TIMEOUT_MSECS);
74*253531bbSYe Li 	writel(0, &wdog->win);
75*253531bbSYe Li 
76*253531bbSYe Li 	writeb(WDG_LPO_CLK, &wdog->cs2);/* setting 1-kHz clock source */
77*253531bbSYe Li 	writeb((WDGCS1_WDGE | WDGCS1_WDGUPDATE), &wdog->cs1);/* enable counter running */
78*253531bbSYe Li 
79*253531bbSYe Li 	hw_watchdog_reset();
80*253531bbSYe Li }
81*253531bbSYe Li 
reset_cpu(ulong addr)82*253531bbSYe Li void reset_cpu(ulong addr)
83*253531bbSYe Li {
84*253531bbSYe Li 	struct wdog_regs *wdog = (struct wdog_regs *)WDOG_BASE_ADDR;
85*253531bbSYe Li 
86*253531bbSYe Li 	writel(UNLOCK_WORD0, &wdog->cnt);
87*253531bbSYe Li 	writel(UNLOCK_WORD1, &wdog->cnt);
88*253531bbSYe Li 
89*253531bbSYe Li 	hw_watchdog_set_timeout(5); /* 5ms timeout */
90*253531bbSYe Li 	writel(0, &wdog->win);
91*253531bbSYe Li 
92*253531bbSYe Li 	writeb(WDG_LPO_CLK, &wdog->cs2);/* setting 1-kHz clock source */
93*253531bbSYe Li 	writeb(WDGCS1_WDGE, &wdog->cs1);/* enable counter running */
94*253531bbSYe Li 
95*253531bbSYe Li 	hw_watchdog_reset();
96*253531bbSYe Li 
97*253531bbSYe Li 	while (1);
98*253531bbSYe Li }
99