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