#include <linux/device.h>
 #include <linux/err.h>
+#include <linux/fwnode.h>
 #include <linux/init.h>
 #include <linux/module.h>
 #include <linux/slab.h>
 define_dev_printk_level(_dev_info, KERN_INFO);
 
 #endif
+
+static inline bool fwnode_is_primary(struct fwnode_handle *fwnode)
+{
+       return fwnode && !IS_ERR(fwnode->secondary);
+}
+
+/**
+ * set_primary_fwnode - Change the primary firmware node of a given device.
+ * @dev: Device to handle.
+ * @fwnode: New primary firmware node of the device.
+ *
+ * Set the device's firmware node pointer to @fwnode, but if a secondary
+ * firmware node of the device is present, preserve it.
+ */
+void set_primary_fwnode(struct device *dev, struct fwnode_handle *fwnode)
+{
+       if (fwnode) {
+               struct fwnode_handle *fn = dev->fwnode;
+
+               if (fwnode_is_primary(fn))
+                       fn = fn->secondary;
+
+               fwnode->secondary = fn;
+               dev->fwnode = fwnode;
+       } else {
+               dev->fwnode = fwnode_is_primary(dev->fwnode) ?
+                       dev->fwnode->secondary : NULL;
+       }
+}
+EXPORT_SYMBOL_GPL(set_primary_fwnode);
+
+/**
+ * set_secondary_fwnode - Change the secondary firmware node of a given device.
+ * @dev: Device to handle.
+ * @fwnode: New secondary firmware node of the device.
+ *
+ * If a primary firmware node of the device is present, set its secondary
+ * pointer to @fwnode.  Otherwise, set the device's firmware node pointer to
+ * @fwnode.
+ */
+void set_secondary_fwnode(struct device *dev, struct fwnode_handle *fwnode)
+{
+       if (fwnode)
+               fwnode->secondary = ERR_PTR(-ENODEV);
+
+       if (fwnode_is_primary(dev->fwnode))
+               dev->fwnode->secondary = fwnode;
+       else
+               dev->fwnode = fwnode;
+}
 
 }
 
 #define ACPI_COMPANION(dev)            acpi_node((dev)->fwnode)
-#define ACPI_COMPANION_SET(dev, adev)  (dev)->fwnode = (adev) ? \
-       acpi_fwnode_handle(adev) : NULL
+#define ACPI_COMPANION_SET(dev, adev)  set_primary_fwnode(dev, (adev) ? \
+       acpi_fwnode_handle(adev) : NULL)
 #define ACPI_HANDLE(dev)               acpi_device_handle(ACPI_COMPANION(dev))
 
 static inline bool has_acpi_companion(struct device *dev)
 
 extern int lock_device_hotplug_sysfs(void);
 extern int device_offline(struct device *dev);
 extern int device_online(struct device *dev);
+extern void set_primary_fwnode(struct device *dev, struct fwnode_handle *fwnode);
+extern void set_secondary_fwnode(struct device *dev, struct fwnode_handle *fwnode);
+
 /*
  * Root device objects for grouping under /sys/devices
  */