lkml.org 
[lkml]   [2022]   [Sep]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 128/141] gpio: ixp4xx: Make irqchip immutable
    Date
    From: Linus Walleij <linus.walleij@linaro.org>

    [ Upstream commit 94e9bc73d85aa6ecfe249e985ff57abe0ab35f34 ]

    This turns the IXP4xx GPIO irqchip into an immutable
    irqchip, a bit different from the standard template due
    to being hierarchical.

    Tested on the IXP4xx which uses drivers/ata/pata_ixp4xx_cf.c
    for a rootfs on compact flash with IRQs from this GPIO
    block to the CF ATA controller.

    Cc: Marc Zyngier <maz@kernel.org>
    Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
    Acked-by: Marc Zyngier <maz@kernel.org>
    Signed-off-by: Bartosz Golaszewski <brgl@bgdev.pl>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/gpio/gpio-ixp4xx.c | 17 ++++++++++++++---
    1 file changed, 14 insertions(+), 3 deletions(-)

    diff --git a/drivers/gpio/gpio-ixp4xx.c b/drivers/gpio/gpio-ixp4xx.c
    index b3b050604e0b..6bd047e2ca46 100644
    --- a/drivers/gpio/gpio-ixp4xx.c
    +++ b/drivers/gpio/gpio-ixp4xx.c
    @@ -67,6 +67,14 @@ static void ixp4xx_gpio_irq_ack(struct irq_data *d)
    __raw_writel(BIT(d->hwirq), g->base + IXP4XX_REG_GPIS);
    }

    +static void ixp4xx_gpio_mask_irq(struct irq_data *d)
    +{
    + struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
    +
    + irq_chip_mask_parent(d);
    + gpiochip_disable_irq(gc, d->hwirq);
    +}
    +
    static void ixp4xx_gpio_irq_unmask(struct irq_data *d)
    {
    struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
    @@ -76,6 +84,7 @@ static void ixp4xx_gpio_irq_unmask(struct irq_data *d)
    if (!(g->irq_edge & BIT(d->hwirq)))
    ixp4xx_gpio_irq_ack(d);

    + gpiochip_enable_irq(gc, d->hwirq);
    irq_chip_unmask_parent(d);
    }

    @@ -153,12 +162,14 @@ static int ixp4xx_gpio_irq_set_type(struct irq_data *d, unsigned int type)
    return irq_chip_set_type_parent(d, IRQ_TYPE_LEVEL_HIGH);
    }

    -static struct irq_chip ixp4xx_gpio_irqchip = {
    +static const struct irq_chip ixp4xx_gpio_irqchip = {
    .name = "IXP4GPIO",
    .irq_ack = ixp4xx_gpio_irq_ack,
    - .irq_mask = irq_chip_mask_parent,
    + .irq_mask = ixp4xx_gpio_mask_irq,
    .irq_unmask = ixp4xx_gpio_irq_unmask,
    .irq_set_type = ixp4xx_gpio_irq_set_type,
    + .flags = IRQCHIP_IMMUTABLE,
    + GPIOCHIP_IRQ_RESOURCE_HELPERS,
    };

    static int ixp4xx_gpio_child_to_parent_hwirq(struct gpio_chip *gc,
    @@ -282,7 +293,7 @@ static int ixp4xx_gpio_probe(struct platform_device *pdev)
    g->gc.owner = THIS_MODULE;

    girq = &g->gc.irq;
    - girq->chip = &ixp4xx_gpio_irqchip;
    + gpio_irq_chip_set_chip(girq, &ixp4xx_gpio_irqchip);
    girq->fwnode = g->fwnode;
    girq->parent_domain = parent;
    girq->child_to_parent_hwirq = ixp4xx_gpio_child_to_parent_hwirq;
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-09-26 13:12    [W:4.347 / U:0.068 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site