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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * This file is subject to the terms and conditions of the GNU General Public
  3.  * License.  See the file "COPYING" in the main directory of this archive
  4.  * for more details.
  5.  *
  6.  * Code to handle x86 style IRQs plus some generic interrupt stuff.
  7.  *
  8.  * Copyright (C) 1992 Linus Torvalds
  9.  * Copyright (C) 1994 - 2000 Ralf Baechle
  10.  */
  11. #include <linux/kernel.h>
  12. #include <linux/irq.h>
  13. #include <linux/init.h>
  14. #include <linux/interrupt.h>
  15. #include <linux/kernel_stat.h>
  16. #include <linux/slab.h>
  17. #include <linux/mm.h>
  18. #include <linux/random.h>
  19. #include <linux/sched.h>
  20. #include <asm/system.h>
  21. /*
  22.  * Controller mappings for all interrupt sources:
  23.  */
  24. irq_desc_t irq_desc[NR_IRQS] __cacheline_aligned =
  25. { [0 ... NR_IRQS-1] = { 0, &no_irq_type, NULL, 0, SPIN_LOCK_UNLOCKED}};
  26. /*
  27.  * Special irq handlers.
  28.  */
  29. void no_action(int cpl, void *dev_id, struct pt_regs *regs) { }
  30. /*
  31.  * Generic no controller code
  32.  */
  33. static void enable_none(unsigned int irq) { }
  34. static unsigned int startup_none(unsigned int irq) { return 0; }
  35. static void disable_none(unsigned int irq) { }
  36. static void ack_none(unsigned int irq)
  37. {
  38. /*
  39.  * 'what should we do if we get a hw irq event on an illegal vector'.
  40.  * each architecture has to answer this themselves, it doesnt deserve
  41.  * a generic callback i think.
  42.  */
  43. printk("unexpected interrupt %dn", irq);
  44. }
  45. /* startup is the same as "enable", shutdown is same as "disable" */
  46. #define shutdown_none disable_none
  47. #define end_none enable_none
  48. struct hw_interrupt_type no_irq_type = {
  49. "none",
  50. startup_none,
  51. shutdown_none,
  52. enable_none,
  53. disable_none,
  54. ack_none,
  55. end_none
  56. };
  57. volatile unsigned long irq_err_count, spurious_count;
  58. /*
  59.  * Generic, controller-independent functions:
  60.  */
  61. int get_irq_list(char *buf)
  62. {
  63. struct irqaction * action;
  64. char *p = buf;
  65. int i;
  66. p += sprintf(p, "           ");
  67. for (i=0; i < 1 /*smp_num_cpus*/; i++)
  68. p += sprintf(p, "CPU%d       ", i);
  69. *p++ = 'n';
  70. for (i = 0 ; i < NR_IRQS ; i++) {
  71. action = irq_desc[i].action;
  72. if (!action) 
  73. continue;
  74. p += sprintf(p, "%3d: ",i);
  75. p += sprintf(p, "%10u ", kstat_irqs(i));
  76. p += sprintf(p, " %14s", irq_desc[i].handler->typename);
  77. p += sprintf(p, "  %s", action->name);
  78. for (action=action->next; action; action = action->next)
  79. p += sprintf(p, ", %s", action->name);
  80. *p++ = 'n';
  81. }
  82. p += sprintf(p, "ERR: %10lun", irq_err_count);
  83. return p - buf;
  84. }
  85. /*
  86.  * This should really return information about whether
  87.  * we should do bottom half handling etc. Right now we
  88.  * end up _always_ checking the bottom half, which is a
  89.  * waste of time and is not what some drivers would
  90.  * prefer.
  91.  */
  92. int handle_IRQ_event(unsigned int irq, struct pt_regs * regs, struct irqaction * action)
  93. {
  94. int status;
  95. int cpu = smp_processor_id();
  96. irq_enter(cpu, irq);
  97. status = 1; /* Force the "do bottom halves" bit */
  98. if (!(action->flags & SA_INTERRUPT))
  99. __sti();
  100. do {
  101. status |= action->flags;
  102. action->handler(irq, action->dev_id, regs);
  103. action = action->next;
  104. } while (action);
  105. if (status & SA_SAMPLE_RANDOM)
  106. add_interrupt_randomness(irq);
  107. __cli();
  108. irq_exit(cpu, irq);
  109. return status;
  110. }
  111. /*
  112.  * Generic enable/disable code: this just calls
  113.  * down into the PIC-specific version for the actual
  114.  * hardware disable after having gotten the irq
  115.  * controller lock. 
  116.  */
  117.  
  118. /**
  119.  * disable_irq_nosync - disable an irq without waiting
  120.  * @irq: Interrupt to disable
  121.  *
  122.  * Disable the selected interrupt line. Disables of an interrupt
  123.  * stack. Unlike disable_irq(), this function does not ensure existing
  124.  * instances of the IRQ handler have completed before returning.
  125.  *
  126.  * This function may be called from IRQ context.
  127.  */
  128.  
  129. void inline disable_irq_nosync(unsigned int irq)
  130. {
  131. irq_desc_t *desc = irq_desc + irq;
  132. unsigned long flags;
  133. spin_lock_irqsave(&desc->lock, flags);
  134. if (!desc->depth++) {
  135. desc->status |= IRQ_DISABLED;
  136. desc->handler->disable(irq);
  137. }
  138. spin_unlock_irqrestore(&desc->lock, flags);
  139. }
  140. /**
  141.  * disable_irq - disable an irq and wait for completion
  142.  * @irq: Interrupt to disable
  143.  *
  144.  * Disable the selected interrupt line. Disables of an interrupt
  145.  * stack. That is for two disables you need two enables. This
  146.  * function waits for any pending IRQ handlers for this interrupt
  147.  * to complete before returning. If you use this function while
  148.  * holding a resource the IRQ handler may need you will deadlock.
  149.  *
  150.  * This function may be called - with care - from IRQ context.
  151.  */
  152.  
  153. void disable_irq(unsigned int irq)
  154. {
  155. disable_irq_nosync(irq);
  156. if (!local_irq_count(smp_processor_id())) {
  157. do {
  158. barrier();
  159. } while (irq_desc[irq].status & IRQ_INPROGRESS);
  160. }
  161. }
  162. /**
  163.  * enable_irq - enable interrupt handling on an irq
  164.  * @irq: Interrupt to enable
  165.  *
  166.  * Re-enables the processing of interrupts on this IRQ line
  167.  * providing no disable_irq calls are now in effect.
  168.  *
  169.  * This function may be called from IRQ context.
  170.  */
  171.  
  172. void enable_irq(unsigned int irq)
  173. {
  174. irq_desc_t *desc = irq_desc + irq;
  175. unsigned long flags;
  176. spin_lock_irqsave(&desc->lock, flags);
  177. switch (desc->depth) {
  178. case 1: {
  179. unsigned int status = desc->status & ~IRQ_DISABLED;
  180. desc->status = status;
  181. if ((status & (IRQ_PENDING | IRQ_REPLAY)) == IRQ_PENDING) {
  182. desc->status = status | IRQ_REPLAY;
  183. hw_resend_irq(desc->handler,irq);
  184. }
  185. desc->handler->enable(irq);
  186. /* fall-through */
  187. }
  188. default:
  189. desc->depth--;
  190. break;
  191. case 0:
  192. printk("enable_irq(%u) unbalanced from %pn", irq,
  193.        __builtin_return_address(0));
  194. }
  195. spin_unlock_irqrestore(&desc->lock, flags);
  196. }
  197. /*
  198.  * do_IRQ handles all normal device IRQ's (the special
  199.  * SMP cross-CPU interrupts have their own specific
  200.  * handlers).
  201.  */
  202. asmlinkage unsigned int do_IRQ(int irq, struct pt_regs *regs)
  203. {
  204. /* 
  205.  * We ack quickly, we don't want the irq controller
  206.  * thinking we're snobs just because some other CPU has
  207.  * disabled global interrupts (we have already done the
  208.  * INT_ACK cycles, it's too late to try to pretend to the
  209.  * controller that we aren't taking the interrupt).
  210.  *
  211.  * 0 return value means that this irq is already being
  212.  * handled by some other CPU. (or is disabled)
  213.  */
  214. int cpu = smp_processor_id();
  215. irq_desc_t *desc = irq_desc + irq;
  216. struct irqaction * action;
  217. unsigned int status;
  218. kstat.irqs[cpu][irq]++;
  219. spin_lock(&desc->lock);
  220. desc->handler->ack(irq);
  221. /*
  222.    REPLAY is when Linux resends an IRQ that was dropped earlier
  223.    WAITING is used by probe to mark irqs that are being tested
  224.    */
  225. status = desc->status & ~(IRQ_REPLAY | IRQ_WAITING);
  226. status |= IRQ_PENDING; /* we _want_ to handle it */
  227. /*
  228.  * If the IRQ is disabled for whatever reason, we cannot
  229.  * use the action we have.
  230.  */
  231. action = NULL;
  232. if (!(status & (IRQ_DISABLED | IRQ_INPROGRESS))) {
  233. action = desc->action;
  234. status &= ~IRQ_PENDING; /* we commit to handling */
  235. status |= IRQ_INPROGRESS; /* we are handling it */
  236. }
  237. desc->status = status;
  238. /*
  239.  * If there is no IRQ handler or it was disabled, exit early.
  240.    Since we set PENDING, if another processor is handling
  241.    a different instance of this same irq, the other processor
  242.    will take care of it.
  243.  */
  244. if (!action)
  245. goto out;
  246. /*
  247.  * Edge triggered interrupts need to remember
  248.  * pending events.
  249.  * This applies to any hw interrupts that allow a second
  250.  * instance of the same irq to arrive while we are in do_IRQ
  251.  * or in the handler. But the code here only handles the _second_
  252.  * instance of the irq, not the third or fourth. So it is mostly
  253.  * useful for irq hardware that does not mask cleanly in an
  254.  * SMP environment.
  255.  */
  256. for (;;) {
  257. spin_unlock(&desc->lock);
  258. handle_IRQ_event(irq, regs, action);
  259. spin_lock(&desc->lock);
  260. if (!(desc->status & IRQ_PENDING))
  261. break;
  262. desc->status &= ~IRQ_PENDING;
  263. }
  264. desc->status &= ~IRQ_INPROGRESS;
  265. out:
  266. /*
  267.  * The ->end() handler has to deal with interrupts which got
  268.  * disabled while the handler was running.
  269.  */
  270. desc->handler->end(irq);
  271. spin_unlock(&desc->lock);
  272. if (softirq_pending(cpu))
  273. do_softirq();
  274. return 1;
  275. }
  276. /**
  277.  * request_irq - allocate an interrupt line
  278.  * @irq: Interrupt line to allocate
  279.  * @handler: Function to be called when the IRQ occurs
  280.  * @irqflags: Interrupt type flags
  281.  * @devname: An ascii name for the claiming device
  282.  * @dev_id: A cookie passed back to the handler function
  283.  *
  284.  * This call allocates interrupt resources and enables the
  285.  * interrupt line and IRQ handling. From the point this
  286.  * call is made your handler function may be invoked. Since
  287.  * your handler function must clear any interrupt the board 
  288.  * raises, you must take care both to initialise your hardware
  289.  * and to set up the interrupt handler in the right order.
  290.  *
  291.  * Dev_id must be globally unique. Normally the address of the
  292.  * device data structure is used as the cookie. Since the handler
  293.  * receives this value it makes sense to use it.
  294.  *
  295.  * If your interrupt is shared you must pass a non NULL dev_id
  296.  * as this is required when freeing the interrupt.
  297.  *
  298.  * Flags:
  299.  *
  300.  * SA_SHIRQ Interrupt is shared
  301.  *
  302.  * SA_INTERRUPT Disable local interrupts while processing
  303.  *
  304.  * SA_SAMPLE_RANDOM The interrupt can be used for entropy
  305.  *
  306.  */
  307.  
  308. int request_irq(unsigned int irq, 
  309. void (*handler)(int, void *, struct pt_regs *),
  310. unsigned long irqflags, 
  311. const char * devname,
  312. void *dev_id)
  313. {
  314. int retval;
  315. struct irqaction * action;
  316. #if 1
  317. /*
  318.  * Sanity-check: shared interrupts should REALLY pass in
  319.  * a real dev-ID, otherwise we'll have trouble later trying
  320.  * to figure out which interrupt is which (messes up the
  321.  * interrupt freeing logic etc).
  322.  */
  323. if (irqflags & SA_SHIRQ) {
  324. if (!dev_id)
  325. printk("Bad boy: %s (at 0x%x) called us without a dev_id!n", devname, (&irq)[-1]);
  326. }
  327. #endif
  328. if (irq >= NR_IRQS)
  329. return -EINVAL;
  330. if (!handler)
  331. return -EINVAL;
  332. action = (struct irqaction *)
  333. kmalloc(sizeof(struct irqaction), GFP_KERNEL);
  334. if (!action)
  335. return -ENOMEM;
  336. action->handler = handler;
  337. action->flags = irqflags;
  338. action->mask = 0;
  339. action->name = devname;
  340. action->next = NULL;
  341. action->dev_id = dev_id;
  342. retval = setup_irq(irq, action);
  343. if (retval)
  344. kfree(action);
  345. return retval;
  346. }
  347. /**
  348.  * free_irq - free an interrupt
  349.  * @irq: Interrupt line to free
  350.  * @dev_id: Device identity to free
  351.  *
  352.  * Remove an interrupt handler. The handler is removed and if the
  353.  * interrupt line is no longer in use by any driver it is disabled.
  354.  * On a shared IRQ the caller must ensure the interrupt is disabled
  355.  * on the card it drives before calling this function. The function
  356.  * does not return until any executing interrupts for this IRQ
  357.  * have completed.
  358.  *
  359.  * This function may be called from interrupt context. 
  360.  *
  361.  * Bugs: Attempting to free an irq in a handler for the same irq hangs
  362.  *       the machine.
  363.  */
  364.  
  365. void free_irq(unsigned int irq, void *dev_id)
  366. {
  367. irq_desc_t *desc;
  368. struct irqaction **p;
  369. unsigned long flags;
  370. if (irq >= NR_IRQS)
  371. return;
  372. desc = irq_desc + irq;
  373. spin_lock_irqsave(&desc->lock,flags);
  374. p = &desc->action;
  375. for (;;) {
  376. struct irqaction * action = *p;
  377. if (action) {
  378. struct irqaction **pp = p;
  379. p = &action->next;
  380. if (action->dev_id != dev_id)
  381. continue;
  382. /* Found it - now remove it from the list of entries */
  383. *pp = action->next;
  384. if (!desc->action) {
  385. desc->status |= IRQ_DISABLED;
  386. desc->handler->shutdown(irq);
  387. }
  388. spin_unlock_irqrestore(&desc->lock,flags);
  389. #ifdef CONFIG_SMP
  390. /* Wait to make sure it's not being used on another CPU */
  391. while (desc->status & IRQ_INPROGRESS)
  392. barrier();
  393. #endif
  394. kfree(action);
  395. return;
  396. }
  397. printk("Trying to free free IRQ%dn",irq);
  398. spin_unlock_irqrestore(&desc->lock,flags);
  399. return;
  400. }
  401. }
  402. /*
  403.  * IRQ autodetection code..
  404.  *
  405.  * This depends on the fact that any interrupt that
  406.  * comes in on to an unassigned handler will get stuck
  407.  * with "IRQ_WAITING" cleared and the interrupt
  408.  * disabled.
  409.  */
  410. static DECLARE_MUTEX(probe_sem);
  411. /**
  412.  * probe_irq_on - begin an interrupt autodetect
  413.  *
  414.  * Commence probing for an interrupt. The interrupts are scanned
  415.  * and a mask of potential interrupt lines is returned.
  416.  *
  417.  */
  418.  
  419. unsigned long probe_irq_on(void)
  420. {
  421. unsigned int i;
  422. irq_desc_t *desc;
  423. unsigned long val;
  424. unsigned long delay;
  425. down(&probe_sem);
  426. /* 
  427.  * something may have generated an irq long ago and we want to
  428.  * flush such a longstanding irq before considering it as spurious. 
  429.  */
  430. for (i = NR_IRQS-1; i > 0; i--)  {
  431. desc = irq_desc + i;
  432. spin_lock_irq(&desc->lock);
  433. if (!irq_desc[i].action) 
  434. irq_desc[i].handler->startup(i);
  435. spin_unlock_irq(&desc->lock);
  436. }
  437. /* Wait for longstanding interrupts to trigger. */
  438. for (delay = jiffies + HZ/50; time_after(delay, jiffies); )
  439. /* about 20ms delay */ synchronize_irq();
  440. /*
  441.  * enable any unassigned irqs
  442.  * (we must startup again here because if a longstanding irq
  443.  * happened in the previous stage, it may have masked itself)
  444.  */
  445. for (i = NR_IRQS-1; i > 0; i--) {
  446. desc = irq_desc + i;
  447. spin_lock_irq(&desc->lock);
  448. if (!desc->action) {
  449. desc->status |= IRQ_AUTODETECT | IRQ_WAITING;
  450. if (desc->handler->startup(i))
  451. desc->status |= IRQ_PENDING;
  452. }
  453. spin_unlock_irq(&desc->lock);
  454. }
  455. /*
  456.  * Wait for spurious interrupts to trigger
  457.  */
  458. for (delay = jiffies + HZ/10; time_after(delay, jiffies); )
  459. /* about 100ms delay */ synchronize_irq();
  460. /*
  461.  * Now filter out any obviously spurious interrupts
  462.  */
  463. val = 0;
  464. for (i = 0; i < NR_IRQS; i++) {
  465. irq_desc_t *desc = irq_desc + i;
  466. unsigned int status;
  467. spin_lock_irq(&desc->lock);
  468. status = desc->status;
  469. if (status & IRQ_AUTODETECT) {
  470. /* It triggered already - consider it spurious. */
  471. if (!(status & IRQ_WAITING)) {
  472. desc->status = status & ~IRQ_AUTODETECT;
  473. desc->handler->shutdown(i);
  474. } else
  475. if (i < 32)
  476. val |= 1 << i;
  477. }
  478. spin_unlock_irq(&desc->lock);
  479. }
  480. return val;
  481. }
  482. /*
  483.  * Return a mask of triggered interrupts (this
  484.  * can handle only legacy ISA interrupts).
  485.  */
  486.  
  487. /**
  488.  * probe_irq_mask - scan a bitmap of interrupt lines
  489.  * @val: mask of interrupts to consider
  490.  *
  491.  * Scan the ISA bus interrupt lines and return a bitmap of
  492.  * active interrupts. The interrupt probe logic state is then
  493.  * returned to its previous value.
  494.  *
  495.  * Note: we need to scan all the irq's even though we will
  496.  * only return ISA irq numbers - just so that we reset them
  497.  * all to a known state.
  498.  */
  499. unsigned int probe_irq_mask(unsigned long val)
  500. {
  501. int i;
  502. unsigned int mask;
  503. mask = 0;
  504. for (i = 0; i < NR_IRQS; i++) {
  505. irq_desc_t *desc = irq_desc + i;
  506. unsigned int status;
  507. spin_lock_irq(&desc->lock);
  508. status = desc->status;
  509. if (status & IRQ_AUTODETECT) {
  510. if (i < 16 && !(status & IRQ_WAITING))
  511. mask |= 1 << i;
  512. desc->status = status & ~IRQ_AUTODETECT;
  513. desc->handler->shutdown(i);
  514. }
  515. spin_unlock_irq(&desc->lock);
  516. }
  517. up(&probe_sem);
  518. return mask & val;
  519. }
  520. /*
  521.  * Return the one interrupt that triggered (this can
  522.  * handle any interrupt source).
  523.  */
  524. /**
  525.  * probe_irq_off - end an interrupt autodetect
  526.  * @val: mask of potential interrupts (unused)
  527.  *
  528.  * Scans the unused interrupt lines and returns the line which
  529.  * appears to have triggered the interrupt. If no interrupt was
  530.  * found then zero is returned. If more than one interrupt is
  531.  * found then minus the first candidate is returned to indicate
  532.  * their is doubt.
  533.  *
  534.  * The interrupt probe logic state is returned to its previous
  535.  * value.
  536.  *
  537.  * BUGS: When used in a module (which arguably shouldnt happen)
  538.  * nothing prevents two IRQ probe callers from overlapping. The
  539.  * results of this are non-optimal.
  540.  */
  541.  
  542. int probe_irq_off(unsigned long val)
  543. {
  544. int i, irq_found, nr_irqs;
  545. nr_irqs = 0;
  546. irq_found = 0;
  547. for (i = 0; i < NR_IRQS; i++) {
  548. irq_desc_t *desc = irq_desc + i;
  549. unsigned int status;
  550. spin_lock_irq(&desc->lock);
  551. status = desc->status;
  552. if (status & IRQ_AUTODETECT) {
  553. if (!(status & IRQ_WAITING)) {
  554. if (!nr_irqs)
  555. irq_found = i;
  556. nr_irqs++;
  557. }
  558. desc->status = status & ~IRQ_AUTODETECT;
  559. desc->handler->shutdown(i);
  560. }
  561. spin_unlock_irq(&desc->lock);
  562. }
  563. up(&probe_sem);
  564. if (nr_irqs > 1)
  565. irq_found = -irq_found;
  566. return irq_found;
  567. }
  568. /* this was setup_x86_irq but it seems pretty generic */
  569. int setup_irq(unsigned int irq, struct irqaction * new)
  570. {
  571. int shared = 0;
  572. unsigned long flags;
  573. struct irqaction *old, **p;
  574. irq_desc_t *desc = irq_desc + irq;
  575. /*
  576.  * Some drivers like serial.c use request_irq() heavily,
  577.  * so we have to be careful not to interfere with a
  578.  * running system.
  579.  */
  580. if (new->flags & SA_SAMPLE_RANDOM) {
  581. /*
  582.  * This function might sleep, we want to call it first,
  583.  * outside of the atomic block.
  584.  * Yes, this might clear the entropy pool if the wrong
  585.  * driver is attempted to be loaded, without actually
  586.  * installing a new handler, but is this really a problem,
  587.  * only the sysadmin is able to do this.
  588.  */
  589. rand_initialize_irq(irq);
  590. }
  591. /*
  592.  * The following block of code has to be executed atomically
  593.  */
  594. spin_lock_irqsave(&desc->lock,flags);
  595. p = &desc->action;
  596. if ((old = *p) != NULL) {
  597. /* Can't share interrupts unless both agree to */
  598. if (!(old->flags & new->flags & SA_SHIRQ)) {
  599. spin_unlock_irqrestore(&desc->lock,flags);
  600. return -EBUSY;
  601. }
  602. /* add new interrupt at end of irq queue */
  603. do {
  604. p = &old->next;
  605. old = *p;
  606. } while (old);
  607. shared = 1;
  608. }
  609. *p = new;
  610. if (!shared) {
  611. desc->depth = 0;
  612. desc->status &= ~(IRQ_DISABLED | IRQ_AUTODETECT | IRQ_WAITING);
  613. desc->handler->startup(irq);
  614. }
  615. spin_unlock_irqrestore(&desc->lock,flags);
  616. /* register_irq_proc(irq); */
  617. return 0;
  618. }
  619. void __init init_generic_irq(void)
  620. {
  621. int i;
  622. for (i = 0; i < NR_IRQS; i++) {
  623. irq_desc[i].status  = IRQ_DISABLED;
  624. irq_desc[i].action  = NULL;
  625. irq_desc[i].depth   = 1;
  626. irq_desc[i].handler = &no_irq_type;
  627. }
  628. }