From mboxrd@z Thu Jan 1 00:00:00 1970 From: s.hauer@pengutronix.de (Sascha Hauer) Date: Wed, 28 Oct 2015 08:59:13 +0100 Subject: [PATCH 4/5] cpufreq: imx6q: Use id_table to distinguish between SoCs In-Reply-To: <1446019154-16384-1-git-send-email-s.hauer@pengutronix.de> References: <1446019154-16384-1-git-send-email-s.hauer@pengutronix.de> Message-ID: <1446019154-16384-5-git-send-email-s.hauer@pengutronix.de> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org 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 --- 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@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