Merge tag 'thermal-5.18-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael...
[platform/kernel/linux-starfive.git] / drivers / irqchip / irq-armada-370-xp.c
index 53e0fb0..5b8d571 100644 (file)
@@ -232,16 +232,12 @@ static int armada_370_xp_msi_alloc(struct irq_domain *domain, unsigned int virq,
        int hwirq, i;
 
        mutex_lock(&msi_used_lock);
+       hwirq = bitmap_find_free_region(msi_used, PCI_MSI_DOORBELL_NR,
+                                       order_base_2(nr_irqs));
+       mutex_unlock(&msi_used_lock);
 
-       hwirq = bitmap_find_next_zero_area(msi_used, PCI_MSI_DOORBELL_NR,
-                                          0, nr_irqs, 0);
-       if (hwirq >= PCI_MSI_DOORBELL_NR) {
-               mutex_unlock(&msi_used_lock);
+       if (hwirq < 0)
                return -ENOSPC;
-       }
-
-       bitmap_set(msi_used, hwirq, nr_irqs);
-       mutex_unlock(&msi_used_lock);
 
        for (i = 0; i < nr_irqs; i++) {
                irq_domain_set_info(domain, virq + i, hwirq + i,
@@ -250,7 +246,7 @@ static int armada_370_xp_msi_alloc(struct irq_domain *domain, unsigned int virq,
                                    NULL, NULL);
        }
 
-       return hwirq;
+       return 0;
 }
 
 static void armada_370_xp_msi_free(struct irq_domain *domain,
@@ -259,7 +255,7 @@ static void armada_370_xp_msi_free(struct irq_domain *domain,
        struct irq_data *d = irq_domain_get_irq_data(domain, virq);
 
        mutex_lock(&msi_used_lock);
-       bitmap_clear(msi_used, d->hwirq, nr_irqs);
+       bitmap_release_region(msi_used, d->hwirq, order_base_2(nr_irqs));
        mutex_unlock(&msi_used_lock);
 }
 
@@ -589,12 +585,7 @@ static void armada_370_xp_handle_msi_irq(struct pt_regs *regs, bool is_chained)
 
                irq = msinr - PCI_MSI_DOORBELL_START;
 
-               if (is_chained)
-                       generic_handle_domain_irq(armada_370_xp_msi_inner_domain,
-                                                 irq);
-               else
-                       handle_domain_irq(armada_370_xp_msi_inner_domain,
-                                         irq, regs);
+               generic_handle_domain_irq(armada_370_xp_msi_inner_domain, irq);
        }
 }
 #else
@@ -646,8 +637,8 @@ armada_370_xp_handle_irq(struct pt_regs *regs)
                        break;
 
                if (irqnr > 1) {
-                       handle_domain_irq(armada_370_xp_mpic_domain,
-                                         irqnr, regs);
+                       generic_handle_domain_irq(armada_370_xp_mpic_domain,
+                                                 irqnr);
                        continue;
                }
 
@@ -666,7 +657,7 @@ armada_370_xp_handle_irq(struct pt_regs *regs)
                                & IPI_DOORBELL_MASK;
 
                        for_each_set_bit(ipi, &ipimask, IPI_DOORBELL_END)
-                               handle_domain_irq(ipi_domain, ipi, regs);
+                               generic_handle_domain_irq(ipi_domain, ipi);
                }
 #endif