move old kamikaze out of trunk - will put buildroot-ng in there as soon as all the...
[openwrt/openwrt.git] / openwrt / target / linux / x86-2.4 / patches / 002-wd1100.patch
diff --git a/openwrt/target/linux/x86-2.4/patches/002-wd1100.patch b/openwrt/target/linux/x86-2.4/patches/002-wd1100.patch
deleted file mode 100644 (file)
index 8cb2dbd..0000000
+++ /dev/null
@@ -1,417 +0,0 @@
-diff -Nur linux-2.4.29/drivers/char/Config.in linux-2.4.29_geode/drivers/char/Config.in
---- linux-2.4.29/drivers/char/Config.in        Sun Aug  8 01:26:04 2004
-+++ linux-2.4.29_geode/drivers/char/Config.in  Tue Feb 15 23:41:54 2005
-@@ -270,6 +270,7 @@
-       fi
-    fi
-    tristate '  ZF MachZ Watchdog' CONFIG_MACHZ_WDT
-+   tristate '  Embedded NatSemi SC1x00 Watchdog' CONFIG_WD1100
-    if [ "$CONFIG_SGI_IP22" = "y" ]; then
-       dep_tristate '  Indy/I2 Hardware Watchdog' CONFIG_INDYDOG $CONFIG_SGI_IP22
-    fi
-diff -Nur linux-2.4.29/drivers/char/Makefile linux-2.4.29_geode/drivers/char/Makefile
---- linux-2.4.29/drivers/char/Makefile Sun Aug  8 01:26:04 2004
-+++ linux-2.4.29_geode/drivers/char/Makefile   Tue Feb 15 23:41:54 2005
-@@ -302,6 +302,7 @@
- obj-$(CONFIG_ACQUIRE_WDT) += acquirewdt.o
- obj-$(CONFIG_ADVANTECH_WDT) += advantechwdt.o
- obj-$(CONFIG_IB700_WDT) += ib700wdt.o
-+obj-$(CONFIG_WD1100) += wd1100.o
- obj-$(CONFIG_MIXCOMWD) += mixcomwd.o
- obj-$(CONFIG_60XX_WDT) += sbc60xxwdt.o
- obj-$(CONFIG_W83877F_WDT) += w83877f_wdt.o
-diff -Nur linux-2.4.29/drivers/char/wd1100.c linux-2.4.29_geode/drivers/char/wd1100.c
---- linux-2.4.29/drivers/char/wd1100.c Thu Jan  1 01:00:00 1970
-+++ linux-2.4.29_geode/drivers/char/wd1100.c   Tue Feb 15 23:41:54 2005
-@@ -0,0 +1,391 @@
-+/*
-+ *   National Semiconductor SC1x00 CPU watchdog driver
-+ *   Copyright (c) Inprimis Technologies 2002
-+ *
-+ *   by Mark Grosberg <markg@inprimis.com>
-+ *   and Rolando Goldman <rolandog@inprimis.com>
-+ *
-+ *   Minor changes by Kianusch Sayah Karadji <kianusch@sk-tech.net>
-+ *   ( Soekris net4801 Support, module-parameter )
-+ *
-+ *   This program is free software; you can redistribute it and/or
-+ *   modify it under the terms of the GNU General Public License
-+ *   as published by the Free Software Foundation; either version
-+ *   2 of the License, or (at your option) any later version.
-+ *   
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/types.h>
-+#include <linux/kernel.h>
-+#include <linux/fs.h>
-+#include <linux/mm.h>
-+#include <linux/miscdevice.h>
-+#include <linux/watchdog.h>
-+#include <linux/spinlock.h>
-+#include <linux/sysctl.h>
-+#include <linux/pci.h>
-+
-+/* 
-+ * Since the SC1100 is an x86 clone, we don't even bother with 
-+ * allowing other architectures to compile us.
-+ */
-+#ifndef CONFIG_X86
-+# error Sorry this driver is only for x86.
-+#endif
-+
-+#include <asm/system.h>
-+#include <asm/io.h>
-+#include <asm/uaccess.h>
-+#include <asm/processor.h>
-+
-+/* #define DEBUG_WD1100 */
-+
-+static int proc_wd_timeout(ctl_table   *ctl, 
-+                           int          write,
-+                           struct file *file,
-+                           void        *buffer,
-+                           size_t      *lenp);
-+static int proc_wd_graceful(ctl_table   *ctl, 
-+                            int          write,
-+                            struct file *file,
-+                            void        *buffer,
-+                            size_t      *lenp);
-+                           
-+/* Register definitions */
-+
-+#define SC1100_F5_VENDOR_ID  0x100B
-+#define SC1100_F5_DEVICE_ID  0x0515   
-+
-+#define CPU_WDTO_REG    0x00 /* watchdog time out, 16 bit register */
-+#define CPU_WDCNFG_REG  0x02 /* watchdog config , 16 bit register */
-+#define CPU_WDSTS_REG   0x04 /* watchdog status , 8 bit register */
-+
-+/* Default timeout: 4 seconds (changeable via sysctl) */
-+static unsigned int    sysctl_wd_timeout  = 0;
-+static unsigned int    sysctl_wd_graceful = 0;
-+
-+static unsigned int    timeout  = 4;
-+static unsigned int    graceful = 1;
-+
-+MODULE_PARM (timeout,  "i");
-+MODULE_PARM (graceful, "i");
-+
-+static int             in_use    = 0;
-+static unsigned short  cpu_base;
-+static spinlock_t      wd_lock;
-+
-+/**************************************************************************/
-+
-+/* XXX To-do: DEV_WATCHDOG must be in include/linux/sysctl.h */
-+enum
-+{ DEV_WATCHDOG = 6 };
-+
-+enum
-+{
-+   DEV_WD_TIMEOUT   = 1,
-+   DEV_WD_GRACEFUL  = 2
-+};
-+
-+static struct ctl_table_header *wd_table_header;
-+
-+static ctl_table wd_table[] = {
-+   {
-+    DEV_WD_TIMEOUT, "timeout",
-+    &sysctl_wd_timeout, sizeof(int), 0644, NULL, &proc_wd_timeout
-+   },
-+   
-+   {
-+    DEV_WD_GRACEFUL, "graceful",
-+    &sysctl_wd_graceful, sizeof(int), 0644, NULL, &proc_wd_graceful
-+   },
-+
-+   {0}
-+};
-+
-+static ctl_table wd_dir_table[] = {
-+   {DEV_WATCHDOG, "wd", NULL, 0, 0555, wd_table},
-+   {0}
-+};
-+
-+static ctl_table wd_root_table[] = {
-+   {CTL_DEV, "dev", NULL, 0, 0555, wd_dir_table},
-+   {0}
-+};
-+
-+static int proc_wd_timeout(ctl_table   *ctl, 
-+                           int          write,
-+                           struct file *file,
-+                           void        *buffer,
-+                           size_t      *lenp)
-+{
-+  int   rc;
-+  
-+  rc = proc_dointvec(ctl, write, file, buffer, lenp);
-+  if (write && (rc == 0))
-+  {
-+     /* Clamp to limits. */
-+     if (sysctl_wd_timeout < 1) 
-+       sysctl_wd_timeout = 1;
-+     else if (sysctl_wd_timeout > 65535)
-+       sysctl_wd_timeout = 65535;
-+  }
-+  
-+  return (rc);
-+}
-+
-+static int proc_wd_graceful(ctl_table   *ctl, 
-+                            int          write,
-+                            struct file *file,
-+                            void        *buffer,
-+                            size_t      *lenp)
-+{
-+  int   rc;
-+  
-+  rc = proc_dointvec(ctl, write, file, buffer, lenp);
-+  if (write && (rc == 0))
-+  {
-+     /* Clamp to true/false. */
-+     if (sysctl_wd_graceful) 
-+       sysctl_wd_graceful = 1;
-+  }
-+  
-+  return (rc);
-+}                           
-+
-+/**************************************************************************/
-+
-+static __inline__ void reset_wd(void)
-+{
-+  outw(sysctl_wd_timeout * 8, cpu_base + CPU_WDTO_REG);
-+}
-+
-+static int reboot_reason(void)
-+{
-+   static int    result;
-+   static int    fetched = 0;
-+ 
-+   if (!fetched)
-+   {
-+     unsigned char sr;
-+     
-+     sr = inb(cpu_base + CPU_WDSTS_REG);
-+     outb(sr | 1, cpu_base + CPU_WDSTS_REG);
-+   
-+     fetched = 1;
-+   }
-+   
-+   return (result);
-+}
-+
-+static struct watchdog_info wd_info =
-+{
-+   0,   /* Options          */
-+   0,   /* Firmware version */
-+   "NSC SC1x00 WD"
-+};
-+
-+static int wd_ioctl(struct inode *inode, 
-+                    struct file  *file, 
-+                    unsigned int  cmd,
-+                    unsigned long arg)
-+{
-+   int  i;
-+   
-+   switch (cmd)
-+   {
-+      default:
-+        return (-ENOTTY);
-+        
-+      case WDIOC_GETSUPPORT:
-+        i = verify_area(VERIFY_WRITE, (void *)arg, sizeof(struct watchdog_info));
-+        if (i)
-+          return (i);
-+        else
-+          return copy_to_user((struct watchdog_info *)arg, 
-+                              &wd_info, 
-+                              sizeof(wd_info));
-+        break;
-+        
-+      case WDIOC_KEEPALIVE:
-+        reset_wd();
-+        return (0);
-+        
-+      case WDIOC_GETBOOTSTATUS:
-+        i = reboot_reason();
-+        return (put_user(i, (int *)arg));
-+        
-+      case WDIOC_GETSTATUS:
-+        i = inw(cpu_base + CPU_WDTO_REG) / 8;
-+        return (put_user(i, (int *)arg));
-+   }       
-+}                    
-+
-+static int wd_open(struct inode *inode, 
-+                   struct file  *file)
-+{
-+  spin_lock(&wd_lock);
-+  if (in_use)
-+  {
-+    spin_unlock(&wd_lock);
-+    return (-EBUSY);
-+  }
-+  else
-+    in_use++;
-+    
-+  spin_unlock(&wd_lock);
-+
-+  MOD_INC_USE_COUNT;
-+
-+  /*
-+   * Configure the chip to do a reset if the timer goes to 0.
-+   * Set the clock divisor to 4096.
-+   */
-+     
-+  outw(0xfc, cpu_base + CPU_WDCNFG_REG);
-+  
-+  /* Start the watchdog: It won't run until we write the TO reg. */
-+  reset_wd();
-+
-+  return (0);
-+}
-+
-+static int wd_release(struct inode *inode,
-+                       struct file  *file)
-+{
-+  spin_lock(&wd_lock);
-+    
-+  in_use = 0;
-+  
-+  /*
-+   * If graceful shutdown is not set, then don't bother to stop the
-+   * watchdog timer. This handles the scenario where the user process
-+   * that is poking the watchdog gets terminated due to some error
-+   * (say a SEGV or some VM condition). 
-+   *
-+   * In that case, the kernel would happily close the descriptor for
-+   * us and leave us in a state where we aren't watching the dog...
-+   *
-+   * To work around this, the "graceful" sysctl prevents reset of the
-+   * watchdog on close.
-+   */
-+  if (sysctl_wd_graceful)
-+    outw(0, cpu_base + CPU_WDCNFG_REG);
-+  
-+  spin_unlock(&wd_lock);
-+  MOD_DEC_USE_COUNT;
-+  
-+  return (0);
-+}           
-+
-+static ssize_t wd_write(struct file *file,
-+                        const char  *data,
-+                        size_t       len,
-+                        loff_t      *ppos)
-+{
-+  /* Device is non-seekable. */
-+  if (ppos != &file->f_pos)
-+    return (-ESPIPE);
-+  
-+  if (len > 0)
-+    reset_wd();   
-+  
-+  return (len);
-+}
-+
-+static struct file_operations wd_fops=
-+{
-+   owner:      THIS_MODULE,
-+   write:      wd_write,
-+   ioctl:      wd_ioctl,
-+   open:       wd_open,
-+   release:    wd_release,
-+};
-+ 
-+static struct miscdevice sc1x00wd_miscdev=
-+{
-+   WATCHDOG_MINOR,
-+   "watchdog",
-+   &wd_fops
-+};
-+
-+static int __init wd_init(void)
-+{
-+   int              ret;
-+   struct pci_dev  *dev;
-+   unsigned int     cw;
-+
-+   if (timeout < 1)
-+      timeout = 1;
-+   else if (timeout > 65535)
-+      timeout = 65535;
-+
-+   if (graceful != 0)
-+      graceful = 1;
-+
-+   sysctl_wd_timeout=timeout;
-+   sysctl_wd_graceful=graceful;
-+
-+   if ((strcmp(boot_cpu_data.x86_vendor_id, "Geode by NSC") != 0)
-+   ||  ((boot_cpu_data.x86_model  != 4) && boot_cpu_data.x86_model  != 9))
-+   {
-+      printk(KERN_WARNING "wd1100.c: This is not an SC1100 processor!\n");
-+      return (0);
-+   }
-+
-+   /* get the CONFIG BLOCK ADDRESS from scratch pad register */ 
-+   dev = pci_find_device(SC1100_F5_VENDOR_ID,SC1100_F5_DEVICE_ID,0);
-+   if (dev == NULL)
-+   {
-+     printk(KERN_ERR "wd1100.c: Can not find bridge device.\n");
-+     return (0);
-+   }
-+
-+   pci_read_config_dword(dev, 0x64, &cw);
-+   cpu_base = (unsigned short )cw;
-+  
-+#ifdef DEBUG_WD1100
-+   printk("wd1100.c: CPU base = 0x%X\n", (unsigned int )cpu_base);
-+#endif
-+
-+   printk(KERN_INFO "SC1x00 Watchdog driver by Inprimis Technolgies.\n");
-+   /*
-+    * We must call reboot_reason() to reset the flag in the WD.
-+    *
-+    * Even though it is available as an ioctl(), we call it during
-+    * module initialization to perform the clear. You can take out
-+    * the printk(), but don't take out the call to reboot_reason().
-+    */
-+   if (reboot_reason())
-+      printk(KERN_INFO "Last reboot was by watchdog!\n");
-+    
-+   spin_lock_init(&wd_lock);
-+        
-+   ret = misc_register(&sc1x00wd_miscdev);
-+   if (ret)
-+     printk(KERN_ERR "wd1100.c: Can't register device.\n");
-+   else
-+   {
-+     wd_table_header = register_sysctl_table(wd_root_table, 1); 
-+      if (wd_table_header == NULL)
-+        printk(KERN_ERR "wd1100.c: Can't register sysctl.\n");
-+   }
-+
-+   return 0;
-+}   
-+
-+static void __exit wd_exit(void)
-+{
-+   if (wd_table_header != NULL)
-+      unregister_sysctl_table(wd_table_header);
-+   
-+   misc_deregister(&sc1x00wd_miscdev);
-+}
-+
-+EXPORT_NO_SYMBOLS; 
-+
-+module_init(wd_init);
-+module_exit(wd_exit);
-+
-+MODULE_LICENSE("GPL");
-+