OSDN Git Service

irqchip/versatile-fpga: Switch to dynamic chip name output
authorMarc Zyngier <maz@kernel.org>
Wed, 9 Feb 2022 16:26:04 +0000 (16:26 +0000)
committerMarc Zyngier <maz@kernel.org>
Tue, 15 Feb 2022 11:25:46 +0000 (11:25 +0000)
Move the name output to the relevant callback, which allows us
some nice cleanups (mostly owing to the fact that the driver is
now DT only.

We also drop a random include directive from the ftintc010 driver.

Signed-off-by: Marc Zyngier <maz@kernel.org>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
Link: https://lore.kernel.org/r/20220209162607.1118325-8-maz@kernel.org
drivers/irqchip/irq-ftintc010.c
drivers/irqchip/irq-versatile-fpga.c
include/linux/irqchip/versatile-fpga.h [deleted file]

index 5cc2688..46a3aa6 100644 (file)
@@ -11,7 +11,6 @@
 #include <linux/irq.h>
 #include <linux/io.h>
 #include <linux/irqchip.h>
-#include <linux/irqchip/versatile-fpga.h>
 #include <linux/irqdomain.h>
 #include <linux/module.h>
 #include <linux/of.h>
index f2757b6..ba543ed 100644 (file)
@@ -7,12 +7,12 @@
 #include <linux/io.h>
 #include <linux/irqchip.h>
 #include <linux/irqchip/chained_irq.h>
-#include <linux/irqchip/versatile-fpga.h>
 #include <linux/irqdomain.h>
 #include <linux/module.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
 #include <linux/of_irq.h>
+#include <linux/seq_file.h>
 
 #include <asm/exception.h>
 #include <asm/mach/irq.h>
 /**
  * struct fpga_irq_data - irq data container for the FPGA IRQ controller
  * @base: memory offset in virtual memory
- * @chip: chip container for this instance
  * @domain: IRQ domain for this instance
  * @valid: mask for valid IRQs on this controller
  * @used_irqs: number of active IRQs on this controller
  */
 struct fpga_irq_data {
        void __iomem *base;
-       struct irq_chip chip;
        u32 valid;
        struct irq_domain *domain;
        u8 used_irqs;
@@ -67,6 +65,20 @@ static void fpga_irq_unmask(struct irq_data *d)
        writel(mask, f->base + IRQ_ENABLE_SET);
 }
 
+static void fpga_irq_print_chip(struct irq_data *d, struct seq_file *p)
+{
+       struct fpga_irq_data *f = irq_data_get_irq_chip_data(d);
+
+       seq_printf(p, irq_domain_get_of_node(f->domain)->name);
+}
+
+static const struct irq_chip fpga_chip = {
+       .irq_ack        = fpga_irq_mask,
+       .irq_mask       = fpga_irq_mask,
+       .irq_unmask     = fpga_irq_unmask,
+       .irq_print_chip = fpga_irq_print_chip,
+};
+
 static void fpga_irq_handle(struct irq_desc *desc)
 {
        struct irq_chip *chip = irq_desc_get_chip(desc);
@@ -116,7 +128,7 @@ static int handle_one_fpga(struct fpga_irq_data *f, struct pt_regs *regs)
  * Keep iterating over all registered FPGA IRQ controllers until there are
  * no pending interrupts.
  */
-asmlinkage void __exception_irq_entry fpga_handle_irq(struct pt_regs *regs)
+static asmlinkage void __exception_irq_entry fpga_handle_irq(struct pt_regs *regs)
 {
        int i, handled;
 
@@ -135,8 +147,7 @@ static int fpga_irqdomain_map(struct irq_domain *d, unsigned int irq,
        if (!(f->valid & BIT(hwirq)))
                return -EPERM;
        irq_set_chip_data(irq, f);
-       irq_set_chip_and_handler(irq, &f->chip,
-                               handle_level_irq);
+       irq_set_chip_and_handler(irq, &fpga_chip, handle_level_irq);
        irq_set_probe(irq);
        return 0;
 }
@@ -146,8 +157,8 @@ static const struct irq_domain_ops fpga_irqdomain_ops = {
        .xlate = irq_domain_xlate_onetwocell,
 };
 
-void __init fpga_irq_init(void __iomem *base, const char *name, int irq_start,
-                         int parent_irq, u32 valid, struct device_node *node)
+static void __init fpga_irq_init(void __iomem *base, int parent_irq,
+                                u32 valid, struct device_node *node)
 {
        struct fpga_irq_data *f;
        int i;
@@ -158,10 +169,6 @@ void __init fpga_irq_init(void __iomem *base, const char *name, int irq_start,
        }
        f = &fpga_irq_devices[fpga_irq_id];
        f->base = base;
-       f->chip.name = name;
-       f->chip.irq_ack = fpga_irq_mask;
-       f->chip.irq_mask = fpga_irq_mask;
-       f->chip.irq_unmask = fpga_irq_unmask;
        f->valid = valid;
 
        if (parent_irq != -1) {
@@ -169,20 +176,19 @@ void __init fpga_irq_init(void __iomem *base, const char *name, int irq_start,
                                                 f);
        }
 
-       /* This will also allocate irq descriptors */
-       f->domain = irq_domain_add_simple(node, fls(valid), irq_start,
+       f->domain = irq_domain_add_linear(node, fls(valid),
                                          &fpga_irqdomain_ops, f);
 
        /* This will allocate all valid descriptors in the linear case */
        for (i = 0; i < fls(valid); i++)
                if (valid & BIT(i)) {
-                       if (!irq_start)
-                               irq_create_mapping(f->domain, i);
+                       /* Is this still required? */
+                       irq_create_mapping(f->domain, i);
                        f->used_irqs++;
                }
 
        pr_info("FPGA IRQ chip %d \"%s\" @ %p, %u irqs",
-               fpga_irq_id, name, base, f->used_irqs);
+               fpga_irq_id, node->name, base, f->used_irqs);
        if (parent_irq != -1)
                pr_cont(", parent IRQ: %d\n", parent_irq);
        else
@@ -192,8 +198,8 @@ void __init fpga_irq_init(void __iomem *base, const char *name, int irq_start,
 }
 
 #ifdef CONFIG_OF
-int __init fpga_irq_of_init(struct device_node *node,
-                           struct device_node *parent)
+static int __init fpga_irq_of_init(struct device_node *node,
+                                  struct device_node *parent)
 {
        void __iomem *base;
        u32 clear_mask;
@@ -222,7 +228,7 @@ int __init fpga_irq_of_init(struct device_node *node,
                parent_irq = -1;
        }
 
-       fpga_irq_init(base, node->name, 0, parent_irq, valid_mask, node);
+       fpga_irq_init(base, parent_irq, valid_mask, node);
 
        /*
         * On Versatile AB/PB, some secondary interrupts have a direct
diff --git a/include/linux/irqchip/versatile-fpga.h b/include/linux/irqchip/versatile-fpga.h
deleted file mode 100644 (file)
index a978fc8..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-#ifndef PLAT_FPGA_IRQ_H
-#define PLAT_FPGA_IRQ_H
-
-struct device_node;
-struct pt_regs;
-
-void fpga_handle_irq(struct pt_regs *regs);
-void fpga_irq_init(void __iomem *, const char *, int, int, u32,
-               struct device_node *node);
-int fpga_irq_of_init(struct device_node *node,
-                    struct device_node *parent);
-
-#endif