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