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