#include <linux/reboot.h>
#include <linux/fs.h>
#include <linux/ioport.h>
+#include <linux/io.h>
+#include <linux/uaccess.h>
#include <asm/addrspace.h>
-#include <asm/io.h>
-#include <asm/uaccess.h>
-
#include <asm/ar7/ar7.h>
#define DRVNAME "ar7_wdt"
module_param(nowayout, int, 0);
MODULE_PARM_DESC(nowayout, "Disable watchdog shutdown on close");
-typedef struct {
+struct ar7_wdt {
u32 kick_lock;
u32 kick;
u32 change_lock;
- u32 change ;
+ u32 change;
u32 disable_lock;
u32 disable;
u32 prescale_lock;
u32 prescale;
-} ar7_wdt_t;
+};
static struct semaphore open_semaphore;
static unsigned expect_close;
/* XXX currently fixed, allows max margin ~68.72 secs */
-#define prescale_value 0xFFFF
+#define prescale_value 0xffff
-// Offset of the WDT registers
+/* Offset of the WDT registers */
static unsigned long ar7_regs_wdt;
-// Pointer to the remapped WDT IO space
-static ar7_wdt_t *ar7_wdt;
+/* Pointer to the remapped WDT IO space */
+static struct ar7_wdt *ar7_wdt;
static void ar7_wdt_get_regs(void)
{
- u16 chip_id = ar7_chip_id();
- switch (chip_id)
- {
- case AR7_CHIP_7100:
- case AR7_CHIP_7200:
- ar7_regs_wdt = AR7_REGS_WDT;
- break;
- default:
- ar7_regs_wdt = UR8_REGS_WDT;
- break;
- }
+ u16 chip_id = ar7_chip_id();
+ switch (chip_id) {
+ case AR7_CHIP_7100:
+ case AR7_CHIP_7200:
+ ar7_regs_wdt = AR7_REGS_WDT;
+ break;
+ default:
+ ar7_regs_wdt = UR8_REGS_WDT;
+ break;
+ }
}
-
+
+
static void ar7_wdt_kick(u32 value)
{
ar7_wdt->kick_lock = 0x5555;
if ((ar7_wdt->kick_lock & 3) == 1) {
- ar7_wdt->kick_lock = 0xAAAA;
+ ar7_wdt->kick_lock = 0xaaaa;
if ((ar7_wdt->kick_lock & 3) == 3) {
ar7_wdt->kick = value;
return;
}
- }
- printk(KERN_ERR DRVNAME ": failed to unlock WDT kick reg\n");
+ }
+ printk(KERN_ERR DRVNAME ": failed to unlock WDT kick reg\n");
}
static void ar7_wdt_prescale(u32 value)
{
- ar7_wdt->prescale_lock = 0x5A5A;
+ ar7_wdt->prescale_lock = 0x5a5a;
if ((ar7_wdt->prescale_lock & 3) == 1) {
- ar7_wdt->prescale_lock = 0xA5A5;
+ ar7_wdt->prescale_lock = 0xa5a5;
if ((ar7_wdt->prescale_lock & 3) == 3) {
ar7_wdt->prescale = value;
return;
{
ar7_wdt->change_lock = 0x6666;
if ((ar7_wdt->change_lock & 3) == 1) {
- ar7_wdt->change_lock = 0xBBBB;
+ ar7_wdt->change_lock = 0xbbbb;
if ((ar7_wdt->change_lock & 3) == 3) {
ar7_wdt->change = value;
return;
{
ar7_wdt->disable_lock = 0x7777;
if ((ar7_wdt->disable_lock & 3) == 1) {
- ar7_wdt->disable_lock = 0xCCCC;
+ ar7_wdt->disable_lock = 0xcccc;
if ((ar7_wdt->disable_lock & 3) == 2) {
- ar7_wdt->disable_lock = 0xDDDD;
+ ar7_wdt->disable_lock = 0xdddd;
if ((ar7_wdt->disable_lock & 3) == 3) {
ar7_wdt->disable = value;
return;
change = new_margin * (ar7_vbus_freq() / prescale_value);
if (change < 1) change = 1;
- if (change > 0xFFFF) change = 0xFFFF;
+ if (change > 0xffff) change = 0xffff;
ar7_wdt_change(change);
margin = change * prescale_value / ar7_vbus_freq();
printk(KERN_INFO DRVNAME
static int ar7_wdt_release(struct inode *inode, struct file *file)
{
- if (!expect_close) {
- printk(KERN_WARNING DRVNAME ": watchdog device closed unexpectedly, will not disable the watchdog timer\n");
- } else if (!nowayout) {
+ if (!expect_close)
+ printk(KERN_WARNING DRVNAME
+ ": watchdog device closed unexpectedly,"
+ "will not disable the watchdog timer\n");
+ else if (!nowayout)
ar7_wdt_disable_wdt();
- }
- up(&open_semaphore);
+
+ up(&open_semaphore);
return 0;
}
-static int ar7_wdt_notify_sys(struct notifier_block *this,
+static int ar7_wdt_notify_sys(struct notifier_block *this,
unsigned long code, void *unused)
{
if (code == SYS_HALT || code == SYS_POWER_OFF)
if (!nowayout)
ar7_wdt_disable_wdt();
- return NOTIFY_DONE;
+ return NOTIFY_DONE;
}
-static struct notifier_block ar7_wdt_notifier =
-{
+static struct notifier_block ar7_wdt_notifier = {
.notifier_call = ar7_wdt_notify_sys
};
-static ssize_t ar7_wdt_write(struct file *file, const char *data,
+static ssize_t ar7_wdt_write(struct file *file, const char *data,
size_t len, loff_t *ppos)
{
if (ppos != &file->f_pos)
return len;
}
-static int ar7_wdt_ioctl(struct inode *inode, struct file *file,
+static int ar7_wdt_ioctl(struct inode *inode, struct file *file,
unsigned int cmd, unsigned long arg)
{
static struct watchdog_info ident = {
.identity = LONGNAME,
- .firmware_version = 1,
+ .firmware_version = 1,
.options = (WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING),
};
int new_margin;
-
+
switch (cmd) {
default:
return -ENOTTY;
case WDIOC_GETSUPPORT:
- if(copy_to_user((struct watchdog_info *)arg, &ident,
+ if (copy_to_user((struct watchdog_info *)arg, &ident,
sizeof(ident)))
return -EFAULT;
return 0;
}
static struct file_operations ar7_wdt_fops = {
- .owner = THIS_MODULE,
- .write = ar7_wdt_write,
- .ioctl = ar7_wdt_ioctl,
- .open = ar7_wdt_open,
- .release = ar7_wdt_release,
+ .owner = THIS_MODULE,
+ .write = ar7_wdt_write,
+ .ioctl = ar7_wdt_ioctl,
+ .open = ar7_wdt_open,
+ .release = ar7_wdt_release,
};
static struct miscdevice ar7_wdt_miscdev = {
- .minor = WATCHDOG_MINOR,
- .name = "watchdog",
- .fops = &ar7_wdt_fops,
+ .minor = WATCHDOG_MINOR,
+ .name = "watchdog",
+ .fops = &ar7_wdt_fops,
};
static int __init ar7_wdt_init(void)
{
int rc;
-
- ar7_wdt_get_regs();
- if (!request_mem_region(ar7_regs_wdt, sizeof(ar7_wdt_t), LONGNAME)) {
+ ar7_wdt_get_regs();
+
+ if (!request_mem_region(ar7_regs_wdt, sizeof(struct ar7_wdt),
+ LONGNAME)) {
printk(KERN_WARNING DRVNAME ": watchdog I/O region busy\n");
return -EBUSY;
}
- ar7_wdt = (ar7_wdt_t *)ioremap(ar7_regs_wdt, sizeof(ar7_wdt_t));
+ ar7_wdt = (struct ar7_wdt *)
+ ioremap(ar7_regs_wdt, sizeof(struct ar7_wdt));
ar7_wdt_disable_wdt();
ar7_wdt_prescale(prescale_value);
rc = misc_register(&ar7_wdt_miscdev);
if (rc) {
- printk(KERN_ERR DRVNAME ": unable to register misc device\n");
+ printk(KERN_ERR DRVNAME ": unable to register misc device\n");
goto out_alloc;
}
rc = register_reboot_notifier(&ar7_wdt_notifier);
- if (rc) {
- printk(KERN_ERR DRVNAME ": unable to register reboot notifier\n");
+ if (rc) {
+ printk(KERN_ERR DRVNAME
+ ": unable to register reboot notifier\n");
goto out_register;
- }
+ }
goto out;
out_register:
misc_deregister(&ar7_wdt_miscdev);
out_alloc:
- release_mem_region(ar7_regs_wdt, sizeof(ar7_wdt_t));
+ release_mem_region(ar7_regs_wdt, sizeof(struct ar7_wdt));
out:
return rc;
}
static void __exit ar7_wdt_cleanup(void)
{
- unregister_reboot_notifier(&ar7_wdt_notifier);
+ unregister_reboot_notifier(&ar7_wdt_notifier);
misc_deregister(&ar7_wdt_miscdev);
- iounmap(ar7_wdt);
- release_mem_region(ar7_regs_wdt, sizeof(ar7_wdt_t));
+ iounmap(ar7_wdt);
+ release_mem_region(ar7_regs_wdt, sizeof(struct ar7_wdt));
}
module_init(ar7_wdt_init);