OSDN Git Service

irqchip/mvebu-pic: Switch to dynamic chip name output
authorMarc Zyngier <maz@kernel.org>
Wed, 9 Feb 2022 16:26:02 +0000 (16:26 +0000)
committerMarc Zyngier <maz@kernel.org>
Tue, 15 Feb 2022 11:25:46 +0000 (11:25 +0000)
Instead of overriding the name field, track the corresponding device
and use the relevant callback to output its name.

This allows us to make the irq_chip structure const.

Signed-off-by: Marc Zyngier <maz@kernel.org>
Reviewed-by: Gregory CLEMENT <gregory.clement@bootlin.com>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
Link: https://lore.kernel.org/r/20220209162607.1118325-6-maz@kernel.org
drivers/irqchip/irq-mvebu-pic.c

index 870f986..ef3d364 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/module.h>
 #include <linux/of_irq.h>
 #include <linux/platform_device.h>
+#include <linux/seq_file.h>
 
 #define PIC_CAUSE             0x0
 #define PIC_MASK              0x4
@@ -29,7 +30,7 @@ struct mvebu_pic {
        void __iomem *base;
        u32 parent_irq;
        struct irq_domain *domain;
-       struct irq_chip irq_chip;
+       struct platform_device *pdev;
 };
 
 static void mvebu_pic_reset(struct mvebu_pic *pic)
@@ -66,6 +67,20 @@ static void mvebu_pic_unmask_irq(struct irq_data *d)
        writel(reg, pic->base + PIC_MASK);
 }
 
+static void mvebu_pic_print_chip(struct irq_data *d, struct seq_file *p)
+{
+       struct mvebu_pic *pic = irq_data_get_irq_chip_data(d);
+
+       seq_printf(p, dev_name(&pic->pdev->dev));
+}
+
+static const struct irq_chip mvebu_pic_chip = {
+       .irq_mask       = mvebu_pic_mask_irq,
+       .irq_unmask     = mvebu_pic_unmask_irq,
+       .irq_eoi        = mvebu_pic_eoi_irq,
+       .irq_print_chip = mvebu_pic_print_chip,
+};
+
 static int mvebu_pic_irq_map(struct irq_domain *domain, unsigned int virq,
                             irq_hw_number_t hwirq)
 {
@@ -73,8 +88,7 @@ static int mvebu_pic_irq_map(struct irq_domain *domain, unsigned int virq,
 
        irq_set_percpu_devid(virq);
        irq_set_chip_data(virq, pic);
-       irq_set_chip_and_handler(virq, &pic->irq_chip,
-                                handle_percpu_devid_irq);
+       irq_set_chip_and_handler(virq, &mvebu_pic_chip, handle_percpu_devid_irq);
        irq_set_status_flags(virq, IRQ_LEVEL);
        irq_set_probe(virq);
 
@@ -120,22 +134,16 @@ static int mvebu_pic_probe(struct platform_device *pdev)
 {
        struct device_node *node = pdev->dev.of_node;
        struct mvebu_pic *pic;
-       struct irq_chip *irq_chip;
 
        pic = devm_kzalloc(&pdev->dev, sizeof(struct mvebu_pic), GFP_KERNEL);
        if (!pic)
                return -ENOMEM;
 
+       pic->pdev = pdev;
        pic->base = devm_platform_ioremap_resource(pdev, 0);
        if (IS_ERR(pic->base))
                return PTR_ERR(pic->base);
 
-       irq_chip = &pic->irq_chip;
-       irq_chip->name = dev_name(&pdev->dev);
-       irq_chip->irq_mask = mvebu_pic_mask_irq;
-       irq_chip->irq_unmask = mvebu_pic_unmask_irq;
-       irq_chip->irq_eoi = mvebu_pic_eoi_irq;
-
        pic->parent_irq = irq_of_parse_and_map(node, 0);
        if (pic->parent_irq <= 0) {
                dev_err(&pdev->dev, "Failed to parse parent interrupt\n");