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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/include/asm-arm/arch-rpc/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.  *   10-10-1996 RMK Brought up to date with arch-sa110eval
  12.  *   22-08-1998 RMK Restructured IRQ routines
  13.  */
  14. #include <asm/hardware/iomd.h>
  15. #include <asm/io.h>
  16. #define fixup_irq(x) (x)
  17. static void rpc_mask_irq_ack_a(unsigned int irq)
  18. {
  19. unsigned int val, mask;
  20. mask = 1 << irq;
  21. val = iomd_readb(IOMD_IRQMASKA);
  22. iomd_writeb(val & ~mask, IOMD_IRQMASKA);
  23. iomd_writeb(mask, IOMD_IRQCLRA);
  24. }
  25. static void rpc_mask_irq_a(unsigned int irq)
  26. {
  27. unsigned int val, mask;
  28. mask = 1 << irq;
  29. val = iomd_readb(IOMD_IRQMASKA);
  30. iomd_writeb(val & ~mask, IOMD_IRQMASKA);
  31. }
  32. static void rpc_unmask_irq_a(unsigned int irq)
  33. {
  34. unsigned int val, mask;
  35. mask = 1 << irq;
  36. val = iomd_readb(IOMD_IRQMASKA);
  37. iomd_writeb(val | mask, IOMD_IRQMASKA);
  38. }
  39. static void rpc_mask_irq_b(unsigned int irq)
  40. {
  41. unsigned int val, mask;
  42. mask = 1 << (irq & 7);
  43. val = iomd_readb(IOMD_IRQMASKB);
  44. iomd_writeb(val & ~mask, IOMD_IRQMASKB);
  45. }
  46. static void rpc_unmask_irq_b(unsigned int irq)
  47. {
  48. unsigned int val, mask;
  49. mask = 1 << (irq & 7);
  50. val = iomd_readb(IOMD_IRQMASKB);
  51. iomd_writeb(val | mask, IOMD_IRQMASKB);
  52. }
  53. static void rpc_mask_irq_dma(unsigned int irq)
  54. {
  55. unsigned int val, mask;
  56. mask = 1 << (irq & 7);
  57. val = iomd_readb(IOMD_DMAMASK);
  58. iomd_writeb(val & ~mask, IOMD_DMAMASK);
  59. }
  60. static void rpc_unmask_irq_dma(unsigned int irq)
  61. {
  62. unsigned int val, mask;
  63. mask = 1 << (irq & 7);
  64. val = iomd_readb(IOMD_DMAMASK);
  65. iomd_writeb(val | mask, IOMD_DMAMASK);
  66. }
  67. static void rpc_mask_irq_fiq(unsigned int irq)
  68. {
  69. unsigned int val, mask;
  70. mask = 1 << (irq & 7);
  71. val = iomd_readb(IOMD_FIQMASK);
  72. iomd_writeb(val & ~mask, IOMD_FIQMASK);
  73. }
  74. static void rpc_unmask_irq_fiq(unsigned int irq)
  75. {
  76. unsigned int val, mask;
  77. mask = 1 << (irq & 7);
  78. val = iomd_readb(IOMD_FIQMASK);
  79. iomd_writeb(val | mask, IOMD_FIQMASK);
  80. }
  81. static __inline__ void irq_init_irq(void)
  82. {
  83. int irq;
  84. iomd_writeb(0, IOMD_IRQMASKA);
  85. iomd_writeb(0, IOMD_IRQMASKB);
  86. iomd_writeb(0, IOMD_FIQMASK);
  87. iomd_writeb(0, IOMD_DMAMASK);
  88. for (irq = 0; irq < NR_IRQS; irq++) {
  89. switch (irq) {
  90. case 0 ... 6:
  91. irq_desc[irq].probe_ok = 1;
  92. case 7:
  93. irq_desc[irq].valid    = 1;
  94. irq_desc[irq].mask_ack = rpc_mask_irq_ack_a;
  95. irq_desc[irq].mask     = rpc_mask_irq_a;
  96. irq_desc[irq].unmask   = rpc_unmask_irq_a;
  97. break;
  98. case 9 ... 15:
  99. irq_desc[irq].probe_ok = 1;
  100. case 8:
  101. irq_desc[irq].valid    = 1;
  102. irq_desc[irq].mask_ack = rpc_mask_irq_b;
  103. irq_desc[irq].mask     = rpc_mask_irq_b;
  104. irq_desc[irq].unmask   = rpc_unmask_irq_b;
  105. break;
  106. case 16 ... 19:
  107. case 21:
  108. irq_desc[irq].noautoenable = 1;
  109. case 20:
  110. irq_desc[irq].valid    = 1;
  111. irq_desc[irq].mask_ack = rpc_mask_irq_dma;
  112. irq_desc[irq].mask     = rpc_mask_irq_dma;
  113. irq_desc[irq].unmask   = rpc_unmask_irq_dma;
  114. break;
  115. case 64 ... 71:
  116. irq_desc[irq].valid    = 1;
  117. irq_desc[irq].mask_ack = rpc_mask_irq_fiq;
  118. irq_desc[irq].mask     = rpc_mask_irq_fiq;
  119. irq_desc[irq].unmask   = rpc_unmask_irq_fiq;
  120. break;
  121. }
  122. }
  123. irq_desc[IRQ_KEYBOARDTX].noautoenable = 1;
  124. init_FIQ();
  125. }