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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * linux/arch/arm/mach-sa1100/irq.c
  3.  *
  4.  * Copyright (C) 1999-2001 Nicolas Pitre
  5.  *
  6.  * Generic IRQ handling for the SA11x0, GPIO 11-27 IRQ demultiplexing.
  7.  *
  8.  * This program is free software; you can redistribute it and/or modify
  9.  * it under the terms of the GNU General Public License version 2 as
  10.  * published by the Free Software Foundation.
  11.  */
  12. #include <linux/init.h>
  13. #include <linux/module.h>
  14. #include <linux/sched.h>
  15. #include <linux/interrupt.h>
  16. #include <linux/ioport.h>
  17. #include <linux/ptrace.h>
  18. #include <asm/hardware.h>
  19. #include <asm/irq.h>
  20. #include <asm/mach/irq.h>
  21. #include <asm/arch/irq.h>
  22. #include "generic.h"
  23. /*
  24.  * SA1100 GPIO edge detection for IRQs:
  25.  * IRQs are generated on Falling-Edge, Rising-Edge, or both.
  26.  * This must be called *before* the appropriate IRQ is registered.
  27.  * Use this instead of directly setting GRER/GFER.
  28.  */
  29. static int GPIO_IRQ_rising_edge;
  30. static int GPIO_IRQ_falling_edge;
  31. static int GPIO_IRQ_mask = (1 << 11) - 1;
  32. void set_GPIO_IRQ_edge(int gpio_mask, int edge)
  33. {
  34. long flags;
  35. int irq = 0;
  36. gpio_mask &= 0x0fffffff;
  37. local_irq_save(flags);
  38. if (edge & GPIO_FALLING_EDGE)
  39. GPIO_IRQ_falling_edge |= gpio_mask;
  40. else
  41. GPIO_IRQ_falling_edge &= ~gpio_mask;
  42. if (edge & GPIO_RISING_EDGE)
  43. GPIO_IRQ_rising_edge |= gpio_mask;
  44. else
  45. GPIO_IRQ_rising_edge &= ~gpio_mask;
  46. GPDR &= ~gpio_mask;
  47. GAFR &= ~gpio_mask;
  48. GRER = GPIO_IRQ_rising_edge & GPIO_IRQ_mask;
  49. GFER = GPIO_IRQ_falling_edge & GPIO_IRQ_mask;
  50. while (gpio_mask) {
  51. if (irq == 11)
  52. irq = IRQ_GPIO11;
  53. if (gpio_mask & 1)
  54. irq_desc[irq].valid = 1;
  55. irq++;
  56. gpio_mask >>= 1;
  57. }
  58. local_irq_restore(flags);
  59. }
  60. EXPORT_SYMBOL(set_GPIO_IRQ_edge);
  61. /*
  62.  * We don't need to ACK IRQs on the SA1100 unless they're GPIOs
  63.  * this is for internal IRQs i.e. from 11 to 31.
  64.  */
  65. static void sa1100_mask_irq(unsigned int irq)
  66. {
  67. ICMR &= ~(1 << irq);
  68. }
  69. static void sa1100_unmask_irq(unsigned int irq)
  70. {
  71. ICMR |= (1 << irq);
  72. }
  73. /*
  74.  * GPIO IRQs must be acknoledged.  This is for IRQs from 0 to 10.
  75.  */
  76. static void sa1100_mask_and_ack_GPIO0_10_irq(unsigned int irq)
  77. {
  78. unsigned int mask = 1 << irq;
  79. ICMR &= ~mask;
  80. GEDR = mask;
  81. }
  82. static void sa1100_mask_GPIO0_10_irq(unsigned int irq)
  83. {
  84. ICMR &= ~(1 << irq);
  85. }
  86. static void sa1100_unmask_GPIO0_10_irq(unsigned int irq)
  87. {
  88. ICMR |= 1 << irq;
  89. }
  90. /*
  91.  * Install handler for GPIO 11-27 edge detect interrupts
  92.  */
  93. static int GPIO_11_27_spurious; /* GPIOs that triggered when masked */
  94. static void sa1100_GPIO11_27_demux(int irq, void *dev_id,
  95.    struct pt_regs *regs)
  96. {
  97. int i, spurious;
  98. while ((irq = (GEDR & 0xfffff800))) {
  99. /*
  100.  * We don't want to clear GRER/GFER when the corresponding
  101.  * IRQ is masked because we could miss a level transition
  102.  * i.e. an IRQ which need servicing as soon as it is
  103.  * unmasked.  However, such situation should happen only
  104.  * during the loop below.  Thus all IRQs which aren't
  105.  * enabled at this point are considered spurious.  Those
  106.  * are cleared but only de-activated if they happen twice.
  107.  */
  108. spurious = irq & ~GPIO_IRQ_mask;
  109. if (spurious) {
  110. GEDR = spurious;
  111. GRER &= ~(spurious & GPIO_11_27_spurious);
  112. GFER &= ~(spurious & GPIO_11_27_spurious);
  113. GPIO_11_27_spurious |= spurious;
  114. irq ^= spurious;
  115. if (!irq) continue;
  116. }
  117. for (i = 11; i <= 27; ++i) {
  118. if (irq & (1<<i)) {
  119. do_IRQ(IRQ_GPIO11 + i - 11, regs);
  120. }
  121. }
  122. }
  123. }
  124. static struct irqaction GPIO11_27_irq = {
  125. name: "GPIO 11-27",
  126. handler: sa1100_GPIO11_27_demux,
  127. flags: SA_INTERRUPT
  128. };
  129. static void sa1100_mask_and_ack_GPIO11_27_irq(unsigned int irq)
  130. {
  131. unsigned int mask = (1 << GPIO_11_27_IRQ(irq));
  132. GPIO_11_27_spurious &= ~mask;
  133. GPIO_IRQ_mask &= ~mask;
  134. GEDR = mask;
  135. }
  136. static void sa1100_mask_GPIO11_27_irq(unsigned int irq)
  137. {
  138. unsigned int mask = (1 << GPIO_11_27_IRQ(irq));
  139. GPIO_11_27_spurious &= ~mask;
  140. GPIO_IRQ_mask &= ~mask;
  141. }
  142. static void sa1100_unmask_GPIO11_27_irq(unsigned int irq)
  143. {
  144. unsigned int mask = (1 << GPIO_11_27_IRQ(irq));
  145. if (GPIO_11_27_spurious & mask) {
  146. /*
  147.  * We don't want to miss an interrupt that would have occurred
  148.  * while it was masked.  Simulate it if it is the case.
  149.  */
  150. int state = GPLR;
  151. if (((state & GPIO_IRQ_rising_edge) |
  152.      (~state & GPIO_IRQ_falling_edge)) & mask)
  153. {
  154. /* just in case it gets referenced: */
  155. struct pt_regs dummy;
  156. memzero(&dummy, sizeof(dummy));
  157. do_IRQ(irq, &dummy);
  158. /* we are being called recursively from do_IRQ() */
  159. return;
  160. }
  161. }
  162. GPIO_IRQ_mask |= mask;
  163. GRER = GPIO_IRQ_rising_edge & GPIO_IRQ_mask;
  164. GFER = GPIO_IRQ_falling_edge & GPIO_IRQ_mask;
  165. }
  166. static struct resource irq_resource = {
  167. name: "irqs",
  168. start: 0x90050000,
  169. end: 0x9005ffff,
  170. };
  171. void __init sa1100_init_irq(void)
  172. {
  173. int irq;
  174. request_resource(&iomem_resource, &irq_resource);
  175. /* disable all IRQs */
  176. ICMR = 0;
  177. /* all IRQs are IRQ, not FIQ */
  178. ICLR = 0;
  179. /* clear all GPIO edge detects */
  180. GFER = 0;
  181. GRER = 0;
  182. GEDR = -1;
  183. /*
  184.  * Whatever the doc says, this has to be set for the wait-on-irq
  185.  * instruction to work... on a SA1100 rev 9 at least.
  186.  */
  187. ICCR = 1;
  188. /*
  189.  * Note: GPIO IRQs are initially invalid until at least one call
  190.  * to set_GPIO_IRQ_edge() is performed.
  191.  */
  192. for (irq = 0; irq <= 10; irq++) {
  193. irq_desc[irq].valid = 0;
  194. irq_desc[irq].probe_ok = 1;
  195. irq_desc[irq].mask_ack = sa1100_mask_and_ack_GPIO0_10_irq;
  196. irq_desc[irq].mask = sa1100_mask_GPIO0_10_irq;
  197. irq_desc[irq].unmask = sa1100_unmask_GPIO0_10_irq;
  198. }
  199. for (irq = 11; irq <= 31; irq++) {
  200. irq_desc[irq].valid = 1;
  201. irq_desc[irq].probe_ok = 0;
  202. irq_desc[irq].mask_ack = sa1100_mask_irq;
  203. irq_desc[irq].mask = sa1100_mask_irq;
  204. irq_desc[irq].unmask = sa1100_unmask_irq;
  205. }
  206. for (irq = 32; irq <= 48; irq++) {
  207. irq_desc[irq].valid = 0;
  208. irq_desc[irq].probe_ok = 1;
  209. irq_desc[irq].mask_ack = sa1100_mask_and_ack_GPIO11_27_irq;
  210. irq_desc[irq].mask = sa1100_mask_GPIO11_27_irq;
  211. irq_desc[irq].unmask = sa1100_unmask_GPIO11_27_irq;
  212. }
  213. setup_arm_irq( IRQ_GPIO11_27, &GPIO11_27_irq );
  214. /*
  215.  * We generally don't want the LCD IRQ being
  216.  * enabled as soon as we request it.
  217.  */
  218. irq_desc[IRQ_LCD].noautoenable = 1;
  219. }