1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20#include <linux/config.h>
21#include <linux/kernel_stat.h>
22#include <linux/module.h>
23#include <linux/signal.h>
24#include <linux/ioport.h>
25#include <linux/interrupt.h>
26#include <linux/ptrace.h>
27#include <linux/slab.h>
28#include <linux/random.h>
29#include <linux/smp.h>
30#include <linux/init.h>
31#include <linux/seq_file.h>
32#include <linux/errno.h>
33#include <linux/list.h>
34#include <linux/kallsyms.h>
35#include <linux/proc_fs.h>
36
37#include <asm/irq.h>
38#include <asm/system.h>
39#include <asm/mach/irq.h>
40
41
42
43
44
45
46
47
48#define MAX_IRQ_CNT 100000
49
50static int noirqdebug;
51static volatile unsigned long irq_err_count;
52static DEFINE_SPINLOCK(irq_controller_lock);
53static LIST_HEAD(irq_pending);
54
55struct irqdesc irq_desc[NR_IRQS];
56void (*init_arch_irq)(void) __initdata = NULL;
57
58
59
60
61#ifndef irq_finish
62#define irq_finish(irq) do { } while (0)
63#endif
64
65
66
67
68void dummy_mask_unmask_irq(unsigned int irq)
69{
70}
71
72irqreturn_t no_action(int irq, void *dev_id, struct pt_regs *regs)
73{
74 return IRQ_NONE;
75}
76
77void do_bad_IRQ(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs)
78{
79 irq_err_count += 1;
80 printk(KERN_ERR "IRQ: spurious interrupt %d\n", irq);
81}
82
83static struct irqchip bad_chip = {
84 .ack = dummy_mask_unmask_irq,
85 .mask = dummy_mask_unmask_irq,
86 .unmask = dummy_mask_unmask_irq,
87};
88
89static struct irqdesc bad_irq_desc = {
90 .chip = &bad_chip,
91 .handle = do_bad_IRQ,
92 .pend = LIST_HEAD_INIT(bad_irq_desc.pend),
93 .disable_depth = 1,
94};
95
96#ifdef CONFIG_SMP
97void synchronize_irq(unsigned int irq)
98{
99 struct irqdesc *desc = irq_desc + irq;
100
101 while (desc->running)
102 barrier();
103}
104EXPORT_SYMBOL(synchronize_irq);
105
106#define smp_set_running(desc) do { desc->running = 1; } while (0)
107#define smp_clear_running(desc) do { desc->running = 0; } while (0)
108#else
109#define smp_set_running(desc) do { } while (0)
110#define smp_clear_running(desc) do { } while (0)
111#endif
112
113
114
115
116
117
118
119
120
121
122void disable_irq_nosync(unsigned int irq)
123{
124 struct irqdesc *desc = irq_desc + irq;
125 unsigned long flags;
126
127 spin_lock_irqsave(&irq_controller_lock, flags);
128 desc->disable_depth++;
129 list_del_init(&desc->pend);
130 spin_unlock_irqrestore(&irq_controller_lock, flags);
131}
132EXPORT_SYMBOL(disable_irq_nosync);
133
134
135
136
137
138
139
140
141
142
143
144
145
146void disable_irq(unsigned int irq)
147{
148 struct irqdesc *desc = irq_desc + irq;
149
150 disable_irq_nosync(irq);
151 if (desc->action)
152 synchronize_irq(irq);
153}
154EXPORT_SYMBOL(disable_irq);
155
156
157
158
159
160
161
162
163
164
165
166void enable_irq(unsigned int irq)
167{
168 struct irqdesc *desc = irq_desc + irq;
169 unsigned long flags;
170
171 spin_lock_irqsave(&irq_controller_lock, flags);
172 if (unlikely(!desc->disable_depth)) {
173 printk("enable_irq(%u) unbalanced from %p\n", irq,
174 __builtin_return_address(0));
175 } else if (!--desc->disable_depth) {
176 desc->probing = 0;
177 desc->chip->unmask(irq);
178
179
180
181
182
183
184
185 if (desc->pending && list_empty(&desc->pend)) {
186 desc->pending = 0;
187 if (!desc->chip->retrigger ||
188 desc->chip->retrigger(irq))
189 list_add(&desc->pend, &irq_pending);
190 }
191 }
192 spin_unlock_irqrestore(&irq_controller_lock, flags);
193}
194EXPORT_SYMBOL(enable_irq);
195
196
197
198
199void enable_irq_wake(unsigned int irq)
200{
201 struct irqdesc *desc = irq_desc + irq;
202 unsigned long flags;
203
204 spin_lock_irqsave(&irq_controller_lock, flags);
205 if (desc->chip->wake)
206 desc->chip->wake(irq, 1);
207 spin_unlock_irqrestore(&irq_controller_lock, flags);
208}
209EXPORT_SYMBOL(enable_irq_wake);
210
211void disable_irq_wake(unsigned int irq)
212{
213 struct irqdesc *desc = irq_desc + irq;
214 unsigned long flags;
215
216 spin_lock_irqsave(&irq_controller_lock, flags);
217 if (desc->chip->wake)
218 desc->chip->wake(irq, 0);
219 spin_unlock_irqrestore(&irq_controller_lock, flags);
220}
221EXPORT_SYMBOL(disable_irq_wake);
222
223int show_interrupts(struct seq_file *p, void *v)
224{
225 int i = *(loff_t *) v, cpu;
226 struct irqaction * action;
227 unsigned long flags;
228
229 if (i == 0) {
230 char cpuname[12];
231
232 seq_printf(p, " ");
233 for_each_present_cpu(cpu) {
234 sprintf(cpuname, "CPU%d", cpu);
235 seq_printf(p, " %10s", cpuname);
236 }
237 seq_putc(p, '\n');
238 }
239
240 if (i < NR_IRQS) {
241 spin_lock_irqsave(&irq_controller_lock, flags);
242 action = irq_desc[i].action;
243 if (!action)
244 goto unlock;
245
246 seq_printf(p, "%3d: ", i);
247 for_each_present_cpu(cpu)
248 seq_printf(p, "%10u ", kstat_cpu(cpu).irqs[i]);
249 seq_printf(p, " %s", action->name);
250 for (action = action->next; action; action = action->next)
251 seq_printf(p, ", %s", action->name);
252
253 seq_putc(p, '\n');
254unlock:
255 spin_unlock_irqrestore(&irq_controller_lock, flags);
256 } else if (i == NR_IRQS) {
257#ifdef CONFIG_ARCH_ACORN
258 show_fiq_list(p, v);
259#endif
260#ifdef CONFIG_SMP
261 show_ipi_list(p);
262#endif
263 seq_printf(p, "Err: %10lu\n", irq_err_count);
264 }
265 return 0;
266}
267
268
269
270
271
272
273
274
275
276static int check_irq_lock(struct irqdesc *desc, int irq, struct pt_regs *regs)
277{
278 unsigned long instr_ptr = instruction_pointer(regs);
279
280 if (desc->lck_jif == jiffies &&
281 desc->lck_pc >= instr_ptr && desc->lck_pc < instr_ptr + 8) {
282 desc->lck_cnt += 1;
283
284 if (desc->lck_cnt > MAX_IRQ_CNT) {
285 printk(KERN_ERR "IRQ LOCK: IRQ%d is locking the system, disabled\n", irq);
286 return 1;
287 }
288 } else {
289 desc->lck_cnt = 0;
290 desc->lck_pc = instruction_pointer(regs);
291 desc->lck_jif = jiffies;
292 }
293 return 0;
294}
295
296static void
297report_bad_irq(unsigned int irq, struct pt_regs *regs, struct irqdesc *desc, int ret)
298{
299 static int count = 100;
300 struct irqaction *action;
301
302 if (!count || noirqdebug)
303 return;
304
305 count--;
306
307 if (ret != IRQ_HANDLED && ret != IRQ_NONE) {
308 printk("irq%u: bogus retval mask %x\n", irq, ret);
309 } else {
310 printk("irq%u: nobody cared\n", irq);
311 }
312 show_regs(regs);
313 dump_stack();
314 printk(KERN_ERR "handlers:");
315 action = desc->action;
316 do {
317 printk("\n" KERN_ERR "[<%p>]", action->handler);
318 print_symbol(" (%s)", (unsigned long)action->handler);
319 action = action->next;
320 } while (action);
321 printk("\n");
322}
323
324static int
325__do_irq(unsigned int irq, struct irqaction *action, struct pt_regs *regs)
326{
327 unsigned int status;
328 int ret, retval = 0;
329
330 spin_unlock(&irq_controller_lock);
331
332 if (!(action->flags & SA_INTERRUPT))
333 local_irq_enable();
334
335 status = 0;
336 do {
337 ret = action->handler(irq, action->dev_id, regs);
338 if (ret == IRQ_HANDLED)
339 status |= action->flags;
340 retval |= ret;
341 action = action->next;
342 } while (action);
343
344 if (status & SA_SAMPLE_RANDOM)
345 add_interrupt_randomness(irq);
346
347 spin_lock_irq(&irq_controller_lock);
348
349 return retval;
350}
351
352
353
354
355
356void
357do_simple_IRQ(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs)
358{
359 struct irqaction *action;
360 const unsigned int cpu = smp_processor_id();
361
362 desc->triggered = 1;
363
364 kstat_cpu(cpu).irqs[irq]++;
365
366 smp_set_running(desc);
367
368 action = desc->action;
369 if (action) {
370 int ret = __do_irq(irq, action, regs);
371 if (ret != IRQ_HANDLED)
372 report_bad_irq(irq, regs, desc, ret);
373 }
374
375 smp_clear_running(desc);
376}
377
378
379
380
381
382void
383do_edge_IRQ(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs)
384{
385 const unsigned int cpu = smp_processor_id();
386
387 desc->triggered = 1;
388
389
390
391
392
393
394 if (unlikely(desc->running || desc->disable_depth))
395 goto running;
396
397
398
399
400 desc->chip->ack(irq);
401
402
403
404
405 desc->running = 1;
406
407 kstat_cpu(cpu).irqs[irq]++;
408
409 do {
410 struct irqaction *action;
411
412 action = desc->action;
413 if (!action)
414 break;
415
416 if (desc->pending && !desc->disable_depth) {
417 desc->pending = 0;
418 desc->chip->unmask(irq);
419 }
420
421 __do_irq(irq, action, regs);
422 } while (desc->pending && !desc->disable_depth);
423
424 desc->running = 0;
425
426
427
428
429 if (likely(desc->action && !check_irq_lock(desc, irq, regs)))
430 return;
431
432 running:
433
434
435
436
437 desc->pending = 1;
438 desc->chip->mask(irq);
439 desc->chip->ack(irq);
440}
441
442
443
444
445void
446do_level_IRQ(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs)
447{
448 struct irqaction *action;
449 const unsigned int cpu = smp_processor_id();
450
451 desc->triggered = 1;
452
453
454
455
456 desc->chip->ack(irq);
457
458 if (likely(!desc->disable_depth)) {
459 kstat_cpu(cpu).irqs[irq]++;
460
461 smp_set_running(desc);
462
463
464
465
466 action = desc->action;
467 if (action) {
468 int ret = __do_irq(irq, desc->action, regs);
469
470 if (ret != IRQ_HANDLED)
471 report_bad_irq(irq, regs, desc, ret);
472
473 if (likely(!desc->disable_depth &&
474 !check_irq_lock(desc, irq, regs)))
475 desc->chip->unmask(irq);
476 }
477
478 smp_clear_running(desc);
479 }
480}
481
482static void do_pending_irqs(struct pt_regs *regs)
483{
484 struct list_head head, *l, *n;
485
486 do {
487 struct irqdesc *desc;
488
489
490
491
492
493
494 head = irq_pending;
495 INIT_LIST_HEAD(&irq_pending);
496 head.next->prev = &head;
497 head.prev->next = &head;
498
499
500
501
502
503 list_for_each_safe(l, n, &head) {
504 desc = list_entry(l, struct irqdesc, pend);
505 list_del_init(&desc->pend);
506 desc->handle(desc - irq_desc, desc, regs);
507 }
508
509
510
511
512 BUG_ON(!list_empty(&head));
513 } while (!list_empty(&irq_pending));
514}
515
516
517
518
519
520
521asmlinkage void asm_do_IRQ(unsigned int irq, struct pt_regs *regs)
522{
523 struct irqdesc *desc = irq_desc + irq;
524
525
526
527
528
529 if (irq >= NR_IRQS)
530 desc = &bad_irq_desc;
531
532 irq_enter();
533 spin_lock(&irq_controller_lock);
534 desc->handle(irq, desc, regs);
535
536
537
538
539 if (!list_empty(&irq_pending))
540 do_pending_irqs(regs);
541
542 irq_finish(irq);
543
544 spin_unlock(&irq_controller_lock);
545 irq_exit();
546}
547
548void __set_irq_handler(unsigned int irq, irq_handler_t handle, int is_chained)
549{
550 struct irqdesc *desc;
551 unsigned long flags;
552
553 if (irq >= NR_IRQS) {
554 printk(KERN_ERR "Trying to install handler for IRQ%d\n", irq);
555 return;
556 }
557
558 if (handle == NULL)
559 handle = do_bad_IRQ;
560
561 desc = irq_desc + irq;
562
563 if (is_chained && desc->chip == &bad_chip)
564 printk(KERN_WARNING "Trying to install chained handler for IRQ%d\n", irq);
565
566 spin_lock_irqsave(&irq_controller_lock, flags);
567 if (handle == do_bad_IRQ) {
568 desc->chip->mask(irq);
569 desc->chip->ack(irq);
570 desc->disable_depth = 1;
571 }
572 desc->handle = handle;
573 if (handle != do_bad_IRQ && is_chained) {
574 desc->valid = 0;
575 desc->probe_ok = 0;
576 desc->disable_depth = 0;
577 desc->chip->unmask(irq);
578 }
579 spin_unlock_irqrestore(&irq_controller_lock, flags);
580}
581
582void set_irq_chip(unsigned int irq, struct irqchip *chip)
583{
584 struct irqdesc *desc;
585 unsigned long flags;
586
587 if (irq >= NR_IRQS) {
588 printk(KERN_ERR "Trying to install chip for IRQ%d\n", irq);
589 return;
590 }
591
592 if (chip == NULL)
593 chip = &bad_chip;
594
595 desc = irq_desc + irq;
596 spin_lock_irqsave(&irq_controller_lock, flags);
597 desc->chip = chip;
598 spin_unlock_irqrestore(&irq_controller_lock, flags);
599}
600
601int set_irq_type(unsigned int irq, unsigned int type)
602{
603 struct irqdesc *desc;
604 unsigned long flags;
605 int ret = -ENXIO;
606
607 if (irq >= NR_IRQS) {
608 printk(KERN_ERR "Trying to set irq type for IRQ%d\n", irq);
609 return -ENODEV;
610 }
611
612 desc = irq_desc + irq;
613 if (desc->chip->type) {
614 spin_lock_irqsave(&irq_controller_lock, flags);
615 ret = desc->chip->type(irq, type);
616 spin_unlock_irqrestore(&irq_controller_lock, flags);
617 }
618
619 return ret;
620}
621EXPORT_SYMBOL(set_irq_type);
622
623void set_irq_flags(unsigned int irq, unsigned int iflags)
624{
625 struct irqdesc *desc;
626 unsigned long flags;
627
628 if (irq >= NR_IRQS) {
629 printk(KERN_ERR "Trying to set irq flags for IRQ%d\n", irq);
630 return;
631 }
632
633 desc = irq_desc + irq;
634 spin_lock_irqsave(&irq_controller_lock, flags);
635 desc->valid = (iflags & IRQF_VALID) != 0;
636 desc->probe_ok = (iflags & IRQF_PROBE) != 0;
637 desc->noautoenable = (iflags & IRQF_NOAUTOEN) != 0;
638 spin_unlock_irqrestore(&irq_controller_lock, flags);
639}
640
641int setup_irq(unsigned int irq, struct irqaction *new)
642{
643 int shared = 0;
644 struct irqaction *old, **p;
645 unsigned long flags;
646 struct irqdesc *desc;
647
648
649
650
651
652
653 if (new->flags & SA_SAMPLE_RANDOM) {
654
655
656
657
658
659
660
661
662 rand_initialize_irq(irq);
663 }
664
665
666
667
668 desc = irq_desc + irq;
669 spin_lock_irqsave(&irq_controller_lock, flags);
670 p = &desc->action;
671 if ((old = *p) != NULL) {
672
673 if (!(old->flags & new->flags & SA_SHIRQ)) {
674 spin_unlock_irqrestore(&irq_controller_lock, flags);
675 return -EBUSY;
676 }
677
678
679 do {
680 p = &old->next;
681 old = *p;
682 } while (old);
683 shared = 1;
684 }
685
686 *p = new;
687
688 if (!shared) {
689 desc->probing = 0;
690 desc->running = 0;
691 desc->pending = 0;
692 desc->disable_depth = 1;
693 if (!desc->noautoenable) {
694 desc->disable_depth = 0;
695 desc->chip->unmask(irq);
696 }
697 }
698
699 spin_unlock_irqrestore(&irq_controller_lock, flags);
700 return 0;
701}
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734int request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *),
735 unsigned long irq_flags, const char * devname, void *dev_id)
736{
737 unsigned long retval;
738 struct irqaction *action;
739
740 if (irq >= NR_IRQS || !irq_desc[irq].valid || !handler ||
741 (irq_flags & SA_SHIRQ && !dev_id))
742 return -EINVAL;
743
744 action = (struct irqaction *)kmalloc(sizeof(struct irqaction), GFP_KERNEL);
745 if (!action)
746 return -ENOMEM;
747
748 action->handler = handler;
749 action->flags = irq_flags;
750 cpus_clear(action->mask);
751 action->name = devname;
752 action->next = NULL;
753 action->dev_id = dev_id;
754
755 retval = setup_irq(irq, action);
756
757 if (retval)
758 kfree(action);
759 return retval;
760}
761
762EXPORT_SYMBOL(request_irq);
763
764
765
766
767
768
769
770
771
772
773
774
775
776void free_irq(unsigned int irq, void *dev_id)
777{
778 struct irqaction * action, **p;
779 unsigned long flags;
780
781 if (irq >= NR_IRQS || !irq_desc[irq].valid) {
782 printk(KERN_ERR "Trying to free IRQ%d\n",irq);
783 dump_stack();
784 return;
785 }
786
787 spin_lock_irqsave(&irq_controller_lock, flags);
788 for (p = &irq_desc[irq].action; (action = *p) != NULL; p = &action->next) {
789 if (action->dev_id != dev_id)
790 continue;
791
792
793 *p = action->next;
794 break;
795 }
796 spin_unlock_irqrestore(&irq_controller_lock, flags);
797
798 if (!action) {
799 printk(KERN_ERR "Trying to free free IRQ%d\n",irq);
800 dump_stack();
801 } else {
802 synchronize_irq(irq);
803 kfree(action);
804 }
805}
806
807EXPORT_SYMBOL(free_irq);
808
809static DECLARE_MUTEX(probe_sem);
810
811
812
813
814
815
816
817unsigned long probe_irq_on(void)
818{
819 unsigned int i, irqs = 0;
820 unsigned long delay;
821
822 down(&probe_sem);
823
824
825
826
827
828 spin_lock_irq(&irq_controller_lock);
829 for (i = 0; i < NR_IRQS; i++) {
830 if (!irq_desc[i].probe_ok || irq_desc[i].action)
831 continue;
832
833 irq_desc[i].probing = 1;
834 irq_desc[i].triggered = 0;
835 if (irq_desc[i].chip->type)
836 irq_desc[i].chip->type(i, IRQT_PROBE);
837 irq_desc[i].chip->unmask(i);
838 irqs += 1;
839 }
840 spin_unlock_irq(&irq_controller_lock);
841
842
843
844
845 for (delay = jiffies + HZ/10; time_before(jiffies, delay); )
846 ;
847
848
849
850
851 spin_lock_irq(&irq_controller_lock);
852 for (i = 0; i < NR_IRQS; i++) {
853 if (irq_desc[i].probing && irq_desc[i].triggered) {
854 irq_desc[i].probing = 0;
855 irqs -= 1;
856 }
857 }
858 spin_unlock_irq(&irq_controller_lock);
859
860 return irqs;
861}
862
863EXPORT_SYMBOL(probe_irq_on);
864
865unsigned int probe_irq_mask(unsigned long irqs)
866{
867 unsigned int mask = 0, i;
868
869 spin_lock_irq(&irq_controller_lock);
870 for (i = 0; i < 16 && i < NR_IRQS; i++)
871 if (irq_desc[i].probing && irq_desc[i].triggered)
872 mask |= 1 << i;
873 spin_unlock_irq(&irq_controller_lock);
874
875 up(&probe_sem);
876
877 return mask;
878}
879EXPORT_SYMBOL(probe_irq_mask);
880
881
882
883
884
885
886int probe_irq_off(unsigned long irqs)
887{
888 unsigned int i;
889 int irq_found = NO_IRQ;
890
891
892
893
894
895 spin_lock_irq(&irq_controller_lock);
896 for (i = 0; i < NR_IRQS; i++) {
897 if (irq_desc[i].probing &&
898 irq_desc[i].triggered) {
899 if (irq_found != NO_IRQ) {
900 irq_found = NO_IRQ;
901 goto out;
902 }
903 irq_found = i;
904 }
905 }
906
907 if (irq_found == -1)
908 irq_found = NO_IRQ;
909out:
910 spin_unlock_irq(&irq_controller_lock);
911
912 up(&probe_sem);
913
914 return irq_found;
915}
916
917EXPORT_SYMBOL(probe_irq_off);
918
919#ifdef CONFIG_SMP
920static void route_irq(struct irqdesc *desc, unsigned int irq, unsigned int cpu)
921{
922 pr_debug("IRQ%u: moving from cpu%u to cpu%u\n", irq, desc->cpu, cpu);
923
924 spin_lock_irq(&irq_controller_lock);
925 desc->cpu = cpu;
926 desc->chip->set_cpu(desc, irq, cpu);
927 spin_unlock_irq(&irq_controller_lock);
928}
929
930#ifdef CONFIG_PROC_FS
931static int
932irq_affinity_read_proc(char *page, char **start, off_t off, int count,
933 int *eof, void *data)
934{
935 struct irqdesc *desc = irq_desc + ((int)data);
936 int len = cpumask_scnprintf(page, count, desc->affinity);
937
938 if (count - len < 2)
939 return -EINVAL;
940 page[len++] = '\n';
941 page[len] = '\0';
942
943 return len;
944}
945
946static int
947irq_affinity_write_proc(struct file *file, const char __user *buffer,
948 unsigned long count, void *data)
949{
950 unsigned int irq = (unsigned int)data;
951 struct irqdesc *desc = irq_desc + irq;
952 cpumask_t affinity, tmp;
953 int ret = -EIO;
954
955 if (!desc->chip->set_cpu)
956 goto out;
957
958 ret = cpumask_parse(buffer, count, affinity);
959 if (ret)
960 goto out;
961
962 cpus_and(tmp, affinity, cpu_online_map);
963 if (cpus_empty(tmp)) {
964 ret = -EINVAL;
965 goto out;
966 }
967
968 desc->affinity = affinity;
969 route_irq(desc, irq, first_cpu(tmp));
970 ret = count;
971
972 out:
973 return ret;
974}
975#endif
976#endif
977
978void __init init_irq_proc(void)
979{
980#if defined(CONFIG_SMP) && defined(CONFIG_PROC_FS)
981 struct proc_dir_entry *dir;
982 int irq;
983
984 dir = proc_mkdir("irq", 0);
985 if (!dir)
986 return;
987
988 for (irq = 0; irq < NR_IRQS; irq++) {
989 struct proc_dir_entry *entry;
990 struct irqdesc *desc;
991 char name[16];
992
993 desc = irq_desc + irq;
994 memset(name, 0, sizeof(name));
995 snprintf(name, sizeof(name) - 1, "%u", irq);
996
997 desc->procdir = proc_mkdir(name, dir);
998 if (!desc->procdir)
999 continue;
1000
1001 entry = create_proc_entry("smp_affinity", 0600, desc->procdir);
1002 if (entry) {
1003 entry->nlink = 1;
1004 entry->data = (void *)irq;
1005 entry->read_proc = irq_affinity_read_proc;
1006 entry->write_proc = irq_affinity_write_proc;
1007 }
1008 }
1009#endif
1010}
1011
1012void __init init_IRQ(void)
1013{
1014 struct irqdesc *desc;
1015 extern void init_dma(void);
1016 int irq;
1017
1018#ifdef CONFIG_SMP
1019 bad_irq_desc.affinity = CPU_MASK_ALL;
1020 bad_irq_desc.cpu = smp_processor_id();
1021#endif
1022
1023 for (irq = 0, desc = irq_desc; irq < NR_IRQS; irq++, desc++) {
1024 *desc = bad_irq_desc;
1025 INIT_LIST_HEAD(&desc->pend);
1026 }
1027
1028 init_arch_irq();
1029 init_dma();
1030}
1031
1032static int __init noirqdebug_setup(char *str)
1033{
1034 noirqdebug = 1;
1035 return 1;
1036}
1037
1038__setup("noirqdebug", noirqdebug_setup);
1039