On 04/02/2012 06:18 PM, Daniel Lezcano wrote: > The usual cpuidle initialization routines are to register the > driver, then register a cpuidle device per cpu. > > With the device's state count default initialization with the > driver's state count, the code initialization remains mostly the > same in the different drivers. > > We can then add a new function 'cpuidle_register' where we register > the driver and the devices. These devices can be defined in a global > static variable in cpuidle.c. We will be able to factor out and > remove a lot of duplicate lines of code. > > As we still have some drivers, with different initialization routines, > we keep 'cpuidle_register_driver' and 'cpuidle_register_device' as low > level initialization routines to do some specific operations on the > cpuidle devices. > > Signed-off-by: Daniel Lezcano <daniel.lezcano@xxxxxxxxxx> > +/* > + * cpuidle_register : register cpuidle driver and devices > + * Note this function must be called after smp_init. > + * @drv : the cpuidle driver > + * Returns 0 on success, < 0 otherwise > + */ > +int cpuidle_register(struct cpuidle_driver *drv) > +{ > + int ret, cpu, i; > + struct cpuidle_device *dev; > + > + ret = cpuidle_register_driver(drv); > + if (ret) > + return ret; > + > + for_each_online_cpu(cpu) { > + dev = &per_cpu(cpuidle_device, cpu); > + dev->cpu = cpu; > + > + ret = cpuidle_register_device(dev); > + if (ret) > + goto out_unregister; > + } > + > +out: > + return ret; > + > +out_unregister: > + for_each_online_cpu(i) { > + if (i == cpu) > + break; > + dev = &per_cpu(cpuidle_device, cpu); ^^^ That must have been "i" instead of "cpu"... > + cpuidle_unregister_device(dev); > + } > + > + cpuidle_unregister_driver(drv); > + > + goto out; > +} > +EXPORT_SYMBOL_GPL(cpuidle_register); > + Regards, Srivatsa S. Bhat _______________________________________________ linux-pm mailing list linux-pm@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linuxfoundation.org/mailman/listinfo/linux-pm