irq.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  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/config.h>
  20. #include <linux/init.h>
  21. #include <asm/irq.h>
  22. #include <asm/irqchip.h>
  23. #include <asm/ioc.h>
  24. #include <asm/io.h>
  25. #include <asm/system.h>
  26. extern void init_FIQ(void);
  27. #define a_clf() clf()
  28. #define a_stf() stf()
  29. static void arc_ack_irq_a(unsigned int irq)
  30. {
  31. unsigned int val, mask;
  32. mask = 1 << irq;
  33. a_clf();
  34. val = ioc_readb(IOC_IRQMASKA);
  35. ioc_writeb(val & ~mask, IOC_IRQMASKA);
  36. ioc_writeb(mask, IOC_IRQCLRA);
  37. a_stf();
  38. }
  39. static void arc_mask_irq_a(unsigned int irq)
  40. {
  41. unsigned int val, mask;
  42. mask = 1 << irq;
  43. a_clf();
  44. val = ioc_readb(IOC_IRQMASKA);
  45. ioc_writeb(val & ~mask, IOC_IRQMASKA);
  46. a_stf();
  47. }
  48. static void arc_unmask_irq_a(unsigned int irq)
  49. {
  50. unsigned int val, mask;
  51. mask = 1 << irq;
  52. a_clf();
  53. val = ioc_readb(IOC_IRQMASKA);
  54. ioc_writeb(val | mask, IOC_IRQMASKA);
  55. a_stf();
  56. }
  57. static struct irqchip arc_a_chip = {
  58. .ack = arc_ack_irq_a,
  59. .mask = arc_mask_irq_a,
  60. .unmask = arc_unmask_irq_a,
  61. };
  62. static void arc_mask_irq_b(unsigned int irq)
  63. {
  64. unsigned int val, mask;
  65. mask = 1 << (irq & 7);
  66. val = ioc_readb(IOC_IRQMASKB);
  67. ioc_writeb(val & ~mask, IOC_IRQMASKB);
  68. }
  69. static void arc_unmask_irq_b(unsigned int irq)
  70. {
  71. unsigned int val, mask;
  72. mask = 1 << (irq & 7);
  73. val = ioc_readb(IOC_IRQMASKB);
  74. ioc_writeb(val | mask, IOC_IRQMASKB);
  75. }
  76. static struct irqchip arc_b_chip = {
  77. .ack = arc_mask_irq_b,
  78. .mask = arc_mask_irq_b,
  79. .unmask = arc_unmask_irq_b,
  80. };
  81. /* FIXME - JMA none of these functions are used in arm26 currently
  82. static void arc_mask_irq_fiq(unsigned int irq)
  83. {
  84. unsigned int val, mask;
  85. mask = 1 << (irq & 7);
  86. val = ioc_readb(IOC_FIQMASK);
  87. ioc_writeb(val & ~mask, IOC_FIQMASK);
  88. }
  89. static void arc_unmask_irq_fiq(unsigned int irq)
  90. {
  91. unsigned int val, mask;
  92. mask = 1 << (irq & 7);
  93. val = ioc_readb(IOC_FIQMASK);
  94. ioc_writeb(val | mask, IOC_FIQMASK);
  95. }
  96. static struct irqchip arc_fiq_chip = {
  97. .ack = arc_mask_irq_fiq,
  98. .mask = arc_mask_irq_fiq,
  99. .unmask = arc_unmask_irq_fiq,
  100. };
  101. */
  102. void __init arc_init_irq(void)
  103. {
  104. unsigned int irq, flags;
  105. /* Disable all IOC interrupt sources */
  106. ioc_writeb(0, IOC_IRQMASKA);
  107. ioc_writeb(0, IOC_IRQMASKB);
  108. ioc_writeb(0, IOC_FIQMASK);
  109. for (irq = 0; irq < NR_IRQS; irq++) {
  110. flags = IRQF_VALID;
  111. if (irq <= 6 || (irq >= 9 && irq <= 15))
  112. flags |= IRQF_PROBE;
  113. if (irq == IRQ_KEYBOARDTX)
  114. flags |= IRQF_NOAUTOEN;
  115. switch (irq) {
  116. case 0 ... 7:
  117. set_irq_chip(irq, &arc_a_chip);
  118. set_irq_handler(irq, do_level_IRQ);
  119. set_irq_flags(irq, flags);
  120. break;
  121. case 8 ... 15:
  122. set_irq_chip(irq, &arc_b_chip);
  123. set_irq_handler(irq, do_level_IRQ);
  124. set_irq_flags(irq, flags);
  125. /* case 64 ... 72:
  126. set_irq_chip(irq, &arc_fiq_chip);
  127. set_irq_flags(irq, flags);
  128. break;
  129. */
  130. }
  131. }
  132. irq_desc[IRQ_KEYBOARDTX].noautoenable = 1;
  133. init_FIQ();
  134. }