summaryrefslogtreecommitdiffstats
path: root/drivers/acpi/scan.c
diff options
context:
space:
mode:
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>2013-11-22 21:55:20 +0100
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2013-11-22 21:55:20 +0100
commit3338db0057ed9f554050bd06863731c515d79672 (patch)
tree6837d33aa7deba306990e8c89413a38d44f77368 /drivers/acpi/scan.c
parentc27b2c33b6215eeb3d5c290ac889ab6d543f6207 (diff)
ACPI / hotplug: Make ACPI PCI root hotplug use common hotplug code
Rework the common ACPI device hotplug code so that it is suitable for PCI host bridge hotplug and switch the PCI host bridge scan handler to using the common hotplug code. This allows quite a few lines of code that are not necessary any more to be dropped from the PCI host bridge scan handler and removes arbitrary differences in behavior between PCI host bridge hotplug and ACPI-based hotplug of other components, like CPUs and memory. Also acpi_device_hotplug() can be static now. Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Tested-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Diffstat (limited to 'drivers/acpi/scan.c')
-rw-r--r--drivers/acpi/scan.c42
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)
{
int error;
- /*
- * This function is only called for device objects for which matching
- * scan handlers exist. The only situation in which the scan handler is
- * not attached to this device object yet is when the device has just
- * appeared (either it wasn't present at all before or it was removed
- * and then added again).
- */
- if (adev->handler) {
- dev_warn(&adev->dev, "Already enumerated\n");
- return -EBUSY;
- }
error = acpi_bus_scan(adev->handle);
if (error) {
dev_warn(&adev->dev, "Namespace scan failure\n");
@@ -309,10 +298,11 @@ static int acpi_scan_device_check(struct acpi_device *adev)
return 0;
}
-void acpi_device_hotplug(void *data, u32 src)
+static void acpi_device_hotplug(void *data, u32 src)
{
u32 ost_code = ACPI_OST_SC_NON_SPECIFIC_FAILURE;
struct acpi_device *adev = data;
+ struct acpi_scan_handler *handler;
int error;
lock_device_hotplug();
@@ -326,12 +316,32 @@ void acpi_device_hotplug(void *data, u32 src)
if (adev->handle == INVALID_ACPI_HANDLE)
goto out;
+ handler = adev->handler;
+
switch (src) {
case ACPI_NOTIFY_BUS_CHECK:
- error = acpi_bus_scan(adev->handle);
+ if (handler) {
+ error = handler->hotplug.scan_dependent ?
+ handler->hotplug.scan_dependent(adev) :
+ acpi_bus_scan(adev->handle);
+ } else {
+ error = acpi_scan_device_check(adev);
+ }
break;
case ACPI_NOTIFY_DEVICE_CHECK:
- error = acpi_scan_device_check(adev);
+ /*
+ * This code is only run for device objects for which matching
+ * scan handlers exist. The only situation in which the scan
+ * handler is not attached to this device object yet is when the
+ * device has just appeared (either it wasn't present at all
+ * before or it was removed and then added again).
+ */
+ if (adev->handler) {
+ dev_warn(&adev->dev, "Already enumerated\n");
+ error = -EBUSY;
+ } else {
+ error = acpi_scan_device_check(adev);
+ }
break;
case ACPI_NOTIFY_EJECT_REQUEST:
case ACPI_OST_EC_OSPM_EJECT:
@@ -1805,7 +1815,7 @@ static void acpi_scan_init_hotplug(acpi_handle handle, int type)
*/
list_for_each_entry(hwid, &pnp.ids, list) {
handler = acpi_scan_match_handler(hwid->id, NULL);
- if (handler && !handler->hotplug.ignore) {
+ if (handler) {
acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY,
acpi_hotplug_notify_cb, handler);
break;
@@ -2083,8 +2093,6 @@ int __init acpi_scan_init(void)
acpi_update_all_gpes();
- acpi_pci_root_hp_init();
-
out:
mutex_unlock(&acpi_scan_lock);
return result;