imx6: kernel: backport upstream fix for IMX6DL 800MHz speed grade
A previous backported patch that adds freq/voltage operating points for the IMX6DL processor can cause hang/crash (general instability) on IMX6DL processors in the industrial/automative speed grades as they don't support 1GHz operation. This adds another backported patch from mainline that uses IMX6 fuse settings to properly remove invalid operating points for the particular CPU grade used. Signed-off-by: Tim Harvey <tharvey@gateworks.com> SVN-Revision: 42294
This commit is contained in:
parent
0c14bea523
commit
eb75d320d1
1 changed files with 76 additions and 0 deletions
|
@ -0,0 +1,76 @@
|
|||
From c962a0996335fae7f79e64677f47d4784b86f692 Mon Sep 17 00:00:00 2001
|
||||
From: Anson Huang <b20788@freescale.com>
|
||||
Date: Wed, 12 Feb 2014 17:57:03 +0800
|
||||
Subject: [PATCH] ARM: imx: add speed grading check for i.mx6 soc
|
||||
|
||||
The fuse map of speed_grading[1:0] defines the max speed
|
||||
of ARM, see below the definition:
|
||||
|
||||
2b'11: 1200000000Hz;
|
||||
2b'10: 996000000Hz;
|
||||
2b'01: 852000000Hz; -- i.MX6Q Only, exclusive with 996MHz.
|
||||
2b'00: 792000000Hz;
|
||||
|
||||
Need to remove all illegal setpoints according to fuse
|
||||
map.
|
||||
|
||||
Signed-off-by: Anson Huang <b20788@freescale.com>
|
||||
Signed-off-by: Shawn Guo <shawn.guo@linaro.org>
|
||||
---
|
||||
arch/arm/mach-imx/mach-imx6q.c | 26 +++++++++++++++++++++++---
|
||||
1 file changed, 23 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/arch/arm/mach-imx/mach-imx6q.c
|
||||
+++ b/arch/arm/mach-imx/mach-imx6q.c
|
||||
@@ -219,8 +219,10 @@ static void __init imx6q_init_machine(vo
|
||||
#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_1p2ghz(struct device *cpu_dev)
|
||||
+static void __init imx6q_opp_check_speed_grading(struct device *cpu_dev)
|
||||
{
|
||||
struct device_node *np;
|
||||
void __iomem *base;
|
||||
@@ -238,11 +240,29 @@ static void __init imx6q_opp_check_1p2gh
|
||||
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;
|
||||
- if ((val & 0x3) != OCOTP_CFG3_SPEED_1P2GHZ)
|
||||
+ val &= 0x3;
|
||||
+
|
||||
+ if (val != OCOTP_CFG3_SPEED_1P2GHZ)
|
||||
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");
|
||||
+ }
|
||||
|
||||
put_node:
|
||||
of_node_put(np);
|
||||
@@ -268,7 +288,7 @@ static void __init imx6q_opp_init(void)
|
||||
goto put_node;
|
||||
}
|
||||
|
||||
- imx6q_opp_check_1p2ghz(cpu_dev);
|
||||
+ imx6q_opp_check_speed_grading(cpu_dev);
|
||||
|
||||
put_node:
|
||||
of_node_put(np);
|
Loading…
Reference in a new issue