[U-Boot] [PATCH] arm: mx23: Fix VDDMEM misconfiguration

Marek Vasut marex at denx.de
Sun May 5 23:28:40 CEST 2013


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 <marex at denx.de>
> Cc: Fabio Estevam <fabio.estevam at freescale.com>
> Cc: Otavio Salvador <otavio at ossystems.com.br>
> Cc: Stefano Babic <sbabic at 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


More information about the U-Boot mailing list