Merge branch 'core-locking-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[pandora-kernel.git] / drivers / watchdog / hpwdt.c
index 9f13b89..23885f2 100644 (file)
@@ -147,7 +147,6 @@ struct cmn_registers {
 
 static unsigned int hpwdt_nmi_decoding;
 static unsigned int allow_kdump;
-static unsigned int priority;          /* hpwdt at end of die_notify list */
 static unsigned int is_icru;
 static DEFINE_SPINLOCK(rom_lock);
 static void *cru_rom_addr;
@@ -723,28 +722,35 @@ static int __devinit hpwdt_init_nmi_decoding(struct pci_dev *dev)
        }
 
        /*
-        * If the priority is set to 1, then we will be put first on the
-        * die notify list to handle a critical NMI. The default is to
-        * be last so other users of the NMI signal can function.
+        * Only one function can register for NMI_UNKNOWN
         */
-       retval = register_nmi_handler(NMI_UNKNOWN, hpwdt_pretimeout,
-                                       (priority) ? NMI_FLAG_FIRST : 0,
-                                       "hpwdt");
-       if (retval != 0) {
-               dev_warn(&dev->dev,
-                       "Unable to register a die notifier (err=%d).\n",
-                       retval);
-               if (cru_rom_addr)
-                       iounmap(cru_rom_addr);
-       }
+       retval = register_nmi_handler(NMI_UNKNOWN, hpwdt_pretimeout, 0, "hpwdt");
+       if (retval)
+               goto error;
+       retval = register_nmi_handler(NMI_SERR, hpwdt_pretimeout, 0, "hpwdt");
+       if (retval)
+               goto error1;
+       retval = register_nmi_handler(NMI_IO_CHECK, hpwdt_pretimeout, 0, "hpwdt");
+       if (retval)
+               goto error2;
 
        dev_info(&dev->dev,
                        "HP Watchdog Timer Driver: NMI decoding initialized"
-                       ", allow kernel dump: %s (default = 0/OFF)"
-                       ", priority: %s (default = 0/LAST).\n",
-                       (allow_kdump == 0) ? "OFF" : "ON",
-                       (priority == 0) ? "LAST" : "FIRST");
+                       ", allow kernel dump: %s (default = 0/OFF)\n",
+                       (allow_kdump == 0) ? "OFF" : "ON");
        return 0;
+
+error2:
+       unregister_nmi_handler(NMI_SERR, "hpwdt");
+error1:
+       unregister_nmi_handler(NMI_UNKNOWN, "hpwdt");
+error:
+       dev_warn(&dev->dev,
+               "Unable to register a die notifier (err=%d).\n",
+               retval);
+       if (cru_rom_addr)
+               iounmap(cru_rom_addr);
+       return retval;
 }
 
 static void hpwdt_exit_nmi_decoding(void)
@@ -881,10 +887,6 @@ MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default="
 #ifdef CONFIG_HPWDT_NMI_DECODING
 module_param(allow_kdump, int, 0);
 MODULE_PARM_DESC(allow_kdump, "Start a kernel dump after NMI occurs");
-
-module_param(priority, int, 0);
-MODULE_PARM_DESC(priority, "The hpwdt driver handles NMIs first or last"
-               " (default = 0/Last)\n");
 #endif /* !CONFIG_HPWDT_NMI_DECODING */
 
 module_init(hpwdt_init);