Skip to contentSkip to conversation

cpufreq: dt: Create platform device from generic code

PATCH In review Viresh Kumar 5 participants 14 messages Mar 30, 2016 – Apr 28, 2016

Subsystems (4)
lore
Share & tools
lore

Viresh Kumar

author maintainer
#0 lore raw

v3 cover cpufreq: dt: Create platform device from generic code

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
Signature · 1 line
2.7.1.410.g6faf27b
author maintainer
#1 lore raw

PATCH v3 1/4 cpufreq: dt: Include types.h from cpufreq-dt.h

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.

---
 include/linux/cpufreq-dt.h | 2 ++
 1 file changed, 2 insertions(+)
include/linux/cpufreq-dt.h +2 -0
index 0414009e2c30..a87335a1660c 100644
@@ -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
Signature · 1 line
2.7.1.410.g6faf27b
author maintainer
#2 lore raw

PATCH v3 2/4 cpufreq: dt: Add generic platform-device creation support

In reply to Viresh Kumar

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.

---
 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
drivers/cpufreq/Kconfig +10 -0
index a7f45853c103..8c26e3c53498 100644
@@ -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
drivers/cpufreq/Makefile +1 -0
index 9e63fb1b09f8..b9224fdb8322 100644
@@ -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.
drivers/cpufreq/cpufreq-dt-platdev.c new file +32 -0
new file mode 100644
index 000000000000..2a3532427ecf
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2016 Linaro.
+ * Viresh Kumar <[email protected]>
+ *
+ * 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);
Signature · 1 line
2.7.1.410.g6faf27b
Tested-by on v3 2/4
#3 lore raw

Re: [PATCH V3 2/4] cpufreq: dt: Add generic platform-device creation support

Quoted 15 lines · Viresh Kumar

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.

Quoted 5 lines

It always compiles as part of the kernel and so doesn't need a module-exit operation.

Test on ipq4019.

-M

author maintainer
#4 lore raw

PATCH v3 3/4 ARM: exynos: exynos-cpufreq platform device isn't supported anymore

In reply to Viresh Kumar

The driver is removed long back and we don't support this device anymore. Stop adding it.

---
 arch/arm/mach-exynos/exynos.c | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)
arch/arm/mach-exynos/exynos.c +2 -6
index bbf51a46f772..4dfce1069406 100644
@@ -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)
Signature · 1 line
2.7.1.410.g6faf27b
author maintainer
#6 lore raw

PATCH v3 4/4 cpufreq: exynos: Use generic platdev driver

In reply to Viresh Kumar

The cpufreq-dt-platdev driver supports creation of cpufreq-dt platform device now, reuse that and remove similar code from platform code.

---
 arch/arm/mach-exynos/exynos.c        | 25 -------------------------
 drivers/cpufreq/cpufreq-dt-platdev.c |  9 +++++++++
 2 files changed, 9 insertions(+), 25 deletions(-)
arch/arm/mach-exynos/exynos.c +0 -25
index 4dfce1069406..4d3b056fd786 100644
@@ -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);
 }
 
drivers/cpufreq/cpufreq-dt-platdev.c +9 -0
index 2a3532427ecf..f2ae7ad99a3c 100644
@@ -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)
Signature · 1 line
2.7.1.410.g6faf27b
author maintainer
#7 lore raw
In reply to Viresh Kumar
Quoted 15 lines · Viresh Kumar

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.

Quoted 7 lines

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.

Signature · 1 line
viresh
author maintainer
#8 lore raw
In reply to Viresh Kumar
Quoted 10 lines · Viresh Kumar

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.

Quoted 7 lines

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.

Signature · 1 line
viresh
#9 lore raw
Quoted 16 lines · Viresh Kumar
Quoted 15 lines · Viresh Kumar

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.

Quoted 7 lines
Quoted 2 lines

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.

#10 lore raw
Quoted 20 lines · Mason
Quoted 19 lines · Viresh Kumar
Quoted 17 lines · Viresh Kumar

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.

Quoted 6 lines
Quoted 4 lines

@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).

#11 lore raw
In reply to Viresh Kumar
Quoted 16 lines · Viresh Kumar
Quoted 15 lines · Viresh Kumar

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.

Quoted 7 lines
Quoted 2 lines

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.

#12 lore raw
Quoted 3 lines · Mason

Should I add it at the beginning or at the end?
(I suppose at the end.)

I was going to do alphabetical order.

-M

author maintainer
#13 lore raw
Quoted 6 lines · Matthew McClintock
Quoted 3 lines · Mason

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.

Signature · 1 line
viresh