diff options
Diffstat (limited to 'arch/arm/mach-mx5/cpu.c')
| -rw-r--r-- | arch/arm/mach-mx5/cpu.c | 53 | 
1 files changed, 53 insertions, 0 deletions
diff --git a/arch/arm/mach-mx5/cpu.c b/arch/arm/mach-mx5/cpu.c index 41c769f08c4..2d37785e385 100644 --- a/arch/arm/mach-mx5/cpu.c +++ b/arch/arm/mach-mx5/cpu.c @@ -14,9 +14,62 @@  #include <linux/types.h>  #include <linux/kernel.h>  #include <linux/init.h> +#include <linux/module.h>  #include <mach/hardware.h>  #include <asm/io.h> +static int cpu_silicon_rev = -1; + +#define SI_REV 0x48 + +static void query_silicon_parameter(void) +{ +	void __iomem *rom = ioremap(MX51_IROM_BASE_ADDR, MX51_IROM_SIZE); +	u32 rev; + +	if (!rom) { +		cpu_silicon_rev = -EINVAL; +		return; +	} + +	rev = readl(rom + SI_REV); +	switch (rev) { +	case 0x1: +		cpu_silicon_rev = MX51_CHIP_REV_1_0; +		break; +	case 0x2: +		cpu_silicon_rev = MX51_CHIP_REV_1_1; +		break; +	case 0x10: +		cpu_silicon_rev = MX51_CHIP_REV_2_0; +		break; +	case 0x20: +		cpu_silicon_rev = MX51_CHIP_REV_3_0; +		break; +	default: +		cpu_silicon_rev = 0; +	} + +	iounmap(rom); +} + +/* + * Returns: + *	the silicon revision of the cpu + *	-EINVAL - not a mx51 + */ +int mx51_revision(void) +{ +	if (!cpu_is_mx51()) +		return -EINVAL; + +	if (cpu_silicon_rev == -1) +		query_silicon_parameter(); + +	return cpu_silicon_rev; +} +EXPORT_SYMBOL(mx51_revision); +  static int __init post_cpu_init(void)  {  	unsigned int reg;  |