Hi Stefano,

this one too ;-)

> 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: Marek Vasut <ma...@denx.de>
> Cc: Fabio Estevam <fabio.este...@freescale.com>
> Cc: Otavio Salvador <ota...@ossystems.com.br>
> Cc: Stefano Babic <sba...@denx.de>
> ---
>  arch/arm/cpu/arm926ejs/mxs/spl_mem_init.c   |   12 ++-----
>  arch/arm/cpu/arm926ejs/mxs/spl_power_init.c |   50
> +++++++++++++++++++++------ 2 files changed, 42 insertions(+), 20
> deletions(-)
> 
> diff --git a/arch/arm/cpu/arm926ejs/mxs/spl_mem_init.c
> b/arch/arm/cpu/arm926ejs/mxs/spl_mem_init.c index bc2d69c..19dd8fb 100644
> --- a/arch/arm/cpu/arm926ejs/mxs/spl_mem_init.c
> +++ b/arch/arm/cpu/arm926ejs/mxs/spl_mem_init.c
> @@ -234,17 +234,9 @@ static void mx23_mem_setup_vddmem(void)
>       struct mxs_power_regs *power_regs =
>               (struct mxs_power_regs *)MXS_POWER_BASE;
> 
> -     writel((0x10 << POWER_VDDMEMCTRL_TRG_OFFSET) |
> -             POWER_VDDMEMCTRL_ENABLE_ILIMIT |
> -             POWER_VDDMEMCTRL_ENABLE_LINREG |
> -             POWER_VDDMEMCTRL_PULLDOWN_ACTIVE,
> -             &power_regs->hw_power_vddmemctrl);
> +     clrbits_le32(&power_regs->hw_power_vddmemctrl,
> +             POWER_VDDMEMCTRL_ENABLE_ILIMIT);
> 
> -     early_delay(10000);
> -
> -     writel((0x10 << POWER_VDDMEMCTRL_TRG_OFFSET) |
> -             POWER_VDDMEMCTRL_ENABLE_LINREG,
> -             &power_regs->hw_power_vddmemctrl);
>  }
> 
>  static void mx23_mem_init(void)
> diff --git a/arch/arm/cpu/arm926ejs/mxs/spl_power_init.c
> b/arch/arm/cpu/arm926ejs/mxs/spl_power_init.c index 287c698..21cac7b
> 100644
> --- a/arch/arm/cpu/arm926ejs/mxs/spl_power_init.c
> +++ b/arch/arm/cpu/arm926ejs/mxs/spl_power_init.c
> @@ -687,6 +687,12 @@ static void mxs_power_configure_power_source(void)
>       mxs_init_batt_bo();
> 
>       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)
> @@ -781,7 +787,11 @@ struct mxs_vddx_cfg {
>  static const struct mxs_vddx_cfg mxs_vddio_cfg = {
>       .reg                    = &(((struct mxs_power_regs *)MXS_POWER_BASE)->
>                                       hw_power_vddioctrl),
> +#if defined(CONFIG_MX23)
> +     .step_mV                = 25,
> +#else
>       .step_mV                = 50,
> +#endif
>       .lowest_mV              = 2800,
>       .powered_by_linreg      = mxs_get_vddio_power_source_off,
>       .trg_mask               = POWER_VDDIOCTRL_TRG_MASK,
> @@ -804,6 +814,21 @@ static const struct mxs_vddx_cfg mxs_vddd_cfg = {
>       .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,
>                               uint32_t new_target, uint32_t new_brownout)
>  {
> @@ -821,9 +846,10 @@ static void mxs_power_set_vddx(const struct
> mxs_vddx_cfg *cfg, cur_target += cfg->lowest_mV;
> 
>       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) {
>                       bo_int = readl(cfg->reg);
>                       clrbits_le32(cfg->reg, cfg->bo_enirq);
> @@ -864,14 +890,16 @@ static void mxs_power_set_vddx(const struct
> mxs_vddx_cfg *cfg, cur_target += cfg->lowest_mV;
>       } while (new_target > cur_target);
> 
> -     if (adjust_up && powered_by_linreg) {
> -             writel(cfg->bo_irq, &power_regs->hw_power_ctrl_clr);
> -             if (bo_int & cfg->bo_enirq)
> -                     setbits_le32(cfg->reg, cfg->bo_enirq);
> -     }
> +     if (cfg->bo_irq) {
> +             if (adjust_up && powered_by_linreg) {
> +                     writel(cfg->bo_irq, &power_regs->hw_power_ctrl_clr);
> +                     if (bo_int & cfg->bo_enirq)
> +                             setbits_le32(cfg->reg, cfg->bo_enirq);
> +             }
> 
> -     clrsetbits_le32(cfg->reg, cfg->bo_offset_mask,
> -                     new_brownout << cfg->bo_offset_offset);
> +             clrsetbits_le32(cfg->reg, cfg->bo_offset_mask,
> +                             new_brownout << cfg->bo_offset_offset);
> +     }
>  }
> 
>  static void mxs_setup_batt_detect(void)
> @@ -910,7 +938,9 @@ void mxs_power_init(void)
> 
>       mxs_power_set_vddx(&mxs_vddio_cfg, 3300, 3150);
>       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 |
>               POWER_CTRL_VDDIO_BO_IRQ | POWER_CTRL_VDD5V_DROOP_IRQ |
>               POWER_CTRL_VBUS_VALID_IRQ | POWER_CTRL_BATT_BO_IRQ |

Best regards,
Marek Vasut
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to