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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/include/asm-arm/arch-arc/irq.h
  3.  *
  4.  *  Copyright (C) 1996 Russell King
  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.  *  Changelog:
  11.  *   24-09-1996 RMK Created
  12.  *   10-10-1996 RMK Brought up to date with arch-sa110eval
  13.  *   22-10-1996 RMK Changed interrupt numbers & uses new inb/outb macros
  14.  *   11-01-1998 RMK Added mask_and_ack_irq
  15.  *   22-08-1998 RMK Restructured IRQ routines
  16.  */
  17. #include <linux/config.h>
  18. #include <asm/hardware/ioc.h>
  19. #include <asm/io.h>
  20. #ifdef CONFIG_ARCH_ARC
  21. #define a_clf() clf()
  22. #define a_stf() stf()
  23. #else
  24. #define a_clf() do { } while (0)
  25. #define a_stf() do { } while (0)
  26. #endif
  27. #define fixup_irq(x) (x)
  28. static void arc_mask_irq_ack_a(unsigned int irq)
  29. {
  30. unsigned int val, mask;
  31. mask = 1 << irq;
  32. a_clf();
  33. val = ioc_readb(IOC_IRQMASKA);
  34. ioc_writeb(val & ~mask, IOC_IRQMASKA);
  35. ioc_writeb(mask, IOC_IRQCLRA);
  36. a_stf();
  37. }
  38. static void arc_mask_irq_a(unsigned int irq)
  39. {
  40. unsigned int val, mask;
  41. mask = 1 << irq;
  42. a_clf();
  43. val = ioc_readb(IOC_IRQMASKA);
  44. ioc_writeb(val & ~mask, IOC_IRQMASKA);
  45. a_stf();
  46. }
  47. static void arc_unmask_irq_a(unsigned int irq)
  48. {
  49. unsigned int val, mask;
  50. mask = 1 << irq;
  51. a_clf();
  52. val = ioc_readb(IOC_IRQMASKA);
  53. ioc_writeb(val | mask, IOC_IRQMASKA);
  54. a_stf();
  55. }
  56. static void arc_mask_irq_b(unsigned int irq)
  57. {
  58. unsigned int val, mask;
  59. mask = 1 << (irq & 7);
  60. val = ioc_readb(IOC_IRQMASKB);
  61. ioc_writeb(val & ~mask, IOC_IRQMASKB);
  62. }
  63. static void arc_unmask_irq_b(unsigned int irq)
  64. {
  65. unsigned int val, mask;
  66. mask = 1 << (irq & 7);
  67. val = ioc_readb(IOC_IRQMASKB);
  68. ioc_writeb(val | mask, IOC_IRQMASKB);
  69. }
  70. static void arc_mask_irq_fiq(unsigned int irq)
  71. {
  72. unsigned int val, mask;
  73. mask = 1 << (irq & 7);
  74. val = ioc_readb(IOC_FIQMASK);
  75. ioc_writeb(val & ~mask, IOC_FIQMASK);
  76. }
  77. static void arc_unmask_irq_fiq(unsigned int irq)
  78. {
  79. unsigned int val, mask;
  80. mask = 1 << (irq & 7);
  81. val = ioc_readb(IOC_FIQMASK);
  82. ioc_writeb(val | mask, IOC_FIQMASK);
  83. }
  84. static __inline__ void irq_init_irq(void)
  85. {
  86. int irq;
  87. ioc_writeb(0, IOC_IRQMASKA);
  88. ioc_writeb(0, IOC_IRQMASKB);
  89. ioc_writeb(0, IOC_FIQMASK);
  90. for (irq = 0; irq < NR_IRQS; irq++) {
  91. switch (irq) {
  92. case 0 ... 6:
  93. irq_desc[irq].probe_ok = 1;
  94. irq_desc[irq].valid    = 1;
  95. irq_desc[irq].mask_ack = arc_mask_irq_ack_a;
  96. irq_desc[irq].mask     = arc_mask_irq_a;
  97. irq_desc[irq].unmask   = arc_unmask_irq_a;
  98. break;
  99. case 7:
  100. irq_desc[irq].noautoenable = 1;
  101. irq_desc[irq].valid    = 1;
  102. irq_desc[irq].mask_ack = arc_mask_irq_ack_a;
  103. irq_desc[irq].mask     = arc_mask_irq_a;
  104. irq_desc[irq].unmask   = arc_unmask_irq_a;
  105. break;
  106. case 9 ... 15:
  107. irq_desc[irq].probe_ok = 1;
  108. case 8:
  109. irq_desc[irq].valid    = 1;
  110. irq_desc[irq].mask_ack = arc_mask_irq_b;
  111. irq_desc[irq].mask     = arc_mask_irq_b;
  112. irq_desc[irq].unmask   = arc_unmask_irq_b;
  113. break;
  114. case 64 ... 72:
  115. irq_desc[irq].valid    = 1;
  116. irq_desc[irq].mask_ack = arc_mask_irq_fiq;
  117. irq_desc[irq].mask     = arc_mask_irq_fiq;
  118. irq_desc[irq].unmask   = arc_unmask_irq_fiq;
  119. break;
  120. }
  121. }
  122. irq_desc[IRQ_KEYBOARDTX].noautoenable = 1;
  123. init_FIQ();
  124. }