Re: [U-Boot] [PATCH 11/13] i.MX28: Add battery boot components to SPL
Dear Lauri Hintsala, > On 07/25/2012 10:28 PM, Marek Vasut wrote: > > Dear Lauri Hintsala, > > > >> On 07/25/2012 05:17 PM, Lauri Hintsala wrote: > >>> Hi Marek, > >>> > >>> On 05/02/2012 12:09 AM, Marek Vasut wrote: > From: Marek Vasut > > Signed-off-by: Marek Vasut > Cc: Detlev Zundel > Cc: Fabio Estevam > Cc: Stefano Babic > Cc: Wolfgang Denk > --- > > arch/arm/cpu/arm926ejs/mx28/spl_power_init.c | 100 > > +++--- > > 1 file changed, 92 insertions(+), 8 deletions(-) > >>> > >>> This patch increases the power consumption about 250 mW (~50mA @ 5V). I > >>> think it could be nice to disable LRADC after spl boot if it is not > >>> really needed. > >> > >> This happens only on our machine. The increase is only 25 mW (5mA) on > >> mx28evk. > > > > You tried with latest mainline? > > Yes, I'm using v2012.07-rc2. > > > Sure it's OK to disable LRADC afterwards, will you submit a patch please? > > I just noticed the power was not eaten by LRADC. Power consumption is > increasing because of a battery charger. The charger circuit is enabled > even if the machine has no a battery connected to CPU. > > I added debug code to see the status of the battery charger: > > --- a/arch/arm/cpu/arm926ejs/mx28/spl_power_init.c > +++ b/arch/arm/cpu/arm926ejs/mx28/spl_power_init.c > @@ -1003,6 +1003,14 @@ void mx28_power_init(void) > > writel(POWER_5VCTRL_PWDN_5VBRNOUT, &power_regs->hw_power_5vctrl_set); > > + /* > + power_regs->hw_power_charge_set = POWER_CHARGE_PWD_BATTCHRG; > + early_delay(1000); > + */ > + > + serial_printf("Charger circuit: %s\n", > + power_regs->hw_power_charge & POWER_CHARGE_PWD_BATTCHRG?"down":"up"); > + > early_delay(1000); > } > > After disabling battery charger at the end of power init 25 mW power > leak has been gone. Tested with mx28evk rev D. Is there any reason to > enable the charger without a battery? No, no reason at all, disable it in case you're not running from battery. But please cross check with imx bootlets. > Lauri 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 11/13] i.MX28: Add battery boot components to SPL
On 07/25/2012 10:28 PM, Marek Vasut wrote: Dear Lauri Hintsala, On 07/25/2012 05:17 PM, Lauri Hintsala wrote: Hi Marek, On 05/02/2012 12:09 AM, Marek Vasut wrote: From: Marek Vasut Signed-off-by: Marek Vasut Cc: Detlev Zundel Cc: Fabio Estevam Cc: Stefano Babic Cc: Wolfgang Denk --- arch/arm/cpu/arm926ejs/mx28/spl_power_init.c | 100 +++--- 1 file changed, 92 insertions(+), 8 deletions(-) This patch increases the power consumption about 250 mW (~50mA @ 5V). I think it could be nice to disable LRADC after spl boot if it is not really needed. This happens only on our machine. The increase is only 25 mW (5mA) on mx28evk. You tried with latest mainline? Yes, I'm using v2012.07-rc2. Sure it's OK to disable LRADC afterwards, will you submit a patch please? I just noticed the power was not eaten by LRADC. Power consumption is increasing because of a battery charger. The charger circuit is enabled even if the machine has no a battery connected to CPU. I added debug code to see the status of the battery charger: --- a/arch/arm/cpu/arm926ejs/mx28/spl_power_init.c +++ b/arch/arm/cpu/arm926ejs/mx28/spl_power_init.c @@ -1003,6 +1003,14 @@ void mx28_power_init(void) writel(POWER_5VCTRL_PWDN_5VBRNOUT, &power_regs->hw_power_5vctrl_set); + /* + power_regs->hw_power_charge_set = POWER_CHARGE_PWD_BATTCHRG; + early_delay(1000); + */ + + serial_printf("Charger circuit: %s\n", + power_regs->hw_power_charge & POWER_CHARGE_PWD_BATTCHRG?"down":"up"); + early_delay(1000); } After disabling battery charger at the end of power init 25 mW power leak has been gone. Tested with mx28evk rev D. Is there any reason to enable the charger without a battery? Lauri ___ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot
Re: [U-Boot] [PATCH 11/13] i.MX28: Add battery boot components to SPL
Dear Lauri Hintsala, > On 07/25/2012 05:17 PM, Lauri Hintsala wrote: > > Hi Marek, > > > > On 05/02/2012 12:09 AM, Marek Vasut wrote: > >> From: Marek Vasut > >> > >> Signed-off-by: Marek Vasut > >> Cc: Detlev Zundel > >> Cc: Fabio Estevam > >> Cc: Stefano Babic > >> Cc: Wolfgang Denk > >> --- > >> > >> arch/arm/cpu/arm926ejs/mx28/spl_power_init.c | 100 > >> > >> +++--- > >> > >> 1 file changed, 92 insertions(+), 8 deletions(-) > > > > This patch increases the power consumption about 250 mW (~50mA @ 5V). I > > think it could be nice to disable LRADC after spl boot if it is not > > really needed. > > This happens only on our machine. The increase is only 25 mW (5mA) on > mx28evk. You tried with latest mainline? Sure it's OK to disable LRADC afterwards, will you submit a patch please? > Lauri 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 11/13] i.MX28: Add battery boot components to SPL
On 07/25/2012 05:17 PM, Lauri Hintsala wrote: Hi Marek, On 05/02/2012 12:09 AM, Marek Vasut wrote: From: Marek Vasut Signed-off-by: Marek Vasut Cc: Detlev Zundel Cc: Fabio Estevam Cc: Stefano Babic Cc: Wolfgang Denk --- arch/arm/cpu/arm926ejs/mx28/spl_power_init.c | 100 +++--- 1 file changed, 92 insertions(+), 8 deletions(-) This patch increases the power consumption about 250 mW (~50mA @ 5V). I think it could be nice to disable LRADC after spl boot if it is not really needed. This happens only on our machine. The increase is only 25 mW (5mA) on mx28evk. Lauri ___ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot
Re: [U-Boot] [PATCH 11/13] i.MX28: Add battery boot components to SPL
Hi Marek, On 05/02/2012 12:09 AM, Marek Vasut wrote: From: Marek Vasut Signed-off-by: Marek Vasut Cc: Detlev Zundel Cc: Fabio Estevam Cc: Stefano Babic Cc: Wolfgang Denk --- arch/arm/cpu/arm926ejs/mx28/spl_power_init.c | 100 +++--- 1 file changed, 92 insertions(+), 8 deletions(-) This patch increases the power consumption about 250 mW (~50mA @ 5V). I think it could be nice to disable LRADC after spl boot if it is not really needed. Best regards, Lauri Hintsala ___ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot
[U-Boot] [PATCH 11/13] i.MX28: Add battery boot components to SPL
From: Marek Vasut Signed-off-by: Marek Vasut Cc: Detlev Zundel Cc: Fabio Estevam Cc: Stefano Babic Cc: Wolfgang Denk --- arch/arm/cpu/arm926ejs/mx28/spl_power_init.c | 100 +++--- 1 file changed, 92 insertions(+), 8 deletions(-) diff --git a/arch/arm/cpu/arm926ejs/mx28/spl_power_init.c b/arch/arm/cpu/arm926ejs/mx28/spl_power_init.c index ac942b4..4b09b0c 100644 --- a/arch/arm/cpu/arm926ejs/mx28/spl_power_init.c +++ b/arch/arm/cpu/arm926ejs/mx28/spl_power_init.c @@ -45,11 +45,11 @@ void mx28_power_clock2pll(void) struct mx28_clkctrl_regs *clkctrl_regs = (struct mx28_clkctrl_regs *)MXS_CLKCTRL_BASE; - writel(CLKCTRL_PLL0CTRL0_POWER, - &clkctrl_regs->hw_clkctrl_pll0ctrl0_set); + setbits_le32(&clkctrl_regs->hw_clkctrl_pll0ctrl0, + CLKCTRL_PLL0CTRL0_POWER); early_delay(100); - writel(CLKCTRL_CLKSEQ_BYPASS_CPU, - &clkctrl_regs->hw_clkctrl_clkseq_clr); + setbits_le32(&clkctrl_regs->hw_clkctrl_clkseq, + CLKCTRL_CLKSEQ_BYPASS_CPU); } void mx28_power_clear_auto_restart(void) @@ -455,9 +455,14 @@ void mx28_power_enable_4p2(void) mx28_power_init_4p2_regulator(); /* Shutdown battery (none present) */ - clrbits_le32(&power_regs->hw_power_dcdc4p2, POWER_DCDC4P2_BO_MASK); - writel(POWER_CTRL_DCDC4P2_BO_IRQ, &power_regs->hw_power_ctrl_clr); - writel(POWER_CTRL_ENIRQ_DCDC4P2_BO, &power_regs->hw_power_ctrl_clr); + if (!mx28_is_batt_ready()) { + clrbits_le32(&power_regs->hw_power_dcdc4p2, + POWER_DCDC4P2_BO_MASK); + writel(POWER_CTRL_DCDC4P2_BO_IRQ, + &power_regs->hw_power_ctrl_clr); + writel(POWER_CTRL_ENIRQ_DCDC4P2_BO, + &power_regs->hw_power_ctrl_clr); + } mx28_power_init_dcdc_4p2_source(); @@ -515,6 +520,50 @@ void mx28_powerdown(void) &power_regs->hw_power_reset); } +void mx28_batt_boot(void) +{ + struct mx28_power_regs *power_regs = + (struct mx28_power_regs *)MXS_POWER_BASE; + + clrbits_le32(&power_regs->hw_power_5vctrl, POWER_5VCTRL_PWDN_5VBRNOUT); + clrbits_le32(&power_regs->hw_power_5vctrl, POWER_5VCTRL_ENABLE_DCDC); + + clrbits_le32(&power_regs->hw_power_dcdc4p2, + POWER_DCDC4P2_ENABLE_DCDC | POWER_DCDC4P2_ENABLE_4P2); + writel(POWER_CHARGE_ENABLE_LOAD, &power_regs->hw_power_charge_clr); + + /* 5V to battery handoff. */ + setbits_le32(&power_regs->hw_power_5vctrl, POWER_5VCTRL_DCDC_XFER); + early_delay(30); + clrbits_le32(&power_regs->hw_power_5vctrl, POWER_5VCTRL_DCDC_XFER); + + writel(POWER_CTRL_ENIRQ_DCDC4P2_BO, &power_regs->hw_power_ctrl_clr); + + clrsetbits_le32(&power_regs->hw_power_minpwr, + POWER_MINPWR_HALFFETS, POWER_MINPWR_DOUBLE_FETS); + + mx28_power_set_linreg(); + + clrbits_le32(&power_regs->hw_power_vdddctrl, + POWER_VDDDCTRL_DISABLE_FET | POWER_VDDDCTRL_ENABLE_LINREG); + + clrbits_le32(&power_regs->hw_power_vddactrl, + POWER_VDDACTRL_DISABLE_FET | POWER_VDDACTRL_ENABLE_LINREG); + + clrbits_le32(&power_regs->hw_power_vddioctrl, + POWER_VDDIOCTRL_DISABLE_FET); + + setbits_le32(&power_regs->hw_power_5vctrl, + POWER_5VCTRL_PWD_CHARGE_4P2_MASK); + + setbits_le32(&power_regs->hw_power_5vctrl, + POWER_5VCTRL_ENABLE_DCDC); + + clrsetbits_le32(&power_regs->hw_power_5vctrl, + POWER_5VCTRL_CHARGE_4P2_ILIMIT_MASK, + 0x8 << POWER_5VCTRL_CHARGE_4P2_ILIMIT_OFFSET); +} + void mx28_handle_5v_conflict(void) { struct mx28_power_regs *power_regs = @@ -539,6 +588,11 @@ void mx28_handle_5v_conflict(void) mx28_powerdown(); break; } + + if (tmp & POWER_STS_PSWITCH_MASK) { + mx28_batt_boot(); + break; + } } } @@ -595,12 +649,42 @@ void mx28_switch_vddd_to_dcdc_source(void) void mx28_power_configure_power_source(void) { + int batt_ready, batt_good; + struct mx28_power_regs *power_regs = + (struct mx28_power_regs *)MXS_POWER_BASE; + struct mx28_lradc_regs *lradc_regs = + (struct mx28_lradc_regs *)MXS_LRADC_BASE; + mx28_src_power_init(); - mx28_5v_boot(); + batt_ready = mx28_is_batt_ready(); + + if (readl(&power_regs->hw_power_sts) & POWER_STS_VDD5V_GT_VDDIO) { + batt_good = mx28_is_batt_good(); + if (batt_ready) { + /* 5V source detected, good battery detected. */ + mx28_batt_boot(); + } else { + if (batt_good) { + /* 5V source dete
[U-Boot] [PATCH 11/13] i.MX28: Add battery boot components to SPL
From: Marek Vasut Signed-off-by: Marek Vasut Cc: Detlev Zundel Cc: Fabio Estevam Cc: Stefano Babic Cc: Wolfgang Denk --- arch/arm/cpu/arm926ejs/mx28/spl_power_init.c | 100 +++--- 1 file changed, 92 insertions(+), 8 deletions(-) diff --git a/arch/arm/cpu/arm926ejs/mx28/spl_power_init.c b/arch/arm/cpu/arm926ejs/mx28/spl_power_init.c index ac942b4..4b09b0c 100644 --- a/arch/arm/cpu/arm926ejs/mx28/spl_power_init.c +++ b/arch/arm/cpu/arm926ejs/mx28/spl_power_init.c @@ -45,11 +45,11 @@ void mx28_power_clock2pll(void) struct mx28_clkctrl_regs *clkctrl_regs = (struct mx28_clkctrl_regs *)MXS_CLKCTRL_BASE; - writel(CLKCTRL_PLL0CTRL0_POWER, - &clkctrl_regs->hw_clkctrl_pll0ctrl0_set); + setbits_le32(&clkctrl_regs->hw_clkctrl_pll0ctrl0, + CLKCTRL_PLL0CTRL0_POWER); early_delay(100); - writel(CLKCTRL_CLKSEQ_BYPASS_CPU, - &clkctrl_regs->hw_clkctrl_clkseq_clr); + setbits_le32(&clkctrl_regs->hw_clkctrl_clkseq, + CLKCTRL_CLKSEQ_BYPASS_CPU); } void mx28_power_clear_auto_restart(void) @@ -455,9 +455,14 @@ void mx28_power_enable_4p2(void) mx28_power_init_4p2_regulator(); /* Shutdown battery (none present) */ - clrbits_le32(&power_regs->hw_power_dcdc4p2, POWER_DCDC4P2_BO_MASK); - writel(POWER_CTRL_DCDC4P2_BO_IRQ, &power_regs->hw_power_ctrl_clr); - writel(POWER_CTRL_ENIRQ_DCDC4P2_BO, &power_regs->hw_power_ctrl_clr); + if (!mx28_is_batt_ready()) { + clrbits_le32(&power_regs->hw_power_dcdc4p2, + POWER_DCDC4P2_BO_MASK); + writel(POWER_CTRL_DCDC4P2_BO_IRQ, + &power_regs->hw_power_ctrl_clr); + writel(POWER_CTRL_ENIRQ_DCDC4P2_BO, + &power_regs->hw_power_ctrl_clr); + } mx28_power_init_dcdc_4p2_source(); @@ -515,6 +520,50 @@ void mx28_powerdown(void) &power_regs->hw_power_reset); } +void mx28_batt_boot(void) +{ + struct mx28_power_regs *power_regs = + (struct mx28_power_regs *)MXS_POWER_BASE; + + clrbits_le32(&power_regs->hw_power_5vctrl, POWER_5VCTRL_PWDN_5VBRNOUT); + clrbits_le32(&power_regs->hw_power_5vctrl, POWER_5VCTRL_ENABLE_DCDC); + + clrbits_le32(&power_regs->hw_power_dcdc4p2, + POWER_DCDC4P2_ENABLE_DCDC | POWER_DCDC4P2_ENABLE_4P2); + writel(POWER_CHARGE_ENABLE_LOAD, &power_regs->hw_power_charge_clr); + + /* 5V to battery handoff. */ + setbits_le32(&power_regs->hw_power_5vctrl, POWER_5VCTRL_DCDC_XFER); + early_delay(30); + clrbits_le32(&power_regs->hw_power_5vctrl, POWER_5VCTRL_DCDC_XFER); + + writel(POWER_CTRL_ENIRQ_DCDC4P2_BO, &power_regs->hw_power_ctrl_clr); + + clrsetbits_le32(&power_regs->hw_power_minpwr, + POWER_MINPWR_HALFFETS, POWER_MINPWR_DOUBLE_FETS); + + mx28_power_set_linreg(); + + clrbits_le32(&power_regs->hw_power_vdddctrl, + POWER_VDDDCTRL_DISABLE_FET | POWER_VDDDCTRL_ENABLE_LINREG); + + clrbits_le32(&power_regs->hw_power_vddactrl, + POWER_VDDACTRL_DISABLE_FET | POWER_VDDACTRL_ENABLE_LINREG); + + clrbits_le32(&power_regs->hw_power_vddioctrl, + POWER_VDDIOCTRL_DISABLE_FET); + + setbits_le32(&power_regs->hw_power_5vctrl, + POWER_5VCTRL_PWD_CHARGE_4P2_MASK); + + setbits_le32(&power_regs->hw_power_5vctrl, + POWER_5VCTRL_ENABLE_DCDC); + + clrsetbits_le32(&power_regs->hw_power_5vctrl, + POWER_5VCTRL_CHARGE_4P2_ILIMIT_MASK, + 0x8 << POWER_5VCTRL_CHARGE_4P2_ILIMIT_OFFSET); +} + void mx28_handle_5v_conflict(void) { struct mx28_power_regs *power_regs = @@ -539,6 +588,11 @@ void mx28_handle_5v_conflict(void) mx28_powerdown(); break; } + + if (tmp & POWER_STS_PSWITCH_MASK) { + mx28_batt_boot(); + break; + } } } @@ -595,12 +649,42 @@ void mx28_switch_vddd_to_dcdc_source(void) void mx28_power_configure_power_source(void) { + int batt_ready, batt_good; + struct mx28_power_regs *power_regs = + (struct mx28_power_regs *)MXS_POWER_BASE; + struct mx28_lradc_regs *lradc_regs = + (struct mx28_lradc_regs *)MXS_LRADC_BASE; + mx28_src_power_init(); - mx28_5v_boot(); + batt_ready = mx28_is_batt_ready(); + + if (readl(&power_regs->hw_power_sts) & POWER_STS_VDD5V_GT_VDDIO) { + batt_good = mx28_is_batt_good(); + if (batt_ready) { + /* 5V source detected, good battery detected. */ + mx28_batt_boot(); + } else { + if (batt_good) { + /* 5V source dete