diff options
| -rw-r--r-- | cpu/mpc85xx/cpu.c | 31 | ||||
| -rw-r--r-- | cpu/mpc85xx/speed.c | 27 | ||||
| -rw-r--r-- | cpu/mpc86xx/cpu.c | 22 | ||||
| -rw-r--r-- | cpu/mpc86xx/speed.c | 19 | ||||
| -rw-r--r-- | include/asm-ppc/global_data.h | 3 | ||||
| -rw-r--r-- | include/e500.h | 1 | ||||
| -rw-r--r-- | include/mpc86xx.h | 1 | 
7 files changed, 60 insertions, 44 deletions
| diff --git a/cpu/mpc85xx/cpu.c b/cpu/mpc85xx/cpu.c index 89800b884..15ba7f1c5 100644 --- a/cpu/mpc85xx/cpu.c +++ b/cpu/mpc85xx/cpu.c @@ -77,8 +77,6 @@ struct cpu_type *identify_cpu(u32 ver)  int checkcpu (void)  {  	sys_info_t sysinfo; -	uint lcrr;		/* local bus clock ratio register */ -	uint clkdiv;		/* clock divider portion of lcrr */  	uint pvr, svr;  	uint fam;  	uint ver; @@ -165,30 +163,11 @@ int checkcpu (void)  		break;  	} -#if defined(CONFIG_SYS_LBC_LCRR) -	lcrr = CONFIG_SYS_LBC_LCRR; -#else -	{ -	    volatile ccsr_lbc_t *lbc = (void *)(CONFIG_SYS_MPC85xx_LBC_ADDR); - -	    lcrr = lbc->lcrr; -	} -#endif -	clkdiv = lcrr & LCRR_CLKDIV; -	if (clkdiv == 2 || clkdiv == 4 || clkdiv == 8) { -#if !defined(CONFIG_MPC8540) && !defined(CONFIG_MPC8541) && \ -    !defined(CONFIG_MPC8555) && !defined(CONFIG_MPC8560) -		/* -		 * Yes, the entire PQ38 family use the same -		 * bit-representation for twice the clock divider values. -		 */ -		 clkdiv *= 2; -#endif -		printf("LBC:%-4s MHz\n", -		       strmhz(buf1, sysinfo.freqSystemBus / clkdiv)); -	} else { -		printf("LBC: unknown (lcrr: 0x%08x)\n", lcrr); -	} +	if (sysinfo.freqLocalBus > LCRR_CLKDIV) +		printf("LBC:%-4s MHz\n", strmhz(buf1, sysinfo.freqLocalBus)); +	else +		printf("LBC: unknown (LCRR[CLKDIV] = 0x%02lx)\n", +		       sysinfo.freqLocalBus);  #ifdef CONFIG_CPM2  	printf("CPM:   %s MHz\n", strmhz(buf1, sysinfo.freqSystemBus)); diff --git a/cpu/mpc85xx/speed.c b/cpu/mpc85xx/speed.c index 1e0f4838b..0d55228b6 100644 --- a/cpu/mpc85xx/speed.c +++ b/cpu/mpc85xx/speed.c @@ -28,6 +28,7 @@  #include <common.h>  #include <ppc_asm.tmpl>  #include <asm/processor.h> +#include <asm/io.h>  DECLARE_GLOBAL_DATA_PTR; @@ -37,6 +38,7 @@ void get_sys_info (sys_info_t * sysInfo)  {  	volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);  	uint plat_ratio,e500_ratio,half_freqSystemBus; +	uint lcrr_div;  	plat_ratio = (gur->porpllsr) & 0x0000003e;  	plat_ratio >>= 1; @@ -60,6 +62,30 @@ void get_sys_info (sys_info_t * sysInfo)  			sysInfo->freqDDRBus = ddr_ratio * CONFIG_DDR_CLK_FREQ;  	}  #endif + +#if defined(CONFIG_SYS_LBC_LCRR) +	/* We will program LCRR to this value later */ +	lcrr_div = CONFIG_SYS_LBC_LCRR & LCRR_CLKDIV; +#else +	{ +	    volatile ccsr_lbc_t *lbc = (void *)(CONFIG_SYS_MPC85xx_LBC_ADDR); +	    lcrr_div = in_be32(&lbc->lcrr) & LCRR_CLKDIV; +	} +#endif +	if (lcrr_div == 2 || lcrr_div == 4 || lcrr_div == 8) { +#if !defined(CONFIG_MPC8540) && !defined(CONFIG_MPC8541) && \ +    !defined(CONFIG_MPC8555) && !defined(CONFIG_MPC8560) +		/* +		 * Yes, the entire PQ38 family use the same +		 * bit-representation for twice the clock divider values. +		 */ +		lcrr_div *= 2; +#endif +		sysInfo->freqLocalBus = sysInfo->freqSystemBus / lcrr_div; +	} else { +		/* In case anyone cares what the unknown value is */ +		sysInfo->freqLocalBus = lcrr_div; +	}  } @@ -82,6 +108,7 @@ int get_clocks (void)  	gd->cpu_clk = sys_info.freqProcessor;  	gd->bus_clk = sys_info.freqSystemBus;  	gd->mem_clk = sys_info.freqDDRBus; +	gd->lbc_clk = sys_info.freqLocalBus;  	/*  	 * The base clock for I2C depends on the actual SOC.  Unfortunately, diff --git a/cpu/mpc86xx/cpu.c b/cpu/mpc86xx/cpu.c index a179fb3d0..35680238d 100644 --- a/cpu/mpc86xx/cpu.c +++ b/cpu/mpc86xx/cpu.c @@ -39,8 +39,6 @@ checkcpu(void)  	uint pvr, svr;  	uint ver;  	uint major, minor; -	uint lcrr;		/* local bus clock ratio register */ -	uint clkdiv;		/* clock divider portion of lcrr */  	volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;  	volatile ccsr_gur_t *gur = &immap->im_gur; @@ -100,23 +98,11 @@ checkcpu(void)  	printf("MPX:%4lu MHz, ", sysinfo.freqSystemBus / 1000000);  	printf("DDR:%4lu MHz, ", sysinfo.freqSystemBus / 2000000); -#if defined(CONFIG_SYS_LBC_LCRR) -	lcrr = CONFIG_SYS_LBC_LCRR; -#else -	{ -		volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR; -		volatile ccsr_lbc_t *lbc = &immap->im_lbc; - -		lcrr = lbc->lcrr; -	} -#endif -	clkdiv = lcrr & LCRR_CLKDIV; -	if (clkdiv == 2 || clkdiv == 4 || clkdiv == 8) { -		clkdiv *= 2; -		printf("LBC:%4lu MHz\n", -		       sysinfo.freqSystemBus / 1000000 / clkdiv); +	if (sysinfo.freqLocalBus > LCRR_CLKDIV) { +		printf("LBC:%4lu MHz\n", sysinfo.freqLocalBus / 1000000);  	} else { -		printf("    LBC: unknown (lcrr: 0x%08x)\n", lcrr); +		printf("LBC: unknown (LCRR[CLKDIV] = 0x%02x)\n", +		       sysinfo.freqLocalBus);  	}  	puts("    L2: "); diff --git a/cpu/mpc86xx/speed.c b/cpu/mpc86xx/speed.c index 415ac9db8..64a3479d7 100644 --- a/cpu/mpc86xx/speed.c +++ b/cpu/mpc86xx/speed.c @@ -28,6 +28,7 @@  #include <common.h>  #include <mpc86xx.h>  #include <asm/processor.h> +#include <asm/io.h>  DECLARE_GLOBAL_DATA_PTR; @@ -39,6 +40,7 @@ void get_sys_info(sys_info_t *sysInfo)  	volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;  	volatile ccsr_gur_t *gur = &immap->im_gur;  	uint plat_ratio, e600_ratio; +	uint lcrr_div;  	plat_ratio = (gur->porpllsr) & 0x0000003e;  	plat_ratio >>= 1; @@ -90,6 +92,22 @@ void get_sys_info(sys_info_t *sysInfo)  		sysInfo->freqProcessor = e600_ratio + sysInfo->freqSystemBus;  		break;  	} + +#if defined(CONFIG_SYS_LBC_LCRR) +	/* We will program LCRR to this value later */ +	lcrr_div = CONFIG_SYS_LBC_LCRR & LCRR_CLKDIV; +#else +	{ +		volatile ccsr_lbc_t *lbc = &immap->im_lbc; +		lcrr_div = in_be32(&lbc->lcrr) & LCRR_CLKDIV; +	} +#endif +	if (lcrr_div == 2 || lcrr_div == 4 || lcrr_div == 8) { +		sysInfo->freqLocalBus = sysInfo->freqSystemBus / (lcrr_div * 2); +	} else { +		/* In case anyone cares what the unknown value is */ +		sysInfo->freqLocalBus = lcrr_div; +	}  } @@ -105,6 +123,7 @@ int get_clocks(void)  	get_sys_info(&sys_info);  	gd->cpu_clk = sys_info.freqProcessor;  	gd->bus_clk = sys_info.freqSystemBus; +	gd->lbc_clk = sys_info.freqLocalBus;  	/*  	 * The base clock for I2C depends on the actual SOC.  Unfortunately, diff --git a/include/asm-ppc/global_data.h b/include/asm-ppc/global_data.h index aade097fa..2bb50b47f 100644 --- a/include/asm-ppc/global_data.h +++ b/include/asm-ppc/global_data.h @@ -89,6 +89,9 @@ typedef	struct	global_data {  #if defined(CONFIG_MPC837X) || defined(CONFIG_MPC8536)  	u32 sdhc_clk;  #endif +#if defined(CONFIG_MPC85xx) || defined(CONFIG_MPC86xx) +	u32 lbc_clk; +#endif /* CONFIG_MPC85xx || CONFIG_MPC86xx */  #if defined(CONFIG_MPC83XX) || defined(CONFIG_MPC85xx) || defined(CONFIG_MPC86xx)  	u32 i2c1_clk;  	u32 i2c2_clk; diff --git a/include/e500.h b/include/e500.h index 1971eee29..9d3c8417c 100644 --- a/include/e500.h +++ b/include/e500.h @@ -13,6 +13,7 @@ typedef struct    unsigned long freqProcessor;    unsigned long freqSystemBus;    unsigned long freqDDRBus; +  unsigned long freqLocalBus;  } MPC85xx_SYS_INFO;  #endif  /* _ASMLANGUAGE */ diff --git a/include/mpc86xx.h b/include/mpc86xx.h index f119d5bb1..a6fdea352 100644 --- a/include/mpc86xx.h +++ b/include/mpc86xx.h @@ -84,6 +84,7 @@  typedef struct {  	unsigned long freqProcessor;  	unsigned long freqSystemBus; +	unsigned long freqLocalBus;  } MPC86xx_SYS_INFO;  #define l1icache_enable	icache_enable |