Re: [PATCH] watchdog: Read device status through sysfs attributes for GPIO-controlled Watchdog.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 12/9/19 2:41 AM, harshal chaudhari wrote:
Hi Guenter,

Its does the same thing as WATCH_DOG_SYSFS does, but i just want to add this functionality in *gpio_wdt* driver in next release because this driver is widely used in IOT gateways, and sysfs is very useful for monitoring the watchdog device. that's it.



This doesn't make sense. All you need to do is to enable WATCHDOG_SYSFS.
NACK, sorry.

Guenter




On Mon, Dec 9, 2019 at 12:21 AM Guenter Roeck <linux@xxxxxxxxxxxx <mailto:linux@xxxxxxxxxxxx>> wrote:

    On 12/8/19 10:45 AM, harshal chaudhari wrote:
     > Hi Wim and Guenter,
     >
     > This patch adds following attributes to GPIO-controlled watchdog device's sysfs interface to read its different status.
     >
     >
    You lost me. What does this patch do that CONFIG_WATCHDOG_SYSFS doesn't do as well ?

    Guenter

     > * state - reads whether device is active or not
     >
     > * identity - reads Watchdog device's identity string.
     >
     > * timeout - reads current timeout.
     >
     > * bootstatus - reads status of the watchdog device at boot.
     >
     > * nowayout - reads whether nowayout feature was set or not.
     >
     >
     > Testing with GPIO Watchdog:
     >
     >
     > $ cat bootstatus
     >
     > 0
     >
     > $ cat identity
     >
     > GPIO Watchdog
     >
     > $ cat nowayout
     >
     > 0
     >
     > $ cat state
     >
     > inactive
     >
     > $ cat timeout
     >
     > 60
     >
     >
     > Signed-off-by: harshal chaudhari <harshalchau04@xxxxxxxxx <mailto:harshalchau04@xxxxxxxxx> <mailto:harshalchau04@xxxxxxxxx <mailto:harshalchau04@xxxxxxxxx>>>
     >
     >
     >
     > diff --git a/Documentation/devicetree/bindings/watchdog/gpio-wdt.txt b/Documentation/devicetree/bindings/watchdog/gpio-wdt.txt
     > index 198794963786..762149375280 100644
     > --- a/Documentation/devicetree/bindings/watchdog/gpio-wdt.txt
     > +++ b/Documentation/devicetree/bindings/watchdog/gpio-wdt.txt
     > @@ -26,3 +26,31 @@ Example:
     >                  hw_algo = "toggle";
     >                  hw_margin_ms = <1600>;
     >          };
     > +
     > +
     > +* Read device status through sysfs attributes
     > +
     > +  state - reads whether device is active or not
     > +
     > +       It is a read only file. It gives active/inactive status of
     > +       watchdog device.
     > +
     > +  identity - reads Watchdog device's identity string.
     > +
     > +       It is a read only file. It contains identity string of
     > +       watchdog device.
     > +
     > +  timeout - reads current timeout.
     > +       It is a read only file. It is read to know about current
     > +       value of timeout programmed.
     > +
     > +  bootstatus - reads status of the watchdog device at boot
     > +       It is a read only file. It contains status of the watchdog
     > +       device at boot. It is equivalent to WDIOC_GETBOOTSTATUS of
     > +       ioctl interface.
     > +
     > +  nowayout - reads whether nowayout feature was set or not
     > +       It is a read only file. While reading, it gives '1' if that
     > +       device supports nowayout feature else, it gives '0'.
     > +
     > +For more details refer the documents as in Documentation/ABI/testing/sysfs-class-watchdog
     >
     > diff --git a/drivers/watchdog/gpio_wdt.c b/drivers/watchdog/gpio_wdt.c
     > index 0923201ce874..d49eb77ec8f1 100644
     > --- a/drivers/watchdog/gpio_wdt.c
     > +++ b/drivers/watchdog/gpio_wdt.c
     > @@ -90,6 +90,68 @@ static int gpio_wdt_stop(struct watchdog_device *wdd)
     >          return 0;
     >   }
     >
     > +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 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 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 struct attribute *wdt_attrs[] = {
     > +       &dev_attr_state.attr,
     > +       &dev_attr_identity.attr,
     > +       &dev_attr_timeout.attr,
     > +       &dev_attr_bootstatus.attr,
     > +       &dev_attr_nowayout.attr,
     > +       NULL,
     > +};
     > +
     > +static const struct attribute_group wdt_group = {
     > +       .attrs = wdt_attrs,
     > +};
     > +__ATTRIBUTE_GROUPS(wdt);
     > +
     >   static const struct watchdog_info gpio_wdt_ident = {
     >          .options        = WDIOF_MAGICCLOSE | WDIOF_KEEPALIVEPING |
     >                            WDIOF_SETTIMEOUT,
     > @@ -155,6 +217,7 @@ static int gpio_wdt_probe(struct platform_device *pdev)
     >          priv->wdd.max_hw_heartbeat_ms = hw_margin;
     >          priv->wdd.parent        = dev;
     >          priv->wdd.timeout       = SOFT_TIMEOUT_DEF;
     > +       priv->wdd.groups        = wdt_groups;
     >
     >          watchdog_init_timeout(&priv->wdd, 0, dev);
     >          watchdog_set_nowayout(&priv->wdd, nowayout);
     >
     >
     >





[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux