Source
x
/*
* Watchdog driver for Technologic Systems TS-72xx based SBCs
* (TS-7200, TS-7250 and TS-7260). These boards have external
* glue logic CPLD chip, which includes programmable watchdog
* timer.
*
* Copyright (c) 2009 Mika Westerberg <mika.westerberg@iki.fi>
*
* This driver is based on ep93xx_wdt and wm831x_wdt drivers.
*
* This file is licensed under the terms of the GNU General Public
* License version 2. This program is licensed "as is" without any
* warranty of any kind, whether express or implied.
*/
static int timeout;
module_param(timeout, int, 0);
MODULE_PARM_DESC(timeout, "Watchdog timeout in seconds.");
static bool nowayout = WATCHDOG_NOWAYOUT;
module_param(nowayout, bool, 0);
MODULE_PARM_DESC(nowayout, "Disable watchdog shutdown on close");
/* priv->control_reg */
/* priv->feed_reg */
struct ts72xx_wdt_priv {
void __iomem *control_reg;
void __iomem *feed_reg;
struct watchdog_device wdd;
unsigned char regval;
};
static int ts72xx_wdt_start(struct watchdog_device *wdd)
{
struct ts72xx_wdt_priv *priv = watchdog_get_drvdata(wdd);
writeb(TS72XX_WDT_FEED_VAL, priv->feed_reg);
writeb(priv->regval, priv->control_reg);
return 0;
}
static int ts72xx_wdt_stop(struct watchdog_device *wdd)
{
struct ts72xx_wdt_priv *priv = watchdog_get_drvdata(wdd);
writeb(TS72XX_WDT_FEED_VAL, priv->feed_reg);
writeb(TS72XX_WDT_CTRL_DISABLE, priv->control_reg);
return 0;
}
static int ts72xx_wdt_ping(struct watchdog_device *wdd)
{
struct ts72xx_wdt_priv *priv = watchdog_get_drvdata(wdd);
writeb(TS72XX_WDT_FEED_VAL, priv->feed_reg);
return 0;
}
static int ts72xx_wdt_settimeout(struct watchdog_device *wdd, unsigned int to)
{
struct ts72xx_wdt_priv *priv = watchdog_get_drvdata(wdd);
if (to == 1) {
priv->regval = TS72XX_WDT_CTRL_1SEC;
} else if (to == 2) {
priv->regval = TS72XX_WDT_CTRL_2SEC;
} else if (to <= 4) {
priv->regval = TS72XX_WDT_CTRL_4SEC;
to = 4;
} else {
priv->regval = TS72XX_WDT_CTRL_8SEC;