Re: [PATCH] pinctrl: renesas: rzg2l: Configure interrupt input mode

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Biju,

On Fri, Oct 6, 2023 at 2:18 PM Biju Das <biju.das.jz@xxxxxxxxxxxxxx> wrote:
> Configure GPIO interrupt as input mode. Also if the bootloader sets
> gpio interrupt pin as function, override it as gpio.
>
> Signed-off-by: Biju Das <biju.das.jz@xxxxxxxxxxxxxx>

Thanks for your patch!

> --- a/drivers/pinctrl/renesas/pinctrl-rzg2l.c
> +++ b/drivers/pinctrl/renesas/pinctrl-rzg2l.c
> @@ -1580,6 +1580,26 @@ static const struct irq_chip rzg2l_gpio_irqchip = {
>         GPIOCHIP_IRQ_RESOURCE_HELPERS,
>  };
>
> +static int rzg2l_gpio_interrupt_input_mode(struct gpio_chip *chip, unsigned int offset)
> +{
> +       struct rzg2l_pinctrl *pctrl = gpiochip_get_data(chip);
> +       const struct pinctrl_pin_desc *pin_desc = &pctrl->desc.pins[offset];
> +       u32 *pin_data = pin_desc->drv_data;
> +       u32 off = RZG2L_PIN_CFG_TO_PORT_OFFSET(*pin_data);
> +       u8 bit = RZG2L_PIN_ID_TO_PIN(offset);
> +       u8 reg8;
> +       int ret;
> +
> +       reg8 = readb(pctrl->base + PMC(off));
> +       if (reg8 & BIT(bit)) {
> +               ret = rzg2l_gpio_request(chip, offset);

Who is taking care of calling pinctrl_gpio_free() when the interrupt
has been freed?

> +               if (ret)
> +                       return ret;
> +       }
> +
> +       return rzg2l_gpio_direction_input(chip, offset);
> +}
> +
>  static int rzg2l_gpio_child_to_parent_hwirq(struct gpio_chip *gc,
>                                             unsigned int child,
>                                             unsigned int child_type,
> @@ -1589,11 +1609,16 @@ static int rzg2l_gpio_child_to_parent_hwirq(struct gpio_chip *gc,
>         struct rzg2l_pinctrl *pctrl = gpiochip_get_data(gc);
>         unsigned long flags;
>         int gpioint, irq;
> +       int ret;
>
>         gpioint = rzg2l_gpio_get_gpioint(child, pctrl->data);
>         if (gpioint < 0)
>                 return gpioint;
>
> +       ret = rzg2l_gpio_interrupt_input_mode(gc, child);
> +       if (ret)
> +               return ret;
> +
>         spin_lock_irqsave(&pctrl->bitmap_lock, flags);
>         irq = bitmap_find_free_region(pctrl->tint_slot, RZG2L_TINT_MAX_INTERRUPT, get_order(1));
>         spin_unlock_irqrestore(&pctrl->bitmap_lock, flags);

TBH, it's not very clear to me how this is used...
I assume this is called as girq->child_to_parent_hwirq() from
gpiochip_hierarchy_irq_domain_alloc()?
Is that done from request_irq(), or at interrupt controller
initialization time?

Thanks!

Gr{oetje,eeting}s,

                        Geert


--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@xxxxxxxxxxxxxx

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds



[Index of Archives]     [Linux SPI]     [Linux Kernel]     [Linux ARM (vger)]     [Linux ARM MSM]     [Linux Omap]     [Linux Arm]     [Linux Tegra]     [Fedora ARM]     [Linux for Samsung SOC]     [eCos]     [Linux Fastboot]     [Gcc Help]     [Git]     [DCCP]     [IETF Announce]     [Security]     [Linux MIPS]     [Yosemite Campsites]

  Powered by Linux