diff options
author | Geert Uytterhoeven <geert+renesas@glider.be> | 2021-10-07 16:38:49 +0200 |
---|---|---|
committer | Geert Uytterhoeven <geert+renesas@glider.be> | 2021-10-15 09:48:00 +0200 |
commit | f31a5ffbd11d9886093a6531e5a6d60e0605ce30 (patch) | |
tree | 6a4a6e71d5cd604a15e11156f359bf3d5a73fcfa /drivers/pinctrl | |
parent | e212923e74076f423555947eff6f14355487cd21 (diff) | |
download | linux-f31a5ffbd11d9886093a6531e5a6d60e0605ce30.tar.gz linux-f31a5ffbd11d9886093a6531e5a6d60e0605ce30.tar.bz2 linux-f31a5ffbd11d9886093a6531e5a6d60e0605ce30.zip |
pinctrl: renesas: checker: Fix bias checks on SoCs with pull-down only pins
If some bits in a pin Pull-Up control register (PUPR) control pin
pull-down instead of pin pull-up, there are two pinmux_bias_reg entries:
a first one with the puen field filled in, listing pins with pull-up
functionality, and a second one with the pud field filled in, listing
pins with pull-down functionality. On encountering the second entry,
where puen is NULL, the for-loop terminates early, causing the remaining
bias registers not to be checked. In addition, sh_pfc_check_bias_reg()
does not handle such entries.
Fix this by treating pinmux_bias_reg.puen and pinmux_bias_reg.pud the
same.
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Link: https://lore.kernel.org/r/29526d06fa223cffd785cdb264b756a202b11cea.1633615652.git.geert+renesas@glider.be
Diffstat (limited to 'drivers/pinctrl')
-rw-r--r-- | drivers/pinctrl/renesas/core.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/drivers/pinctrl/renesas/core.c b/drivers/pinctrl/renesas/core.c index ab8bdb81e8df..9d791a5a5f95 100644 --- a/drivers/pinctrl/renesas/core.c +++ b/drivers/pinctrl/renesas/core.c @@ -919,7 +919,8 @@ static void __init sh_pfc_check_bias_reg(const struct sh_pfc_soc_info *info, if (bias->pins[i] != SH_PFC_PIN_NONE) bits |= BIT(i); - sh_pfc_check_reg(info->name, bias->puen, bits); + if (bias->puen) + sh_pfc_check_reg(info->name, bias->puen, bits); if (bias->pud) sh_pfc_check_reg(info->name, bias->pud, bits); for (i = 0; i < ARRAY_SIZE(bias->pins); i++) @@ -928,6 +929,7 @@ static void __init sh_pfc_check_bias_reg(const struct sh_pfc_soc_info *info, static void __init sh_pfc_check_info(const struct sh_pfc_soc_info *info) { + const struct pinmux_bias_reg *bias_regs = info->bias_regs; const char *drvname = info->name; unsigned int *refcnts; unsigned int i, j, k; @@ -1024,8 +1026,8 @@ static void __init sh_pfc_check_info(const struct sh_pfc_soc_info *info) sh_pfc_check_drive_reg(info, &info->drive_regs[i]); /* Check bias registers */ - for (i = 0; info->bias_regs && info->bias_regs[i].puen; i++) - sh_pfc_check_bias_reg(info, &info->bias_regs[i]); + for (i = 0; bias_regs && (bias_regs[i].puen || bias_regs[i].pud); i++) + sh_pfc_check_bias_reg(info, &bias_regs[i]); /* Check ioctrl registers */ for (i = 0; info->ioctrl_regs && info->ioctrl_regs[i].reg; i++) |