Commit 71d821fd authored by Rafael J. Wysocki's avatar Rafael J. Wysocki

PM / QoS: Add type to dev_pm_qos_add_ancestor_request() arguments

Rework dev_pm_qos_add_ancestor_request() so that device PM QoS type
is passed to it as the third argument and make it support the
DEV_PM_QOS_LATENCY_TOLERANCE device PM QoS type (in addition to
DEV_PM_QOS_RESUME_LATENCY).

That will allow the drivers of devices without latency tolerance
hardware support to use their ancestors having it as proxies for
their latency tolerance requirements.
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 1a8f8351
...@@ -134,9 +134,11 @@ The meaning of the return values is as follows: ...@@ -134,9 +134,11 @@ The meaning of the return values is as follows:
PM_QOS_FLAGS_UNDEFINED: The device's PM QoS structure has not been PM_QOS_FLAGS_UNDEFINED: The device's PM QoS structure has not been
initialized or the list of requests is empty. initialized or the list of requests is empty.
int dev_pm_qos_add_ancestor_request(dev, handle, value) int dev_pm_qos_add_ancestor_request(dev, handle, type, value)
Add a PM QoS request for the first direct ancestor of the given device whose Add a PM QoS request for the first direct ancestor of the given device whose
power.ignore_children flag is unset. power.ignore_children flag is unset (for DEV_PM_QOS_RESUME_LATENCY requests)
or whose power.set_latency_tolerance callback pointer is not NULL (for
DEV_PM_QOS_LATENCY_TOLERANCE requests).
int dev_pm_qos_expose_latency_limit(device, value) int dev_pm_qos_expose_latency_limit(device, value)
Add a request to the device's PM QoS list of resume latency constraints and Add a request to the device's PM QoS list of resume latency constraints and
......
...@@ -565,20 +565,32 @@ EXPORT_SYMBOL_GPL(dev_pm_qos_remove_global_notifier); ...@@ -565,20 +565,32 @@ EXPORT_SYMBOL_GPL(dev_pm_qos_remove_global_notifier);
* dev_pm_qos_add_ancestor_request - Add PM QoS request for device's ancestor. * dev_pm_qos_add_ancestor_request - Add PM QoS request for device's ancestor.
* @dev: Device whose ancestor to add the request for. * @dev: Device whose ancestor to add the request for.
* @req: Pointer to the preallocated handle. * @req: Pointer to the preallocated handle.
* @type: Type of the request.
* @value: Constraint latency value. * @value: Constraint latency value.
*/ */
int dev_pm_qos_add_ancestor_request(struct device *dev, int dev_pm_qos_add_ancestor_request(struct device *dev,
struct dev_pm_qos_request *req, s32 value) struct dev_pm_qos_request *req,
enum dev_pm_qos_req_type type, s32 value)
{ {
struct device *ancestor = dev->parent; struct device *ancestor = dev->parent;
int ret = -ENODEV; int ret = -ENODEV;
while (ancestor && !ancestor->power.ignore_children) switch (type) {
ancestor = ancestor->parent; case DEV_PM_QOS_RESUME_LATENCY:
while (ancestor && !ancestor->power.ignore_children)
ancestor = ancestor->parent;
break;
case DEV_PM_QOS_LATENCY_TOLERANCE:
while (ancestor && !ancestor->power.set_latency_tolerance)
ancestor = ancestor->parent;
break;
default:
ancestor = NULL;
}
if (ancestor) if (ancestor)
ret = dev_pm_qos_add_request(ancestor, req, ret = dev_pm_qos_add_request(ancestor, req, type, value);
DEV_PM_QOS_RESUME_LATENCY, value);
if (ret < 0) if (ret < 0)
req->dev = NULL; req->dev = NULL;
......
...@@ -134,7 +134,8 @@ static irqreturn_t st1232_ts_irq_handler(int irq, void *dev_id) ...@@ -134,7 +134,8 @@ static irqreturn_t st1232_ts_irq_handler(int irq, void *dev_id)
} else if (!ts->low_latency_req.dev) { } else if (!ts->low_latency_req.dev) {
/* First contact, request 100 us latency. */ /* First contact, request 100 us latency. */
dev_pm_qos_add_ancestor_request(&ts->client->dev, dev_pm_qos_add_ancestor_request(&ts->client->dev,
&ts->low_latency_req, 100); &ts->low_latency_req,
DEV_PM_QOS_RESUME_LATENCY, 100);
} }
/* SYN_REPORT */ /* SYN_REPORT */
......
...@@ -149,7 +149,8 @@ int dev_pm_qos_remove_global_notifier(struct notifier_block *notifier); ...@@ -149,7 +149,8 @@ int dev_pm_qos_remove_global_notifier(struct notifier_block *notifier);
void dev_pm_qos_constraints_init(struct device *dev); void dev_pm_qos_constraints_init(struct device *dev);
void dev_pm_qos_constraints_destroy(struct device *dev); void dev_pm_qos_constraints_destroy(struct device *dev);
int dev_pm_qos_add_ancestor_request(struct device *dev, int dev_pm_qos_add_ancestor_request(struct device *dev,
struct dev_pm_qos_request *req, s32 value); struct dev_pm_qos_request *req,
enum dev_pm_qos_req_type type, s32 value);
#else #else
static inline enum pm_qos_flags_status __dev_pm_qos_flags(struct device *dev, static inline enum pm_qos_flags_status __dev_pm_qos_flags(struct device *dev,
s32 mask) s32 mask)
...@@ -192,7 +193,9 @@ static inline void dev_pm_qos_constraints_destroy(struct device *dev) ...@@ -192,7 +193,9 @@ static inline void dev_pm_qos_constraints_destroy(struct device *dev)
dev->power.power_state = PMSG_INVALID; dev->power.power_state = PMSG_INVALID;
} }
static inline int dev_pm_qos_add_ancestor_request(struct device *dev, static inline int dev_pm_qos_add_ancestor_request(struct device *dev,
struct dev_pm_qos_request *req, s32 value) struct dev_pm_qos_request *req,
enum dev_pm_qos_req_type type,
s32 value)
{ return 0; } { return 0; }
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment