irq.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:21k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* 
  2.  * Code to handle x86 style IRQs plus some generic interrupt stuff.
  3.  *
  4.  * Copyright (C) 1992 Linus Torvalds
  5.  * Copyright (C) 1994, 1995, 1996, 1997, 1998 Ralf Baechle
  6.  * Copyright (C) 1999 SuSE GmbH (Philipp Rumpf, prumpf@tux.org)
  7.  * Copyright (C) 1999-2000 Grant Grundler
  8.  *
  9.  *    This program is free software; you can redistribute it and/or modify
  10.  *    it under the terms of the GNU General Public License as published by
  11.  *    the Free Software Foundation; either version 2, or (at your option)
  12.  *    any later version.
  13.  *
  14.  *    This program is distributed in the hope that it will be useful,
  15.  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  *    GNU General Public License for more details.
  18.  *
  19.  *    You should have received a copy of the GNU General Public License
  20.  *    along with this program; if not, write to the Free Software
  21.  *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  22.  */
  23. #include <linux/bitops.h>
  24. #include <asm/bitops.h>
  25. #include <linux/config.h>
  26. #include <asm/pdc.h>
  27. #include <linux/errno.h>
  28. #include <linux/init.h>
  29. #include <linux/signal.h>
  30. #include <linux/types.h>
  31. #include <linux/ioport.h>
  32. #include <linux/timex.h>
  33. #include <linux/slab.h>
  34. #include <linux/random.h>
  35. #include <linux/sched.h>
  36. #include <linux/interrupt.h>
  37. #include <linux/kernel_stat.h>
  38. #include <linux/irq.h>
  39. #include <linux/spinlock.h>
  40. #include <asm/cache.h>
  41. #undef DEBUG_IRQ
  42. #undef PARISC_IRQ_CR16_COUNTS
  43. extern void timer_interrupt(int, void *, struct pt_regs *);
  44. extern void ipi_interrupt(int, void *, struct pt_regs *);
  45. #ifdef DEBUG_IRQ
  46. #define DBG_IRQ(irq, x) if ((irq) != TIMER_IRQ) printk x
  47. #else /* DEBUG_IRQ */
  48. #define DBG_IRQ(irq, x) do { } while (0)
  49. #endif /* DEBUG_IRQ */
  50. #define EIEM_MASK(irq)       (1UL<<(MAX_CPU_IRQ-IRQ_OFFSET(irq)))
  51. /* Bits in EIEM correlate with cpu_irq_action[].
  52. ** Numbered *Big Endian*! (ie bit 0 is MSB)
  53. */
  54. static unsigned long cpu_eiem = 0;
  55. static spinlock_t irq_lock = SPIN_LOCK_UNLOCKED;  /* protect IRQ regions */
  56. #ifdef CONFIG_SMP
  57. static void cpu_set_eiem(void *info)
  58. {
  59. set_eiem((unsigned long) info);
  60. }
  61. #endif
  62. static inline void disable_cpu_irq(void *unused, int irq)
  63. {
  64. unsigned long eirr_bit = EIEM_MASK(irq);
  65. cpu_eiem &= ~eirr_bit;
  66. set_eiem(cpu_eiem);
  67.         smp_call_function(cpu_set_eiem, (void *) cpu_eiem, 1, 1);
  68. }
  69. static void enable_cpu_irq(void *unused, int irq)
  70. {
  71. unsigned long eirr_bit = EIEM_MASK(irq);
  72. mtctl(eirr_bit, 23); /* clear EIRR bit before unmasking */
  73. cpu_eiem |= eirr_bit;
  74.         smp_call_function(cpu_set_eiem, (void *) cpu_eiem, 1, 1);
  75. set_eiem(cpu_eiem);
  76. }
  77. /* mask and disable are the same at the CPU level
  78. ** Difference is enable clears pending interrupts
  79. */
  80. #define mask_cpu_irq disable_cpu_irq
  81. static inline void unmask_cpu_irq(void *unused, int irq)
  82. {
  83. unsigned long eirr_bit = EIEM_MASK(irq);
  84. cpu_eiem |= eirr_bit;
  85. /* NOTE: sending an IPI will cause do_cpu_irq_mask() to
  86. ** handle *any* unmasked pending interrupts.
  87. ** ie We don't need to check for pending interrupts here.
  88. */
  89.         smp_call_function(cpu_set_eiem, (void *) cpu_eiem, 1, 1);
  90. set_eiem(cpu_eiem);
  91. }
  92. /*
  93.  * XXX cpu_irq_actions[] will become 2 dimensional for per CPU EIR support.
  94.  * correspond changes needed in:
  95.  *  processor_probe() initialize additional action arrays
  96.  *  request_irq() handle CPU IRQ region specially
  97.  *  do_cpu_irq_mask() index into the matching irq_action array.
  98.  */
  99. struct irqaction cpu_irq_actions[IRQ_PER_REGION] = {
  100. [IRQ_OFFSET(TIMER_IRQ)] { handler: timer_interrupt, name: "timer", },
  101. #ifdef CONFIG_SMP
  102. [IRQ_OFFSET(IPI_IRQ)] { handler: ipi_interrupt,   name: "IPI", },
  103. #endif
  104. };
  105. struct irq_region_ops cpu_irq_ops = {
  106. disable_cpu_irq, enable_cpu_irq, unmask_cpu_irq, unmask_cpu_irq
  107. };
  108. struct irq_region cpu0_irq_region = {
  109. ops: { disable_cpu_irq, enable_cpu_irq, unmask_cpu_irq, unmask_cpu_irq },
  110. data: { dev: &cpu_data[0],
  111.   name: "PARISC-CPU",
  112.   irqbase: IRQ_FROM_REGION(CPU_IRQ_REGION), },
  113. action: cpu_irq_actions,
  114. };
  115. struct irq_region *irq_region[NR_IRQ_REGS] = {
  116. [ 0 ]              NULL, /* reserved for EISA, else causes data page fault (aka code 15) */
  117. [ CPU_IRQ_REGION ] &cpu0_irq_region,
  118. };
  119. /*
  120. ** Generic interfaces that device drivers can use:
  121. **    mask_irq() block IRQ
  122. **    unmask_irq() re-enable IRQ and trigger if IRQ is pending
  123. **    disable_irq() block IRQ
  124. **    enable_irq() clear pending and re-enable IRQ
  125. */
  126. void mask_irq(int irq)
  127. {
  128. struct irq_region *region;
  129. DBG_IRQ(irq, ("mask_irq(%d) %d+%d eiem 0x%lxn", irq,
  130. IRQ_REGION(irq), IRQ_OFFSET(irq), cpu_eiem));
  131. irq = irq_cannonicalize(irq);
  132. region = irq_region[IRQ_REGION(irq)];
  133. if (region->ops.mask_irq)
  134. region->ops.mask_irq(region->data.dev, IRQ_OFFSET(irq));
  135. }
  136. void unmask_irq(int irq)
  137. {
  138. struct irq_region *region;
  139. DBG_IRQ(irq, ("unmask_irq(%d) %d+%d eiem 0x%lxn", irq,
  140. IRQ_REGION(irq), IRQ_OFFSET(irq), cpu_eiem));
  141. irq = irq_cannonicalize(irq);
  142. region = irq_region[IRQ_REGION(irq)];
  143. if (region->ops.unmask_irq)
  144. region->ops.unmask_irq(region->data.dev, IRQ_OFFSET(irq));
  145. }
  146. void disable_irq(int irq)
  147. {
  148. struct irq_region *region;
  149. DBG_IRQ(irq, ("disable_irq(%d) %d+%d eiem 0x%lxn", irq,
  150. IRQ_REGION(irq), IRQ_OFFSET(irq), cpu_eiem));
  151. irq = irq_cannonicalize(irq);
  152. region = irq_region[IRQ_REGION(irq)];
  153. if (region->ops.disable_irq)
  154. region->ops.disable_irq(region->data.dev, IRQ_OFFSET(irq));
  155. else
  156. BUG();
  157. }
  158. void enable_irq(int irq)
  159. {
  160. struct irq_region *region;
  161. DBG_IRQ(irq, ("enable_irq(%d) %d+%d eiem 0x%lxn", irq,
  162. IRQ_REGION(irq), IRQ_OFFSET(irq), cpu_eiem));
  163. irq = irq_cannonicalize(irq);
  164. region = irq_region[IRQ_REGION(irq)];
  165. if (region->ops.enable_irq)
  166. region->ops.enable_irq(region->data.dev, IRQ_OFFSET(irq));
  167. else
  168. BUG();
  169. }
  170. int get_irq_list(char *buf)
  171. {
  172. #ifdef CONFIG_PROC_FS
  173. char *p = buf;
  174. unsigned int regnr;
  175. p += sprintf(p, "     ");
  176. #ifdef CONFIG_SMP
  177. for (regnr = 0; regnr < smp_num_cpus; regnr++)
  178. #endif
  179. p += sprintf(p, "     CPU%02d ", regnr);
  180. #ifdef PARISC_IRQ_CR16_COUNTS
  181. p += sprintf(p, "[min/avg/max] (CPU cycle counts)");
  182. #endif
  183. *p++ = 'n';
  184. /* We don't need *irqsave lock variants since this is
  185. ** only allowed to change while in the base context.
  186. */
  187. spin_lock(&irq_lock);
  188. for (regnr = 0; regnr < NR_IRQ_REGS; regnr++) {
  189.     unsigned int i;
  190.     struct irq_region *region = irq_region[regnr];
  191. #ifdef CONFIG_SMP
  192.     unsigned int j;
  193. #endif
  194.             if (!region || !region->action)
  195. continue;
  196.     for (i = 0; i <= MAX_CPU_IRQ; i++) {
  197. struct irqaction *action = &region->action[i];
  198. unsigned int irq_no = IRQ_FROM_REGION(regnr) + i;
  199. if (!action->handler)
  200. continue;
  201. p += sprintf(p, "%3d: ", irq_no);
  202. #ifndef CONFIG_SMP
  203. p += sprintf(p, "%10u ", kstat_irqs(irq_no));
  204. #else
  205. for (j = 0; j < smp_num_cpus; j++)
  206. p += sprintf(p, "%10u ",
  207. kstat.irqs[j][regnr][i]);
  208. #endif
  209. p += sprintf(p, " %14s",
  210.     region->data.name ? region->data.name : "N/A");
  211. #ifndef PARISC_IRQ_CR16_COUNTS
  212. p += sprintf(p, "  %s", action->name);
  213. while ((action = action->next))
  214. p += sprintf(p, ", %s", action->name);
  215. #else
  216. for ( ;action; action = action->next) {
  217. unsigned int i, avg, min, max;
  218. min = max = action->cr16_hist[0];
  219. for (avg = i = 0; i < PARISC_CR16_HIST_SIZE; i++) {
  220. int hist = action->cr16_hist[i];
  221. if (hist) {
  222. avg += hist;
  223. } else
  224. break;
  225. if (hist > max) max = hist;
  226. if (hist < min) min = hist;
  227. }
  228. avg /= i;
  229. p += sprintf(p, " %s[%d/%d/%d]", action->name,
  230. min,avg,max);
  231. }
  232. #endif
  233. *p++ = 'n';
  234.     }
  235. }
  236. spin_unlock(&irq_lock);
  237. p += sprintf(p, "n");
  238. return p - buf;
  239. #else /* CONFIG_PROC_FS */
  240. return 0;
  241. #endif /* CONFIG_PROC_FS */
  242. }
  243. /*
  244. ** The following form a "set": Virtual IRQ, Transaction Address, Trans Data.
  245. ** Respectively, these map to IRQ region+EIRR, Processor HPA, EIRR bit.
  246. **
  247. ** To use txn_XXX() interfaces, get a Virtual IRQ first.
  248. ** Then use that to get the Transaction address and data.
  249. */
  250. int
  251. txn_alloc_irq(void)
  252. {
  253. int irq;
  254. /* never return irq 0 cause that's the interval timer */
  255. for (irq = 1; irq <= MAX_CPU_IRQ; irq++) {
  256. if (cpu_irq_actions[irq].handler == NULL) {
  257. return (IRQ_FROM_REGION(CPU_IRQ_REGION) + irq);
  258. }
  259. }
  260. /* unlikely, but be prepared */
  261. return -1;
  262. }
  263. int
  264. txn_claim_irq(int irq)
  265. {
  266. if (irq_region[IRQ_REGION(irq)]->action[IRQ_OFFSET(irq)].handler ==NULL)
  267. return irq;
  268. /* unlikely, but be prepared */
  269. return -1;
  270. }
  271. unsigned long
  272. txn_alloc_addr(int virt_irq)
  273. {
  274. static int next_cpu = -1;
  275. next_cpu++; /* assign to "next" CPU we want this bugger on */
  276. /* validate entry */
  277. while ((next_cpu < NR_CPUS) && !cpu_data[next_cpu].txn_addr)
  278. next_cpu++;
  279. if (next_cpu >= NR_CPUS) 
  280. next_cpu = 0; /* nothing else, assign monarch */
  281. return cpu_data[next_cpu].txn_addr;
  282. }
  283. /*
  284. ** The alloc process needs to accept a parameter to accomodate limitations
  285. ** of the HW/SW which use these bits:
  286. ** Legacy PA I/O (GSC/NIO): 5 bits (architected EIM register)
  287. ** V-class (EPIC):          6 bits
  288. ** N/L-class/A500:          8 bits (iosapic)
  289. ** PCI 2.2 MSI:             16 bits (I think)
  290. ** Existing PCI devices:    32-bits (all Symbios SCSI/ATM/HyperFabric)
  291. **
  292. ** On the service provider side:
  293. ** o PA 1.1 (and PA2.0 narrow mode)     5-bits (width of EIR register)
  294. ** o PA 2.0 wide mode                   6-bits (per processor)
  295. ** o IA64                               8-bits (0-256 total)
  296. **
  297. ** So a Legacy PA I/O device on a PA 2.0 box can't use all
  298. ** the bits supported by the processor...and the N/L-class
  299. ** I/O subsystem supports more bits than PA2.0 has. The first
  300. ** case is the problem.
  301. */
  302. unsigned int
  303. txn_alloc_data(int virt_irq, unsigned int bits_wide)
  304. {
  305. /* XXX FIXME : bits_wide indicates how wide the transaction
  306. ** data is allowed to be...we may need a different virt_irq
  307. ** if this one won't work. Another reason to index virtual
  308. ** irq's into a table which can manage CPU/IRQ bit seperately.
  309. */
  310. if (IRQ_OFFSET(virt_irq) > (1 << (bits_wide -1)))
  311. {
  312. panic("Sorry -- didn't allocate valid IRQ for this devicen");
  313. }
  314. return (IRQ_OFFSET(virt_irq));
  315. }
  316. void do_irq(struct irqaction *action, int irq, struct pt_regs * regs)
  317. {
  318. int cpu = smp_processor_id();
  319. irq_enter(cpu, irq);
  320. ++kstat.irqs[cpu][IRQ_REGION(irq)][IRQ_OFFSET(irq)];
  321. DBG_IRQ(irq, ("do_irq(%d) %d+%dn", irq, IRQ_REGION(irq), IRQ_OFFSET(irq)));
  322. for (; action; action = action->next) {
  323. #ifdef PARISC_IRQ_CR16_COUNTS
  324. unsigned long cr_start = mfctl(16);
  325. #endif
  326. if (action->handler == NULL) {
  327. if (IRQ_REGION(irq) == EISA_IRQ_REGION && irq_region[EISA_IRQ_REGION]) {
  328. /* were we called due to autodetecting (E)ISA irqs ? */
  329. unsigned int *status;
  330. status = &irq_region[EISA_IRQ_REGION]->data.status[IRQ_OFFSET(irq)];
  331. if (*status & IRQ_AUTODETECT) {
  332. *status &= ~IRQ_WAITING;
  333. continue; 
  334. }
  335. }
  336. printk(KERN_ERR "IRQ:  CPU:%d No handler for IRQ %d !n", cpu, irq);
  337. continue;
  338. }
  339. action->handler(irq, action->dev_id, regs);
  340. #ifdef PARISC_IRQ_CR16_COUNTS
  341. {
  342. unsigned long cr_end = mfctl(16);
  343. unsigned long tmp = cr_end - cr_start;
  344. /* check for roll over */
  345. cr_start = (cr_end < cr_start) ?  -(tmp) : (tmp);
  346. }
  347. action->cr16_hist[action->cr16_idx++] = (int) cr_start;
  348. action->cr16_idx &= PARISC_CR16_HIST_SIZE - 1;
  349. #endif
  350. }
  351. irq_exit(cpu, irq);
  352. }
  353. /* ONLY called from entry.S:intr_extint() */
  354. void do_cpu_irq_mask(struct pt_regs *regs)
  355. {
  356. unsigned long eirr_val;
  357. unsigned int i=3; /* limit time in interrupt context */
  358. /*
  359.  * PSW_I or EIEM bits cannot be enabled until after the
  360.  * interrupts are processed.
  361.  * timer_interrupt() assumes it won't get interrupted when it
  362.  * holds the xtime_lock...an unmasked interrupt source could
  363.  * interrupt and deadlock by trying to grab xtime_lock too.
  364.  * Keeping PSW_I and EIEM disabled avoids this.
  365.  */
  366. set_eiem(0UL); /* disable all extr interrupt for now */
  367. /* 1) only process IRQs that are enabled/unmasked (cpu_eiem)
  368.  * 2) We loop here on EIRR contents in order to avoid
  369.  *    nested interrupts or having to take another interupt
  370.  *    when we could have just handled it right away.
  371.  * 3) Limit the number of times we loop to make sure other
  372.  *    processing can occur.
  373.  */
  374. while ((eirr_val = (mfctl(23) & cpu_eiem)) && --i) {
  375. unsigned long bit = (1UL<<MAX_CPU_IRQ);
  376. unsigned int irq;
  377. mtctl(eirr_val, 23); /* reset bits we are going to process */
  378. #ifdef DEBUG_IRQ
  379. if (eirr_val != (1UL << MAX_CPU_IRQ))
  380. printk(KERN_DEBUG "do_cpu_irq_mask  %xn", eirr_val);
  381. #endif
  382. for (irq = 0; eirr_val && bit; bit>>=1, irq++)
  383. {
  384. if (!(bit&eirr_val))
  385. continue;
  386. /* clear bit in mask - can exit loop sooner */
  387. eirr_val &= ~bit;
  388. do_irq(&cpu_irq_actions[irq], TIMER_IRQ+irq, regs);
  389. }
  390. }
  391. set_eiem(cpu_eiem);
  392. }
  393. /* Called from second level IRQ regions: eg dino or iosapic. */
  394. void do_irq_mask(unsigned long mask, struct irq_region *region, struct pt_regs *regs)
  395. {
  396. unsigned long bit;
  397. unsigned int irq;
  398. #ifdef DEBUG_IRQ
  399. if (mask != (1L<<MAX_CPU_IRQ))
  400.     printk(KERN_DEBUG "do_irq_mask %08lx %p %pn", mask, region, regs);
  401. #endif
  402. for (bit = (1L<<MAX_CPU_IRQ), irq = 0; mask && bit; bit>>=1, irq++) {
  403. unsigned int irq_num;
  404. if (!(bit&mask))
  405. continue;
  406. mask &= ~bit; /* clear bit in mask - can exit loop sooner */
  407. irq_num = region->data.irqbase + irq;
  408. mask_irq(irq_num);
  409. do_irq(&region->action[irq], irq_num, regs);
  410. unmask_irq(irq_num);
  411. }
  412. }
  413. static inline int find_free_region(void)
  414. {
  415. int irqreg;
  416. for (irqreg=1; irqreg <= (NR_IRQ_REGS); irqreg++) {
  417. if (irq_region[irqreg] == NULL)
  418. return irqreg;
  419. }
  420. return 0;
  421. }
  422. /*****
  423.  * alloc_irq_region - allocate/init a new IRQ region
  424.  * @count: number of IRQs in this region.
  425.  * @ops: function table with request/release/mask/unmask/etc.. entries.
  426.  * @name: name of region owner for /proc/interrupts output.
  427.  * @dev: private data to associate with the new IRQ region.
  428.  *
  429.  * Every IRQ must become a MMIO write to the CPU's EIRR in
  430.  * order to get CPU service. The IRQ region represents the
  431.  * number of unique events the region handler can (or must)
  432.  * identify. For PARISC CPU, that's the width of the EIR Register.
  433.  * IRQ regions virtualize IRQs (eg EISA or PCI host bus controllers)
  434.  * for line based devices.
  435.  */
  436. struct irq_region *alloc_irq_region( int count, struct irq_region_ops *ops,
  437. const char *name, void *dev)
  438. {
  439. struct irq_region *region;
  440. int index;
  441. index = find_free_region();
  442. if (index == 0) {
  443. printk(KERN_ERR "Maximum number of irq regions exceeded. Increase NR_IRQ_REGS!n");
  444. return NULL;
  445. }
  446. if ((IRQ_REGION(count-1)))
  447. return NULL;
  448. if (count < IRQ_PER_REGION) {
  449.     DBG_IRQ(0, ("alloc_irq_region() using minimum of %d irq lines for %s (%d)n",
  450. IRQ_PER_REGION, name, count));
  451.     count = IRQ_PER_REGION;
  452. }
  453. /* if either mask *or* unmask is set, both have to be set. */
  454. if((ops->mask_irq || ops->unmask_irq) &&
  455. !(ops->mask_irq && ops->unmask_irq))
  456. return NULL;
  457. /* ditto for enable/disable */
  458. if( (ops->disable_irq || ops->enable_irq) &&
  459. !(ops->disable_irq && ops->enable_irq) )
  460. return NULL;
  461. region = kmalloc(sizeof(*region), GFP_ATOMIC);
  462. if (!region)
  463. return NULL;
  464. memset(region, 0, sizeof(*region));
  465. region->action = kmalloc(count * sizeof(*region->action), GFP_ATOMIC);
  466. if (!region->action) {
  467. kfree(region);
  468. return NULL;
  469. }
  470. memset(region->action, 0, count * sizeof(*region->action));
  471. region->ops = *ops;
  472. region->data.irqbase = IRQ_FROM_REGION(index);
  473. region->data.name = name;
  474. region->data.dev = dev;
  475. irq_region[index] = region;
  476. return irq_region[index];
  477. }
  478. /* FIXME: SMP, flags, bottom halves, rest */
  479. int request_irq(unsigned int irq,
  480. void (*handler)(int, void *, struct pt_regs *),
  481. unsigned long irqflags,
  482. const char * devname,
  483. void *dev_id)
  484. {
  485. struct irqaction * action;
  486. #if 0
  487. printk(KERN_INFO "request_irq(%d, %p, 0x%lx, %s, %p)n",irq, handler, irqflags, devname, dev_id);
  488. #endif
  489. irq = irq_cannonicalize(irq);
  490. /* request_irq()/free_irq() may not be called from interrupt context. */
  491. if (in_interrupt())
  492. BUG();
  493. if (!handler) {
  494. printk(KERN_ERR "request_irq(%d,...): Augh! No handler for irq!n",
  495. irq);
  496. return -EINVAL;
  497. }
  498. if (irq_region[IRQ_REGION(irq)] == NULL) {
  499. /*
  500. ** Bug catcher for drivers which use "char" or u8 for
  501. ** the IRQ number. They lose the region number which
  502. ** is in pcidev->irq (an int).
  503. */
  504. printk(KERN_ERR "%p (%s?) called request_irq with an invalid irq %dn",
  505. __builtin_return_address(0), devname, irq);
  506. return -EINVAL;
  507. }
  508. spin_lock(&irq_lock);
  509. action = &(irq_region[IRQ_REGION(irq)]->action[IRQ_OFFSET(irq)]);
  510. /* First one is preallocated. */
  511. if (action->handler) {
  512. /* But it's in use...find the tail and allocate a new one */
  513. while (action->next)
  514. action = action->next;
  515. action->next = kmalloc(sizeof(*action), GFP_ATOMIC);
  516. memset(action->next, 0, sizeof(*action));
  517. action = action->next;
  518. }
  519. if (!action) {
  520. spin_unlock(&irq_lock);
  521. printk(KERN_ERR "request_irq(): Augh! No action!n") ;
  522. return -ENOMEM;
  523. }
  524. action->handler = handler;
  525. action->flags = irqflags;
  526. action->mask = 0;
  527. action->name = devname;
  528. action->next = NULL;
  529. action->dev_id = dev_id;
  530. spin_unlock(&irq_lock);
  531. enable_irq(irq);
  532. return 0;
  533. }
  534. void free_irq(unsigned int irq, void *dev_id)
  535. {
  536. struct irqaction *action, **p;
  537. /* See comments in request_irq() about interrupt context */
  538. irq = irq_cannonicalize(irq);
  539. if (in_interrupt()) BUG();
  540. spin_lock(&irq_lock);
  541. action = &irq_region[IRQ_REGION(irq)]->action[IRQ_OFFSET(irq)];
  542. if (action->dev_id == dev_id) {
  543. if (action->next == NULL) {
  544. action->handler = NULL;
  545. } else {
  546. memcpy(action, action->next, sizeof(*action));
  547. }
  548. spin_unlock(&irq_lock);
  549. return;
  550. }
  551. p = &action->next;
  552. action = action->next;
  553. for (; (action = *p) != NULL; p = &action->next) {
  554. if (action->dev_id != dev_id)
  555. continue;
  556. /* Found it - now free it */
  557. *p = action->next;
  558. kfree(action);
  559. spin_unlock(&irq_lock);
  560. return;
  561. }
  562. spin_unlock(&irq_lock);
  563. printk(KERN_ERR "Trying to free free IRQ%dn",irq);
  564. }
  565. /*
  566.  * IRQ autodetection code..
  567.  *
  568.  * This depends on the fact that any interrupt that
  569.  * comes in on to an unassigned handler will get stuck
  570.  * with "IRQ_WAITING" cleared and the interrupt
  571.  * disabled.
  572.  */
  573. static DECLARE_MUTEX(probe_sem);
  574. /**
  575.  * probe_irq_on - begin an interrupt autodetect
  576.  *
  577.  * Commence probing for an interrupt. The interrupts are scanned
  578.  * and a mask of potential interrupt lines is returned.
  579.  *
  580.  */
  581. /* TODO: spin_lock_irq(desc->lock -> irq_lock) */
  582. unsigned long probe_irq_on(void)
  583. {
  584. unsigned int i;
  585. unsigned long val;
  586. unsigned long delay;
  587. struct irq_region *region;
  588. /* support for irq autoprobing is limited to EISA (irq region 0) */
  589. region = irq_region[EISA_IRQ_REGION];
  590. if (!EISA_bus || !region)
  591. return 0;
  592. down(&probe_sem);
  593. /*
  594.  * enable any unassigned irqs
  595.  * (we must startup again here because if a longstanding irq
  596.  * happened in the previous stage, it may have masked itself)
  597.  */
  598. for (i = EISA_MAX_IRQS-1; i > 0; i--) {
  599. struct irqaction *action;
  600. spin_lock_irq(&irq_lock);
  601. action = region->action + i;
  602. if (!action->handler) {
  603. region->data.status[i] |= IRQ_AUTODETECT | IRQ_WAITING;
  604. region->ops.enable_irq(region->data.dev,i);
  605. }
  606. spin_unlock_irq(&irq_lock);
  607. }
  608. /*
  609.  * Wait for spurious interrupts to trigger
  610.  */
  611. for (delay = jiffies + HZ/10; time_after(delay, jiffies); )
  612. /* about 100ms delay */ synchronize_irq();
  613. /*
  614.  * Now filter out any obviously spurious interrupts
  615.  */
  616. val = 0;
  617. for (i = 0; i < EISA_MAX_IRQS; i++) {
  618. unsigned int status;
  619. spin_lock_irq(&irq_lock);
  620. status = region->data.status[i];
  621. if (status & IRQ_AUTODETECT) {
  622. /* It triggered already - consider it spurious. */
  623. if (!(status & IRQ_WAITING)) {
  624. region->data.status[i] = status & ~IRQ_AUTODETECT;
  625. region->ops.disable_irq(region->data.dev,i);
  626. } else
  627. if (i < BITS_PER_LONG)
  628. val |= (1 << i);
  629. }
  630. spin_unlock_irq(&irq_lock);
  631. }
  632. return val;
  633. }
  634. /*
  635.  * Return the one interrupt that triggered (this can
  636.  * handle any interrupt source).
  637.  */
  638. /**
  639.  * probe_irq_off - end an interrupt autodetect
  640.  * @val: mask of potential interrupts (unused)
  641.  *
  642.  * Scans the unused interrupt lines and returns the line which
  643.  * appears to have triggered the interrupt. If no interrupt was
  644.  * found then zero is returned. If more than one interrupt is
  645.  * found then minus the first candidate is returned to indicate
  646.  * their is doubt.
  647.  *
  648.  * The interrupt probe logic state is returned to its previous
  649.  * value.
  650.  *
  651.  * BUGS: When used in a module (which arguably shouldnt happen)
  652.  * nothing prevents two IRQ probe callers from overlapping. The
  653.  * results of this are non-optimal.
  654.  */
  655.  
  656. int probe_irq_off(unsigned long val)
  657. {
  658.         struct irq_region *region;
  659. int i, irq_found, nr_irqs;
  660.         /* support for irq autoprobing is limited to EISA (irq region 0) */
  661.         region = irq_region[EISA_IRQ_REGION];
  662.         if (!EISA_bus || !region)
  663. return 0;
  664. nr_irqs = 0;
  665. irq_found = 0;
  666. for (i = 0; i < EISA_MAX_IRQS; i++) {
  667. unsigned int status;
  668. spin_lock_irq(&irq_lock);
  669. status = region->data.status[i];
  670.                 if (status & IRQ_AUTODETECT) {
  671. if (!(status & IRQ_WAITING)) {
  672. if (!nr_irqs)
  673. irq_found = i;
  674. nr_irqs++;
  675. }
  676. region->ops.disable_irq(region->data.dev,i);
  677. region->data.status[i] = status & ~IRQ_AUTODETECT;
  678. }
  679. spin_unlock_irq(&irq_lock);
  680. }
  681. up(&probe_sem);
  682. if (nr_irqs > 1)
  683. irq_found = -irq_found;
  684. return irq_found;
  685. }
  686. void __init init_IRQ(void)
  687. {
  688. local_irq_disable(); /* PARANOID - should already be disabled */
  689. mtctl(-1L, 23); /* EIRR : clear all pending external intr */
  690. #ifdef CONFIG_SMP
  691. if (!cpu_eiem)
  692. cpu_eiem = EIEM_MASK(IPI_IRQ) | EIEM_MASK(TIMER_IRQ);
  693. #else
  694. cpu_eiem = EIEM_MASK(TIMER_IRQ);
  695. #endif
  696.         set_eiem(cpu_eiem); /* EIEM : enable all external intr */
  697. }
  698. #ifdef CONFIG_PROC_FS
  699. /* called from kernel/sysctl.c:sysctl_init() */
  700. void __init init_irq_proc(void)
  701. {
  702. }
  703. #endif