| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 | // SPDX-License-Identifier: GPL-2.0+/* * Copyright (C) 2016 Freescale Semiconductor, Inc. */#include <common.h>#include <asm/io.h>#include <asm/arch/imx-regs.h>/* * MX7ULP WDOG Register Map */struct wdog_regs {	u8 cs1;	u8 cs2;	u16 reserve0;	u32 cnt;	u32 toval;	u32 win;};#ifndef CONFIG_WATCHDOG_TIMEOUT_MSECS#define CONFIG_WATCHDOG_TIMEOUT_MSECS 0x1500#endif#define REFRESH_WORD0 0xA602 /* 1st refresh word */#define REFRESH_WORD1 0xB480 /* 2nd refresh word */#define UNLOCK_WORD0 0xC520 /* 1st unlock word */#define UNLOCK_WORD1 0xD928 /* 2nd unlock word */#define WDGCS1_WDGE                      (1<<7)#define WDGCS1_WDGUPDATE                 (1<<5)#define WDGCS2_FLG                       (1<<6)#define WDG_BUS_CLK                      (0x0)#define WDG_LPO_CLK                      (0x1)#define WDG_32KHZ_CLK                    (0x2)#define WDG_EXT_CLK                      (0x3)void hw_watchdog_set_timeout(u16 val){	/* setting timeout value */	struct wdog_regs *wdog = (struct wdog_regs *)WDOG_BASE_ADDR;	writel(val, &wdog->toval);}void hw_watchdog_reset(void){	struct wdog_regs *wdog = (struct wdog_regs *)WDOG_BASE_ADDR;	writel(REFRESH_WORD0, &wdog->cnt);	writel(REFRESH_WORD1, &wdog->cnt);}void hw_watchdog_init(void){	u8 val;	struct wdog_regs *wdog = (struct wdog_regs *)WDOG_BASE_ADDR;	writel(UNLOCK_WORD0, &wdog->cnt);	writel(UNLOCK_WORD1, &wdog->cnt);	val = readb(&wdog->cs2);	val |= WDGCS2_FLG;	writeb(val, &wdog->cs2);	hw_watchdog_set_timeout(CONFIG_WATCHDOG_TIMEOUT_MSECS);	writel(0, &wdog->win);	writeb(WDG_LPO_CLK, &wdog->cs2);/* setting 1-kHz clock source */	writeb((WDGCS1_WDGE | WDGCS1_WDGUPDATE), &wdog->cs1);/* enable counter running */	hw_watchdog_reset();}void reset_cpu(ulong addr){	struct wdog_regs *wdog = (struct wdog_regs *)WDOG_BASE_ADDR;	writel(UNLOCK_WORD0, &wdog->cnt);	writel(UNLOCK_WORD1, &wdog->cnt);	hw_watchdog_set_timeout(5); /* 5ms timeout */	writel(0, &wdog->win);	writeb(WDG_LPO_CLK, &wdog->cs2);/* setting 1-kHz clock source */	writeb(WDGCS1_WDGE, &wdog->cs1);/* enable counter running */	hw_watchdog_reset();	while (1);}
 |