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.
The first patch fixes an issue that came up with an earlier version of patch 2/4, but its still worth fixing it. The second one creates a new driver to create platform-device based on current platform and the last two converts exynos platform to use this common infrastructure.
I will migrate rest of the platforms after this is accepted as the right way ahead.
V2->V3: - 2/3 is very lightweight now and doesn't support cpufreq-dt platform-data and an extra depends_on from Kconfig is dropped as well. - 3/3 is separated into two patches.
Viresh Kumar (4): cpufreq: dt: Include types.h from cpufreq-dt.h cpufreq: dt: Add generic platform-device creation support ARM: exynos: exynos-cpufreq platform device isn't supported anymore cpufreq: exynos: Use generic platdev driver
arch/arm/mach-exynos/exynos.c | 29 ------------------------- drivers/cpufreq/Kconfig | 10 +++++++++ drivers/cpufreq/Makefile | 1 + drivers/cpufreq/cpufreq-dt-platdev.c | 41 ++++++++++++++++++++++++++++++++++++ include/linux/cpufreq-dt.h | 2 ++ 5 files changed, 54 insertions(+), 29 deletions(-) create mode 100644 drivers/cpufreq/cpufreq-dt-platdev.c
cpufreq-dt.h uses 'bool' data type but doesn't include types.h. It works fine for now as the files that include cpufreq-dt.h, also include types.h directly or indirectly.
But, when a file includes cpufreq-dt.h without including types.h, we get a build error. Avoid such errors by including types.h in cpufreq-dt itself.
Signed-off-by: Viresh Kumar viresh.kumar@linaro.org --- include/linux/cpufreq-dt.h | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/include/linux/cpufreq-dt.h b/include/linux/cpufreq-dt.h index 0414009e2c30..a87335a1660c 100644 --- a/include/linux/cpufreq-dt.h +++ b/include/linux/cpufreq-dt.h @@ -10,6 +10,8 @@ #ifndef __CPUFREQ_DT_H__ #define __CPUFREQ_DT_H__
+#include <linux/types.h> + struct cpufreq_dt_platform_data { /* * True when each CPU has its own clock to control its
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.kumar@linaro.org Reviewed-by: Krzysztof Kozlowski k.kozlowski@samsung.com --- drivers/cpufreq/Kconfig | 10 ++++++++++ drivers/cpufreq/Makefile | 1 + drivers/cpufreq/cpufreq-dt-platdev.c | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+) create mode 100644 drivers/cpufreq/cpufreq-dt-platdev.c
diff --git a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig index a7f45853c103..8c26e3c53498 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,15 @@ config CPUFREQ_DT
If in doubt, say N.
+config CPUFREQ_DT_PLATDEV + bool + help + This adds a generic DT based cpufreq platdev driver for frequency + management. This creates a 'cpufreq-dt' platform device, on the + supported platforms. + + If in doubt, say N. + if X86 source "drivers/cpufreq/Kconfig.x86" endif diff --git a/drivers/cpufreq/Makefile b/drivers/cpufreq/Makefile index 9e63fb1b09f8..b9224fdb8322 100644 --- a/drivers/cpufreq/Makefile +++ b/drivers/cpufreq/Makefile @@ -13,6 +13,7 @@ obj-$(CONFIG_CPU_FREQ_GOV_CONSERVATIVE) += cpufreq_conservative.o obj-$(CONFIG_CPU_FREQ_GOV_COMMON) += cpufreq_governor.o
obj-$(CONFIG_CPUFREQ_DT) += cpufreq-dt.o +obj-$(CONFIG_CPUFREQ_DT_PLATDEV) += cpufreq-dt-platdev.o
################################################################################## # x86 drivers. diff --git a/drivers/cpufreq/cpufreq-dt-platdev.c b/drivers/cpufreq/cpufreq-dt-platdev.c new file mode 100644 index 000000000000..2a3532427ecf --- /dev/null +++ b/drivers/cpufreq/cpufreq-dt-platdev.c @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2016 Linaro. + * Viresh Kumar viresh.kumar@linaro.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include <linux/err.h> +#include <linux/of.h> +#include <linux/platform_device.h> + +static const struct of_device_id machines[] = { +}; + +static int __init cpufreq_dt_platdev_init(void) +{ + struct device_node *np = of_find_node_by_path("/"); + + if (!np) + return -ENODEV; + + if (!of_match_node(machines, np)) + return -ENODEV; + + of_node_put(of_root); + + return PTR_ERR_OR_ZERO(platform_device_register_simple("cpufreq-dt", -1, + NULL, 0)); +} +device_initcall(cpufreq_dt_platdev_init);
On Mar 30, 2016, at 3:15 AM, Viresh Kumar viresh.kumar@linaro.org 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.kumar@linaro.org Reviewed-by: Krzysztof Kozlowski k.kozlowski@samsung.com
Test on ipq4019.
Tested-by: Matthew McClintock mmcclint@codeaurora.org
-M
The driver is removed long back and we don't support this device anymore. Stop adding it.
Signed-off-by: Viresh Kumar viresh.kumar@linaro.org --- arch/arm/mach-exynos/exynos.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/arch/arm/mach-exynos/exynos.c b/arch/arm/mach-exynos/exynos.c index bbf51a46f772..4dfce1069406 100644 --- a/arch/arm/mach-exynos/exynos.c +++ b/arch/arm/mach-exynos/exynos.c @@ -232,12 +232,8 @@ static void __init exynos_cpufreq_init(void) const struct of_device_id *match;
match = of_match_node(exynos_cpufreq_matches, root); - if (!match) { - platform_device_register_simple("exynos-cpufreq", -1, NULL, 0); - return; - } - - platform_device_register_simple(match->data, -1, NULL, 0); + if (match) + platform_device_register_simple(match->data, -1, NULL, 0); }
static void __init exynos_dt_machine_init(void)
On 30.03.2016 17:15, Viresh Kumar wrote:
The driver is removed long back and we don't support this device anymore. Stop adding it.
Signed-off-by: Viresh Kumar viresh.kumar@linaro.org
arch/arm/mach-exynos/exynos.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-)
Reviewed-by: Krzysztof Kozlowski k.kozlowski@samsung.com
Best regards,
Krzysztof
The cpufreq-dt-platdev driver supports creation of cpufreq-dt platform device now, reuse that and remove similar code from platform code.
Signed-off-by: Viresh Kumar viresh.kumar@linaro.org Reviewed-by: Krzysztof Kozlowski k.kozlowski@samsung.com --- arch/arm/mach-exynos/exynos.c | 25 ------------------------- drivers/cpufreq/cpufreq-dt-platdev.c | 9 +++++++++ 2 files changed, 9 insertions(+), 25 deletions(-)
diff --git a/arch/arm/mach-exynos/exynos.c b/arch/arm/mach-exynos/exynos.c index 4dfce1069406..4d3b056fd786 100644 --- a/arch/arm/mach-exynos/exynos.c +++ b/arch/arm/mach-exynos/exynos.c @@ -213,29 +213,6 @@ static void __init exynos_init_irq(void) exynos_map_pmu(); }
-static const struct of_device_id exynos_cpufreq_matches[] = { - { .compatible = "samsung,exynos3250", .data = "cpufreq-dt" }, - { .compatible = "samsung,exynos4210", .data = "cpufreq-dt" }, - { .compatible = "samsung,exynos4212", .data = "cpufreq-dt" }, - { .compatible = "samsung,exynos4412", .data = "cpufreq-dt" }, - { .compatible = "samsung,exynos5250", .data = "cpufreq-dt" }, -#ifndef CONFIG_BL_SWITCHER - { .compatible = "samsung,exynos5420", .data = "cpufreq-dt" }, - { .compatible = "samsung,exynos5800", .data = "cpufreq-dt" }, -#endif - { /* sentinel */ } -}; - -static void __init exynos_cpufreq_init(void) -{ - struct device_node *root = of_find_node_by_path("/"); - const struct of_device_id *match; - - match = of_match_node(exynos_cpufreq_matches, root); - if (match) - platform_device_register_simple(match->data, -1, NULL, 0); -} - static void __init exynos_dt_machine_init(void) { /* @@ -258,8 +235,6 @@ static void __init exynos_dt_machine_init(void) of_machine_is_compatible("samsung,exynos5250")) platform_device_register(&exynos_cpuidle);
- exynos_cpufreq_init(); - of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); }
diff --git a/drivers/cpufreq/cpufreq-dt-platdev.c b/drivers/cpufreq/cpufreq-dt-platdev.c index 2a3532427ecf..f2ae7ad99a3c 100644 --- a/drivers/cpufreq/cpufreq-dt-platdev.c +++ b/drivers/cpufreq/cpufreq-dt-platdev.c @@ -12,6 +12,15 @@ #include <linux/platform_device.h>
static const struct of_device_id machines[] = { + { .compatible = "samsung,exynos3250", }, + { .compatible = "samsung,exynos4210", }, + { .compatible = "samsung,exynos4212", }, + { .compatible = "samsung,exynos4412", }, + { .compatible = "samsung,exynos5250", }, +#ifndef CONFIG_BL_SWITCHER + { .compatible = "samsung,exynos5420", }, + { .compatible = "samsung,exynos5800", }, +#endif };
static int __init cpufreq_dt_platdev_init(void)
On 30-03-16, 13:45, 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.
The first patch fixes an issue that came up with an earlier version of patch 2/4, but its still worth fixing it. The second one creates a new driver to create platform-device based on current platform and the last two converts exynos platform to use this common infrastructure.
I will migrate rest of the platforms after this is accepted as the right way ahead.
V2->V3:
- 2/3 is very lightweight now and doesn't support cpufreq-dt platform-data and an extra depends_on from Kconfig is dropped as well.
- 3/3 is separated into two patches.
@Rafael: Can you please apply this series now, that will enable me with converting rest of the users to use this.
On 30-03-16, 13:45, 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.
The first patch fixes an issue that came up with an earlier version of patch 2/4, but its still worth fixing it. The second one creates a new driver to create platform-device based on current platform and the last two converts exynos platform to use this common infrastructure.
I will migrate rest of the platforms after this is accepted as the right way ahead.
@Matthew and @Mason,
Now that this is present in linux-next, you guys can send patches for your platforms cpufreq support.
On 20/04/2016 11:55, Viresh Kumar wrote:
On 30-03-16, 13:45, 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.
The first patch fixes an issue that came up with an earlier version of patch 2/4, but its still worth fixing it. The second one creates a new driver to create platform-device based on current platform and the last two converts exynos platform to use this common infrastructure.
I will migrate rest of the platforms after this is accepted as the right way ahead.
@Matthew and @Mason,
Now that this is present in linux-next, you guys can send patches for your platforms cpufreq support.
Present in linux-next means it will show up in 4.6-rc5?
Regards.
On Wed, Apr 20, 2016 at 11:27 PM, Mason slash.tmp@free.fr wrote:
On 20/04/2016 11:55, Viresh Kumar wrote:
On 30-03-16, 13:45, 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.
The first patch fixes an issue that came up with an earlier version of patch 2/4, but its still worth fixing it. The second one creates a new driver to create platform-device based on current platform and the last two converts exynos platform to use this common infrastructure.
I will migrate rest of the platforms after this is accepted as the right way ahead.
@Matthew and @Mason,
Now that this is present in linux-next, you guys can send patches for your platforms cpufreq support.
Present in linux-next means it will show up in 4.6-rc5?
No, it doesn't, in general.
Bug fixes may show up in -rcX, X > 1, but the majority of new material in linux-next will show up in the next -rc1 (4.7-rc1 in this particular case).
On 20/04/2016 11:55, Viresh Kumar wrote:
On 30-03-16, 13:45, 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.
The first patch fixes an issue that came up with an earlier version of patch 2/4, but its still worth fixing it. The second one creates a new driver to create platform-device based on current platform and the last two converts exynos platform to use this common infrastructure.
I will migrate rest of the platforms after this is accepted as the right way ahead.
@Matthew and @Mason,
Now that this is present in linux-next, you guys can send patches for your platforms cpufreq support.
Viresh,
IIUC, all I need to do is add my platform's string to drivers/cpufreq/cpufreq-dt-platdev.c ?
Should I add it at the beginning or at the end? (I suppose at the end.)
I should add "sigma,tango4", since that's what is used in arch/arm/mach-tango/setup.c right?
Regards.
On Apr 27, 2016, at 11:47 AM, Mason slash.tmp@free.fr wrote:
Should I add it at the beginning or at the end? (I suppose at the end.)
I was going to do alphabetical order.
-M
On 27-04-16, 11:57, Matthew McClintock wrote:
On Apr 27, 2016, at 11:47 AM, Mason slash.tmp@free.fr wrote:
Should I add it at the beginning or at the end? (I suppose at the end.)
I was going to do alphabetical order.
That's right, you should follow the way things are present in the file itself. So, it should be in alphabetical order, + blank lines separating your platform from the rest.
linaro-kernel@lists.linaro.org