提交 ceea0c14 编写于 作者: R Robert Hancock 提交者: Stefano Babic

watchdog: imx: Add DT ext-reset handling

The Linux imx2_wdt driver uses a fsl,ext-reset-output boolean in the
device tree to specify whether the board design should use the external
reset instead of the internal reset. Use this boolean to determine which
mode to use rather than using external reset unconditionally.

For the legacy non-DM mode, the external reset is always used in order
to maintain the previous behavior.
Signed-off-by: NRobert Hancock <hancock@sedsystems.ca>
上级 6b4339d3
......@@ -47,9 +47,10 @@ static void imx_watchdog_reset(struct watchdog_regs *wdog)
#endif /* CONFIG_WATCHDOG_RESET_DISABLE*/
}
static void imx_watchdog_init(struct watchdog_regs *wdog)
static void imx_watchdog_init(struct watchdog_regs *wdog, bool ext_reset)
{
u16 timeout;
u16 wcr;
/*
* The timer watchdog can be set between
......@@ -61,11 +62,14 @@ static void imx_watchdog_init(struct watchdog_regs *wdog)
#endif
timeout = (CONFIG_WATCHDOG_TIMEOUT_MSECS / 500) - 1;
#ifdef CONFIG_FSL_LSCH2
writew((WCR_WDA | WCR_SRS | WCR_WDE) << 8 | timeout, &wdog->wcr);
wcr = (WCR_WDA | WCR_SRS | WCR_WDE) << 8 | timeout;
#else
writew(WCR_WDZST | WCR_WDBG | WCR_WDE | WCR_WDT | WCR_SRS |
WCR_WDA | SET_WCR_WT(timeout), &wdog->wcr);
wcr = WCR_WDZST | WCR_WDBG | WCR_WDE | WCR_SRS |
WCR_WDA | SET_WCR_WT(timeout);
if (ext_reset)
wcr |= WCR_WDT;
#endif /* CONFIG_FSL_LSCH2*/
writew(wcr, &wdog->wcr);
imx_watchdog_reset(wdog);
}
......@@ -81,11 +85,12 @@ void hw_watchdog_init(void)
{
struct watchdog_regs *wdog = (struct watchdog_regs *)WDOG1_BASE_ADDR;
imx_watchdog_init(wdog);
imx_watchdog_init(wdog, true);
}
#else
struct imx_wdt_priv {
void __iomem *base;
bool ext_reset;
};
static int imx_wdt_reset(struct udevice *dev)
......@@ -111,7 +116,7 @@ static int imx_wdt_start(struct udevice *dev, u64 timeout, ulong flags)
{
struct imx_wdt_priv *priv = dev_get_priv(dev);
imx_watchdog_init(priv->base);
imx_watchdog_init(priv->base, priv->ext_reset);
return 0;
}
......@@ -124,6 +129,8 @@ static int imx_wdt_probe(struct udevice *dev)
if (!priv->base)
return -ENOENT;
priv->ext_reset = dev_read_bool(dev, "fsl,ext-reset-output");
return 0;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册