xref: /rk3399_rockchip-uboot/arch/sh/cpu/sh4/watchdog.c (revision 326ea986ac150acdc7656d57fca647db80b50158)
18f0fec74SPeter Tyser /*
2*1a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
38f0fec74SPeter Tyser  */
48f0fec74SPeter Tyser 
58f0fec74SPeter Tyser #include <common.h>
68f0fec74SPeter Tyser #include <asm/processor.h>
7754613f7SNobuhiro Iwamatsu #include <asm/system.h>
88f0fec74SPeter Tyser #include <asm/io.h>
98f0fec74SPeter Tyser 
108f0fec74SPeter Tyser #define WDT_BASE	WTCNT
118f0fec74SPeter Tyser 
128f0fec74SPeter Tyser #define WDT_WD		(1 << 6)
138f0fec74SPeter Tyser #define WDT_RST_P	(0)
148f0fec74SPeter Tyser #define WDT_RST_M	(1 << 5)
158f0fec74SPeter Tyser #define WDT_ENABLE	(1 << 7)
168f0fec74SPeter Tyser 
178f0fec74SPeter Tyser #if defined(CONFIG_WATCHDOG)
csr_read(void)188f0fec74SPeter Tyser static unsigned char csr_read(void)
198f0fec74SPeter Tyser {
208f0fec74SPeter Tyser 	return inb(WDT_BASE + 0x04);
218f0fec74SPeter Tyser }
228f0fec74SPeter Tyser 
cnt_write(unsigned char value)238f0fec74SPeter Tyser static void cnt_write(unsigned char value)
248f0fec74SPeter Tyser {
258f0fec74SPeter Tyser 	outl((unsigned short)value | 0x5A00, WDT_BASE + 0x00);
268f0fec74SPeter Tyser }
278f0fec74SPeter Tyser 
csr_write(unsigned char value)288f0fec74SPeter Tyser static void csr_write(unsigned char value)
298f0fec74SPeter Tyser {
308f0fec74SPeter Tyser 	outl((unsigned short)value | 0xA500, WDT_BASE + 0x04);
318f0fec74SPeter Tyser }
328f0fec74SPeter Tyser 
watchdog_reset(void)338f0fec74SPeter Tyser void watchdog_reset(void)
348f0fec74SPeter Tyser {
358f0fec74SPeter Tyser 	outl(0x55000000, WDT_BASE + 0x08);
368f0fec74SPeter Tyser }
378f0fec74SPeter Tyser 
watchdog_init(void)388f0fec74SPeter Tyser int watchdog_init(void)
398f0fec74SPeter Tyser {
408f0fec74SPeter Tyser 	/* Set overflow time*/
418f0fec74SPeter Tyser 	cnt_write(0);
428f0fec74SPeter Tyser 	/* Power on reset */
438f0fec74SPeter Tyser 	csr_write(WDT_WD|WDT_RST_P|WDT_ENABLE);
448f0fec74SPeter Tyser 
458f0fec74SPeter Tyser 	return 0;
468f0fec74SPeter Tyser }
478f0fec74SPeter Tyser 
watchdog_disable(void)488f0fec74SPeter Tyser int watchdog_disable(void)
498f0fec74SPeter Tyser {
508f0fec74SPeter Tyser 	csr_write(csr_read() & ~WDT_ENABLE);
518f0fec74SPeter Tyser 	return 0;
528f0fec74SPeter Tyser }
538f0fec74SPeter Tyser #endif
548f0fec74SPeter Tyser 
reset_cpu(unsigned long ignored)558f0fec74SPeter Tyser void reset_cpu(unsigned long ignored)
568f0fec74SPeter Tyser {
57754613f7SNobuhiro Iwamatsu 	/* Address error with SR.BL=1 first. */
58754613f7SNobuhiro Iwamatsu 	trigger_address_error();
59754613f7SNobuhiro Iwamatsu 
608f0fec74SPeter Tyser 	while (1)
618f0fec74SPeter Tyser 		;
628f0fec74SPeter Tyser }
63