diff mbox

[1/2] acpi: introduce swset flag for power_state

Message ID 1352426096-15116-2-git-send-email-aaron.lu@intel.com (mailing list archive)
State Changes Requested, archived
Headers show

Commit Message

Aaron Lu Nov. 9, 2012, 1:54 a.m. UTC
Currently we have valid flag to represent if this ACPI device power
state is valid. A device power state is valid does not necessarily mean
we, as OSPM, has a mean to put the device into that power state, e.g. D3
cold is always a valid power state for any ACPI device, but if there is
no _PS3 or _PRx for this device, we can't really put that device into
D3 cold power state. The same is true for D0 power state.

So here comes the swset flag, which is only set if the device has
provided us the required means to put it into that power state, e.g. if
we have _PS3 or _PRx, we can put the device into D3 cold state and thus,
D3 cold power state's swset flag will be set in this case.

This flag is mainly used to check if firmware has provided us a way to
put the device into D3 cold state, as the valid flag for D3 cold is
always true.

Signed-off-by: Aaron Lu <aaron.lu@intel.com>
---
 drivers/acpi/scan.c     | 9 ++++++++-
 include/acpi/acpi_bus.h | 1 +
 2 files changed, 9 insertions(+), 1 deletion(-)

Comments

Rafael Wysocki Nov. 21, 2012, 12:11 a.m. UTC | #1
On Friday, November 09, 2012 09:54:55 AM Aaron Lu wrote:
> Currently we have valid flag to represent if this ACPI device power
> state is valid. A device power state is valid does not necessarily mean
> we, as OSPM, has a mean to put the device into that power state, e.g. D3
> cold is always a valid power state for any ACPI device, but if there is
> no _PS3 or _PRx for this device, we can't really put that device into
> D3 cold power state. The same is true for D0 power state.
> 
> So here comes the swset flag, which is only set if the device has
> provided us the required means to put it into that power state, e.g. if
> we have _PS3 or _PRx, we can put the device into D3 cold state and thus,
> D3 cold power state's swset flag will be set in this case.
> 
> This flag is mainly used to check if firmware has provided us a way to
> put the device into D3 cold state, as the valid flag for D3 cold is
> always true.

I would prefer the new flag to be called os_accessible.  The meaning of it
would be more clear this way in my opinion.

Please also fold patch [2/2] into [1/2].

Apart from this it looks OK.

Thanks,
Rafael


> Signed-off-by: Aaron Lu <aaron.lu@intel.com>
> ---
>  drivers/acpi/scan.c     | 9 ++++++++-
>  include/acpi/acpi_bus.h | 1 +
>  2 files changed, 9 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
> index 95ff1e8..60d271a 100644
> --- a/drivers/acpi/scan.c
> +++ b/drivers/acpi/scan.c
> @@ -1038,8 +1038,10 @@ static int acpi_bus_get_power_flags(struct acpi_device *device)
>  		 * D3hot is only valid if _PR3 present.
>  		 */
>  		if (ps->resources.count ||
> -		    (ps->flags.explicit_set && i < ACPI_STATE_D3_HOT))
> +		    (ps->flags.explicit_set && i < ACPI_STATE_D3_HOT)) {
>  			ps->flags.valid = 1;
> +			ps->flags.swset = 1;
> +		}
>  
>  		ps->power = -1;	/* Unknown - driver assigned */
>  		ps->latency = -1;	/* Unknown - driver assigned */
> @@ -1055,6 +1057,11 @@ static int acpi_bus_get_power_flags(struct acpi_device *device)
>  	if (device->power.states[ACPI_STATE_D3_HOT].flags.explicit_set)
>  		device->power.states[ACPI_STATE_D3_COLD].flags.explicit_set = 1;
>  
> +	/* Presence of _PS3 or _PRx means we can put the device into D3 cold */
> +	if (device->power.states[ACPI_STATE_D3_HOT].flags.explicit_set ||
> +			device->power.flags.power_resources)
> +		device->power.states[ACPI_STATE_D3_COLD].flags.swset = 1;
> +
>  	acpi_bus_init_power(device);
>  
>  	return 0;
> diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h
> index 2242c10..7d20617 100644
> --- a/include/acpi/acpi_bus.h
> +++ b/include/acpi/acpi_bus.h
> @@ -200,6 +200,7 @@ struct acpi_device_power_flags {
>  struct acpi_device_power_state {
>  	struct {
>  		u8 valid:1;
> +		u8 swset:1;
>  		u8 explicit_set:1;	/* _PSx present? */
>  		u8 reserved:6;
>  	} flags;
>
diff mbox

Patch

diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
index 95ff1e8..60d271a 100644
--- a/drivers/acpi/scan.c
+++ b/drivers/acpi/scan.c
@@ -1038,8 +1038,10 @@  static int acpi_bus_get_power_flags(struct acpi_device *device)
 		 * D3hot is only valid if _PR3 present.
 		 */
 		if (ps->resources.count ||
-		    (ps->flags.explicit_set && i < ACPI_STATE_D3_HOT))
+		    (ps->flags.explicit_set && i < ACPI_STATE_D3_HOT)) {
 			ps->flags.valid = 1;
+			ps->flags.swset = 1;
+		}
 
 		ps->power = -1;	/* Unknown - driver assigned */
 		ps->latency = -1;	/* Unknown - driver assigned */
@@ -1055,6 +1057,11 @@  static int acpi_bus_get_power_flags(struct acpi_device *device)
 	if (device->power.states[ACPI_STATE_D3_HOT].flags.explicit_set)
 		device->power.states[ACPI_STATE_D3_COLD].flags.explicit_set = 1;
 
+	/* Presence of _PS3 or _PRx means we can put the device into D3 cold */
+	if (device->power.states[ACPI_STATE_D3_HOT].flags.explicit_set ||
+			device->power.flags.power_resources)
+		device->power.states[ACPI_STATE_D3_COLD].flags.swset = 1;
+
 	acpi_bus_init_power(device);
 
 	return 0;
diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h
index 2242c10..7d20617 100644
--- a/include/acpi/acpi_bus.h
+++ b/include/acpi/acpi_bus.h
@@ -200,6 +200,7 @@  struct acpi_device_power_flags {
 struct acpi_device_power_state {
 	struct {
 		u8 valid:1;
+		u8 swset:1;
 		u8 explicit_set:1;	/* _PSx present? */
 		u8 reserved:6;
 	} flags;