162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0+ 262306a36Sopenharmony_ci * 362306a36Sopenharmony_ci * include/asm-sh/watchdog.h 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2002, 2003 Paul Mundt 662306a36Sopenharmony_ci * Copyright (C) 2009 Siemens AG 762306a36Sopenharmony_ci * Copyright (C) 2009 Valentin Sitdikov 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci#ifndef __ASM_SH_WATCHDOG_H 1062306a36Sopenharmony_ci#define __ASM_SH_WATCHDOG_H 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#include <linux/types.h> 1362306a36Sopenharmony_ci#include <linux/io.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#define WTCNT_HIGH 0x5a 1662306a36Sopenharmony_ci#define WTCSR_HIGH 0xa5 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#define WTCSR_CKS2 0x04 1962306a36Sopenharmony_ci#define WTCSR_CKS1 0x02 2062306a36Sopenharmony_ci#define WTCSR_CKS0 0x01 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci#include <cpu/watchdog.h> 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci/* 2562306a36Sopenharmony_ci * See cpu-sh2/watchdog.h for explanation of this stupidity.. 2662306a36Sopenharmony_ci */ 2762306a36Sopenharmony_ci#ifndef WTCNT_R 2862306a36Sopenharmony_ci# define WTCNT_R WTCNT 2962306a36Sopenharmony_ci#endif 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci#ifndef WTCSR_R 3262306a36Sopenharmony_ci# define WTCSR_R WTCSR 3362306a36Sopenharmony_ci#endif 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci/* 3662306a36Sopenharmony_ci * CKS0-2 supports a number of clock division ratios. At the time the watchdog 3762306a36Sopenharmony_ci * is enabled, it defaults to a 41 usec overflow period .. we overload this to 3862306a36Sopenharmony_ci * something a little more reasonable, and really can't deal with anything 3962306a36Sopenharmony_ci * lower than WTCSR_CKS_1024, else we drop back into the usec range. 4062306a36Sopenharmony_ci * 4162306a36Sopenharmony_ci * Clock Division Ratio Overflow Period 4262306a36Sopenharmony_ci * -------------------------------------------- 4362306a36Sopenharmony_ci * 1/32 (initial value) 41 usecs 4462306a36Sopenharmony_ci * 1/64 82 usecs 4562306a36Sopenharmony_ci * 1/128 164 usecs 4662306a36Sopenharmony_ci * 1/256 328 usecs 4762306a36Sopenharmony_ci * 1/512 656 usecs 4862306a36Sopenharmony_ci * 1/1024 1.31 msecs 4962306a36Sopenharmony_ci * 1/2048 2.62 msecs 5062306a36Sopenharmony_ci * 1/4096 5.25 msecs 5162306a36Sopenharmony_ci */ 5262306a36Sopenharmony_ci#define WTCSR_CKS_32 0x00 5362306a36Sopenharmony_ci#define WTCSR_CKS_64 0x01 5462306a36Sopenharmony_ci#define WTCSR_CKS_128 0x02 5562306a36Sopenharmony_ci#define WTCSR_CKS_256 0x03 5662306a36Sopenharmony_ci#define WTCSR_CKS_512 0x04 5762306a36Sopenharmony_ci#define WTCSR_CKS_1024 0x05 5862306a36Sopenharmony_ci#define WTCSR_CKS_2048 0x06 5962306a36Sopenharmony_ci#define WTCSR_CKS_4096 0x07 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci#if defined(CONFIG_CPU_SUBTYPE_SH7785) || defined(CONFIG_CPU_SUBTYPE_SH7780) 6262306a36Sopenharmony_ci/** 6362306a36Sopenharmony_ci * sh_wdt_read_cnt - Read from Counter 6462306a36Sopenharmony_ci * Reads back the WTCNT value. 6562306a36Sopenharmony_ci */ 6662306a36Sopenharmony_cistatic inline __u32 sh_wdt_read_cnt(void) 6762306a36Sopenharmony_ci{ 6862306a36Sopenharmony_ci return __raw_readl(WTCNT_R); 6962306a36Sopenharmony_ci} 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci/** 7262306a36Sopenharmony_ci * sh_wdt_write_cnt - Write to Counter 7362306a36Sopenharmony_ci * @val: Value to write 7462306a36Sopenharmony_ci * 7562306a36Sopenharmony_ci * Writes the given value @val to the lower byte of the timer counter. 7662306a36Sopenharmony_ci * The upper byte is set manually on each write. 7762306a36Sopenharmony_ci */ 7862306a36Sopenharmony_cistatic inline void sh_wdt_write_cnt(__u32 val) 7962306a36Sopenharmony_ci{ 8062306a36Sopenharmony_ci __raw_writel((WTCNT_HIGH << 24) | (__u32)val, WTCNT); 8162306a36Sopenharmony_ci} 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci/** 8462306a36Sopenharmony_ci * sh_wdt_write_bst - Write to Counter 8562306a36Sopenharmony_ci * @val: Value to write 8662306a36Sopenharmony_ci * 8762306a36Sopenharmony_ci * Writes the given value @val to the lower byte of the timer counter. 8862306a36Sopenharmony_ci * The upper byte is set manually on each write. 8962306a36Sopenharmony_ci */ 9062306a36Sopenharmony_cistatic inline void sh_wdt_write_bst(__u32 val) 9162306a36Sopenharmony_ci{ 9262306a36Sopenharmony_ci __raw_writel((WTBST_HIGH << 24) | (__u32)val, WTBST); 9362306a36Sopenharmony_ci} 9462306a36Sopenharmony_ci/** 9562306a36Sopenharmony_ci * sh_wdt_read_csr - Read from Control/Status Register 9662306a36Sopenharmony_ci * 9762306a36Sopenharmony_ci * Reads back the WTCSR value. 9862306a36Sopenharmony_ci */ 9962306a36Sopenharmony_cistatic inline __u32 sh_wdt_read_csr(void) 10062306a36Sopenharmony_ci{ 10162306a36Sopenharmony_ci return __raw_readl(WTCSR_R); 10262306a36Sopenharmony_ci} 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci/** 10562306a36Sopenharmony_ci * sh_wdt_write_csr - Write to Control/Status Register 10662306a36Sopenharmony_ci * @val: Value to write 10762306a36Sopenharmony_ci * 10862306a36Sopenharmony_ci * Writes the given value @val to the lower byte of the control/status 10962306a36Sopenharmony_ci * register. The upper byte is set manually on each write. 11062306a36Sopenharmony_ci */ 11162306a36Sopenharmony_cistatic inline void sh_wdt_write_csr(__u32 val) 11262306a36Sopenharmony_ci{ 11362306a36Sopenharmony_ci __raw_writel((WTCSR_HIGH << 24) | (__u32)val, WTCSR); 11462306a36Sopenharmony_ci} 11562306a36Sopenharmony_ci#else 11662306a36Sopenharmony_ci/** 11762306a36Sopenharmony_ci * sh_wdt_read_cnt - Read from Counter 11862306a36Sopenharmony_ci * Reads back the WTCNT value. 11962306a36Sopenharmony_ci */ 12062306a36Sopenharmony_cistatic inline __u8 sh_wdt_read_cnt(void) 12162306a36Sopenharmony_ci{ 12262306a36Sopenharmony_ci return __raw_readb(WTCNT_R); 12362306a36Sopenharmony_ci} 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ci/** 12662306a36Sopenharmony_ci * sh_wdt_write_cnt - Write to Counter 12762306a36Sopenharmony_ci * @val: Value to write 12862306a36Sopenharmony_ci * 12962306a36Sopenharmony_ci * Writes the given value @val to the lower byte of the timer counter. 13062306a36Sopenharmony_ci * The upper byte is set manually on each write. 13162306a36Sopenharmony_ci */ 13262306a36Sopenharmony_cistatic inline void sh_wdt_write_cnt(__u8 val) 13362306a36Sopenharmony_ci{ 13462306a36Sopenharmony_ci __raw_writew((WTCNT_HIGH << 8) | (__u16)val, WTCNT); 13562306a36Sopenharmony_ci} 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci/** 13862306a36Sopenharmony_ci * sh_wdt_read_csr - Read from Control/Status Register 13962306a36Sopenharmony_ci * 14062306a36Sopenharmony_ci * Reads back the WTCSR value. 14162306a36Sopenharmony_ci */ 14262306a36Sopenharmony_cistatic inline __u8 sh_wdt_read_csr(void) 14362306a36Sopenharmony_ci{ 14462306a36Sopenharmony_ci return __raw_readb(WTCSR_R); 14562306a36Sopenharmony_ci} 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ci/** 14862306a36Sopenharmony_ci * sh_wdt_write_csr - Write to Control/Status Register 14962306a36Sopenharmony_ci * @val: Value to write 15062306a36Sopenharmony_ci * 15162306a36Sopenharmony_ci * Writes the given value @val to the lower byte of the control/status 15262306a36Sopenharmony_ci * register. The upper byte is set manually on each write. 15362306a36Sopenharmony_ci */ 15462306a36Sopenharmony_cistatic inline void sh_wdt_write_csr(__u8 val) 15562306a36Sopenharmony_ci{ 15662306a36Sopenharmony_ci __raw_writew((WTCSR_HIGH << 8) | (__u16)val, WTCSR); 15762306a36Sopenharmony_ci} 15862306a36Sopenharmony_ci#endif /* CONFIG_CPU_SUBTYPE_SH7785 || CONFIG_CPU_SUBTYPE_SH7780 */ 15962306a36Sopenharmony_ci#endif /* __ASM_SH_WATCHDOG_H */ 160