Re: [U-Boot] [PATCH 11/13] i.MX28: Add battery boot components to SPL

2012-07-26 Thread 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 marek.va...@gmail.com

Signed-off-by: Marek Vasut marek.va...@gmail.com
Cc: Detlev Zundel d...@denx.de
Cc: Fabio Estevam fabio.este...@freescale.com
Cc: Stefano Babic sba...@denx.de
Cc: Wolfgang Denk w...@denx.de
---

   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

2012-07-26 Thread Marek Vasut
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 marek.va...@gmail.com
  
  Signed-off-by: Marek Vasut marek.va...@gmail.com
  Cc: Detlev Zundel d...@denx.de
  Cc: Fabio Estevam fabio.este...@freescale.com
  Cc: Stefano Babic sba...@denx.de
  Cc: Wolfgang Denk w...@denx.de
  ---
  
 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

2012-07-25 Thread Lauri Hintsala

Hi Marek,

On 05/02/2012 12:09 AM, Marek Vasut wrote:

From: Marek Vasut marek.va...@gmail.com

Signed-off-by: Marek Vasut marek.va...@gmail.com
Cc: Detlev Zundel d...@denx.de
Cc: Fabio Estevam fabio.este...@freescale.com
Cc: Stefano Babic sba...@denx.de
Cc: Wolfgang Denk w...@denx.de
---
  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


Re: [U-Boot] [PATCH 11/13] i.MX28: Add battery boot components to SPL

2012-07-25 Thread 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 marek.va...@gmail.com

Signed-off-by: Marek Vasut marek.va...@gmail.com
Cc: Detlev Zundel d...@denx.de
Cc: Fabio Estevam fabio.este...@freescale.com
Cc: Stefano Babic sba...@denx.de
Cc: Wolfgang Denk w...@denx.de
---
  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

2012-07-25 Thread Marek Vasut
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 marek.va...@gmail.com
  
  Signed-off-by: Marek Vasut marek.va...@gmail.com
  Cc: Detlev Zundel d...@denx.de
  Cc: Fabio Estevam fabio.este...@freescale.com
  Cc: Stefano Babic sba...@denx.de
  Cc: Wolfgang Denk w...@denx.de
  ---
  
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


[U-Boot] [PATCH 11/13] i.MX28: Add battery boot components to SPL

2012-05-01 Thread Marek Vasut
From: Marek Vasut marek.va...@gmail.com

Signed-off-by: Marek Vasut marek.va...@gmail.com
Cc: Detlev Zundel d...@denx.de
Cc: Fabio Estevam fabio.este...@freescale.com
Cc: Stefano Babic sba...@denx.de
Cc: Wolfgang Denk w...@denx.de
---
 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) 

[U-Boot] [PATCH 11/13] i.MX28: Add battery boot components to SPL

2012-05-01 Thread Marek Vasut
From: Marek Vasut marek.va...@gmail.com

Signed-off-by: Marek Vasut marek.va...@gmail.com
Cc: Detlev Zundel d...@denx.de
Cc: Fabio Estevam fabio.este...@freescale.com
Cc: Stefano Babic sba...@denx.de
Cc: Wolfgang Denk w...@denx.de
---
 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)