Hi Biju,
On 2025年8月17日 at 16:30, Biju <biju.das.au@xxxxxxxxx> wrote:
> From: Biju Das <biju.das.jz@xxxxxxxxxxxxxx>
>
> There is no need to reconfigure the pin if the pin's configuration values
> are same as the reset values. E.g.: PS0 pin configuration for NMI function
> is PMC = 1 and PFC = 0 and is same as that of reset values. Currently the
> code is first setting it to GPIO HI-Z state and then again reconfiguring
> to NMI function leading to spurious IRQ. Drop the unnecessary pin
> configurations from the driver.
>
> 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
> @@ -539,7 +539,11 @@ static void rzg2l_pinctrl_set_pfc_mode(struct rzg2l_pinctrl *pctrl,
> u8 pin, u8 off, u8 func)
> {
> unsigned long flags;
> - u32 reg;
> + u32 reg, pfc;
> +
> + pfc = readl(pctrl->base + PFC(off));
As the read value may be used later, shouldn't it be read while holding
the spinlock below?
> + if (((pfc >> (pin * 4)) & PFC_MASK) == func)
Please drop the second space before the == operator.
> + return;
What if the pin is currently configured for GPIO in the PMC register?
According to the documentation, that is even the initial state after reset.
>
> spin_lock_irqsave(&pctrl->lock, flags);
>
> @@ -555,9 +559,8 @@ static void rzg2l_pinctrl_set_pfc_mode(struct rzg2l_pinctrl *pctrl,
> writeb(reg & ~BIT(pin), pctrl->base + PMC(off));
>
> /* Select Pin function mode with PFC register */
> - reg = readl(pctrl->base + PFC(off));
> - reg &= ~(PFC_MASK << (pin * 4));
> - writel(reg | (func << (pin * 4)), pctrl->base + PFC(off));
> + pfc &= ~(PFC_MASK << (pin * 4));
> + writel(pfc | (func << (pin * 4)), pctrl->base + PFC(off));
>
> /* Switch to Peripheral pin function with PMC register */
> reg = readb(pctrl->base + PMC(off));
> @@ -3103,11 +3106,18 @@ static void rzg2l_pinctrl_pm_setup_pfc(struct rzg2l_pinctrl *pctrl)
> pm = readw(pctrl->base + PM(off));
> for_each_set_bit(pin, &pinmap, max_pin) {
> struct rzg2l_pinctrl_reg_cache *cache = pctrl->cache;
> + u32 pfc_val, pfc_mask;
>
> /* Nothing to do if PFC was not configured before. */
> if (!(cache->pmc[port] & BIT(pin)))
> continue;
>
> + pfc_val = readl(pctrl->base + PFC(off));
> + pfc_mask = PFC_MASK << (pin * 4);
> + /* Nothing to do if reset value of the pin is same as cached value */
> + if ((cache->pfc[port] & pfc_mask) == (pfc_val & pfc_mask))
> + continue;
What if the pin is currently configured for GPIO in the PMC register?
> +
> /* Set pin to 'Non-use (Hi-Z input protection)' */
> pm &= ~(PM_MASK << (pin * 2));
> writew(pm, pctrl->base + PM(off));
> @@ -3117,8 +3127,8 @@ static void rzg2l_pinctrl_pm_setup_pfc(struct rzg2l_pinctrl *pctrl)
> writeb(pmc, pctrl->base + PMC(off));
>
> /* Select Pin function mode. */
> - pfc &= ~(PFC_MASK << (pin * 4));
> - pfc |= (cache->pfc[port] & (PFC_MASK << (pin * 4)));
> + pfc &= ~pfc_mask;
> + pfc |= (cache->pfc[port] & pfc_mask);
> writel(pfc, pctrl->base + PFC(off));
>
> /* Switch to Peripheral pin function. */
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