dm: pinctrl: Avoid race condition on probe for UCLASS_PINCTRL
authorPatrice Chotard <patrice.chotard@st.com>
Mon, 25 Feb 2019 12:39:55 +0000 (13:39 +0100)
committerSimon Glass <sjg@chromium.org>
Fri, 12 Apr 2019 02:10:05 +0000 (20:10 -0600)
In case of system with several pin-controller device, probe the first
UCLASS_PINCTRL by seq number (defined by alias) to avoid race condition
with I2C PINCONTROL driver for GPIO expander (GPIO expander need I2C bus,
I2C driver need PINCONFIG).

Signed-off-by: Patrick DELAUNAY <patrick.delaunay@st.com>
Signed-off-by: Patrice Chotard <patrice.chotard@st.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
drivers/pinctrl/pinctrl-uclass.c

index 6db0445067079dcb2bdc986d7a1b6cd49710da98..4e6cef8ae762f4a3382dc29910109b84514c4fc0 100644 (file)
@@ -179,11 +179,14 @@ static int pinctrl_select_state_simple(struct udevice *dev)
        int ret;
 
        /*
-        * For simplicity, assume the first device of PINCTRL uclass
-        * is the correct one.  This is most likely OK as there is
-        * usually only one pinctrl device on the system.
+        * For most system, there is only one pincontroller device. But in
+        * case of multiple pincontroller devices, probe the one with sequence
+        * number 0 (defined by alias) to avoid race condition.
         */
-       ret = uclass_get_device(UCLASS_PINCTRL, 0, &pctldev);
+       ret = uclass_get_device_by_seq(UCLASS_PINCTRL, 0, &pctldev);
+       if (ret)
+               /* if not found, get the first one */
+               ret = uclass_get_device(UCLASS_PINCTRL, 0, &pctldev);
        if (ret)
                return ret;