aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/imx6
diff options
context:
space:
mode:
authorLuka Perkov <luka@openwrt.org>2014-08-25 21:50:43 +0000
committerLuka Perkov <luka@openwrt.org>2014-08-25 21:50:43 +0000
commiteb75d320d1d65c1960f20f370ae3396fda1c404e (patch)
tree7234be3d58212742cf667dee3627341a7cbe11e7 /target/linux/imx6
parent0c14bea523076548375ee25f71923e828fc9905c (diff)
downloadupstream-eb75d320d1d65c1960f20f370ae3396fda1c404e.tar.gz
upstream-eb75d320d1d65c1960f20f370ae3396fda1c404e.tar.bz2
upstream-eb75d320d1d65c1960f20f370ae3396fda1c404e.zip
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
Diffstat (limited to 'target/linux/imx6')
-rw-r--r--target/linux/imx6/patches-3.14/0008-ARM-imx-add-speed-grading-check-for-i.mx6-soc.patch76
1 files changed, 76 insertions, 0 deletions
diff --git a/target/linux/imx6/patches-3.14/0008-ARM-imx-add-speed-grading-check-for-i.mx6-soc.patch b/target/linux/imx6/patches-3.14/0008-ARM-imx-add-speed-grading-check-for-i.mx6-soc.patch
new file mode 100644
index 0000000000..70b7014314
--- /dev/null
+++ b/target/linux/imx6/patches-3.14/0008-ARM-imx-add-speed-grading-check-for-i.mx6-soc.patch
@@ -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);