[U-Boot] [PATCHv2] OMAP3: Avoid re-write to PRM_CLKSRC_CTRL

Premi, Sanjeev premi at ti.com
Wed Feb 3 15:20:00 CET 2010


> -----Original Message-----
> From: Premi, Sanjeev 
> Sent: Friday, January 29, 2010 6:44 PM
> To: u-boot at lists.denx.de
> Cc: Premi, Sanjeev; Hiremath, Vaibhav
> Subject: [PATCHv2] OMAP3: Avoid re-write to PRM_CLKSRC_CTRL
> 
> The function get_osc_clk_speed() is used to determine the master
> clock. If SYS_CLK is being divided by 2, the divider is changed
> to 1 - without following any sequence.
> 
> Before reaching this function, some of the clocks have already
> been set (by x-loader or equiv) OR power-on defaults are in use.
> This change is too sudden, leading to instability beyond certain
> tolerance zone.
> 
> The problem was observed with DM3730 (silimar to OMAP3630), on
> the OMAP3EVM.
> 
> This patch removes the step to change clock divider. Instead,
> uses a multiplication factor (if needed). Mathematically, the
> formula is unchanged.
> 
> Tested on OMAP3EVM with OMAP3530 and DM3730.
> 
> Signed-off-by: Sanjeev Premi <premi at ti.com>
> Signed-off-by: Hiremath Vaibhav <hvaibhav at ti.com>
> ---
>  cpu/arm_cortexa8/omap3/clock.c |   15 +++++++++++----
>  1 files changed, 11 insertions(+), 4 deletions(-)
> 
> diff --git a/cpu/arm_cortexa8/omap3/clock.c 
> b/cpu/arm_cortexa8/omap3/clock.c
> index 174c453..e8189b4 100644
> --- a/cpu/arm_cortexa8/omap3/clock.c
> +++ b/cpu/arm_cortexa8/omap3/clock.c
> @@ -40,7 +40,7 @@
>   
> **************************************************************
> ***************/
>  u32 get_osc_clk_speed(void)
>  {
> -	u32 start, cstart, cend, cdiff, val;
> +	u32 start, cstart, cend, cdiff, cdiv, val;
>  	struct prcm *prcm_base = (struct prcm *)PRCM_BASE;
>  	struct prm *prm_base = (struct prm *)PRM_BASE;
>  	struct gptimer *gpt1_base = (struct gptimer *)OMAP34XX_GPT1;
> @@ -48,9 +48,13 @@ u32 get_osc_clk_speed(void)
>  
>  	val = readl(&prm_base->clksrc_ctrl);
>  
> -	/* If SYS_CLK is being divided by 2, remove for now */
> -	val = (val & (~SYSCLKDIV_2)) | SYSCLKDIV_1;
> -	writel(val, &prm_base->clksrc_ctrl);
> +	if (val & SYSCLKDIV_2)
> +		cdiv = 2;
> +	else if (val & SYSCLKDIV_1)
> +		cdiv = 1;
> +	else
> +		/*Should never reach here! (Assume divider as 1) */
> +		cdiv = 1;
>  
>  	/* enable timer2 */
>  	val = readl(&prcm_base->clksel_wkup) | CLKSEL_GPT1;
> @@ -83,6 +87,9 @@ u32 get_osc_clk_speed(void)
>  	cend = readl(&gpt1_base->tcrr);		/* get end 
> sys_clk count */
>  	cdiff = cend - cstart;			/* get elapsed ticks */
>  
> +	if (cdiv == 2)
> +		cdiff *= 2;
> +
>  	/* based on number of ticks assign speed */
>  	if (cdiff > 19000)
>  		return S38_4M;
> -- 
> 1.6.2.2
> 
> 

Tom, Sandeep,

Just wanted to check the status of this patch.

Best regards,
Sanjeev


More information about the U-Boot mailing list