1
2
3
4
5
6
7
8#ifndef _LINUX_WATCHDOG_H
9#define _LINUX_WATCHDOG_H
10
11
12#include <linux/bitops.h>
13#include <linux/device.h>
14#include <linux/cdev.h>
15#include <uapi/linux/watchdog.h>
16
17struct watchdog_ops;
18struct watchdog_device;
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38struct watchdog_ops {
39 struct module *owner;
40
41 int (*start)(struct watchdog_device *);
42 int (*stop)(struct watchdog_device *);
43
44 int (*ping)(struct watchdog_device *);
45 unsigned int (*status)(struct watchdog_device *);
46 int (*set_timeout)(struct watchdog_device *, unsigned int);
47 unsigned int (*get_timeleft)(struct watchdog_device *);
48 void (*ref)(struct watchdog_device *);
49 void (*unref)(struct watchdog_device *);
50 long (*ioctl)(struct watchdog_device *, unsigned int, unsigned long);
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
78struct watchdog_device {
79 int id;
80 struct cdev cdev;
81 struct device *dev;
82 struct device *parent;
83 const struct watchdog_info *info;
84 const struct watchdog_ops *ops;
85 unsigned int bootstatus;
86 unsigned int timeout;
87 unsigned int min_timeout;
88 unsigned int max_timeout;
89 void *driver_data;
90 struct mutex lock;
91 unsigned long status;
92
93#define WDOG_ACTIVE 0
94#define WDOG_DEV_OPEN 1
95#define WDOG_ALLOW_RELEASE 2
96#define WDOG_NO_WAY_OUT 3
97#define WDOG_UNREGISTERED 4
98};
99
100#define WATCHDOG_NOWAYOUT IS_BUILTIN(CONFIG_WATCHDOG_NOWAYOUT)
101#define WATCHDOG_NOWAYOUT_INIT_STATUS (WATCHDOG_NOWAYOUT << WDOG_NO_WAY_OUT)
102
103
104static inline bool watchdog_active(struct watchdog_device *wdd)
105{
106 return test_bit(WDOG_ACTIVE, &wdd->status);
107}
108
109
110static inline void watchdog_set_nowayout(struct watchdog_device *wdd, bool nowayout)
111{
112 if (nowayout)
113 set_bit(WDOG_NO_WAY_OUT, &wdd->status);
114}
115
116
117static inline bool watchdog_timeout_invalid(struct watchdog_device *wdd, unsigned int t)
118{
119 return ((wdd->max_timeout != 0) &&
120 (t < wdd->min_timeout || t > wdd->max_timeout));
121}
122
123
124static inline void watchdog_set_drvdata(struct watchdog_device *wdd, void *data)
125{
126 wdd->driver_data = data;
127}
128
129static inline void *watchdog_get_drvdata(struct watchdog_device *wdd)
130{
131 return wdd->driver_data;
132}
133
134
135extern int watchdog_init_timeout(struct watchdog_device *wdd,
136 unsigned int timeout_parm, struct device *dev);
137extern int watchdog_register_device(struct watchdog_device *);
138extern void watchdog_unregister_device(struct watchdog_device *);
139
140#ifdef CONFIG_HARDLOCKUP_DETECTOR
141void watchdog_nmi_disable_all(void);
142void watchdog_nmi_enable_all(void);
143#else
144static inline void watchdog_nmi_disable_all(void) {}
145static inline void watchdog_nmi_enable_all(void) {}
146#endif
147
148#endif
149