* pm-qos: sh_mmcif / PM: Use PM QoS latency constraint tmio_mmc / PM: Use PM QoS latency constraint PM / QoS: Make it possible to expose PM QoS latency constraints
···165165166166 Not all drivers support this attribute. If it isn't supported,167167 attempts to read or write it will yield I/O errors.168168+169169+What: /sys/devices/.../power/pm_qos_latency_us170170+Date: March 2012171171+Contact: Rafael J. Wysocki <rjw@sisk.pl>172172+Description:173173+ The /sys/devices/.../power/pm_qos_resume_latency_us attribute174174+ contains the PM QoS resume latency limit for the given device,175175+ which is the maximum allowed time it can take to resume the176176+ device, after it has been suspended at run time, from a resume177177+ request to the moment the device will be ready to process I/O,178178+ in microseconds. If it is equal to 0, however, this means that179179+ the PM QoS resume latency may be arbitrary.180180+181181+ Not all drivers support this attribute. If it isn't supported,182182+ it is not present.183183+184184+ This attribute has no effect on system-wide suspend/resume and185185+ hibernation.
···4141#include <linux/mutex.h>4242#include <linux/export.h>43434444+#include "power.h"44454546static DEFINE_MUTEX(dev_pm_qos_mtx);4647···166165{167166 struct dev_pm_qos_request *req, *tmp;168167 struct pm_qos_constraints *c;168168+169169+ /*170170+ * If the device's PM QoS resume latency limit has been exposed to user171171+ * space, it has to be hidden at this point.172172+ */173173+ dev_pm_qos_hide_latency_limit(dev);169174170175 mutex_lock(&dev_pm_qos_mtx);171176···452445 return error;453446}454447EXPORT_SYMBOL_GPL(dev_pm_qos_add_ancestor_request);448448+449449+#ifdef CONFIG_PM_RUNTIME450450+static void __dev_pm_qos_drop_user_request(struct device *dev)451451+{452452+ dev_pm_qos_remove_request(dev->power.pq_req);453453+ dev->power.pq_req = 0;454454+}455455+456456+/**457457+ * dev_pm_qos_expose_latency_limit - Expose PM QoS latency limit to user space.458458+ * @dev: Device whose PM QoS latency limit is to be exposed to user space.459459+ * @value: Initial value of the latency limit.460460+ */461461+int dev_pm_qos_expose_latency_limit(struct device *dev, s32 value)462462+{463463+ struct dev_pm_qos_request *req;464464+ int ret;465465+466466+ if (!device_is_registered(dev) || value < 0)467467+ return -EINVAL;468468+469469+ if (dev->power.pq_req)470470+ return -EEXIST;471471+472472+ req = kzalloc(sizeof(*req), GFP_KERNEL);473473+ if (!req)474474+ return -ENOMEM;475475+476476+ ret = dev_pm_qos_add_request(dev, req, value);477477+ if (ret < 0)478478+ return ret;479479+480480+ dev->power.pq_req = req;481481+ ret = pm_qos_sysfs_add(dev);482482+ if (ret)483483+ __dev_pm_qos_drop_user_request(dev);484484+485485+ return ret;486486+}487487+EXPORT_SYMBOL_GPL(dev_pm_qos_expose_latency_limit);488488+489489+/**490490+ * dev_pm_qos_hide_latency_limit - Hide PM QoS latency limit from user space.491491+ * @dev: Device whose PM QoS latency limit is to be hidden from user space.492492+ */493493+void dev_pm_qos_hide_latency_limit(struct device *dev)494494+{495495+ if (dev->power.pq_req) {496496+ pm_qos_sysfs_remove(dev);497497+ __dev_pm_qos_drop_user_request(dev);498498+ }499499+}500500+EXPORT_SYMBOL_GPL(dev_pm_qos_hide_latency_limit);501501+#endif /* CONFIG_PM_RUNTIME */