Pull acpi_bus_register_driver into release branch
authorLen Brown <len.brown@intel.com>
Fri, 16 Jun 2006 01:28:57 +0000 (21:28 -0400)
committerLen Brown <len.brown@intel.com>
Fri, 16 Jun 2006 01:28:57 +0000 (21:28 -0400)
Conflicts:

drivers/acpi/asus_acpi.c
drivers/acpi/scan.c

drivers/acpi/asus_acpi.c
drivers/acpi/scan.c
drivers/char/sonypi.c
include/acpi/acpi_bus.h

index 1a545489e8597b13890a407f923141cc98b1917e..90eb3c5a15cae8eae0d0d0acd296a39a838844ca 100644 (file)
@@ -1119,6 +1119,8 @@ static int asus_hotk_check(void)
        return result;
 }
 
+static int asus_hotk_found;
+
 static int asus_hotk_add(struct acpi_device *device)
 {
        acpi_status status = AE_OK;
@@ -1180,6 +1182,8 @@ static int asus_hotk_add(struct acpi_device *device)
                }
        }
 
+       asus_hotk_found = 1;
+
       end:
        if (result) {
                kfree(hotk);
@@ -1226,7 +1230,19 @@ static int __init asus_acpi_init(void)
        asus_proc_dir->owner = THIS_MODULE;
 
        result = acpi_bus_register_driver(&asus_hotk_driver);
-       if (result < 1) {
+       if (result < 0) {
+               remove_proc_entry(PROC_ASUS, acpi_root_dir);
+               return -ENODEV;
+       }
+
+       /*
+        * This is a bit of a kludge.  We only want this module loaded
+        * for ASUS systems, but there's currently no way to probe the
+        * ACPI namespace for ASUS HIDs.  So we just return failure if
+        * we didn't find one, which will cause the module to be
+        * unloaded.
+        */
+       if (!asus_hotk_found) {
                acpi_bus_unregister_driver(&asus_hotk_driver);
                remove_proc_entry(PROC_ASUS, acpi_root_dir);
                return -ENODEV;
index a5fa85832fa377cc652e260683e813e10a939236..fc676ac0e3edbbce6c71e0a1964c7ddccd42a7b0 100644 (file)
@@ -142,7 +142,7 @@ static void acpi_device_register(struct acpi_device *device,
        create_sysfs_device_files(device);
 }
 
-static int acpi_device_unregister(struct acpi_device *device, int type)
+static void acpi_device_unregister(struct acpi_device *device, int type)
 {
        spin_lock(&acpi_device_lock);
        if (device->parent) {
@@ -158,7 +158,6 @@ static int acpi_device_unregister(struct acpi_device *device, int type)
        acpi_detach_data(device->handle, acpi_bus_data_handler);
        remove_sysfs_device_files(device);
        kobject_unregister(&device->kobj);
-       return 0;
 }
 
 void acpi_bus_data_handler(acpi_handle handle, u32 function, void *context)
@@ -537,10 +536,9 @@ static int acpi_start_single_object(struct acpi_device *device)
        return_VALUE(result);
 }
 
-static int acpi_driver_attach(struct acpi_driver *drv)
+static void acpi_driver_attach(struct acpi_driver *drv)
 {
        struct list_head *node, *next;
-       int count = 0;
 
        ACPI_FUNCTION_TRACE("acpi_driver_attach");
 
@@ -557,7 +555,6 @@ static int acpi_driver_attach(struct acpi_driver *drv)
                        if (!acpi_bus_driver_init(dev, drv)) {
                                acpi_start_single_object(dev);
                                atomic_inc(&drv->references);
-                               count++;
                                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
                                                  "Found driver [%s] for device [%s]\n",
                                                  drv->name, dev->pnp.bus_id));
@@ -566,10 +563,9 @@ static int acpi_driver_attach(struct acpi_driver *drv)
                spin_lock(&acpi_device_lock);
        }
        spin_unlock(&acpi_device_lock);
-       return_VALUE(count);
 }
 
-static int acpi_driver_detach(struct acpi_driver *drv)
+static void acpi_driver_detach(struct acpi_driver *drv)
 {
        struct list_head *node, *next;
 
@@ -591,7 +587,6 @@ static int acpi_driver_detach(struct acpi_driver *drv)
                }
        }
        spin_unlock(&acpi_device_lock);
-       return_VALUE(0);
 }
 
 /**
@@ -599,28 +594,22 @@ static int acpi_driver_detach(struct acpi_driver *drv)
  * @driver: driver being registered
  *
  * Registers a driver with the ACPI bus.  Searches the namespace for all
- * devices that match the driver's criteria and binds.  Returns the
- * number of devices that were claimed by the driver, or a negative
- * error status for failure.
+ * devices that match the driver's criteria and binds.  Returns zero for
+ * success or a negative error status for failure.
  */
 int acpi_bus_register_driver(struct acpi_driver *driver)
 {
-       int count;
-
        ACPI_FUNCTION_TRACE("acpi_bus_register_driver");
 
        if (acpi_disabled)
                return_VALUE(-ENODEV);
 
-       if (!driver)
-               return_VALUE(-EINVAL);
-
        spin_lock(&acpi_device_lock);
        list_add_tail(&driver->node, &acpi_bus_drivers);
        spin_unlock(&acpi_device_lock);
-       count = acpi_driver_attach(driver);
+       acpi_driver_attach(driver);
 
-       return_VALUE(count);
+       return_VALUE(0);
 }
 
 EXPORT_SYMBOL(acpi_bus_register_driver);
@@ -632,13 +621,8 @@ EXPORT_SYMBOL(acpi_bus_register_driver);
  * Unregisters a driver with the ACPI bus.  Searches the namespace for all
  * devices that match the driver's criteria and unbinds.
  */
-int acpi_bus_unregister_driver(struct acpi_driver *driver)
+void acpi_bus_unregister_driver(struct acpi_driver *driver)
 {
-       ACPI_FUNCTION_TRACE("acpi_bus_unregister_driver");
-
-       if (!driver)
-               return_VALUE(-EINVAL);
-
        acpi_driver_detach(driver);
 
        if (!atomic_read(&driver->references)) {
@@ -646,7 +630,7 @@ int acpi_bus_unregister_driver(struct acpi_driver *driver)
                list_del_init(&driver->node);
                spin_unlock(&acpi_device_lock);
        }
-       return_VALUE(0);
+       return;
 }
 
 EXPORT_SYMBOL(acpi_bus_unregister_driver);
index a90f5d97df35dc8c262145efe0187085a6bd2009..43dfd8689dce31a0b8230c12c3ad922763cc4f77 100644 (file)
@@ -512,7 +512,7 @@ static struct sonypi_device {
 
 #ifdef CONFIG_ACPI
 static struct acpi_device *sonypi_acpi_device;
-static int acpi_enabled;
+static int acpi_driver_registered;
 #endif
 
 static int sonypi_ec_write(u8 addr, u8 value)
@@ -869,7 +869,7 @@ found:
                sonypi_report_input_event(event);
 
 #ifdef CONFIG_ACPI
-       if (acpi_enabled)
+       if (sonypi_acpi_device)
                acpi_bus_generate_event(sonypi_acpi_device, 1, event);
 #endif
 
@@ -1551,8 +1551,8 @@ static int __init sonypi_init(void)
                goto err_free_device;
 
 #ifdef CONFIG_ACPI
-       if (acpi_bus_register_driver(&sonypi_acpi_driver) > 0)
-               acpi_enabled = 1;
+       if (acpi_bus_register_driver(&sonypi_acpi_driver) >= 0)
+               acpi_driver_registered = 1;
 #endif
 
        return 0;
@@ -1567,7 +1567,7 @@ static int __init sonypi_init(void)
 static void __exit sonypi_exit(void)
 {
 #ifdef CONFIG_ACPI
-       if (acpi_enabled)
+       if (acpi_driver_registered)
                acpi_bus_unregister_driver(&sonypi_acpi_driver);
 #endif
        platform_device_unregister(sonypi_platform_device);
index 43f8c2a23a24e9cbc0575c04c6a605924806a41f..8c7590fdd822531d7d1fd62f55397578350171b5 100644 (file)
@@ -327,7 +327,7 @@ int acpi_bus_set_power(acpi_handle handle, int state);
 int acpi_bus_generate_event(struct acpi_device *device, u8 type, int data);
 int acpi_bus_receive_event(struct acpi_bus_event *event);
 int acpi_bus_register_driver(struct acpi_driver *driver);
-int acpi_bus_unregister_driver(struct acpi_driver *driver);
+void acpi_bus_unregister_driver(struct acpi_driver *driver);
 int acpi_bus_add(struct acpi_device **child, struct acpi_device *parent,
                 acpi_handle handle, int type);
 int acpi_bus_trim(struct acpi_device *start, int rmdevice);