cpuidle: make a single register function for all
authorDaniel Lezcano <daniel.lezcano@linaro.org>
Tue, 23 Apr 2013 08:54:33 +0000 (08:54 +0000)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 23 Apr 2013 11:45:22 +0000 (13:45 +0200)
commit4c637b2175a0dc65d533494225525c6c82d73293
tree89df00e95c52557139a1f9c151344b3c04681c7f
parent80b1c1999edbba3a411335f1650f0d92da391516
cpuidle: make a single register function for all

The usual scheme to initialize a cpuidle driver on a SMP is:

cpuidle_register_driver(drv);
for_each_possible_cpu(cpu) {
device = &per_cpu(cpuidle_dev, cpu);
cpuidle_register_device(device);
}

This code is duplicated in each cpuidle driver.

On UP systems, it is done this way:

cpuidle_register_driver(drv);
device = &per_cpu(cpuidle_dev, cpu);
cpuidle_register_device(device);

On UP, the macro 'for_each_cpu' does one iteration:

#define for_each_cpu(cpu, mask)                 \
        for ((cpu) = 0; (cpu) < 1; (cpu)++, (void)mask)

Hence, the initialization loop is the same for UP than SMP.

Beside, we saw different bugs / mis-initialization / return code unchecked in
the different drivers, the code is duplicated including bugs. After fixing all
these ones, it appears the initialization pattern is the same for everyone.

Please note, some drivers are doing dev->state_count = drv->state_count. This is
not necessary because it is done by the cpuidle_enable_device function in the
cpuidle framework. This is true, until you have the same states for all your
devices. Otherwise, the 'low level' API should be used instead with the specific
initialization for the driver.

Let's add a wrapper function doing this initialization with a cpumask parameter
for the coupled idle states and use it for all the drivers.

That will save a lot of LOC, consolidate the code, and the modifications in the
future could be done in a single place. Another benefit is the consolidation of
the cpuidle_device variable which is now in the cpuidle framework and no longer
spread accross the different arch specific drivers.

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Documentation/cpuidle/driver.txt
drivers/cpuidle/cpuidle.c
include/linux/cpuidle.h