Merge branch 'irq-fixes-for-linus-4' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip

* 'irq-fixes-for-linus-4' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
sparseirq: move __weak symbols into separate compilation unit
sparseirq: work around __weak alias bug
sparseirq: fix hang with !SPARSE_IRQ
sparseirq: set lock_class for legacy irq when sparse_irq is selected
sparseirq: work around compiler optimizing away __weak functions
sparseirq: fix desc->lock init
sparseirq: do not printk when migrating IRQ descriptors
sparseirq: remove duplicated arch_early_irq_init()
irq: simplify for_each_irq_desc() usage
proc: remove ifdef CONFIG_SPARSE_IRQ from stat.c
irq: for_each_irq_desc() move to irqnr.h
hrtimer: remove #include <linux/irq.h>

+84 -109
+6 -12
arch/x86/kernel/io_apic.c
··· 170 [15] = { .domain = CPU_MASK_ALL, .vector = IRQ15_VECTOR, }, 171 }; 172 173 - void __init arch_early_irq_init(void) 174 { 175 struct irq_cfg *cfg; 176 struct irq_desc *desc; ··· 184 desc = irq_to_desc(i); 185 desc->chip_data = &cfg[i]; 186 } 187 } 188 189 #ifdef CONFIG_SPARSE_IRQ ··· 214 return cfg; 215 } 216 217 - void arch_init_chip_data(struct irq_desc *desc, int cpu) 218 { 219 struct irq_cfg *cfg; 220 ··· 226 BUG_ON(1); 227 } 228 } 229 } 230 231 #ifdef CONFIG_NUMA_MIGRATE_IRQ_DESC ··· 1349 1350 /* Mark the inuse vectors */ 1351 for_each_irq_desc(irq, desc) { 1352 - if (!desc) 1353 - continue; 1354 cfg = desc->chip_data; 1355 if (!cpu_isset(cpu, cfg->domain)) 1356 continue; ··· 1732 for_each_irq_desc(irq, desc) { 1733 struct irq_pin_list *entry; 1734 1735 - if (!desc) 1736 - continue; 1737 cfg = desc->chip_data; 1738 entry = cfg->irq_2_pin; 1739 if (!entry) ··· 2378 struct irq_desc *desc; 2379 2380 for_each_irq_desc(irq, desc) { 2381 - if (!desc) 2382 - continue; 2383 - 2384 if (desc->status & IRQ_MOVE_PENDING) { 2385 unsigned long flags; 2386 ··· 2667 * 0x80, because int 0x80 is hm, kind of importantish. ;) 2668 */ 2669 for_each_irq_desc(irq, desc) { 2670 - if (!desc) 2671 - continue; 2672 - 2673 cfg = desc->chip_data; 2674 if (IO_APIC_IRQ(irq) && cfg && !cfg->vector) { 2675 /*
··· 170 [15] = { .domain = CPU_MASK_ALL, .vector = IRQ15_VECTOR, }, 171 }; 172 173 + int __init arch_early_irq_init(void) 174 { 175 struct irq_cfg *cfg; 176 struct irq_desc *desc; ··· 184 desc = irq_to_desc(i); 185 desc->chip_data = &cfg[i]; 186 } 187 + 188 + return 0; 189 } 190 191 #ifdef CONFIG_SPARSE_IRQ ··· 212 return cfg; 213 } 214 215 + int arch_init_chip_data(struct irq_desc *desc, int cpu) 216 { 217 struct irq_cfg *cfg; 218 ··· 224 BUG_ON(1); 225 } 226 } 227 + 228 + return 0; 229 } 230 231 #ifdef CONFIG_NUMA_MIGRATE_IRQ_DESC ··· 1345 1346 /* Mark the inuse vectors */ 1347 for_each_irq_desc(irq, desc) { 1348 cfg = desc->chip_data; 1349 if (!cpu_isset(cpu, cfg->domain)) 1350 continue; ··· 1730 for_each_irq_desc(irq, desc) { 1731 struct irq_pin_list *entry; 1732 1733 cfg = desc->chip_data; 1734 entry = cfg->irq_2_pin; 1735 if (!entry) ··· 2378 struct irq_desc *desc; 2379 2380 for_each_irq_desc(irq, desc) { 2381 if (desc->status & IRQ_MOVE_PENDING) { 2382 unsigned long flags; 2383 ··· 2670 * 0x80, because int 0x80 is hm, kind of importantish. ;) 2671 */ 2672 for_each_irq_desc(irq, desc) { 2673 cfg = desc->chip_data; 2674 if (IO_APIC_IRQ(irq) && cfg && !cfg->vector) { 2675 /*
-3
drivers/xen/events.c
··· 142 143 /* By default all event channels notify CPU#0. */ 144 for_each_irq_desc(i, desc) { 145 - if (!desc) 146 - continue; 147 - 148 desc->affinity = cpumask_of_cpu(0); 149 } 150 #endif
··· 142 143 /* By default all event channels notify CPU#0. */ 144 for_each_irq_desc(i, desc) { 145 desc->affinity = cpumask_of_cpu(0); 146 } 147 #endif
+1 -10
fs/proc/stat.c
··· 9 #include <linux/seq_file.h> 10 #include <linux/slab.h> 11 #include <linux/time.h> 12 #include <asm/cputime.h> 13 14 #ifndef arch_irq_stat_cpu ··· 46 steal = cputime64_add(steal, kstat_cpu(i).cpustat.steal); 47 guest = cputime64_add(guest, kstat_cpu(i).cpustat.guest); 48 for_each_irq_nr(j) { 49 - #ifdef CONFIG_SPARSE_IRQ 50 - if (!irq_to_desc(j)) 51 - continue; 52 - #endif 53 sum += kstat_irqs_cpu(j, i); 54 } 55 sum += arch_irq_stat_cpu(i); ··· 92 /* sum again ? it could be updated? */ 93 for_each_irq_nr(j) { 94 per_irq_sum = 0; 95 - #ifdef CONFIG_SPARSE_IRQ 96 - if (!irq_to_desc(j)) { 97 - seq_printf(p, " %u", per_irq_sum); 98 - continue; 99 - } 100 - #endif 101 for_each_possible_cpu(i) 102 per_irq_sum += kstat_irqs_cpu(j, i); 103
··· 9 #include <linux/seq_file.h> 10 #include <linux/slab.h> 11 #include <linux/time.h> 12 + #include <linux/irqnr.h> 13 #include <asm/cputime.h> 14 15 #ifndef arch_irq_stat_cpu ··· 45 steal = cputime64_add(steal, kstat_cpu(i).cpustat.steal); 46 guest = cputime64_add(guest, kstat_cpu(i).cpustat.guest); 47 for_each_irq_nr(j) { 48 sum += kstat_irqs_cpu(j, i); 49 } 50 sum += arch_irq_stat_cpu(i); ··· 95 /* sum again ? it could be updated? */ 96 for_each_irq_nr(j) { 97 per_irq_sum = 0; 98 for_each_possible_cpu(i) 99 per_irq_sum += kstat_irqs_cpu(j, i); 100
+6
include/linux/interrupt.h
··· 464 465 int show_interrupts(struct seq_file *p, void *v); 466 467 #endif
··· 464 465 int show_interrupts(struct seq_file *p, void *v); 466 467 + struct irq_desc; 468 + 469 + extern int early_irq_init(void); 470 + extern int arch_early_irq_init(void); 471 + extern int arch_init_chip_data(struct irq_desc *desc, int cpu); 472 + 473 #endif
+4 -23
include/linux/irq.h
··· 193 const char *name; 194 } ____cacheline_internodealigned_in_smp; 195 196 - extern void early_irq_init(void); 197 - extern void arch_early_irq_init(void); 198 - extern void arch_init_chip_data(struct irq_desc *desc, int cpu); 199 extern void arch_init_copy_chip_data(struct irq_desc *old_desc, 200 struct irq_desc *desc, int cpu); 201 extern void arch_free_chip_data(struct irq_desc *old_desc, struct irq_desc *desc); 202 203 #ifndef CONFIG_SPARSE_IRQ 204 extern struct irq_desc irq_desc[NR_IRQS]; 205 - 206 - static inline struct irq_desc *irq_to_desc(unsigned int irq) 207 - { 208 - return (irq < NR_IRQS) ? irq_desc + irq : NULL; 209 - } 210 - static inline struct irq_desc *irq_to_desc_alloc_cpu(unsigned int irq, int cpu) 211 - { 212 - return irq_to_desc(irq); 213 - } 214 - 215 - #else 216 - 217 - extern struct irq_desc *irq_to_desc(unsigned int irq); 218 - extern struct irq_desc *irq_to_desc_alloc_cpu(unsigned int irq, int cpu); 219 extern struct irq_desc *move_irq_desc(struct irq_desc *old_desc, int cpu); 220 - 221 - # define for_each_irq_desc(irq, desc) \ 222 - for (irq = 0, desc = irq_to_desc(irq); irq < nr_irqs; irq++, desc = irq_to_desc(irq)) 223 - # define for_each_irq_desc_reverse(irq, desc) \ 224 - for (irq = nr_irqs - 1, desc = irq_to_desc(irq); irq >= 0; irq--, desc = irq_to_desc(irq)) 225 226 #define kstat_irqs_this_cpu(DESC) \ 227 ((DESC)->kstat_irqs[smp_processor_id()]) 228 #define kstat_incr_irqs_this_cpu(irqno, DESC) \ 229 ((DESC)->kstat_irqs[smp_processor_id()]++) 230 231 - #endif 232 233 static inline struct irq_desc * 234 irq_remap_to_desc(unsigned int irq, struct irq_desc *desc)
··· 193 const char *name; 194 } ____cacheline_internodealigned_in_smp; 195 196 extern void arch_init_copy_chip_data(struct irq_desc *old_desc, 197 struct irq_desc *desc, int cpu); 198 extern void arch_free_chip_data(struct irq_desc *old_desc, struct irq_desc *desc); 199 200 #ifndef CONFIG_SPARSE_IRQ 201 extern struct irq_desc irq_desc[NR_IRQS]; 202 + #else /* CONFIG_SPARSE_IRQ */ 203 extern struct irq_desc *move_irq_desc(struct irq_desc *old_desc, int cpu); 204 205 #define kstat_irqs_this_cpu(DESC) \ 206 ((DESC)->kstat_irqs[smp_processor_id()]) 207 #define kstat_incr_irqs_this_cpu(irqno, DESC) \ 208 ((DESC)->kstat_irqs[smp_processor_id()]++) 209 210 + #endif /* CONFIG_SPARSE_IRQ */ 211 + 212 + extern struct irq_desc *irq_to_desc_alloc_cpu(unsigned int irq, int cpu); 213 214 static inline struct irq_desc * 215 irq_remap_to_desc(unsigned int irq, struct irq_desc *desc)
+13 -10
include/linux/irqnr.h
··· 15 16 # define for_each_irq_desc_reverse(irq, desc) \ 17 for (irq = nr_irqs - 1; irq >= 0; irq--) 18 - #else 19 20 extern int nr_irqs; 21 22 - #ifndef CONFIG_SPARSE_IRQ 23 24 - struct irq_desc; 25 - # define for_each_irq_desc(irq, desc) \ 26 - for (irq = 0, desc = irq_desc; irq < nr_irqs; irq++, desc++) 27 - # define for_each_irq_desc_reverse(irq, desc) \ 28 - for (irq = nr_irqs - 1, desc = irq_desc + (nr_irqs - 1); \ 29 - irq >= 0; irq--, desc--) 30 - #endif 31 - #endif 32 33 #define for_each_irq_nr(irq) \ 34 for (irq = 0; irq < nr_irqs; irq++)
··· 15 16 # define for_each_irq_desc_reverse(irq, desc) \ 17 for (irq = nr_irqs - 1; irq >= 0; irq--) 18 + #else /* CONFIG_GENERIC_HARDIRQS */ 19 20 extern int nr_irqs; 21 + extern struct irq_desc *irq_to_desc(unsigned int irq); 22 23 + # define for_each_irq_desc(irq, desc) \ 24 + for (irq = 0, desc = irq_to_desc(irq); irq < nr_irqs; \ 25 + irq++, desc = irq_to_desc(irq)) \ 26 + if (desc) 27 28 + 29 + # define for_each_irq_desc_reverse(irq, desc) \ 30 + for (irq = nr_irqs - 1, desc = irq_to_desc(irq); irq >= 0; \ 31 + irq--, desc = irq_to_desc(irq)) \ 32 + if (desc) 33 + 34 + #endif /* CONFIG_GENERIC_HARDIRQS */ 35 36 #define for_each_irq_nr(irq) \ 37 for (irq = 0; irq < nr_irqs; irq++)
-9
init/main.c
··· 540 { 541 } 542 543 - void __init __weak arch_early_irq_init(void) 544 - { 545 - } 546 - 547 - void __init __weak early_irq_init(void) 548 - { 549 - arch_early_irq_init(); 550 - } 551 - 552 asmlinkage void __init start_kernel(void) 553 { 554 char * command_line;
··· 540 { 541 } 542 543 asmlinkage void __init start_kernel(void) 544 { 545 char * command_line;
-1
kernel/hrtimer.c
··· 32 */ 33 34 #include <linux/cpu.h> 35 - #include <linux/irq.h> 36 #include <linux/module.h> 37 #include <linux/percpu.h> 38 #include <linux/hrtimer.h>
··· 32 */ 33 34 #include <linux/cpu.h> 35 #include <linux/module.h> 36 #include <linux/percpu.h> 37 #include <linux/hrtimer.h>
-15
kernel/irq/autoprobe.c
··· 40 * flush such a longstanding irq before considering it as spurious. 41 */ 42 for_each_irq_desc_reverse(i, desc) { 43 - if (!desc) 44 - continue; 45 - 46 spin_lock_irq(&desc->lock); 47 if (!desc->action && !(desc->status & IRQ_NOPROBE)) { 48 /* ··· 68 * happened in the previous stage, it may have masked itself) 69 */ 70 for_each_irq_desc_reverse(i, desc) { 71 - if (!desc) 72 - continue; 73 - 74 spin_lock_irq(&desc->lock); 75 if (!desc->action && !(desc->status & IRQ_NOPROBE)) { 76 desc->status |= IRQ_AUTODETECT | IRQ_WAITING; ··· 86 * Now filter out any obviously spurious interrupts 87 */ 88 for_each_irq_desc(i, desc) { 89 - if (!desc) 90 - continue; 91 - 92 spin_lock_irq(&desc->lock); 93 status = desc->status; 94 ··· 124 int i; 125 126 for_each_irq_desc(i, desc) { 127 - if (!desc) 128 - continue; 129 - 130 spin_lock_irq(&desc->lock); 131 status = desc->status; 132 ··· 166 unsigned int status; 167 168 for_each_irq_desc(i, desc) { 169 - if (!desc) 170 - continue; 171 - 172 spin_lock_irq(&desc->lock); 173 status = desc->status; 174
··· 40 * flush such a longstanding irq before considering it as spurious. 41 */ 42 for_each_irq_desc_reverse(i, desc) { 43 spin_lock_irq(&desc->lock); 44 if (!desc->action && !(desc->status & IRQ_NOPROBE)) { 45 /* ··· 71 * happened in the previous stage, it may have masked itself) 72 */ 73 for_each_irq_desc_reverse(i, desc) { 74 spin_lock_irq(&desc->lock); 75 if (!desc->action && !(desc->status & IRQ_NOPROBE)) { 76 desc->status |= IRQ_AUTODETECT | IRQ_WAITING; ··· 92 * Now filter out any obviously spurious interrupts 93 */ 94 for_each_irq_desc(i, desc) { 95 spin_lock_irq(&desc->lock); 96 status = desc->status; 97 ··· 133 int i; 134 135 for_each_irq_desc(i, desc) { 136 spin_lock_irq(&desc->lock); 137 status = desc->status; 138 ··· 178 unsigned int status; 179 180 for_each_irq_desc(i, desc) { 181 spin_lock_irq(&desc->lock); 182 status = desc->status; 183
+32 -16
kernel/irq/handle.c
··· 56 int nr_irqs = NR_IRQS; 57 EXPORT_SYMBOL_GPL(nr_irqs); 58 59 - void __init __attribute__((weak)) arch_early_irq_init(void) 60 - { 61 - } 62 - 63 #ifdef CONFIG_SPARSE_IRQ 64 static struct irq_desc irq_desc_init = { 65 .irq = -1, ··· 86 desc->kstat_irqs = (unsigned int *)ptr; 87 } 88 89 - void __attribute__((weak)) arch_init_chip_data(struct irq_desc *desc, int cpu) 90 - { 91 - } 92 - 93 static void init_one_irq_desc(int irq, struct irq_desc *desc, int cpu) 94 { 95 memcpy(desc, &irq_desc_init, sizeof(struct irq_desc)); 96 desc->irq = irq; 97 #ifdef CONFIG_SMP 98 desc->cpu = cpu; ··· 128 /* FIXME: use bootmem alloc ...*/ 129 static unsigned int kstat_irqs_legacy[NR_IRQS_LEGACY][NR_CPUS]; 130 131 - void __init early_irq_init(void) 132 { 133 struct irq_desc *desc; 134 int legacy_count; ··· 140 for (i = 0; i < legacy_count; i++) { 141 desc[i].irq = i; 142 desc[i].kstat_irqs = kstat_irqs_legacy[i]; 143 144 irq_desc_ptrs[i] = desc + i; 145 } ··· 148 for (i = legacy_count; i < NR_IRQS; i++) 149 irq_desc_ptrs[i] = NULL; 150 151 - arch_early_irq_init(); 152 } 153 154 struct irq_desc *irq_to_desc(unsigned int irq) ··· 198 return desc; 199 } 200 201 - #else 202 203 struct irq_desc irq_desc[NR_IRQS] __cacheline_aligned_in_smp = { 204 [0 ... NR_IRQS-1] = { ··· 213 } 214 }; 215 216 - #endif 217 218 /* 219 * What should we do if we get a hw irq event on an illegal vector? ··· 447 int i; 448 449 for_each_irq_desc(i, desc) { 450 - if (!desc) 451 - continue; 452 - 453 lockdep_set_class(&desc->lock, &irq_desc_lock_class); 454 } 455 } ··· 455 unsigned int kstat_irqs_cpu(unsigned int irq, int cpu) 456 { 457 struct irq_desc *desc = irq_to_desc(irq); 458 - return desc->kstat_irqs[cpu]; 459 } 460 #endif 461 EXPORT_SYMBOL(kstat_irqs_cpu);
··· 56 int nr_irqs = NR_IRQS; 57 EXPORT_SYMBOL_GPL(nr_irqs); 58 59 #ifdef CONFIG_SPARSE_IRQ 60 static struct irq_desc irq_desc_init = { 61 .irq = -1, ··· 90 desc->kstat_irqs = (unsigned int *)ptr; 91 } 92 93 static void init_one_irq_desc(int irq, struct irq_desc *desc, int cpu) 94 { 95 memcpy(desc, &irq_desc_init, sizeof(struct irq_desc)); 96 + 97 + spin_lock_init(&desc->lock); 98 desc->irq = irq; 99 #ifdef CONFIG_SMP 100 desc->cpu = cpu; ··· 134 /* FIXME: use bootmem alloc ...*/ 135 static unsigned int kstat_irqs_legacy[NR_IRQS_LEGACY][NR_CPUS]; 136 137 + int __init early_irq_init(void) 138 { 139 struct irq_desc *desc; 140 int legacy_count; ··· 146 for (i = 0; i < legacy_count; i++) { 147 desc[i].irq = i; 148 desc[i].kstat_irqs = kstat_irqs_legacy[i]; 149 + lockdep_set_class(&desc[i].lock, &irq_desc_lock_class); 150 151 irq_desc_ptrs[i] = desc + i; 152 } ··· 153 for (i = legacy_count; i < NR_IRQS; i++) 154 irq_desc_ptrs[i] = NULL; 155 156 + return arch_early_irq_init(); 157 } 158 159 struct irq_desc *irq_to_desc(unsigned int irq) ··· 203 return desc; 204 } 205 206 + #else /* !CONFIG_SPARSE_IRQ */ 207 208 struct irq_desc irq_desc[NR_IRQS] __cacheline_aligned_in_smp = { 209 [0 ... NR_IRQS-1] = { ··· 218 } 219 }; 220 221 + int __init early_irq_init(void) 222 + { 223 + struct irq_desc *desc; 224 + int count; 225 + int i; 226 + 227 + desc = irq_desc; 228 + count = ARRAY_SIZE(irq_desc); 229 + 230 + for (i = 0; i < count; i++) 231 + desc[i].irq = i; 232 + 233 + return arch_early_irq_init(); 234 + } 235 + 236 + struct irq_desc *irq_to_desc(unsigned int irq) 237 + { 238 + return (irq < NR_IRQS) ? irq_desc + irq : NULL; 239 + } 240 + 241 + struct irq_desc *irq_to_desc_alloc_cpu(unsigned int irq, int cpu) 242 + { 243 + return irq_to_desc(irq); 244 + } 245 + #endif /* !CONFIG_SPARSE_IRQ */ 246 247 /* 248 * What should we do if we get a hw irq event on an illegal vector? ··· 428 int i; 429 430 for_each_irq_desc(i, desc) { 431 lockdep_set_class(&desc->lock, &irq_desc_lock_class); 432 } 433 } ··· 439 unsigned int kstat_irqs_cpu(unsigned int irq, int cpu) 440 { 441 struct irq_desc *desc = irq_to_desc(irq); 442 + return desc ? desc->kstat_irqs[cpu] : 0; 443 } 444 #endif 445 EXPORT_SYMBOL(kstat_irqs_cpu);
+2 -5
kernel/irq/numa_migrate.c
··· 42 struct irq_desc *desc, int cpu) 43 { 44 memcpy(desc, old_desc, sizeof(struct irq_desc)); 45 desc->cpu = cpu; 46 lockdep_set_class(&desc->lock, &irq_desc_lock_class); 47 init_copy_kstat_irqs(old_desc, desc, cpu, nr_cpu_ids); ··· 75 76 node = cpu_to_node(cpu); 77 desc = kzalloc_node(sizeof(*desc), GFP_ATOMIC, node); 78 - printk(KERN_DEBUG " move irq_desc for %d to cpu %d node %d\n", 79 - irq, cpu, node); 80 if (!desc) { 81 - printk(KERN_ERR "can not get new irq_desc for moving\n"); 82 /* still use old one */ 83 desc = old_desc; 84 goto out_unlock; ··· 105 return desc; 106 107 old_cpu = desc->cpu; 108 - printk(KERN_DEBUG 109 - "try to move irq_desc from cpu %d to %d\n", old_cpu, cpu); 110 if (old_cpu != cpu) { 111 node = cpu_to_node(cpu); 112 old_node = cpu_to_node(old_cpu);
··· 42 struct irq_desc *desc, int cpu) 43 { 44 memcpy(desc, old_desc, sizeof(struct irq_desc)); 45 + spin_lock_init(&desc->lock); 46 desc->cpu = cpu; 47 lockdep_set_class(&desc->lock, &irq_desc_lock_class); 48 init_copy_kstat_irqs(old_desc, desc, cpu, nr_cpu_ids); ··· 74 75 node = cpu_to_node(cpu); 76 desc = kzalloc_node(sizeof(*desc), GFP_ATOMIC, node); 77 if (!desc) { 78 + printk(KERN_ERR "irq %d: can not get new irq_desc for migration.\n", irq); 79 /* still use old one */ 80 desc = old_desc; 81 goto out_unlock; ··· 106 return desc; 107 108 old_cpu = desc->cpu; 109 if (old_cpu != cpu) { 110 node = cpu_to_node(cpu); 111 old_node = cpu_to_node(old_cpu);
-5
kernel/irq/spurious.c
··· 91 int i, ok = 0; 92 93 for_each_irq_desc(i, desc) { 94 - if (!desc) 95 - continue; 96 - 97 if (!i) 98 continue; 99 ··· 112 for_each_irq_desc(i, desc) { 113 unsigned int status; 114 115 - if (!desc) 116 - continue; 117 if (!i) 118 continue; 119
··· 91 int i, ok = 0; 92 93 for_each_irq_desc(i, desc) { 94 if (!i) 95 continue; 96 ··· 115 for_each_irq_desc(i, desc) { 116 unsigned int status; 117 118 if (!i) 119 continue; 120
+20
kernel/softirq.c
··· 784 } 785 EXPORT_SYMBOL(on_each_cpu); 786 #endif
··· 784 } 785 EXPORT_SYMBOL(on_each_cpu); 786 #endif 787 + 788 + /* 789 + * [ These __weak aliases are kept in a separate compilation unit, so that 790 + * GCC does not inline them incorrectly. ] 791 + */ 792 + 793 + int __init __weak early_irq_init(void) 794 + { 795 + return 0; 796 + } 797 + 798 + int __init __weak arch_early_irq_init(void) 799 + { 800 + return 0; 801 + } 802 + 803 + int __weak arch_init_chip_data(struct irq_desc *desc, int cpu) 804 + { 805 + return 0; 806 + }