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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/arch/arm/kernel/irq.c
  3.  *
  4.  *  Copyright (C) 1992 Linus Torvalds
  5.  *  Modifications for ARM processor Copyright (C) 1995-2000 Russell King.
  6.  *
  7.  * This program is free software; you can redistribute it and/or modify
  8.  * it under the terms of the GNU General Public License version 2 as
  9.  * published by the Free Software Foundation.
  10.  *
  11.  *  This file contains the code used by various IRQ handling routines:
  12.  *  asking for different IRQ's should be done through these routines
  13.  *  instead of just grabbing them. Thus setups with different IRQ numbers
  14.  *  shouldn't result in any weird surprises, and installing new handlers
  15.  *  should be easier.
  16.  *
  17.  *  IRQ's are in fact implemented a bit like signal handlers for the kernel.
  18.  *  Naturally it's not a 1:1 relation, but there are similarities.
  19.  */
  20. #include <linux/config.h>
  21. #include <linux/ptrace.h>
  22. #include <linux/kernel_stat.h>
  23. #include <linux/signal.h>
  24. #include <linux/sched.h>
  25. #include <linux/ioport.h>
  26. #include <linux/interrupt.h>
  27. #include <linux/slab.h>
  28. #include <linux/random.h>
  29. #include <linux/smp.h>
  30. #include <linux/init.h>
  31. #include <asm/irq.h>
  32. #include <asm/system.h>
  33. #include <asm/mach/irq.h>
  34. #include <asm/arch/irq.h> /* pick up fixup_irq definition */
  35. /*
  36.  * Maximum IRQ count.  Currently, this is arbitary.  However, it should
  37.  * not be set too low to prevent false triggering.  Conversely, if it
  38.  * is set too high, then you could miss a stuck IRQ.
  39.  *
  40.  * Maybe we ought to set a timer and re-enable the IRQ at a later time?
  41.  */
  42. #define MAX_IRQ_CNT 100000
  43. static volatile unsigned long irq_err_count;
  44. static spinlock_t irq_controller_lock;
  45. struct irqdesc irq_desc[NR_IRQS];
  46. void (*init_arch_irq)(void) __initdata = NULL;
  47. /*
  48.  * Dummy mask/unmask handler
  49.  */
  50. static void dummy_mask_unmask_irq(unsigned int irq)
  51. {
  52. }
  53. /**
  54.  * disable_irq - disable an irq and wait for completion
  55.  * @irq: Interrupt to disable
  56.  *
  57.  * Disable the selected interrupt line.
  58.  *
  59.  * This function may be called - with care - from IRQ context.
  60.  */
  61. void disable_irq(unsigned int irq)
  62. {
  63. unsigned long flags;
  64. spin_lock_irqsave(&irq_controller_lock, flags);
  65. irq_desc[irq].enabled = 0;
  66. irq_desc[irq].mask(irq);
  67. spin_unlock_irqrestore(&irq_controller_lock, flags);
  68. }
  69. /**
  70.  * enable_irq - enable interrupt handling on an irq
  71.  * @irq: Interrupt to enable
  72.  *
  73.  * Re-enables the processing of interrupts on this IRQ line
  74.  *
  75.  * This function may be called from IRQ context.
  76.  */
  77. void enable_irq(unsigned int irq)
  78. {
  79. unsigned long flags;
  80. spin_lock_irqsave(&irq_controller_lock, flags);
  81. irq_desc[irq].probing = 0;
  82. irq_desc[irq].triggered = 0;
  83. irq_desc[irq].enabled = 1;
  84. irq_desc[irq].unmask(irq);
  85. spin_unlock_irqrestore(&irq_controller_lock, flags);
  86. }
  87. int get_irq_list(char *buf)
  88. {
  89. int i;
  90. struct irqaction * action;
  91. char *p = buf;
  92. for (i = 0 ; i < NR_IRQS ; i++) {
  93.      action = irq_desc[i].action;
  94. if (!action)
  95. continue;
  96. p += sprintf(p, "%3d: %10u ", i, kstat_irqs(i));
  97. p += sprintf(p, "  %s", action->name);
  98. for (action = action->next; action; action = action->next) {
  99. p += sprintf(p, ", %s", action->name);
  100. }
  101. *p++ = 'n';
  102. }
  103. #ifdef CONFIG_ARCH_ACORN
  104. p += get_fiq_list(p);
  105. #endif
  106. p += sprintf(p, "Err: %10lun", irq_err_count);
  107. return p - buf;
  108. }
  109. /*
  110.  * IRQ lock detection.
  111.  *
  112.  * Hopefully, this should get us out of a few locked situations.
  113.  * However, it may take a while for this to happen, since we need
  114.  * a large number if IRQs to appear in the same jiffie with the
  115.  * same instruction pointer (or within 2 instructions).
  116.  */
  117. static void check_irq_lock(struct irqdesc *desc, int irq, struct pt_regs *regs)
  118. {
  119. unsigned long instr_ptr = instruction_pointer(regs);
  120. if (desc->lck_jif == jiffies &&
  121.     desc->lck_pc >= instr_ptr && desc->lck_pc < instr_ptr + 8) {
  122. desc->lck_cnt += 1;
  123. if (desc->lck_cnt > MAX_IRQ_CNT) {
  124. printk(KERN_ERR "IRQ LOCK: IRQ%d is locking the system, disabledn", irq);
  125. disable_irq(irq);
  126. }
  127. } else {
  128. desc->lck_cnt = 0;
  129. desc->lck_pc  = instruction_pointer(regs);
  130. desc->lck_jif = jiffies;
  131. }
  132. }
  133. /*
  134.  * do_IRQ handles all normal device IRQ's
  135.  */
  136. asmlinkage void do_IRQ(int irq, struct pt_regs * regs)
  137. {
  138. struct irqdesc * desc;
  139. struct irqaction * action;
  140. int cpu;
  141. irq = fixup_irq(irq);
  142. /*
  143.  * Some hardware gives randomly wrong interrupts.  Rather
  144.  * than crashing, do something sensible.
  145.  */
  146. if (irq >= NR_IRQS)
  147. goto bad_irq;
  148. desc = irq_desc + irq;
  149. spin_lock(&irq_controller_lock);
  150. desc->mask_ack(irq);
  151. spin_unlock(&irq_controller_lock);
  152. cpu = smp_processor_id();
  153. irq_enter(cpu, irq);
  154. kstat.irqs[cpu][irq]++;
  155. desc->triggered = 1;
  156. /* Return with this interrupt masked if no action */
  157. action = desc->action;
  158. if (action) {
  159. int status = 0;
  160. if (desc->nomask) {
  161. spin_lock(&irq_controller_lock);
  162. desc->unmask(irq);
  163. spin_unlock(&irq_controller_lock);
  164. }
  165. if (!(action->flags & SA_INTERRUPT))
  166. __sti();
  167. do {
  168. status |= action->flags;
  169. action->handler(irq, action->dev_id, regs);
  170. action = action->next;
  171. } while (action);
  172. if (status & SA_SAMPLE_RANDOM)
  173. add_interrupt_randomness(irq);
  174. __cli();
  175. if (!desc->nomask && desc->enabled) {
  176. spin_lock(&irq_controller_lock);
  177. desc->unmask(irq);
  178. spin_unlock(&irq_controller_lock);
  179. }
  180. }
  181. /*
  182.  * Debug measure - hopefully we can continue if an
  183.  * IRQ lockup problem occurs...
  184.  */
  185. check_irq_lock(desc, irq, regs);
  186. irq_exit(cpu, irq);
  187. if (softirq_pending(cpu))
  188. do_softirq();
  189. return;
  190. bad_irq:
  191. irq_err_count += 1;
  192. printk(KERN_ERR "IRQ: spurious interrupt %dn", irq);
  193. return;
  194. }
  195. #ifdef CONFIG_ARCH_ACORN
  196. void do_ecard_IRQ(int irq, struct pt_regs *regs)
  197. {
  198. struct irqdesc * desc;
  199. struct irqaction * action;
  200. int cpu;
  201. desc = irq_desc + irq;
  202. cpu = smp_processor_id();
  203. kstat.irqs[cpu][irq]++;
  204. desc->triggered = 1;
  205. action = desc->action;
  206. if (action) {
  207. do {
  208. action->handler(irq, action->dev_id, regs);
  209. action = action->next;
  210. } while (action);
  211. } else {
  212. spin_lock(&irq_controller_lock);
  213. desc->mask(irq);
  214. spin_unlock(&irq_controller_lock);
  215. }
  216. }
  217. #endif
  218. int setup_arm_irq(int irq, struct irqaction * new)
  219. {
  220. int shared = 0;
  221. struct irqaction *old, **p;
  222. unsigned long flags;
  223. struct irqdesc *desc;
  224. /*
  225.  * Some drivers like serial.c use request_irq() heavily,
  226.  * so we have to be careful not to interfere with a
  227.  * running system.
  228.  */
  229. if (new->flags & SA_SAMPLE_RANDOM) {
  230. /*
  231.  * This function might sleep, we want to call it first,
  232.  * outside of the atomic block.
  233.  * Yes, this might clear the entropy pool if the wrong
  234.  * driver is attempted to be loaded, without actually
  235.  * installing a new handler, but is this really a problem,
  236.  * only the sysadmin is able to do this.
  237.  */
  238.         rand_initialize_irq(irq);
  239. }
  240. /*
  241.  * The following block of code has to be executed atomically
  242.  */
  243. desc = irq_desc + irq;
  244. spin_lock_irqsave(&irq_controller_lock, flags);
  245. p = &desc->action;
  246. if ((old = *p) != NULL) {
  247. /* Can't share interrupts unless both agree to */
  248. if (!(old->flags & new->flags & SA_SHIRQ)) {
  249. spin_unlock_irqrestore(&irq_controller_lock, flags);
  250. return -EBUSY;
  251. }
  252. /* add new interrupt at end of irq queue */
  253. do {
  254. p = &old->next;
  255. old = *p;
  256. } while (old);
  257. shared = 1;
  258. }
  259. *p = new;
  260. if (!shared) {
  261. desc->nomask = (new->flags & SA_IRQNOMASK) ? 1 : 0;
  262. desc->probing = 0;
  263. if (!desc->noautoenable) {
  264. desc->enabled = 1;
  265. desc->unmask(irq);
  266. }
  267. }
  268. spin_unlock_irqrestore(&irq_controller_lock, flags);
  269. return 0;
  270. }
  271. /**
  272.  * request_irq - allocate an interrupt line
  273.  * @irq: Interrupt line to allocate
  274.  * @handler: Function to be called when the IRQ occurs
  275.  * @irqflags: Interrupt type flags
  276.  * @devname: An ascii name for the claiming device
  277.  * @dev_id: A cookie passed back to the handler function
  278.  *
  279.  * This call allocates interrupt resources and enables the
  280.  * interrupt line and IRQ handling. From the point this
  281.  * call is made your handler function may be invoked. Since
  282.  * your handler function must clear any interrupt the board
  283.  * raises, you must take care both to initialise your hardware
  284.  * and to set up the interrupt handler in the right order.
  285.  *
  286.  * Dev_id must be globally unique. Normally the address of the
  287.  * device data structure is used as the cookie. Since the handler
  288.  * receives this value it makes sense to use it.
  289.  *
  290.  * If your interrupt is shared you must pass a non NULL dev_id
  291.  * as this is required when freeing the interrupt.
  292.  *
  293.  * Flags:
  294.  *
  295.  * SA_SHIRQ Interrupt is shared
  296.  *
  297.  * SA_INTERRUPT Disable local interrupts while processing
  298.  *
  299.  * SA_SAMPLE_RANDOM The interrupt can be used for entropy
  300.  *
  301.  */
  302. int request_irq(unsigned int irq, void (*handler)(int, void *, struct pt_regs *),
  303.  unsigned long irq_flags, const char * devname, void *dev_id)
  304. {
  305. unsigned long retval;
  306. struct irqaction *action;
  307. if (irq >= NR_IRQS || !irq_desc[irq].valid || !handler ||
  308.     (irq_flags & SA_SHIRQ && !dev_id))
  309. return -EINVAL;
  310. action = (struct irqaction *)kmalloc(sizeof(struct irqaction), GFP_KERNEL);
  311. if (!action)
  312. return -ENOMEM;
  313. action->handler = handler;
  314. action->flags = irq_flags;
  315. action->mask = 0;
  316. action->name = devname;
  317. action->next = NULL;
  318. action->dev_id = dev_id;
  319. retval = setup_arm_irq(irq, action);
  320. if (retval)
  321. kfree(action);
  322. return retval;
  323. }
  324. /**
  325.  * free_irq - free an interrupt
  326.  * @irq: Interrupt line to free
  327.  * @dev_id: Device identity to free
  328.  *
  329.  * Remove an interrupt handler. The handler is removed and if the
  330.  * interrupt line is no longer in use by any driver it is disabled.
  331.  * On a shared IRQ the caller must ensure the interrupt is disabled
  332.  * on the card it drives before calling this function.
  333.  *
  334.  * This function may be called from interrupt context.
  335.  */
  336. void free_irq(unsigned int irq, void *dev_id)
  337. {
  338. struct irqaction * action, **p;
  339. unsigned long flags;
  340. if (irq >= NR_IRQS || !irq_desc[irq].valid) {
  341. printk(KERN_ERR "Trying to free IRQ%dn",irq);
  342. #ifdef CONFIG_DEBUG_ERRORS
  343. __backtrace();
  344. #endif
  345. return;
  346. }
  347. spin_lock_irqsave(&irq_controller_lock, flags);
  348. for (p = &irq_desc[irq].action; (action = *p) != NULL; p = &action->next) {
  349. if (action->dev_id != dev_id)
  350. continue;
  351.      /* Found it - now free it */
  352. *p = action->next;
  353. kfree(action);
  354. goto out;
  355. }
  356. printk(KERN_ERR "Trying to free free IRQ%dn",irq);
  357. #ifdef CONFIG_DEBUG_ERRORS
  358. __backtrace();
  359. #endif
  360. out:
  361. spin_unlock_irqrestore(&irq_controller_lock, flags);
  362. }
  363. /* Start the interrupt probing.  Unlike other architectures,
  364.  * we don't return a mask of interrupts from probe_irq_on,
  365.  * but return the number of interrupts enabled for the probe.
  366.  * The interrupts which have been enabled for probing is
  367.  * instead recorded in the irq_desc structure.
  368.  */
  369. unsigned long probe_irq_on(void)
  370. {
  371. unsigned int i, irqs = 0;
  372. unsigned long delay;
  373. /*
  374.  * first snaffle up any unassigned but
  375.  * probe-able interrupts
  376.  */
  377. spin_lock_irq(&irq_controller_lock);
  378. for (i = 0; i < NR_IRQS; i++) {
  379. if (!irq_desc[i].valid ||
  380.     !irq_desc[i].probe_ok ||
  381.     irq_desc[i].action)
  382. continue;
  383. irq_desc[i].probing = 1;
  384. irq_desc[i].triggered = 0;
  385. irq_desc[i].unmask(i);
  386. irqs += 1;
  387. }
  388. spin_unlock_irq(&irq_controller_lock);
  389. /*
  390.  * wait for spurious interrupts to mask themselves out again
  391.  */
  392. for (delay = jiffies + HZ/10; time_before(jiffies, delay); )
  393. /* min 100ms delay */;
  394. /*
  395.  * now filter out any obviously spurious interrupts
  396.  */
  397. spin_lock_irq(&irq_controller_lock);
  398. for (i = 0; i < NR_IRQS; i++) {
  399. if (irq_desc[i].probing &&
  400.     irq_desc[i].triggered) {
  401. irq_desc[i].probing = 0;
  402. irqs -= 1;
  403. }
  404. }
  405. spin_unlock_irq(&irq_controller_lock);
  406. /* now filter out any obviously spurious interrupts */
  407. return irqs;
  408. }
  409. /*
  410.  * Possible return values:
  411.  *  >= 0 - interrupt number
  412.  *    -1 - no interrupt/many interrupts
  413.  */
  414. int probe_irq_off(unsigned long irqs)
  415. {
  416. unsigned int i;
  417. int irq_found = NO_IRQ;
  418. /*
  419.  * look at the interrupts, and find exactly one
  420.  * that we were probing has been triggered
  421.  */
  422. spin_lock_irq(&irq_controller_lock);
  423. for (i = 0; i < NR_IRQS; i++) {
  424. if (irq_desc[i].probing &&
  425.     irq_desc[i].triggered) {
  426. if (irq_found != NO_IRQ) {
  427. irq_found = NO_IRQ;
  428. goto out;
  429. }
  430. irq_found = i;
  431. }
  432. }
  433. if (irq_found == -1)
  434. irq_found = NO_IRQ;
  435. out:
  436. spin_unlock_irq(&irq_controller_lock);
  437. return irq_found;
  438. }
  439. void __init init_irq_proc(void)
  440. {
  441. }
  442. void __init init_IRQ(void)
  443. {
  444. extern void init_dma(void);
  445. int irq;
  446. for (irq = 0; irq < NR_IRQS; irq++) {
  447. irq_desc[irq].probe_ok = 0;
  448. irq_desc[irq].valid    = 0;
  449. irq_desc[irq].noautoenable = 0;
  450. irq_desc[irq].mask_ack = dummy_mask_unmask_irq;
  451. irq_desc[irq].mask     = dummy_mask_unmask_irq;
  452. irq_desc[irq].unmask   = dummy_mask_unmask_irq;
  453. }
  454. init_arch_irq();
  455. init_dma();
  456. }