aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLen Brown <len.brown@intel.com>2006-06-15 21:28:57 -0400
committerLen Brown <len.brown@intel.com>2006-06-15 21:28:57 -0400
commit69cd291c6bbc6647fe3783257c5a2e076e808f71 (patch)
tree6f65a2d7d29228129cef09343c485aad64e3a3f1
parent35a5d9ed9fedb74c22cb19ff7d749289473144e0 (diff)
parent06ea8e08ae7e7e450b6a78e7ce5e10b3c5f954ea (diff)
Pull acpi_bus_register_driver into release branch
Conflicts: drivers/acpi/asus_acpi.c drivers/acpi/scan.c
-rw-r--r--drivers/acpi/asus_acpi.c18
-rw-r--r--drivers/acpi/scan.c34
-rw-r--r--drivers/char/sonypi.c10
-rw-r--r--include/acpi/acpi_bus.h2
4 files changed, 32 insertions, 32 deletions
diff --git a/drivers/acpi/asus_acpi.c b/drivers/acpi/asus_acpi.c
index 1a545489e859..90eb3c5a15ca 100644
--- a/drivers/acpi/asus_acpi.c
+++ b/drivers/acpi/asus_acpi.c
@@ -1119,6 +1119,8 @@ static int asus_hotk_check(void)
1119 return result; 1119 return result;
1120} 1120}
1121 1121
1122static int asus_hotk_found;
1123
1122static int asus_hotk_add(struct acpi_device *device) 1124static int 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 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;
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
index a5fa85832fa3..fc676ac0e3ed 100644
--- a/drivers/acpi/scan.c
+++ b/drivers/acpi/scan.c
@@ -142,7 +142,7 @@ static void acpi_device_register(struct acpi_device *device,
142 create_sysfs_device_files(device); 142 create_sysfs_device_files(device);
143} 143}
144 144
145static int acpi_device_unregister(struct acpi_device *device, int type) 145static void acpi_device_unregister(struct acpi_device *device, int type)
146{ 146{
147 spin_lock(&acpi_device_lock); 147 spin_lock(&acpi_device_lock);
148 if (device->parent) { 148 if (device->parent) {
@@ -158,7 +158,6 @@ static int acpi_device_unregister(struct acpi_device *device, int type)
158 acpi_detach_data(device->handle, acpi_bus_data_handler); 158 acpi_detach_data(device->handle, acpi_bus_data_handler);
159 remove_sysfs_device_files(device); 159 remove_sysfs_device_files(device);
160 kobject_unregister(&device->kobj); 160 kobject_unregister(&device->kobj);
161 return 0;
162} 161}
163 162
164void acpi_bus_data_handler(acpi_handle handle, u32 function, void *context) 163void 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)
537 return_VALUE(result); 536 return_VALUE(result);
538} 537}
539 538
540static int acpi_driver_attach(struct acpi_driver *drv) 539static void acpi_driver_attach(struct acpi_driver *drv)
541{ 540{
542 struct list_head *node, *next; 541 struct list_head *node, *next;
543 int count = 0;
544 542
545 ACPI_FUNCTION_TRACE("acpi_driver_attach"); 543 ACPI_FUNCTION_TRACE("acpi_driver_attach");
546 544
@@ -557,7 +555,6 @@ static int acpi_driver_attach(struct acpi_driver *drv)
557 if (!acpi_bus_driver_init(dev, drv)) { 555 if (!acpi_bus_driver_init(dev, drv)) {
558 acpi_start_single_object(dev); 556 acpi_start_single_object(dev);
559 atomic_inc(&drv->references); 557 atomic_inc(&drv->references);
560 count++;
561 ACPI_DEBUG_PRINT((ACPI_DB_INFO, 558 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
562 "Found driver [%s] for device [%s]\n", 559 "Found driver [%s] for device [%s]\n",
563 drv->name, dev->pnp.bus_id)); 560 drv->name, dev->pnp.bus_id));
@@ -566,10 +563,9 @@ static int acpi_driver_attach(struct acpi_driver *drv)
566 spin_lock(&acpi_device_lock); 563 spin_lock(&acpi_device_lock);
567 } 564 }
568 spin_unlock(&acpi_device_lock); 565 spin_unlock(&acpi_device_lock);
569 return_VALUE(count);
570} 566}
571 567
572static int acpi_driver_detach(struct acpi_driver *drv) 568static void acpi_driver_detach(struct acpi_driver *drv)
573{ 569{
574 struct list_head *node, *next; 570 struct list_head *node, *next;
575 571
@@ -591,7 +587,6 @@ static int acpi_driver_detach(struct acpi_driver *drv)
591 } 587 }
592 } 588 }
593 spin_unlock(&acpi_device_lock); 589 spin_unlock(&acpi_device_lock);
594 return_VALUE(0);
595} 590}
596 591
597/** 592/**
@@ -599,28 +594,22 @@ static int acpi_driver_detach(struct acpi_driver *drv)
599 * @driver: driver being registered 594 * @driver: driver being registered
600 * 595 *
601 * Registers a driver with the ACPI bus. Searches the namespace for all 596 * Registers a driver with the ACPI bus. Searches the namespace for all
602 * devices that match the driver's criteria and binds. Returns the 597 * devices that match the driver's criteria and binds. Returns zero for
603 * number of devices that were claimed by the driver, or a negative 598 * success or a negative error status for failure.
604 * error status for failure.
605 */ 599 */
606int acpi_bus_register_driver(struct acpi_driver *driver) 600int acpi_bus_register_driver(struct acpi_driver *driver)
607{ 601{
608 int count;
609
610 ACPI_FUNCTION_TRACE("acpi_bus_register_driver"); 602 ACPI_FUNCTION_TRACE("acpi_bus_register_driver");
611 603
612 if (acpi_disabled) 604 if (acpi_disabled)
613 return_VALUE(-ENODEV); 605 return_VALUE(-ENODEV);
614 606
615 if (!driver)
616 return_VALUE(-EINVAL);
617
618 spin_lock(&acpi_device_lock); 607 spin_lock(&acpi_device_lock);
619 list_add_tail(&driver->node, &acpi_bus_drivers); 608 list_add_tail(&driver->node, &acpi_bus_drivers);
620 spin_unlock(&acpi_device_lock); 609 spin_unlock(&acpi_device_lock);
621 count = acpi_driver_attach(driver); 610 acpi_driver_attach(driver);
622 611
623 return_VALUE(count); 612 return_VALUE(0);
624} 613}
625 614
626EXPORT_SYMBOL(acpi_bus_register_driver); 615EXPORT_SYMBOL(acpi_bus_register_driver);
@@ -632,13 +621,8 @@ EXPORT_SYMBOL(acpi_bus_register_driver);
632 * Unregisters a driver with the ACPI bus. Searches the namespace for all 621 * Unregisters a driver with the ACPI bus. Searches the namespace for all
633 * devices that match the driver's criteria and unbinds. 622 * devices that match the driver's criteria and unbinds.
634 */ 623 */
635int acpi_bus_unregister_driver(struct acpi_driver *driver) 624void acpi_bus_unregister_driver(struct acpi_driver *driver)
636{ 625{
637 ACPI_FUNCTION_TRACE("acpi_bus_unregister_driver");
638
639 if (!driver)
640 return_VALUE(-EINVAL);
641
642 acpi_driver_detach(driver); 626 acpi_driver_detach(driver);
643 627
644 if (!atomic_read(&driver->references)) { 628 if (!atomic_read(&driver->references)) {
@@ -646,7 +630,7 @@ int acpi_bus_unregister_driver(struct acpi_driver *driver)
646 list_del_init(&driver->node); 630 list_del_init(&driver->node);
647 spin_unlock(&acpi_device_lock); 631 spin_unlock(&acpi_device_lock);
648 } 632 }
649 return_VALUE(0); 633 return;
650} 634}
651 635
652EXPORT_SYMBOL(acpi_bus_unregister_driver); 636EXPORT_SYMBOL(acpi_bus_unregister_driver);
diff --git a/drivers/char/sonypi.c b/drivers/char/sonypi.c
index a90f5d97df35..43dfd8689dce 100644
--- a/drivers/char/sonypi.c
+++ b/drivers/char/sonypi.c
@@ -512,7 +512,7 @@ static struct sonypi_device {
512 512
513#ifdef CONFIG_ACPI 513#ifdef CONFIG_ACPI
514static struct acpi_device *sonypi_acpi_device; 514static struct acpi_device *sonypi_acpi_device;
515static int acpi_enabled; 515static int acpi_driver_registered;
516#endif 516#endif
517 517
518static int sonypi_ec_write(u8 addr, u8 value) 518static int sonypi_ec_write(u8 addr, u8 value)
@@ -869,7 +869,7 @@ found:
869 sonypi_report_input_event(event); 869 sonypi_report_input_event(event);
870 870
871#ifdef CONFIG_ACPI 871#ifdef CONFIG_ACPI
872 if (acpi_enabled) 872 if (sonypi_acpi_device)
873 acpi_bus_generate_event(sonypi_acpi_device, 1, event); 873 acpi_bus_generate_event(sonypi_acpi_device, 1, event);
874#endif 874#endif
875 875
@@ -1551,8 +1551,8 @@ static int __init sonypi_init(void)
1551 goto err_free_device; 1551 goto err_free_device;
1552 1552
1553#ifdef CONFIG_ACPI 1553#ifdef CONFIG_ACPI
1554 if (acpi_bus_register_driver(&sonypi_acpi_driver) > 0) 1554 if (acpi_bus_register_driver(&sonypi_acpi_driver) >= 0)
1555 acpi_enabled = 1; 1555 acpi_driver_registered = 1;
1556#endif 1556#endif
1557 1557
1558 return 0; 1558 return 0;
@@ -1567,7 +1567,7 @@ static int __init sonypi_init(void)
1567static void __exit sonypi_exit(void) 1567static void __exit sonypi_exit(void)
1568{ 1568{
1569#ifdef CONFIG_ACPI 1569#ifdef CONFIG_ACPI
1570 if (acpi_enabled) 1570 if (acpi_driver_registered)
1571 acpi_bus_unregister_driver(&sonypi_acpi_driver); 1571 acpi_bus_unregister_driver(&sonypi_acpi_driver);
1572#endif 1572#endif
1573 platform_device_unregister(sonypi_platform_device); 1573 platform_device_unregister(sonypi_platform_device);
diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h
index 43f8c2a23a24..8c7590fdd822 100644
--- a/include/acpi/acpi_bus.h
+++ b/include/acpi/acpi_bus.h
@@ -327,7 +327,7 @@ int acpi_bus_set_power(acpi_handle handle, int state);
327int acpi_bus_generate_event(struct acpi_device *device, u8 type, int data); 327int acpi_bus_generate_event(struct acpi_device *device, u8 type, int data);
328int acpi_bus_receive_event(struct acpi_bus_event *event); 328int acpi_bus_receive_event(struct acpi_bus_event *event);
329int acpi_bus_register_driver(struct acpi_driver *driver); 329int acpi_bus_register_driver(struct acpi_driver *driver);
330int acpi_bus_unregister_driver(struct acpi_driver *driver); 330void acpi_bus_unregister_driver(struct acpi_driver *driver);
331int acpi_bus_add(struct acpi_device **child, struct acpi_device *parent, 331int acpi_bus_add(struct acpi_device **child, struct acpi_device *parent,
332 acpi_handle handle, int type); 332 acpi_handle handle, int type);
333int acpi_bus_trim(struct acpi_device *start, int rmdevice); 333int acpi_bus_trim(struct acpi_device *start, int rmdevice);