提交 0b07ee94 编写于 作者: V Viresh Kumar 提交者: Rafael J. Wysocki

PM / QOS: Pass request type to dev_pm_qos_{add|remove}_notifier()

In order to use the same set of routines to register notifiers for
different request types, update the existing
dev_pm_qos_{add|remove}_notifier() routines with an additional
parameter: request-type.

For now, it only supports resume-latency request type but will be
extended to frequency limit (min/max) constraints later on.
Reviewed-by: NMatthias Kaehlcke <mka@chromium.org>
Reviewed-by: NUlf Hansson <ulf.hansson@linaro.org>
Signed-off-by: NViresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
上级 70a59fde
...@@ -164,12 +164,14 @@ directory. ...@@ -164,12 +164,14 @@ directory.
Notification mechanisms: Notification mechanisms:
The per-device PM QoS framework has a per-device notification tree. The per-device PM QoS framework has a per-device notification tree.
int dev_pm_qos_add_notifier(device, notifier): int dev_pm_qos_add_notifier(device, notifier, type):
Adds a notification callback function for the device. Adds a notification callback function for the device for a particular request
type.
The callback is called when the aggregated value of the device constraints list The callback is called when the aggregated value of the device constraints list
is changed (for resume latency device PM QoS only). is changed.
int dev_pm_qos_remove_notifier(device, notifier): int dev_pm_qos_remove_notifier(device, notifier, type):
Removes the notification callback function for the device. Removes the notification callback function for the device.
......
...@@ -1536,7 +1536,8 @@ static int genpd_add_device(struct generic_pm_domain *genpd, struct device *dev, ...@@ -1536,7 +1536,8 @@ static int genpd_add_device(struct generic_pm_domain *genpd, struct device *dev,
if (ret) if (ret)
genpd_free_dev_data(dev, gpd_data); genpd_free_dev_data(dev, gpd_data);
else else
dev_pm_qos_add_notifier(dev, &gpd_data->nb); dev_pm_qos_add_notifier(dev, &gpd_data->nb,
DEV_PM_QOS_RESUME_LATENCY);
return ret; return ret;
} }
...@@ -1569,7 +1570,8 @@ static int genpd_remove_device(struct generic_pm_domain *genpd, ...@@ -1569,7 +1570,8 @@ static int genpd_remove_device(struct generic_pm_domain *genpd,
pdd = dev->power.subsys_data->domain_data; pdd = dev->power.subsys_data->domain_data;
gpd_data = to_gpd_data(pdd); gpd_data = to_gpd_data(pdd);
dev_pm_qos_remove_notifier(dev, &gpd_data->nb); dev_pm_qos_remove_notifier(dev, &gpd_data->nb,
DEV_PM_QOS_RESUME_LATENCY);
genpd_lock(genpd); genpd_lock(genpd);
...@@ -1597,7 +1599,7 @@ static int genpd_remove_device(struct generic_pm_domain *genpd, ...@@ -1597,7 +1599,7 @@ static int genpd_remove_device(struct generic_pm_domain *genpd,
out: out:
genpd_unlock(genpd); genpd_unlock(genpd);
dev_pm_qos_add_notifier(dev, &gpd_data->nb); dev_pm_qos_add_notifier(dev, &gpd_data->nb, DEV_PM_QOS_RESUME_LATENCY);
return ret; return ret;
} }
......
...@@ -467,6 +467,7 @@ EXPORT_SYMBOL_GPL(dev_pm_qos_remove_request); ...@@ -467,6 +467,7 @@ EXPORT_SYMBOL_GPL(dev_pm_qos_remove_request);
* *
* @dev: target device for the constraint * @dev: target device for the constraint
* @notifier: notifier block managed by caller. * @notifier: notifier block managed by caller.
* @type: request type.
* *
* Will register the notifier into a notification chain that gets called * Will register the notifier into a notification chain that gets called
* upon changes to the target value for the device. * upon changes to the target value for the device.
...@@ -474,10 +475,14 @@ EXPORT_SYMBOL_GPL(dev_pm_qos_remove_request); ...@@ -474,10 +475,14 @@ EXPORT_SYMBOL_GPL(dev_pm_qos_remove_request);
* If the device's constraints object doesn't exist when this routine is called, * If the device's constraints object doesn't exist when this routine is called,
* it will be created (or error code will be returned if that fails). * it will be created (or error code will be returned if that fails).
*/ */
int dev_pm_qos_add_notifier(struct device *dev, struct notifier_block *notifier) int dev_pm_qos_add_notifier(struct device *dev, struct notifier_block *notifier,
enum dev_pm_qos_req_type type)
{ {
int ret = 0; int ret = 0;
if (WARN_ON(type != DEV_PM_QOS_RESUME_LATENCY))
return -EINVAL;
mutex_lock(&dev_pm_qos_mtx); mutex_lock(&dev_pm_qos_mtx);
if (IS_ERR(dev->power.qos)) if (IS_ERR(dev->power.qos))
...@@ -500,15 +505,20 @@ EXPORT_SYMBOL_GPL(dev_pm_qos_add_notifier); ...@@ -500,15 +505,20 @@ EXPORT_SYMBOL_GPL(dev_pm_qos_add_notifier);
* *
* @dev: target device for the constraint * @dev: target device for the constraint
* @notifier: notifier block to be removed. * @notifier: notifier block to be removed.
* @type: request type.
* *
* Will remove the notifier from the notification chain that gets called * Will remove the notifier from the notification chain that gets called
* upon changes to the target value. * upon changes to the target value.
*/ */
int dev_pm_qos_remove_notifier(struct device *dev, int dev_pm_qos_remove_notifier(struct device *dev,
struct notifier_block *notifier) struct notifier_block *notifier,
enum dev_pm_qos_req_type type)
{ {
int retval = 0; int retval = 0;
if (WARN_ON(type != DEV_PM_QOS_RESUME_LATENCY))
return -EINVAL;
mutex_lock(&dev_pm_qos_mtx); mutex_lock(&dev_pm_qos_mtx);
/* Silently return if the constraints object is not present. */ /* Silently return if the constraints object is not present. */
......
...@@ -146,9 +146,11 @@ int dev_pm_qos_add_request(struct device *dev, struct dev_pm_qos_request *req, ...@@ -146,9 +146,11 @@ int dev_pm_qos_add_request(struct device *dev, struct dev_pm_qos_request *req,
int dev_pm_qos_update_request(struct dev_pm_qos_request *req, s32 new_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_remove_request(struct dev_pm_qos_request *req);
int dev_pm_qos_add_notifier(struct device *dev, int dev_pm_qos_add_notifier(struct device *dev,
struct notifier_block *notifier); struct notifier_block *notifier,
enum dev_pm_qos_req_type type);
int dev_pm_qos_remove_notifier(struct device *dev, int dev_pm_qos_remove_notifier(struct device *dev,
struct notifier_block *notifier); struct notifier_block *notifier,
enum dev_pm_qos_req_type type);
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,
...@@ -202,10 +204,12 @@ static inline int dev_pm_qos_update_request(struct dev_pm_qos_request *req, ...@@ -202,10 +204,12 @@ static inline int dev_pm_qos_update_request(struct dev_pm_qos_request *req,
static inline int dev_pm_qos_remove_request(struct dev_pm_qos_request *req) static inline int dev_pm_qos_remove_request(struct dev_pm_qos_request *req)
{ return 0; } { return 0; }
static inline int dev_pm_qos_add_notifier(struct device *dev, static inline int dev_pm_qos_add_notifier(struct device *dev,
struct notifier_block *notifier) struct notifier_block *notifier,
enum dev_pm_qos_req_type type)
{ return 0; } { return 0; }
static inline int dev_pm_qos_remove_notifier(struct device *dev, static inline int dev_pm_qos_remove_notifier(struct device *dev,
struct notifier_block *notifier) struct notifier_block *notifier,
enum dev_pm_qos_req_type type)
{ return 0; } { return 0; }
static inline void dev_pm_qos_constraints_init(struct device *dev) static inline void dev_pm_qos_constraints_init(struct device *dev)
{ {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册