Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / arch / mips / cobalt / reset.c
index 084c8e5..753dfcc 100644 (file)
 #include <asm/reboot.h>
 #include <asm/system.h>
 #include <asm/mipsregs.h>
+#include <asm/mach-cobalt/cobalt.h>
 
-void cobalt_machine_restart(char *command)
+void cobalt_machine_halt(void)
 {
-       *(volatile char *)0xbc000000 = 0x0f;
+       int state, last, diff;
+       unsigned long mark;
 
        /*
-        * Ouch, we're still alive ... This time we take the silver bullet ...
-        * ... and find that we leave the hardware in a state in which the
-        * kernel in the flush locks up somewhen during of after the PCI
-        * detection stuff.
+        * turn off bar on Qube, flash power off LED on RaQ (0.5Hz)
+        *
+        * restart if ENTER and SELECT are pressed
         */
-       set_c0_status(ST0_BEV | ST0_ERL);
-       change_c0_config(CONF_CM_CMASK, CONF_CM_UNCACHED);
-       flush_cache_all();
-       write_c0_wired(0);
-       __asm__ __volatile__(
-               "jr\t%0"
-               :
-               : "r" (0xbfc00000));
-}
 
-extern int led_state;
-#define kLED            0xBC000000
-#define LEDSet(x)       (*(volatile unsigned char *) kLED) = (( unsigned char)x)
+       last = COBALT_KEY_PORT;
 
-void cobalt_machine_halt(void)
-{
-       int mark;
+       for (state = 0;;) {
+
+               state ^= COBALT_LED_POWER_OFF;
+               COBALT_LED_PORT = state;
+
+               diff = COBALT_KEY_PORT ^ last;
+               last ^= diff;
 
-       /* Blink our cute? little LED (number 3)... */
-       while (1) {
-               led_state = led_state | ( 1 << 3 );
-               LEDSet(led_state);
-               mark = jiffies;
-               while (jiffies<(mark+HZ));
-               led_state = led_state & ~( 1 << 3 );
-               LEDSet(led_state);
-               mark = jiffies;
-               while (jiffies<(mark+HZ));
+               if((diff & (COBALT_KEY_ENTER | COBALT_KEY_SELECT)) && !(~last & (COBALT_KEY_ENTER | COBALT_KEY_SELECT)))
+                       COBALT_LED_PORT = COBALT_LED_RESET;
+
+               for (mark = jiffies; jiffies - mark < HZ;)
+                       ;
        }
 }
 
+void cobalt_machine_restart(char *command)
+{
+       COBALT_LED_PORT = COBALT_LED_RESET;
+
+       /* we should never get here */
+       cobalt_machine_halt();
+}
+
 /*
  * This triggers the luser mode device driver for the power switch ;-)
  */