diff options
Diffstat (limited to 'kernel/irq/handle.c')
| -rw-r--r-- | kernel/irq/handle.c | 48 |
1 files changed, 32 insertions, 16 deletions
diff --git a/kernel/irq/handle.c b/kernel/irq/handle.c index 6492400cb50d..c20db0be9173 100644 --- a/kernel/irq/handle.c +++ b/kernel/irq/handle.c | |||
| @@ -56,10 +56,6 @@ void handle_bad_irq(unsigned int irq, struct irq_desc *desc) | |||
| 56 | int nr_irqs = NR_IRQS; | 56 | int nr_irqs = NR_IRQS; |
| 57 | EXPORT_SYMBOL_GPL(nr_irqs); | 57 | EXPORT_SYMBOL_GPL(nr_irqs); |
| 58 | 58 | ||
| 59 | void __init __attribute__((weak)) arch_early_irq_init(void) | ||
| 60 | { | ||
| 61 | } | ||
| 62 | |||
| 63 | #ifdef CONFIG_SPARSE_IRQ | 59 | #ifdef CONFIG_SPARSE_IRQ |
| 64 | static struct irq_desc irq_desc_init = { | 60 | static struct irq_desc irq_desc_init = { |
| 65 | .irq = -1, | 61 | .irq = -1, |
| @@ -90,13 +86,11 @@ void init_kstat_irqs(struct irq_desc *desc, int cpu, int nr) | |||
| 90 | desc->kstat_irqs = (unsigned int *)ptr; | 86 | desc->kstat_irqs = (unsigned int *)ptr; |
| 91 | } | 87 | } |
| 92 | 88 | ||
| 93 | void __attribute__((weak)) arch_init_chip_data(struct irq_desc *desc, int cpu) | ||
| 94 | { | ||
| 95 | } | ||
| 96 | |||
| 97 | static void init_one_irq_desc(int irq, struct irq_desc *desc, int cpu) | 89 | static void init_one_irq_desc(int irq, struct irq_desc *desc, int cpu) |
| 98 | { | 90 | { |
| 99 | memcpy(desc, &irq_desc_init, sizeof(struct irq_desc)); | 91 | memcpy(desc, &irq_desc_init, sizeof(struct irq_desc)); |
| 92 | |||
| 93 | spin_lock_init(&desc->lock); | ||
| 100 | desc->irq = irq; | 94 | desc->irq = irq; |
| 101 | #ifdef CONFIG_SMP | 95 | #ifdef CONFIG_SMP |
| 102 | desc->cpu = cpu; | 96 | desc->cpu = cpu; |
| @@ -134,7 +128,7 @@ static struct irq_desc irq_desc_legacy[NR_IRQS_LEGACY] __cacheline_aligned_in_sm | |||
| 134 | /* FIXME: use bootmem alloc ...*/ | 128 | /* FIXME: use bootmem alloc ...*/ |
| 135 | static unsigned int kstat_irqs_legacy[NR_IRQS_LEGACY][NR_CPUS]; | 129 | static unsigned int kstat_irqs_legacy[NR_IRQS_LEGACY][NR_CPUS]; |
| 136 | 130 | ||
| 137 | void __init early_irq_init(void) | 131 | int __init early_irq_init(void) |
| 138 | { | 132 | { |
| 139 | struct irq_desc *desc; | 133 | struct irq_desc *desc; |
| 140 | int legacy_count; | 134 | int legacy_count; |
| @@ -146,6 +140,7 @@ void __init early_irq_init(void) | |||
| 146 | for (i = 0; i < legacy_count; i++) { | 140 | for (i = 0; i < legacy_count; i++) { |
| 147 | desc[i].irq = i; | 141 | desc[i].irq = i; |
| 148 | desc[i].kstat_irqs = kstat_irqs_legacy[i]; | 142 | desc[i].kstat_irqs = kstat_irqs_legacy[i]; |
| 143 | lockdep_set_class(&desc[i].lock, &irq_desc_lock_class); | ||
| 149 | 144 | ||
| 150 | irq_desc_ptrs[i] = desc + i; | 145 | irq_desc_ptrs[i] = desc + i; |
| 151 | } | 146 | } |
| @@ -153,7 +148,7 @@ void __init early_irq_init(void) | |||
| 153 | for (i = legacy_count; i < NR_IRQS; i++) | 148 | for (i = legacy_count; i < NR_IRQS; i++) |
| 154 | irq_desc_ptrs[i] = NULL; | 149 | irq_desc_ptrs[i] = NULL; |
| 155 | 150 | ||
| 156 | arch_early_irq_init(); | 151 | return arch_early_irq_init(); |
| 157 | } | 152 | } |
| 158 | 153 | ||
| 159 | struct irq_desc *irq_to_desc(unsigned int irq) | 154 | struct irq_desc *irq_to_desc(unsigned int irq) |
| @@ -203,7 +198,7 @@ out_unlock: | |||
| 203 | return desc; | 198 | return desc; |
| 204 | } | 199 | } |
| 205 | 200 | ||
| 206 | #else | 201 | #else /* !CONFIG_SPARSE_IRQ */ |
| 207 | 202 | ||
| 208 | struct irq_desc irq_desc[NR_IRQS] __cacheline_aligned_in_smp = { | 203 | struct irq_desc irq_desc[NR_IRQS] __cacheline_aligned_in_smp = { |
| 209 | [0 ... NR_IRQS-1] = { | 204 | [0 ... NR_IRQS-1] = { |
| @@ -218,7 +213,31 @@ struct irq_desc irq_desc[NR_IRQS] __cacheline_aligned_in_smp = { | |||
| 218 | } | 213 | } |
| 219 | }; | 214 | }; |
| 220 | 215 | ||
| 221 | #endif | 216 | int __init early_irq_init(void) |
| 217 | { | ||
| 218 | struct irq_desc *desc; | ||
| 219 | int count; | ||
| 220 | int i; | ||
| 221 | |||
| 222 | desc = irq_desc; | ||
| 223 | count = ARRAY_SIZE(irq_desc); | ||
| 224 | |||
| 225 | for (i = 0; i < count; i++) | ||
| 226 | desc[i].irq = i; | ||
| 227 | |||
| 228 | return arch_early_irq_init(); | ||
| 229 | } | ||
| 230 | |||
| 231 | struct irq_desc *irq_to_desc(unsigned int irq) | ||
| 232 | { | ||
| 233 | return (irq < NR_IRQS) ? irq_desc + irq : NULL; | ||
| 234 | } | ||
| 235 | |||
| 236 | struct irq_desc *irq_to_desc_alloc_cpu(unsigned int irq, int cpu) | ||
| 237 | { | ||
| 238 | return irq_to_desc(irq); | ||
| 239 | } | ||
| 240 | #endif /* !CONFIG_SPARSE_IRQ */ | ||
| 222 | 241 | ||
| 223 | /* | 242 | /* |
| 224 | * What should we do if we get a hw irq event on an illegal vector? | 243 | * What should we do if we get a hw irq event on an illegal vector? |
| @@ -428,9 +447,6 @@ void early_init_irq_lock_class(void) | |||
| 428 | int i; | 447 | int i; |
| 429 | 448 | ||
| 430 | for_each_irq_desc(i, desc) { | 449 | for_each_irq_desc(i, desc) { |
| 431 | if (!desc) | ||
| 432 | continue; | ||
| 433 | |||
| 434 | lockdep_set_class(&desc->lock, &irq_desc_lock_class); | 450 | lockdep_set_class(&desc->lock, &irq_desc_lock_class); |
| 435 | } | 451 | } |
| 436 | } | 452 | } |
| @@ -439,7 +455,7 @@ void early_init_irq_lock_class(void) | |||
| 439 | unsigned int kstat_irqs_cpu(unsigned int irq, int cpu) | 455 | unsigned int kstat_irqs_cpu(unsigned int irq, int cpu) |
| 440 | { | 456 | { |
| 441 | struct irq_desc *desc = irq_to_desc(irq); | 457 | struct irq_desc *desc = irq_to_desc(irq); |
| 442 | return desc->kstat_irqs[cpu]; | 458 | return desc ? desc->kstat_irqs[cpu] : 0; |
| 443 | } | 459 | } |
| 444 | #endif | 460 | #endif |
| 445 | EXPORT_SYMBOL(kstat_irqs_cpu); | 461 | EXPORT_SYMBOL(kstat_irqs_cpu); |
