diff options
author | Geert Uytterhoeven <geert+renesas@glider.be> | 2019-04-25 10:33:55 +0200 |
---|---|---|
committer | Geert Uytterhoeven <geert+renesas@glider.be> | 2019-05-21 11:07:29 +0200 |
commit | 3dd5fd79f07103f7cda30567f8bf85a854796dd6 (patch) | |
tree | c2d8fb208ff3af96163c6d4c142e966879236297 /drivers/pinctrl | |
parent | 80cde64f68ff09617f89e78dfadf5a6873be87a8 (diff) | |
download | linux-3dd5fd79f07103f7cda30567f8bf85a854796dd6.tar.gz linux-3dd5fd79f07103f7cda30567f8bf85a854796dd6.tar.bz2 linux-3dd5fd79f07103f7cda30567f8bf85a854796dd6.zip |
pinctrl: sh-pfc: Add check for empty pinmux groups/functions
The pinmux groups and functions arrays may contain two parts, to ease
supporting SoCs that expose pin subsets of other related SoCs. Both
parts need to be declared with explicit sizes, which thus need to be
updated when adding support for more groups and functions.
If a size is too small, the compiler will detect this at build time
("excess elements in array initializer").
If a size is too large, this may go undetected (for pin groups), lead to
pin controller registration failures (for pin functions: "pinmux ops has
no name for functionN"), or crash the optional run-time debug code (for
pin groups).
Extend the run-time debug code with checks to detect this, to help
catching bugs early.
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Simon Horman <horms+renesas@verge.net.au>
Diffstat (limited to 'drivers/pinctrl')
-rw-r--r-- | drivers/pinctrl/sh-pfc/core.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/drivers/pinctrl/sh-pfc/core.c b/drivers/pinctrl/sh-pfc/core.c index 3507bab78eed..b4ba98156485 100644 --- a/drivers/pinctrl/sh-pfc/core.c +++ b/drivers/pinctrl/sh-pfc/core.c @@ -780,9 +780,15 @@ static void __init sh_pfc_check_info(const struct sh_pfc_soc_info *info) for (i = 0; i < info->nr_functions; i++) { func = &info->functions[i]; + if (!func->name) { + pr_err("%s: empty function %u\n", drvname, i); + sh_pfc_errors++; + continue; + } for (j = 0; j < func->nr_groups; j++) { for (k = 0; k < info->nr_groups; k++) { - if (!strcmp(func->groups[j], + if (info->groups[k].name && + !strcmp(func->groups[j], info->groups[k].name)) { refcnts[k]++; break; @@ -798,6 +804,11 @@ static void __init sh_pfc_check_info(const struct sh_pfc_soc_info *info) } for (i = 0; i < info->nr_groups; i++) { + if (!info->groups[i].name) { + pr_err("%s: empty group %u\n", drvname, i); + sh_pfc_errors++; + continue; + } if (!refcnts[i]) { pr_err("%s: orphan group %s\n", drvname, info->groups[i].name); |