|
@@ -1,13 +1,13 @@
|
|
|
/* cpwd.c - driver implementation for hardware watchdog
|
|
|
* timers found on Sun Microsystems CP1400 and CP1500 boards.
|
|
|
*
|
|
|
- * This device supports both the generic Linux watchdog
|
|
|
+ * This device supports both the generic Linux watchdog
|
|
|
* interface and Solaris-compatible ioctls as best it is
|
|
|
* able.
|
|
|
*
|
|
|
* NOTE: CP1400 systems appear to have a defective intr_mask
|
|
|
* register on the PLD, preventing the disabling of
|
|
|
- * timer interrupts. We use a timer to periodically
|
|
|
+ * timer interrupts. We use a timer to periodically
|
|
|
* reset 'stopped' watchdogs on affected platforms.
|
|
|
*
|
|
|
* Copyright (c) 2000 Eric Brower (ebrower@usa.net)
|
|
@@ -43,8 +43,8 @@
|
|
|
#define WD_BLIMIT 0xFFFF
|
|
|
|
|
|
#define WD0_MINOR 212
|
|
|
-#define WD1_MINOR 213
|
|
|
-#define WD2_MINOR 214
|
|
|
+#define WD1_MINOR 213
|
|
|
+#define WD2_MINOR 214
|
|
|
|
|
|
/* Internal driver definitions. */
|
|
|
#define WD0_ID 0
|
|
@@ -91,16 +91,16 @@ struct cpwd {
|
|
|
|
|
|
static struct cpwd *cpwd_device;
|
|
|
|
|
|
-/* Sun uses Altera PLD EPF8820ATC144-4
|
|
|
+/* Sun uses Altera PLD EPF8820ATC144-4
|
|
|
* providing three hardware watchdogs:
|
|
|
*
|
|
|
- * 1) RIC - sends an interrupt when triggered
|
|
|
- * 2) XIR - asserts XIR_B_RESET when triggered, resets CPU
|
|
|
- * 3) POR - asserts POR_B_RESET when triggered, resets CPU, backplane, board
|
|
|
+ * 1) RIC - sends an interrupt when triggered
|
|
|
+ * 2) XIR - asserts XIR_B_RESET when triggered, resets CPU
|
|
|
+ * 3) POR - asserts POR_B_RESET when triggered, resets CPU, backplane, board
|
|
|
*
|
|
|
*** Timer register block definition (struct wd_timer_regblk)
|
|
|
*
|
|
|
- * dcntr and limit registers (halfword access):
|
|
|
+ * dcntr and limit registers (halfword access):
|
|
|
* -------------------
|
|
|
* | 15 | ...| 1 | 0 |
|
|
|
* -------------------
|
|
@@ -108,7 +108,8 @@ static struct cpwd *cpwd_device;
|
|
|
* -------------------
|
|
|
* dcntr - Current 16-bit downcounter value.
|
|
|
* When downcounter reaches '0' watchdog expires.
|
|
|
- * Reading this register resets downcounter with 'limit' value.
|
|
|
+ * Reading this register resets downcounter with
|
|
|
+ * 'limit' value.
|
|
|
* limit - 16-bit countdown value in 1/10th second increments.
|
|
|
* Writing this register begins countdown with input value.
|
|
|
* Reading from this register does not affect counter.
|
|
@@ -158,11 +159,11 @@ static int wd0_timeout = 0;
|
|
|
static int wd1_timeout = 0;
|
|
|
static int wd2_timeout = 0;
|
|
|
|
|
|
-module_param (wd0_timeout, int, 0);
|
|
|
+module_param(wd0_timeout, int, 0);
|
|
|
MODULE_PARM_DESC(wd0_timeout, "Default watchdog0 timeout in 1/10secs");
|
|
|
-module_param (wd1_timeout, int, 0);
|
|
|
+module_param(wd1_timeout, int, 0);
|
|
|
MODULE_PARM_DESC(wd1_timeout, "Default watchdog1 timeout in 1/10secs");
|
|
|
-module_param (wd2_timeout, int, 0);
|
|
|
+module_param(wd2_timeout, int, 0);
|
|
|
MODULE_PARM_DESC(wd2_timeout, "Default watchdog2 timeout in 1/10secs");
|
|
|
|
|
|
MODULE_AUTHOR("Eric Brower <ebrower@usa.net>");
|
|
@@ -201,9 +202,9 @@ static u8 cpwd_readb(void __iomem *addr)
|
|
|
static void cpwd_toggleintr(struct cpwd *p, int index, int enable)
|
|
|
{
|
|
|
unsigned char curregs = cpwd_readb(p->regs + PLD_IMASK);
|
|
|
- unsigned char setregs =
|
|
|
- (index == -1) ?
|
|
|
- (WD0_INTR_MASK | WD1_INTR_MASK | WD2_INTR_MASK) :
|
|
|
+ unsigned char setregs =
|
|
|
+ (index == -1) ?
|
|
|
+ (WD0_INTR_MASK | WD1_INTR_MASK | WD2_INTR_MASK) :
|
|
|
(p->devs[index].intr_mask);
|
|
|
|
|
|
if (enable == WD_INTR_ON)
|
|
@@ -303,24 +304,24 @@ static int cpwd_getstatus(struct cpwd *p, int index)
|
|
|
unsigned char ret = WD_STOPPED;
|
|
|
|
|
|
/* determine STOPPED */
|
|
|
- if (!stat)
|
|
|
+ if (!stat)
|
|
|
return ret;
|
|
|
|
|
|
/* determine EXPIRED vs FREERUN vs RUNNING */
|
|
|
else if (WD_S_EXPIRED & stat) {
|
|
|
ret = WD_EXPIRED;
|
|
|
- } else if(WD_S_RUNNING & stat) {
|
|
|
+ } else if (WD_S_RUNNING & stat) {
|
|
|
if (intr & p->devs[index].intr_mask) {
|
|
|
ret = WD_FREERUN;
|
|
|
} else {
|
|
|
/* Fudge WD_EXPIRED status for defective CP1400--
|
|
|
- * IF timer is running
|
|
|
- * AND brokenstop is set
|
|
|
+ * IF timer is running
|
|
|
+ * AND brokenstop is set
|
|
|
* AND an interrupt has been serviced
|
|
|
* we are WD_EXPIRED.
|
|
|
*
|
|
|
- * IF timer is running
|
|
|
- * AND brokenstop is set
|
|
|
+ * IF timer is running
|
|
|
+ * AND brokenstop is set
|
|
|
* AND no interrupt has been serviced
|
|
|
* we are WD_FREERUN.
|
|
|
*/
|
|
@@ -329,7 +330,8 @@ static int cpwd_getstatus(struct cpwd *p, int index)
|
|
|
if (p->devs[index].runstatus & WD_STAT_SVCD) {
|
|
|
ret = WD_EXPIRED;
|
|
|
} else {
|
|
|
- /* we could as well pretend we are expired */
|
|
|
+ /* we could as well pretend
|
|
|
+ * we are expired */
|
|
|
ret = WD_FREERUN;
|
|
|
}
|
|
|
} else {
|
|
@@ -342,7 +344,7 @@ static int cpwd_getstatus(struct cpwd *p, int index)
|
|
|
if (p->devs[index].runstatus & WD_STAT_SVCD)
|
|
|
ret |= WD_SERVICED;
|
|
|
|
|
|
- return(ret);
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
static irqreturn_t cpwd_interrupt(int irq, void *dev_id)
|
|
@@ -367,22 +369,22 @@ static int cpwd_open(struct inode *inode, struct file *f)
|
|
|
struct cpwd *p = cpwd_device;
|
|
|
|
|
|
lock_kernel();
|
|
|
- switch(iminor(inode)) {
|
|
|
- case WD0_MINOR:
|
|
|
- case WD1_MINOR:
|
|
|
- case WD2_MINOR:
|
|
|
- break;
|
|
|
+ switch (iminor(inode)) {
|
|
|
+ case WD0_MINOR:
|
|
|
+ case WD1_MINOR:
|
|
|
+ case WD2_MINOR:
|
|
|
+ break;
|
|
|
|
|
|
- default:
|
|
|
- unlock_kernel();
|
|
|
- return -ENODEV;
|
|
|
+ default:
|
|
|
+ unlock_kernel();
|
|
|
+ return -ENODEV;
|
|
|
}
|
|
|
|
|
|
/* Register IRQ on first open of device */
|
|
|
if (!p->initialized) {
|
|
|
- if (request_irq(p->irq, &cpwd_interrupt,
|
|
|
+ if (request_irq(p->irq, &cpwd_interrupt,
|
|
|
IRQF_SHARED, DRIVER_NAME, p)) {
|
|
|
- printk(KERN_ERR PFX "Cannot register IRQ %d\n",
|
|
|
+ printk(KERN_ERR PFX "Cannot register IRQ %d\n",
|
|
|
p->irq);
|
|
|
unlock_kernel();
|
|
|
return -EBUSY;
|
|
@@ -442,7 +444,7 @@ static long cpwd_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
|
|
cpwd_starttimer(p, index);
|
|
|
} else {
|
|
|
return -EINVAL;
|
|
|
- }
|
|
|
+ }
|
|
|
break;
|
|
|
|
|
|
/* Solaris-compatible IOCTLs */
|
|
@@ -458,7 +460,7 @@ static long cpwd_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
|
|
|
|
|
case WIOCSTOP:
|
|
|
if (p->enabled)
|
|
|
- return(-EINVAL);
|
|
|
+ return -EINVAL;
|
|
|
|
|
|
cpwd_stoptimer(p, index);
|
|
|
break;
|
|
@@ -493,7 +495,7 @@ static long cpwd_compat_ioctl(struct file *file, unsigned int cmd,
|
|
|
return rval;
|
|
|
}
|
|
|
|
|
|
-static ssize_t cpwd_write(struct file *file, const char __user *buf,
|
|
|
+static ssize_t cpwd_write(struct file *file, const char __user *buf,
|
|
|
size_t count, loff_t *ppos)
|
|
|
{
|
|
|
struct inode *inode = file->f_path.dentry->d_inode;
|
|
@@ -508,7 +510,7 @@ static ssize_t cpwd_write(struct file *file, const char __user *buf,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static ssize_t cpwd_read(struct file * file, char __user *buffer,
|
|
|
+static ssize_t cpwd_read(struct file *file, char __user *buffer,
|
|
|
size_t count, loff_t *ppos)
|
|
|
{
|
|
|
return -EINVAL;
|