]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
ACPI / driver core: Introduce struct acpi_dev_node and related macros
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 20 Nov 2012 23:21:50 +0000 (00:21 +0100)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 20 Nov 2012 23:21:50 +0000 (00:21 +0100)
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>
drivers/acpi/glue.c
drivers/acpi/scan.c
include/acpi/acpi_bus.h
include/linux/device.h

index 3e75d6e5a4697c949c249aa5cc1f67d17aeece41..01551840d2365389ae8e0ea3c67054bc8655452f 100644 (file)
@@ -134,12 +134,12 @@ static int acpi_bind_one(struct device *dev, acpi_handle handle)
        char physical_node_name[sizeof(PHYSICAL_NODE_STRING) + 2];
        int retval = -EINVAL;
 
-       if (dev->acpi_handle) {
+       if (ACPI_HANDLE(dev)) {
                if (handle) {
                        dev_warn(dev, "ACPI handle is already set\n");
                        return -EINVAL;
                } else {
-                       handle = dev->acpi_handle;
+                       handle = ACPI_HANDLE(dev);
                }
        }
        if (!handle)
@@ -181,8 +181,8 @@ static int acpi_bind_one(struct device *dev, acpi_handle handle)
 
        mutex_unlock(&acpi_dev->physical_node_lock);
 
-       if (!dev->acpi_handle)
-               dev->acpi_handle = handle;
+       if (!ACPI_HANDLE(dev))
+               ACPI_HANDLE_SET(dev, acpi_dev->handle);
 
        if (!physical_node->node_id)
                strcpy(physical_node_name, PHYSICAL_NODE_STRING);
@@ -200,7 +200,7 @@ static int acpi_bind_one(struct device *dev, acpi_handle handle)
        return 0;
 
  err:
-       dev->acpi_handle = NULL;
+       ACPI_HANDLE_SET(dev, NULL);
        put_device(dev);
        return retval;
 
@@ -217,10 +217,10 @@ static int acpi_unbind_one(struct device *dev)
        acpi_status status;
        struct list_head *node, *next;
 
-       if (!dev->acpi_handle)
+       if (!ACPI_HANDLE(dev))
                return 0;
 
-       status = acpi_bus_get_device(dev->acpi_handle, &acpi_dev);
+       status = acpi_bus_get_device(ACPI_HANDLE(dev), &acpi_dev);
        if (ACPI_FAILURE(status))
                goto err;
 
@@ -246,7 +246,7 @@ static int acpi_unbind_one(struct device *dev)
 
                sysfs_remove_link(&acpi_dev->dev.kobj, physical_node_name);
                sysfs_remove_link(&dev->kobj, "firmware_node");
-               dev->acpi_handle = NULL;
+               ACPI_HANDLE_SET(dev, NULL);
                /* acpi_bind_one increase refcnt by one */
                put_device(dev);
                kfree(entry);
index d842569395a9f310b4e50e23c18db9a2fad4feb7..e92ca67d0e46fbe692034de12ab8151b0665fc9a 100644 (file)
@@ -386,8 +386,8 @@ const struct acpi_device_id *acpi_match_device(const struct acpi_device_id *ids,
 {
        struct acpi_device *adev;
 
-       if (!ids || !dev->acpi_handle
-           || ACPI_FAILURE(acpi_bus_get_device(dev->acpi_handle, &adev)))
+       if (!ids || !ACPI_HANDLE(dev)
+           || ACPI_FAILURE(acpi_bus_get_device(ACPI_HANDLE(dev), &adev)))
                return NULL;
 
        return __acpi_match_device(adev, ids);
index bb1537c5e6721e5f815ae6536c7a7e8936f6194e..d1659904f2a02898ee71a8b73ead4e7d23cea414 100644 (file)
@@ -410,7 +410,7 @@ acpi_handle acpi_get_child(acpi_handle, u64);
 int acpi_is_root_bridge(acpi_handle);
 acpi_handle acpi_get_pci_rootbridge_handle(unsigned int, unsigned int);
 struct acpi_pci_root *acpi_pci_find_root(acpi_handle handle);
-#define DEVICE_ACPI_HANDLE(dev) ((acpi_handle)((dev)->acpi_handle))
+#define DEVICE_ACPI_HANDLE(dev) ((acpi_handle)ACPI_HANDLE(dev))
 
 int acpi_enable_wakeup_device_power(struct acpi_device *dev, int state);
 int acpi_disable_wakeup_device_power(struct acpi_device *dev);
index cc3aee57a46ee8636d9ebfa21c4c8a7d18b8a66f..05292e488346697a40614b356eef82e2425f423b 100644 (file)
@@ -578,6 +578,12 @@ struct device_dma_parameters {
        unsigned long segment_boundary_mask;
 };
 
+struct acpi_dev_node {
+#ifdef CONFIG_ACPI
+       void    *handle;
+#endif
+};
+
 /**
  * struct device - The basic device structure
  * @parent:    The device's "parent" device, the device to which it is attached.
@@ -618,7 +624,7 @@ struct device_dma_parameters {
  * @dma_mem:   Internal for coherent mem override.
  * @archdata:  For arch-specific additions.
  * @of_node:   Associated device tree node.
- * @acpi_handle: Associated ACPI device node's namespace handle.
+ * @acpi_node: Associated ACPI device node.
  * @devt:      For creating the sysfs "dev".
  * @id:                device instance
  * @devres_lock: Spinlock to protect the resource of the device.
@@ -683,7 +689,7 @@ struct device {
        struct dev_archdata     archdata;
 
        struct device_node      *of_node; /* associated device tree node */
-       void                    *acpi_handle; /* associated ACPI device node */
+       struct acpi_dev_node    acpi_node; /* associated ACPI device node */
 
        dev_t                   devt;   /* dev_t, creates the sysfs "dev" */
        u32                     id;     /* device instance */
@@ -704,6 +710,14 @@ static inline struct device *kobj_to_dev(struct kobject *kobj)
        return container_of(kobj, struct device, kobj);
 }
 
+#ifdef CONFIG_ACPI
+#define ACPI_HANDLE(dev)       ((dev)->acpi_node.handle)
+#define ACPI_HANDLE_SET(dev, _handle_) (dev)->acpi_node.handle = (_handle_)
+#else
+#define ACPI_HANDLE(dev)       (NULL)
+#define ACPI_HANDLE_SET(dev, _handle_) do { } while (0)
+#endif
+
 /* Get the wakeup routines, which depend on struct device */
 #include <linux/pm_wakeup.h>