[PATCH 1/2] pinctrl: exynos: bind GPIO driver along with pinctrl

Kaustabh Chakraborty kauschluss at disroot.org
Fri Oct 17 17:27:40 CEST 2025


The devicetree of Samsung devices typically have the pin controller and
GPIO bank descriptors under the same pinctrl node. In U-Boot, these are
handled by two separate drivers. It is not possible to invoke both
drivers from a single node compatible.

Bind the GPIO driver on pinctrl driver bind, with the same OF node as
the pinctrl driver. This solution is already being used in other pinctrl
drivers. The hierarchy, as represented in `dm tree`, is as follows:

  pinctrl at 13750000
  |-- gpio-banks
  |   |-- gpr0-gpio-bank
  |   |-- gpr1-gpio-bank
  |   |-- gpr2-gpio-bank
  |   |-- gpr3-gpio-bank
  |   `-- gpr4-gpio-bank
  |-- sd0-bus-width1-pins
  |-- sd0-bus-width4-pins
  |-- sd0-bus-width8-pins
  `-- sd0-clk-pins

Since a bind function doesn't exist, create and add it to all pinctrl
drivers.

Signed-off-by: Kaustabh Chakraborty <kauschluss at disroot.org>
---
 drivers/pinctrl/exynos/pinctrl-exynos.c     | 11 +++++++++++
 drivers/pinctrl/exynos/pinctrl-exynos.h     |  1 +
 drivers/pinctrl/exynos/pinctrl-exynos7420.c |  1 +
 drivers/pinctrl/exynos/pinctrl-exynos78x0.c |  1 +
 drivers/pinctrl/exynos/pinctrl-exynos850.c  |  1 +
 5 files changed, 15 insertions(+)

diff --git a/drivers/pinctrl/exynos/pinctrl-exynos.c b/drivers/pinctrl/exynos/pinctrl-exynos.c
index b37282fa9d6734b7c5b547930d05b5b65d5aa4e3..4c06b41c7aa102775fa6043dac1182626291a7ee 100644
--- a/drivers/pinctrl/exynos/pinctrl-exynos.c
+++ b/drivers/pinctrl/exynos/pinctrl-exynos.c
@@ -7,6 +7,7 @@
 
 #include <log.h>
 #include <dm.h>
+#include <dm/lists.h>
 #include <errno.h>
 #include <asm/io.h>
 #include "pinctrl-exynos.h"
@@ -178,3 +179,13 @@ int exynos_pinctrl_probe(struct udevice *dev)
 
 	return 0;
 }
+
+int exynos_pinctrl_bind(struct udevice *dev)
+{
+	/*
+	 * Attempt to bind the Exynos GPIO driver. The GPIOs and
+	 * pin controller descriptors are found in the same OF node.
+	 */
+	return device_bind_driver_to_node(dev, "gpio_exynos", "gpio-banks",
+					  dev_ofnode(dev), NULL);
+}
diff --git a/drivers/pinctrl/exynos/pinctrl-exynos.h b/drivers/pinctrl/exynos/pinctrl-exynos.h
index da666777581e4de5adb6078d7acf5048bbff4041..73cc2ce4117b4254c376c8e1b56b3f310a4d9c72 100644
--- a/drivers/pinctrl/exynos/pinctrl-exynos.h
+++ b/drivers/pinctrl/exynos/pinctrl-exynos.h
@@ -97,5 +97,6 @@ void exynos_pinctrl_setup_peri(struct exynos_pinctrl_config_data *conf,
 int exynos_pinctrl_set_state(struct udevice *dev,
 		struct udevice *config);
 int exynos_pinctrl_probe(struct udevice *dev);
+int exynos_pinctrl_bind(struct udevice *dev);
 
 #endif /* __PINCTRL_EXYNOS_H_ */
diff --git a/drivers/pinctrl/exynos/pinctrl-exynos7420.c b/drivers/pinctrl/exynos/pinctrl-exynos7420.c
index 8fdf60715a53cd8fe18c65744af3a49023056aa1..b1d983fd383cbeb10295272b35b36c7d9971fcf7 100644
--- a/drivers/pinctrl/exynos/pinctrl-exynos7420.c
+++ b/drivers/pinctrl/exynos/pinctrl-exynos7420.c
@@ -114,4 +114,5 @@ U_BOOT_DRIVER(pinctrl_exynos7420) = {
 	.priv_auto	= sizeof(struct exynos_pinctrl_priv),
 	.ops		= &exynos7420_pinctrl_ops,
 	.probe		= exynos_pinctrl_probe,
+	.bind		= exynos_pinctrl_bind,
 };
diff --git a/drivers/pinctrl/exynos/pinctrl-exynos78x0.c b/drivers/pinctrl/exynos/pinctrl-exynos78x0.c
index 61b98443daf3d5d13f1004bcb8ec41707ef94c91..cc01028add123765f9c652e4be46967a20800295 100644
--- a/drivers/pinctrl/exynos/pinctrl-exynos78x0.c
+++ b/drivers/pinctrl/exynos/pinctrl-exynos78x0.c
@@ -115,4 +115,5 @@ U_BOOT_DRIVER(pinctrl_exynos78x0) = {
 	.priv_auto = sizeof(struct exynos_pinctrl_priv),
 	.ops		= &exynos78x0_pinctrl_ops,
 	.probe		= exynos_pinctrl_probe,
+	.bind		= exynos_pinctrl_bind,
 };
diff --git a/drivers/pinctrl/exynos/pinctrl-exynos850.c b/drivers/pinctrl/exynos/pinctrl-exynos850.c
index 3ec2636e0d878ced252c851ae622db046f246c9e..5bf09ae20ee526b7c221448d076697ca80195fcf 100644
--- a/drivers/pinctrl/exynos/pinctrl-exynos850.c
+++ b/drivers/pinctrl/exynos/pinctrl-exynos850.c
@@ -122,4 +122,5 @@ U_BOOT_DRIVER(pinctrl_exynos850) = {
 	.priv_auto	= sizeof(struct exynos_pinctrl_priv),
 	.ops		= &exynos850_pinctrl_ops,
 	.probe		= exynos_pinctrl_probe,
+	.bind		= exynos_pinctrl_bind,
 };

-- 
2.51.0



More information about the U-Boot mailing list