reset.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:2k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Cobalt Reset operations
  3.  *
  4.  * This file is subject to the terms and conditions of the GNU General Public
  5.  * License.  See the file "COPYING" in the main directory of this archive
  6.  * for more details.
  7.  *
  8.  * Copyright (C) 1995, 1996, 1997 by Ralf Baechle
  9.  * Copyright (C) 2001 by Liam Davies (ldavies@agile.tv)
  10.  *
  11.  */
  12. #include <linux/sched.h>
  13. #include <linux/mm.h>
  14. #include <asm/io.h>
  15. #include <asm/pgtable.h>
  16. #include <asm/processor.h>
  17. #include <asm/reboot.h>
  18. #include <asm/system.h>
  19. #include <asm/mipsregs.h>
  20. void cobalt_machine_restart(char *command)
  21. {
  22. *(volatile char *)0xbc000000 = 0x0f;
  23. /*
  24.  * Ouch, we're still alive ... This time we take the silver bullet ...
  25.  * ... and find that we leave the hardware in a state in which the
  26.  * kernel in the flush locks up somewhen during of after the PCI
  27.  * detection stuff.
  28.  */
  29. set_cp0_status(ST0_BEV | ST0_ERL);
  30. change_cp0_config(CONF_CM_CMASK, CONF_CM_UNCACHED);
  31. flush_cache_all();
  32. write_32bit_cp0_register(CP0_WIRED, 0);
  33. __asm__ __volatile__(
  34. "jrt%0"
  35. :
  36. : "r" (0xbfc00000));
  37. }
  38. extern int led_state;
  39. #define kLED            0xBC000000
  40. #define LEDSet(x)       (*(volatile unsigned char *) kLED) = (( unsigned char)x)
  41. void cobalt_machine_halt(void)
  42. {
  43. int mark;
  44. /* Blink our cute? little LED (number 3)... */
  45. while (1) {
  46. led_state = led_state | ( 1 << 3 );
  47. LEDSet(led_state);
  48. mark = jiffies;
  49. while (jiffies<(mark+HZ));
  50. led_state = led_state & ~( 1 << 3 );
  51. LEDSet(led_state);
  52. mark = jiffies;
  53. while (jiffies<(mark+HZ));
  54. }
  55. }
  56. /*
  57.  * This triggers the luser mode device driver for the power switch ;-)
  58.  */
  59. void cobalt_machine_power_off(void)
  60. {
  61. printk("You can switch the machine off now.n");
  62. cobalt_machine_halt();
  63. }