watchdog: Add support for WDIOC_GETTIMELEFT IOCTL in watchdog core
This patch adds support for WDIOC_GETTIMELEFT IOCTL in watchdog core. So, there is another function pointer added to struct watchdog_ops, which can be passed by drivers to support this IOCTL. Related documentation is updated too. Signed-off-by: Viresh Kumar <viresh.kumar@st.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Wim Van Sebroeck <wim@iguana.be>
This commit is contained in:
parent
2ca1606359
commit
fd7b673c92
|
@ -59,6 +59,10 @@ Here is a overview of the functions and probably needed actions:
|
||||||
WDIOC_GETTIMEOUT:
|
WDIOC_GETTIMEOUT:
|
||||||
No preparations needed
|
No preparations needed
|
||||||
|
|
||||||
|
WDIOC_GETTIMELEFT:
|
||||||
|
It needs get_timeleft() callback to be defined. Otherwise it
|
||||||
|
will return EOPNOTSUPP
|
||||||
|
|
||||||
Other IOCTLs can be served using the ioctl-callback. Note that this is mainly
|
Other IOCTLs can be served using the ioctl-callback. Note that this is mainly
|
||||||
intended for porting old drivers; new drivers should not invent private IOCTLs.
|
intended for porting old drivers; new drivers should not invent private IOCTLs.
|
||||||
Private IOCTLs are processed first. When the callback returns with
|
Private IOCTLs are processed first. When the callback returns with
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
The Linux WatchDog Timer Driver Core kernel API.
|
The Linux WatchDog Timer Driver Core kernel API.
|
||||||
===============================================
|
===============================================
|
||||||
Last reviewed: 29-Nov-2011
|
Last reviewed: 16-Mar-2012
|
||||||
|
|
||||||
Wim Van Sebroeck <wim@iguana.be>
|
Wim Van Sebroeck <wim@iguana.be>
|
||||||
|
|
||||||
|
@ -77,6 +77,7 @@ struct watchdog_ops {
|
||||||
int (*ping)(struct watchdog_device *);
|
int (*ping)(struct watchdog_device *);
|
||||||
unsigned int (*status)(struct watchdog_device *);
|
unsigned int (*status)(struct watchdog_device *);
|
||||||
int (*set_timeout)(struct watchdog_device *, unsigned int);
|
int (*set_timeout)(struct watchdog_device *, unsigned int);
|
||||||
|
unsigned int (*get_timeleft)(struct watchdog_device *);
|
||||||
long (*ioctl)(struct watchdog_device *, unsigned int, unsigned long);
|
long (*ioctl)(struct watchdog_device *, unsigned int, unsigned long);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -123,6 +124,7 @@ they are supported. These optional routines/operations are:
|
||||||
because the watchdog does not necessarily has a 1 second resolution).
|
because the watchdog does not necessarily has a 1 second resolution).
|
||||||
(Note: the WDIOF_SETTIMEOUT needs to be set in the options field of the
|
(Note: the WDIOF_SETTIMEOUT needs to be set in the options field of the
|
||||||
watchdog's info structure).
|
watchdog's info structure).
|
||||||
|
* get_timeleft: this routines returns the time that's left before a reset.
|
||||||
* ioctl: if this routine is present then it will be called first before we do
|
* ioctl: if this routine is present then it will be called first before we do
|
||||||
our own internal ioctl call handling. This routine should return -ENOIOCTLCMD
|
our own internal ioctl call handling. This routine should return -ENOIOCTLCMD
|
||||||
if a command is not supported. The parameters that are passed to the ioctl
|
if a command is not supported. The parameters that are passed to the ioctl
|
||||||
|
|
|
@ -236,6 +236,11 @@ static long watchdog_ioctl(struct file *file, unsigned int cmd,
|
||||||
if (wdd->timeout == 0)
|
if (wdd->timeout == 0)
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
return put_user(wdd->timeout, p);
|
return put_user(wdd->timeout, p);
|
||||||
|
case WDIOC_GETTIMELEFT:
|
||||||
|
if (!wdd->ops->get_timeleft)
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
|
return put_user(wdd->ops->get_timeleft(wdd), p);
|
||||||
default:
|
default:
|
||||||
return -ENOTTY;
|
return -ENOTTY;
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,6 +66,7 @@ struct watchdog_device;
|
||||||
* @ping: The routine that sends a keepalive ping to the watchdog device.
|
* @ping: The routine that sends a keepalive ping to the watchdog device.
|
||||||
* @status: The routine that shows the status of the watchdog device.
|
* @status: The routine that shows the status of the watchdog device.
|
||||||
* @set_timeout:The routine for setting the watchdog devices timeout value.
|
* @set_timeout:The routine for setting the watchdog devices timeout value.
|
||||||
|
* @get_timeleft:The routine that get's the time that's left before a reset.
|
||||||
* @ioctl: The routines that handles extra ioctl calls.
|
* @ioctl: The routines that handles extra ioctl calls.
|
||||||
*
|
*
|
||||||
* The watchdog_ops structure contains a list of low-level operations
|
* The watchdog_ops structure contains a list of low-level operations
|
||||||
|
@ -82,6 +83,7 @@ struct watchdog_ops {
|
||||||
int (*ping)(struct watchdog_device *);
|
int (*ping)(struct watchdog_device *);
|
||||||
unsigned int (*status)(struct watchdog_device *);
|
unsigned int (*status)(struct watchdog_device *);
|
||||||
int (*set_timeout)(struct watchdog_device *, unsigned int);
|
int (*set_timeout)(struct watchdog_device *, unsigned int);
|
||||||
|
unsigned int (*get_timeleft)(struct watchdog_device *);
|
||||||
long (*ioctl)(struct watchdog_device *, unsigned int, unsigned long);
|
long (*ioctl)(struct watchdog_device *, unsigned int, unsigned long);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Reference in New Issue