diff options
author | Sebastian Andrzej Siewior <bigeasy@linutronix.de> | 2016-09-06 13:04:48 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2016-09-19 15:44:29 -0400 |
commit | 27622b061eb4bb4d16b5d61219ac10a792010321 (patch) | |
tree | b88634fe34348a8fb67b5dbbd2982a908908d090 | |
parent | 64f3bf2f85c5690228200d6b94eb6847049af70d (diff) |
cpufreq: Convert to hotplug state machine
Install the callbacks via the state machine.
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Acked-by: "Rafael J. Wysocki" <rjw@rjwysocki.net>
Cc: linux-pm@vger.kernel.org
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Viresh Kumar <viresh.kumar@linaro.or
Cc: rt@linutronix.de
Link: http://lkml.kernel.org/r/20160906170457.32393-13-bigeasy@linutronix.de
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
-rw-r--r-- | drivers/cpufreq/cpufreq.c | 38 |
1 files changed, 12 insertions, 26 deletions
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index 3dd4884c6f9e..e0bc632a259e 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c | |||
@@ -1358,7 +1358,7 @@ static int cpufreq_add_dev(struct device *dev, struct subsys_interface *sif) | |||
1358 | return add_cpu_dev_symlink(policy, cpu); | 1358 | return add_cpu_dev_symlink(policy, cpu); |
1359 | } | 1359 | } |
1360 | 1360 | ||
1361 | static void cpufreq_offline(unsigned int cpu) | 1361 | static int cpufreq_offline(unsigned int cpu) |
1362 | { | 1362 | { |
1363 | struct cpufreq_policy *policy; | 1363 | struct cpufreq_policy *policy; |
1364 | int ret; | 1364 | int ret; |
@@ -1368,7 +1368,7 @@ static void cpufreq_offline(unsigned int cpu) | |||
1368 | policy = cpufreq_cpu_get_raw(cpu); | 1368 | policy = cpufreq_cpu_get_raw(cpu); |
1369 | if (!policy) { | 1369 | if (!policy) { |
1370 | pr_debug("%s: No cpu_data found\n", __func__); | 1370 | pr_debug("%s: No cpu_data found\n", __func__); |
1371 | return; | 1371 | return 0; |
1372 | } | 1372 | } |
1373 | 1373 | ||
1374 | down_write(&policy->rwsem); | 1374 | down_write(&policy->rwsem); |
@@ -1417,6 +1417,7 @@ static void cpufreq_offline(unsigned int cpu) | |||
1417 | 1417 | ||
1418 | unlock: | 1418 | unlock: |
1419 | up_write(&policy->rwsem); | 1419 | up_write(&policy->rwsem); |
1420 | return 0; | ||
1420 | } | 1421 | } |
1421 | 1422 | ||
1422 | /** | 1423 | /** |
@@ -2332,28 +2333,6 @@ unlock: | |||
2332 | } | 2333 | } |
2333 | EXPORT_SYMBOL(cpufreq_update_policy); | 2334 | EXPORT_SYMBOL(cpufreq_update_policy); |
2334 | 2335 | ||
2335 | static int cpufreq_cpu_callback(struct notifier_block *nfb, | ||
2336 | unsigned long action, void *hcpu) | ||
2337 | { | ||
2338 | unsigned int cpu = (unsigned long)hcpu; | ||
2339 | |||
2340 | switch (action & ~CPU_TASKS_FROZEN) { | ||
2341 | case CPU_ONLINE: | ||
2342 | case CPU_DOWN_FAILED: | ||
2343 | cpufreq_online(cpu); | ||
2344 | break; | ||
2345 | |||
2346 | case CPU_DOWN_PREPARE: | ||
2347 | cpufreq_offline(cpu); | ||
2348 | break; | ||
2349 | } | ||
2350 | return NOTIFY_OK; | ||
2351 | } | ||
2352 | |||
2353 | static struct notifier_block __refdata cpufreq_cpu_notifier = { | ||
2354 | .notifier_call = cpufreq_cpu_callback, | ||
2355 | }; | ||
2356 | |||
2357 | /********************************************************************* | 2336 | /********************************************************************* |
2358 | * BOOST * | 2337 | * BOOST * |
2359 | *********************************************************************/ | 2338 | *********************************************************************/ |
@@ -2455,6 +2434,7 @@ EXPORT_SYMBOL_GPL(cpufreq_boost_enabled); | |||
2455 | /********************************************************************* | 2434 | /********************************************************************* |
2456 | * REGISTER / UNREGISTER CPUFREQ DRIVER * | 2435 | * REGISTER / UNREGISTER CPUFREQ DRIVER * |
2457 | *********************************************************************/ | 2436 | *********************************************************************/ |
2437 | static enum cpuhp_state hp_online; | ||
2458 | 2438 | ||
2459 | /** | 2439 | /** |
2460 | * cpufreq_register_driver - register a CPU Frequency driver | 2440 | * cpufreq_register_driver - register a CPU Frequency driver |
@@ -2517,7 +2497,13 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data) | |||
2517 | goto err_if_unreg; | 2497 | goto err_if_unreg; |
2518 | } | 2498 | } |
2519 | 2499 | ||
2520 | register_hotcpu_notifier(&cpufreq_cpu_notifier); | 2500 | ret = cpuhp_setup_state_nocalls(CPUHP_AP_ONLINE_DYN, "cpufreq:online", |
2501 | cpufreq_online, | ||
2502 | cpufreq_offline); | ||
2503 | if (ret < 0) | ||
2504 | goto err_if_unreg; | ||
2505 | hp_online = ret; | ||
2506 | |||
2521 | pr_debug("driver %s up and running\n", driver_data->name); | 2507 | pr_debug("driver %s up and running\n", driver_data->name); |
2522 | goto out; | 2508 | goto out; |
2523 | 2509 | ||
@@ -2556,7 +2542,7 @@ int cpufreq_unregister_driver(struct cpufreq_driver *driver) | |||
2556 | get_online_cpus(); | 2542 | get_online_cpus(); |
2557 | subsys_interface_unregister(&cpufreq_interface); | 2543 | subsys_interface_unregister(&cpufreq_interface); |
2558 | remove_boost_sysfs_file(); | 2544 | remove_boost_sysfs_file(); |
2559 | unregister_hotcpu_notifier(&cpufreq_cpu_notifier); | 2545 | cpuhp_remove_state_nocalls(hp_online); |
2560 | 2546 | ||
2561 | write_lock_irqsave(&cpufreq_driver_lock, flags); | 2547 | write_lock_irqsave(&cpufreq_driver_lock, flags); |
2562 | 2548 | ||