setup.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:5k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  arch/mips/ddb5074/setup.c -- NEC DDB Vrc-5074 setup routines
  3.  *
  4.  *  Copyright (C) 2000 Geert Uytterhoeven <geert@sonycom.com>
  5.  *                     Sony Software Development Center Europe (SDCE), Brussels
  6.  */
  7. #include <linux/config.h>
  8. #include <linux/init.h>
  9. #include <linux/kbd_ll.h>
  10. #include <linux/kernel.h>
  11. #include <linux/kdev_t.h>
  12. #include <linux/types.h>
  13. #include <linux/console.h>
  14. #include <linux/sched.h>
  15. #include <linux/mc146818rtc.h>
  16. #include <linux/pc_keyb.h>
  17. #include <linux/pci.h>
  18. #include <linux/ide.h>
  19. #include <asm/addrspace.h>
  20. #include <asm/bcache.h>
  21. #include <asm/keyboard.h>
  22. #include <asm/irq.h>
  23. #include <asm/reboot.h>
  24. #include <asm/gdb-stub.h>
  25. #include <asm/nile4.h>
  26. #include <asm/ddb5074.h>
  27. #ifdef CONFIG_REMOTE_DEBUG
  28. extern void rs_kgdb_hook(int);
  29. extern void breakpoint(void);
  30. #endif
  31. #if defined(CONFIG_SERIAL_CONSOLE)
  32. extern void console_setup(char *);
  33. #endif
  34. extern struct ide_ops std_ide_ops;
  35. extern struct rtc_ops ddb_rtc_ops;
  36. static void (*back_to_prom) (void) = (void (*)(void)) 0xbfc00000;
  37. static void ddb_machine_restart(char *command)
  38. {
  39. u32 t;
  40. /* PCI cold reset */
  41. t = nile4_in32(NILE4_PCICTRL + 4);
  42. t |= 0x40000000;
  43. nile4_out32(NILE4_PCICTRL + 4, t);
  44. /* CPU cold reset */
  45. t = nile4_in32(NILE4_CPUSTAT);
  46. t |= 1;
  47. nile4_out32(NILE4_CPUSTAT, t);
  48. /* Call the PROM */
  49. back_to_prom();
  50. }
  51. static void ddb_machine_halt(void)
  52. {
  53. printk("DDB Vrc-5074 halted.n");
  54. do {
  55. } while (1);
  56. }
  57. static void ddb_machine_power_off(void)
  58. {
  59. printk("DDB Vrc-5074 halted. Please turn off the power.n");
  60. do {
  61. } while (1);
  62. }
  63. extern void ddb_irq_setup(void);
  64. void (*board_time_init) (struct irqaction * irq);
  65. static void __init ddb_time_init(struct irqaction *irq)
  66. {
  67. /* set the clock to 1 Hz */
  68. nile4_out32(NILE4_T2CTRL, 1000000);
  69. /* enable the General-Purpose Timer */
  70. nile4_out32(NILE4_T2CTRL + 4, 0x00000001);
  71. /* reset timer */
  72. nile4_out32(NILE4_T2CNTR, 0);
  73. /* enable interrupt */
  74. nile4_enable_irq(NILE4_INT_GPT);
  75. i8259_setup_irq(nile4_to_irq(NILE4_INT_GPT), irq);
  76. change_cp0_status(ST0_IM,
  77.           IE_IRQ0 | IE_IRQ1 | IE_IRQ2 | IE_IRQ3 | IE_IRQ4);
  78. }
  79. void __init ddb_setup(void)
  80. {
  81. extern int panic_timeout;
  82. irq_setup = ddb_irq_setup;
  83. mips_io_port_base = NILE4_PCI_IO_BASE;
  84. isa_slot_offset = NILE4_PCI_MEM_BASE;
  85. request_region(0x00, 0x20, "dma1");
  86. request_region(0x40, 0x20, "timer");
  87. request_region(0x70, 0x10, "rtc");
  88. request_region(0x80, 0x10, "dma page reg");
  89. request_region(0xc0, 0x20, "dma2");
  90. board_time_init = ddb_time_init;
  91. _machine_restart = ddb_machine_restart;
  92. _machine_halt = ddb_machine_halt;
  93. _machine_power_off = ddb_machine_power_off;
  94. #ifdef CONFIG_BLK_DEV_IDE
  95. ide_ops = &std_ide_ops;
  96. #endif
  97. rtc_ops = &ddb_rtc_ops;
  98. /* Reboot on panic */
  99. panic_timeout = 180;
  100. }
  101. #define USE_NILE4_SERIAL 0
  102. #if USE_NILE4_SERIAL
  103. #define ns16550_in(reg) nile4_in8((reg)*8)
  104. #define ns16550_out(reg, val) nile4_out8((reg)*8, (val))
  105. #else
  106. #define NS16550_BASE (NILE4_PCI_IO_BASE+0x03f8)
  107. static inline u8 ns16550_in(u32 reg)
  108. {
  109. return *(volatile u8 *) (NS16550_BASE + reg);
  110. }
  111. static inline void ns16550_out(u32 reg, u8 val)
  112. {
  113. *(volatile u8 *) (NS16550_BASE + reg) = val;
  114. }
  115. #endif
  116. #define NS16550_RBR 0
  117. #define NS16550_THR 0
  118. #define NS16550_DLL 0
  119. #define NS16550_IER 1
  120. #define NS16550_DLM 1
  121. #define NS16550_FCR 2
  122. #define NS16550_IIR 2
  123. #define NS16550_LCR 3
  124. #define NS16550_MCR 4
  125. #define NS16550_LSR 5
  126. #define NS16550_MSR 6
  127. #define NS16550_SCR 7
  128. #define NS16550_LSR_DR 0x01 /* Data ready */
  129. #define NS16550_LSR_OE 0x02 /* Overrun */
  130. #define NS16550_LSR_PE 0x04 /* Parity error */
  131. #define NS16550_LSR_FE 0x08 /* Framing error */
  132. #define NS16550_LSR_BI 0x10 /* Break */
  133. #define NS16550_LSR_THRE 0x20 /* Xmit holding register empty */
  134. #define NS16550_LSR_TEMT 0x40 /* Xmitter empty */
  135. #define NS16550_LSR_ERR 0x80 /* Error */
  136. void _serinit(void)
  137. {
  138. #if USE_NILE4_SERIAL
  139. ns16550_out(NS16550_LCR, 0x80);
  140. ns16550_out(NS16550_DLM, 0x00);
  141. ns16550_out(NS16550_DLL, 0x36); /* 9600 baud */
  142. ns16550_out(NS16550_LCR, 0x00);
  143. ns16550_out(NS16550_LCR, 0x03);
  144. ns16550_out(NS16550_FCR, 0x47);
  145. #else
  146. /* done by PMON */
  147. #endif
  148. }
  149. void _putc(char c)
  150. {
  151. while (!(ns16550_in(NS16550_LSR) & NS16550_LSR_THRE));
  152. ns16550_out(NS16550_THR, c);
  153. if (c == 'n') {
  154. while (!(ns16550_in(NS16550_LSR) & NS16550_LSR_THRE));
  155. ns16550_out(NS16550_THR, 'r');
  156. }
  157. }
  158. void _puts(const char *s)
  159. {
  160. char c;
  161. while ((c = *s++))
  162. _putc(c);
  163. }
  164. char _getc(void)
  165. {
  166. while (!(ns16550_in(NS16550_LSR) & NS16550_LSR_DR));
  167. return ns16550_in(NS16550_RBR);
  168. }
  169. int _testc(void)
  170. {
  171. return (ns16550_in(NS16550_LSR) & NS16550_LSR_DR) != 0;
  172. }
  173. /*
  174.  *  Hexadecimal 7-segment LED
  175.  */
  176. void ddb5074_led_hex(int hex)
  177. {
  178. outb(hex, 0x80);
  179. }
  180. /*
  181.  *  LEDs D2 and D3, connected to the GPIO pins of the PMU in the ALi M1543
  182.  */
  183. struct pci_dev *pci_pmu = NULL;
  184. void ddb5074_led_d2(int on)
  185. {
  186. u8 t;
  187. if (pci_pmu) {
  188. pci_read_config_byte(pci_pmu, 0x7e, &t);
  189. if (on)
  190. t &= 0x7f;
  191. else
  192. t |= 0x80;
  193. pci_write_config_byte(pci_pmu, 0x7e, t);
  194. }
  195. }
  196. void ddb5074_led_d3(int on)
  197. {
  198. u8 t;
  199. if (pci_pmu) {
  200. pci_read_config_byte(pci_pmu, 0x7e, &t);
  201. if (on)
  202. t &= 0xbf;
  203. else
  204. t |= 0x40;
  205. pci_write_config_byte(pci_pmu, 0x7e, t);
  206. }
  207. }