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