Merge branch 'pm-qos' into acpi-pm
This commit is contained in:
commit
048f35ff26
|
@ -258,19 +258,3 @@ Description:
|
||||||
|
|
||||||
This attribute has no effect on system-wide suspend/resume and
|
This attribute has no effect on system-wide suspend/resume and
|
||||||
hibernation.
|
hibernation.
|
||||||
|
|
||||||
What: /sys/devices/.../power/pm_qos_remote_wakeup
|
|
||||||
Date: September 2012
|
|
||||||
Contact: Rafael J. Wysocki <rjw@rjwysocki.net>
|
|
||||||
Description:
|
|
||||||
The /sys/devices/.../power/pm_qos_remote_wakeup attribute
|
|
||||||
is used for manipulating the PM QoS "remote wakeup required"
|
|
||||||
flag. If set, this flag indicates to the kernel that the
|
|
||||||
device is a source of user events that have to be signaled from
|
|
||||||
its low-power states.
|
|
||||||
|
|
||||||
Not all drivers support this attribute. If it isn't supported,
|
|
||||||
it is not present.
|
|
||||||
|
|
||||||
This attribute has no effect on system-wide suspend/resume and
|
|
||||||
hibernation.
|
|
||||||
|
|
|
@ -98,8 +98,7 @@ Values are updated in response to changes of the request list.
|
||||||
The target values of resume latency and active state latency tolerance are
|
The target values of resume latency and active state latency tolerance are
|
||||||
simply the minimum of the request values held in the parameter list elements.
|
simply the minimum of the request values held in the parameter list elements.
|
||||||
The PM QoS flags aggregate value is a gather (bitwise OR) of all list elements'
|
The PM QoS flags aggregate value is a gather (bitwise OR) of all list elements'
|
||||||
values. Two device PM QoS flags are defined currently: PM_QOS_FLAG_NO_POWER_OFF
|
values. One device PM QoS flag is defined currently: PM_QOS_FLAG_NO_POWER_OFF.
|
||||||
and PM_QOS_FLAG_REMOTE_WAKEUP.
|
|
||||||
|
|
||||||
Note: The aggregated target values are implemented in such a way that reading
|
Note: The aggregated target values are implemented in such a way that reading
|
||||||
the aggregated value does not require any locking mechanism.
|
the aggregated value does not require any locking mechanism.
|
||||||
|
@ -153,14 +152,14 @@ PM QoS list of resume latency constraints and remove sysfs attribute
|
||||||
pm_qos_resume_latency_us from the device's power directory.
|
pm_qos_resume_latency_us from the device's power directory.
|
||||||
|
|
||||||
int dev_pm_qos_expose_flags(device, value)
|
int dev_pm_qos_expose_flags(device, value)
|
||||||
Add a request to the device's PM QoS list of flags and create sysfs attributes
|
Add a request to the device's PM QoS list of flags and create sysfs attribute
|
||||||
pm_qos_no_power_off and pm_qos_remote_wakeup under the device's power directory
|
pm_qos_no_power_off under the device's power directory allowing user space to
|
||||||
allowing user space to change these flags' value.
|
change the value of the PM_QOS_FLAG_NO_POWER_OFF flag.
|
||||||
|
|
||||||
void dev_pm_qos_hide_flags(device)
|
void dev_pm_qos_hide_flags(device)
|
||||||
Drop the request added by dev_pm_qos_expose_flags() from the device's PM QoS list
|
Drop the request added by dev_pm_qos_expose_flags() from the device's PM QoS list
|
||||||
of flags and remove sysfs attributes pm_qos_no_power_off and pm_qos_remote_wakeup
|
of flags and remove sysfs attribute pm_qos_no_power_off from the device's power
|
||||||
under the device's power directory.
|
directory.
|
||||||
|
|
||||||
Notification mechanisms:
|
Notification mechanisms:
|
||||||
The per-device PM QoS framework has a per-device notification tree.
|
The per-device PM QoS framework has a per-device notification tree.
|
||||||
|
|
|
@ -581,8 +581,7 @@ static int acpi_dev_pm_get_state(struct device *dev, struct acpi_device *adev,
|
||||||
d_min = ret;
|
d_min = ret;
|
||||||
wakeup = device_may_wakeup(dev) && adev->wakeup.flags.valid
|
wakeup = device_may_wakeup(dev) && adev->wakeup.flags.valid
|
||||||
&& adev->wakeup.sleep_state >= target_state;
|
&& adev->wakeup.sleep_state >= target_state;
|
||||||
} else if (dev_pm_qos_flags(dev, PM_QOS_FLAG_REMOTE_WAKEUP) !=
|
} else {
|
||||||
PM_QOS_FLAGS_NONE) {
|
|
||||||
wakeup = adev->wakeup.flags.valid;
|
wakeup = adev->wakeup.flags.valid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -865,8 +864,7 @@ int acpi_dev_runtime_suspend(struct device *dev)
|
||||||
if (!adev)
|
if (!adev)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
remote_wakeup = dev_pm_qos_flags(dev, PM_QOS_FLAG_REMOTE_WAKEUP) >
|
remote_wakeup = acpi_device_can_wakeup(adev);
|
||||||
PM_QOS_FLAGS_NONE;
|
|
||||||
if (remote_wakeup) {
|
if (remote_wakeup) {
|
||||||
error = acpi_device_wakeup_enable(adev, ACPI_STATE_S0);
|
error = acpi_device_wakeup_enable(adev, ACPI_STATE_S0);
|
||||||
if (error)
|
if (error)
|
||||||
|
|
|
@ -346,9 +346,7 @@ static int genpd_power_off(struct generic_pm_domain *genpd, bool one_dev_on,
|
||||||
list_for_each_entry(pdd, &genpd->dev_list, list_node) {
|
list_for_each_entry(pdd, &genpd->dev_list, list_node) {
|
||||||
enum pm_qos_flags_status stat;
|
enum pm_qos_flags_status stat;
|
||||||
|
|
||||||
stat = dev_pm_qos_flags(pdd->dev,
|
stat = dev_pm_qos_flags(pdd->dev, PM_QOS_FLAG_NO_POWER_OFF);
|
||||||
PM_QOS_FLAG_NO_POWER_OFF
|
|
||||||
| PM_QOS_FLAG_REMOTE_WAKEUP);
|
|
||||||
if (stat > PM_QOS_FLAGS_NONE)
|
if (stat > PM_QOS_FLAGS_NONE)
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
|
|
||||||
|
|
|
@ -309,33 +309,6 @@ static ssize_t pm_qos_no_power_off_store(struct device *dev,
|
||||||
static DEVICE_ATTR(pm_qos_no_power_off, 0644,
|
static DEVICE_ATTR(pm_qos_no_power_off, 0644,
|
||||||
pm_qos_no_power_off_show, pm_qos_no_power_off_store);
|
pm_qos_no_power_off_show, pm_qos_no_power_off_store);
|
||||||
|
|
||||||
static ssize_t pm_qos_remote_wakeup_show(struct device *dev,
|
|
||||||
struct device_attribute *attr,
|
|
||||||
char *buf)
|
|
||||||
{
|
|
||||||
return sprintf(buf, "%d\n", !!(dev_pm_qos_requested_flags(dev)
|
|
||||||
& PM_QOS_FLAG_REMOTE_WAKEUP));
|
|
||||||
}
|
|
||||||
|
|
||||||
static ssize_t pm_qos_remote_wakeup_store(struct device *dev,
|
|
||||||
struct device_attribute *attr,
|
|
||||||
const char *buf, size_t n)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (kstrtoint(buf, 0, &ret))
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
if (ret != 0 && ret != 1)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
ret = dev_pm_qos_update_flags(dev, PM_QOS_FLAG_REMOTE_WAKEUP, ret);
|
|
||||||
return ret < 0 ? ret : n;
|
|
||||||
}
|
|
||||||
|
|
||||||
static DEVICE_ATTR(pm_qos_remote_wakeup, 0644,
|
|
||||||
pm_qos_remote_wakeup_show, pm_qos_remote_wakeup_store);
|
|
||||||
|
|
||||||
#ifdef CONFIG_PM_SLEEP
|
#ifdef CONFIG_PM_SLEEP
|
||||||
static const char _enabled[] = "enabled";
|
static const char _enabled[] = "enabled";
|
||||||
static const char _disabled[] = "disabled";
|
static const char _disabled[] = "disabled";
|
||||||
|
@ -671,7 +644,6 @@ static const struct attribute_group pm_qos_latency_tolerance_attr_group = {
|
||||||
|
|
||||||
static struct attribute *pm_qos_flags_attrs[] = {
|
static struct attribute *pm_qos_flags_attrs[] = {
|
||||||
&dev_attr_pm_qos_no_power_off.attr,
|
&dev_attr_pm_qos_no_power_off.attr,
|
||||||
&dev_attr_pm_qos_remote_wakeup.attr,
|
|
||||||
NULL,
|
NULL,
|
||||||
};
|
};
|
||||||
static const struct attribute_group pm_qos_flags_attr_group = {
|
static const struct attribute_group pm_qos_flags_attr_group = {
|
||||||
|
|
|
@ -39,7 +39,6 @@ enum pm_qos_flags_status {
|
||||||
#define PM_QOS_LATENCY_ANY ((s32)(~(__u32)0 >> 1))
|
#define PM_QOS_LATENCY_ANY ((s32)(~(__u32)0 >> 1))
|
||||||
|
|
||||||
#define PM_QOS_FLAG_NO_POWER_OFF (1 << 0)
|
#define PM_QOS_FLAG_NO_POWER_OFF (1 << 0)
|
||||||
#define PM_QOS_FLAG_REMOTE_WAKEUP (1 << 1)
|
|
||||||
|
|
||||||
struct pm_qos_request {
|
struct pm_qos_request {
|
||||||
struct plist_node node;
|
struct plist_node node;
|
||||||
|
|
Loading…
Reference in New Issue