imx: Add PHYTEC phyBOARD-i.MX6UL-Segin
[oweals/u-boot.git] / arch / arm / mach-imx / mx6 / ddr.c
index 43b77cfa4166609cf3ce6d71e74d12b612f6c224..84b92362495a6b540b1f3289afeda1d66b9c6c24 100644 (file)
@@ -1,8 +1,7 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * Copyright (C) 2014 Gateworks Corporation
  * Author: Tim Harvey <tharvey@gateworks.com>
- *
- * SPDX-License-Identifier:     GPL-2.0+
  */
 
 #include <common.h>
@@ -85,6 +84,23 @@ static void modify_dg_result(u32 *reg_st0, u32 *reg_st1, u32 *reg_ctrl)
        writel(val_ctrl, reg_ctrl);
 }
 
+static void correct_mpwldectr_result(void *reg)
+{
+       /* Limit is 200/256 of CK, which is WL_HC_DELx | 0x48. */
+       const unsigned int limit = 0x148;
+       u32 val = readl(reg);
+       u32 old = val;
+
+       if ((val & 0x17f) > limit)
+               val &= 0xffff << 16;
+
+       if (((val >> 16) & 0x17f) > limit)
+               val &= 0xffff;
+
+       if (old != val)
+               writel(val, reg);
+}
+
 int mmdc_do_write_level_calibration(struct mx6_ddr_sysinfo const *sysinfo)
 {
        struct mmdc_p_regs *mmdc0 = (struct mmdc_p_regs *)MMDC_P0_BASE_ADDR;
@@ -176,6 +192,13 @@ int mmdc_do_write_level_calibration(struct mx6_ddr_sysinfo const *sysinfo)
                errors |= 4;
        }
 
+       correct_mpwldectr_result(&mmdc0->mpwldectrl0);
+       correct_mpwldectr_result(&mmdc0->mpwldectrl1);
+       if (sysinfo->dsize == 2) {
+               correct_mpwldectr_result(&mmdc1->mpwldectrl0);
+               correct_mpwldectr_result(&mmdc1->mpwldectrl1);
+       }
+
        /*
         * User should issue MRS command to exit write leveling mode
         * through Load Mode Register command