/** * mxs_5v_boot() - Configure the power block to boot from 5V input * * This function handles configuration of the power block when supplied by * a 5V input. */ static void mxs_5v_boot(void) { struct mxs_power_regs *power_regs = (struct mxs_power_regs *)MXS_POWER_BASE; debug("SPL: Configuring power block to boot from 5V input\n"); /* * 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) { debug("SPL: 5V VDD good\n"); mxs_boot_valid_5v(); return; } early_delay(1000); if (readl(&power_regs->hw_power_sts) & POWER_STS_VDD5V_GT_VDDIO) { debug("SPL: 5V VDD good (after delay)\n"); mxs_boot_valid_5v(); return; } debug("SPL: 5V VDD not good\n"); mxs_handle_5v_conflict(); }
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; } } }
static void mxs_5v_boot(void) { struct mxs_power_regs *power_regs = (struct mxs_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) { mxs_boot_valid_5v(); return; } early_delay(1000); if (readl(&power_regs->hw_power_sts) & POWER_STS_VDD5V_GT_VDDIO) { mxs_boot_valid_5v(); return; } mxs_handle_5v_conflict(); }
/** * 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; } } }