aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>2015-04-03 23:23:37 +0200
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2015-04-03 23:23:37 +0200
commit97badf873ab60e841243b66133ff9eff2a46ef29 (patch)
tree3504372747c1610d89f5e3909667603beaf1a335 /include/linux
parentdriver core: Implement device property accessors through fwnode ones (diff)
downloadlinux-dev-97badf873ab60e841243b66133ff9eff2a46ef29.tar.xz
linux-dev-97badf873ab60e841243b66133ff9eff2a46ef29.zip
device property: Make it possible to use secondary firmware nodes
Add a secondary pointer to struct fwnode_handle so as to make it possible for a device to have two firmware nodes associated with it at the same time, for example, an ACPI node and a node with a set of properties provided by platform initialization code. In the future that will allow device property lookup to fall back from the primary firmware node to the secondary one if the given property is not present there to make it easier to provide defaults for device properties used by device drivers. Introduce two helper routines, set_primary_fwnode() and set_secondary_fwnode() allowing callers to add a primary/secondary firmware node to the given device in such a way that (1) If there's only one firmware node for that device, it will be pointed to by the device's firmware node pointer. (2) If both the primary and secondary firmware nodes are present, the primary one will be pointed to by the device's firmware node pointer, while the secondary one will be pointed to by the primary node's secondary pointer. (3) If one of these nodes is removed (by calling one of the new nelpers with NULL as the second argument), the other one will be preserved. Make ACPI use set_primary_fwnode() for attaching its firmware nodes to devices. Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Tested-by: Heikki Krogerus <heikki.krogerus@linux.intel.com> Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/acpi.h4
-rw-r--r--include/linux/device.h3
-rw-r--r--include/linux/fwnode.h1
3 files changed, 6 insertions, 2 deletions
diff --git a/include/linux/acpi.h b/include/linux/acpi.h
index ec488d03b518..dd12127f171c 100644
--- a/include/linux/acpi.h
+++ b/include/linux/acpi.h
@@ -54,8 +54,8 @@ static inline acpi_handle acpi_device_handle(struct acpi_device *adev)
}
#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)
diff --git a/include/linux/device.h b/include/linux/device.h
index badef20b876a..324d02add7b4 100644
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -940,6 +940,9 @@ extern void unlock_device_hotplug(void);
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
*/
diff --git a/include/linux/fwnode.h b/include/linux/fwnode.h
index 17bb5f039509..fc30b84b532a 100644
--- a/include/linux/fwnode.h
+++ b/include/linux/fwnode.h
@@ -20,6 +20,7 @@ enum fwnode_type {
struct fwnode_handle {
enum fwnode_type type;
+ struct fwnode_handle *secondary;
};
#endif