mirror of
https://github.com/Ysurac/openmptcprouter.git
synced 2025-02-15 04:42:02 +00:00
147 lines
4.9 KiB
Diff
147 lines
4.9 KiB
Diff
From 8bff48328aff10c1e9c134a55337620929e449c2 Mon Sep 17 00:00:00 2001
|
|
From: Frank Rowand <frank.rowand@sony.com>
|
|
Date: Fri, 12 Oct 2018 19:21:16 -0700
|
|
Subject: [PATCH 519/520] of: overlay: set node fields from properties when add
|
|
new overlay node
|
|
|
|
commit f96278810150fc39085d1872e5b39ea06366d03e upstream.
|
|
See: https://github.com/raspberrypi/linux/issues/2995
|
|
|
|
Overlay nodes added by add_changeset_node() do not have the node
|
|
fields name, phandle, and type set.
|
|
|
|
The node passed to __of_attach_node() when the add node changeset
|
|
entry is processed does not contain any properties. The node's
|
|
properties are located in add property changeset entries that will
|
|
be processed after the add node changeset is applied.
|
|
|
|
Set the node's fields in the node contained in the add node
|
|
changeset entry and do not set them to incorrect values in
|
|
add_changeset_node().
|
|
|
|
A visible symptom that is fixed by this patch is the names of nodes
|
|
added by overlays that have an entry in /sys/bus/platform/drivers/*/
|
|
will contain the unit-address but the node-name will be <NULL>, for
|
|
example, "fc4ab000.<NULL>". After applying the patch the name, in
|
|
this example, for node restart@fc4ab000 is "fc4ab000.restart".
|
|
|
|
Tested-by: Alan Tull <atull@kernel.org>
|
|
Signed-off-by: Frank Rowand <frank.rowand@sony.com>
|
|
---
|
|
drivers/of/dynamic.c | 27 ++++++++++++++++++---------
|
|
drivers/of/overlay.c | 34 +++++++++++++++++++++++++++-------
|
|
2 files changed, 45 insertions(+), 16 deletions(-)
|
|
|
|
diff --git a/drivers/of/dynamic.c b/drivers/of/dynamic.c
|
|
index 45c0b1f4cb69..a09c1c3cf831 100644
|
|
--- a/drivers/of/dynamic.c
|
|
+++ b/drivers/of/dynamic.c
|
|
@@ -205,15 +205,24 @@ static void __of_attach_node(struct device_node *np)
|
|
const __be32 *phandle;
|
|
int sz;
|
|
|
|
- np->name = __of_get_property(np, "name", NULL) ? : "<NULL>";
|
|
- np->type = __of_get_property(np, "device_type", NULL) ? : "<NULL>";
|
|
-
|
|
- phandle = __of_get_property(np, "phandle", &sz);
|
|
- if (!phandle)
|
|
- phandle = __of_get_property(np, "linux,phandle", &sz);
|
|
- if (IS_ENABLED(CONFIG_PPC_PSERIES) && !phandle)
|
|
- phandle = __of_get_property(np, "ibm,phandle", &sz);
|
|
- np->phandle = (phandle && (sz >= 4)) ? be32_to_cpup(phandle) : 0;
|
|
+ if (!of_node_check_flag(np, OF_OVERLAY)) {
|
|
+ np->name = __of_get_property(np, "name", NULL);
|
|
+ np->type = __of_get_property(np, "device_type", NULL);
|
|
+ if (!np->name)
|
|
+ np->name = "<NULL>";
|
|
+ if (!np->type)
|
|
+ np->type = "<NULL>";
|
|
+
|
|
+ phandle = __of_get_property(np, "phandle", &sz);
|
|
+ if (!phandle)
|
|
+ phandle = __of_get_property(np, "linux,phandle", &sz);
|
|
+ if (IS_ENABLED(CONFIG_PPC_PSERIES) && !phandle)
|
|
+ phandle = __of_get_property(np, "ibm,phandle", &sz);
|
|
+ if (phandle && (sz >= 4))
|
|
+ np->phandle = be32_to_cpup(phandle);
|
|
+ else
|
|
+ np->phandle = 0;
|
|
+ }
|
|
|
|
np->child = NULL;
|
|
np->sibling = np->parent->child;
|
|
diff --git a/drivers/of/overlay.c b/drivers/of/overlay.c
|
|
index 9808aae4621a..b2704badd987 100644
|
|
--- a/drivers/of/overlay.c
|
|
+++ b/drivers/of/overlay.c
|
|
@@ -301,10 +301,11 @@ static int add_changeset_property(struct overlay_changeset *ovcs,
|
|
struct property *new_prop = NULL, *prop;
|
|
int ret = 0;
|
|
|
|
- if (!of_prop_cmp(overlay_prop->name, "name") ||
|
|
- !of_prop_cmp(overlay_prop->name, "phandle") ||
|
|
- !of_prop_cmp(overlay_prop->name, "linux,phandle"))
|
|
- return 0;
|
|
+ if (target->in_livetree)
|
|
+ if (!of_prop_cmp(overlay_prop->name, "name") ||
|
|
+ !of_prop_cmp(overlay_prop->name, "phandle") ||
|
|
+ !of_prop_cmp(overlay_prop->name, "linux,phandle"))
|
|
+ return 0;
|
|
|
|
if (target->in_livetree)
|
|
prop = of_find_property(target->np, overlay_prop->name, NULL);
|
|
@@ -322,12 +323,17 @@ static int add_changeset_property(struct overlay_changeset *ovcs,
|
|
if (!new_prop)
|
|
return -ENOMEM;
|
|
|
|
- if (!prop)
|
|
+ if (!prop) {
|
|
+ if (!target->in_livetree) {
|
|
+ new_prop->next = target->np->deadprops;
|
|
+ target->np->deadprops = new_prop;
|
|
+ }
|
|
ret = of_changeset_add_property(&ovcs->cset, target->np,
|
|
new_prop);
|
|
- else
|
|
+ } else {
|
|
ret = of_changeset_update_property(&ovcs->cset, target->np,
|
|
new_prop);
|
|
+ }
|
|
|
|
if (ret) {
|
|
kfree(new_prop->name);
|
|
@@ -382,9 +388,10 @@ static int add_changeset_node(struct overlay_changeset *ovcs,
|
|
struct target *target, struct device_node *node)
|
|
{
|
|
const char *node_kbasename;
|
|
+ const __be32 *phandle;
|
|
struct device_node *tchild;
|
|
struct target target_child;
|
|
- int ret = 0;
|
|
+ int ret = 0, size;
|
|
|
|
node_kbasename = kbasename(node->full_name);
|
|
|
|
@@ -398,6 +405,19 @@ static int add_changeset_node(struct overlay_changeset *ovcs,
|
|
return -ENOMEM;
|
|
|
|
tchild->parent = target->np;
|
|
+ tchild->name = __of_get_property(node, "name", NULL);
|
|
+ tchild->type = __of_get_property(node, "device_type", NULL);
|
|
+
|
|
+ if (!tchild->name)
|
|
+ tchild->name = "<NULL>";
|
|
+ if (!tchild->type)
|
|
+ tchild->type = "<NULL>";
|
|
+
|
|
+ /* ignore obsolete "linux,phandle" */
|
|
+ phandle = __of_get_property(node, "phandle", &size);
|
|
+ if (phandle && (size == 4))
|
|
+ tchild->phandle = be32_to_cpup(phandle);
|
|
+
|
|
of_node_set_flag(tchild, OF_OVERLAY);
|
|
|
|
ret = of_changeset_attach_node(&ovcs->cset, tchild);
|
|
--
|
|
2.19.1
|
|
|