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

Reply via email to