| From abd71a948f7aab47ca49d3e7fe6afa6c48c8aae0 Mon Sep 17 00:00:00 2001 |
| From: Terry Bowman <terry.bowman@amd.com> |
| Date: Wed, 2 Feb 2022 09:35:22 -0600 |
| Subject: Watchdog: sp5100_tco: Move timer initialization into function |
| |
| From: Terry Bowman <terry.bowman@amd.com> |
| |
| commit abd71a948f7aab47ca49d3e7fe6afa6c48c8aae0 upstream. |
| |
| Refactor driver's timer initialization into new function. This is needed |
| inorder to support adding new device layouts while using common timer |
| initialization. |
| |
| Co-developed-by: Robert Richter <rrichter@amd.com> |
| Signed-off-by: Robert Richter <rrichter@amd.com> |
| Signed-off-by: Terry Bowman <terry.bowman@amd.com> |
| Tested-by: Jean Delvare <jdelvare@suse.de> |
| Reviewed-by: Jean Delvare <jdelvare@suse.de> |
| Reviewed-by: Guenter Roeck <linux@roeck-us.net> |
| Link: https://lore.kernel.org/r/20220202153525.1693378-2-terry.bowman@amd.com |
| Signed-off-by: Guenter Roeck <linux@roeck-us.net> |
| Signed-off-by: Wim Van Sebroeck <wim@linux-watchdog.org> |
| Cc: Mario Limonciello <Mario.Limonciello@amd.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/watchdog/sp5100_tco.c | 65 +++++++++++++++++++++++------------------- |
| 1 file changed, 36 insertions(+), 29 deletions(-) |
| |
| --- a/drivers/watchdog/sp5100_tco.c |
| +++ b/drivers/watchdog/sp5100_tco.c |
| @@ -215,6 +215,41 @@ static u32 sp5100_tco_read_pm_reg32(u8 i |
| return val; |
| } |
| |
| +static int sp5100_tco_timer_init(struct sp5100_tco *tco) |
| +{ |
| + struct watchdog_device *wdd = &tco->wdd; |
| + struct device *dev = wdd->parent; |
| + u32 val; |
| + |
| + val = readl(SP5100_WDT_CONTROL(tco->tcobase)); |
| + if (val & SP5100_WDT_DISABLED) { |
| + dev_err(dev, "Watchdog hardware is disabled\n"); |
| + return -ENODEV; |
| + } |
| + |
| + /* |
| + * Save WatchDogFired status, because WatchDogFired flag is |
| + * cleared here. |
| + */ |
| + if (val & SP5100_WDT_FIRED) |
| + wdd->bootstatus = WDIOF_CARDRESET; |
| + |
| + /* Set watchdog action to reset the system */ |
| + val &= ~SP5100_WDT_ACTION_RESET; |
| + writel(val, SP5100_WDT_CONTROL(tco->tcobase)); |
| + |
| + /* Set a reasonable heartbeat before we stop the timer */ |
| + tco_timer_set_timeout(wdd, wdd->timeout); |
| + |
| + /* |
| + * Stop the TCO before we change anything so we don't race with |
| + * a zeroed timer. |
| + */ |
| + tco_timer_stop(wdd); |
| + |
| + return 0; |
| +} |
| + |
| static int sp5100_tco_setupdevice(struct device *dev, |
| struct watchdog_device *wdd) |
| { |
| @@ -340,35 +375,7 @@ static int sp5100_tco_setupdevice(struct |
| /* Setup the watchdog timer */ |
| tco_timer_enable(tco); |
| |
| - val = readl(SP5100_WDT_CONTROL(tco->tcobase)); |
| - if (val & SP5100_WDT_DISABLED) { |
| - dev_err(dev, "Watchdog hardware is disabled\n"); |
| - ret = -ENODEV; |
| - goto unreg_region; |
| - } |
| - |
| - /* |
| - * Save WatchDogFired status, because WatchDogFired flag is |
| - * cleared here. |
| - */ |
| - if (val & SP5100_WDT_FIRED) |
| - wdd->bootstatus = WDIOF_CARDRESET; |
| - /* Set watchdog action to reset the system */ |
| - val &= ~SP5100_WDT_ACTION_RESET; |
| - writel(val, SP5100_WDT_CONTROL(tco->tcobase)); |
| - |
| - /* Set a reasonable heartbeat before we stop the timer */ |
| - tco_timer_set_timeout(wdd, wdd->timeout); |
| - |
| - /* |
| - * Stop the TCO before we change anything so we don't race with |
| - * a zeroed timer. |
| - */ |
| - tco_timer_stop(wdd); |
| - |
| - release_region(SP5100_IO_PM_INDEX_REG, SP5100_PM_IOPORTS_SIZE); |
| - |
| - return 0; |
| + ret = sp5100_tco_timer_init(tco); |
| |
| unreg_region: |
| release_region(SP5100_IO_PM_INDEX_REG, SP5100_PM_IOPORTS_SIZE); |