From mboxrd@z Thu Jan 1 00:00:00 1970 From: Marek Vasut Date: Sun, 5 Aug 2012 00:49:04 +0200 Subject: [U-Boot] [PATCH v3] MX28: Check if we are using a valid VBUS for power initialization In-Reply-To: <1344120280-7469-1-git-send-email-otavio@ossystems.com.br> References: <1344120280-7469-1-git-send-email-otavio@ossystems.com.br> Message-ID: <201208050049.04363.marex@denx.de> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Dear Otavio Salvador, > Signed-off-by: Otavio Salvador > --- > 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 > + */ These should go into separate patch. > mx28_powerdown(); > break; > } > > - if (tmp & POWER_STS_VDD5V_GT_VDDIO) { > + if (mx28_valid_vbus() || (tmp & POWER_STS_VDD5V_GT_VDDIO)) { And if VDD5V_GT_VDDIO isn't true, this will crash. > 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() && And again ... you unconditionally add something that will break other boards that aren't supplied from 5V. This part isn't present in mx28 bootlets if I'm right, yes? > + (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; > } Best regards, Marek Vasut