imx6: kernel: backport upstream fix for IMX6DL 800MHz speed grade
authorluka <luka@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Mon, 25 Aug 2014 21:50:43 +0000 (21:50 +0000)
committerluka <luka@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Mon, 25 Aug 2014 21:50:43 +0000 (21:50 +0000)
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>
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@42294 3c298f89-4303-0410-b956-a3cf2f4a3e73

target/linux/imx6/patches-3.14/0008-ARM-imx-add-speed-grading-check-for-i.mx6-soc.patch [new file with mode: 0644]

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 (file)
index 0000000..70b7014
--- /dev/null
@@ -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);