diff options
Diffstat (limited to 'drivers/acpi/scan.c')
-rw-r--r-- | drivers/acpi/scan.c | 42 |
1 files changed, 25 insertions, 17 deletions
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index dd0ff9de9277..18865c86c463 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c | |||
@@ -283,17 +283,6 @@ static int acpi_scan_device_check(struct acpi_device *adev) | |||
283 | { | 283 | { |
284 | int error; | 284 | int error; |
285 | 285 | ||
286 | /* | ||
287 | * This function is only called for device objects for which matching | ||
288 | * scan handlers exist. The only situation in which the scan handler is | ||
289 | * not attached to this device object yet is when the device has just | ||
290 | * appeared (either it wasn't present at all before or it was removed | ||
291 | * and then added again). | ||
292 | */ | ||
293 | if (adev->handler) { | ||
294 | dev_warn(&adev->dev, "Already enumerated\n"); | ||
295 | return -EBUSY; | ||
296 | } | ||
297 | error = acpi_bus_scan(adev->handle); | 286 | error = acpi_bus_scan(adev->handle); |
298 | if (error) { | 287 | if (error) { |
299 | dev_warn(&adev->dev, "Namespace scan failure\n"); | 288 | dev_warn(&adev->dev, "Namespace scan failure\n"); |
@@ -309,10 +298,11 @@ static int acpi_scan_device_check(struct acpi_device *adev) | |||
309 | return 0; | 298 | return 0; |
310 | } | 299 | } |
311 | 300 | ||
312 | void acpi_device_hotplug(void *data, u32 src) | 301 | static void acpi_device_hotplug(void *data, u32 src) |
313 | { | 302 | { |
314 | u32 ost_code = ACPI_OST_SC_NON_SPECIFIC_FAILURE; | 303 | u32 ost_code = ACPI_OST_SC_NON_SPECIFIC_FAILURE; |
315 | struct acpi_device *adev = data; | 304 | struct acpi_device *adev = data; |
305 | struct acpi_scan_handler *handler; | ||
316 | int error; | 306 | int error; |
317 | 307 | ||
318 | lock_device_hotplug(); | 308 | lock_device_hotplug(); |
@@ -326,12 +316,32 @@ void acpi_device_hotplug(void *data, u32 src) | |||
326 | if (adev->handle == INVALID_ACPI_HANDLE) | 316 | if (adev->handle == INVALID_ACPI_HANDLE) |
327 | goto out; | 317 | goto out; |
328 | 318 | ||
319 | handler = adev->handler; | ||
320 | |||
329 | switch (src) { | 321 | switch (src) { |
330 | case ACPI_NOTIFY_BUS_CHECK: | 322 | case ACPI_NOTIFY_BUS_CHECK: |
331 | error = acpi_bus_scan(adev->handle); | 323 | if (handler) { |
324 | error = handler->hotplug.scan_dependent ? | ||
325 | handler->hotplug.scan_dependent(adev) : | ||
326 | acpi_bus_scan(adev->handle); | ||
327 | } else { | ||
328 | error = acpi_scan_device_check(adev); | ||
329 | } | ||
332 | break; | 330 | break; |
333 | case ACPI_NOTIFY_DEVICE_CHECK: | 331 | case ACPI_NOTIFY_DEVICE_CHECK: |
334 | error = acpi_scan_device_check(adev); | 332 | /* |
333 | * This code is only run for device objects for which matching | ||
334 | * scan handlers exist. The only situation in which the scan | ||
335 | * handler is not attached to this device object yet is when the | ||
336 | * device has just appeared (either it wasn't present at all | ||
337 | * before or it was removed and then added again). | ||
338 | */ | ||
339 | if (adev->handler) { | ||
340 | dev_warn(&adev->dev, "Already enumerated\n"); | ||
341 | error = -EBUSY; | ||
342 | } else { | ||
343 | error = acpi_scan_device_check(adev); | ||
344 | } | ||
335 | break; | 345 | break; |
336 | case ACPI_NOTIFY_EJECT_REQUEST: | 346 | case ACPI_NOTIFY_EJECT_REQUEST: |
337 | case ACPI_OST_EC_OSPM_EJECT: | 347 | case ACPI_OST_EC_OSPM_EJECT: |
@@ -1805,7 +1815,7 @@ static void acpi_scan_init_hotplug(acpi_handle handle, int type) | |||
1805 | */ | 1815 | */ |
1806 | list_for_each_entry(hwid, &pnp.ids, list) { | 1816 | list_for_each_entry(hwid, &pnp.ids, list) { |
1807 | handler = acpi_scan_match_handler(hwid->id, NULL); | 1817 | handler = acpi_scan_match_handler(hwid->id, NULL); |
1808 | if (handler && !handler->hotplug.ignore) { | 1818 | if (handler) { |
1809 | acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY, | 1819 | acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY, |
1810 | acpi_hotplug_notify_cb, handler); | 1820 | acpi_hotplug_notify_cb, handler); |
1811 | break; | 1821 | break; |
@@ -2083,8 +2093,6 @@ int __init acpi_scan_init(void) | |||
2083 | 2093 | ||
2084 | acpi_update_all_gpes(); | 2094 | acpi_update_all_gpes(); |
2085 | 2095 | ||
2086 | acpi_pci_root_hp_init(); | ||
2087 | |||
2088 | out: | 2096 | out: |
2089 | mutex_unlock(&acpi_scan_lock); | 2097 | mutex_unlock(&acpi_scan_lock); |
2090 | return result; | 2098 | return result; |