Watchdog: sp5100_tco: Move timer initialization into function
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>
This commit is contained in:
parent
5996d3601e
commit
8ed3e7523d
@ -215,6 +215,41 @@ static u32 sp5100_tco_read_pm_reg32(u8 index)
|
||||
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 device *dev,
|
||||
/* 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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user