cpuidle: Fix NULL pointer dereference during hotplug
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:

        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.

Change-Id: I8f75188d5770871620f758c2973b74384ac570d5
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Signed-off-by: Karthik Parsha <kparsha@codeaurora.org>
Signed-off-by: Mahesh Sivasubramanian <msivasub@codeaurora.org>
random: speed up the fast_mix function by a factor of four (faux123)