summaryrefslogtreecommitdiffstats
path: root/target/linux/imx6/patches-3.14/0008-ARM-imx-add-speed-grading-check-for-i.mx6-soc.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/imx6/patches-3.14/0008-ARM-imx-add-speed-grading-check-for-i.mx6-soc.patch')
-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);