summaryrefslogtreecommitdiff
path: root/drivers/base
diff options
context:
space:
mode:
authorMika Westerberg <mika.westerberg@linux.intel.com>2015-11-30 18:11:39 +0300
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2015-12-07 04:29:23 +0300
commit55f89a8a4538803195395bdf347cbba51dcb1906 (patch)
tree01d0e0fe91ec053d4538dbeedaef7a900d0c1538 /drivers/base
parent00bbc1d8e46a92ce7bd80622cf4b09c3b727a741 (diff)
downloadlinux-55f89a8a4538803195395bdf347cbba51dcb1906.tar.xz
driver core: Do not overwrite secondary fwnode with NULL if it is set
If multiple devices share single firmware node like it is case with MFD devices, the same firmware node (ACPI) is assigned to all of them. The function also modifies the shared firmware node in order to preserve secondary firmware node of the device in question. If the new device which is sharing the firmware node does not have secondary node it will be NULL which will be assigned to the secondary node of the shared firmware node losing all built-in properties. Prevent this by setting the secondary firmware node only if the replacement is non-NULL. Print also warning if someone tries to overwrite secondary node that has already been assigned. Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers/base')
-rw-r--r--drivers/base/core.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/drivers/base/core.c b/drivers/base/core.c
index b7d56c5ea3c6..0a8bdade53f2 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -2261,7 +2261,10 @@ void set_primary_fwnode(struct device *dev, struct fwnode_handle *fwnode)
if (fwnode_is_primary(fn))
fn = fn->secondary;
- fwnode->secondary = fn;
+ if (fn) {
+ WARN_ON(fwnode->secondary);
+ fwnode->secondary = fn;
+ }
dev->fwnode = fwnode;
} else {
dev->fwnode = fwnode_is_primary(dev->fwnode) ?