|
@@ -748,6 +748,28 @@ static void dock_notify(acpi_handle handle, u32 event, void *data)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static int acpi_dock_notifier_call(struct notifier_block *this,
|
|
|
+ unsigned long event, void *data)
|
|
|
+{
|
|
|
+ struct dock_station *dock_station;
|
|
|
+ acpi_handle handle = (acpi_handle)data;
|
|
|
+
|
|
|
+ if (event != ACPI_NOTIFY_BUS_CHECK && event != ACPI_NOTIFY_DEVICE_CHECK
|
|
|
+ && event != ACPI_NOTIFY_EJECT_REQUEST)
|
|
|
+ return 0;
|
|
|
+ list_for_each_entry(dock_station, &dock_stations, sibiling) {
|
|
|
+ if (dock_station->handle == handle) {
|
|
|
+ dock_notify(handle, event, dock_station);
|
|
|
+ return 0 ;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static struct notifier_block dock_acpi_notifier = {
|
|
|
+ .notifier_call = acpi_dock_notifier_call,
|
|
|
+};
|
|
|
+
|
|
|
/**
|
|
|
* find_dock_devices - find devices on the dock station
|
|
|
* @handle: the handle of the device we are examining
|
|
@@ -861,7 +883,6 @@ static DEVICE_ATTR(uid, S_IRUGO, show_dock_uid, NULL);
|
|
|
static int dock_add(acpi_handle handle)
|
|
|
{
|
|
|
int ret;
|
|
|
- acpi_status status;
|
|
|
struct dock_dependent_device *dd;
|
|
|
struct dock_station *dock_station;
|
|
|
struct platform_device *dock_device;
|
|
@@ -956,23 +977,10 @@ static int dock_add(acpi_handle handle)
|
|
|
}
|
|
|
add_dock_dependent_device(dock_station, dd);
|
|
|
|
|
|
- /* register for dock events */
|
|
|
- status = acpi_install_notify_handler(dock_station->handle,
|
|
|
- ACPI_SYSTEM_NOTIFY,
|
|
|
- dock_notify, dock_station);
|
|
|
-
|
|
|
- if (ACPI_FAILURE(status)) {
|
|
|
- printk(KERN_ERR PREFIX "Error installing notify handler\n");
|
|
|
- ret = -ENODEV;
|
|
|
- goto dock_add_err;
|
|
|
- }
|
|
|
-
|
|
|
dock_station_count++;
|
|
|
list_add(&dock_station->sibiling, &dock_stations);
|
|
|
return 0;
|
|
|
|
|
|
-dock_add_err:
|
|
|
- kfree(dd);
|
|
|
dock_add_err_unregister:
|
|
|
device_remove_file(&dock_device->dev, &dev_attr_docked);
|
|
|
device_remove_file(&dock_device->dev, &dev_attr_undock);
|
|
@@ -990,7 +998,6 @@ dock_add_err_unregister:
|
|
|
static int dock_remove(struct dock_station *dock_station)
|
|
|
{
|
|
|
struct dock_dependent_device *dd, *tmp;
|
|
|
- acpi_status status;
|
|
|
struct platform_device *dock_device = dock_station->dock_device;
|
|
|
|
|
|
if (!dock_station_count)
|
|
@@ -1001,13 +1008,6 @@ static int dock_remove(struct dock_station *dock_station)
|
|
|
list)
|
|
|
kfree(dd);
|
|
|
|
|
|
- /* remove dock notify handler */
|
|
|
- status = acpi_remove_notify_handler(dock_station->handle,
|
|
|
- ACPI_SYSTEM_NOTIFY,
|
|
|
- dock_notify);
|
|
|
- if (ACPI_FAILURE(status))
|
|
|
- printk(KERN_ERR "Error removing notify handler\n");
|
|
|
-
|
|
|
/* cleanup sysfs */
|
|
|
device_remove_file(&dock_device->dev, &dev_attr_docked);
|
|
|
device_remove_file(&dock_device->dev, &dev_attr_undock);
|
|
@@ -1069,6 +1069,7 @@ static int __init dock_init(void)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+ register_acpi_bus_notifier(&dock_acpi_notifier);
|
|
|
printk(KERN_INFO PREFIX "%s: %d docks/bays found\n",
|
|
|
ACPI_DOCK_DRIVER_DESCRIPTION, dock_station_count);
|
|
|
return 0;
|
|
@@ -1078,6 +1079,7 @@ static void __exit dock_exit(void)
|
|
|
{
|
|
|
struct dock_station *dock_station;
|
|
|
|
|
|
+ unregister_acpi_bus_notifier(&dock_acpi_notifier);
|
|
|
list_for_each_entry(dock_station, &dock_stations, sibiling)
|
|
|
dock_remove(dock_station);
|
|
|
}
|