[U-Boot] [PATCH v1 0/2] Update pinctrl-uclass

This series adds: - For system with multiple pincontroller device, insure probe order to avoid race condition using sequence number (alias) - Avoid to bind child node with gpio-controller properties.
Patrice Chotard (1): dm: pinctrl: Avoid race condition on probe for UCLASS_PINCTRL
Patrick Delaunay (1): dm: pinctrl: Skip gpio-controller node in pinconfig_post_bind()
drivers/pinctrl/pinctrl-uclass.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-)

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 ---
drivers/pinctrl/pinctrl-uclass.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
diff --git a/drivers/pinctrl/pinctrl-uclass.c b/drivers/pinctrl/pinctrl-uclass.c index 0e3260afd1ee..abb622cfe79e 100644 --- a/drivers/pinctrl/pinctrl-uclass.c +++ b/drivers/pinctrl/pinctrl-uclass.c @@ -201,11 +201,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;

On Fri, 15 Feb 2019 at 15:31, Patrice Chotard patrice.chotard@st.com wrote:
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
drivers/pinctrl/pinctrl-uclass.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
Reviewed-by: Simon Glass sjg@chromium.org

From: Patrick Delaunay patrick.delaunay@st.com
Some binding define child node gpio-controller without compatible property. This patch avoid to bind the pinconfig uclass to these node.
Signed-off-by: Patrick Delaunay patrick.delaunay@st.com Signed-off-by: Patrice Chotard patrice.chotard@st.com ---
drivers/pinctrl/pinctrl-uclass.c | 3 +++ 1 file changed, 3 insertions(+)
diff --git a/drivers/pinctrl/pinctrl-uclass.c b/drivers/pinctrl/pinctrl-uclass.c index abb622cfe79e..9df06a262cd5 100644 --- a/drivers/pinctrl/pinctrl-uclass.c +++ b/drivers/pinctrl/pinctrl-uclass.c @@ -149,6 +149,9 @@ static int pinconfig_post_bind(struct udevice *dev) ofnode_get_property(node, "compatible", &ret); if (ret >= 0) continue; + /* If this node has "gpio-controller" property, skip */ + if (ofnode_read_bool(node, "gpio-controller")) + continue;
if (ret != -FDT_ERR_NOTFOUND) return ret;

On Fri, 15 Feb 2019 at 15:31, Patrice Chotard patrice.chotard@st.com wrote:
From: Patrick Delaunay patrick.delaunay@st.com
Some binding define child node gpio-controller without compatible property. This patch avoid to bind the pinconfig uclass to these node.
Some bindings define a child node gpio-controller without a compatible property. Avoid binding the pinconfig uclass to these node since ...(add explanation here)
Signed-off-by: Patrick Delaunay patrick.delaunay@st.com Signed-off-by: Patrice Chotard patrice.chotard@st.com
drivers/pinctrl/pinctrl-uclass.c | 3 +++ 1 file changed, 3 insertions(+)
Reviewed-by: Simon Glass sjg@chromium.org
diff --git a/drivers/pinctrl/pinctrl-uclass.c b/drivers/pinctrl/pinctrl-uclass.c index abb622cfe79e..9df06a262cd5 100644 --- a/drivers/pinctrl/pinctrl-uclass.c +++ b/drivers/pinctrl/pinctrl-uclass.c @@ -149,6 +149,9 @@ static int pinconfig_post_bind(struct udevice *dev) ofnode_get_property(node, "compatible", &ret); if (ret >= 0) continue;
/* If this node has "gpio-controller" property, skip */
if (ofnode_read_bool(node, "gpio-controller"))
continue; if (ret != -FDT_ERR_NOTFOUND) return ret;
-- 1.9.1

Hi,
From: Simon Glass sjg@chromium.org Sent: vendredi 15 février 2019 18:12
On Fri, 15 Feb 2019 at 15:31, Patrice Chotard patrice.chotard@st.com wrote:
From: Patrick Delaunay patrick.delaunay@st.com
Some binding define child node gpio-controller without compatible property. This patch avoid to bind the pinconfig uclass to these node.
Some bindings define a child node gpio-controller without a compatible property. Avoid binding the pinconfig uclass to these node since ...(add explanation here)
Ok , we will add more explanation in v2.
For example, the binding for st,stm32-pinctrl (./device-tree-bindings/pinctrl/st,stm32-pinctrl.txt) defines the GPIO controller/bank node as sub-node of pincontrol (for example st,stm32f429-pinctrl) but without compatible (as it is not mandatory).
Without the added check, the gpio node with " gpio-controller" parameter is bounded as pinconfig. This patch remove the need to add a compatible in u-boot device tree.
As example ./arch/arm/dts/stm32f429-disco-u-boot.dtsi
&gpioa { compatible = "st,stm32-gpio"; u-boot,dm-pre-reloc; };
&gpiob { compatible = "st,stm32-gpio"; u-boot,dm-pre-reloc; }; ....
&gpiok { compatible = "st,stm32-gpio"; u-boot,dm-pre-reloc; };
PS: today "st,stm32-gpio" is still needing to bind the driver drivers/gpio/stm32f7_gpio.c To gpio-controller node... But we are expecting to remove this modification of kernel device tree by directly bind sub-node to UCLASS_GPIO "gpio_stm32" in pincontrol driver.
static int stm32_pinctrl_bind(struct udevice *dev) { const void *blob = gd->fdt_blob; int offset = dev_of_offset(dev); const char *name; int ret;
for (offset = fdt_first_subnode(blob, offset); offset > 0; offset = fdt_next_subnode(blob, offset)) { fdt_get_property(blob, offset, "gpio-controller", &ret); if (ret < 0) continue; /* Get the name of each gpio node */ name = fdt_get_name(blob, offset, NULL); if (!name) return -EINVAL;
/* Bind each gpio node */ ret = device_bind_driver_to_node(dev, "stm32mp-gpio", name, offset, NULL); if (ret) return ret;
debug("%s: bind %s\n", __func__, name); }
return 0; }
Signed-off-by: Patrick Delaunay patrick.delaunay@st.com Signed-off-by: Patrice Chotard patrice.chotard@st.com
drivers/pinctrl/pinctrl-uclass.c | 3 +++ 1 file changed, 3 insertions(+)
Reviewed-by: Simon Glass sjg@chromium.org
diff --git a/drivers/pinctrl/pinctrl-uclass.c b/drivers/pinctrl/pinctrl-uclass.c index abb622cfe79e..9df06a262cd5 100644 --- a/drivers/pinctrl/pinctrl-uclass.c +++ b/drivers/pinctrl/pinctrl-uclass.c @@ -149,6 +149,9 @@ static int pinconfig_post_bind(struct udevice *dev) ofnode_get_property(node, "compatible", &ret); if (ret >= 0) continue;
/* If this node has "gpio-controller" property, skip */
if (ofnode_read_bool(node, "gpio-controller"))
continue; if (ret != -FDT_ERR_NOTFOUND) return ret;
-- 1.9.1
Patrick
participants (3)
-
Patrice Chotard
-
Patrick DELAUNAY
-
Simon Glass