aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>2012-11-20 18:21:50 -0500
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2012-11-20 18:21:50 -0500
commit95f8a082b9b1ead0c2859f2a7b1ac91ff63d8765 (patch)
treeb269991cc59baa25b277a873ba264bca8716f129
parentf3fd0c8a7fc1e4f3107a09a75e622781d3007b56 (diff)
ACPI / driver core: Introduce struct acpi_dev_node and related macros
To avoid adding an ACPI handle pointer to struct device on architectures that don't use ACPI, or generally when CONFIG_ACPI is not set, in which cases that pointer is useless, define struct acpi_dev_node that will contain the handle pointer if CONFIG_ACPI is set and will be empty otherwise and use it to represent the ACPI device node field in struct device. In addition to that define macros for reading and setting the ACPI handle of a device that don't generate code when CONFIG_ACPI is unset. Modify the ACPI subsystem to use those macros instead of referring to the given device's ACPI handle directly. Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com> Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/acpi/glue.c16
-rw-r--r--drivers/acpi/scan.c4
-rw-r--r--include/acpi/acpi_bus.h2
-rw-r--r--include/linux/device.h18
4 files changed, 27 insertions, 13 deletions
diff --git a/drivers/acpi/glue.c b/drivers/acpi/glue.c
index 3e75d6e5a469..01551840d236 100644
--- a/drivers/acpi/glue.c
+++ b/drivers/acpi/glue.c
@@ -134,12 +134,12 @@ static int acpi_bind_one(struct device *dev, acpi_handle handle)
134 char physical_node_name[sizeof(PHYSICAL_NODE_STRING) + 2]; 134 char physical_node_name[sizeof(PHYSICAL_NODE_STRING) + 2];
135 int retval = -EINVAL; 135 int retval = -EINVAL;
136 136
137 if (dev->acpi_handle) { 137 if (ACPI_HANDLE(dev)) {
138 if (handle) { 138 if (handle) {
139 dev_warn(dev, "ACPI handle is already set\n"); 139 dev_warn(dev, "ACPI handle is already set\n");
140 return -EINVAL; 140 return -EINVAL;
141 } else { 141 } else {
142 handle = dev->acpi_handle; 142 handle = ACPI_HANDLE(dev);
143 } 143 }
144 } 144 }
145 if (!handle) 145 if (!handle)
@@ -181,8 +181,8 @@ static int acpi_bind_one(struct device *dev, acpi_handle handle)
181 181
182 mutex_unlock(&acpi_dev->physical_node_lock); 182 mutex_unlock(&acpi_dev->physical_node_lock);
183 183
184 if (!dev->acpi_handle) 184 if (!ACPI_HANDLE(dev))
185 dev->acpi_handle = handle; 185 ACPI_HANDLE_SET(dev, acpi_dev->handle);
186 186
187 if (!physical_node->node_id) 187 if (!physical_node->node_id)
188 strcpy(physical_node_name, PHYSICAL_NODE_STRING); 188 strcpy(physical_node_name, PHYSICAL_NODE_STRING);
@@ -200,7 +200,7 @@ static int acpi_bind_one(struct device *dev, acpi_handle handle)
200 return 0; 200 return 0;
201 201
202 err: 202 err:
203 dev->acpi_handle = NULL; 203 ACPI_HANDLE_SET(dev, NULL);
204 put_device(dev); 204 put_device(dev);
205 return retval; 205 return retval;
206 206
@@ -217,10 +217,10 @@ static int acpi_unbind_one(struct device *dev)
217 acpi_status status; 217 acpi_status status;
218 struct list_head *node, *next; 218 struct list_head *node, *next;
219 219
220 if (!dev->acpi_handle) 220 if (!ACPI_HANDLE(dev))
221 return 0; 221 return 0;
222 222
223 status = acpi_bus_get_device(dev->acpi_handle, &acpi_dev); 223 status = acpi_bus_get_device(ACPI_HANDLE(dev), &acpi_dev);
224 if (ACPI_FAILURE(status)) 224 if (ACPI_FAILURE(status))
225 goto err; 225 goto err;
226 226
@@ -246,7 +246,7 @@ static int acpi_unbind_one(struct device *dev)
246 246
247 sysfs_remove_link(&acpi_dev->dev.kobj, physical_node_name); 247 sysfs_remove_link(&acpi_dev->dev.kobj, physical_node_name);
248 sysfs_remove_link(&dev->kobj, "firmware_node"); 248 sysfs_remove_link(&dev->kobj, "firmware_node");
249 dev->acpi_handle = NULL; 249 ACPI_HANDLE_SET(dev, NULL);
250 /* acpi_bind_one increase refcnt by one */ 250 /* acpi_bind_one increase refcnt by one */
251 put_device(dev); 251 put_device(dev);
252 kfree(entry); 252 kfree(entry);
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
index d842569395a9..e92ca67d0e46 100644
--- a/drivers/acpi/scan.c
+++ b/drivers/acpi/scan.c
@@ -386,8 +386,8 @@ const struct acpi_device_id *acpi_match_device(const struct acpi_device_id *ids,
386{ 386{
387 struct acpi_device *adev; 387 struct acpi_device *adev;
388 388
389 if (!ids || !dev->acpi_handle 389 if (!ids || !ACPI_HANDLE(dev)
390 || ACPI_FAILURE(acpi_bus_get_device(dev->acpi_handle, &adev))) 390 || ACPI_FAILURE(acpi_bus_get_device(ACPI_HANDLE(dev), &adev)))
391 return NULL; 391 return NULL;
392 392
393 return __acpi_match_device(adev, ids); 393 return __acpi_match_device(adev, ids);
diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h
index bb1537c5e672..d1659904f2a0 100644
--- a/include/acpi/acpi_bus.h
+++ b/include/acpi/acpi_bus.h
@@ -410,7 +410,7 @@ acpi_handle acpi_get_child(acpi_handle, u64);
410int acpi_is_root_bridge(acpi_handle); 410int acpi_is_root_bridge(acpi_handle);
411acpi_handle acpi_get_pci_rootbridge_handle(unsigned int, unsigned int); 411acpi_handle acpi_get_pci_rootbridge_handle(unsigned int, unsigned int);
412struct acpi_pci_root *acpi_pci_find_root(acpi_handle handle); 412struct acpi_pci_root *acpi_pci_find_root(acpi_handle handle);
413#define DEVICE_ACPI_HANDLE(dev) ((acpi_handle)((dev)->acpi_handle)) 413#define DEVICE_ACPI_HANDLE(dev) ((acpi_handle)ACPI_HANDLE(dev))
414 414
415int acpi_enable_wakeup_device_power(struct acpi_device *dev, int state); 415int acpi_enable_wakeup_device_power(struct acpi_device *dev, int state);
416int acpi_disable_wakeup_device_power(struct acpi_device *dev); 416int acpi_disable_wakeup_device_power(struct acpi_device *dev);
diff --git a/include/linux/device.h b/include/linux/device.h
index cc3aee57a46e..05292e488346 100644
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -578,6 +578,12 @@ struct device_dma_parameters {
578 unsigned long segment_boundary_mask; 578 unsigned long segment_boundary_mask;
579}; 579};
580 580
581struct acpi_dev_node {
582#ifdef CONFIG_ACPI
583 void *handle;
584#endif
585};
586
581/** 587/**
582 * struct device - The basic device structure 588 * struct device - The basic device structure
583 * @parent: The device's "parent" device, the device to which it is attached. 589 * @parent: The device's "parent" device, the device to which it is attached.
@@ -618,7 +624,7 @@ struct device_dma_parameters {
618 * @dma_mem: Internal for coherent mem override. 624 * @dma_mem: Internal for coherent mem override.
619 * @archdata: For arch-specific additions. 625 * @archdata: For arch-specific additions.
620 * @of_node: Associated device tree node. 626 * @of_node: Associated device tree node.
621 * @acpi_handle: Associated ACPI device node's namespace handle. 627 * @acpi_node: Associated ACPI device node.
622 * @devt: For creating the sysfs "dev". 628 * @devt: For creating the sysfs "dev".
623 * @id: device instance 629 * @id: device instance
624 * @devres_lock: Spinlock to protect the resource of the device. 630 * @devres_lock: Spinlock to protect the resource of the device.
@@ -683,7 +689,7 @@ struct device {
683 struct dev_archdata archdata; 689 struct dev_archdata archdata;
684 690
685 struct device_node *of_node; /* associated device tree node */ 691 struct device_node *of_node; /* associated device tree node */
686 void *acpi_handle; /* associated ACPI device node */ 692 struct acpi_dev_node acpi_node; /* associated ACPI device node */
687 693
688 dev_t devt; /* dev_t, creates the sysfs "dev" */ 694 dev_t devt; /* dev_t, creates the sysfs "dev" */
689 u32 id; /* device instance */ 695 u32 id; /* device instance */
@@ -704,6 +710,14 @@ static inline struct device *kobj_to_dev(struct kobject *kobj)
704 return container_of(kobj, struct device, kobj); 710 return container_of(kobj, struct device, kobj);
705} 711}
706 712
713#ifdef CONFIG_ACPI
714#define ACPI_HANDLE(dev) ((dev)->acpi_node.handle)
715#define ACPI_HANDLE_SET(dev, _handle_) (dev)->acpi_node.handle = (_handle_)
716#else
717#define ACPI_HANDLE(dev) (NULL)
718#define ACPI_HANDLE_SET(dev, _handle_) do { } while (0)
719#endif
720
707/* Get the wakeup routines, which depend on struct device */ 721/* Get the wakeup routines, which depend on struct device */
708#include <linux/pm_wakeup.h> 722#include <linux/pm_wakeup.h>
709 723