diff options
Diffstat (limited to 'drivers/base/power/sysfs.c')
| -rw-r--r-- | drivers/base/power/sysfs.c | 47 | 
1 files changed, 47 insertions, 0 deletions
| diff --git a/drivers/base/power/sysfs.c b/drivers/base/power/sysfs.c index adf41be0ea66..95c12f6cb5b9 100644 --- a/drivers/base/power/sysfs.c +++ b/drivers/base/power/sysfs.c @@ -5,6 +5,7 @@  #include <linux/device.h>  #include <linux/string.h>  #include <linux/export.h> +#include <linux/pm_qos.h>  #include <linux/pm_runtime.h>  #include <linux/atomic.h>  #include <linux/jiffies.h> @@ -217,6 +218,31 @@ static ssize_t autosuspend_delay_ms_store(struct device *dev,  static DEVICE_ATTR(autosuspend_delay_ms, 0644, autosuspend_delay_ms_show,  		autosuspend_delay_ms_store); +static ssize_t pm_qos_latency_show(struct device *dev, +				   struct device_attribute *attr, char *buf) +{ +	return sprintf(buf, "%d\n", dev->power.pq_req->node.prio); +} + +static ssize_t pm_qos_latency_store(struct device *dev, +				    struct device_attribute *attr, +				    const char *buf, size_t n) +{ +	s32 value; +	int ret; + +	if (kstrtos32(buf, 0, &value)) +		return -EINVAL; + +	if (value < 0) +		return -EINVAL; + +	ret = dev_pm_qos_update_request(dev->power.pq_req, value); +	return ret < 0 ? ret : n; +} + +static DEVICE_ATTR(pm_qos_resume_latency_us, 0644, +		   pm_qos_latency_show, pm_qos_latency_store);  #endif /* CONFIG_PM_RUNTIME */  #ifdef CONFIG_PM_SLEEP @@ -490,6 +516,17 @@ static struct attribute_group pm_runtime_attr_group = {  	.attrs	= runtime_attrs,  }; +static struct attribute *pm_qos_attrs[] = { +#ifdef CONFIG_PM_RUNTIME +	&dev_attr_pm_qos_resume_latency_us.attr, +#endif /* CONFIG_PM_RUNTIME */ +	NULL, +}; +static struct attribute_group pm_qos_attr_group = { +	.name	= power_group_name, +	.attrs	= pm_qos_attrs, +}; +  int dpm_sysfs_add(struct device *dev)  {  	int rc; @@ -530,6 +567,16 @@ void wakeup_sysfs_remove(struct device *dev)  	sysfs_unmerge_group(&dev->kobj, &pm_wakeup_attr_group);  } +int pm_qos_sysfs_add(struct device *dev) +{ +	return sysfs_merge_group(&dev->kobj, &pm_qos_attr_group); +} + +void pm_qos_sysfs_remove(struct device *dev) +{ +	sysfs_unmerge_group(&dev->kobj, &pm_qos_attr_group); +} +  void rpm_sysfs_remove(struct device *dev)  {  	sysfs_unmerge_group(&dev->kobj, &pm_runtime_attr_group); | 
