scripts/genpinctrl: Add generation of additional functions

For non-F1 series:
Add generation of additional functions by inferring mode based
on AF detection instead of the mode value filed in config file.
This allows to detect that a signal should use 'analog' mode
when no AF function is associated to it.

Signed-off-by: Erwan Gouriou <erwan.gouriou@linaro.org>
diff --git a/scripts/genpinctrl/genpinctrl.py b/scripts/genpinctrl/genpinctrl.py
index 5bef796..1b48a03 100644
--- a/scripts/genpinctrl/genpinctrl.py
+++ b/scripts/genpinctrl/genpinctrl.py
@@ -80,15 +80,15 @@
     if not entry.get("match"):
         raise ValueError(f"Missing entry match for {entry['name']}")
 
-    if not entry.get("mode"):
-        raise ValueError(f"Missing entry mode for {entry['name']}")
-
     if family == "STM32F1":
+        if not entry.get("mode"):
+            raise ValueError(f"Missing entry mode for {entry['name']}")
         if entry["mode"] not in ("analog", "input", "alternate"):
             raise ValueError(f"Invalid mode for {entry['name']}: {entry['mode']}")
     else:
-        if entry["mode"] not in ("analog", "alternate"):
-            raise ValueError(f"Invalid mode for {entry['name']}: {entry['mode']}")
+        if entry.get("mode"):
+            if entry["mode"] not in ("analog", "alternate"):
+                raise ValueError(f"Invalid mode for {entry['name']}: {entry['mode']}")
 
     if entry.get("bias"):
         if entry["bias"] not in ("disable", "pull-up", "pull-down"):
@@ -418,11 +418,7 @@
                 if signal_name is None:
                     continue
 
-                if re.match(r"^ADC(?:\d+)?_IN[NP]?\d+$", signal_name) or re.match(
-                    r"^DAC(?:\d+)?_OUT\d+$", signal_name
-                ):
-                    found_afs = [None]
-                elif signal_name in pin_afs:
+                if signal_name in pin_afs:
                     pin_af = pin_afs[signal_name]
                     if not isinstance(pin_af, list):
                         pin_af = [pin_af]
@@ -430,8 +426,9 @@
                 # STM32F1: assume NO_REMAP (af=0) if signal is not listed in pin_afs
                 elif family == "STM32F1":
                     found_afs = [0]
+                # Non STM32F1: No alternate function found, mode is analog
                 else:
-                    continue
+                    found_afs = [None]
 
                 for af in found_afs:
                     pin_signals.append({"name": signal_name, "af": af})
@@ -507,13 +504,24 @@
                         if af["name"] not in entries:
                             entries[af["name"]] = list()
 
+                        # Define the signal mode using, by priority order:
+                        # 1- the config mode (ie: "af["mode"]")
+                        # 2- the inferred mode (an alternate function was found)
+                        if af.get("mode") or family == "STM32F1":
+                            signal["mode"] = af["mode"]
+                        else:
+                            if signal["af"] is not None:
+                                signal["mode"] = "alternate"
+                            else:
+                                signal["mode"] = "analog"
+
                         entries[af["name"]].append(
                             {
                                 "port": pin["port"],
                                 "pin": pin["pin"],
                                 "signal": signal["name"].lower(),
                                 "af": signal["af"],
-                                "mode": af["mode"],
+                                "mode": signal["mode"],
                                 "drive": af.get("drive"),
                                 "bias": af.get("bias"),
                                 "slew-rate": af.get("slew-rate"),