[U-Boot] [PATCH 17/22] dm: gpio: Add live tree support
Simon Glass
sjg at chromium.org
Wed Jan 18 06:51:53 CET 2017
Add support for requesting GPIOs with a live device tree.
Signed-off-by: Simon Glass <sjg at chromium.org>
---
drivers/gpio/gpio-uclass.c | 44 ++++++++++++++++++++++++++++++++++++--------
1 file changed, 36 insertions(+), 8 deletions(-)
diff --git a/drivers/gpio/gpio-uclass.c b/drivers/gpio/gpio-uclass.c
index 721e95cd929..377729e3c62 100644
--- a/drivers/gpio/gpio-uclass.c
+++ b/drivers/gpio/gpio-uclass.c
@@ -11,6 +11,8 @@
#include <fdtdec.h>
#include <malloc.h>
#include <asm/gpio.h>
+#include <dm/of_access.h>
+#include <dm/of_dev.h>
#include <linux/bug.h>
#include <linux/ctype.h>
@@ -711,16 +713,42 @@ int gpio_request_by_name_nodev(const void *blob, int node,
flags, index > 0);
}
-int gpio_request_by_name(struct udevice *dev, const char *list_name, int index,
+static int _gpio_request_by_name(const struct device_node *np,
+ const char *list_name, int index,
+ struct gpio_desc *desc, int flags,
+ bool add_index)
+{
+ struct of_phandle_args of_args;
+ struct of_ref_phandle_args args;
+ int ret;
+
+ ret = of_parse_phandle_with_args(np, list_name, "#gpio-cells", index,
+ &of_args);
+ if (ret)
+ debug("%s: of_parse_phandle_with_args failed\n", __func__);
+ else
+ of_ref_from_of_phandle_args(&of_args, &args);
+
+ return gpio_request_tail(ret, of_node_to_ref(np), &args, list_name,
+ index, desc, flags, add_index);
+}
+
+int gpio_request_by_name(struct udevice *dev, const char *list_name, int index,
struct gpio_desc *desc, int flags)
{
- /*
- * This isn't ideal since we don't use dev->name in the debug()
- * calls in gpio_request_by_name(), but we can do this until
- * gpio_request_by_name_nodev() can be dropped.
- */
- return gpio_request_by_name_nodev(gd->fdt_blob, dev_of_offset(dev),
- list_name, index, desc, flags);
+ if (of_use_livetree()) {
+ return _gpio_request_by_name(dev_of_node(dev), list_name,
+ index, desc, flags, index > 0);
+ } else {
+ /*
+ * This isn't ideal since we don't use dev->name in the debug()
+ * calls in gpio_request_by_name(), but we can do this until
+ * gpio_request_by_name_nodev() can be dropped.
+ */
+ return gpio_request_by_name_nodev(gd->fdt_blob,
+ dev_of_offset(dev), list_name,
+ index, desc, flags);
+ }
}
int gpio_request_list_by_name_nodev(const void *blob, int node,
--
2.11.0.483.g087da7b7c-goog
More information about the U-Boot
mailing list