11 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
13 #include <linux/bitops.h>
14 #include <linux/errno.h>
17 #include <linux/kernel.h>
19 #include <linux/module.h>
22 #include <linux/types.h>
23 #include <linux/watchdog.h>
26 #include <mach/hardware.h>
28 #define KS8695_TMR_OFFSET (0xF0000 + 0xE400)
29 #define KS8695_TMR_VA (KS8695_IO_VA + KS8695_TMR_OFFSET)
34 #define KS8695_TMCON (0x00)
35 #define KS8695_T0TC (0x08)
36 #define TMCON_T0EN (1 << 0)
39 #define T0TC_WATCHDOG (0xff)
41 #define WDT_DEFAULT_TIME 5
42 #define WDT_MAX_TIME 171
51 #ifdef CONFIG_WATCHDOG_NOWAYOUT
53 MODULE_PARM_DESC(nowayout,
"Watchdog cannot be stopped once started (default="
58 static unsigned long ks8695wdt_busy;
66 static inline void ks8695_wdt_stop(
void)
70 spin_lock(&ks8695_lock);
74 spin_unlock(&ks8695_lock);
80 static inline void ks8695_wdt_start(
void)
85 spin_lock(&ks8695_lock);
96 spin_unlock(&ks8695_lock);
102 static inline void ks8695_wdt_reload(
void)
106 spin_lock(&ks8695_lock);
111 spin_unlock(&ks8695_lock);
117 static int ks8695_wdt_settimeout(
int new_time)
153 static int ks8695_wdt_close(
struct inode *inode,
struct file *file)
163 .identity =
"ks8695 watchdog",
170 static long ks8695_wdt_ioctl(
struct file *file,
unsigned int cmd,
180 sizeof(ks8695_wdt_info)) ? -
EFAULT : 0;
198 if (ks8695_wdt_settimeout(new_value))
214 static ssize_t ks8695_wdt_write(
struct file *file,
const char *
data,
215 size_t len, loff_t *ppos)
226 .unlocked_ioctl = ks8695_wdt_ioctl,
227 .open = ks8695_wdt_open,
228 .release = ks8695_wdt_close,
229 .write = ks8695_wdt_write,
232 static struct miscdevice ks8695wdt_miscdev = {
235 .fops = &ks8695wdt_fops,
242 if (ks8695wdt_miscdev.
parent)
250 pr_info(
"KS8695 Watchdog Timer enabled (%d seconds%s)\n",
251 wdt_time, nowayout ?
", nowayout" :
"");
287 #define ks8695wdt_suspend NULL
288 #define ks8695wdt_resume NULL
292 .probe = ks8695wdt_probe,
294 .shutdown = ks8695wdt_shutdown,
298 .name =
"ks8695_wdt",
303 static int __init ks8695_wdt_init(
void)
307 if (ks8695_wdt_settimeout(wdt_time)) {
309 pr_info(
"ks8695_wdt: wdt_time value must be 1 <= wdt_time <= %i"
315 static void __exit ks8695_wdt_exit(
void)