ACPI: Make acpi_bus_scan() and acpi_bus_add() take only one argument
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 20 Dec 2012 23:36:49 +0000 (00:36 +0100)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 3 Jan 2013 12:09:40 +0000 (13:09 +0100)
The callers of acpi_bus_add() usually assume that if it has
succeeded, then a struct acpi_device object has been attached to
the handle passed as the first argument.  Unfortunately, however,
this assumption is wrong, because acpi_bus_scan(), and acpi_bus_add()
too as a result, may return a pointer to a different struct
acpi_device object on success (it may be an object corresponding to
one of the descendant ACPI nodes in the namespace scope below that
handle).

For this reason, the callers of acpi_bus_add() who care about
whether or not a struct acpi_device object has been created for
its first argument need to check that using acpi_bus_get_device()
anyway, so the second argument of acpi_bus_add() is not really
useful for them.  The same observation applies to acpi_bus_scan()
executed directly from acpi_scan_init().

Therefore modify the relevant callers of acpi_bus_add() to check the
existence of the struct acpi_device in question with the help of
acpi_bus_get_device() and drop the no longer necessary second
argument of acpi_bus_add().  Accordingly, modify acpi_scan_init() to
use acpi_bus_get_device() to get acpi_root and drop the no longer
needed second argument of acpi_bus_scan().

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Acked-by: Yinghai Lu <yinghai@kernel.org>
Acked-by: Toshi Kani <toshi.kani@hp.com>
drivers/acpi/acpi_memhotplug.c
drivers/acpi/container.c
drivers/acpi/dock.c
drivers/acpi/processor_driver.c
drivers/acpi/scan.c
drivers/pci/hotplug/acpiphp_glue.c
drivers/pci/hotplug/sgi_hotplug.c
include/acpi/acpi_bus.h

index d0a7da704d49c8db803dcc9d373ca3c438ec4541..327ab4459558f78c8e1e1c39e03d6b0aea7f0629 100644 (file)
@@ -167,11 +167,16 @@ acpi_memory_get_device(acpi_handle handle,
         * Now add the notified device.  This creates the acpi_device
         * and invokes .add function
         */
-       result = acpi_bus_add(handle, &device);
+       result = acpi_bus_add(handle);
        if (result) {
                acpi_handle_warn(handle, "Cannot add acpi bus\n");
                return -EINVAL;
        }
+       result = acpi_bus_get_device(handle, &device);
+       if (result) {
+               acpi_handle_warn(handle, "Missing device object\n");
+               return -EINVAL;
+       }
 
       end:
        *mem_device = acpi_driver_data(device);
index 0688f83bc43608ec38855548975b5e2c96fab805..f8fb2281f34a550662b06453fc16097a8486b7cc 100644 (file)
@@ -166,11 +166,16 @@ static void container_notify_cb(acpi_handle handle, u32 type, void *context)
                if (!ACPI_FAILURE(status) || device)
                        break;
 
-               result = acpi_bus_add(handle, &device);
+               result = acpi_bus_add(handle);
                if (result) {
                        acpi_handle_warn(handle, "Failed to add container\n");
                        break;
                }
+               result = acpi_bus_get_device(handle, &device);
+               if (result) {
+                       acpi_handle_warn(handle, "Missing device object\n");
+                       break;
+               }
 
                kobject_uevent(&device->dev.kobj, KOBJ_ONLINE);
                ost_code = ACPI_OST_SC_SUCCESS;
index ff30582d2e1d8569043fae2614e2098582835682..9e31b2bd93d3d2938d888b4e672364c733f16abc 100644 (file)
@@ -317,9 +317,11 @@ static struct acpi_device * dock_create_acpi_device(acpi_handle handle)
                 * no device created for this object,
                 * so we should create one.
                 */
-               ret = acpi_bus_add(handle, &device);
+               ret = acpi_bus_add(handle);
                if (ret)
                        pr_debug("error adding bus, %x\n", -ret);
+
+               acpi_bus_get_device(handle, &device);
        }
        return device;
 }
index 18b292e12b387dba8be059bdff0d2a5da9efc8bd..0777663f443ed6a5372c983ed4ebcdfe40547354 100644 (file)
@@ -699,12 +699,16 @@ static void acpi_processor_hotplug_notify(acpi_handle handle,
                if (!acpi_bus_get_device(handle, &device))
                        break;
 
-               result = acpi_bus_add(handle, &device);
+               result = acpi_bus_add(handle);
                if (result) {
                        acpi_handle_err(handle, "Unable to add the device\n");
                        break;
                }
-
+               result = acpi_bus_get_device(handle, &device);
+               if (result) {
+                       acpi_handle_err(handle, "Missing device object\n");
+                       break;
+               }
                ost_code = ACPI_OST_SC_SUCCESS;
                break;
 
index e3aed481aed2724d67608c85db95cda2295a6b05..3d44c705a3a26f48bdf0e9de3cd6105b56cbd854 100644 (file)
@@ -1620,37 +1620,27 @@ static acpi_status acpi_bus_device_attach(acpi_handle handle, u32 lvl_not_used,
        return status;
 }
 
-static int acpi_bus_scan(acpi_handle handle, struct acpi_device **child)
+static int acpi_bus_scan(acpi_handle handle)
 {
        void *device = NULL;
-       acpi_status status;
-       int ret = -ENODEV;
 
-       status = acpi_bus_check_add(handle, 0, NULL, &device);
-       if (ACPI_SUCCESS(status))
+       if (ACPI_SUCCESS(acpi_bus_check_add(handle, 0, NULL, &device)))
                acpi_walk_namespace(ACPI_TYPE_ANY, handle, ACPI_UINT32_MAX,
                                    acpi_bus_check_add, NULL, NULL, &device);
 
        if (!device)
-               goto out;
+               return -ENODEV;
 
-       ret = 0;
-       status = acpi_bus_device_attach(handle, 0, NULL, NULL);
-       if (ACPI_SUCCESS(status))
+       if (ACPI_SUCCESS(acpi_bus_device_attach(handle, 0, NULL, NULL)))
                acpi_walk_namespace(ACPI_TYPE_ANY, handle, ACPI_UINT32_MAX,
                                    acpi_bus_device_attach, NULL, NULL, NULL);
 
- out:
-       if (child)
-               *child = device;
-
-       return ret;
+       return 0;
 }
 
 /**
  * acpi_bus_add - Add ACPI device node objects in a given namespace scope.
  * @handle: Root of the namespace scope to scan.
- * @ret: Location to store a return struct acpi_device pointer.
  *
  * Scan a given ACPI tree (probably recently hot-plugged) and create and add
  * found devices.
@@ -1659,21 +1649,12 @@ static int acpi_bus_scan(acpi_handle handle, struct acpi_device **child)
  * there has been a real error.  There just have been no suitable ACPI objects
  * in the table trunk from which the kernel could create a device and add an
  * appropriate driver.
- *
- * If 0 is returned, the memory location pointed to by @ret will be populated
- * with a pointer to a struct acpi_device created while scanning the namespace.
- * If @handle corresponds to a device node, that will be a pointer to the struct
- * acpi_device object corresponding to @handle.  Otherwise, it will be a pointer
- * to a struct acpi_device corresponding to one of its descendants.
- *
- * If an error code is returned, NULL will be stored in the memory location
- * pointed to by @ret.
  */
-int acpi_bus_add(acpi_handle handle, struct acpi_device **ret)
+int acpi_bus_add(acpi_handle handle)
 {
        int err;
 
-       err = acpi_bus_scan(handle, ret);
+       err = acpi_bus_scan(handle);
        if (err)
                return err;
 
@@ -1777,8 +1758,11 @@ int __init acpi_scan_init(void)
        /*
         * Enumerate devices in the ACPI namespace.
         */
-       result = acpi_bus_scan(ACPI_ROOT_OBJECT, &acpi_root);
+       result = acpi_bus_scan(ACPI_ROOT_OBJECT);
+       if (result)
+               return result;
 
+       result = acpi_bus_get_device(ACPI_ROOT_OBJECT, &acpi_root);
        if (!result)
                result = acpi_bus_scan_fixed();
 
index dfc2df54b93a04290ebf1a6cf401bc85242dee83..91b5ad875c53b4cdd5a52df136008ae469c76a27 100644 (file)
@@ -746,14 +746,13 @@ static int acpiphp_bus_add(struct acpiphp_func *func)
                dbg("acpi_bus_trim return %x\n", ret_val);
        }
 
-       ret_val = acpi_bus_add(func->handle, &device);
-       if (ret_val) {
-               dbg("error adding bus, %x\n",
-                       -ret_val);
-               goto acpiphp_bus_add_out;
-       }
+       ret_val = acpi_bus_add(func->handle);
+       if (!ret_val)
+               ret_val = acpi_bus_get_device(func->handle, &device);
+
+       if (ret_val)
+               dbg("error adding bus, %x\n", -ret_val);
 
-acpiphp_bus_add_out:
        return ret_val;
 }
 
@@ -1130,10 +1129,14 @@ static void handle_bridge_insertion(acpi_handle handle, u32 type)
                return;
        }
 
-       if (acpi_bus_add(handle, &device)) {
+       if (acpi_bus_add(handle)) {
                err("cannot add bridge to acpi list\n");
                return;
        }
+       if (acpi_bus_get_device(handle, &device)) {
+               err("ACPI device object missing\n");
+               return;
+       }
        if (!acpiphp_configure_bridge(handle))
                add_bridge(handle);
        else
index 801b58d1f78e209c13c9c27cc739b9a9c2f3f568..f3c419256d2a3f4736594a7103ea667df4232d94 100644 (file)
@@ -412,7 +412,6 @@ static int enable_slot(struct hotplug_slot *bss_hotplug_slot)
        if (SN_ACPI_BASE_SUPPORT() && ssdt) {
                unsigned long long adr;
                struct acpi_device *pdevice;
-               struct acpi_device *device;
                acpi_handle phandle;
                acpi_handle chandle = NULL;
                acpi_handle rethandle;
@@ -448,7 +447,7 @@ static int enable_slot(struct hotplug_slot *bss_hotplug_slot)
                        if (ACPI_SUCCESS(ret) &&
                            (adr>>16) == (slot->device_num + 1)) {
 
-                               ret = acpi_bus_add(chandle, &device);
+                               ret = acpi_bus_add(chandle);
                                if (ACPI_FAILURE(ret)) {
                                        printk(KERN_ERR "%s: acpi_bus_add "
                                               "failed (0x%x) for slot %d "
index 056cb0cd8effac9659067ee5081e1ea5f01704db..5e1d5a1b477fbc4ed0dbee699846a6586bb0bf00 100644 (file)
@@ -351,7 +351,7 @@ static inline int acpi_bus_generate_proc_event(struct acpi_device *device, u8 ty
 #endif
 int acpi_bus_register_driver(struct acpi_driver *driver);
 void acpi_bus_unregister_driver(struct acpi_driver *driver);
-int acpi_bus_add(acpi_handle handle, struct acpi_device **ret);
+int acpi_bus_add(acpi_handle handle);
 void acpi_bus_hot_remove_device(void *context);
 int acpi_bus_trim(struct acpi_device *start, int rmdevice);
 acpi_status acpi_bus_get_ejd(acpi_handle handle, acpi_handle * ejd);