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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * VIA chipset irq handling
  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) 1996, 1997 by Ralf Baechle
  9.  * Copyright (C) 2001 by Liam Davies (ldavies@agile.tv)
  10.  *
  11.  */
  12. #include <linux/kernel.h>
  13. #include <asm/cobalt/cobalt.h>
  14. #include <asm/ptrace.h>
  15. #include <asm/io.h>
  16. #include <asm/mipsregs.h>
  17. extern void do_IRQ(int irq, struct pt_regs * regs);
  18. asmlinkage void via_irq(struct pt_regs *regs)
  19. {
  20. char mstat, sstat;
  21. /* Read Master Status */
  22. outb(0x0C, 0x20);
  23. mstat = inb(0x20);
  24. if (mstat < 0) {
  25. mstat &= 0x7f;
  26. if (mstat != 2) {
  27. do_IRQ(mstat, regs);
  28. outb(mstat | 0x20, 0x20);
  29. } else {
  30. sstat = inb(0xA0);
  31. /* Slave interrupt */
  32. outb(0x0C, 0xA0);
  33. sstat = inb(0xA0);
  34. if (sstat < 0) {
  35. do_IRQ((sstat + 8) & 0x7f, regs);
  36. outb(0x22, 0x20);
  37. outb((sstat & 0x7f) | 0x20, 0xA0);
  38. } else {
  39. printk("Spurious slave interrupt...n");
  40. }
  41. }
  42. } else
  43. printk("Spurious master interrupt...");
  44. }
  45. #define GALILEO_INTCAUSE 0xb4000c18
  46. #define GALILEO_T0EXP 0x00000100
  47. asmlinkage void galileo_irq(struct pt_regs *regs)
  48. {
  49. unsigned long irq_src = *((unsigned long *) GALILEO_INTCAUSE);
  50. /* Check for timer irq ... */
  51. if (irq_src & GALILEO_T0EXP) {
  52. /* Clear the int line */
  53. *((volatile unsigned long *) GALILEO_INTCAUSE) = 0;
  54. do_IRQ(COBALT_TIMER_IRQ, regs);
  55. } else
  56. printk("Spurious Galileo interrupt...n");
  57. }