Skip to contentSkip to conversation

cpufreq: imx6q: Move speed grading check to cpufreq driver

PATCH Superseded Fabio Estevam 4 participants 7 messages Sep 30, 2017 – Oct 18, 2017

Subsystems (4)
lore
Share & tools
lore

Fabio Estevam

author reviewer
#0 lore raw

PATCH v3 1/1 cpufreq: imx6q: Move speed grading check to cpufreq driver

From: Fabio Estevam <[email protected]>

On some i.MX6 SoCs (like i.MX6SL, i.MX6SX and i.MX6UL) that do not have speed grading check, opp table will not be created in platform code, so cpufreq driver prints the following error message:

cpu cpu0: dev_pm_opp_get_opp_count: OPP table not found (-19)

However, this is not really an error in this case because the imx6q-cpufreq driver first calls dev_pm_opp_get_opp_count() and if it fails, it means that platform code does not provide OPP and then dev_pm_opp_of_add_table() will be called.

In order to avoid such confusing error message, move the speed grading check from platform code to the imx6q-cpufreq driver.

This way the imx6q-cpufreq no longer has to check whether OPP table is supplied by platform code.

Tested on a i.MX6Q and i.MX6UL based boards.

---
Previous discussion on this topic:
https://patchwork.kernel.org/patch/9295059/

Changes since v2:
- Fixed a typo in the commit log (missed SL) - Otavio
- Remove __init anotation from imx6q_opp_check_speed_grading() Changes since v1:
- Remove unneeded has_speed_grading() function.

 arch/arm/mach-imx/mach-imx6q.c  | 88 +----------------------------------------
 drivers/cpufreq/imx6q-cpufreq.c | 85 +++++++++++++++++++++++++++++----------
 2 files changed, 67 insertions(+), 106 deletions(-)
arch/arm/mach-imx/mach-imx6q.c +2 -86
index 45801b2..b5f89fd 100644
@@ -286,88 +286,6 @@ static void __init imx6q_init_machine(void)
 	imx6q_axi_init();
 }
 
-#define OCOTP_CFG3			0x440
-#define OCOTP_CFG3_SPEED_SHIFT		16
-#define OCOTP_CFG3_SPEED_1P2GHZ		0x3
-#define OCOTP_CFG3_SPEED_996MHZ		0x2
-#define OCOTP_CFG3_SPEED_852MHZ		0x1
-
-static void __init imx6q_opp_check_speed_grading(struct device *cpu_dev)
-{
-	struct device_node *np;
-	void __iomem *base;
-	u32 val;
-
-	np = of_find_compatible_node(NULL, NULL, "fsl,imx6q-ocotp");
-	if (!np) {
-		pr_warn("failed to find ocotp node\n");
-		return;
-	}
-
-	base = of_iomap(np, 0);
-	if (!base) {
-		pr_warn("failed to map ocotp\n");
-		goto put_node;
-	}
-
-	/*
-	 * SPEED_GRADING[1:0] defines the max speed of ARM:
-	 * 2b'11: 1200000000Hz;
-	 * 2b'10: 996000000Hz;
-	 * 2b'01: 852000000Hz; -- i.MX6Q Only, exclusive with 996MHz.
-	 * 2b'00: 792000000Hz;
-	 * We need to set the max speed of ARM according to fuse map.
-	 */
-	val = readl_relaxed(base + OCOTP_CFG3);
-	val >>= OCOTP_CFG3_SPEED_SHIFT;
-	val &= 0x3;
-
-	if ((val != OCOTP_CFG3_SPEED_1P2GHZ) && cpu_is_imx6q())
-		if (dev_pm_opp_disable(cpu_dev, 1200000000))
-			pr_warn("failed to disable 1.2 GHz OPP\n");
-	if (val < OCOTP_CFG3_SPEED_996MHZ)
-		if (dev_pm_opp_disable(cpu_dev, 996000000))
-			pr_warn("failed to disable 996 MHz OPP\n");
-	if (cpu_is_imx6q()) {
-		if (val != OCOTP_CFG3_SPEED_852MHZ)
-			if (dev_pm_opp_disable(cpu_dev, 852000000))
-				pr_warn("failed to disable 852 MHz OPP\n");
-	}
-	iounmap(base);
-put_node:
-	of_node_put(np);
-}
-
-static void __init imx6q_opp_init(void)
-{
-	struct device_node *np;
-	struct device *cpu_dev = get_cpu_device(0);
-
-	if (!cpu_dev) {
-		pr_warn("failed to get cpu0 device\n");
-		return;
-	}
-	np = of_node_get(cpu_dev->of_node);
-	if (!np) {
-		pr_warn("failed to find cpu0 node\n");
-		return;
-	}
-
-	if (dev_pm_opp_of_add_table(cpu_dev)) {
-		pr_warn("failed to init OPP table\n");
-		goto put_node;
-	}
-
-	imx6q_opp_check_speed_grading(cpu_dev);
-
-put_node:
-	of_node_put(np);
-}
-
-static struct platform_device imx6q_cpufreq_pdev = {
-	.name = "imx6q-cpufreq",
-};
-
 static void __init imx6q_init_late(void)
 {
 	/*
@@ -377,10 +295,8 @@ static void __init imx6q_init_late(void)
 	if (imx_get_soc_revision() > IMX_CHIP_REVISION_1_1)
 		imx6q_cpuidle_init();
 
-	if (IS_ENABLED(CONFIG_ARM_IMX6Q_CPUFREQ)) {
-		imx6q_opp_init();
-		platform_device_register(&imx6q_cpufreq_pdev);
-	}
+	if (IS_ENABLED(CONFIG_ARM_IMX6Q_CPUFREQ))
+		platform_device_register_simple("imx6q-cpufreq", -1, NULL, 0);
 }
 
 static void __init imx6q_map_io(void)
drivers/cpufreq/imx6q-cpufreq.c +65 -20

105 lines not on this page · raw message

Signature · 1 line
2.7.4
maintainer
#1 lore raw

PATCH v3 1/1 cpufreq: imx6q: Move speed grading check to cpufreq driver

Quoted 26 lines · Fabio Estevam

From: Fabio Estevam <[email protected]>

On some i.MX6 SoCs (like i.MX6SL, i.MX6SX and i.MX6UL) that do not have speed grading check, opp table will not be created in platform code, so cpufreq driver prints the following error message:

cpu cpu0: dev_pm_opp_get_opp_count: OPP table not found (-19)

However, this is not really an error in this case because the imx6q-cpufreq driver first calls dev_pm_opp_get_opp_count() and if it fails, it means that platform code does not provide OPP and then dev_pm_opp_of_add_table() will be called.

In order to avoid such confusing error message, move the speed grading check from platform code to the imx6q-cpufreq driver.

This way the imx6q-cpufreq no longer has to check whether OPP table is supplied by platform code.

Tested on a i.MX6Q and i.MX6UL based boards.

---
Previous discussion on this topic:
https://patchwork.kernel.org/patch/9295059/

Quoted 5 lines

Changes since v2:
- Fixed a typo in the commit log (missed SL) - Otavio
- Remove __init anotation from imx6q_opp_check_speed_grading() Changes since v1:
- Remove unneeded has_speed_grading() function.

Looks fine to me.

@Shawn: Can you please let us know if you are fine with it?

Signature · 1 line
viresh
#2 lore raw

PATCH v3 1/1 cpufreq: imx6q: Move speed grading check to cpufreq driver

Quoted 33 lines · Viresh Kumar
Quoted 26 lines · Fabio Estevam

From: Fabio Estevam <[email protected]>

On some i.MX6 SoCs (like i.MX6SL, i.MX6SX and i.MX6UL) that do not have speed grading check, opp table will not be created in platform code, so cpufreq driver prints the following error message:

cpu cpu0: dev_pm_opp_get_opp_count: OPP table not found (-19)

However, this is not really an error in this case because the imx6q-cpufreq driver first calls dev_pm_opp_get_opp_count() and if it fails, it means that platform code does not provide OPP and then dev_pm_opp_of_add_table() will be called.

In order to avoid such confusing error message, move the speed grading check from platform code to the imx6q-cpufreq driver.

This way the imx6q-cpufreq no longer has to check whether OPP table is supplied by platform code.

Tested on a i.MX6Q and i.MX6UL based boards.

---
Previous discussion on this topic:
https://patchwork.kernel.org/patch/9295059/

Quoted 5 lines

Changes since v2:
- Fixed a typo in the commit log (missed SL) - Otavio
- Remove __init anotation from imx6q_opp_check_speed_grading() Changes since v1:
- Remove unneeded has_speed_grading() function.

Quoted 3 lines

Looks fine to me.

@Shawn: Can you please let us know if you are fine with it?

author reviewer
#3 lore raw

PATCH v3 1/1 cpufreq: imx6q: Move speed grading check to cpufreq driver

Hi Viresh,

Quoted 5 lines · Shawn Guo
Quoted 3 lines

Looks fine to me.

@Shawn: Can you please let us know if you are fine with it?

Will this one go through your tree?

Thanks

#4 lore raw

PATCH v3 1/1 cpufreq: imx6q: Move speed grading check to cpufreq driver

Quoted 11 lines · CEST Fabio Estevam

Hi Viresh,

Quoted 5 lines · Shawn Guo
Quoted 3 lines

Looks fine to me.

@Shawn: Can you please let us know if you are fine with it?

Will this one go through your tree?

No, it won't.

It could go in via the PM tree (which covers cpufreq), but I'd prefer it to go in via arm-soc.

Thanks,
Rafael

author reviewer
#5 lore raw

PATCH v3 1/1 cpufreq: imx6q: Move speed grading check to cpufreq driver

Quoted 2 lines · Rafael J. Wysocki

It could go in via the PM tree (which covers cpufreq), but I'd prefer it to go in via arm-soc.

Sounds good for me. In this case I think Shawn will apply it.

Thanks

#6 lore raw

PATCH v3 1/1 cpufreq: imx6q: Move speed grading check to cpufreq driver

Quoted 6 lines · Fabio Estevam
Quoted 2 lines · Rafael J. Wysocki

It could go in via the PM tree (which covers cpufreq), but I'd prefer it to go in via arm-soc.

Sounds good for me. In this case I think Shawn will apply it.

Okay, applied to imx/soc branch, thanks.

Shawn