diff options
author | Chanwoo Choi <cw00.choi@samsung.com> | 2014-05-09 03:43:09 -0400 |
---|---|---|
committer | MyungJoo Ham <myungjoo.ham@samsung.com> | 2014-05-24 09:33:41 -0400 |
commit | d5b040d0cab9cae1dc1ad61a07019062235f4878 (patch) | |
tree | 5a07548db72e502f84692e9fa7d9e14287ffd9cb | |
parent | 8cd84092d35e52372da2c3c3c2afb1a719917af2 (diff) |
PM / devfreq: Add devm_devfreq_{register,unregister}_opp_notfier function
This patch add resource-managed function for devfreq opp as following
functions. The devm_devfreq_register_opp_notifier() manages automatically
the registration of devfreq opp using device resource management.
- devm_devfreq_register_opp_notifier
- devm_devfreq_unregister_opp_notifier()
Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
Signed-off-by: MyungJoo Ham <myungjoo.ham@samsung.com>
-rw-r--r-- | drivers/devfreq/devfreq.c | 48 | ||||
-rw-r--r-- | include/linux/devfreq.h | 14 |
2 files changed, 62 insertions, 0 deletions
diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c index 8b6295d9d1f5..9f90369dd6bd 100644 --- a/drivers/devfreq/devfreq.c +++ b/drivers/devfreq/devfreq.c | |||
@@ -1169,6 +1169,54 @@ int devfreq_unregister_opp_notifier(struct device *dev, struct devfreq *devfreq) | |||
1169 | return ret; | 1169 | return ret; |
1170 | } | 1170 | } |
1171 | 1171 | ||
1172 | static void devm_devfreq_opp_release(struct device *dev, void *res) | ||
1173 | { | ||
1174 | devfreq_unregister_opp_notifier(dev, *(struct devfreq **)res); | ||
1175 | } | ||
1176 | |||
1177 | /** | ||
1178 | * devm_ devfreq_register_opp_notifier() | ||
1179 | * - Resource-managed devfreq_register_opp_notifier() | ||
1180 | * @dev: The devfreq user device. (parent of devfreq) | ||
1181 | * @devfreq: The devfreq object. | ||
1182 | */ | ||
1183 | int devm_devfreq_register_opp_notifier(struct device *dev, | ||
1184 | struct devfreq *devfreq) | ||
1185 | { | ||
1186 | struct devfreq **ptr; | ||
1187 | int ret; | ||
1188 | |||
1189 | ptr = devres_alloc(devm_devfreq_opp_release, sizeof(*ptr), GFP_KERNEL); | ||
1190 | if (!ptr) | ||
1191 | return -ENOMEM; | ||
1192 | |||
1193 | ret = devfreq_register_opp_notifier(dev, devfreq); | ||
1194 | if (ret) { | ||
1195 | devres_free(ptr); | ||
1196 | return ret; | ||
1197 | } | ||
1198 | |||
1199 | *ptr = devfreq; | ||
1200 | devres_add(dev, ptr); | ||
1201 | |||
1202 | return 0; | ||
1203 | } | ||
1204 | EXPORT_SYMBOL(devm_devfreq_register_opp_notifier); | ||
1205 | |||
1206 | /** | ||
1207 | * devm_devfreq_unregister_opp_notifier() | ||
1208 | * - Resource-managed devfreq_unregister_opp_notifier() | ||
1209 | * @dev: The devfreq user device. (parent of devfreq) | ||
1210 | * @devfreq: The devfreq object. | ||
1211 | */ | ||
1212 | void devm_devfreq_unregister_opp_notifier(struct device *dev, | ||
1213 | struct devfreq *devfreq) | ||
1214 | { | ||
1215 | WARN_ON(devres_release(dev, devm_devfreq_opp_release, | ||
1216 | devm_devfreq_dev_match, devfreq)); | ||
1217 | } | ||
1218 | EXPORT_SYMBOL(devm_devfreq_unregister_opp_notifier); | ||
1219 | |||
1172 | MODULE_AUTHOR("MyungJoo Ham <myungjoo.ham@samsung.com>"); | 1220 | MODULE_AUTHOR("MyungJoo Ham <myungjoo.ham@samsung.com>"); |
1173 | MODULE_DESCRIPTION("devfreq class support"); | 1221 | MODULE_DESCRIPTION("devfreq class support"); |
1174 | MODULE_LICENSE("GPL"); | 1222 | MODULE_LICENSE("GPL"); |
diff --git a/include/linux/devfreq.h b/include/linux/devfreq.h index 023d668a2cb5..f1863dcd83ea 100644 --- a/include/linux/devfreq.h +++ b/include/linux/devfreq.h | |||
@@ -199,6 +199,10 @@ extern int devfreq_register_opp_notifier(struct device *dev, | |||
199 | struct devfreq *devfreq); | 199 | struct devfreq *devfreq); |
200 | extern int devfreq_unregister_opp_notifier(struct device *dev, | 200 | extern int devfreq_unregister_opp_notifier(struct device *dev, |
201 | struct devfreq *devfreq); | 201 | struct devfreq *devfreq); |
202 | extern int devm_devfreq_register_opp_notifier(struct device *dev, | ||
203 | struct devfreq *devfreq); | ||
204 | extern void devm_devfreq_unregister_opp_notifier(struct device *dev, | ||
205 | struct devfreq *devfreq); | ||
202 | 206 | ||
203 | #if IS_ENABLED(CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND) | 207 | #if IS_ENABLED(CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND) |
204 | /** | 208 | /** |
@@ -275,6 +279,16 @@ static inline int devfreq_unregister_opp_notifier(struct device *dev, | |||
275 | return -EINVAL; | 279 | return -EINVAL; |
276 | } | 280 | } |
277 | 281 | ||
282 | static inline int devm_devfreq_register_opp_notifier(struct device *dev, | ||
283 | struct devfreq *devfreq) | ||
284 | { | ||
285 | return -EINVAL; | ||
286 | } | ||
287 | |||
288 | static inline void devm_devfreq_unregister_opp_notifier(struct device *dev, | ||
289 | struct devfreq *devfreq) | ||
290 | { | ||
291 | } | ||
278 | #endif /* CONFIG_PM_DEVFREQ */ | 292 | #endif /* CONFIG_PM_DEVFREQ */ |
279 | 293 | ||
280 | #endif /* __LINUX_DEVFREQ_H__ */ | 294 | #endif /* __LINUX_DEVFREQ_H__ */ |