Skip to content

Commit

Permalink
irqchip: Bulk conversion to generic_handle_domain_irq()
Browse files Browse the repository at this point in the history
Wherever possible, replace constructs that match either
generic_handle_irq(irq_find_mapping()) or
generic_handle_irq(irq_linear_revmap()) to a single call to
generic_handle_domain_irq().

Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
  • Loading branch information
Marc Zyngier committed Jun 10, 2021
1 parent e1c0549 commit 046a6ee
Show file tree
Hide file tree
Showing 47 changed files with 111 additions and 190 deletions.
10 changes: 4 additions & 6 deletions drivers/irqchip/exynos-combiner.c
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,9 @@ static void combiner_handle_cascade_irq(struct irq_desc *desc)
{
struct combiner_chip_data *chip_data = irq_desc_get_handler_data(desc);
struct irq_chip *chip = irq_desc_get_chip(desc);
unsigned int cascade_irq, combiner_irq;
unsigned int combiner_irq;
unsigned long status;
int ret;

chained_irq_enter(chip, desc);

Expand All @@ -80,12 +81,9 @@ static void combiner_handle_cascade_irq(struct irq_desc *desc)
goto out;

combiner_irq = chip_data->hwirq_offset + __ffs(status);
cascade_irq = irq_find_mapping(combiner_irq_domain, combiner_irq);

if (unlikely(!cascade_irq))
ret = generic_handle_domain_irq(combiner_irq_domain, combiner_irq);
if (unlikely(ret))
handle_bad_irq(desc);
else
generic_handle_irq(cascade_irq);

out:
chained_irq_exit(chip, desc);
Expand Down
7 changes: 2 additions & 5 deletions drivers/irqchip/irq-al-fic.c
Original file line number Diff line number Diff line change
Expand Up @@ -111,18 +111,15 @@ static void al_fic_irq_handler(struct irq_desc *desc)
struct irq_chip *irqchip = irq_desc_get_chip(desc);
struct irq_chip_generic *gc = irq_get_domain_generic_chip(domain, 0);
unsigned long pending;
unsigned int irq;
u32 hwirq;

chained_irq_enter(irqchip, desc);

pending = readl_relaxed(fic->base + AL_FIC_CAUSE);
pending &= ~gc->mask_cache;

for_each_set_bit(hwirq, &pending, NR_FIC_IRQS) {
irq = irq_find_mapping(domain, hwirq);
generic_handle_irq(irq);
}
for_each_set_bit(hwirq, &pending, NR_FIC_IRQS)
generic_handle_domain_irq(domain, hwirq);

chained_irq_exit(irqchip, desc);
}
Expand Down
19 changes: 8 additions & 11 deletions drivers/irqchip/irq-armada-370-xp.c
Original file line number Diff line number Diff line change
Expand Up @@ -582,20 +582,19 @@ static void armada_370_xp_handle_msi_irq(struct pt_regs *regs, bool is_chained)

for (msinr = PCI_MSI_DOORBELL_START;
msinr < PCI_MSI_DOORBELL_END; msinr++) {
int irq;
unsigned int irq;

if (!(msimask & BIT(msinr)))
continue;

if (is_chained) {
irq = irq_find_mapping(armada_370_xp_msi_inner_domain,
msinr - PCI_MSI_DOORBELL_START);
generic_handle_irq(irq);
} else {
irq = msinr - PCI_MSI_DOORBELL_START;
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);
}
}
}
#else
Expand All @@ -606,7 +605,6 @@ static void armada_370_xp_mpic_handle_cascade_irq(struct irq_desc *desc)
{
struct irq_chip *chip = irq_desc_get_chip(desc);
unsigned long irqmap, irqn, irqsrc, cpuid;
unsigned int cascade_irq;

chained_irq_enter(chip, desc);

Expand All @@ -628,8 +626,7 @@ static void armada_370_xp_mpic_handle_cascade_irq(struct irq_desc *desc)
continue;
}

cascade_irq = irq_find_mapping(armada_370_xp_mpic_domain, irqn);
generic_handle_irq(cascade_irq);
generic_handle_domain_irq(armada_370_xp_mpic_domain, irqn);
}

chained_irq_exit(chip, desc);
Expand Down
8 changes: 3 additions & 5 deletions drivers/irqchip/irq-aspeed-i2c-ic.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,14 +34,12 @@ static void aspeed_i2c_ic_irq_handler(struct irq_desc *desc)
struct aspeed_i2c_ic *i2c_ic = irq_desc_get_handler_data(desc);
struct irq_chip *chip = irq_desc_get_chip(desc);
unsigned long bit, status;
unsigned int bus_irq;

chained_irq_enter(chip, desc);
status = readl(i2c_ic->base);
for_each_set_bit(bit, &status, ASPEED_I2C_IC_NUM_BUS) {
bus_irq = irq_find_mapping(i2c_ic->irq_domain, bit);
generic_handle_irq(bus_irq);
}
for_each_set_bit(bit, &status, ASPEED_I2C_IC_NUM_BUS)
generic_handle_domain_irq(i2c_ic->irq_domain, bit);

chained_irq_exit(chip, desc);
}

Expand Down
6 changes: 2 additions & 4 deletions drivers/irqchip/irq-aspeed-scu-ic.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,6 @@ struct aspeed_scu_ic {

static void aspeed_scu_ic_irq_handler(struct irq_desc *desc)
{
unsigned int irq;
unsigned int sts;
unsigned long bit;
unsigned long enabled;
Expand Down Expand Up @@ -74,9 +73,8 @@ static void aspeed_scu_ic_irq_handler(struct irq_desc *desc)
max = scu_ic->num_irqs + bit;

for_each_set_bit_from(bit, &status, max) {
irq = irq_find_mapping(scu_ic->irq_domain,
bit - scu_ic->irq_shift);
generic_handle_irq(irq);
generic_handle_domain_irq(scu_ic->irq_domain,
bit - scu_ic->irq_shift);

regmap_update_bits(scu_ic->scu, scu_ic->reg, mask,
BIT(bit + ASPEED_SCU_IC_STATUS_SHIFT));
Expand Down
2 changes: 1 addition & 1 deletion drivers/irqchip/irq-ath79-misc.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ static void ath79_misc_irq_handler(struct irq_desc *desc)
while (pending) {
int bit = __ffs(pending);

generic_handle_irq(irq_linear_revmap(domain, bit));
generic_handle_domain_irq(domain, bit);
pending &= ~BIT(bit);
}

Expand Down
2 changes: 1 addition & 1 deletion drivers/irqchip/irq-bcm2835.c
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,7 @@ static void bcm2836_chained_handle_irq(struct irq_desc *desc)
u32 hwirq;

while ((hwirq = get_next_armctrl_hwirq()) != ~0)
generic_handle_irq(irq_linear_revmap(intc.domain, hwirq));
generic_handle_domain_irq(intc.domain, hwirq);
}

IRQCHIP_DECLARE(bcm2835_armctrl_ic, "brcm,bcm2835-armctrl-ic",
Expand Down
2 changes: 1 addition & 1 deletion drivers/irqchip/irq-bcm2836.c
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ static void bcm2836_arm_irqchip_handle_ipi(struct irq_desc *desc)
mbox_val = readl_relaxed(intc.base + LOCAL_MAILBOX0_CLR0 + 16 * cpu);
if (mbox_val) {
int hwirq = ffs(mbox_val) - 1;
generic_handle_irq(irq_find_mapping(ipi_domain, hwirq));
generic_handle_domain_irq(ipi_domain, hwirq);
}

chained_irq_exit(chip, desc);
Expand Down
6 changes: 2 additions & 4 deletions drivers/irqchip/irq-bcm7038-l1.c
Original file line number Diff line number Diff line change
Expand Up @@ -145,10 +145,8 @@ static void bcm7038_l1_irq_handle(struct irq_desc *desc)
~cpu->mask_cache[idx];
raw_spin_unlock_irqrestore(&intc->lock, flags);

for_each_set_bit(hwirq, &pending, IRQS_PER_WORD) {
generic_handle_irq(irq_find_mapping(intc->domain,
base + hwirq));
}
for_each_set_bit(hwirq, &pending, IRQS_PER_WORD)
generic_handle_domain_irq(intc->domain, base + hwirq);
}

chained_irq_exit(chip, desc);
Expand Down
6 changes: 2 additions & 4 deletions drivers/irqchip/irq-bcm7120-l2.c
Original file line number Diff line number Diff line change
Expand Up @@ -74,10 +74,8 @@ static void bcm7120_l2_intc_irq_handle(struct irq_desc *desc)
data->irq_map_mask[idx];
irq_gc_unlock(gc);

for_each_set_bit(hwirq, &pending, IRQS_PER_WORD) {
generic_handle_irq(irq_find_mapping(b->domain,
base + hwirq));
}
for_each_set_bit(hwirq, &pending, IRQS_PER_WORD)
generic_handle_domain_irq(b->domain, base + hwirq);
}

chained_irq_exit(chip, desc);
Expand Down
2 changes: 1 addition & 1 deletion drivers/irqchip/irq-brcmstb-l2.c
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ static void brcmstb_l2_intc_irq_handle(struct irq_desc *desc)
do {
irq = ffs(status) - 1;
status &= ~(1 << irq);
generic_handle_irq(irq_linear_revmap(b->domain, irq));
generic_handle_domain_irq(b->domain, irq);
} while (status);
out:
chained_irq_exit(chip, desc);
Expand Down
3 changes: 1 addition & 2 deletions drivers/irqchip/irq-dw-apb-ictl.c
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,8 @@ static void dw_apb_ictl_handle_irq_cascaded(struct irq_desc *desc)

while (stat) {
u32 hwirq = ffs(stat) - 1;
u32 virq = irq_find_mapping(d, gc->irq_base + hwirq);
generic_handle_domain_irq(d, gc->irq_base + hwirq);

generic_handle_irq(virq);
stat &= ~BIT(hwirq);
}
}
Expand Down
13 changes: 5 additions & 8 deletions drivers/irqchip/irq-gic.c
Original file line number Diff line number Diff line change
Expand Up @@ -375,8 +375,9 @@ static void gic_handle_cascade_irq(struct irq_desc *desc)
{
struct gic_chip_data *chip_data = irq_desc_get_handler_data(desc);
struct irq_chip *chip = irq_desc_get_chip(desc);
unsigned int cascade_irq, gic_irq;
unsigned int gic_irq;
unsigned long status;
int ret;

chained_irq_enter(chip, desc);

Expand All @@ -386,14 +387,10 @@ static void gic_handle_cascade_irq(struct irq_desc *desc)
if (gic_irq == GICC_INT_SPURIOUS)
goto out;

cascade_irq = irq_find_mapping(chip_data->domain, gic_irq);
if (unlikely(gic_irq < 32 || gic_irq > 1020)) {
isb();
ret = generic_handle_domain_irq(chip_data->domain, gic_irq);
if (unlikely(ret))
handle_bad_irq(desc);
} else {
isb();
generic_handle_irq(cascade_irq);
}

out:
chained_irq_exit(chip, desc);
}
Expand Down
5 changes: 2 additions & 3 deletions drivers/irqchip/irq-goldfish-pic.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,15 +34,14 @@ static void goldfish_pic_cascade(struct irq_desc *desc)
{
struct goldfish_pic_data *gfpic = irq_desc_get_handler_data(desc);
struct irq_chip *host_chip = irq_desc_get_chip(desc);
u32 pending, hwirq, virq;
u32 pending, hwirq;

chained_irq_enter(host_chip, desc);

pending = readl(gfpic->base + GFPIC_REG_IRQ_PENDING);
while (pending) {
hwirq = __fls(pending);
virq = irq_linear_revmap(gfpic->irq_domain, hwirq);
generic_handle_irq(virq);
generic_handle_domain_irq(gfpic->irq_domain, hwirq);
pending &= ~(1 << hwirq);
}

Expand Down
4 changes: 1 addition & 3 deletions drivers/irqchip/irq-i8259.c
Original file line number Diff line number Diff line change
Expand Up @@ -333,13 +333,11 @@ static void i8259_irq_dispatch(struct irq_desc *desc)
{
struct irq_domain *domain = irq_desc_get_handler_data(desc);
int hwirq = i8259_poll();
unsigned int irq;

if (hwirq < 0)
return;

irq = irq_linear_revmap(domain, hwirq);
generic_handle_irq(irq);
generic_handle_domain_irq(domain, hwirq);
}

int __init i8259_of_init(struct device_node *node, struct device_node *parent)
Expand Down
6 changes: 2 additions & 4 deletions drivers/irqchip/irq-idt3243x.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,17 +28,15 @@ static void idt_irq_dispatch(struct irq_desc *desc)
{
struct idt_pic_data *idtpic = irq_desc_get_handler_data(desc);
struct irq_chip *host_chip = irq_desc_get_chip(desc);
u32 pending, hwirq, virq;
u32 pending, hwirq;

chained_irq_enter(host_chip, desc);

pending = irq_reg_readl(idtpic->gc, IDT_PIC_IRQ_PEND);
pending &= ~idtpic->gc->mask_cache;
while (pending) {
hwirq = __fls(pending);
virq = irq_linear_revmap(idtpic->irq_domain, hwirq);
if (virq)
generic_handle_irq(virq);
generic_handle_domain_irq(idtpic->irq_domain, hwirq);
pending &= ~(1 << hwirq);
}

Expand Down
11 changes: 4 additions & 7 deletions drivers/irqchip/irq-imgpdc.c
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,7 @@ static void pdc_intc_perip_isr(struct irq_desc *desc)
{
unsigned int irq = irq_desc_get_irq(desc);
struct pdc_intc_priv *priv;
unsigned int i, irq_no;
unsigned int i;

priv = (struct pdc_intc_priv *)irq_desc_get_handler_data(desc);

Expand All @@ -237,14 +237,13 @@ static void pdc_intc_perip_isr(struct irq_desc *desc)
found:

/* pass on the interrupt */
irq_no = irq_linear_revmap(priv->domain, i);
generic_handle_irq(irq_no);
generic_handle_domain_irq(priv->domain, i);
}

static void pdc_intc_syswake_isr(struct irq_desc *desc)
{
struct pdc_intc_priv *priv;
unsigned int syswake, irq_no;
unsigned int syswake;
unsigned int status;

priv = (struct pdc_intc_priv *)irq_desc_get_handler_data(desc);
Expand All @@ -258,9 +257,7 @@ static void pdc_intc_syswake_isr(struct irq_desc *desc)
if (!(status & 1))
continue;

irq_no = irq_linear_revmap(priv->domain,
syswake_to_hwirq(syswake));
generic_handle_irq(irq_no);
generic_handle_domain_irq(priv->domain, syswake_to_hwirq(syswake));
}
}

Expand Down
9 changes: 3 additions & 6 deletions drivers/irqchip/irq-imx-intmux.c
Original file line number Diff line number Diff line change
Expand Up @@ -182,18 +182,15 @@ static void imx_intmux_irq_handler(struct irq_desc *desc)
struct intmux_data *data = container_of(irqchip_data, struct intmux_data,
irqchip_data[idx]);
unsigned long irqstat;
int pos, virq;
int pos;

chained_irq_enter(irq_desc_get_chip(desc), desc);

/* read the interrupt source pending status of this channel */
irqstat = readl_relaxed(data->regs + CHANIPR(idx));

for_each_set_bit(pos, &irqstat, 32) {
virq = irq_find_mapping(irqchip_data->domain, pos);
if (virq)
generic_handle_irq(virq);
}
for_each_set_bit(pos, &irqstat, 32)
generic_handle_domain_irq(irqchip_data->domain, pos);

chained_irq_exit(irq_desc_get_chip(desc), desc);
}
Expand Down
9 changes: 3 additions & 6 deletions drivers/irqchip/irq-imx-irqsteer.c
Original file line number Diff line number Diff line change
Expand Up @@ -122,19 +122,16 @@ static void imx_irqsteer_irq_handler(struct irq_desc *desc)
for (i = 0; i < 2; i++, hwirq += 32) {
int idx = imx_irqsteer_get_reg_index(data, hwirq);
unsigned long irqmap;
int pos, virq;
int pos;

if (hwirq >= data->reg_num * 32)
break;

irqmap = readl_relaxed(data->regs +
CHANSTATUS(idx, data->reg_num));

for_each_set_bit(pos, &irqmap, 32) {
virq = irq_find_mapping(data->domain, pos + hwirq);
if (virq)
generic_handle_irq(virq);
}
for_each_set_bit(pos, &irqmap, 32)
generic_handle_domain_irq(data->domain, pos + hwirq);
}

chained_irq_exit(irq_desc_get_chip(desc), desc);
Expand Down
2 changes: 1 addition & 1 deletion drivers/irqchip/irq-ingenic-tcu.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ static void ingenic_tcu_intc_cascade(struct irq_desc *desc)
irq_reg &= ~irq_mask;

for_each_set_bit(i, (unsigned long *)&irq_reg, 32)
generic_handle_irq(irq_linear_revmap(domain, i));
generic_handle_domain_irq(domain, i);

chained_irq_exit(irq_chip, desc);
}
Expand Down
3 changes: 1 addition & 2 deletions drivers/irqchip/irq-ingenic.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,7 @@ static irqreturn_t intc_cascade(int irq, void *data)
while (pending) {
int bit = __fls(pending);

irq = irq_linear_revmap(domain, bit + (i * 32));
generic_handle_irq(irq);
generic_handle_domain_irq(domain, bit + (i * 32));
pending &= ~BIT(bit);
}
}
Expand Down
Loading

0 comments on commit 046a6ee

Please sign in to comment.