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@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 <[email protected]>
---
 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

Reply via email to