diff options
| -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__ */ |
