aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjorn Helgaas <bjorn.helgaas@hp.com>2006-03-28 17:04:00 -0500
committerLen Brown <len.brown@intel.com>2006-04-01 21:48:08 -0500
commit578b333bfe8eb1360207a08a53c321822a8f40f3 (patch)
treeee71cd7fed8182b0477d733039509f4097933aab
parent9d9f749b316ac21cb59ad3e595cbce469b409e1a (diff)
ACPI: update asus_acpi driver registration to unload on failure
Remove the assumption that acpi_bus_register_driver() returns the number of devices claimed. Returning the count is unreliable because devices may be hot-plugged in the future (admittedly not applicable for this driver). Since the hardware for this driver is not hot-pluggable, determine whether the hardware is present by noticing calls to the .add() method. It would be better to probe the ACPI namespace for the ASUS HIDs, and load the driver only when we find one, but ACPI doesn't support that yet. I don't have an ASUS laptop to test on, but on my HP dl360, it does report the appropriate error when attempting to load the module: $ sudo insmod drivers/acpi/asus_acpi.ko insmod: error inserting 'drivers/acpi/asus_acpi.ko': -1 No such device Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Len Brown <len.brown@intel.com>
-rw-r--r--drivers/acpi/asus_acpi.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/drivers/acpi/asus_acpi.c b/drivers/acpi/asus_acpi.c
index f4c87750dbf2..523fff9cf148 100644
--- a/drivers/acpi/asus_acpi.c
+++ b/drivers/acpi/asus_acpi.c
@@ -1119,6 +1119,8 @@ static int __init asus_hotk_check(void)
1119 return result; 1119 return result;
1120} 1120}
1121 1121
1122static int asus_hotk_found;
1123
1122static int __init asus_hotk_add(struct acpi_device *device) 1124static int __init asus_hotk_add(struct acpi_device *device)
1123{ 1125{
1124 acpi_status status = AE_OK; 1126 acpi_status status = AE_OK;
@@ -1180,6 +1182,8 @@ static int __init asus_hotk_add(struct acpi_device *device)
1180 } 1182 }
1181 } 1183 }
1182 1184
1185 asus_hotk_found = 1;
1186
1183 end: 1187 end:
1184 if (result) { 1188 if (result) {
1185 kfree(hotk); 1189 kfree(hotk);
@@ -1226,7 +1230,19 @@ static int __init asus_acpi_init(void)
1226 asus_proc_dir->owner = THIS_MODULE; 1230 asus_proc_dir->owner = THIS_MODULE;
1227 1231
1228 result = acpi_bus_register_driver(&asus_hotk_driver); 1232 result = acpi_bus_register_driver(&asus_hotk_driver);
1229 if (result < 1) { 1233 if (result < 0) {
1234 remove_proc_entry(PROC_ASUS, acpi_root_dir);
1235 return -ENODEV;
1236 }
1237
1238 /*
1239 * This is a bit of a kludge. We only want this module loaded
1240 * for ASUS systems, but there's currently no way to probe the
1241 * ACPI namespace for ASUS HIDs. So we just return failure if
1242 * we didn't find one, which will cause the module to be
1243 * unloaded.
1244 */
1245 if (!asus_hotk_found) {
1230 acpi_bus_unregister_driver(&asus_hotk_driver); 1246 acpi_bus_unregister_driver(&asus_hotk_driver);
1231 remove_proc_entry(PROC_ASUS, acpi_root_dir); 1247 remove_proc_entry(PROC_ASUS, acpi_root_dir);
1232 return -ENODEV; 1248 return -ENODEV;