sparc64: Implement SSTATE purely using notifiers and initcalls.
authorDavid S. Miller <davem@davemloft.net>
Tue, 2 Sep 2008 07:49:38 +0000 (00:49 -0700)
committerDavid S. Miller <davem@davemloft.net>
Tue, 2 Sep 2008 07:49:38 +0000 (00:49 -0700)
Don't clutter up the tree with sstate_blah() scattered all over the
place.

Signed-off-by: David S. Miller <davem@davemloft.net>
arch/sparc/include/asm/bugs.h
arch/sparc/include/asm/sstate.h [deleted file]
arch/sparc64/kernel/hvapi.c
arch/sparc64/kernel/reboot.c
arch/sparc64/kernel/sstate.c
arch/sparc64/mm/init.c

index e179bc12f64a478ff9d3eaba6bf337f1a27b1539..61d86bbbe2b2f5270043d9a3ee72330119f65eb0 100644 (file)
@@ -7,10 +7,6 @@
 #include <asm/cpudata.h>
 #endif
 
-#ifdef CONFIG_SPARC64
-#include <asm/sstate.h>
-#endif
-
 extern unsigned long loops_per_jiffy;
 
 static void __init check_bugs(void)
@@ -18,7 +14,4 @@ static void __init check_bugs(void)
 #if defined(CONFIG_SPARC32) && !defined(CONFIG_SMP)
        cpu_data(0).udelay_val = loops_per_jiffy;
 #endif
-#ifdef CONFIG_SPARC64
-       sstate_running();
-#endif
 }
diff --git a/arch/sparc/include/asm/sstate.h b/arch/sparc/include/asm/sstate.h
deleted file mode 100644 (file)
index a7c35db..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-#ifndef _SPARC64_SSTATE_H
-#define _SPARC64_SSTATE_H
-
-extern void sstate_booting(void);
-extern void sstate_running(void);
-extern void sstate_halt(void);
-extern void sstate_poweroff(void);
-extern void sstate_panic(void);
-extern void sstate_reboot(void);
-
-extern void sun4v_sstate_init(void);
-
-#endif /* _SPARC64_SSTATE_H */
index 691760b5b0127e5143da2bfa4056ac63e86ba238..1d272c3b574084d7c8eb52a45dae241315b10261 100644 (file)
@@ -9,7 +9,6 @@
 
 #include <asm/hypervisor.h>
 #include <asm/oplib.h>
-#include <asm/sstate.h>
 
 /* If the hypervisor indicates that the API setting
  * calls are unsupported, by returning HV_EBADTRAP or
@@ -184,8 +183,6 @@ void __init sun4v_hvapi_init(void)
        if (sun4v_hvapi_register(group, major, &minor))
                goto bad;
 
-       sun4v_sstate_init();
-
        return;
 
 bad:
index 04dd34cbb87280c31b06410e31254a889eee5113..11f2496606309d7fc90b6b90cd2bf2946e183ef4 100644 (file)
@@ -7,7 +7,6 @@
 #include <linux/module.h>
 #include <linux/pm.h>
 
-#include <asm/sstate.h>
 #include <asm/oplib.h>
 #include <asm/prom.h>
 
@@ -24,7 +23,6 @@ EXPORT_SYMBOL(pm_power_off);
 
 void machine_power_off(void)
 {
-       sstate_poweroff();
        if (strcmp(of_console_device->type, "serial") || scons_pwroff)
                prom_halt_power_off();
 
@@ -33,7 +31,6 @@ void machine_power_off(void)
 
 void machine_halt(void)
 {
-       sstate_halt();
        prom_halt();
        panic("Halt failed!");
 }
@@ -42,7 +39,6 @@ void machine_restart(char *cmd)
 {
        char *p;
 
-       sstate_reboot();
        p = strchr(reboot_command, '\n');
        if (p)
                *p = 0;
index 5b6e75b7f0526dadf4935ace3ed23d0f2353a834..8cdbe5946b43eb6afde994aea6e36e47c58f51b6 100644 (file)
@@ -1,14 +1,15 @@
 /* sstate.c: System soft state support.
  *
- * Copyright (C) 2007 David S. Miller <davem@davemloft.net>
+ * Copyright (C) 2007, 2008 David S. Miller <davem@davemloft.net>
  */
 
 #include <linux/kernel.h>
 #include <linux/notifier.h>
+#include <linux/reboot.h>
 #include <linux/init.h>
 
 #include <asm/hypervisor.h>
-#include <asm/sstate.h>
+#include <asm/spitfire.h>
 #include <asm/oplib.h>
 #include <asm/head.h>
 #include <asm/io.h>
@@ -50,31 +51,34 @@ static const char rebooting_msg[32] __attribute__((aligned(32))) =
 static const char panicing_msg[32] __attribute__((aligned(32))) =
        "Linux panicing";
 
-void sstate_booting(void)
+static int sstate_reboot_call(struct notifier_block *np, unsigned long type, void *_unused)
 {
-       do_set_sstate(HV_SOFT_STATE_TRANSITION, booting_msg);
-}
+       const char *msg;
 
-void sstate_running(void)
-{
-       do_set_sstate(HV_SOFT_STATE_NORMAL, running_msg);
-}
+       switch (type) {
+       case SYS_DOWN:
+       default:
+               msg = rebooting_msg;
+               break;
 
-void sstate_halt(void)
-{
-       do_set_sstate(HV_SOFT_STATE_TRANSITION, halting_msg);
-}
+       case SYS_HALT:
+               msg = halting_msg;
+               break;
 
-void sstate_poweroff(void)
-{
-       do_set_sstate(HV_SOFT_STATE_TRANSITION, poweroff_msg);
-}
+       case SYS_POWER_OFF:
+               msg = poweroff_msg;
+               break;
+       }
 
-void sstate_reboot(void)
-{
-       do_set_sstate(HV_SOFT_STATE_TRANSITION, rebooting_msg);
+       do_set_sstate(HV_SOFT_STATE_TRANSITION, msg);
+
+       return NOTIFY_OK;
 }
 
+static struct notifier_block sstate_reboot_notifier = {
+       .notifier_call = sstate_reboot_call,
+};
+
 static int sstate_panic_event(struct notifier_block *n, unsigned long event, void *ptr)
 {
        do_set_sstate(HV_SOFT_STATE_TRANSITION, panicing_msg);
@@ -87,18 +91,37 @@ static struct notifier_block sstate_panic_block = {
        .priority       =       INT_MAX,
 };
 
-void __init sun4v_sstate_init(void)
+static int __init sstate_init(void)
 {
        unsigned long major, minor;
 
+       if (tlb_type != hypervisor)
+               return 0;
+
        major = 1;
        minor = 0;
        if (sun4v_hvapi_register(HV_GRP_SOFT_STATE, major, &minor))
-               return;
+               return 0;
 
        hv_supports_soft_state = 1;
 
        prom_sun4v_guest_soft_state();
+
+       do_set_sstate(HV_SOFT_STATE_TRANSITION, booting_msg);
+
        atomic_notifier_chain_register(&panic_notifier_list,
                                       &sstate_panic_block);
+       register_reboot_notifier(&sstate_reboot_notifier);
+
+       return 0;
 }
+
+core_initcall(sstate_init);
+
+static int __init sstate_running(void)
+{
+       do_set_sstate(HV_SOFT_STATE_NORMAL, running_msg);
+       return 0;
+}
+
+late_initcall(sstate_running);
index 54193f2d0ab76e11f80a1c2cc87a20f98e627a47..7c3c81f60a6e57b2463a37017001e07cd1193e7c 100644 (file)
@@ -46,7 +46,6 @@
 #include <asm/tsb.h>
 #include <asm/hypervisor.h>
 #include <asm/prom.h>
-#include <asm/sstate.h>
 #include <asm/mdesc.h>
 #include <asm/cpudata.h>
 #include <asm/irq.h>
@@ -1717,8 +1716,6 @@ void __init paging_init(void)
        kern_base = (prom_boot_mapping_phys_low >> 22UL) << 22UL;
        kern_size = (unsigned long)&_end - (unsigned long)KERNBASE;
 
-       sstate_booting();
-
        /* Invalidate both kernel TSBs.  */
        memset(swapper_tsb, 0x40, sizeof(swapper_tsb));
 #ifndef CONFIG_DEBUG_PAGEALLOC