aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/watchdog/watchdog-kernel-api.txt5
-rw-r--r--drivers/watchdog/watchdog_dev.c6
-rw-r--r--include/linux/watchdog.h2
3 files changed, 13 insertions, 0 deletions
diff --git a/Documentation/watchdog/watchdog-kernel-api.txt b/Documentation/watchdog/watchdog-kernel-api.txt
index 785fa0c996a4..829955bd245e 100644
--- a/Documentation/watchdog/watchdog-kernel-api.txt
+++ b/Documentation/watchdog/watchdog-kernel-api.txt
@@ -73,6 +73,7 @@ struct watchdog_ops {
73 int (*ping)(struct watchdog_device *); 73 int (*ping)(struct watchdog_device *);
74 unsigned int (*status)(struct watchdog_device *); 74 unsigned int (*status)(struct watchdog_device *);
75 int (*set_timeout)(struct watchdog_device *, unsigned int); 75 int (*set_timeout)(struct watchdog_device *, unsigned int);
76 long (*ioctl)(struct watchdog_device *, unsigned int, unsigned long);
76}; 77};
77 78
78It is important that you first define the module owner of the watchdog timer 79It is important that you first define the module owner of the watchdog timer
@@ -117,6 +118,10 @@ they are supported. These optional routines/operations are:
117 to re-program the watchdog timer device. 118 to re-program the watchdog timer device.
118 (Note: the WDIOF_SETTIMEOUT needs to be set in the options field of the 119 (Note: the WDIOF_SETTIMEOUT needs to be set in the options field of the
119 watchdog's info structure). 120 watchdog's info structure).
121* ioctl: if this routine is present then it will be called first before we do
122 our own internal ioctl call handling. This routine should return -ENOIOCTLCMD
123 if a command is not supported. The parameters that are passed to the ioctl
124 call are: watchdog_device, cmd and arg.
120 125
121The status bits should (preferably) be set with the set_bit and clear_bit alike 126The status bits should (preferably) be set with the set_bit and clear_bit alike
122bit-operations. The status bits that are defined are: 127bit-operations. The status bits that are defined are:
diff --git a/drivers/watchdog/watchdog_dev.c b/drivers/watchdog/watchdog_dev.c
index ac20f92347b1..e7134a5979c6 100644
--- a/drivers/watchdog/watchdog_dev.c
+++ b/drivers/watchdog/watchdog_dev.c
@@ -180,6 +180,12 @@ static long watchdog_ioctl(struct file *file, unsigned int cmd,
180 unsigned int val; 180 unsigned int val;
181 int err; 181 int err;
182 182
183 if (wdd->ops->ioctl) {
184 err = wdd->ops->ioctl(wdd, cmd, arg);
185 if (err != -ENOIOCTLCMD)
186 return err;
187 }
188
183 switch (cmd) { 189 switch (cmd) {
184 case WDIOC_GETSUPPORT: 190 case WDIOC_GETSUPPORT:
185 return copy_to_user(argp, wdd->info, 191 return copy_to_user(argp, wdd->info,
diff --git a/include/linux/watchdog.h b/include/linux/watchdog.h
index f719883c5141..325d90b6641b 100644
--- a/include/linux/watchdog.h
+++ b/include/linux/watchdog.h
@@ -70,6 +70,7 @@ struct watchdog_device;
70 * @ping: The routine that sends a keepalive ping to the watchdog device. 70 * @ping: The routine that sends a keepalive ping to the watchdog device.
71 * @status: The routine that shows the status of the watchdog device. 71 * @status: The routine that shows the status of the watchdog device.
72 * @set_timeout:The routine for setting the watchdog devices timeout value. 72 * @set_timeout:The routine for setting the watchdog devices timeout value.
73 * @ioctl: The routines that handles extra ioctl calls.
73 * 74 *
74 * The watchdog_ops structure contains a list of low-level operations 75 * The watchdog_ops structure contains a list of low-level operations
75 * that control a watchdog device. It also contains the module that owns 76 * that control a watchdog device. It also contains the module that owns
@@ -85,6 +86,7 @@ struct watchdog_ops {
85 int (*ping)(struct watchdog_device *); 86 int (*ping)(struct watchdog_device *);
86 unsigned int (*status)(struct watchdog_device *); 87 unsigned int (*status)(struct watchdog_device *);
87 int (*set_timeout)(struct watchdog_device *, unsigned int); 88 int (*set_timeout)(struct watchdog_device *, unsigned int);
89 long (*ioctl)(struct watchdog_device *, unsigned int, unsigned long);
88}; 90};
89 91
90/** struct watchdog_device - The structure that defines a watchdog device 92/** struct watchdog_device - The structure that defines a watchdog device