Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 5603
b: refs/heads/master
c: 9bbd037
h: refs/heads/master
i:
  5601: 106b0e9
  5599: 558fe11
v: v3
  • Loading branch information
Ian Campbell authored and Russell King committed Aug 3, 2005
1 parent bd22e11 commit 265012b
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 40 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 8c741ed74d121dbc97c9fb7f9a66c768d4c547c4
refs/heads/master: 9bbd03758945858c9303f3258b418b94c4ffd735
49 changes: 10 additions & 39 deletions trunk/drivers/char/watchdog/sa1100_wdt.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,10 @@
#include <asm/uaccess.h>

#define OSCR_FREQ CLOCK_TICK_RATE
#define SA1100_CLOSE_MAGIC (0x5afc4453)

static unsigned long sa1100wdt_users;
static int expect_close;
static int pre_margin;
static int boot_status;
static int nowayout = WATCHDOG_NOWAYOUT;

/*
* Allow only one person to hold it open
Expand All @@ -62,55 +59,33 @@ static int sa1100dog_open(struct inode *inode, struct file *file)
}

/*
* Shut off the timer.
* Lock it in if it's a module and we defined ...NOWAYOUT
* Oddly, the watchdog can only be enabled, but we can turn off
* the interrupt, which appears to prevent the watchdog timing out.
* The watchdog cannot be disabled.
*
* Previous comments suggested that turning off the interrupt by
* clearing OIER[E3] would prevent the watchdog timing out but this
* does not appear to be true (at least on the PXA255).
*/
static int sa1100dog_release(struct inode *inode, struct file *file)
{
OSMR3 = OSCR + pre_margin;

if (expect_close == SA1100_CLOSE_MAGIC) {
OIER &= ~OIER_E3;
} else {
printk(KERN_CRIT "WATCHDOG: WDT device closed unexpectedly. WDT will not stop!\n");
}
printk(KERN_CRIT "WATCHDOG: Device closed - timer will not stop\n");

clear_bit(1, &sa1100wdt_users);
expect_close = 0;

return 0;
}

static ssize_t sa1100dog_write(struct file *file, const char *data, size_t len, loff_t *ppos)
{
if (len) {
if (!nowayout) {
size_t i;

expect_close = 0;

for (i = 0; i != len; i++) {
char c;

if (get_user(c, data + i))
return -EFAULT;
if (c == 'V')
expect_close = SA1100_CLOSE_MAGIC;
}
}
if (len)
/* Refresh OSMR3 timer. */
OSMR3 = OSCR + pre_margin;
}

return len;
}

static struct watchdog_info ident = {
.options = WDIOF_CARDRESET | WDIOF_MAGICCLOSE |
WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING,
.identity = "SA1100 Watchdog",
.options = WDIOF_CARDRESET | WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING,
.identity = "SA1100/PXA255 Watchdog",
};

static int sa1100dog_ioctl(struct inode *inode, struct file *file,
Expand Down Expand Up @@ -172,7 +147,7 @@ static struct file_operations sa1100dog_fops =
static struct miscdevice sa1100dog_miscdev =
{
.minor = WATCHDOG_MINOR,
.name = "SA1100/PXA2xx watchdog",
.name = "watchdog",
.fops = &sa1100dog_fops,
};

Expand All @@ -194,7 +169,6 @@ static int __init sa1100dog_init(void)
if (ret == 0)
printk("SA1100/PXA2xx Watchdog Timer: timer margin %d sec\n",
margin);

return ret;
}

Expand All @@ -212,8 +186,5 @@ MODULE_DESCRIPTION("SA1100/PXA2xx Watchdog");
module_param(margin, int, 0);
MODULE_PARM_DESC(margin, "Watchdog margin in seconds (default 60s)");

module_param(nowayout, int, 0);
MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started");

MODULE_LICENSE("GPL");
MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR);

0 comments on commit 265012b

Please sign in to comment.