Loading drivers/cpuidle/driver.c +28 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ static struct cpuidle_driver *cpuidle_curr_driver; DEFINE_SPINLOCK(cpuidle_driver_lock); int cpuidle_driver_refcount; static void __cpuidle_register_driver(struct cpuidle_driver *drv) { Loading Loading @@ -89,8 +90,34 @@ void cpuidle_unregister_driver(struct cpuidle_driver *drv) } spin_lock(&cpuidle_driver_lock); if (!WARN_ON(cpuidle_driver_refcount > 0)) cpuidle_curr_driver = NULL; spin_unlock(&cpuidle_driver_lock); } EXPORT_SYMBOL_GPL(cpuidle_unregister_driver); struct cpuidle_driver *cpuidle_driver_ref(void) { struct cpuidle_driver *drv; spin_lock(&cpuidle_driver_lock); drv = cpuidle_curr_driver; cpuidle_driver_refcount++; spin_unlock(&cpuidle_driver_lock); return drv; } void cpuidle_driver_unref(void) { spin_lock(&cpuidle_driver_lock); if (!WARN_ON(cpuidle_driver_refcount <= 0)) cpuidle_driver_refcount--; spin_unlock(&cpuidle_driver_lock); } include/linux/cpuidle.h +5 −1 Original line number Diff line number Diff line Loading @@ -136,7 +136,9 @@ struct cpuidle_driver { extern void disable_cpuidle(void); extern int cpuidle_idle_call(void); extern int cpuidle_register_driver(struct cpuidle_driver *drv); struct cpuidle_driver *cpuidle_get_driver(void); extern struct cpuidle_driver *cpuidle_get_driver(void); extern struct cpuidle_driver *cpuidle_driver_ref(void); extern void cpuidle_driver_unref(void); extern void cpuidle_unregister_driver(struct cpuidle_driver *drv); extern int cpuidle_register_device(struct cpuidle_device *dev); extern void cpuidle_unregister_device(struct cpuidle_device *dev); Loading @@ -157,6 +159,8 @@ static inline int cpuidle_idle_call(void) { return -ENODEV; } static inline int cpuidle_register_driver(struct cpuidle_driver *drv) {return -ENODEV; } static inline struct cpuidle_driver *cpuidle_get_driver(void) {return NULL; } static inline struct cpuidle_driver *cpuidle_driver_ref(void) {return NULL; } static inline void cpuidle_driver_unref(void) {} static inline void cpuidle_unregister_driver(struct cpuidle_driver *drv) { } static inline int cpuidle_register_device(struct cpuidle_device *dev) {return -ENODEV; } Loading Loading
drivers/cpuidle/driver.c +28 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ static struct cpuidle_driver *cpuidle_curr_driver; DEFINE_SPINLOCK(cpuidle_driver_lock); int cpuidle_driver_refcount; static void __cpuidle_register_driver(struct cpuidle_driver *drv) { Loading Loading @@ -89,8 +90,34 @@ void cpuidle_unregister_driver(struct cpuidle_driver *drv) } spin_lock(&cpuidle_driver_lock); if (!WARN_ON(cpuidle_driver_refcount > 0)) cpuidle_curr_driver = NULL; spin_unlock(&cpuidle_driver_lock); } EXPORT_SYMBOL_GPL(cpuidle_unregister_driver); struct cpuidle_driver *cpuidle_driver_ref(void) { struct cpuidle_driver *drv; spin_lock(&cpuidle_driver_lock); drv = cpuidle_curr_driver; cpuidle_driver_refcount++; spin_unlock(&cpuidle_driver_lock); return drv; } void cpuidle_driver_unref(void) { spin_lock(&cpuidle_driver_lock); if (!WARN_ON(cpuidle_driver_refcount <= 0)) cpuidle_driver_refcount--; spin_unlock(&cpuidle_driver_lock); }
include/linux/cpuidle.h +5 −1 Original line number Diff line number Diff line Loading @@ -136,7 +136,9 @@ struct cpuidle_driver { extern void disable_cpuidle(void); extern int cpuidle_idle_call(void); extern int cpuidle_register_driver(struct cpuidle_driver *drv); struct cpuidle_driver *cpuidle_get_driver(void); extern struct cpuidle_driver *cpuidle_get_driver(void); extern struct cpuidle_driver *cpuidle_driver_ref(void); extern void cpuidle_driver_unref(void); extern void cpuidle_unregister_driver(struct cpuidle_driver *drv); extern int cpuidle_register_device(struct cpuidle_device *dev); extern void cpuidle_unregister_device(struct cpuidle_device *dev); Loading @@ -157,6 +159,8 @@ static inline int cpuidle_idle_call(void) { return -ENODEV; } static inline int cpuidle_register_driver(struct cpuidle_driver *drv) {return -ENODEV; } static inline struct cpuidle_driver *cpuidle_get_driver(void) {return NULL; } static inline struct cpuidle_driver *cpuidle_driver_ref(void) {return NULL; } static inline void cpuidle_driver_unref(void) {} static inline void cpuidle_unregister_driver(struct cpuidle_driver *drv) { } static inline int cpuidle_register_device(struct cpuidle_device *dev) {return -ENODEV; } Loading