irq.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. /*
  2. * linux/arch/arm26/mach-arc/irq.c
  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. * 08-09-2002 IM Brought up to date for 2.5
  17. * 01-06-2003 JMA Removed arc_fiq_chip
  18. */
  19. #include <linux/init.h>
  20. #include <asm/irq.h>
  21. #include <asm/irqchip.h>
  22. #include <asm/ioc.h>
  23. #include <asm/io.h>
  24. #include <asm/system.h>
  25. extern void init_FIQ(void);
  26. #define a_clf() clf()
  27. #define a_stf() stf()
  28. static void arc_ack_irq_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 struct irqchip arc_a_chip = {
  57. .ack = arc_ack_irq_a,
  58. .mask = arc_mask_irq_a,
  59. .unmask = arc_unmask_irq_a,
  60. };
  61. static void arc_mask_irq_b(unsigned int irq)
  62. {
  63. unsigned int val, mask;
  64. mask = 1 << (irq & 7);
  65. val = ioc_readb(IOC_IRQMASKB);
  66. ioc_writeb(val & ~mask, IOC_IRQMASKB);
  67. }
  68. static void arc_unmask_irq_b(unsigned int irq)
  69. {
  70. unsigned int val, mask;
  71. mask = 1 << (irq & 7);
  72. val = ioc_readb(IOC_IRQMASKB);
  73. ioc_writeb(val | mask, IOC_IRQMASKB);
  74. }
  75. static struct irqchip arc_b_chip = {
  76. .ack = arc_mask_irq_b,
  77. .mask = arc_mask_irq_b,
  78. .unmask = arc_unmask_irq_b,
  79. };
  80. /* FIXME - JMA none of these functions are used in arm26 currently
  81. static void arc_mask_irq_fiq(unsigned int irq)
  82. {
  83. unsigned int val, mask;
  84. mask = 1 << (irq & 7);
  85. val = ioc_readb(IOC_FIQMASK);
  86. ioc_writeb(val & ~mask, IOC_FIQMASK);
  87. }
  88. static void arc_unmask_irq_fiq(unsigned int irq)
  89. {
  90. unsigned int val, mask;
  91. mask = 1 << (irq & 7);
  92. val = ioc_readb(IOC_FIQMASK);
  93. ioc_writeb(val | mask, IOC_FIQMASK);
  94. }
  95. static struct irqchip arc_fiq_chip = {
  96. .ack = arc_mask_irq_fiq,
  97. .mask = arc_mask_irq_fiq,
  98. .unmask = arc_unmask_irq_fiq,
  99. };
  100. */
  101. void __init arc_init_irq(void)
  102. {
  103. unsigned int irq, flags;
  104. /* Disable all IOC interrupt sources */
  105. ioc_writeb(0, IOC_IRQMASKA);
  106. ioc_writeb(0, IOC_IRQMASKB);
  107. ioc_writeb(0, IOC_FIQMASK);
  108. for (irq = 0; irq < NR_IRQS; irq++) {
  109. flags = IRQF_VALID;
  110. if (irq <= 6 || (irq >= 9 && irq <= 15))
  111. flags |= IRQF_PROBE;
  112. if (irq == IRQ_KEYBOARDTX)
  113. flags |= IRQF_NOAUTOEN;
  114. switch (irq) {
  115. case 0 ... 7:
  116. set_irq_chip(irq, &arc_a_chip);
  117. set_irq_handler(irq, do_level_IRQ);
  118. set_irq_flags(irq, flags);
  119. break;
  120. case 8 ... 15:
  121. set_irq_chip(irq, &arc_b_chip);
  122. set_irq_handler(irq, do_level_IRQ);
  123. set_irq_flags(irq, flags);
  124. /* case 64 ... 72:
  125. set_irq_chip(irq, &arc_fiq_chip);
  126. set_irq_flags(irq, flags);
  127. break;
  128. */
  129. }
  130. }
  131. irq_desc[IRQ_KEYBOARDTX].noautoenable = 1;
  132. init_FIQ();
  133. }