diff options
Diffstat (limited to 'arch/powerpc/kernel/irq.c')
-rw-r--r-- | arch/powerpc/kernel/irq.c | 55 |
1 files changed, 25 insertions, 30 deletions
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c index ce557f6f00fc..0a5570338b96 100644 --- a/arch/powerpc/kernel/irq.c +++ b/arch/powerpc/kernel/irq.c | |||
@@ -237,6 +237,7 @@ int show_interrupts(struct seq_file *p, void *v) | |||
237 | int i = *(loff_t *) v, j, prec; | 237 | int i = *(loff_t *) v, j, prec; |
238 | struct irqaction *action; | 238 | struct irqaction *action; |
239 | struct irq_desc *desc; | 239 | struct irq_desc *desc; |
240 | struct irq_chip *chip; | ||
240 | 241 | ||
241 | if (i > nr_irqs) | 242 | if (i > nr_irqs) |
242 | return 0; | 243 | return 0; |
@@ -270,8 +271,9 @@ int show_interrupts(struct seq_file *p, void *v) | |||
270 | for_each_online_cpu(j) | 271 | for_each_online_cpu(j) |
271 | seq_printf(p, "%10u ", kstat_irqs_cpu(i, j)); | 272 | seq_printf(p, "%10u ", kstat_irqs_cpu(i, j)); |
272 | 273 | ||
273 | if (desc->chip) | 274 | chip = get_irq_desc_chip(desc); |
274 | seq_printf(p, " %-16s", desc->chip->name); | 275 | if (chip) |
276 | seq_printf(p, " %-16s", chip->name); | ||
275 | else | 277 | else |
276 | seq_printf(p, " %-16s", "None"); | 278 | seq_printf(p, " %-16s", "None"); |
277 | seq_printf(p, " %-8s", (desc->status & IRQ_LEVEL) ? "Level" : "Edge"); | 279 | seq_printf(p, " %-8s", (desc->status & IRQ_LEVEL) ? "Level" : "Edge"); |
@@ -313,6 +315,8 @@ void fixup_irqs(const struct cpumask *map) | |||
313 | alloc_cpumask_var(&mask, GFP_KERNEL); | 315 | alloc_cpumask_var(&mask, GFP_KERNEL); |
314 | 316 | ||
315 | for_each_irq(irq) { | 317 | for_each_irq(irq) { |
318 | struct irq_chip *chip; | ||
319 | |||
316 | desc = irq_to_desc(irq); | 320 | desc = irq_to_desc(irq); |
317 | if (!desc) | 321 | if (!desc) |
318 | continue; | 322 | continue; |
@@ -320,13 +324,15 @@ void fixup_irqs(const struct cpumask *map) | |||
320 | if (desc->status & IRQ_PER_CPU) | 324 | if (desc->status & IRQ_PER_CPU) |
321 | continue; | 325 | continue; |
322 | 326 | ||
323 | cpumask_and(mask, desc->affinity, map); | 327 | chip = get_irq_desc_chip(desc); |
328 | |||
329 | cpumask_and(mask, desc->irq_data.affinity, map); | ||
324 | if (cpumask_any(mask) >= nr_cpu_ids) { | 330 | if (cpumask_any(mask) >= nr_cpu_ids) { |
325 | printk("Breaking affinity for irq %i\n", irq); | 331 | printk("Breaking affinity for irq %i\n", irq); |
326 | cpumask_copy(mask, map); | 332 | cpumask_copy(mask, map); |
327 | } | 333 | } |
328 | if (desc->chip->set_affinity) | 334 | if (chip->irq_set_affinity) |
329 | desc->chip->set_affinity(irq, mask); | 335 | chip->irq_set_affinity(&desc->irq_data, mask, true); |
330 | else if (desc->action && !(warned++)) | 336 | else if (desc->action && !(warned++)) |
331 | printk("Cannot set affinity for irq %i\n", irq); | 337 | printk("Cannot set affinity for irq %i\n", irq); |
332 | } | 338 | } |
@@ -678,16 +684,15 @@ void irq_set_virq_count(unsigned int count) | |||
678 | static int irq_setup_virq(struct irq_host *host, unsigned int virq, | 684 | static int irq_setup_virq(struct irq_host *host, unsigned int virq, |
679 | irq_hw_number_t hwirq) | 685 | irq_hw_number_t hwirq) |
680 | { | 686 | { |
681 | struct irq_desc *desc; | 687 | int res; |
682 | 688 | ||
683 | desc = irq_to_desc_alloc_node(virq, 0); | 689 | res = irq_alloc_desc_at(virq, 0); |
684 | if (!desc) { | 690 | if (res != virq) { |
685 | pr_debug("irq: -> allocating desc failed\n"); | 691 | pr_debug("irq: -> allocating desc failed\n"); |
686 | goto error; | 692 | goto error; |
687 | } | 693 | } |
688 | 694 | ||
689 | /* Clear IRQ_NOREQUEST flag */ | 695 | irq_clear_status_flags(virq, IRQ_NOREQUEST); |
690 | desc->status &= ~IRQ_NOREQUEST; | ||
691 | 696 | ||
692 | /* map it */ | 697 | /* map it */ |
693 | smp_wmb(); | 698 | smp_wmb(); |
@@ -696,11 +701,13 @@ static int irq_setup_virq(struct irq_host *host, unsigned int virq, | |||
696 | 701 | ||
697 | if (host->ops->map(host, virq, hwirq)) { | 702 | if (host->ops->map(host, virq, hwirq)) { |
698 | pr_debug("irq: -> mapping failed, freeing\n"); | 703 | pr_debug("irq: -> mapping failed, freeing\n"); |
699 | goto error; | 704 | goto errdesc; |
700 | } | 705 | } |
701 | 706 | ||
702 | return 0; | 707 | return 0; |
703 | 708 | ||
709 | errdesc: | ||
710 | irq_free_descs(virq, 1); | ||
704 | error: | 711 | error: |
705 | irq_free_virt(virq, 1); | 712 | irq_free_virt(virq, 1); |
706 | return -1; | 713 | return -1; |
@@ -879,9 +886,9 @@ void irq_dispose_mapping(unsigned int virq) | |||
879 | smp_mb(); | 886 | smp_mb(); |
880 | irq_map[virq].hwirq = host->inval_irq; | 887 | irq_map[virq].hwirq = host->inval_irq; |
881 | 888 | ||
882 | /* Set some flags */ | 889 | irq_set_status_flags(virq, IRQ_NOREQUEST); |
883 | irq_to_desc(virq)->status |= IRQ_NOREQUEST; | ||
884 | 890 | ||
891 | irq_free_descs(virq, 1); | ||
885 | /* Free it */ | 892 | /* Free it */ |
886 | irq_free_virt(virq, 1); | 893 | irq_free_virt(virq, 1); |
887 | } | 894 | } |
@@ -1074,21 +1081,6 @@ void irq_free_virt(unsigned int virq, unsigned int count) | |||
1074 | 1081 | ||
1075 | int arch_early_irq_init(void) | 1082 | int arch_early_irq_init(void) |
1076 | { | 1083 | { |
1077 | struct irq_desc *desc; | ||
1078 | int i; | ||
1079 | |||
1080 | for (i = 0; i < NR_IRQS; i++) { | ||
1081 | desc = irq_to_desc(i); | ||
1082 | if (desc) | ||
1083 | desc->status |= IRQ_NOREQUEST; | ||
1084 | } | ||
1085 | |||
1086 | return 0; | ||
1087 | } | ||
1088 | |||
1089 | int arch_init_chip_data(struct irq_desc *desc, int node) | ||
1090 | { | ||
1091 | desc->status |= IRQ_NOREQUEST; | ||
1092 | return 0; | 1084 | return 0; |
1093 | } | 1085 | } |
1094 | 1086 | ||
@@ -1159,11 +1151,14 @@ static int virq_debug_show(struct seq_file *m, void *private) | |||
1159 | raw_spin_lock_irqsave(&desc->lock, flags); | 1151 | raw_spin_lock_irqsave(&desc->lock, flags); |
1160 | 1152 | ||
1161 | if (desc->action && desc->action->handler) { | 1153 | if (desc->action && desc->action->handler) { |
1154 | struct irq_chip *chip; | ||
1155 | |||
1162 | seq_printf(m, "%5d ", i); | 1156 | seq_printf(m, "%5d ", i); |
1163 | seq_printf(m, "0x%05lx ", virq_to_hw(i)); | 1157 | seq_printf(m, "0x%05lx ", virq_to_hw(i)); |
1164 | 1158 | ||
1165 | if (desc->chip && desc->chip->name) | 1159 | chip = get_irq_desc_chip(desc); |
1166 | p = desc->chip->name; | 1160 | if (chip && chip->name) |
1161 | p = chip->name; | ||
1167 | else | 1162 | else |
1168 | p = none; | 1163 | p = none; |
1169 | seq_printf(m, "%-15s ", p); | 1164 | seq_printf(m, "%-15s ", p); |