Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0feabb01 authored by Konstantin Karasyov's avatar Konstantin Karasyov Committed by Len Brown
Browse files

ACPI: create acpi_fan_suspend()/acpi_fan_resume()

parent 531881d6
Loading
Loading
Loading
Loading
+8 −6
Original line number Diff line number Diff line
@@ -205,6 +205,7 @@ int acpi_bus_set_power(acpi_handle handle, int state)
	 * Get device's current power state if it's unknown
	 * This means device power state isn't initialized or previous setting failed
	 */
	if (!device->flags.force_power_state) {
		if (device->power.state == ACPI_STATE_UNKNOWN)
			acpi_bus_get_power(device->handle, &device->power.state);
		if (state == device->power.state) {
@@ -212,6 +213,7 @@ int acpi_bus_set_power(acpi_handle handle, int state)
					  state));
			return_VALUE(0);
		}
	}
	if (!device->power.states[state].flags.valid) {
		ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Device does not support D%d\n",
				  state));
+40 −0
Original line number Diff line number Diff line
@@ -48,6 +48,8 @@ MODULE_LICENSE("GPL");

static int acpi_fan_add(struct acpi_device *device);
static int acpi_fan_remove(struct acpi_device *device, int type);
static int acpi_fan_suspend(struct acpi_device *device, int state);
static int acpi_fan_resume(struct acpi_device *device, int state);

static struct acpi_driver acpi_fan_driver = {
	.name = ACPI_FAN_DRIVER_NAME,
@@ -56,6 +58,8 @@ static struct acpi_driver acpi_fan_driver = {
	.ops = {
		.add = acpi_fan_add,
		.remove = acpi_fan_remove,
		.suspend = acpi_fan_suspend,
		.resume = acpi_fan_resume,
		},
};

@@ -206,6 +210,10 @@ static int acpi_fan_add(struct acpi_device *device)
		goto end;
	}

	device->flags.force_power_state = 1;
	acpi_bus_set_power(device->handle, state);
	device->flags.force_power_state = 0;

	result = acpi_fan_add_fs(device);
	if (result)
		goto end;
@@ -239,6 +247,38 @@ static int acpi_fan_remove(struct acpi_device *device, int type)
	return_VALUE(0);
}

static int acpi_fan_suspend(struct acpi_device *device, int state)
{
	if (!device)
		return -EINVAL;

	acpi_bus_set_power(device->handle, ACPI_STATE_D0);

	return AE_OK;
}

static int acpi_fan_resume(struct acpi_device *device, int state)
{
	int result = 0;
	int power_state = 0;

	if (!device)
		return -EINVAL;

	result = acpi_bus_get_power(device->handle, &power_state);
	if (result) {
		ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
				  "Error reading fan power state\n"));
		return result;
	}

	device->flags.force_power_state = 1;
	acpi_bus_set_power(device->handle, power_state);
	device->flags.force_power_state = 0;

	return result;
}

static int __init acpi_fan_init(void)
{
	int result = 0;
+2 −1
Original line number Diff line number Diff line
@@ -169,7 +169,8 @@ struct acpi_device_flags {
	u32 power_manageable:1;
	u32 performance_manageable:1;
	u32 wake_capable:1;	/* Wakeup(_PRW) supported? */
	u32 reserved:20;
	u32 force_power_state:1;
	u32 reserved:19;
};

/* File System */