Message ID | 20220826181921.3899603-1-saproj@gmail.com |
---|---|
State | Superseded |
Headers | show |
Series | watchdog: ftwdt010_wdt: implement _restart() function | expand |
On Fri, Aug 26, 2022 at 09:19:21PM +0300, Sergei Antonov wrote: > Implement ftwdt010_wdt_restart(). It enables watchdog with timeout = 0 > and disabled IRQ. Since it needs code similar to ftwdt010_wdt_start(), > add a new function ftwdt010_enable() and move common code there. > > Signed-off-by: Sergei Antonov <saproj@gmail.com> v2 ? Change log ? Guenter > --- > drivers/watchdog/ftwdt010_wdt.c | 23 +++++++++++++++++++---- > 1 file changed, 19 insertions(+), 4 deletions(-) > > diff --git a/drivers/watchdog/ftwdt010_wdt.c b/drivers/watchdog/ftwdt010_wdt.c > index 21dcc7765688..0a5bbfd2823f 100644 > --- a/drivers/watchdog/ftwdt010_wdt.c > +++ b/drivers/watchdog/ftwdt010_wdt.c > @@ -47,21 +47,28 @@ struct ftwdt010_wdt *to_ftwdt010_wdt(struct watchdog_device *wdd) > return container_of(wdd, struct ftwdt010_wdt, wdd); > } > > -static int ftwdt010_wdt_start(struct watchdog_device *wdd) > +static void ftwdt010_enable(struct ftwdt010_wdt *gwdt, > + unsigned int timeout, > + bool need_irq) > { > - struct ftwdt010_wdt *gwdt = to_ftwdt010_wdt(wdd); > u32 enable; > > - writel(wdd->timeout * WDT_CLOCK, gwdt->base + FTWDT010_WDLOAD); > + writel(timeout * WDT_CLOCK, gwdt->base + FTWDT010_WDLOAD); > writel(WDRESTART_MAGIC, gwdt->base + FTWDT010_WDRESTART); > /* set clock before enabling */ > enable = WDCR_CLOCK_5MHZ | WDCR_SYS_RST; > writel(enable, gwdt->base + FTWDT010_WDCR); > - if (gwdt->has_irq) > + if (need_irq) > enable |= WDCR_WDINTR; > enable |= WDCR_ENABLE; > writel(enable, gwdt->base + FTWDT010_WDCR); > +} > > +static int ftwdt010_wdt_start(struct watchdog_device *wdd) > +{ > + struct ftwdt010_wdt *gwdt = to_ftwdt010_wdt(wdd); > + > + ftwdt010_enable(gwdt, wdd->timeout, gwdt->has_irq); > return 0; > } > > @@ -93,6 +100,13 @@ static int ftwdt010_wdt_set_timeout(struct watchdog_device *wdd, > return 0; > } > > +static int ftwdt010_wdt_restart(struct watchdog_device *wdd, > + unsigned long action, void *data) > +{ > + ftwdt010_enable(to_ftwdt010_wdt(wdd), 0, false); > + return 0; > +} > + > static irqreturn_t ftwdt010_wdt_interrupt(int irq, void *data) > { > struct ftwdt010_wdt *gwdt = data; > @@ -107,6 +121,7 @@ static const struct watchdog_ops ftwdt010_wdt_ops = { > .stop = ftwdt010_wdt_stop, > .ping = ftwdt010_wdt_ping, > .set_timeout = ftwdt010_wdt_set_timeout, > + .restart = ftwdt010_wdt_restart, > .owner = THIS_MODULE, > }; > > -- > 2.34.1 >
On Fri, 26 Aug 2022 at 23:53, Guenter Roeck <linux@roeck-us.net> wrote: > > On Fri, Aug 26, 2022 at 09:19:21PM +0300, Sergei Antonov wrote: > > Implement ftwdt010_wdt_restart(). It enables watchdog with timeout = 0 > > and disabled IRQ. Since it needs code similar to ftwdt010_wdt_start(), > > add a new function ftwdt010_enable() and move common code there. > > > > Signed-off-by: Sergei Antonov <saproj@gmail.com> > > v2 ? Change log ? OK. Just sent a patch with the same code, but v2 and updated description.
diff --git a/drivers/watchdog/ftwdt010_wdt.c b/drivers/watchdog/ftwdt010_wdt.c index 21dcc7765688..0a5bbfd2823f 100644 --- a/drivers/watchdog/ftwdt010_wdt.c +++ b/drivers/watchdog/ftwdt010_wdt.c @@ -47,21 +47,28 @@ struct ftwdt010_wdt *to_ftwdt010_wdt(struct watchdog_device *wdd) return container_of(wdd, struct ftwdt010_wdt, wdd); } -static int ftwdt010_wdt_start(struct watchdog_device *wdd) +static void ftwdt010_enable(struct ftwdt010_wdt *gwdt, + unsigned int timeout, + bool need_irq) { - struct ftwdt010_wdt *gwdt = to_ftwdt010_wdt(wdd); u32 enable; - writel(wdd->timeout * WDT_CLOCK, gwdt->base + FTWDT010_WDLOAD); + writel(timeout * WDT_CLOCK, gwdt->base + FTWDT010_WDLOAD); writel(WDRESTART_MAGIC, gwdt->base + FTWDT010_WDRESTART); /* set clock before enabling */ enable = WDCR_CLOCK_5MHZ | WDCR_SYS_RST; writel(enable, gwdt->base + FTWDT010_WDCR); - if (gwdt->has_irq) + if (need_irq) enable |= WDCR_WDINTR; enable |= WDCR_ENABLE; writel(enable, gwdt->base + FTWDT010_WDCR); +} +static int ftwdt010_wdt_start(struct watchdog_device *wdd) +{ + struct ftwdt010_wdt *gwdt = to_ftwdt010_wdt(wdd); + + ftwdt010_enable(gwdt, wdd->timeout, gwdt->has_irq); return 0; } @@ -93,6 +100,13 @@ static int ftwdt010_wdt_set_timeout(struct watchdog_device *wdd, return 0; } +static int ftwdt010_wdt_restart(struct watchdog_device *wdd, + unsigned long action, void *data) +{ + ftwdt010_enable(to_ftwdt010_wdt(wdd), 0, false); + return 0; +} + static irqreturn_t ftwdt010_wdt_interrupt(int irq, void *data) { struct ftwdt010_wdt *gwdt = data; @@ -107,6 +121,7 @@ static const struct watchdog_ops ftwdt010_wdt_ops = { .stop = ftwdt010_wdt_stop, .ping = ftwdt010_wdt_ping, .set_timeout = ftwdt010_wdt_set_timeout, + .restart = ftwdt010_wdt_restart, .owner = THIS_MODULE, };
Implement ftwdt010_wdt_restart(). It enables watchdog with timeout = 0 and disabled IRQ. Since it needs code similar to ftwdt010_wdt_start(), add a new function ftwdt010_enable() and move common code there. Signed-off-by: Sergei Antonov <saproj@gmail.com> --- drivers/watchdog/ftwdt010_wdt.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-)