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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/arch/mips/philips/nino/setup.c
  3.  *
  4.  *  Copyright (C) 2001 Steven J. Hill (sjhill@realitydiluted.com)
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License version 2 as
  8.  * published by the Free Software Foundation.
  9.  *
  10.  *  Interrupt and exception initialization for Philips Nino.
  11.  */
  12. #include <linux/console.h>
  13. #include <linux/init.h>
  14. #include <linux/interrupt.h>
  15. #include <linux/mc146818rtc.h>
  16. #include <linux/sched.h>
  17. #include <asm/addrspace.h>
  18. #include <asm/gdb-stub.h>
  19. #include <asm/irq.h>
  20. #include <asm/wbflush.h>
  21. #include <asm/tx3912.h>
  22. extern struct rtc_ops nino_rtc_ops;
  23. extern void nino_wait(void);
  24. extern void setup_nino_reset_vectors(void);
  25. extern asmlinkage void nino_handle_int(void);
  26. extern int setup_nino_irq(int, struct irqaction *);
  27. void (*board_time_init) (struct irqaction * irq);
  28. #ifdef CONFIG_REMOTE_DEBUG
  29. extern void set_debug_traps(void);
  30. extern void breakpoint(void);
  31. static int remote_debug = 0;
  32. #endif
  33. static void __init nino_irq_setup(void)
  34. {
  35. unsigned int tmp;
  36. /* Turn all interrupts off */
  37. IntEnable1 = 0;
  38. IntEnable2 = 0;
  39. IntEnable3 = 0;
  40. IntEnable4 = 0;
  41. IntEnable5 = 0;
  42. IntEnable6 = 0;
  43. /* Clear all interrupts */
  44. IntClear1 = 0xffffffff;
  45. IntClear2 = 0xffffffff;
  46. IntClear3 = 0xffffffff;
  47. IntClear4 = 0xffffffff;
  48. IntClear5 = 0xffffffff;
  49. IntClear6 = 0xffffffff;
  50. /*
  51.  * Enable only the interrupts for the UART and negative
  52.  * edge (1-to-0) triggered multi-function I/O pins.
  53.  */
  54.      change_cp0_status(ST0_BEV, 0);
  55. tmp = read_32bit_cp0_register(CP0_STATUS);
  56.      change_cp0_status(ST0_IM, tmp | IE_IRQ2 | IE_IRQ4);
  57. /* Register the global interrupt handler */
  58. set_except_vector(0, nino_handle_int);
  59. #ifdef CONFIG_REMOTE_DEBUG
  60. if (remote_debug) {
  61. set_debug_traps();
  62. breakpoint();
  63. }
  64. #endif
  65. }
  66. static __init void nino_time_init(struct irqaction *irq)
  67. {
  68. unsigned int scratch = 0;
  69. /*
  70.  * Enable periodic interrupts
  71.  */
  72. setup_nino_irq(0, irq);
  73. RTCperiodTimer = PER_TIMER_COUNT;
  74. RTCtimerControl = TIM_ENPERTIMER;
  75. IntEnable5 |= INT5_PERIODICINT;
  76. scratch = inl(TX3912_CLK_CTRL_BASE);
  77. scratch |= TX3912_CLK_CTRL_ENTIMERCLK;
  78. outl(scratch, TX3912_CLK_CTRL_BASE);
  79. /* Enable all interrupts */
  80. IntEnable6 |= INT6_GLOBALEN | INT6_PERIODICINT;
  81. }
  82. void __init nino_setup(void)
  83. {
  84. irq_setup = nino_irq_setup;
  85. board_time_init = nino_time_init;
  86. /* Base address to use for PC type I/O accesses */
  87. mips_io_port_base = KSEG1ADDR(0xB0C00000);
  88. setup_nino_reset_vectors();
  89. /* Function called during process idle (cpu_idle) */
  90. cpu_wait = nino_wait;
  91. #ifdef CONFIG_FB
  92. conswitchp = &dummy_con;
  93. #endif
  94. #ifdef CONFIG_REMOTE_DEBUG
  95. remote_debug = 1;
  96. #endif
  97. rtc_ops = &nino_rtc_ops;
  98. }