[PATCH 4/5] cpufreq: imx6q: Use id_table to distinguish between SoCs

Sascha Hauer s.hauer at pengutronix.de
Wed Oct 28 00:59:13 PDT 2015


The i.MX6 cpufreq driver is instantiated from a static device in
architecture code and not from the device tree. These devices offer the
id_table mechanism to distinguish between different types of devices.
Use this mechanism rather than of_machine_is_compatible() as it scales
better with increasing number of SoCs to check against.

Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
---
 arch/arm/mach-imx/mach-imx6sl.c |  2 +-
 arch/arm/mach-imx/mach-imx6sx.c |  2 +-
 arch/arm/mach-imx/mach-imx6ul.c |  2 +-
 drivers/cpufreq/imx6q-cpufreq.c | 30 +++++++++++++++++++++++++++---
 4 files changed, 30 insertions(+), 6 deletions(-)

diff --git a/arch/arm/mach-imx/mach-imx6sl.c b/arch/arm/mach-imx/mach-imx6sl.c
index 3003263..c93cf69 100644
--- a/arch/arm/mach-imx/mach-imx6sl.c
+++ b/arch/arm/mach-imx/mach-imx6sl.c
@@ -39,7 +39,7 @@ static void __init imx6sl_init_late(void)
 {
 	/* imx6sl reuses imx6q cpufreq driver */
 	if (IS_ENABLED(CONFIG_ARM_IMX6Q_CPUFREQ))
-		platform_device_register_simple("imx6q-cpufreq", -1, NULL, 0);
+		platform_device_register_simple("imx6sl-cpufreq", -1, NULL, 0);
 
 	imx6sl_cpuidle_init();
 }
diff --git a/arch/arm/mach-imx/mach-imx6sx.c b/arch/arm/mach-imx/mach-imx6sx.c
index 6a0b061..ca86a25 100644
--- a/arch/arm/mach-imx/mach-imx6sx.c
+++ b/arch/arm/mach-imx/mach-imx6sx.c
@@ -94,7 +94,7 @@ static void __init imx6sx_init_late(void)
 	imx6sx_cpuidle_init();
 
 	if (IS_ENABLED(CONFIG_ARM_IMX6Q_CPUFREQ))
-		platform_device_register_simple("imx6q-cpufreq", -1, NULL, 0);
+		platform_device_register_simple("imx6sx-cpufreq", -1, NULL, 0);
 }
 
 static const char * const imx6sx_dt_compat[] __initconst = {
diff --git a/arch/arm/mach-imx/mach-imx6ul.c b/arch/arm/mach-imx/mach-imx6ul.c
index acaf705..159ec4e 100644
--- a/arch/arm/mach-imx/mach-imx6ul.c
+++ b/arch/arm/mach-imx/mach-imx6ul.c
@@ -81,7 +81,7 @@ static void __init imx6ul_init_irq(void)
 static void __init imx6ul_init_late(void)
 {
 	if (IS_ENABLED(CONFIG_ARM_IMX6Q_CPUFREQ))
-		platform_device_register_simple("imx6q-cpufreq", -1, NULL, 0);
+		platform_device_register_simple("imx6ul-cpufreq", -1, NULL, 0);
 }
 
 static const char *imx6ul_dt_compat[] __initconst = {
diff --git a/drivers/cpufreq/imx6q-cpufreq.c b/drivers/cpufreq/imx6q-cpufreq.c
index f81cf8e..f3729f9 100644
--- a/drivers/cpufreq/imx6q-cpufreq.c
+++ b/drivers/cpufreq/imx6q-cpufreq.c
@@ -42,6 +42,27 @@ static unsigned int transition_latency;
 static u32 *imx6_soc_volt;
 static u32 soc_opp_count;
 
+static unsigned long imx6_cpufreq_flags;
+
+#define IMX6_CPUFREQ_NEED_PU_REG		(1 << 0)
+#define IMX6_CPUFREQ_NEED_SECONDARY_SEL		(1 << 1)
+
+static const struct platform_device_id imx6_cpufreq_devtype[] = {
+	{
+		.name = "imx6q-cpufreq",
+		.driver_data = IMX6_CPUFREQ_NEED_PU_REG,
+	}, {
+		.name = "imx6ul-cpufreq",
+		.driver_data = IMX6_CPUFREQ_NEED_SECONDARY_SEL,
+	}, {
+		.name = "imx6sl-cpufreq",
+		.driver_data = IMX6_CPUFREQ_NEED_PU_REG,
+	}, {
+		.name = "imx6sx-cpufreq",
+		.driver_data = IMX6_CPUFREQ_NEED_PU_REG,
+	},
+};
+
 static int imx6q_set_target(struct cpufreq_policy *policy, unsigned int index)
 {
 	struct dev_pm_opp *opp;
@@ -102,7 +123,7 @@ static int imx6q_set_target(struct cpufreq_policy *policy, unsigned int index)
 	 *  - Reprogram pll1_sys_clk and reparent pll1_sw_clk back to it
 	 *  - Disable pll2_pfd2_396m_clk
 	 */
-	if (of_machine_is_compatible("fsl,imx6ul")) {
+	if (imx6_cpufreq_flags & IMX6_CPUFREQ_NEED_SECONDARY_SEL) {
 		/*
 		 * When changing pll1_sw_clk's parent to pll1_sys_clk,
 		 * CPU may run at higher than 528MHz, this will lead to
@@ -202,7 +223,7 @@ static int imx6q_cpufreq_get_resources(void)
 	if (IS_ERR(pll2_pfd2_396m_clk))
 		return PTR_ERR(pll2_pfd2_396m_clk);
 
-	if (of_machine_is_compatible("fsl,imx6ul")) {
+	if (imx6_cpufreq_flags & IMX6_CPUFREQ_NEED_SECONDARY_SEL) {
 		pll2_bus_clk = clk_get(cpu_dev, "pll2_bus");
 		if (IS_ERR(pll2_bus_clk))
 			return PTR_ERR(pll2_bus_clk);
@@ -283,6 +304,8 @@ static int imx6q_cpufreq_probe(struct platform_device *pdev)
 	const __be32 *val;
 	u32 nr, i, j;
 
+	imx6_cpufreq_flags = platform_get_device_id(pdev)->driver_data;
+
 	cpu_dev = get_cpu_device(0);
 	if (!cpu_dev) {
 		pr_err("failed to get cpu0 device\n");
@@ -439,8 +462,9 @@ static int imx6q_cpufreq_remove(struct platform_device *pdev)
 
 static struct platform_driver imx6q_cpufreq_platdrv = {
 	.driver = {
-		.name	= "imx6q-cpufreq",
+		.name	= "imx6-cpufreq",
 	},
+	.id_table	= imx6_cpufreq_devtype,
 	.probe		= imx6q_cpufreq_probe,
 	.remove		= imx6q_cpufreq_remove,
 };
-- 
2.6.1




More information about the linux-arm-kernel mailing list