Skip to content

Commit

Permalink
ACPI: scan: Simplify initialization of power and sleep buttons
Browse files Browse the repository at this point in the history
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: Rafael J. Wysocki <[email protected]>
Reviewed-by: Mika Westerberg <[email protected]>
Reviewed-by: Hans de Goede <[email protected]>
  • Loading branch information
rafaeljw committed Jan 12, 2022
1 parent b6c55b1 commit 681e718
Showing 1 changed file with 23 additions and 39 deletions.
62 changes: 23 additions & 39 deletions drivers/acpi/scan.c
Original file line number Diff line number Diff line change
Expand Up @@ -2486,42 +2486,33 @@ int acpi_bus_register_early_device(int type)
}
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)) {
struct acpi_device *device = 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);
struct acpi_device *adev = NULL;

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)) {
struct acpi_device *device = NULL;

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

device->flags.match_driver = true;
result = device_attach(&device->dev);
struct acpi_device *adev = NULL;

acpi_add_single_object(&adev, NULL, ACPI_BUS_TYPE_SLEEP_BUTTON,
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)
Expand Down Expand Up @@ -2601,15 +2592,8 @@ void __init acpi_scan_init(void)
goto out;

/* Fixed feature devices do not exist on HW-reduced platform */
if (!acpi_gbl_reduced_hardware) {
if (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;
}
}
if (!acpi_gbl_reduced_hardware)
acpi_bus_scan_fixed();

acpi_turn_off_unused_power_resources();

Expand Down

0 comments on commit 681e718

Please sign in to comment.