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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/arch/arm/mach-pxa/irq.c
  3.  *  
  4.  *  Generic PXA IRQ handling, GPIO IRQ demultiplexing, etc.
  5.  *
  6.  *  Author: Nicolas Pitre
  7.  *  Created: Jun 15, 2001
  8.  *  Copyright: MontaVista Software Inc.
  9.  *  
  10.  *  This program is free software; you can redistribute it and/or modify
  11.  *  it under the terms of the GNU General Public License version 2 as
  12.  *  published by the Free Software Foundation.
  13.  */
  14. #include <linux/init.h>
  15. #include <linux/module.h>
  16. #include <linux/sched.h>
  17. #include <linux/interrupt.h>
  18. #include <linux/ptrace.h>
  19. #include <asm/hardware.h>
  20. #include <asm/irq.h>
  21. #include <asm/mach/irq.h>
  22. #include <asm/arch/irq.h>
  23. #include "generic.h"
  24. /*
  25.  * PXA GPIO edge detection for IRQs:
  26.  * IRQs are generated on Falling-Edge, Rising-Edge, or both.
  27.  * This must be called *before* the appropriate IRQ is registered.
  28.  * Use this instead of directly setting GRER/GFER.
  29.  */
  30. static int GPIO_IRQ_rising_edge[3];
  31. static int GPIO_IRQ_falling_edge[3];
  32. void set_GPIO_IRQ_edge (int gpio_nr, int edge)
  33. {
  34. long flags;
  35. local_irq_save(flags);
  36. set_GPIO_mode(gpio_nr | GPIO_IN);
  37. if (edge & GPIO_FALLING_EDGE)
  38. set_bit (gpio_nr, GPIO_IRQ_falling_edge);
  39. else
  40. clear_bit (gpio_nr, GPIO_IRQ_falling_edge);
  41. if (edge & GPIO_RISING_EDGE)
  42. set_bit (gpio_nr, GPIO_IRQ_rising_edge);
  43. else
  44. clear_bit (gpio_nr, GPIO_IRQ_rising_edge);
  45. irq_desc[IRQ_GPIO(gpio_nr)].valid = 1;
  46. local_irq_restore(flags);
  47. }
  48. EXPORT_SYMBOL(set_GPIO_IRQ_edge);
  49. /*
  50.  * We don't need to ACK IRQs on the PXA unless they're GPIOs
  51.  * this is for IRQs known as PXA_IRQ([10...31]).
  52.  */
  53. static void pxa_mask_irq(unsigned int irq)
  54. {
  55. ICMR &= ~(1 << (irq + PXA_IRQ_SKIP));
  56. }
  57. static void pxa_unmask_irq(unsigned int irq)
  58. {
  59. ICMR |= (1 << (irq + PXA_IRQ_SKIP));
  60. }
  61. /*
  62.  * GPIO IRQs must be acknoledged.  This is for GPIO 0 and 1.
  63.  */
  64. static void pxa_mask_and_ack_GPIO_0_1_irq(unsigned int irq)
  65. {
  66. ICMR &= ~(1 << (irq + PXA_IRQ_SKIP));
  67. GEDR0 = (1 << (irq - IRQ_GPIO0));
  68. }
  69. static void pxa_mask_GPIO_0_1_irq(unsigned int irq)
  70. {
  71. ICMR &= ~(1 << (irq + PXA_IRQ_SKIP));
  72. }
  73. static void pxa_unmask_GPIO_0_1_irq(unsigned int irq)
  74. {
  75. int gpio = irq - IRQ_GPIO0;
  76. GRER0 = (GRER0 & ~(1 << gpio))|(GPIO_IRQ_rising_edge[0] & (1 << gpio));
  77. GFER0 = (GFER0 & ~(1 << gpio))|(GPIO_IRQ_falling_edge[0] & (1 << gpio));
  78. ICMR |= (1 << (irq + PXA_IRQ_SKIP));
  79. }
  80. /*
  81.  * Demux handler for GPIO 2-80 edge detect interrupts
  82.  */
  83. static int GPIO_2_80_enabled[3]; /* enabled i.e. unmasked GPIO IRQs */
  84. static int GPIO_2_80_spurious[3]; /* GPIOs that triggered when masked */
  85. static void pxa_GPIO_2_80_demux(int irq, void *dev_id,
  86.     struct pt_regs *regs)
  87. {
  88. int i, gedr, spurious;
  89. while ((gedr = (GEDR0 & ~3))) {
  90. /*
  91.  * We don't want to clear GRER/GFER when the corresponding
  92.  * IRQ is masked because we could miss a level transition
  93.  * i.e. an IRQ which need servicing as soon as it is
  94.  * unmasked.  However, such situation should happen only
  95.  * during the loop below.  Thus all IRQs which aren't
  96.  * enabled at this point are considered spurious.  Those
  97.  * are cleared but only de-activated if they happen twice.
  98.  */
  99. spurious = gedr & ~GPIO_2_80_enabled[0];
  100. if (spurious) {
  101. GEDR0 = spurious;
  102. GRER0 &= ~(spurious & GPIO_2_80_spurious[0]);
  103. GFER0 &= ~(spurious & GPIO_2_80_spurious[0]);
  104. GPIO_2_80_spurious[0] |= spurious;
  105. gedr ^= spurious;
  106. if (!gedr) continue;
  107. }
  108. for (i = 2; i < 32; ++i) {
  109. if (gedr & (1<<i)) {
  110. do_IRQ (IRQ_GPIO(2) + i - 2, regs);
  111. }
  112. }
  113. }
  114. while ((gedr = GEDR1)) {
  115. spurious = gedr & ~GPIO_2_80_enabled[1];
  116. if (spurious) {
  117. GEDR1 = spurious;
  118. GRER1 &= ~(spurious & GPIO_2_80_spurious[1]);
  119. GFER1 &= ~(spurious & GPIO_2_80_spurious[1]);
  120. GPIO_2_80_spurious[1] |= spurious;
  121. gedr ^= spurious;
  122. if (!gedr) continue;
  123. }
  124. for (i = 0; i < 32; ++i) {
  125. if (gedr & (1<<i)) {
  126. do_IRQ (IRQ_GPIO(32) + i, regs);
  127. }
  128. }
  129. }
  130. while ((gedr = (GEDR2 & 0x0001ffff))) {
  131. spurious = gedr & ~GPIO_2_80_enabled[2];
  132. if (spurious) {
  133. GEDR2 = spurious;
  134. GRER2 &= ~(spurious & GPIO_2_80_spurious[2]);
  135. GFER2 &= ~(spurious & GPIO_2_80_spurious[2]);
  136. GPIO_2_80_spurious[2] |= spurious;
  137. gedr ^= spurious;
  138. if (!gedr) continue;
  139. }
  140. for (i = 0; i < 17; ++i) {
  141. if (gedr & (1<<i)) {
  142. do_IRQ (IRQ_GPIO(64) + i, regs);
  143. }
  144. }
  145. }
  146. }
  147. static struct irqaction GPIO_2_80_irqaction = {
  148. name: "GPIO 2-80",
  149. handler: pxa_GPIO_2_80_demux,
  150. flags: SA_INTERRUPT
  151. };
  152. #define GRER_x(i) (*(&GRER0 + (i)))
  153. #define GFER_x(i) (*(&GFER0 + (i)))
  154. #define GEDR_x(i) (*(&GEDR0 + (i)))
  155. #define GPLR_x(i) (*(&GPLR0 + (i)))
  156. static void pxa_mask_and_ack_GPIO_2_80_irq(unsigned int irq)
  157. {
  158. int gpio_nr = IRQ_TO_GPIO_2_80(irq);
  159. int mask = 1 << (gpio_nr & 0x1f);
  160. int index = gpio_nr >> 5;
  161. GPIO_2_80_spurious[index] &= ~mask;
  162. GPIO_2_80_enabled[index] &= ~mask;
  163. GEDR_x(index) = mask;
  164. }
  165. static void pxa_mask_GPIO_2_80_irq(unsigned int irq)
  166. {
  167. int gpio_nr = IRQ_TO_GPIO_2_80(irq);
  168. int mask = 1 << (gpio_nr & 0x1f);
  169. int index = gpio_nr >> 5;
  170. GPIO_2_80_spurious[index] &= ~mask;
  171. GPIO_2_80_enabled[index] &= ~mask;
  172. }
  173. static void pxa_unmask_GPIO_2_80_irq(unsigned int irq)
  174. {
  175. int gpio_nr = IRQ_TO_GPIO_2_80(irq);
  176. int mask = 1 << (gpio_nr & 0x1f);
  177. int index = gpio_nr >> 5;
  178. if (GPIO_2_80_spurious[index] & mask) {
  179. /*
  180.  * We don't want to miss an interrupt that would have occurred
  181.  * while it was masked.  Simulate it if it is the case.
  182.  */
  183. int state = GPLR_x(index);
  184. if (((state & GPIO_IRQ_rising_edge[index]) |
  185.      (~state & GPIO_IRQ_falling_edge[index])) & mask)
  186. {
  187. /* just in case it gets referenced: */
  188. struct pt_regs dummy;
  189. memzero(&dummy, sizeof(dummy));
  190. do_IRQ(irq, &dummy);
  191. /* we are being called recursively from do_IRQ() */
  192. return;
  193. }
  194. }
  195. GPIO_2_80_enabled[index] |= mask;
  196. GRER_x(index) =
  197. (GRER_x(index) & ~mask) | (GPIO_IRQ_rising_edge[index] & mask);
  198. GFER_x(index) =
  199. (GFER_x(index) & ~mask) | (GPIO_IRQ_falling_edge[index] & mask);
  200. }
  201. void __init pxa_init_irq(void)
  202. {
  203. int irq;
  204. /* disable all IRQs */
  205. ICMR = 0;
  206. /* all IRQs are IRQ, not FIQ */
  207. ICLR = 0;
  208. /* clear all GPIO edge detects */
  209. GFER0 = GFER1 = GFER2 = 0;
  210. GRER0 = GRER1 = GRER2 = 0;
  211. GEDR0 = GEDR0;
  212. GEDR1 = GEDR1;
  213. GEDR2 = GEDR2;
  214. /* only unmasked interrupts kick us out of idle */
  215. ICCR = 1;
  216. /*
  217.  * Note: GPIO IRQs are initially invalid until set_GPIO_IRQ_edge()
  218.  * is called at least once.
  219.  */
  220. for (irq = IRQ_GPIO0; irq <= IRQ_GPIO1; irq++) {
  221. irq_desc[irq].valid = 0;
  222. irq_desc[irq].probe_ok = 1;
  223. irq_desc[irq].mask_ack = pxa_mask_and_ack_GPIO_0_1_irq;
  224. irq_desc[irq].mask = pxa_mask_GPIO_0_1_irq;
  225. irq_desc[irq].unmask = pxa_unmask_GPIO_0_1_irq;
  226. }
  227. for (irq = IRQ_GPIO_2_80; irq <= IRQ_RTCAlrm; irq++) {
  228. irq_desc[irq].valid = 1;
  229. irq_desc[irq].probe_ok = 0;
  230. irq_desc[irq].mask_ack = pxa_mask_irq;
  231. irq_desc[irq].mask = pxa_mask_irq;
  232. irq_desc[irq].unmask = pxa_unmask_irq;
  233. }
  234. /* Those are reserved */
  235. irq_desc[PXA_IRQ(15)].valid = 0;
  236. irq_desc[PXA_IRQ(16)].valid = 0;
  237. for (irq = IRQ_GPIO(2); irq <= IRQ_GPIO(80); irq++) {
  238. irq_desc[irq].valid = 0;
  239. irq_desc[irq].probe_ok = 1;
  240. irq_desc[irq].mask_ack = pxa_mask_and_ack_GPIO_2_80_irq;
  241. irq_desc[irq].mask = pxa_mask_GPIO_2_80_irq;
  242. irq_desc[irq].unmask = pxa_unmask_GPIO_2_80_irq;
  243. }
  244. setup_arm_irq( IRQ_GPIO_2_80, &GPIO_2_80_irqaction );
  245. }