static void mxs_handle_5v_conflict(void) { struct mxs_power_regs *power_regs = (struct mxs_power_regs *)MXS_POWER_BASE; uint32_t tmp; setbits_le32(&power_regs->hw_power_vddioctrl, POWER_VDDIOCTRL_BO_OFFSET_MASK); for (;;) { tmp = readl(&power_regs->hw_power_sts); if (tmp & POWER_STS_VDDIO_BO) { /* * VDDIO has a brownout, then the VDD5V_GT_VDDIO becomes * unreliable */ mxs_powerdown(); break; } if (tmp & POWER_STS_VDD5V_GT_VDDIO) { mxs_boot_valid_5v(); break; } else { mxs_powerdown(); break; } if (tmp & POWER_STS_PSWITCH_MASK) { mxs_batt_boot(); break; } } }
/** * mxs_handle_5v_conflict() - Test if the 5V input is reliable * * This function tests if the 5V input can reliably supply the system. If it * can, then proceed to configuring the system to boot from 5V source, otherwise * try booting from battery supply. If we can not boot from battery supply * either, shut down the system. */ static void mxs_handle_5v_conflict(void) { struct mxs_power_regs *power_regs = (struct mxs_power_regs *)MXS_POWER_BASE; uint32_t tmp; debug("SPL: Resolving 5V conflict\n"); setbits_le32(&power_regs->hw_power_vddioctrl, POWER_VDDIOCTRL_BO_OFFSET_MASK); for (;;) { tmp = readl(&power_regs->hw_power_sts); if (tmp & POWER_STS_VDDIO_BO) { /* * VDDIO has a brownout, then the VDD5V_GT_VDDIO becomes * unreliable */ debug("SPL: VDDIO has a brownout\n"); mxs_powerdown(); break; } if (tmp & POWER_STS_VDD5V_GT_VDDIO) { debug("SPL: POWER_STS_VDD5V_GT_VDDIO is set\n"); mxs_boot_valid_5v(); break; } else { debug("SPL: POWER_STS_VDD5V_GT_VDDIO is not set\n"); mxs_powerdown(); break; } /* * TODO: I can't see this being reached. We'll either * powerdown or boot from a stable 5V supply. */ if (tmp & POWER_STS_PSWITCH_MASK) { debug("SPL: POWER_STS_PSWITCH_MASK is set\n"); mxs_batt_boot(); break; } } }