On Tuesday 29 March 2016 12:09:48 Viresh Kumar wrote: > Multiple platforms are using the generic cpufreq-dt driver now, and all > of them are required to create a platform device with name "cpufreq-dt", > in order to get the cpufreq-dt probed. > > Many of them do it from platform code, others have special drivers just > to do that. > > It would be more sensible to do this at a generic place, where all such > platform can mark their entries. > > This patch adds a separate file to get this device created. Currently > the compat list of platforms that we support is empty, and will be > filled in as and when we move platforms to use it. > > It always compiles as part of the kernel and so doesn't need a > module-exit operation. > > Signed-off-by: Viresh Kumar <viresh.ku...@linaro.org> > Reviewed-by: Krzysztof Kozlowski <k.kozlow...@samsung.com> > --- > drivers/cpufreq/Kconfig | 11 +++++++++ > drivers/cpufreq/Makefile | 1 + > drivers/cpufreq/cpufreq-dt-platdev.c | 48 > ++++++++++++++++++++++++++++++++++++ > 3 files changed, 60 insertions(+) > create mode 100644 drivers/cpufreq/cpufreq-dt-platdev.c > > diff --git a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig > index a7f45853c103..08573d54105b 100644 > --- a/drivers/cpufreq/Kconfig > +++ b/drivers/cpufreq/Kconfig > @@ -191,6 +191,7 @@ config CPUFREQ_DT > depends on HAVE_CLK && OF > # if CPU_THERMAL is on and THERMAL=m, CPUFREQ_DT cannot be =y: > depends on !CPU_THERMAL || THERMAL > + select CPUFREQ_DT_PLATDEV > select PM_OPP > help > This adds a generic DT based cpufreq driver for frequency management. > @@ -199,6 +200,16 @@ config CPUFREQ_DT > > If in doubt, say N. > > +config CPUFREQ_DT_PLATDEV > + bool > + depends on CPUFREQ_DT
The 'depends on' line is redundant as you always 'select' the code from CPUFREQ_DT. Since they are always set together, you can also just drop the new symbol, or put the new code into the same file. > +struct cpufreq_dt_compat { > + const char *compatible; > + const void *data; > + size_t size; > +}; > + > +static struct cpufreq_dt_compat compat[] = { > +}; The 'data' here is alway 'struct cpufreq_dt_platform_data' or NULL, and the size can be derived from that. If we add this into the opp platform interfaces, both can go away. > +static int __init cpufreq_dt_platdev_init(void) > +{ > + struct platform_device *pdev; > + int i; > + > + for (i = 0; i < ARRAY_SIZE(compat); i++) { > + if (!of_machine_is_compatible(compat[i].compatible)) > + continue; > + > + pdev = platform_device_register_data(NULL, "cpufreq-dt", -1, > + compat[i].data, > + compat[i].size); > + and then this can become if (of_device_match(of_root, compat)) platform_device_register_simple(NULL, "cpufreq-dt", 0, NULL, 0); Arnd