@@ -402,10 +402,49 @@ int dev_pm_qos_add_request(struct device *dev, struct dev_pm_qos_request *req,
mutex_unlock(&dev_pm_qos_mtx);
return ret;
}
EXPORT_SYMBOL_GPL(dev_pm_qos_add_request);
+/**
+ * __dev_pm_qos_get_curr_value - Modify an existing device PM QoS request.
+ * @req : PM QoS request to query
+ */
+static int __dev_pm_qos_get_curr_value(struct dev_pm_qos_request *req,
+ s32 *curr_value)
+{
+ if (WARN(!dev_pm_qos_request_active(req),
+ "%s() called for unknown object\n", __func__))
+ return -EINVAL;
+
+ switch(req->type) {
+ case DEV_PM_QOS_RESUME_LATENCY:
+ case DEV_PM_QOS_LATENCY_TOLERANCE:
+ case DEV_PM_QOS_MIN_FREQUENCY:
+ case DEV_PM_QOS_MAX_FREQUENCY:
+ *curr_value = req->data.pnode.prio;
+ return 0;
+ case DEV_PM_QOS_FLAGS:
+ *curr_value = req->data.flr.flags;
+ return 0;
+ default:
+ return -EINVAL;
+ }
+}
+
+int dev_pm_qos_get_curr_value(struct dev_pm_qos_request *req,
+ s32 *curr_value)
+{
+ int ret;
+
+ mutex_lock(&dev_pm_qos_mtx);
+ ret = __dev_pm_qos_get_curr_value(req, curr_value);
+ mutex_unlock(&dev_pm_qos_mtx);
+
+ return ret;
+}
+EXPORT_SYMBOL_GPL(dev_pm_qos_get_curr_value);
+
/**
* __dev_pm_qos_update_request - Modify an existing device PM QoS request.
* @req : PM QoS request to modify.
* @new_value: New value to request.
*/
@@ -416,31 +455,17 @@ static int __dev_pm_qos_update_request(struct dev_pm_qos_request *req,
int ret = 0;
if (!req) /*guard against callers passing in null */
return -EINVAL;
- if (WARN(!dev_pm_qos_request_active(req),
- "%s() called for unknown object\n", __func__))
- return -EINVAL;
+ ret = __dev_pm_qos_get_curr_value(req, &curr_value);
+ if (ret)
+ return ret;
if (IS_ERR_OR_NULL(req->dev->power.qos))
return -ENODEV;
- switch(req->type) {
- case DEV_PM_QOS_RESUME_LATENCY:
- case DEV_PM_QOS_LATENCY_TOLERANCE:
- case DEV_PM_QOS_MIN_FREQUENCY:
- case DEV_PM_QOS_MAX_FREQUENCY:
- curr_value = req->data.pnode.prio;
- break;
- case DEV_PM_QOS_FLAGS:
- curr_value = req->data.flr.flags;
- break;
- default:
- return -EINVAL;
- }
-
trace_dev_pm_qos_update_request(dev_name(req->dev), req->type,
new_value);
if (curr_value != new_value)
ret = apply_constraint(req, PM_QOS_UPDATE_REQ, new_value);
@@ -149,10 +149,11 @@ enum pm_qos_flags_status __dev_pm_qos_flags(struct device *dev, s32 mask);
enum pm_qos_flags_status dev_pm_qos_flags(struct device *dev, s32 mask);
s32 __dev_pm_qos_resume_latency(struct device *dev);
s32 dev_pm_qos_read_value(struct device *dev, enum dev_pm_qos_req_type type);
int dev_pm_qos_add_request(struct device *dev, struct dev_pm_qos_request *req,
enum dev_pm_qos_req_type type, s32 value);
+int dev_pm_qos_get_curr_value(struct dev_pm_qos_request *req, s32 *value);
int dev_pm_qos_update_request(struct dev_pm_qos_request *req, s32 new_value);
int dev_pm_qos_remove_request(struct dev_pm_qos_request *req);
int dev_pm_qos_add_notifier(struct device *dev,
struct notifier_block *notifier,
enum dev_pm_qos_req_type type);
Add a new API for fetching the value set with dev_pm_qos_add_request by refactoring __dev_pm_qos_update_request. Signed-off-by: Leonard Crestez <leonard.crestez@nxp.com> --- drivers/base/power/qos.c | 59 ++++++++++++++++++++++++++++------------ include/linux/pm_qos.h | 1 + 2 files changed, 43 insertions(+), 17 deletions(-)