mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-28 21:33:52 +00:00
Watchdog: sp5100_tco: Move timer initialization into function
commit abd71a948f
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
1 changed files with 36 additions and 29 deletions
|
@ -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…
Reference in a new issue