diff options
Diffstat (limited to 'arch/arm/mach-omap2/id.c')
| -rw-r--r-- | arch/arm/mach-omap2/id.c | 191 | 
1 files changed, 51 insertions, 140 deletions
diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c index 37efb869692..d27daf921c7 100644 --- a/arch/arm/mach-omap2/id.c +++ b/arch/arm/mach-omap2/id.c @@ -28,7 +28,6 @@  #include "control.h" -static struct omap_chip_id omap_chip;  static unsigned int omap_revision;  u32 omap_features; @@ -39,19 +38,6 @@ unsigned int omap_rev(void)  }  EXPORT_SYMBOL(omap_rev); -/** - * omap_chip_is - test whether currently running OMAP matches a chip type - * @oc: omap_chip_t to test against - * - * Test whether the currently-running OMAP chip matches the supplied - * chip type 'oc'.  Returns 1 upon a match; 0 upon failure. - */ -int omap_chip_is(struct omap_chip_id oci) -{ -	return (oci.oc & omap_chip.oc) ? 1 : 0; -} -EXPORT_SYMBOL(omap_chip_is); -  int omap_type(void)  {  	u32 val = 0; @@ -242,14 +228,12 @@ static void __init ti816x_check_features(void)  	omap_features = OMAP3_HAS_NEON;  } -static void __init omap3_check_revision(void) +static void __init omap3_check_revision(const char **cpu_rev)  {  	u32 cpuid, idcode;  	u16 hawkeye;  	u8 rev; -	omap_chip.oc = CHIP_IS_OMAP3430; -  	/*  	 * We cannot access revision registers on ES1.0.  	 * If the processor type is Cortex-A8 and the revision is 0x0 @@ -258,7 +242,7 @@ static void __init omap3_check_revision(void)  	cpuid = read_cpuid(CPUID_ID);  	if ((((cpuid >> 4) & 0xfff) == 0xc08) && ((cpuid & 0xf) == 0x0)) {  		omap_revision = OMAP3430_REV_ES1_0; -		omap_chip.oc |= CHIP_IS_OMAP3430ES1; +		*cpu_rev = "1.0";  		return;  	} @@ -279,77 +263,85 @@ static void __init omap3_check_revision(void)  		case 0: /* Take care of early samples */  		case 1:  			omap_revision = OMAP3430_REV_ES2_0; -			omap_chip.oc |= CHIP_IS_OMAP3430ES2; +			*cpu_rev = "2.0";  			break;  		case 2:  			omap_revision = OMAP3430_REV_ES2_1; -			omap_chip.oc |= CHIP_IS_OMAP3430ES2; +			*cpu_rev = "2.1";  			break;  		case 3:  			omap_revision = OMAP3430_REV_ES3_0; -			omap_chip.oc |= CHIP_IS_OMAP3430ES3_0; +			*cpu_rev = "3.0";  			break;  		case 4:  			omap_revision = OMAP3430_REV_ES3_1; -			omap_chip.oc |= CHIP_IS_OMAP3430ES3_1; +			*cpu_rev = "3.1";  			break;  		case 7:  		/* FALLTHROUGH */  		default:  			/* Use the latest known revision as default */  			omap_revision = OMAP3430_REV_ES3_1_2; - -			/* REVISIT: Add CHIP_IS_OMAP3430ES3_1_2? */ -			omap_chip.oc |= CHIP_IS_OMAP3430ES3_1; +			*cpu_rev = "3.1.2";  		}  		break;  	case 0xb868: -		/* Handle OMAP35xx/AM35xx devices +		/* +		 * Handle OMAP/AM 3505/3517 devices  		 * -		 * Set the device to be OMAP3505 here. Actual device +		 * Set the device to be OMAP3517 here. Actual device  		 * is identified later based on the features. -		 * -		 * REVISIT: AM3505/AM3517 should have their own CHIP_IS  		 */ -		omap_revision = OMAP3505_REV(rev); -		omap_chip.oc |= CHIP_IS_OMAP3430ES3_1; +		switch (rev) { +		case 0: +			omap_revision = OMAP3517_REV_ES1_0; +			*cpu_rev = "1.0"; +			break; +		case 1: +		/* FALLTHROUGH */ +		default: +			omap_revision = OMAP3517_REV_ES1_1; +			*cpu_rev = "1.1"; +		}  		break;  	case 0xb891:  		/* Handle 36xx devices */ -		omap_chip.oc |= CHIP_IS_OMAP3630ES1;  		switch(rev) {  		case 0: /* Take care of early samples */  			omap_revision = OMAP3630_REV_ES1_0; +			*cpu_rev = "1.0";  			break;  		case 1:  			omap_revision = OMAP3630_REV_ES1_1; -			omap_chip.oc |= CHIP_IS_OMAP3630ES1_1; +			*cpu_rev = "1.1";  			break;  		case 2: +		/* FALLTHROUGH */  		default: -			omap_revision =  OMAP3630_REV_ES1_2; -			omap_chip.oc |= CHIP_IS_OMAP3630ES1_2; +			omap_revision = OMAP3630_REV_ES1_2; +			*cpu_rev = "1.2";  		}  		break;  	case 0xb81e: -		omap_chip.oc = CHIP_IS_TI816X; -  		switch (rev) {  		case 0:  			omap_revision = TI8168_REV_ES1_0; +			*cpu_rev = "1.0";  			break;  		case 1: +		/* FALLTHROUGH */ +		default:  			omap_revision = TI8168_REV_ES1_1; +			*cpu_rev = "1.1";  			break; -		default: -			omap_revision =  TI8168_REV_ES1_1;  		}  		break;  	default: -		/* Unknown default to latest silicon rev as default*/ -		omap_revision =  OMAP3630_REV_ES1_2; -		omap_chip.oc |= CHIP_IS_OMAP3630ES1_2; +		/* Unknown default to latest silicon rev as default */ +		omap_revision = OMAP3630_REV_ES1_2; +		*cpu_rev = "1.2"; +		pr_warn("Warning: unknown chip type; assuming OMAP3630ES1.2\n");  	}  } @@ -382,24 +374,20 @@ static void __init omap4_check_revision(void)  		switch (rev) {  		case 0:  			omap_revision = OMAP4430_REV_ES1_0; -			omap_chip.oc |= CHIP_IS_OMAP4430ES1;  			break;  		case 1:  		default:  			omap_revision = OMAP4430_REV_ES2_0; -			omap_chip.oc |= CHIP_IS_OMAP4430ES2;  		}  		break;  	case 0xb95c:  		switch (rev) {  		case 3:  			omap_revision = OMAP4430_REV_ES2_1; -			omap_chip.oc |= CHIP_IS_OMAP4430ES2_1;  			break;  		case 4:  		default:  			omap_revision = OMAP4430_REV_ES2_2; -			omap_chip.oc |= CHIP_IS_OMAP4430ES2_2;  		}  		break;  	case 0xb94e: @@ -407,14 +395,12 @@ static void __init omap4_check_revision(void)  		case 0:  		default:  			omap_revision = OMAP4460_REV_ES1_0; -			omap_chip.oc |= CHIP_IS_OMAP4460ES1_0;  			break;  		}  		break;  	default:  		/* Unknown default to latest silicon rev as default */  		omap_revision = OMAP4430_REV_ES2_2; -		omap_chip.oc |= CHIP_IS_OMAP4430ES2_2;  	}  	pr_info("OMAP%04x ES%d.%d\n", omap_rev() >> 16, @@ -425,94 +411,33 @@ static void __init omap4_check_revision(void)  	if (omap3_has_ ##feat())		\  		printk(#feat" "); -static void __init omap3_cpuinfo(void) +static void __init omap3_cpuinfo(const char *cpu_rev)  { -	u8 rev = GET_OMAP_REVISION(); -	char cpu_name[16], cpu_rev[16]; +	const char *cpu_name; -	/* OMAP3430 and OMAP3530 are assumed to be same. +	/* +	 * OMAP3430 and OMAP3530 are assumed to be same.  	 *  	 * OMAP3525, OMAP3515 and OMAP3503 can be detected only based  	 * on available features. Upon detection, update the CPU id  	 * and CPU class bits.  	 */  	if (cpu_is_omap3630()) { -		strcpy(cpu_name, "OMAP3630"); -	} else if (cpu_is_omap3505()) { -		/* -		 * AM35xx devices -		 */ -		if (omap3_has_sgx()) { -			omap_revision = OMAP3517_REV(rev); -			strcpy(cpu_name, "AM3517"); -		} else { -			/* Already set in omap3_check_revision() */ -			strcpy(cpu_name, "AM3505"); -		} +		cpu_name = "OMAP3630"; +	} else if (cpu_is_omap3517()) { +		/* AM35xx devices */ +		cpu_name = (omap3_has_sgx()) ? "AM3517" : "AM3505";  	} else if (cpu_is_ti816x()) { -		strcpy(cpu_name, "TI816X"); +		cpu_name = "TI816X";  	} else if (omap3_has_iva() && omap3_has_sgx()) {  		/* OMAP3430, OMAP3525, OMAP3515, OMAP3503 devices */ -		strcpy(cpu_name, "OMAP3430/3530"); +		cpu_name = "OMAP3430/3530";  	} else if (omap3_has_iva()) { -		omap_revision = OMAP3525_REV(rev); -		strcpy(cpu_name, "OMAP3525"); +		cpu_name = "OMAP3525";  	} else if (omap3_has_sgx()) { -		omap_revision = OMAP3515_REV(rev); -		strcpy(cpu_name, "OMAP3515"); +		cpu_name = "OMAP3515";  	} else { -		omap_revision = OMAP3503_REV(rev); -		strcpy(cpu_name, "OMAP3503"); -	} - -	if (cpu_is_omap3630() || cpu_is_ti816x()) { -		switch (rev) { -		case OMAP_REVBITS_00: -			strcpy(cpu_rev, "1.0"); -			break; -		case OMAP_REVBITS_01: -			strcpy(cpu_rev, "1.1"); -			break; -		case OMAP_REVBITS_02: -			/* FALLTHROUGH */ -		default: -			/* Use the latest known revision as default */ -			strcpy(cpu_rev, "1.2"); -		} -	} else if (cpu_is_omap3505() || cpu_is_omap3517()) { -		switch (rev) { -		case OMAP_REVBITS_00: -			strcpy(cpu_rev, "1.0"); -			break; -		case OMAP_REVBITS_01: -			/* FALLTHROUGH */ -		default: -			/* Use the latest known revision as default */ -			strcpy(cpu_rev, "1.1"); -		} -	} else { -		switch (rev) { -		case OMAP_REVBITS_00: -			strcpy(cpu_rev, "1.0"); -			break; -		case OMAP_REVBITS_01: -			strcpy(cpu_rev, "2.0"); -			break; -		case OMAP_REVBITS_02: -			strcpy(cpu_rev, "2.1"); -			break; -		case OMAP_REVBITS_03: -			strcpy(cpu_rev, "3.0"); -			break; -		case OMAP_REVBITS_04: -			strcpy(cpu_rev, "3.1"); -			break; -		case OMAP_REVBITS_05: -			/* FALLTHROUGH */ -		default: -			/* Use the latest known revision as default */ -			strcpy(cpu_rev, "3.1.2"); -		} +		cpu_name = "OMAP3503";  	}  	/* Print verbose information */ @@ -533,6 +458,8 @@ static void __init omap3_cpuinfo(void)   */  void __init omap2_check_revision(void)  { +	const char *cpu_rev; +  	/*  	 * At this point we have an idea about the processor revision set  	 * earlier with omap2_set_globals_tap(). @@ -540,7 +467,7 @@ void __init omap2_check_revision(void)  	if (cpu_is_omap24xx()) {  		omap24xx_check_revision();  	} else if (cpu_is_omap34xx()) { -		omap3_check_revision(); +		omap3_check_revision(&cpu_rev);  		/* TI816X doesn't have feature register */  		if (!cpu_is_ti816x()) @@ -548,7 +475,7 @@ void __init omap2_check_revision(void)  		else  			ti816x_check_features(); -		omap3_cpuinfo(); +		omap3_cpuinfo(cpu_rev);  		return;  	} else if (cpu_is_omap44xx()) {  		omap4_check_revision(); @@ -557,22 +484,6 @@ void __init omap2_check_revision(void)  	} else {  		pr_err("OMAP revision unknown, please fix!\n");  	} - -	/* -	 * OK, now we know the exact revision. Initialize omap_chip bits -	 * for powerdowmain and clockdomain code. -	 */ -	if (cpu_is_omap243x()) { -		/* Currently only supports 2430ES2.1 and 2430-all */ -		omap_chip.oc |= CHIP_IS_OMAP2430; -		return; -	} else if (cpu_is_omap242x()) { -		/* Currently only supports 2420ES2.1.1 and 2420-all */ -		omap_chip.oc |= CHIP_IS_OMAP2420; -		return; -	} - -	pr_err("Uninitialized omap_chip, please fix!\n");  }  /*  |