diff options
| -rw-r--r-- | drivers/acpi/glue.c | 12 | ||||
| -rw-r--r-- | drivers/acpi/scan.c | 9 | ||||
| -rw-r--r-- | include/acpi/acpi_bus.h | 2 |
3 files changed, 19 insertions, 4 deletions
diff --git a/drivers/acpi/glue.c b/drivers/acpi/glue.c index 0c789224d40d..f774c65ecb8b 100644 --- a/drivers/acpi/glue.c +++ b/drivers/acpi/glue.c | |||
| @@ -287,6 +287,7 @@ EXPORT_SYMBOL_GPL(acpi_unbind_one); | |||
| 287 | static int acpi_platform_notify(struct device *dev) | 287 | static int acpi_platform_notify(struct device *dev) |
| 288 | { | 288 | { |
| 289 | struct acpi_bus_type *type = acpi_get_bus_type(dev); | 289 | struct acpi_bus_type *type = acpi_get_bus_type(dev); |
| 290 | struct acpi_device *adev; | ||
| 290 | int ret; | 291 | int ret; |
| 291 | 292 | ||
| 292 | ret = acpi_bind_one(dev, NULL); | 293 | ret = acpi_bind_one(dev, NULL); |
| @@ -303,9 +304,14 @@ static int acpi_platform_notify(struct device *dev) | |||
| 303 | if (ret) | 304 | if (ret) |
| 304 | goto out; | 305 | goto out; |
| 305 | } | 306 | } |
| 307 | adev = ACPI_COMPANION(dev); | ||
| 308 | if (!adev) | ||
| 309 | goto out; | ||
| 306 | 310 | ||
| 307 | if (type && type->setup) | 311 | if (type && type->setup) |
| 308 | type->setup(dev); | 312 | type->setup(dev); |
| 313 | else if (adev->handler && adev->handler->bind) | ||
| 314 | adev->handler->bind(dev); | ||
| 309 | 315 | ||
| 310 | out: | 316 | out: |
| 311 | #if ACPI_GLUE_DEBUG | 317 | #if ACPI_GLUE_DEBUG |
| @@ -324,11 +330,17 @@ static int acpi_platform_notify(struct device *dev) | |||
| 324 | 330 | ||
| 325 | static int acpi_platform_notify_remove(struct device *dev) | 331 | static int acpi_platform_notify_remove(struct device *dev) |
| 326 | { | 332 | { |
| 333 | struct acpi_device *adev = ACPI_COMPANION(dev); | ||
| 327 | struct acpi_bus_type *type; | 334 | struct acpi_bus_type *type; |
| 328 | 335 | ||
| 336 | if (!adev) | ||
| 337 | return 0; | ||
| 338 | |||
| 329 | type = acpi_get_bus_type(dev); | 339 | type = acpi_get_bus_type(dev); |
| 330 | if (type && type->cleanup) | 340 | if (type && type->cleanup) |
| 331 | type->cleanup(dev); | 341 | type->cleanup(dev); |
| 342 | else if (adev->handler && adev->handler->unbind) | ||
| 343 | adev->handler->unbind(dev); | ||
| 332 | 344 | ||
| 333 | acpi_unbind_one(dev); | 345 | acpi_unbind_one(dev); |
| 334 | return 0; | 346 | return 0; |
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index 57b053f424d1..9c4581fd5827 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c | |||
| @@ -2015,13 +2015,14 @@ static int acpi_scan_attach_handler(struct acpi_device *device) | |||
| 2015 | 2015 | ||
| 2016 | handler = acpi_scan_match_handler(hwid->id, &devid); | 2016 | handler = acpi_scan_match_handler(hwid->id, &devid); |
| 2017 | if (handler) { | 2017 | if (handler) { |
| 2018 | device->handler = handler; | ||
| 2018 | ret = handler->attach(device, devid); | 2019 | ret = handler->attach(device, devid); |
| 2019 | if (ret > 0) { | 2020 | if (ret > 0) |
| 2020 | device->handler = handler; | ||
| 2021 | break; | 2021 | break; |
| 2022 | } else if (ret < 0) { | 2022 | |
| 2023 | device->handler = NULL; | ||
| 2024 | if (ret < 0) | ||
| 2023 | break; | 2025 | break; |
| 2024 | } | ||
| 2025 | } | 2026 | } |
| 2026 | } | 2027 | } |
| 2027 | return ret; | 2028 | return ret; |
diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h index 8256eb4ad057..c93bce469492 100644 --- a/include/acpi/acpi_bus.h +++ b/include/acpi/acpi_bus.h | |||
| @@ -133,6 +133,8 @@ struct acpi_scan_handler { | |||
| 133 | struct list_head list_node; | 133 | struct list_head list_node; |
| 134 | int (*attach)(struct acpi_device *dev, const struct acpi_device_id *id); | 134 | int (*attach)(struct acpi_device *dev, const struct acpi_device_id *id); |
| 135 | void (*detach)(struct acpi_device *dev); | 135 | void (*detach)(struct acpi_device *dev); |
| 136 | void (*bind)(struct device *phys_dev); | ||
| 137 | void (*unbind)(struct device *phys_dev); | ||
| 136 | struct acpi_hotplug_profile hotplug; | 138 | struct acpi_hotplug_profile hotplug; |
| 137 | }; | 139 | }; |
| 138 | 140 | ||
