aboutsummaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorFrank Li <Frank.Li@freescale.com>2010-03-23 17:43:34 +0800
committerFrank Li <Frank.Li@freescale.com>2010-03-24 13:38:08 +0800
commit587541d962c3721b9830981424037ddc920083e9 (patch)
treee8eddb24f5599048d2c10f7a14de98d8247ac030 /drivers
parent2228ca928df6d7aa061bf7641e702a2f1da77419 (diff)
ENGR00121885 Fix power source switch issue on Mx23 and Mx28
Add protection when set ENABLE_DCDC bit. Signed-off-by: Frank Li <Frank.Li@freescale.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/power/mxs/ddi_power_battery.c61
1 files changed, 57 insertions, 4 deletions
diff --git a/drivers/power/mxs/ddi_power_battery.c b/drivers/power/mxs/ddi_power_battery.c
index d19b6633950..9660ab6f671 100644
--- a/drivers/power/mxs/ddi_power_battery.c
+++ b/drivers/power/mxs/ddi_power_battery.c
@@ -425,8 +425,8 @@ void ddi_power_execute_battery_to_5v_handoff(void)
void ddi_power_Start4p2Dcdc(bool battery_ready)
{
-
uint32_t temp_reg, old_values;
+ bool vdda_pwdn = false, vddd_pwdn = false, vddio_pwdn = false;
#ifndef CONFIG_ARCH_MX28
/* set vbusvalid threshold to 2.9V because of errata */
@@ -434,7 +434,6 @@ void ddi_power_Start4p2Dcdc(bool battery_ready)
REGS_POWER_BASE + HW_POWER_5VCTRL_CLR);
#endif
-
#if 0
if (battery_ready)
ddi_power_EnableBatteryIrq();
@@ -460,6 +459,44 @@ void ddi_power_Start4p2Dcdc(bool battery_ready)
__raw_writel(BM_POWER_5VCTRL_VBUSVALID_5VDETECT,
REGS_POWER_BASE + HW_POWER_5VCTRL_CLR);
+ if (__raw_readl(REGS_POWER_BASE + HW_POWER_VDDIOCTRL)
+ & BM_POWER_VDDIOCTRL_PWDN_BRNOUT)
+ vddio_pwdn = true;
+
+ if (__raw_readl(REGS_POWER_BASE + HW_POWER_VDDDCTRL)
+ & BM_POWER_VDDDCTRL_PWDN_BRNOUT)
+ vddd_pwdn = true;
+
+ if (__raw_readl(REGS_POWER_BASE + HW_POWER_VDDACTRL)
+ & BM_POWER_VDDACTRL_PWDN_BRNOUT)
+ vdda_pwdn = true;
+
+ __raw_writel(__raw_readl(REGS_POWER_BASE + HW_POWER_VDDACTRL)
+ & (~BM_POWER_VDDACTRL_PWDN_BRNOUT),
+ REGS_POWER_BASE + HW_POWER_VDDACTRL);
+
+ __raw_writel(__raw_readl(REGS_POWER_BASE + HW_POWER_VDDDCTRL)
+ & (~BM_POWER_VDDDCTRL_PWDN_BRNOUT),
+ REGS_POWER_BASE + HW_POWER_VDDDCTRL);
+
+ __raw_writel(__raw_readl(REGS_POWER_BASE + HW_POWER_VDDIOCTRL)
+ & (~BM_POWER_VDDIOCTRL_PWDN_BRNOUT),
+ REGS_POWER_BASE + HW_POWER_VDDIOCTRL);
+
+ if ((__raw_readl(REGS_POWER_BASE + HW_POWER_STS)
+ & BM_POWER_STS_VDDIO_BO) == 0)
+ __raw_writel(BM_POWER_CTRL_VDDIO_BO_IRQ,
+ REGS_POWER_BASE + HW_POWER_CTRL_CLR);
+
+ if ((__raw_readl(REGS_POWER_BASE + HW_POWER_STS)
+ & BM_POWER_STS_VDDD_BO) == 0)
+ __raw_writel(BM_POWER_CTRL_VDDD_BO_IRQ,
+ REGS_POWER_BASE + HW_POWER_CTRL_CLR);
+
+ if ((__raw_readl(REGS_POWER_BASE + HW_POWER_STS)
+ & BM_POWER_STS_VDDA_BO) == 0)
+ __raw_writel(BM_POWER_CTRL_VDDA_BO_IRQ,
+ REGS_POWER_BASE + HW_POWER_CTRL_CLR);
temp_reg = (BM_POWER_CTRL_ENIRQ_VDDD_BO |
BM_POWER_CTRL_ENIRQ_VDDA_BO |
@@ -488,6 +525,7 @@ void ddi_power_Start4p2Dcdc(bool battery_ready)
BM_POWER_CTRL_VDD5V_DROOP_IRQ |
BM_POWER_CTRL_VBUSVALID_IRQ);
+ __raw_writel(temp_reg, REGS_POWER_BASE + HW_POWER_CTRL_CLR);
/* stay in this loop until the false brownout indciations
* no longer occur or until 5V actually goes away
*/
@@ -498,10 +536,24 @@ void ddi_power_Start4p2Dcdc(bool battery_ready)
mdelay(1);
}
-
/* revert to previous enable irq values */
__raw_writel(old_values, REGS_POWER_BASE + HW_POWER_CTRL_SET);
+ if (vdda_pwdn)
+ __raw_writel(__raw_readl(REGS_POWER_BASE + HW_POWER_VDDACTRL)
+ | BM_POWER_VDDACTRL_PWDN_BRNOUT,
+ REGS_POWER_BASE + HW_POWER_VDDACTRL);
+
+ if (vddd_pwdn)
+ __raw_writel(__raw_readl(REGS_POWER_BASE + HW_POWER_VDDDCTRL)
+ | BM_POWER_VDDDCTRL_PWDN_BRNOUT,
+ REGS_POWER_BASE + HW_POWER_VDDDCTRL);
+
+ if (vddio_pwdn)
+ __raw_writel(__raw_readl(REGS_POWER_BASE + HW_POWER_VDDIOCTRL)
+ | BM_POWER_VDDIOCTRL_PWDN_BRNOUT,
+ REGS_POWER_BASE + HW_POWER_VDDIOCTRL);
+
if (DetectionMethod == DDI_POWER_5V_VBUSVALID)
__raw_writel(BM_POWER_5VCTRL_VBUSVALID_5VDETECT,
REGS_POWER_BASE + HW_POWER_5VCTRL_SET);
@@ -591,7 +643,6 @@ void ddi_power_Enable4p2(uint16_t target_current_limit_ma)
uint32_t temp_reg;
ddi_power_Init4p2Params();
-
/* disable 4p2 rail brownouts for now. (they
* should have already been off at this point) */
__raw_writel(BM_POWER_CTRL_ENIRQ_DCDC4P2_BO,
@@ -683,6 +734,7 @@ void ddi_power_Enable4p2(uint16_t target_current_limit_ma)
SetVbusValidThresh(0);
#endif
}
+
}
/* enable and ramp up 4p2 regulator */
@@ -1741,6 +1793,7 @@ void ddi_power_enable_vddio_interrupt(bool enable)
__raw_writel(BM_POWER_CTRL_ENIRQ_VDDIO_BO,
REGS_POWER_BASE + HW_POWER_CTRL_CLR);
}
+
}
void ddi_power_handle_vddio_brnout(void)