Commit ade3e7fe authored by Rafael J. Wysocki's avatar Rafael J. Wysocki Committed by Len Brown
Browse files

ACPI / PM: Add function for device power state initialization



Add function acpi_bus_init_power() for getting the initial power
state of an ACPI device and reference counting its power resources
as appropriate.

Make acpi_bus_get_power_flags() use the new function instead of
acpi_bus_get_power() that updates device->power.state without
reference counting the device's power resources.

Signed-off-by: default avatarRafael J. Wysocki <rjw@sisk.pl>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent 5e6d4fe4
Loading
Loading
Loading
Loading
+25 −0
Original line number Diff line number Diff line
@@ -364,6 +364,31 @@ int acpi_bus_set_power(acpi_handle handle, int state)

EXPORT_SYMBOL(acpi_bus_set_power);


int acpi_bus_init_power(struct acpi_device *device)
{
	int state;
	int result;

	if (!device)
		return -EINVAL;

	device->power.state = ACPI_STATE_UNKNOWN;

	result = __acpi_bus_get_power(device, &state);
	if (result)
		return result;

	if (device->power.flags.power_resources)
		result = acpi_power_on_resources(device, state);

	if (!result)
		device->power.state = state;

	return result;
}


bool acpi_bus_power_manageable(acpi_handle handle)
{
	struct acpi_device *device;
+1 −0
Original line number Diff line number Diff line
@@ -44,6 +44,7 @@ int acpi_device_sleep_wake(struct acpi_device *dev,
int acpi_power_get_inferred_state(struct acpi_device *device, int *state);
int acpi_power_on_resources(struct acpi_device *device, int state);
int acpi_power_transition(struct acpi_device *device, int state);
int acpi_bus_init_power(struct acpi_device *device);
extern int acpi_power_nocheck;

int acpi_wakeup_device_init(void);
+1 −4
Original line number Diff line number Diff line
@@ -901,10 +901,7 @@ static int acpi_bus_get_power_flags(struct acpi_device *device)
	device->power.states[ACPI_STATE_D3].flags.valid = 1;
	device->power.states[ACPI_STATE_D3].power = 0;

	/* TBD: System wake support and resource requirements. */

	device->power.state = ACPI_STATE_UNKNOWN;
	acpi_bus_get_power(device->handle, &(device->power.state));
	acpi_bus_init_power(device);

	return 0;
}