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: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
@@ -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);
|
|||||||
* 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)
|
|||||||
} 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);
|
|||||||
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)
|
|||||||
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
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user