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

Linux/Unix编程

开发平台:

Unix_Linux

  1.  /*
  2.  * linux/arch/m68k/sun3/sun3ints.c -- Sun-3(x) Linux interrupt handling code
  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. #include <linux/types.h>
  9. #include <linux/kernel.h>
  10. #include <linux/sched.h>
  11. #include <linux/kernel_stat.h>
  12. #include <linux/interrupt.h>
  13. #include <asm/segment.h>
  14. #include <asm/intersil.h>
  15. #include <asm/oplib.h>
  16. #include <asm/sun3ints.h>
  17. extern void sun3_leds (unsigned char);
  18. void sun3_disable_interrupts(void)
  19. {
  20. sun3_disable_irq(0);
  21. }
  22. void sun3_enable_interrupts(void)
  23. {
  24. sun3_enable_irq(0);
  25. }
  26. int led_pattern[8] = {
  27.        ~(0x80), ~(0x01),
  28.        ~(0x40), ~(0x02),
  29.        ~(0x20), ~(0x04),
  30.        ~(0x10), ~(0x08)
  31. };
  32. volatile unsigned char* sun3_intreg;
  33. void sun3_insert_irq(irq_node_t **list, irq_node_t *node)
  34. {
  35. }
  36. void sun3_delete_irq(irq_node_t **list, void *dev_id)
  37. {
  38. }
  39. void sun3_enable_irq(unsigned int irq)
  40. {
  41. *sun3_intreg |=  (1<<irq);
  42. }
  43. void sun3_disable_irq(unsigned int irq)
  44. {
  45. *sun3_intreg &= ~(1<<irq);
  46. }
  47. inline void sun3_do_irq(int irq, struct pt_regs *fp)
  48. {
  49. kstat.irqs[0][SYS_IRQS + irq]++;
  50. *sun3_intreg &= ~(1<<irq);
  51. *sun3_intreg |=  (1<<irq);
  52. }
  53. int sun3_get_irq_list(char *buf)
  54. {
  55. return 0;
  56. }
  57. static void sun3_int7(int irq, void *dev_id, struct pt_regs *fp)
  58. {
  59. sun3_do_irq(irq,fp);
  60. if(!(kstat.irqs[0][SYS_IRQS + irq] % 2000)) 
  61. sun3_leds(led_pattern[(kstat.irqs[0][SYS_IRQS+irq]%16000)/2000]);
  62. }
  63. static void sun3_int5(int irq, void *dev_id, struct pt_regs *fp)
  64. {
  65.         kstat.irqs[0][SYS_IRQS + irq]++;
  66. #ifdef CONFIG_SUN3
  67. intersil_clear();
  68. #endif
  69.         *sun3_intreg &= ~(1<<irq);
  70.         *sun3_intreg |=  (1<<irq);
  71. #ifdef CONFIG_SUN3
  72. intersil_clear();
  73. #endif
  74.         do_timer(fp);
  75.         if(!(kstat.irqs[0][SYS_IRQS + irq] % 20))
  76.                 sun3_leds(led_pattern[(kstat.irqs[0][SYS_IRQS+irq]%160)
  77.                 /20]);
  78. }
  79. /* handle requested ints, excepting 5 and 7, which always do the same
  80.    thing */
  81. static void *dev_ids[SYS_IRQS];
  82. static void (*sun3_inthandler[SYS_IRQS])(int, void *, struct pt_regs *) = {
  83. NULL, NULL, NULL, NULL, NULL, sun3_int5, NULL, sun3_int7
  84. };
  85. static void (*sun3_vechandler[192])(int, void *, struct pt_regs *);
  86. static void *vec_ids[192];
  87. static const char *vec_names[192];
  88. static void sun3_inthandle(int irq, void *dev_id, struct pt_regs *fp)
  89. {
  90. if(sun3_inthandler[irq] == NULL)
  91. panic ("bad interrupt %d received (id %p)n",irq, dev_id);
  92.         kstat.irqs[0][SYS_IRQS + irq]++;
  93.         *sun3_intreg &= ~(1<<irq);
  94. sun3_inthandler[irq](irq, dev_ids[irq], fp);
  95. }
  96. static void sun3_vec255(int irq, void *dev_id, struct pt_regs *fp)
  97. {
  98. // intersil_clear();
  99. }
  100. void (*sun3_default_handler[SYS_IRQS])(int, void *, struct pt_regs *) = {
  101. sun3_inthandle, sun3_inthandle, sun3_inthandle, sun3_inthandle,
  102. sun3_inthandle, sun3_int5, sun3_inthandle, sun3_int7
  103. };
  104. static const char *dev_names[SYS_IRQS] = { NULL, NULL, NULL, NULL,
  105.    NULL, "timer", NULL, NULL };
  106. void sun3_init_IRQ(void)
  107. {
  108. int i;
  109. *sun3_intreg = 1;
  110. for(i = 0; i < SYS_IRQS; i++)
  111. {
  112. if(dev_names[i])
  113. sys_request_irq(i, sun3_default_handler[i],
  114. 0, dev_names[i], NULL);
  115. }
  116. for(i = 0; i < 192; i++) 
  117. sun3_vechandler[i] = NULL;
  118. sun3_vechandler[191] = sun3_vec255;
  119. }
  120.                                 
  121. int sun3_request_irq(unsigned int irq, void (*handler)(int, void *, struct pt_regs *),
  122.                       unsigned long flags, const char *devname, void *dev_id)
  123. {
  124. if(irq < SYS_IRQS) {
  125. if(sun3_inthandler[irq] != NULL) {
  126. printk("sun3_request_irq: request for irq %d -- already taken!n", irq);
  127. return 1;
  128. }
  129. sun3_inthandler[irq] = handler;
  130. dev_ids[irq] = dev_id;
  131. dev_names[irq] = devname;
  132. /* setting devname would be nice */
  133. sys_request_irq(irq, sun3_default_handler[irq], 0, devname, NULL);
  134. return 0;
  135. } else {
  136. if((irq >= 64) && (irq <= 255)) {
  137.         int vec;
  138. vec = irq - 64;
  139. if(sun3_vechandler[vec] != NULL) {
  140. printk("sun3_request_irq: request for vec %d -- already taken!n", irq);
  141. return 1;
  142. }
  143. sun3_vechandler[vec] = handler;
  144. vec_ids[vec] = dev_id;
  145. vec_names[vec] = devname;
  146. return 0;
  147. }
  148. }
  149. printk("sun3_request_irq: invalid irq %dn", irq);
  150. return 1;
  151. }
  152.                         
  153. void sun3_free_irq(unsigned int irq, void *dev_id)
  154. {
  155. if(irq < SYS_IRQS) {
  156. if(sun3_inthandler[irq] == NULL) 
  157. panic("sun3_free_int: attempt to free unused irq %dn", irq);
  158. if(dev_ids[irq] != dev_id)
  159. panic("sun3_free_int: incorrect dev_id for irq %dn", irq);
  160. sun3_inthandler[irq] = NULL;
  161. return;
  162. } else if((irq >= 64) && (irq <= 255)) {
  163. int vec;
  164. vec = irq - 64;
  165. if(sun3_vechandler[vec] == NULL)
  166. panic("sun3_free_int: attempt to free unused vector %dn", irq);
  167. if(vec_ids[irq] != dev_id)
  168. panic("sun3_free_int: incorrect dev_id for vec %dn", irq);
  169. sun3_vechandler[vec] = NULL;
  170. return;
  171. } else {
  172. panic("sun3_free_irq: invalid irq %dn", irq);
  173. }
  174. }
  175. void sun3_process_int(int irq, struct pt_regs *regs)
  176. {
  177. if((irq >= 64) && (irq <= 255)) {
  178. int vec;
  179. vec = irq - 64;
  180. if(sun3_vechandler[vec] == NULL) 
  181. panic ("bad interrupt vector %d receivedn",irq);
  182. sun3_vechandler[vec](irq, vec_ids[vec], regs);
  183. return;
  184. } else {
  185. panic("sun3_process_int: unable to handle interrupt vector %dn",
  186.       irq);
  187. }
  188. }