Commit 681e7187 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki
Browse files

ACPI: scan: Simplify initialization of power and sleep buttons



It should be perfectly fine to use ACPI if the "fixed" power or sleep
buttons cannot be initialized.  Moreover, running acpi_bus_scan()
successfully on ACPI_ROOT_OBJECT generally causes many devices to
be enumerated and probed, possibly including the entire PCI bus, so
unregistering acpi_root if the registration of the "fixed" buttons
fails is rather unhelpful.

For this reason, do not fail acpi_scan_init() when
acpi_bus_scan_fixed() fails and turn the latter into a void function.

While at it, drop the outdated and misleading comment from
acpi_bus_scan_fixed().

Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
Reviewed-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
Reviewed-by: default avatarHans de Goede <hdegoede@redhat.com>
parent b6c55b16
Loading
Loading
Loading
Loading
+23 −39
Original line number Original line Diff line number Diff line
@@ -2486,42 +2486,33 @@ int acpi_bus_register_early_device(int type)
}
}
EXPORT_SYMBOL_GPL(acpi_bus_register_early_device);
EXPORT_SYMBOL_GPL(acpi_bus_register_early_device);


static int acpi_bus_scan_fixed(void)
static void acpi_bus_scan_fixed(void)
{
{
	int result = 0;

	/*
	 * Enumerate all fixed-feature devices.
	 */
	if (!(acpi_gbl_FADT.flags & ACPI_FADT_POWER_BUTTON)) {
	if (!(acpi_gbl_FADT.flags & ACPI_FADT_POWER_BUTTON)) {
		struct acpi_device *device = NULL;
		struct acpi_device *adev = NULL;

		result = acpi_add_single_object(&device, NULL,
						ACPI_BUS_TYPE_POWER_BUTTON, false);
		if (result)
			return result;

		device->flags.match_driver = true;
		result = device_attach(&device->dev);
		if (result < 0)
			return result;


		device_init_wakeup(&device->dev, true);
		acpi_add_single_object(&adev, NULL, ACPI_BUS_TYPE_POWER_BUTTON,
				       false);
		if (adev) {
			adev->flags.match_driver = true;
			if (device_attach(&adev->dev) >= 0)
				device_init_wakeup(&adev->dev, true);
			else
				dev_dbg(&adev->dev, "No driver\n");
		}
	}
	}


	if (!(acpi_gbl_FADT.flags & ACPI_FADT_SLEEP_BUTTON)) {
	if (!(acpi_gbl_FADT.flags & ACPI_FADT_SLEEP_BUTTON)) {
		struct acpi_device *device = NULL;
		struct acpi_device *adev = NULL;

		result = acpi_add_single_object(&device, NULL,
						ACPI_BUS_TYPE_SLEEP_BUTTON, false);
		if (result)
			return result;


		device->flags.match_driver = true;
		acpi_add_single_object(&adev, NULL, ACPI_BUS_TYPE_SLEEP_BUTTON,
		result = device_attach(&device->dev);
				       false);
		if (adev) {
			adev->flags.match_driver = true;
			if (device_attach(&adev->dev) < 0)
				dev_dbg(&adev->dev, "No driver\n");
		}
	}
	}

	return result < 0 ? result : 0;
}
}


static void __init acpi_get_spcr_uart_addr(void)
static void __init acpi_get_spcr_uart_addr(void)
@@ -2601,15 +2592,8 @@ void __init acpi_scan_init(void)
		goto out;
		goto out;


	/* Fixed feature devices do not exist on HW-reduced platform */
	/* Fixed feature devices do not exist on HW-reduced platform */
	if (!acpi_gbl_reduced_hardware) {
	if (!acpi_gbl_reduced_hardware)
		if (acpi_bus_scan_fixed()) {
		acpi_bus_scan_fixed();
			acpi_detach_data(acpi_root->handle,
					 acpi_scan_drop_device);
			acpi_device_del(acpi_root);
			acpi_bus_put_acpi_device(acpi_root);
			goto out;
		}
	}


	acpi_turn_off_unused_power_resources();
	acpi_turn_off_unused_power_resources();