* [PATCH V3 0/2] watchdog: Sysfs status read support @ 2015-09-03 3:19 Pratyush Anand 2015-09-03 3:21 ` [PATCH V3 1/2] watchdog: Use static struct class watchdog_class in stead of pointer Pratyush Anand 2015-09-03 3:22 ` Pratyush Anand 0 siblings, 2 replies; 6+ messages in thread From: Pratyush Anand @ 2015-09-03 3:19 UTC (permalink / raw) To: linux; +Cc: dyoung, dzickus, linux-watchdog, Pratyush Anand These patches provide support to read different watchdog device status through sysfs interface. Changes since V2: * Used static struct class watchdog_class in stead of pointer. It helped in keep using device_create(). * Above logic was moved to a separate patch. * Changed subject line of other patch to look more relevant Changes since V1(RFC): * Removed keepalive and start ABI * timeout is read only now * state returns text * only supported ABI visible * ABI contact changed to MAINTAINER * unnecessary mutex removed * aligned continuation with '(' * unnecessary initialization of status (= 0) corrected * unnecessary else removed * used __ATTRIBUTE_GROUPS * removed watchdog_device_create and added functionality in watchdog_dev_register. * optimized nowayout_show * Now no -EOPNOTSUPP return for timeout read in case of wdd->timeout = 0. Pratyush Anand (2): watchdog: Use static struct class watchdog_class in stead of pointer watchdog: Read device status through sysfs attributes Documentation/ABI/testing/sysfs-class-watchdog | 51 ++++++++++ drivers/watchdog/watchdog_core.c | 17 +--- drivers/watchdog/watchdog_core.h | 2 +- drivers/watchdog/watchdog_dev.c | 136 ++++++++++++++++++++++++- 4 files changed, 187 insertions(+), 19 deletions(-) create mode 100644 Documentation/ABI/testing/sysfs-class-watchdog -- 2.4.3 ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH V3 1/2] watchdog: Use static struct class watchdog_class in stead of pointer 2015-09-03 3:19 [PATCH V3 0/2] watchdog: Sysfs status read support Pratyush Anand @ 2015-09-03 3:21 ` Pratyush Anand 2015-09-03 10:42 ` Guenter Roeck 2015-09-03 3:22 ` Pratyush Anand 1 sibling, 1 reply; 6+ messages in thread From: Pratyush Anand @ 2015-09-03 3:21 UTC (permalink / raw) To: linux Cc: dyoung, dzickus, linux-watchdog, Pratyush Anand, open list, Wim Van Sebroeck We need few sysfs attributes to know different status of a watchdog device. To do that, we need to associate .dev_groups with watchdog_class. So convert it from pointer to static. Putting this static struct in watchdog_dev.c, so that static device attributes defined in that file can be attached to it. Signed-off-by: Pratyush Anand <panand@redhat.com> Suggested-by: Guenter Roeck <linux@roeck-us.net> --- drivers/watchdog/watchdog_core.c | 15 ++------------- drivers/watchdog/watchdog_core.h | 2 +- drivers/watchdog/watchdog_dev.c | 26 ++++++++++++++++++++++---- 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/drivers/watchdog/watchdog_core.c b/drivers/watchdog/watchdog_core.c index 1a8059455413..47d38c5c3f9a 100644 --- a/drivers/watchdog/watchdog_core.c +++ b/drivers/watchdog/watchdog_core.c @@ -274,19 +274,9 @@ static int __init watchdog_deferred_registration(void) static int __init watchdog_init(void) { - int err; - - watchdog_class = class_create(THIS_MODULE, "watchdog"); - if (IS_ERR(watchdog_class)) { - pr_err("couldn't create class\n"); + watchdog_class = watchdog_dev_init(); + if (IS_ERR(watchdog_class)) return PTR_ERR(watchdog_class); - } - - err = watchdog_dev_init(); - if (err < 0) { - class_destroy(watchdog_class); - return err; - } watchdog_deferred_registration(); return 0; @@ -295,7 +285,6 @@ static int __init watchdog_init(void) static void __exit watchdog_exit(void) { watchdog_dev_exit(); - class_destroy(watchdog_class); ida_destroy(&watchdog_ida); } diff --git a/drivers/watchdog/watchdog_core.h b/drivers/watchdog/watchdog_core.h index 6c951418fca7..1c8d6b0e68c7 100644 --- a/drivers/watchdog/watchdog_core.h +++ b/drivers/watchdog/watchdog_core.h @@ -33,5 +33,5 @@ */ extern int watchdog_dev_register(struct watchdog_device *); extern int watchdog_dev_unregister(struct watchdog_device *); -extern int __init watchdog_dev_init(void); +extern struct class * __init watchdog_dev_init(void); extern void __exit watchdog_dev_exit(void); diff --git a/drivers/watchdog/watchdog_dev.c b/drivers/watchdog/watchdog_dev.c index 6aaefbad303e..986282d44b90 100644 --- a/drivers/watchdog/watchdog_dev.c +++ b/drivers/watchdog/watchdog_dev.c @@ -578,18 +578,35 @@ int watchdog_dev_unregister(struct watchdog_device *watchdog) return 0; } +static struct class watchdog_class = { + .name = "watchdog", + .owner = THIS_MODULE, +}; + /* * watchdog_dev_init: init dev part of watchdog core * * Allocate a range of chardev nodes to use for watchdog devices */ -int __init watchdog_dev_init(void) +struct class * __init watchdog_dev_init(void) { - int err = alloc_chrdev_region(&watchdog_devt, 0, MAX_DOGS, "watchdog"); - if (err < 0) + int err; + + err = class_register(&watchdog_class); + if (err < 0) { + pr_err("couldn't register class\n"); + return ERR_PTR(err); + } + + err = alloc_chrdev_region(&watchdog_devt, 0, MAX_DOGS, "watchdog"); + if (err < 0) { pr_err("watchdog: unable to allocate char dev region\n"); - return err; + class_unregister(&watchdog_class); + return ERR_PTR(err); + } + + return &watchdog_class; } /* @@ -601,4 +618,5 @@ int __init watchdog_dev_init(void) void __exit watchdog_dev_exit(void) { unregister_chrdev_region(watchdog_devt, MAX_DOGS); + class_unregister(&watchdog_class); } -- 2.4.3 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH V3 1/2] watchdog: Use static struct class watchdog_class in stead of pointer 2015-09-03 3:21 ` [PATCH V3 1/2] watchdog: Use static struct class watchdog_class in stead of pointer Pratyush Anand @ 2015-09-03 10:42 ` Guenter Roeck 0 siblings, 0 replies; 6+ messages in thread From: Guenter Roeck @ 2015-09-03 10:42 UTC (permalink / raw) To: Pratyush Anand Cc: dyoung, dzickus, linux-watchdog, open list, Wim Van Sebroeck On 09/02/2015 08:21 PM, Pratyush Anand wrote: > We need few sysfs attributes to know different status of a watchdog device. > To do that, we need to associate .dev_groups with watchdog_class. So > convert it from pointer to static. > Putting this static struct in watchdog_dev.c, so that static device > attributes defined in that file can be attached to it. > > Signed-off-by: Pratyush Anand <panand@redhat.com> > Suggested-by: Guenter Roeck <linux@roeck-us.net> Reviewed-by: Guenter Roeck <linux@roeck-us.net> > --- > drivers/watchdog/watchdog_core.c | 15 ++------------- > drivers/watchdog/watchdog_core.h | 2 +- > drivers/watchdog/watchdog_dev.c | 26 ++++++++++++++++++++++---- > 3 files changed, 25 insertions(+), 18 deletions(-) > > diff --git a/drivers/watchdog/watchdog_core.c b/drivers/watchdog/watchdog_core.c > index 1a8059455413..47d38c5c3f9a 100644 > --- a/drivers/watchdog/watchdog_core.c > +++ b/drivers/watchdog/watchdog_core.c > @@ -274,19 +274,9 @@ static int __init watchdog_deferred_registration(void) > > static int __init watchdog_init(void) > { > - int err; > - > - watchdog_class = class_create(THIS_MODULE, "watchdog"); > - if (IS_ERR(watchdog_class)) { > - pr_err("couldn't create class\n"); > + watchdog_class = watchdog_dev_init(); > + if (IS_ERR(watchdog_class)) > return PTR_ERR(watchdog_class); > - } > - > - err = watchdog_dev_init(); > - if (err < 0) { > - class_destroy(watchdog_class); > - return err; > - } > > watchdog_deferred_registration(); > return 0; > @@ -295,7 +285,6 @@ static int __init watchdog_init(void) > static void __exit watchdog_exit(void) > { > watchdog_dev_exit(); > - class_destroy(watchdog_class); > ida_destroy(&watchdog_ida); > } > > diff --git a/drivers/watchdog/watchdog_core.h b/drivers/watchdog/watchdog_core.h > index 6c951418fca7..1c8d6b0e68c7 100644 > --- a/drivers/watchdog/watchdog_core.h > +++ b/drivers/watchdog/watchdog_core.h > @@ -33,5 +33,5 @@ > */ > extern int watchdog_dev_register(struct watchdog_device *); > extern int watchdog_dev_unregister(struct watchdog_device *); > -extern int __init watchdog_dev_init(void); > +extern struct class * __init watchdog_dev_init(void); > extern void __exit watchdog_dev_exit(void); > diff --git a/drivers/watchdog/watchdog_dev.c b/drivers/watchdog/watchdog_dev.c > index 6aaefbad303e..986282d44b90 100644 > --- a/drivers/watchdog/watchdog_dev.c > +++ b/drivers/watchdog/watchdog_dev.c > @@ -578,18 +578,35 @@ int watchdog_dev_unregister(struct watchdog_device *watchdog) > return 0; > } > > +static struct class watchdog_class = { > + .name = "watchdog", > + .owner = THIS_MODULE, > +}; > + > /* > * watchdog_dev_init: init dev part of watchdog core > * > * Allocate a range of chardev nodes to use for watchdog devices > */ > > -int __init watchdog_dev_init(void) > +struct class * __init watchdog_dev_init(void) > { > - int err = alloc_chrdev_region(&watchdog_devt, 0, MAX_DOGS, "watchdog"); > - if (err < 0) > + int err; > + > + err = class_register(&watchdog_class); > + if (err < 0) { > + pr_err("couldn't register class\n"); > + return ERR_PTR(err); > + } > + > + err = alloc_chrdev_region(&watchdog_devt, 0, MAX_DOGS, "watchdog"); > + if (err < 0) { > pr_err("watchdog: unable to allocate char dev region\n"); > - return err; > + class_unregister(&watchdog_class); > + return ERR_PTR(err); > + } > + > + return &watchdog_class; > } > > /* > @@ -601,4 +618,5 @@ int __init watchdog_dev_init(void) > void __exit watchdog_dev_exit(void) > { > unregister_chrdev_region(watchdog_devt, MAX_DOGS); > + class_unregister(&watchdog_class); > } > ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH V3 2/2] watchdog: Read device status through sysfs attributes @ 2015-09-03 3:22 ` Pratyush Anand 0 siblings, 0 replies; 6+ messages in thread From: Pratyush Anand @ 2015-09-03 3:22 UTC (permalink / raw) To: linux Cc: dyoung, dzickus, linux-watchdog, Pratyush Anand, open list:ABI/API, open list, Wim Van Sebroeck This patch adds following attributes to watchdog device's sysfs interface to read its different status. * state - reads whether device is active or not * identity - reads Watchdog device's identity string. * timeout - reads current timeout. * timeleft - reads timeleft before watchdog generates a reset * bootstatus - reads status of the watchdog device at boot * status - reads watchdog device's internal status bits * nowayout - reads whether nowayout feature was set or not Testing with iTCO_wdt: # cd /sys/class/watchdog/watchdog1/ # ls bootstatus dev device identity nowayout power state subsystem timeleft timeout uevent # cat identity iTCO_wdt # cat timeout 30 # cat state inactive # echo > /dev/watchdog1 # cat timeleft 26 # cat state active # cat bootstatus 0 # cat nowayout 0 Signed-off-by: Pratyush Anand <panand@redhat.com> --- Documentation/ABI/testing/sysfs-class-watchdog | 51 ++++++++++++ drivers/watchdog/watchdog_core.c | 2 +- drivers/watchdog/watchdog_dev.c | 110 +++++++++++++++++++++++++ 3 files changed, 162 insertions(+), 1 deletion(-) create mode 100644 Documentation/ABI/testing/sysfs-class-watchdog diff --git a/Documentation/ABI/testing/sysfs-class-watchdog b/Documentation/ABI/testing/sysfs-class-watchdog new file mode 100644 index 000000000000..736046b33040 --- /dev/null +++ b/Documentation/ABI/testing/sysfs-class-watchdog @@ -0,0 +1,51 @@ +What: /sys/class/watchdog/watchdogn/bootstatus +Date: August 2015 +Contact: Wim Van Sebroeck <wim@iguana.be> +Description: + It is a read only file. It contains status of the watchdog + device at boot. It is equivalent to WDIOC_GETBOOTSTATUS of + ioctl interface. + +What: /sys/class/watchdog/watchdogn/identity +Date: August 2015 +Contact: Wim Van Sebroeck <wim@iguana.be> +Description: + It is a read only file. It contains identity string of + watchdog device. + +What: /sys/class/watchdog/watchdogn/nowayout +Date: August 2015 +Contact: Wim Van Sebroeck <wim@iguana.be> +Description: + It is a read only file. While reading, it gives '1' if that + device supports nowayout feature else, it gives '0'. + +What: /sys/class/watchdog/watchdogn/state +Date: August 2015 +Contact: Wim Van Sebroeck <wim@iguana.be> +Description: + It is a read only file. It gives active/inactive status of + watchdog device. + +What: /sys/class/watchdog/watchdogn/status +Date: August 2015 +Contact: Wim Van Sebroeck <wim@iguana.be> +Description: + It is a read only file. It contains watchdog device's + internal status bits. It is equivalent to WDIOC_GETSTATUS + of ioctl interface. + +What: /sys/class/watchdog/watchdogn/timeleft +Date: August 2015 +Contact: Wim Van Sebroeck <wim@iguana.be> +Description: + It is a read only file. It contains value of time left for + reset generation. It is equivalent to WDIOC_GETTIMELEFT of + ioctl interface. + +What: /sys/class/watchdog/watchdogn/timeout +Date: August 2015 +Contact: Wim Van Sebroeck <wim@iguana.be> +Description: + It is a read only file. It is read to know about current + value of timeout programmed. diff --git a/drivers/watchdog/watchdog_core.c b/drivers/watchdog/watchdog_core.c index 47d38c5c3f9a..62666f021762 100644 --- a/drivers/watchdog/watchdog_core.c +++ b/drivers/watchdog/watchdog_core.c @@ -183,7 +183,7 @@ static int __watchdog_register_device(struct watchdog_device *wdd) devno = wdd->cdev.dev; wdd->dev = device_create(watchdog_class, wdd->parent, devno, - NULL, "watchdog%d", wdd->id); + wdd, "watchdog%d", wdd->id); if (IS_ERR(wdd->dev)) { watchdog_dev_unregister(wdd); ida_simple_remove(&watchdog_ida, id); diff --git a/drivers/watchdog/watchdog_dev.c b/drivers/watchdog/watchdog_dev.c index 986282d44b90..cbac8f88f390 100644 --- a/drivers/watchdog/watchdog_dev.c +++ b/drivers/watchdog/watchdog_dev.c @@ -248,6 +248,115 @@ out_timeleft: return err; } +static ssize_t nowayout_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct watchdog_device *wdd = dev_get_drvdata(dev); + + return sprintf(buf, "%d\n", !!test_bit(WDOG_NO_WAY_OUT, &wdd->status)); +} +static DEVICE_ATTR_RO(nowayout); + +static ssize_t status_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct watchdog_device *wdd = dev_get_drvdata(dev); + ssize_t status; + unsigned int val; + + status = watchdog_get_status(wdd, &val); + if (!status) + status = sprintf(buf, "%u\n", val); + + return status; +} +static DEVICE_ATTR_RO(status); + +static ssize_t bootstatus_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct watchdog_device *wdd = dev_get_drvdata(dev); + + return sprintf(buf, "%u\n", wdd->bootstatus); +} +static DEVICE_ATTR_RO(bootstatus); + +static ssize_t timeleft_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct watchdog_device *wdd = dev_get_drvdata(dev); + ssize_t status; + unsigned int val; + + status = watchdog_get_timeleft(wdd, &val); + if (!status) + status = sprintf(buf, "%u\n", val); + + return status; +} +static DEVICE_ATTR_RO(timeleft); + +static ssize_t timeout_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct watchdog_device *wdd = dev_get_drvdata(dev); + + return sprintf(buf, "%u\n", wdd->timeout); +} +static DEVICE_ATTR_RO(timeout); + +static ssize_t identity_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct watchdog_device *wdd = dev_get_drvdata(dev); + + return sprintf(buf, "%s\n", wdd->info->identity); +} +static DEVICE_ATTR_RO(identity); + +static ssize_t state_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct watchdog_device *wdd = dev_get_drvdata(dev); + + if (watchdog_active(wdd)) + return sprintf(buf, "active\n"); + + return sprintf(buf, "inactive\n"); +} +static DEVICE_ATTR_RO(state); + +static umode_t wdt_is_visible(struct kobject *kobj, struct attribute *attr, + int n) +{ + struct device *dev = container_of(kobj, struct device, kobj); + struct watchdog_device *wdd = dev_get_drvdata(dev); + umode_t mode = attr->mode; + + if (attr == &dev_attr_status.attr && !wdd->ops->status) + mode = 0; + else if (attr == &dev_attr_timeleft.attr && !wdd->ops->get_timeleft) + mode = 0; + + return mode; +} +static struct attribute *wdt_attrs[] = { + &dev_attr_state.attr, + &dev_attr_identity.attr, + &dev_attr_timeout.attr, + &dev_attr_timeleft.attr, + &dev_attr_bootstatus.attr, + &dev_attr_status.attr, + &dev_attr_nowayout.attr, + NULL, +}; + +static const struct attribute_group wdt_group = { + .attrs = wdt_attrs, + .is_visible = wdt_is_visible, +}; +__ATTRIBUTE_GROUPS(wdt); + /* * watchdog_ioctl_op: call the watchdog drivers ioctl op if defined * @wddev: the watchdog device to do the ioctl on @@ -581,6 +690,7 @@ int watchdog_dev_unregister(struct watchdog_device *watchdog) static struct class watchdog_class = { .name = "watchdog", .owner = THIS_MODULE, + .dev_groups = wdt_groups, }; /* -- 2.4.3 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH V3 2/2] watchdog: Read device status through sysfs attributes @ 2015-09-03 3:22 ` Pratyush Anand 0 siblings, 0 replies; 6+ messages in thread From: Pratyush Anand @ 2015-09-03 3:22 UTC (permalink / raw) To: linux-0h96xk9xTtrk1uMJSBkQmQ Cc: dyoung-H+wXaHxf7aLQT0dZR+AlfA, dzickus-H+wXaHxf7aLQT0dZR+AlfA, linux-watchdog-u79uwXL29TY76Z2rM5mHXA, Pratyush Anand, open list:ABI/API, open list, Wim Van Sebroeck This patch adds following attributes to watchdog device's sysfs interface to read its different status. * state - reads whether device is active or not * identity - reads Watchdog device's identity string. * timeout - reads current timeout. * timeleft - reads timeleft before watchdog generates a reset * bootstatus - reads status of the watchdog device at boot * status - reads watchdog device's internal status bits * nowayout - reads whether nowayout feature was set or not Testing with iTCO_wdt: # cd /sys/class/watchdog/watchdog1/ # ls bootstatus dev device identity nowayout power state subsystem timeleft timeout uevent # cat identity iTCO_wdt # cat timeout 30 # cat state inactive # echo > /dev/watchdog1 # cat timeleft 26 # cat state active # cat bootstatus 0 # cat nowayout 0 Signed-off-by: Pratyush Anand <panand-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> --- Documentation/ABI/testing/sysfs-class-watchdog | 51 ++++++++++++ drivers/watchdog/watchdog_core.c | 2 +- drivers/watchdog/watchdog_dev.c | 110 +++++++++++++++++++++++++ 3 files changed, 162 insertions(+), 1 deletion(-) create mode 100644 Documentation/ABI/testing/sysfs-class-watchdog diff --git a/Documentation/ABI/testing/sysfs-class-watchdog b/Documentation/ABI/testing/sysfs-class-watchdog new file mode 100644 index 000000000000..736046b33040 --- /dev/null +++ b/Documentation/ABI/testing/sysfs-class-watchdog @@ -0,0 +1,51 @@ +What: /sys/class/watchdog/watchdogn/bootstatus +Date: August 2015 +Contact: Wim Van Sebroeck <wim-IQzOog9fTRqzQB+pC5nmwQ@public.gmane.org> +Description: + It is a read only file. It contains status of the watchdog + device at boot. It is equivalent to WDIOC_GETBOOTSTATUS of + ioctl interface. + +What: /sys/class/watchdog/watchdogn/identity +Date: August 2015 +Contact: Wim Van Sebroeck <wim-IQzOog9fTRqzQB+pC5nmwQ@public.gmane.org> +Description: + It is a read only file. It contains identity string of + watchdog device. + +What: /sys/class/watchdog/watchdogn/nowayout +Date: August 2015 +Contact: Wim Van Sebroeck <wim-IQzOog9fTRqzQB+pC5nmwQ@public.gmane.org> +Description: + It is a read only file. While reading, it gives '1' if that + device supports nowayout feature else, it gives '0'. + +What: /sys/class/watchdog/watchdogn/state +Date: August 2015 +Contact: Wim Van Sebroeck <wim-IQzOog9fTRqzQB+pC5nmwQ@public.gmane.org> +Description: + It is a read only file. It gives active/inactive status of + watchdog device. + +What: /sys/class/watchdog/watchdogn/status +Date: August 2015 +Contact: Wim Van Sebroeck <wim-IQzOog9fTRqzQB+pC5nmwQ@public.gmane.org> +Description: + It is a read only file. It contains watchdog device's + internal status bits. It is equivalent to WDIOC_GETSTATUS + of ioctl interface. + +What: /sys/class/watchdog/watchdogn/timeleft +Date: August 2015 +Contact: Wim Van Sebroeck <wim-IQzOog9fTRqzQB+pC5nmwQ@public.gmane.org> +Description: + It is a read only file. It contains value of time left for + reset generation. It is equivalent to WDIOC_GETTIMELEFT of + ioctl interface. + +What: /sys/class/watchdog/watchdogn/timeout +Date: August 2015 +Contact: Wim Van Sebroeck <wim-IQzOog9fTRqzQB+pC5nmwQ@public.gmane.org> +Description: + It is a read only file. It is read to know about current + value of timeout programmed. diff --git a/drivers/watchdog/watchdog_core.c b/drivers/watchdog/watchdog_core.c index 47d38c5c3f9a..62666f021762 100644 --- a/drivers/watchdog/watchdog_core.c +++ b/drivers/watchdog/watchdog_core.c @@ -183,7 +183,7 @@ static int __watchdog_register_device(struct watchdog_device *wdd) devno = wdd->cdev.dev; wdd->dev = device_create(watchdog_class, wdd->parent, devno, - NULL, "watchdog%d", wdd->id); + wdd, "watchdog%d", wdd->id); if (IS_ERR(wdd->dev)) { watchdog_dev_unregister(wdd); ida_simple_remove(&watchdog_ida, id); diff --git a/drivers/watchdog/watchdog_dev.c b/drivers/watchdog/watchdog_dev.c index 986282d44b90..cbac8f88f390 100644 --- a/drivers/watchdog/watchdog_dev.c +++ b/drivers/watchdog/watchdog_dev.c @@ -248,6 +248,115 @@ out_timeleft: return err; } +static ssize_t nowayout_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct watchdog_device *wdd = dev_get_drvdata(dev); + + return sprintf(buf, "%d\n", !!test_bit(WDOG_NO_WAY_OUT, &wdd->status)); +} +static DEVICE_ATTR_RO(nowayout); + +static ssize_t status_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct watchdog_device *wdd = dev_get_drvdata(dev); + ssize_t status; + unsigned int val; + + status = watchdog_get_status(wdd, &val); + if (!status) + status = sprintf(buf, "%u\n", val); + + return status; +} +static DEVICE_ATTR_RO(status); + +static ssize_t bootstatus_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct watchdog_device *wdd = dev_get_drvdata(dev); + + return sprintf(buf, "%u\n", wdd->bootstatus); +} +static DEVICE_ATTR_RO(bootstatus); + +static ssize_t timeleft_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct watchdog_device *wdd = dev_get_drvdata(dev); + ssize_t status; + unsigned int val; + + status = watchdog_get_timeleft(wdd, &val); + if (!status) + status = sprintf(buf, "%u\n", val); + + return status; +} +static DEVICE_ATTR_RO(timeleft); + +static ssize_t timeout_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct watchdog_device *wdd = dev_get_drvdata(dev); + + return sprintf(buf, "%u\n", wdd->timeout); +} +static DEVICE_ATTR_RO(timeout); + +static ssize_t identity_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct watchdog_device *wdd = dev_get_drvdata(dev); + + return sprintf(buf, "%s\n", wdd->info->identity); +} +static DEVICE_ATTR_RO(identity); + +static ssize_t state_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct watchdog_device *wdd = dev_get_drvdata(dev); + + if (watchdog_active(wdd)) + return sprintf(buf, "active\n"); + + return sprintf(buf, "inactive\n"); +} +static DEVICE_ATTR_RO(state); + +static umode_t wdt_is_visible(struct kobject *kobj, struct attribute *attr, + int n) +{ + struct device *dev = container_of(kobj, struct device, kobj); + struct watchdog_device *wdd = dev_get_drvdata(dev); + umode_t mode = attr->mode; + + if (attr == &dev_attr_status.attr && !wdd->ops->status) + mode = 0; + else if (attr == &dev_attr_timeleft.attr && !wdd->ops->get_timeleft) + mode = 0; + + return mode; +} +static struct attribute *wdt_attrs[] = { + &dev_attr_state.attr, + &dev_attr_identity.attr, + &dev_attr_timeout.attr, + &dev_attr_timeleft.attr, + &dev_attr_bootstatus.attr, + &dev_attr_status.attr, + &dev_attr_nowayout.attr, + NULL, +}; + +static const struct attribute_group wdt_group = { + .attrs = wdt_attrs, + .is_visible = wdt_is_visible, +}; +__ATTRIBUTE_GROUPS(wdt); + /* * watchdog_ioctl_op: call the watchdog drivers ioctl op if defined * @wddev: the watchdog device to do the ioctl on @@ -581,6 +690,7 @@ int watchdog_dev_unregister(struct watchdog_device *watchdog) static struct class watchdog_class = { .name = "watchdog", .owner = THIS_MODULE, + .dev_groups = wdt_groups, }; /* -- 2.4.3 -- To unsubscribe from this list: send the line "unsubscribe linux-watchdog" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply related [flat|nested] 6+ messages in thread
[parent not found: <55E82670.2090101@roeck-us.net>]
* Re: [PATCH V3 2/2] watchdog: Read device status through sysfs attributes [not found] ` <55E82670.2090101@roeck-us.net> @ 2015-09-03 11:24 ` Pratyush Anand 0 siblings, 0 replies; 6+ messages in thread From: Pratyush Anand @ 2015-09-03 11:24 UTC (permalink / raw) To: Guenter Roeck Cc: dyoung, dzickus, linux-watchdog, ABI/API, open list, Wim Van Sebroeck On 03/09/2015:03:52:32 AM, Guenter Roeck wrote: > On 09/02/2015 08:22 PM, Pratyush Anand wrote: > >This patch adds following attributes to watchdog device's sysfs interface > >to read its different status. > > > >* state - reads whether device is active or not > >* identity - reads Watchdog device's identity string. > >* timeout - reads current timeout. > >* timeleft - reads timeleft before watchdog generates a reset > >* bootstatus - reads status of the watchdog device at boot > >* status - reads watchdog device's internal status bits > >* nowayout - reads whether nowayout feature was set or not > > > >Testing with iTCO_wdt: > > # cd /sys/class/watchdog/watchdog1/ > > # ls > >bootstatus dev device identity nowayout power state > >subsystem timeleft timeout uevent > > # cat identity > >iTCO_wdt > > # cat timeout > >30 > > # cat state > >inactive > > # echo > /dev/watchdog1 > > # cat timeleft > >26 > > # cat state > >active > > # cat bootstatus > >0 > > # cat nowayout > >0 > > > >Signed-off-by: Pratyush Anand <panand@redhat.com> > > Looks good, except for > > WARNING: please, no space before tabs > #250: FILE: drivers/watchdog/watchdog_dev.c:693: > +^I.dev_groups = ^Iwdt_groups,$ > > [ there is a space after '=' ] > > Assuming you fix that, > > Reviewed-by: Guenter Roeck <linux@roeck-us.net> > Thanks a lot for the review. I will fix it and will send it again. ~Pratyush ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2015-09-03 11:24 UTC | newest] Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2015-09-03 3:19 [PATCH V3 0/2] watchdog: Sysfs status read support Pratyush Anand 2015-09-03 3:21 ` [PATCH V3 1/2] watchdog: Use static struct class watchdog_class in stead of pointer Pratyush Anand 2015-09-03 10:42 ` Guenter Roeck 2015-09-03 3:22 ` [PATCH V3 2/2] watchdog: Read device status through sysfs attributes Pratyush Anand 2015-09-03 3:22 ` Pratyush Anand [not found] ` <55E82670.2090101@roeck-us.net> 2015-09-03 11:24 ` Pratyush Anand
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.