Loading drivers/cpufreq/cpufreq.c +20 −1 Original line number Diff line number Diff line Loading @@ -80,6 +80,7 @@ static void handle_update(struct work_struct *work); */ static BLOCKING_NOTIFIER_HEAD(cpufreq_policy_notifier_list); static struct srcu_notifier_head cpufreq_transition_notifier_list; struct atomic_notifier_head cpufreq_govinfo_notifier_list; static bool init_cpufreq_transition_notifier_list_called; static int __init init_cpufreq_transition_notifier_list(void) Loading @@ -90,6 +91,15 @@ static int __init init_cpufreq_transition_notifier_list(void) } pure_initcall(init_cpufreq_transition_notifier_list); static bool init_cpufreq_govinfo_notifier_list_called; static int __init init_cpufreq_govinfo_notifier_list(void) { ATOMIC_INIT_NOTIFIER_HEAD(&cpufreq_govinfo_notifier_list); init_cpufreq_govinfo_notifier_list_called = true; return 0; } pure_initcall(init_cpufreq_govinfo_notifier_list); static int off __read_mostly; static int cpufreq_disabled(void) { Loading Loading @@ -1638,7 +1648,8 @@ int cpufreq_register_notifier(struct notifier_block *nb, unsigned int list) if (cpufreq_disabled()) return -EINVAL; WARN_ON(!init_cpufreq_transition_notifier_list_called); WARN_ON(!init_cpufreq_transition_notifier_list_called || !init_cpufreq_govinfo_notifier_list_called); switch (list) { case CPUFREQ_TRANSITION_NOTIFIER: Loading @@ -1649,6 +1660,10 @@ int cpufreq_register_notifier(struct notifier_block *nb, unsigned int list) ret = blocking_notifier_chain_register( &cpufreq_policy_notifier_list, nb); break; case CPUFREQ_GOVINFO_NOTIFIER: ret = atomic_notifier_chain_register( &cpufreq_govinfo_notifier_list, nb); break; default: ret = -EINVAL; } Loading Loading @@ -1683,6 +1698,10 @@ int cpufreq_unregister_notifier(struct notifier_block *nb, unsigned int list) ret = blocking_notifier_chain_unregister( &cpufreq_policy_notifier_list, nb); break; case CPUFREQ_GOVINFO_NOTIFIER: ret = atomic_notifier_chain_unregister( &cpufreq_govinfo_notifier_list, nb); break; default: ret = -EINVAL; } Loading include/linux/cpufreq.h +14 −0 Original line number Diff line number Diff line Loading @@ -286,6 +286,7 @@ cpufreq_verify_within_cpu_limits(struct cpufreq_policy *policy) #define CPUFREQ_TRANSITION_NOTIFIER (0) #define CPUFREQ_POLICY_NOTIFIER (1) #define CPUFREQ_GOVINFO_NOTIFIER (2) /* Transition notifiers */ #define CPUFREQ_PRECHANGE (0) Loading @@ -302,12 +303,25 @@ cpufreq_verify_within_cpu_limits(struct cpufreq_policy *policy) #define CPUFREQ_CREATE_POLICY (5) #define CPUFREQ_REMOVE_POLICY (6) /* Govinfo Notifiers */ #define CPUFREQ_LOAD_CHANGE (0) #ifdef CONFIG_CPU_FREQ int cpufreq_register_notifier(struct notifier_block *nb, unsigned int list); int cpufreq_unregister_notifier(struct notifier_block *nb, unsigned int list); void cpufreq_notify_transition(struct cpufreq_policy *policy, struct cpufreq_freqs *freqs, unsigned int state); /* * Governor specific info that can be passed to modules that subscribe * to CPUFREQ_GOVINFO_NOTIFIER */ struct cpufreq_govinfo { unsigned int cpu; unsigned int load; unsigned int sampling_rate_us; }; extern struct atomic_notifier_head cpufreq_govinfo_notifier_list; #else /* CONFIG_CPU_FREQ */ static inline int cpufreq_register_notifier(struct notifier_block *nb, Loading Loading
drivers/cpufreq/cpufreq.c +20 −1 Original line number Diff line number Diff line Loading @@ -80,6 +80,7 @@ static void handle_update(struct work_struct *work); */ static BLOCKING_NOTIFIER_HEAD(cpufreq_policy_notifier_list); static struct srcu_notifier_head cpufreq_transition_notifier_list; struct atomic_notifier_head cpufreq_govinfo_notifier_list; static bool init_cpufreq_transition_notifier_list_called; static int __init init_cpufreq_transition_notifier_list(void) Loading @@ -90,6 +91,15 @@ static int __init init_cpufreq_transition_notifier_list(void) } pure_initcall(init_cpufreq_transition_notifier_list); static bool init_cpufreq_govinfo_notifier_list_called; static int __init init_cpufreq_govinfo_notifier_list(void) { ATOMIC_INIT_NOTIFIER_HEAD(&cpufreq_govinfo_notifier_list); init_cpufreq_govinfo_notifier_list_called = true; return 0; } pure_initcall(init_cpufreq_govinfo_notifier_list); static int off __read_mostly; static int cpufreq_disabled(void) { Loading Loading @@ -1638,7 +1648,8 @@ int cpufreq_register_notifier(struct notifier_block *nb, unsigned int list) if (cpufreq_disabled()) return -EINVAL; WARN_ON(!init_cpufreq_transition_notifier_list_called); WARN_ON(!init_cpufreq_transition_notifier_list_called || !init_cpufreq_govinfo_notifier_list_called); switch (list) { case CPUFREQ_TRANSITION_NOTIFIER: Loading @@ -1649,6 +1660,10 @@ int cpufreq_register_notifier(struct notifier_block *nb, unsigned int list) ret = blocking_notifier_chain_register( &cpufreq_policy_notifier_list, nb); break; case CPUFREQ_GOVINFO_NOTIFIER: ret = atomic_notifier_chain_register( &cpufreq_govinfo_notifier_list, nb); break; default: ret = -EINVAL; } Loading Loading @@ -1683,6 +1698,10 @@ int cpufreq_unregister_notifier(struct notifier_block *nb, unsigned int list) ret = blocking_notifier_chain_unregister( &cpufreq_policy_notifier_list, nb); break; case CPUFREQ_GOVINFO_NOTIFIER: ret = atomic_notifier_chain_unregister( &cpufreq_govinfo_notifier_list, nb); break; default: ret = -EINVAL; } Loading
include/linux/cpufreq.h +14 −0 Original line number Diff line number Diff line Loading @@ -286,6 +286,7 @@ cpufreq_verify_within_cpu_limits(struct cpufreq_policy *policy) #define CPUFREQ_TRANSITION_NOTIFIER (0) #define CPUFREQ_POLICY_NOTIFIER (1) #define CPUFREQ_GOVINFO_NOTIFIER (2) /* Transition notifiers */ #define CPUFREQ_PRECHANGE (0) Loading @@ -302,12 +303,25 @@ cpufreq_verify_within_cpu_limits(struct cpufreq_policy *policy) #define CPUFREQ_CREATE_POLICY (5) #define CPUFREQ_REMOVE_POLICY (6) /* Govinfo Notifiers */ #define CPUFREQ_LOAD_CHANGE (0) #ifdef CONFIG_CPU_FREQ int cpufreq_register_notifier(struct notifier_block *nb, unsigned int list); int cpufreq_unregister_notifier(struct notifier_block *nb, unsigned int list); void cpufreq_notify_transition(struct cpufreq_policy *policy, struct cpufreq_freqs *freqs, unsigned int state); /* * Governor specific info that can be passed to modules that subscribe * to CPUFREQ_GOVINFO_NOTIFIER */ struct cpufreq_govinfo { unsigned int cpu; unsigned int load; unsigned int sampling_rate_us; }; extern struct atomic_notifier_head cpufreq_govinfo_notifier_list; #else /* CONFIG_CPU_FREQ */ static inline int cpufreq_register_notifier(struct notifier_block *nb, Loading