Skip to content
Snippets Groups Projects
Commit dd3ecf02 authored by Marek Vasut's avatar Marek Vasut Committed by Stefano Babic
Browse files

arm: mx23: Fix VDDMEM misconfiguration


The VDDMEM ramped up in very weird way as it was horribly misconfigured.
Instead of setting up VDDMEM in one swipe, let it rise slowly the same
way as VDDD and VDDA in spl_power_init.c and then only clear ILIMIT before
memory gets inited. This makes sure the VDDMEM rises sanely, not jumps up
and down as it did till now.

The VDDMEM prior to this change did this:
     2V0____   .--------2V5
       |    `--'
 0V____|

The VDDMEM now does this:
    2V0_____,-----------2V5
      /
 0V__|

Moreover, VDDIO on MX23 uses 25mV steps while MX28 uses 50mV steps,
fix this difference too.

Signed-off-by: default avatarMarek Vasut <marex@denx.de>
Cc: Fabio Estevam <fabio.estevam@freescale.com>
Cc: Otavio Salvador <otavio@ossystems.com.br>
Cc: Stefano Babic <sbabic@denx.de>
parent 286a88cf
No related branches found
No related tags found
No related merge requests found
...@@ -256,17 +256,9 @@ static void mx23_mem_setup_vddmem(void) ...@@ -256,17 +256,9 @@ static void mx23_mem_setup_vddmem(void)
struct mxs_power_regs *power_regs = struct mxs_power_regs *power_regs =
(struct mxs_power_regs *)MXS_POWER_BASE; (struct mxs_power_regs *)MXS_POWER_BASE;
writel((0x10 << POWER_VDDMEMCTRL_TRG_OFFSET) | clrbits_le32(&power_regs->hw_power_vddmemctrl,
POWER_VDDMEMCTRL_ENABLE_ILIMIT | POWER_VDDMEMCTRL_ENABLE_ILIMIT);
POWER_VDDMEMCTRL_ENABLE_LINREG |
POWER_VDDMEMCTRL_PULLDOWN_ACTIVE,
&power_regs->hw_power_vddmemctrl);
early_delay(10000);
writel((0x10 << POWER_VDDMEMCTRL_TRG_OFFSET) |
POWER_VDDMEMCTRL_ENABLE_LINREG,
&power_regs->hw_power_vddmemctrl);
} }
static void mx23_mem_init(void) static void mx23_mem_init(void)
......
...@@ -687,6 +687,12 @@ static void mxs_power_configure_power_source(void) ...@@ -687,6 +687,12 @@ static void mxs_power_configure_power_source(void)
mxs_init_batt_bo(); mxs_init_batt_bo();
mxs_switch_vddd_to_dcdc_source(); mxs_switch_vddd_to_dcdc_source();
#ifdef CONFIG_MX23
/* Fire up the VDDMEM LinReg now that we're all set. */
writel(POWER_VDDMEMCTRL_ENABLE_LINREG | POWER_VDDMEMCTRL_ENABLE_ILIMIT,
&power_regs->hw_power_vddmemctrl);
#endif
} }
static void mxs_enable_output_rail_protection(void) static void mxs_enable_output_rail_protection(void)
...@@ -781,7 +787,11 @@ struct mxs_vddx_cfg { ...@@ -781,7 +787,11 @@ struct mxs_vddx_cfg {
static const struct mxs_vddx_cfg mxs_vddio_cfg = { static const struct mxs_vddx_cfg mxs_vddio_cfg = {
.reg = &(((struct mxs_power_regs *)MXS_POWER_BASE)-> .reg = &(((struct mxs_power_regs *)MXS_POWER_BASE)->
hw_power_vddioctrl), hw_power_vddioctrl),
#if defined(CONFIG_MX23)
.step_mV = 25,
#else
.step_mV = 50, .step_mV = 50,
#endif
.lowest_mV = 2800, .lowest_mV = 2800,
.powered_by_linreg = mxs_get_vddio_power_source_off, .powered_by_linreg = mxs_get_vddio_power_source_off,
.trg_mask = POWER_VDDIOCTRL_TRG_MASK, .trg_mask = POWER_VDDIOCTRL_TRG_MASK,
...@@ -804,6 +814,21 @@ static const struct mxs_vddx_cfg mxs_vddd_cfg = { ...@@ -804,6 +814,21 @@ static const struct mxs_vddx_cfg mxs_vddd_cfg = {
.bo_offset_offset = POWER_VDDDCTRL_BO_OFFSET_OFFSET, .bo_offset_offset = POWER_VDDDCTRL_BO_OFFSET_OFFSET,
}; };
#ifdef CONFIG_MX23
static const struct mxs_vddx_cfg mxs_vddmem_cfg = {
.reg = &(((struct mxs_power_regs *)MXS_POWER_BASE)->
hw_power_vddmemctrl),
.step_mV = 50,
.lowest_mV = 1700,
.powered_by_linreg = NULL,
.trg_mask = POWER_VDDMEMCTRL_TRG_MASK,
.bo_irq = 0,
.bo_enirq = 0,
.bo_offset_mask = 0,
.bo_offset_offset = 0,
};
#endif
static void mxs_power_set_vddx(const struct mxs_vddx_cfg *cfg, static void mxs_power_set_vddx(const struct mxs_vddx_cfg *cfg,
uint32_t new_target, uint32_t new_brownout) uint32_t new_target, uint32_t new_brownout)
{ {
...@@ -821,9 +846,10 @@ static void mxs_power_set_vddx(const struct mxs_vddx_cfg *cfg, ...@@ -821,9 +846,10 @@ static void mxs_power_set_vddx(const struct mxs_vddx_cfg *cfg,
cur_target += cfg->lowest_mV; cur_target += cfg->lowest_mV;
adjust_up = new_target > cur_target; adjust_up = new_target > cur_target;
powered_by_linreg = cfg->powered_by_linreg(); if (cfg->powered_by_linreg)
powered_by_linreg = cfg->powered_by_linreg();
if (adjust_up) { if (adjust_up && cfg->bo_irq) {
if (powered_by_linreg) { if (powered_by_linreg) {
bo_int = readl(cfg->reg); bo_int = readl(cfg->reg);
clrbits_le32(cfg->reg, cfg->bo_enirq); clrbits_le32(cfg->reg, cfg->bo_enirq);
...@@ -864,14 +890,16 @@ static void mxs_power_set_vddx(const struct mxs_vddx_cfg *cfg, ...@@ -864,14 +890,16 @@ static void mxs_power_set_vddx(const struct mxs_vddx_cfg *cfg,
cur_target += cfg->lowest_mV; cur_target += cfg->lowest_mV;
} while (new_target > cur_target); } while (new_target > cur_target);
if (adjust_up && powered_by_linreg) { if (cfg->bo_irq) {
writel(cfg->bo_irq, &power_regs->hw_power_ctrl_clr); if (adjust_up && powered_by_linreg) {
if (bo_int & cfg->bo_enirq) writel(cfg->bo_irq, &power_regs->hw_power_ctrl_clr);
setbits_le32(cfg->reg, cfg->bo_enirq); if (bo_int & cfg->bo_enirq)
} setbits_le32(cfg->reg, cfg->bo_enirq);
}
clrsetbits_le32(cfg->reg, cfg->bo_offset_mask, clrsetbits_le32(cfg->reg, cfg->bo_offset_mask,
new_brownout << cfg->bo_offset_offset); new_brownout << cfg->bo_offset_offset);
}
} }
static void mxs_setup_batt_detect(void) static void mxs_setup_batt_detect(void)
...@@ -910,7 +938,9 @@ void mxs_power_init(void) ...@@ -910,7 +938,9 @@ void mxs_power_init(void)
mxs_power_set_vddx(&mxs_vddio_cfg, 3300, 3150); mxs_power_set_vddx(&mxs_vddio_cfg, 3300, 3150);
mxs_power_set_vddx(&mxs_vddd_cfg, 1500, 1000); mxs_power_set_vddx(&mxs_vddd_cfg, 1500, 1000);
#ifdef CONFIG_MX23
mxs_power_set_vddx(&mxs_vddmem_cfg, 2500, 1700);
#endif
writel(POWER_CTRL_VDDD_BO_IRQ | POWER_CTRL_VDDA_BO_IRQ | writel(POWER_CTRL_VDDD_BO_IRQ | POWER_CTRL_VDDA_BO_IRQ |
POWER_CTRL_VDDIO_BO_IRQ | POWER_CTRL_VDD5V_DROOP_IRQ | POWER_CTRL_VDDIO_BO_IRQ | POWER_CTRL_VDD5V_DROOP_IRQ |
POWER_CTRL_VBUS_VALID_IRQ | POWER_CTRL_BATT_BO_IRQ | POWER_CTRL_VBUS_VALID_IRQ | POWER_CTRL_BATT_BO_IRQ |
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment