Skip to content

Commit

Permalink
[PATCH] ARM: 2833/2: Remove support for WDIOF_MAGICCLOSE from sa1100-wdt
Browse files Browse the repository at this point in the history
Patch from Ian Campbell

On PXA255 there is no way to disable the watchdog. Turning off OIER[E3]
as suggested in the existing comment does not work.

I posted a note to the ARM mailing list a little while ago asking for
opinions from people using SA1100. There was one reponse from Nico who
believes that the SA1100 is the same as the PXA255 in this respect.

You also asked me to involve the watchdog maintainer which I tried to
do but didn't hear anything back. There are only a couple of other
drivers which can't stop the watchdog and there seems to be no
consistancy regarding printing an error etc. I decided to print
something since that matches the case for all the other drivers when
NOWAYOUT is turned on.

Also, I changed the device .name to "watchdog" like most of the other
watchdogs. udev uses it as the device name (by default) and spaces etc.
get in the way.

Superceded 2833/1 because 2.6.13-rc4 caused rejects.

Signed-off-by: Ian Campbell <icampbell@arcom.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
  • Loading branch information
Ian Campbell authored and Russell King committed Aug 3, 2005
1 parent 8c741ed commit 9bbd037
Showing 1 changed file with 10 additions and 39 deletions.
49 changes: 10 additions & 39 deletions 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 9bbd037

Please sign in to comment.