summaryrefslogtreecommitdiffstats
path: root/target/linux/generic/backport-5.15/832-v6.8-of-device-Export-of_device_make_bus_id.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/generic/backport-5.15/832-v6.8-of-device-Export-of_device_make_bus_id.patch')
-rw-r--r--target/linux/generic/backport-5.15/832-v6.8-of-device-Export-of_device_make_bus_id.patch128
1 files changed, 128 insertions, 0 deletions
diff --git a/target/linux/generic/backport-5.15/832-v6.8-of-device-Export-of_device_make_bus_id.patch b/target/linux/generic/backport-5.15/832-v6.8-of-device-Export-of_device_make_bus_id.patch
new file mode 100644
index 0000000000..d097c1b0f4
--- /dev/null
+++ b/target/linux/generic/backport-5.15/832-v6.8-of-device-Export-of_device_make_bus_id.patch
@@ -0,0 +1,128 @@
+From 7f38b70042fcaa49219045bd1a9a2836e27a58ac Mon Sep 17 00:00:00 2001
+From: Miquel Raynal <miquel.raynal@bootlin.com>
+Date: Fri, 15 Dec 2023 11:15:27 +0000
+Subject: [PATCH] of: device: Export of_device_make_bus_id()
+
+This helper is really handy to create unique device names based on their
+device tree path, we may need it outside of the OF core (in the NVMEM
+subsystem) so let's export it. As this helper has nothing patform
+specific, let's move it to of/device.c instead of of/platform.c so we
+can add its prototype to of_device.h.
+
+Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
+Acked-by: Rob Herring <robh@kernel.org>
+Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
+Link: https://lore.kernel.org/r/20231215111536.316972-2-srinivas.kandagatla@linaro.org
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/of/device.c | 41 +++++++++++++++++++++++++++++++++++++++
+ drivers/of/platform.c | 40 --------------------------------------
+ include/linux/of_device.h | 6 ++++++
+ 3 files changed, 47 insertions(+), 40 deletions(-)
+
+--- a/drivers/of/device.c
++++ b/drivers/of/device.c
+@@ -337,3 +337,38 @@ int of_device_uevent_modalias(struct dev
+ return 0;
+ }
+ EXPORT_SYMBOL_GPL(of_device_uevent_modalias);
++
++/**
++ * of_device_make_bus_id - Use the device node data to assign a unique name
++ * @dev: pointer to device structure that is linked to a device tree node
++ *
++ * This routine will first try using the translated bus address to
++ * derive a unique name. If it cannot, then it will prepend names from
++ * parent nodes until a unique name can be derived.
++ */
++void of_device_make_bus_id(struct device *dev)
++{
++ struct device_node *node = dev->of_node;
++ const __be32 *reg;
++ u64 addr;
++
++ /* Construct the name, using parent nodes if necessary to ensure uniqueness */
++ while (node->parent) {
++ /*
++ * If the address can be translated, then that is as much
++ * uniqueness as we need. Make it the first component and return
++ */
++ reg = of_get_property(node, "reg", NULL);
++ if (reg && (addr = of_translate_address(node, reg)) != OF_BAD_ADDR) {
++ dev_set_name(dev, dev_name(dev) ? "%llx.%pOFn:%s" : "%llx.%pOFn",
++ addr, node, dev_name(dev));
++ return;
++ }
++
++ /* format arguments only used if dev_name() resolves to NULL */
++ dev_set_name(dev, dev_name(dev) ? "%s:%s" : "%s",
++ kbasename(node->full_name), dev_name(dev));
++ node = node->parent;
++ }
++}
++EXPORT_SYMBOL_GPL(of_device_make_bus_id);
+--- a/drivers/of/platform.c
++++ b/drivers/of/platform.c
+@@ -64,40 +64,6 @@ EXPORT_SYMBOL(of_find_device_by_node);
+ */
+
+ /**
+- * of_device_make_bus_id - Use the device node data to assign a unique name
+- * @dev: pointer to device structure that is linked to a device tree node
+- *
+- * This routine will first try using the translated bus address to
+- * derive a unique name. If it cannot, then it will prepend names from
+- * parent nodes until a unique name can be derived.
+- */
+-static void of_device_make_bus_id(struct device *dev)
+-{
+- struct device_node *node = dev->of_node;
+- const __be32 *reg;
+- u64 addr;
+-
+- /* Construct the name, using parent nodes if necessary to ensure uniqueness */
+- while (node->parent) {
+- /*
+- * If the address can be translated, then that is as much
+- * uniqueness as we need. Make it the first component and return
+- */
+- reg = of_get_property(node, "reg", NULL);
+- if (reg && (addr = of_translate_address(node, reg)) != OF_BAD_ADDR) {
+- dev_set_name(dev, dev_name(dev) ? "%llx.%pOFn:%s" : "%llx.%pOFn",
+- addr, node, dev_name(dev));
+- return;
+- }
+-
+- /* format arguments only used if dev_name() resolves to NULL */
+- dev_set_name(dev, dev_name(dev) ? "%s:%s" : "%s",
+- kbasename(node->full_name), dev_name(dev));
+- node = node->parent;
+- }
+-}
+-
+-/**
+ * of_device_alloc - Allocate and initialize an of_device
+ * @np: device node to assign to device
+ * @bus_id: Name to assign to the device. May be null to use default name.
+--- a/include/linux/of_device.h
++++ b/include/linux/of_device.h
+@@ -56,6 +56,9 @@ static inline int of_dma_configure(struc
+ {
+ return of_dma_configure_id(dev, np, force_dma, NULL);
+ }
++
++void of_device_make_bus_id(struct device *dev);
++
+ #else /* CONFIG_OF */
+
+ static inline int of_driver_match_device(struct device *dev,
+@@ -113,6 +116,9 @@ static inline int of_dma_configure(struc
+ {
+ return 0;
+ }
++
++static inline void of_device_make_bus_id(struct device *dev) {}
++
+ #endif /* CONFIG_OF */
+
+ #endif /* _LINUX_OF_DEVICE_H */