u-boot-brain/arch/arm/mach-aspeed/ast_wdt.c
maxims@google.com 4697abea62 aspeed: Add drivers common to all Aspeed SoCs
Add support for Watchdog Timer, which is compatible with AST2400 and
AST2500 watchdogs. There is no uclass for Watchdog yet, so the driver
does not follow the driver model. It also uses fixed clock, so no clock
driver is needed.

Add support for timer for Aspeed ast2400/ast2500 devices.
The driver actually controls several devices, but because all devices
share the same Control Register, it is somewhat difficult to completely
decouple them. Since only one timer is needed at the moment, this should
be OK. The timer uses fixed clock, so does not rely on a clock driver.

Add sysreset driver, which uses watchdog timer to do resets and particular
watchdog device to use is hardcoded (0)
Reviewed-by: Simon Glass <sjg@chromium.org>
2017-01-28 14:04:27 -05:00

60 lines
1.2 KiB
C

/*
* (C) Copyright 2016 Google, Inc
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <common.h>
#include <asm/io.h>
#include <asm/arch/wdt.h>
#include <linux/err.h>
void wdt_stop(struct ast_wdt *wdt)
{
clrbits_le32(&wdt->ctrl, WDT_CTRL_EN);
}
void wdt_start(struct ast_wdt *wdt, u32 timeout)
{
writel(timeout, &wdt->counter_reload_val);
writel(WDT_COUNTER_RESTART_VAL, &wdt->counter_restart);
/*
* Setting CLK1MHZ bit is just for compatibility with ast2400 part.
* On ast2500 watchdog timer clock is fixed at 1MHz and the bit is
* read-only
*/
setbits_le32(&wdt->ctrl,
WDT_CTRL_EN | WDT_CTRL_RESET | WDT_CTRL_CLK1MHZ);
}
struct ast_wdt *ast_get_wdt(u8 wdt_number)
{
if (wdt_number > CONFIG_WDT_NUM - 1)
return ERR_PTR(-EINVAL);
return (struct ast_wdt *)(WDT_BASE +
sizeof(struct ast_wdt) * wdt_number);
}
int ast_wdt_reset_masked(struct ast_wdt *wdt, u32 mask)
{
#ifdef CONFIG_ASPEED_AST2500
if (!mask)
return -EINVAL;
writel(mask, &wdt->reset_mask);
clrbits_le32(&wdt->ctrl,
WDT_CTRL_RESET_MASK << WDT_CTRL_RESET_MODE_SHIFT);
wdt_start(wdt, 1);
/* Wait for WDT to reset */
while (readl(&wdt->ctrl) & WDT_CTRL_EN)
;
wdt_stop(wdt);
return 0;
#else
return -EINVAL;
#endif
}