pinctrl: sh-pfc: checker: Add function GPIO checks
authorGeert Uytterhoeven <geert+renesas@glider.be>
Fri, 10 Jan 2020 13:19:27 +0000 (14:19 +0100)
committerGeert Uytterhoeven <geert+renesas@glider.be>
Fri, 21 Feb 2020 12:57:44 +0000 (13:57 +0100)
Add checks for legacy function GPIO descriptors:
  1. Function GPIOs must have a name,
  2. Names must be unique,
  3. Enum ID values must be unique.

This exposes bugs like those fixed in
  - commit 884caadad128efad ("pinctrl: sh-pfc: sh7734: Fix duplicate
    TCLK1_B"),
  - commit 55b1cb1f03ad5eea ("pinctrl: sh-pfc: sh7264: Fix CAN function
    GPIOs"),
  - commit 02aeb2f21530c98f ("pinctrl: sh-pfc: sh7269: Fix CAN function
    GPIOs"),
  - commit db9c07272c8245a2 ("sh: sh7264: Remove bogus SSU GPIO function
    definitions"),
  - commit b4fba344a2930769 ("sh: sh7269: Remove bogus SSU GPIO function
    definitions").

Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Link: https://lore.kernel.org/r/20200110131927.1029-14-geert+renesas@glider.be
drivers/pinctrl/sh-pfc/core.c

index da2baa9..a2e19ef 100644 (file)
@@ -1012,6 +1012,26 @@ static void __init sh_pfc_check_info(const struct sh_pfc_soc_info *info)
                                       info->data_regs[i].enum_ids,
                                       info->data_regs[i].reg_width);
        }
+
+#ifdef CONFIG_PINCTRL_SH_FUNC_GPIO
+       /* Check function GPIOs */
+       for (i = 0; i < info->nr_func_gpios; i++) {
+               const struct pinmux_func *func = &info->func_gpios[i];
+
+               if (!func->name) {
+                       sh_pfc_err("empty function gpio %u\n", i);
+                       continue;
+               }
+               for (j = 0; j < i; j++) {
+                       if (same_name(func->name, info->func_gpios[j].name))
+                               sh_pfc_err("func_gpio %s: name conflict\n",
+                                          func->name);
+               }
+               if (sh_pfc_check_enum(drvname, func->enum_id))
+                       sh_pfc_err("%s enum_id %u conflict\n", func->name,
+                                  func->enum_id);
+       }
+#endif
 }
 
 static void __init sh_pfc_check_driver(const struct platform_driver *pdrv)