]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - drivers/sh/intc.c
sh: irq: Teach ipr and intc about dynamically allocating irq_descs.
[mirror_ubuntu-bionic-kernel.git] / drivers / sh / intc.c
index 12d13d99b6f09690c9ec31a42ae630f460f039f4..098b767e9afdaf1f1c11aaff3f22833ecd93c170 100644 (file)
@@ -671,7 +671,7 @@ unsigned int intc_evt2irq(unsigned int vector)
 
 void __init register_intc_controller(struct intc_desc *desc)
 {
-       unsigned int i, k, smp;
+       unsigned int i, k, smp, cpu = smp_processor_id();
        struct intc_desc_int *d;
 
        d = alloc_bootmem(sizeof(*d));
@@ -770,11 +770,19 @@ void __init register_intc_controller(struct intc_desc *desc)
        /* register the vectors one by one */
        for (i = 0; i < desc->nr_vectors; i++) {
                struct intc_vect *vect = desc->vectors + i;
+               unsigned int irq = evt2irq(vect->vect);
+               struct irq_desc *irq_desc;
 
                if (!vect->enum_id)
                        continue;
 
-               intc_register_irq(desc, d, vect->enum_id, evt2irq(vect->vect));
+               irq_desc = irq_to_desc_alloc_cpu(irq, cpu);
+               if (unlikely(!irq_desc)) {
+                       printk(KERN_INFO "can not get irq_desc for %d\n", irq);
+                       continue;
+               }
+
+               intc_register_irq(desc, d, vect->enum_id, irq);
        }
 }