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 Tyserstatic unsigned char csr_read(void) 198f0fec74SPeter Tyser { 208f0fec74SPeter Tyser return inb(WDT_BASE + 0x04); 218f0fec74SPeter Tyser } 228f0fec74SPeter Tyser cnt_write(unsigned char value)238f0fec74SPeter Tyserstatic 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 Tyserstatic 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 Tyservoid watchdog_reset(void) 348f0fec74SPeter Tyser { 358f0fec74SPeter Tyser outl(0x55000000, WDT_BASE + 0x08); 368f0fec74SPeter Tyser } 378f0fec74SPeter Tyser watchdog_init(void)388f0fec74SPeter Tyserint 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 Tyserint 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 Tyservoid 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