diff mbox series

[RFC,4/4] PM / QoS: Add dev_pm_qos_get_curr_value

Message ID 9d1620026842209841a122e17fa7686d02fa23e9.1565089196.git.leonard.crestez@nxp.com (mailing list archive)
State RFC, archived
Headers show
Series opp: Parse required-opp as dev_pm_qos_request | expand

Commit Message

Leonard Crestez Aug. 6, 2019, 11:12 a.m. UTC
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(-)
diff mbox series

Patch

diff --git a/drivers/base/power/qos.c b/drivers/base/power/qos.c
index 6c90fd7e2ff8..f171a7137c5d 100644
--- a/drivers/base/power/qos.c
+++ b/drivers/base/power/qos.c
@@ -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);
 
diff --git a/include/linux/pm_qos.h b/include/linux/pm_qos.h
index 2aebbc5b9950..ae42e58d02bb 100644
--- a/include/linux/pm_qos.h
+++ b/include/linux/pm_qos.h
@@ -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);