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

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>

authored by

Chanwoo Choi and committed by
MyungJoo Ham
d5b040d0 8cd84092

+62
+48
drivers/devfreq/devfreq.c
··· 1169 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 1220 MODULE_AUTHOR("MyungJoo Ham <myungjoo.ham@samsung.com>"); 1173 1221 MODULE_DESCRIPTION("devfreq class support"); 1174 1222 MODULE_LICENSE("GPL");
+14
include/linux/devfreq.h
··· 199 199 struct devfreq *devfreq); 200 200 extern int devfreq_unregister_opp_notifier(struct device *dev, 201 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 207 #if IS_ENABLED(CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND) 204 208 /** ··· 279 275 return -EINVAL; 280 276 } 281 277 278 + static inline int devm_devfreq_register_opp_notifier(struct device *dev, 279 + struct devfreq *devfreq) 280 + { 281 + return -EINVAL; 282 + } 283 + 284 + static inline void devm_devfreq_unregister_opp_notifier(struct device *dev, 285 + struct devfreq *devfreq) 286 + { 287 + } 282 288 #endif /* CONFIG_PM_DEVFREQ */ 283 289 284 290 #endif /* __LINUX_DEVFREQ_H__ */