summaryrefslogtreecommitdiff
path: root/arch/arm/mach-imx
diff options
context:
space:
mode:
authorBai Ping <ping.bai@nxp.com>2016-12-13 16:57:58 +0800
committerBai Ping <ping.bai@nxp.com>2017-02-08 17:45:31 +0800
commite8b9e8acb5ee44f48e048d744ccae4b6b02ef6a6 (patch)
tree412de2a3e0e3a514c4045feda729f4edf0062949 /arch/arm/mach-imx
parent0772724b5c2980e73a4f2914a8dd88bd1cc6916d (diff)
MLK-13601-02 ARM: imx: Add fuse check support for imx6ull
On i.MX6ULL, some part can run at 1GHz or 800MHz setpoint. we need to use the speed grading fuse to disable the unsupported setpoint. speed grading fuse define as below: 2'b00: Reserved; 2'b01: 528MHz; 2'b10: 792MHz; 2b'11: 996Mhz; Signed-off-by: Bai Ping <ping.bai@nxp.com>
Diffstat (limited to 'arch/arm/mach-imx')
-rw-r--r--arch/arm/mach-imx/mach-imx6ul.c33
1 files changed, 25 insertions, 8 deletions
diff --git a/arch/arm/mach-imx/mach-imx6ul.c b/arch/arm/mach-imx/mach-imx6ul.c
index 25760bd3459b..dcabfb199702 100644
--- a/arch/arm/mach-imx/mach-imx6ul.c
+++ b/arch/arm/mach-imx/mach-imx6ul.c
@@ -71,6 +71,7 @@ static void __init imx6ul_enet_phy_init(void)
#define OCOTP_CFG3 0x440
#define OCOTP_CFG3_SPEED_SHIFT 16
#define OCOTP_CFG3_SPEED_696MHZ 0x2
+#define OCOTP_CFG3_SPEED_1_GHZ 0x3
static void __init imx6ul_opp_check_speed_grading(struct device *cpu_dev)
{
@@ -78,7 +79,11 @@ static void __init imx6ul_opp_check_speed_grading(struct device *cpu_dev)
void __iomem *base;
u32 val;
- np = of_find_compatible_node(NULL, NULL, "fsl,imx6ul-ocotp");
+ if (cpu_is_imx6ul())
+ np = of_find_compatible_node(NULL, NULL, "fsl,imx6ul-ocotp");
+ else
+ np = of_find_compatible_node(NULL, NULL, "fsl,imx6ull-ocotp");
+
if (!np) {
pr_warn("failed to find ocotp node\n");
return;
@@ -94,17 +99,30 @@ static void __init imx6ul_opp_check_speed_grading(struct device *cpu_dev)
* Speed GRADING[1:0] defines the max speed of ARM:
* 2b'00: Reserved;
* 2b'01: 528000000Hz;
- * 2b'10: 700000000Hz;
- * 2b'11: Reserved;
+ * 2b'10: 700000000Hz(i.MX6UL), 800000000Hz(i.MX6ULL);
+ * 2b'11: Reserved(i.MX6UL), 1GHz(i.MX6ULL);
* 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 (cpu_is_imx6ul()) {
+ if (val < OCOTP_CFG3_SPEED_696MHZ) {
+ if (dev_pm_opp_disable(cpu_dev, 696000000))
+ pr_warn("Failed to disable 696MHz OPP\n");
+ }
+ }
+
+ if (cpu_is_imx6ull()) {
+ if (val != OCOTP_CFG3_SPEED_1_GHZ) {
+ if (dev_pm_opp_disable(cpu_dev, 996000000))
+ pr_warn("Failed to disable 996MHz OPP\n");
+ }
- if (val != OCOTP_CFG3_SPEED_696MHZ) {
- if (dev_pm_opp_disable(cpu_dev, 696000000))
- pr_warn("Failed to disable 696MHz OPP\n");
+ if (val != OCOTP_CFG3_SPEED_696MHZ) {
+ if (dev_pm_opp_disable(cpu_dev, 792000000))
+ pr_warn("Failed to disable 792MHz OPP\n");
+ }
}
iounmap(base);
@@ -173,8 +191,7 @@ static void __init imx6ul_init_irq(void)
static void __init imx6ul_init_late(void)
{
if (IS_ENABLED(CONFIG_ARM_IMX6Q_CPUFREQ)) {
- if (cpu_is_imx6ul())
- imx6ul_opp_init();
+ imx6ul_opp_init();
platform_device_register_simple("imx6q-cpufreq", -1, NULL, 0);
}