1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0+ 2*4882a593Smuzhiyun * 3*4882a593Smuzhiyun * include/asm-sh/watchdog.h 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2002, 2003 Paul Mundt 6*4882a593Smuzhiyun * Copyright (C) 2009 Siemens AG 7*4882a593Smuzhiyun * Copyright (C) 2009 Valentin Sitdikov 8*4882a593Smuzhiyun */ 9*4882a593Smuzhiyun #ifndef __ASM_SH_WATCHDOG_H 10*4882a593Smuzhiyun #define __ASM_SH_WATCHDOG_H 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #include <linux/types.h> 13*4882a593Smuzhiyun #include <linux/io.h> 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #define WTCNT_HIGH 0x5a 16*4882a593Smuzhiyun #define WTCSR_HIGH 0xa5 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #define WTCSR_CKS2 0x04 19*4882a593Smuzhiyun #define WTCSR_CKS1 0x02 20*4882a593Smuzhiyun #define WTCSR_CKS0 0x01 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun #include <cpu/watchdog.h> 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun /* 25*4882a593Smuzhiyun * See cpu-sh2/watchdog.h for explanation of this stupidity.. 26*4882a593Smuzhiyun */ 27*4882a593Smuzhiyun #ifndef WTCNT_R 28*4882a593Smuzhiyun # define WTCNT_R WTCNT 29*4882a593Smuzhiyun #endif 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun #ifndef WTCSR_R 32*4882a593Smuzhiyun # define WTCSR_R WTCSR 33*4882a593Smuzhiyun #endif 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun /* 36*4882a593Smuzhiyun * CKS0-2 supports a number of clock division ratios. At the time the watchdog 37*4882a593Smuzhiyun * is enabled, it defaults to a 41 usec overflow period .. we overload this to 38*4882a593Smuzhiyun * something a little more reasonable, and really can't deal with anything 39*4882a593Smuzhiyun * lower than WTCSR_CKS_1024, else we drop back into the usec range. 40*4882a593Smuzhiyun * 41*4882a593Smuzhiyun * Clock Division Ratio Overflow Period 42*4882a593Smuzhiyun * -------------------------------------------- 43*4882a593Smuzhiyun * 1/32 (initial value) 41 usecs 44*4882a593Smuzhiyun * 1/64 82 usecs 45*4882a593Smuzhiyun * 1/128 164 usecs 46*4882a593Smuzhiyun * 1/256 328 usecs 47*4882a593Smuzhiyun * 1/512 656 usecs 48*4882a593Smuzhiyun * 1/1024 1.31 msecs 49*4882a593Smuzhiyun * 1/2048 2.62 msecs 50*4882a593Smuzhiyun * 1/4096 5.25 msecs 51*4882a593Smuzhiyun */ 52*4882a593Smuzhiyun #define WTCSR_CKS_32 0x00 53*4882a593Smuzhiyun #define WTCSR_CKS_64 0x01 54*4882a593Smuzhiyun #define WTCSR_CKS_128 0x02 55*4882a593Smuzhiyun #define WTCSR_CKS_256 0x03 56*4882a593Smuzhiyun #define WTCSR_CKS_512 0x04 57*4882a593Smuzhiyun #define WTCSR_CKS_1024 0x05 58*4882a593Smuzhiyun #define WTCSR_CKS_2048 0x06 59*4882a593Smuzhiyun #define WTCSR_CKS_4096 0x07 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun #if defined(CONFIG_CPU_SUBTYPE_SH7785) || defined(CONFIG_CPU_SUBTYPE_SH7780) 62*4882a593Smuzhiyun /** 63*4882a593Smuzhiyun * sh_wdt_read_cnt - Read from Counter 64*4882a593Smuzhiyun * Reads back the WTCNT value. 65*4882a593Smuzhiyun */ sh_wdt_read_cnt(void)66*4882a593Smuzhiyunstatic inline __u32 sh_wdt_read_cnt(void) 67*4882a593Smuzhiyun { 68*4882a593Smuzhiyun return __raw_readl(WTCNT_R); 69*4882a593Smuzhiyun } 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun /** 72*4882a593Smuzhiyun * sh_wdt_write_cnt - Write to Counter 73*4882a593Smuzhiyun * @val: Value to write 74*4882a593Smuzhiyun * 75*4882a593Smuzhiyun * Writes the given value @val to the lower byte of the timer counter. 76*4882a593Smuzhiyun * The upper byte is set manually on each write. 77*4882a593Smuzhiyun */ sh_wdt_write_cnt(__u32 val)78*4882a593Smuzhiyunstatic inline void sh_wdt_write_cnt(__u32 val) 79*4882a593Smuzhiyun { 80*4882a593Smuzhiyun __raw_writel((WTCNT_HIGH << 24) | (__u32)val, WTCNT); 81*4882a593Smuzhiyun } 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun /** 84*4882a593Smuzhiyun * sh_wdt_write_bst - Write to Counter 85*4882a593Smuzhiyun * @val: Value to write 86*4882a593Smuzhiyun * 87*4882a593Smuzhiyun * Writes the given value @val to the lower byte of the timer counter. 88*4882a593Smuzhiyun * The upper byte is set manually on each write. 89*4882a593Smuzhiyun */ sh_wdt_write_bst(__u32 val)90*4882a593Smuzhiyunstatic inline void sh_wdt_write_bst(__u32 val) 91*4882a593Smuzhiyun { 92*4882a593Smuzhiyun __raw_writel((WTBST_HIGH << 24) | (__u32)val, WTBST); 93*4882a593Smuzhiyun } 94*4882a593Smuzhiyun /** 95*4882a593Smuzhiyun * sh_wdt_read_csr - Read from Control/Status Register 96*4882a593Smuzhiyun * 97*4882a593Smuzhiyun * Reads back the WTCSR value. 98*4882a593Smuzhiyun */ sh_wdt_read_csr(void)99*4882a593Smuzhiyunstatic inline __u32 sh_wdt_read_csr(void) 100*4882a593Smuzhiyun { 101*4882a593Smuzhiyun return __raw_readl(WTCSR_R); 102*4882a593Smuzhiyun } 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun /** 105*4882a593Smuzhiyun * sh_wdt_write_csr - Write to Control/Status Register 106*4882a593Smuzhiyun * @val: Value to write 107*4882a593Smuzhiyun * 108*4882a593Smuzhiyun * Writes the given value @val to the lower byte of the control/status 109*4882a593Smuzhiyun * register. The upper byte is set manually on each write. 110*4882a593Smuzhiyun */ sh_wdt_write_csr(__u32 val)111*4882a593Smuzhiyunstatic inline void sh_wdt_write_csr(__u32 val) 112*4882a593Smuzhiyun { 113*4882a593Smuzhiyun __raw_writel((WTCSR_HIGH << 24) | (__u32)val, WTCSR); 114*4882a593Smuzhiyun } 115*4882a593Smuzhiyun #else 116*4882a593Smuzhiyun /** 117*4882a593Smuzhiyun * sh_wdt_read_cnt - Read from Counter 118*4882a593Smuzhiyun * Reads back the WTCNT value. 119*4882a593Smuzhiyun */ sh_wdt_read_cnt(void)120*4882a593Smuzhiyunstatic inline __u8 sh_wdt_read_cnt(void) 121*4882a593Smuzhiyun { 122*4882a593Smuzhiyun return __raw_readb(WTCNT_R); 123*4882a593Smuzhiyun } 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun /** 126*4882a593Smuzhiyun * sh_wdt_write_cnt - Write to Counter 127*4882a593Smuzhiyun * @val: Value to write 128*4882a593Smuzhiyun * 129*4882a593Smuzhiyun * Writes the given value @val to the lower byte of the timer counter. 130*4882a593Smuzhiyun * The upper byte is set manually on each write. 131*4882a593Smuzhiyun */ sh_wdt_write_cnt(__u8 val)132*4882a593Smuzhiyunstatic inline void sh_wdt_write_cnt(__u8 val) 133*4882a593Smuzhiyun { 134*4882a593Smuzhiyun __raw_writew((WTCNT_HIGH << 8) | (__u16)val, WTCNT); 135*4882a593Smuzhiyun } 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun /** 138*4882a593Smuzhiyun * sh_wdt_read_csr - Read from Control/Status Register 139*4882a593Smuzhiyun * 140*4882a593Smuzhiyun * Reads back the WTCSR value. 141*4882a593Smuzhiyun */ sh_wdt_read_csr(void)142*4882a593Smuzhiyunstatic inline __u8 sh_wdt_read_csr(void) 143*4882a593Smuzhiyun { 144*4882a593Smuzhiyun return __raw_readb(WTCSR_R); 145*4882a593Smuzhiyun } 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun /** 148*4882a593Smuzhiyun * sh_wdt_write_csr - Write to Control/Status Register 149*4882a593Smuzhiyun * @val: Value to write 150*4882a593Smuzhiyun * 151*4882a593Smuzhiyun * Writes the given value @val to the lower byte of the control/status 152*4882a593Smuzhiyun * register. The upper byte is set manually on each write. 153*4882a593Smuzhiyun */ sh_wdt_write_csr(__u8 val)154*4882a593Smuzhiyunstatic inline void sh_wdt_write_csr(__u8 val) 155*4882a593Smuzhiyun { 156*4882a593Smuzhiyun __raw_writew((WTCSR_HIGH << 8) | (__u16)val, WTCSR); 157*4882a593Smuzhiyun } 158*4882a593Smuzhiyun #endif /* CONFIG_CPU_SUBTYPE_SH7785 || CONFIG_CPU_SUBTYPE_SH7780 */ 159*4882a593Smuzhiyun #endif /* __ASM_SH_WATCHDOG_H */ 160