Signed-off-by: Otavio Salvador <ota...@ossystems.com.br>
---
Changes in v2:
- add comments
- fix when we have vbus OR vdd5v
- improve patch short description

Changes in v3:
- change short-description prefix

 arch/arm/cpu/arm926ejs/mx28/spl_power_init.c |   26 +++++++++++++++++++-------
 1 file changed, 19 insertions(+), 7 deletions(-)

diff --git a/arch/arm/cpu/arm926ejs/mx28/spl_power_init.c 
b/arch/arm/cpu/arm926ejs/mx28/spl_power_init.c
index 4b09b0c..fdf810c 100644
--- a/arch/arm/cpu/arm926ejs/mx28/spl_power_init.c
+++ b/arch/arm/cpu/arm926ejs/mx28/spl_power_init.c
@@ -564,6 +564,15 @@ void mx28_batt_boot(void)
                0x8 << POWER_5VCTRL_CHARGE_4P2_ILIMIT_OFFSET);
 }
 
+static int mx28_valid_vbus(void)
+{
+       struct mx28_power_regs *power_regs =
+               (struct mx28_power_regs *)MXS_POWER_BASE;
+
+       /* iMX23 uses POWER_STS_VBUSVALID_STATUS at same offset */
+       return readl(&power_regs->hw_power_sts) & POWER_STS_VBUSVALID0_STATUS;
+}
+
 void mx28_handle_5v_conflict(void)
 {
        struct mx28_power_regs *power_regs =
@@ -577,14 +586,19 @@ void mx28_handle_5v_conflict(void)
                tmp = readl(&power_regs->hw_power_sts);
 
                if (tmp & POWER_STS_VDDIO_BO) {
+                       /*
+                        * VDDIO has a brownout, then the VDD5V_GT_VDDIO becomes
+                        * unreliable
+                        */
                        mx28_powerdown();
                        break;
                }
 
-               if (tmp & POWER_STS_VDD5V_GT_VDDIO) {
+               if (mx28_valid_vbus() || (tmp & POWER_STS_VDD5V_GT_VDDIO)) {
                        mx28_boot_valid_5v();
                        break;
                } else {
+                       /* Neither 5v sees 5v so we power down */
                        mx28_powerdown();
                        break;
                }
@@ -601,17 +615,15 @@ void mx28_5v_boot(void)
        struct mx28_power_regs *power_regs =
                (struct mx28_power_regs *)MXS_POWER_BASE;
 
-       /*
-        * NOTE: In original IMX-Bootlets, this also checks for VBUSVALID,
-        * but their implementation always returns 1 so we omit it here.
-        */
-       if (readl(&power_regs->hw_power_sts) & POWER_STS_VDD5V_GT_VDDIO) {
+       if (mx28_valid_vbus() &&
+               (readl(&power_regs->hw_power_sts) & POWER_STS_VDD5V_GT_VDDIO)) {
                mx28_boot_valid_5v();
                return;
        }
 
        early_delay(1000);
-       if (readl(&power_regs->hw_power_sts) & POWER_STS_VDD5V_GT_VDDIO) {
+       if (mx28_valid_vbus() &&
+               (readl(&power_regs->hw_power_sts) & POWER_STS_VDD5V_GT_VDDIO)) {
                mx28_boot_valid_5v();
                return;
        }
-- 
1.7.10.4

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to