diff options
Diffstat (limited to 'arch/mips/cobalt/reset.c')
| -rw-r--r-- | arch/mips/cobalt/reset.c | 70 |
1 files changed, 27 insertions, 43 deletions
diff --git a/arch/mips/cobalt/reset.c b/arch/mips/cobalt/reset.c index 084c8e59f42..4eedd481dd0 100644 --- a/arch/mips/cobalt/reset.c +++ b/arch/mips/cobalt/reset.c @@ -8,61 +8,45 @@ * Copyright (C) 1995, 1996, 1997 by Ralf Baechle * Copyright (C) 2001 by Liam Davies (ldavies@agile.tv) */ -#include <linux/sched.h> -#include <linux/mm.h> -#include <asm/cacheflush.h> -#include <asm/io.h> +#include <linux/init.h> +#include <linux/io.h> +#include <linux/leds.h> + +#include <asm/idle.h> #include <asm/processor.h> -#include <asm/reboot.h> -#include <asm/system.h> -#include <asm/mipsregs.h> -void cobalt_machine_restart(char *command) -{ - *(volatile char *)0xbc000000 = 0x0f; +#include <cobalt.h> - /* - * 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. - */ - 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)); -} +#define RESET_PORT ((void __iomem *)CKSEG1ADDR(0x1c000000)) +#define RESET 0x0f -extern int led_state; -#define kLED 0xBC000000 -#define LEDSet(x) (*(volatile unsigned char *) kLED) = (( unsigned char)x) +DEFINE_LED_TRIGGER(power_off_led_trigger); + +static int __init ledtrig_power_off_init(void) +{ + led_trigger_register_simple("power-off", &power_off_led_trigger); + return 0; +} +device_initcall(ledtrig_power_off_init); void cobalt_machine_halt(void) { - int mark; + /* + * turn on power off LED on RaQ + */ + led_trigger_event(power_off_led_trigger, LED_FULL); - /* Blink our cute? little LED (number 3)... */ + local_irq_disable(); 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 (cpu_wait) + cpu_wait(); } } -/* - * This triggers the luser mode device driver for the power switch ;-) - */ -void cobalt_machine_power_off(void) +void cobalt_machine_restart(char *command) { - printk("You can switch the machine off now.\n"); + writeb(RESET, RESET_PORT); + + /* we should never get here */ cobalt_machine_halt(); } |
