#include <linux/interrupt.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/of_address.h>
#include <linux/platform_device.h>
#include <linux/regmap.h>
#include <linux/watchdog.h>
#define DRIVER_NAME "imx2-wdt"
#define IMX2_WDT_WCR 0x00
#define IMX2_WDT_WCR_WT (0xFF << 8)
#define IMX2_WDT_WCR_WDA BIT(5)
#define IMX2_WDT_WCR_SRS BIT(4)
#define IMX2_WDT_WCR_WRE BIT(3)
#define IMX2_WDT_WCR_WDE BIT(2)
#define IMX2_WDT_WCR_WDZST BIT(0)
#define IMX2_WDT_WSR 0x02
#define IMX2_WDT_SEQ1 0x5555
#define IMX2_WDT_SEQ2 0xAAAA
#define IMX2_WDT_WRSR 0x04
#define IMX2_WDT_WRSR_TOUT BIT(1)
#define IMX2_WDT_WICR 0x06
#define IMX2_WDT_WICR_WIE BIT(15)
#define IMX2_WDT_WICR_WTIS BIT(14)
#define IMX2_WDT_WICR_WICT 0xFF
#define IMX2_WDT_WMCR 0x08
#define IMX2_WDT_MAX_TIME 128
#define IMX2_WDT_DEFAULT_TIME 60
#define WDOG_SEC_TO_COUNT(s) ((s * 2 - 1) << 8)
struct watchdog_device wdog;
static bool nowayout = WATCHDOG_NOWAYOUT;
module_param(nowayout, bool, 0);
MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default="
__MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
module_param(timeout, uint, 0);
MODULE_PARM_DESC(timeout, "Watchdog timeout in seconds (default="
__MODULE_STRING(IMX2_WDT_DEFAULT_TIME) ")");
static const struct watchdog_info imx2_wdt_info = {
.identity = "imx2+ watchdog",
.options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT | WDIOF_MAGICCLOSE,
static const struct watchdog_info imx2_wdt_pretimeout_info = {
.identity = "imx2+ watchdog",
.options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT | WDIOF_MAGICCLOSE |
static int imx2_wdt_restart(struct watchdog_device *wdog, unsigned long action,