[U-Boot] [PATCH v3] MX28: Check if we are using a valid VBUS for power initialization
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
Re: [U-Boot] [PATCH v3] MX28: Check if we are using a valid VBUS for power initialization
Dear Otavio Salvador, 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 + */ 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 ___ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot
Re: [U-Boot] [PATCH v3] MX28: Check if we are using a valid VBUS for power initialization
On Sat, Aug 4, 2012 at 7:49 PM, Marek Vasut ma...@denx.de wrote: Dear Otavio Salvador, 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 + */ These should go into separate patch. Ok; will split it. 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. On bootlets mx28_valid_vbus() just returns 1 but the code of mx23 does implement it and on the datasheet of mx28 it seems a valid check. 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? Yes; this check is there too. But the comment about the difference between mx23 and mx28 code is applied here too. + (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; } Regards, -- Otavio Salvador O.S. Systems E-mail: ota...@ossystems.com.br http://www.ossystems.com.br Mobile: +55 53 9981-7854 http://projetos.ossystems.com.br ___ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot
Re: [U-Boot] [PATCH v3] MX28: Check if we are using a valid VBUS for power initialization
Dear Otavio Salvador, On Sat, Aug 4, 2012 at 7:49 PM, Marek Vasut ma...@denx.de wrote: Dear Otavio Salvador, Signed-off-by: Otavio Salvador ota...@ossystems.com.br --- [...] - /* - * 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? Yes; this check is there too. But the comment about the difference between mx23 and mx28 code is applied here too. According to 5VCTRL register (mx28 11.12.2) bit 4 (VBUSVALID_5VDETECT), this check is even redundant. Actually, if you don't use the VBUSVALID comparator, this check might fail I think. + (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; } Regards, Best regards, Marek Vasut ___ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot