ACPI: ibm-acpi: allow module to load when acpi notifiers can't be set (v2)
authorHenrique de Moraes Holschuh <hmh@hmh.eng.br>
Thu, 15 Mar 2007 19:15:06 +0000 (16:15 -0300)
committerLen Brown <len.brown@intel.com>
Fri, 16 Mar 2007 05:07:18 +0000 (01:07 -0400)
This patch allows for ibm-acpi to coexist (with diminished functionality) with
other drivers like ACPI_BAY.  ibm-acpi will simply disable the functions it is
not able to register ACPI notifiers for.

Signed-off-by: Henrique de Moraes Holschuh <hmh@hmh.eng.br>
Cc: Chris Wedgwood <cw@f00f.org>
Cc: Kristen Carlson Accardi <kristen.c.accardi@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
drivers/acpi/ibm_acpi.c

index 36901362fd24418917ab0727f1450bd217d58967..dc1096608f4363bf0dd32312c55925b4fe168452 100644 (file)
@@ -2507,7 +2507,7 @@ static int __init setup_notify(struct ibm_struct *ibm)
        ret = acpi_bus_get_device(*ibm->handle, &ibm->device);
        if (ret < 0) {
                printk(IBM_ERR "%s device not present\n", ibm->name);
-               return 0;
+               return -ENODEV;
        }
 
        acpi_driver_data(ibm->device) = ibm;
@@ -2516,8 +2516,13 @@ static int __init setup_notify(struct ibm_struct *ibm)
        status = acpi_install_notify_handler(*ibm->handle, ibm->type,
                                             dispatch_notify, ibm);
        if (ACPI_FAILURE(status)) {
-               printk(IBM_ERR "acpi_install_notify_handler(%s) failed: %d\n",
-                      ibm->name, status);
+               if (status == AE_ALREADY_EXISTS) {
+                       printk(IBM_NOTICE "another device driver is already handling %s events\n",
+                               ibm->name);
+               } else {
+                       printk(IBM_ERR "acpi_install_notify_handler(%s) failed: %d\n",
+                               ibm->name, status);
+               }
                return -ENODEV;
        }
        ibm->notify_installed = 1;
@@ -2553,6 +2558,8 @@ static int __init register_driver(struct ibm_struct *ibm)
        return ret;
 }
 
+static void ibm_exit(struct ibm_struct *ibm);
+
 static int __init ibm_init(struct ibm_struct *ibm)
 {
        int ret;
@@ -2594,6 +2601,12 @@ static int __init ibm_init(struct ibm_struct *ibm)
 
        if (ibm->notify) {
                ret = setup_notify(ibm);
+               if (ret == -ENODEV) {
+                       printk(IBM_NOTICE "disabling subdriver %s\n",
+                               ibm->name);
+                       ibm_exit(ibm);
+                       return 0;
+               }
                if (ret < 0)
                        return ret;
        }