diff options
Diffstat (limited to 'arch/arm/cpu/armv7/omap3/sys_info.c')
| -rw-r--r-- | arch/arm/cpu/armv7/omap3/sys_info.c | 147 | 
1 files changed, 121 insertions, 26 deletions
| diff --git a/arch/arm/cpu/armv7/omap3/sys_info.c b/arch/arm/cpu/armv7/omap3/sys_info.c index 1df4401d4..549ac1918 100644 --- a/arch/arm/cpu/armv7/omap3/sys_info.c +++ b/arch/arm/cpu/armv7/omap3/sys_info.c @@ -38,7 +38,10 @@ static char *rev_s[CPU_3XX_MAX_REV] = {  				"2.0",  				"2.1",  				"3.0", -				"3.1"}; +				"3.1", +				"UNKNOWN", +				"UNKNOWN", +				"3.1.2"};  /*****************************************************************   * dieid_num_r(void) - read and set die ID @@ -75,32 +78,81 @@ u32 get_cpu_type(void)  }  /****************************************** - * get_cpu_rev(void) - extract version info + * get_cpu_id(void) - extract cpu id + * returns 0 for ES1.0, cpuid otherwise   ******************************************/ -u32 get_cpu_rev(void) +u32 get_cpu_id(void)  { -	u32 cpuid = 0;  	struct ctrl_id *id_base; +	u32 cpuid = 0;  	/*  	 * On ES1.0 the IDCODE register is not exposed on L4  	 * so using CPU ID to differentiate between ES1.0 and > ES1.0.  	 */  	__asm__ __volatile__("mrc p15, 0, %0, c0, c0, 0":"=r"(cpuid)); -	if ((cpuid & 0xf) == 0x0) -		return CPU_3XX_ES10; -	else { +	if ((cpuid & 0xf) == 0x0) { +		return 0; +	} else {  		/* Decode the IDs on > ES1.0 */  		id_base = (struct ctrl_id *) OMAP34XX_ID_L4_IO_BASE; -		cpuid = (readl(&id_base->idcode) >> CPU_3XX_ID_SHIFT) & 0xf; +		cpuid = readl(&id_base->idcode); +	} + +	return cpuid; +} + +/****************************************** + * get_cpu_family(void) - extract cpu info + ******************************************/ +u32 get_cpu_family(void) +{ +	u16 hawkeye; +	u32 cpu_family; +	u32 cpuid = get_cpu_id(); -		/* Some early ES2.0 seem to report ID 0, fix this */ -		if(cpuid == 0) -			cpuid = CPU_3XX_ES20; +	if (cpuid == 0) +		return CPU_OMAP34XX; -		return cpuid; +	hawkeye = (cpuid >> HAWKEYE_SHIFT) & 0xffff; +	switch (hawkeye) { +	case HAWKEYE_OMAP34XX: +		cpu_family = CPU_OMAP34XX; +		break; +	case HAWKEYE_AM35XX: +		cpu_family = CPU_AM35XX; +		break; +	case HAWKEYE_OMAP36XX: +		cpu_family = CPU_OMAP36XX; +		break; +	default: +		cpu_family = CPU_OMAP34XX;  	} + +	return cpu_family; +} + +/****************************************** + * get_cpu_rev(void) - extract version info + ******************************************/ +u32 get_cpu_rev(void) +{ +	u32 cpuid = get_cpu_id(); + +	if (cpuid == 0) +		return CPU_3XX_ES10; +	else +		return (cpuid >> CPU_3XX_ID_SHIFT) & 0xf; +} + +/***************************************************************** + * get_sku_id(void) - read sku_id to get info on max clock rate + *****************************************************************/ +u32 get_sku_id(void) +{ +	struct ctrl_id *id_base = (struct ctrl_id *)OMAP34XX_ID_L4_IO_BASE; +	return readl(&id_base->sku_id) & SKUID_CLK_MASK;  }  /*************************************************************************** @@ -213,24 +265,66 @@ u32 get_device_type(void)   */  int print_cpuinfo (void)  { -	char *cpu_s, *sec_s; +	char *cpu_family_s, *cpu_s, *sec_s, *max_clk; + +	switch (get_cpu_family()) { +	case CPU_OMAP34XX: +		cpu_family_s = "OMAP"; +		switch (get_cpu_type()) { +		case OMAP3503: +			cpu_s = "3503"; +			break; +		case OMAP3515: +			cpu_s = "3515"; +			break; +		case OMAP3525: +			cpu_s = "3525"; +			break; +		case OMAP3530: +			cpu_s = "3530"; +			break; +		default: +			cpu_s = "35XX"; +			break; +		} +		if ((get_cpu_rev() >= CPU_3XX_ES31) && +		    (get_sku_id() == SKUID_CLK_720MHZ)) +			max_clk = "720 mHz"; +		else +			max_clk = "600 mHz"; -	switch (get_cpu_type()) { -	case OMAP3503: -		cpu_s = "3503"; -		break; -	case OMAP3515: -		cpu_s = "3515";  		break; -	case OMAP3525: -		cpu_s = "3525"; +	case CPU_AM35XX: +		cpu_family_s = "AM"; +		switch (get_cpu_type()) { +		case AM3505: +			cpu_s = "3505"; +			break; +		case AM3517: +			cpu_s = "3517"; +			break; +		default: +			cpu_s = "35XX"; +			break; +		} +		max_clk = "600 Mhz";  		break; -	case OMAP3530: -		cpu_s = "3530"; +	case CPU_OMAP36XX: +		cpu_family_s = "OMAP"; +		switch (get_cpu_type()) { +		case OMAP3730: +			cpu_s = "3630/3730"; +			break; +		default: +			cpu_s = "36XX/37XX"; +			break; +		} +		max_clk = "1 Ghz";  		break;  	default: +		cpu_family_s = "OMAP";  		cpu_s = "35XX"; -		break; +		max_clk = "600 Mhz";  	}  	switch (get_device_type()) { @@ -250,8 +344,9 @@ int print_cpuinfo (void)  		sec_s = "?";  	} -	printf("OMAP%s-%s ES%s, CPU-OPP2 L3-165MHz\n", -			cpu_s, sec_s, rev_s[get_cpu_rev()]); +	printf("%s%s-%s ES%s, CPU-OPP2, L3-165MHz, Max CPU Clock %s\n", +			cpu_family_s, cpu_s, sec_s, +			rev_s[get_cpu_rev()], max_clk);  	return 0;  } |