lkml.org 
[lkml]   [2011]   [Jul]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH 04/11] watchdog: WatchDog Timer Driver Core - Add WDIOC_SETOPTIONS ioctl

    > @@ -121,6 +171,7 @@ static long watchdog_ioctl(struct file *file, unsigned int cmd,
    > void __user *argp = (void __user *)arg;
    > int __user *p = argp;
    > unsigned int val;
    > + int err;
    >
    > switch (cmd) {
    > case WDIOC_GETSUPPORT:
    > @@ -131,6 +182,20 @@ static long watchdog_ioctl(struct file *file, unsigned int cmd,
    > return put_user(val, p);
    > case WDIOC_GETBOOTSTATUS:
    > return put_user(wdd->bootstatus, p);
    > + case WDIOC_SETOPTIONS:
    > + if (get_user(val, p))
    > + return -EFAULT;
    > + if (val & WDIOS_DISABLECARD) {
    > + err = watchdog_stop(wdd);
    > + if (err < 0)
    > + return err;
    > + }
    > + if (val & WDIOS_ENABLECARD) {
    > + err = watchdog_start(wdd);
    > + if (err < 0)
    > + return err;
    > + }
    > + return 0;
    > case WDIOC_KEEPALIVE:
    > if (!(wdd->info->options & WDIOF_KEEPALIVEPING))
    > return -EOPNOTSUPP;
    > @@ -168,7 +233,7 @@ static int watchdog_open(struct inode *inode, struct file *file)
    > goto out;
    >
    > /* start the watchdog */
    > - err = wdd->ops->start(wdd);
    > + err = watchdog_start(wdd);

    I think we still might need open- and close-callbacks here. Some drivers turn
    on/off clocks on these operations and we can't simply move them to the
    start/stop callbacks, because the clock might be turned off via DISABLECARD
    which calls stop. And without the clock, a simple register access via
    set_timeout might lock up the machine.

    > if (err < 0)
    > goto out_mod;
    >
    > @@ -195,8 +260,8 @@ static int watchdog_release(struct inode *inode, struct file *file)
    > int err;
    >
    > /* stop the watchdog */
    > - err = wdd->ops->stop(wdd);
    > - if (err != 0) {
    > + err = watchdog_stop(wdd);
    > + if (err < 0) {
    > pr_crit("%s: watchdog did not stop!\n", wdd->info->identity);
    > watchdog_ping(wdd);
    > }
    > diff --git a/include/linux/watchdog.h b/include/linux/watchdog.h
    > index a2b639b..853387f 100644
    > --- a/include/linux/watchdog.h
    > +++ b/include/linux/watchdog.h
    > @@ -81,6 +81,7 @@ struct watchdog_device {
    > void *priv;
    > unsigned long status;
    > /* Bit numbers for status flags */
    > +#define WDOG_ACTIVE 0 /* Is the watchdog running/active */
    > #define WDOG_DEV_OPEN 1 /* Opened via /dev/watchdog ? */
    > };
    >
    > --
    > 1.7.6
    >
    > --
    > To unsubscribe from this list: send the line "unsubscribe linux-watchdog" in
    > the body of a message to majordomo@vger.kernel.org
    > More majordomo info at http://vger.kernel.org/majordomo-info.html

    --
    Pengutronix e.K. | Wolfram Sang |
    Industrial Linux Solutions | http://www.pengutronix.de/ |
    [unhandled content-type:application/pgp-signature]
    \
     
     \ /
      Last update: 2011-07-11 23:35    [W:0.041 / U:0.840 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site