Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

+28 -10
+4 -2
Documentation/power/pm_qos_interface.txt
··· 134 134 PM_QOS_FLAGS_UNDEFINED: The device's PM QoS structure has not been 135 135 initialized or the list of requests is empty. 136 136 137 - int dev_pm_qos_add_ancestor_request(dev, handle, value) 137 + int dev_pm_qos_add_ancestor_request(dev, handle, type, value) 138 138 Add a PM QoS request for the first direct ancestor of the given device whose 139 - power.ignore_children flag is unset. 139 + power.ignore_children flag is unset (for DEV_PM_QOS_RESUME_LATENCY requests) 140 + or whose power.set_latency_tolerance callback pointer is not NULL (for 141 + DEV_PM_QOS_LATENCY_TOLERANCE requests). 140 142 141 143 int dev_pm_qos_expose_latency_limit(device, value) 142 144 Add a request to the device's PM QoS list of resume latency constraints and
+17 -5
drivers/base/power/qos.c
··· 565 565 * dev_pm_qos_add_ancestor_request - Add PM QoS request for device's ancestor. 566 566 * @dev: Device whose ancestor to add the request for. 567 567 * @req: Pointer to the preallocated handle. 568 + * @type: Type of the request. 568 569 * @value: Constraint latency value. 569 570 */ 570 571 int dev_pm_qos_add_ancestor_request(struct device *dev, 571 - struct dev_pm_qos_request *req, s32 value) 572 + struct dev_pm_qos_request *req, 573 + enum dev_pm_qos_req_type type, s32 value) 572 574 { 573 575 struct device *ancestor = dev->parent; 574 576 int ret = -ENODEV; 575 577 576 - while (ancestor && !ancestor->power.ignore_children) 577 - ancestor = ancestor->parent; 578 + switch (type) { 579 + case DEV_PM_QOS_RESUME_LATENCY: 580 + while (ancestor && !ancestor->power.ignore_children) 581 + ancestor = ancestor->parent; 578 582 583 + break; 584 + case DEV_PM_QOS_LATENCY_TOLERANCE: 585 + while (ancestor && !ancestor->power.set_latency_tolerance) 586 + ancestor = ancestor->parent; 587 + 588 + break; 589 + default: 590 + ancestor = NULL; 591 + } 579 592 if (ancestor) 580 - ret = dev_pm_qos_add_request(ancestor, req, 581 - DEV_PM_QOS_RESUME_LATENCY, value); 593 + ret = dev_pm_qos_add_request(ancestor, req, type, value); 582 594 583 595 if (ret < 0) 584 596 req->dev = NULL;
+2 -1
drivers/input/touchscreen/st1232.c
··· 134 134 } else if (!ts->low_latency_req.dev) { 135 135 /* First contact, request 100 us latency. */ 136 136 dev_pm_qos_add_ancestor_request(&ts->client->dev, 137 - &ts->low_latency_req, 100); 137 + &ts->low_latency_req, 138 + DEV_PM_QOS_RESUME_LATENCY, 100); 138 139 } 139 140 140 141 /* SYN_REPORT */
+5 -2
include/linux/pm_qos.h
··· 149 149 void dev_pm_qos_constraints_init(struct device *dev); 150 150 void dev_pm_qos_constraints_destroy(struct device *dev); 151 151 int dev_pm_qos_add_ancestor_request(struct device *dev, 152 - struct dev_pm_qos_request *req, s32 value); 152 + struct dev_pm_qos_request *req, 153 + enum dev_pm_qos_req_type type, s32 value); 153 154 #else 154 155 static inline enum pm_qos_flags_status __dev_pm_qos_flags(struct device *dev, 155 156 s32 mask) ··· 193 192 dev->power.power_state = PMSG_INVALID; 194 193 } 195 194 static inline int dev_pm_qos_add_ancestor_request(struct device *dev, 196 - struct dev_pm_qos_request *req, s32 value) 195 + struct dev_pm_qos_request *req, 196 + enum dev_pm_qos_req_type type, 197 + s32 value) 197 198 { return 0; } 198 199 #endif 199 200