| Daniel Mack | 52939c0 | 2009-11-21 20:17:18 +0100 | [diff] [blame] | 1 | /* | 
| Uwe Kleine-König | 27ad4bf | 2011-03-17 09:40:29 +0100 | [diff] [blame] | 2 |  * MX31 CPU type detection | 
| Daniel Mack | 52939c0 | 2009-11-21 20:17:18 +0100 | [diff] [blame] | 3 |  * | 
 | 4 |  * Copyright (c) 2009 Daniel Mack <daniel@caiaq.de> | 
 | 5 |  * | 
 | 6 |  * This program is free software; you can redistribute it and/or modify | 
 | 7 |  * it under the terms of the GNU General Public License as published by | 
 | 8 |  * the Free Software Foundation; either version 2 of the License, or | 
 | 9 |  * (at your option) any later version. | 
 | 10 |  */ | 
 | 11 |  | 
 | 12 | #include <linux/module.h> | 
 | 13 | #include <linux/io.h> | 
 | 14 | #include <mach/hardware.h> | 
 | 15 | #include <mach/iim.h> | 
 | 16 |  | 
 | 17 | unsigned int mx31_cpu_rev; | 
 | 18 | EXPORT_SYMBOL(mx31_cpu_rev); | 
 | 19 |  | 
| Uwe Kleine-König | 27ad4bf | 2011-03-17 09:40:29 +0100 | [diff] [blame] | 20 | static struct { | 
| Daniel Mack | 52939c0 | 2009-11-21 20:17:18 +0100 | [diff] [blame] | 21 | 	u8 srev; | 
 | 22 | 	const char *name; | 
 | 23 | 	const char *v; | 
 | 24 | 	unsigned int rev; | 
| Uwe Kleine-König | 27ad4bf | 2011-03-17 09:40:29 +0100 | [diff] [blame] | 25 | } mx31_cpu_type[] __initdata = { | 
| Dinh Nguyen | 9ab4650 | 2010-11-15 11:30:01 -0600 | [diff] [blame] | 26 | 	{ .srev = 0x00, .name = "i.MX31(L)", .v = "1.0",  .rev = IMX_CHIP_REVISION_1_0	}, | 
 | 27 | 	{ .srev = 0x10, .name = "i.MX31",    .v = "1.1",  .rev = IMX_CHIP_REVISION_1_1	}, | 
 | 28 | 	{ .srev = 0x11, .name = "i.MX31L",   .v = "1.1",  .rev = IMX_CHIP_REVISION_1_1	}, | 
 | 29 | 	{ .srev = 0x12, .name = "i.MX31",    .v = "1.15", .rev = IMX_CHIP_REVISION_1_1	}, | 
 | 30 | 	{ .srev = 0x13, .name = "i.MX31L",   .v = "1.15", .rev = IMX_CHIP_REVISION_1_1	}, | 
 | 31 | 	{ .srev = 0x14, .name = "i.MX31",    .v = "1.2",  .rev = IMX_CHIP_REVISION_1_2	}, | 
 | 32 | 	{ .srev = 0x15, .name = "i.MX31L",   .v = "1.2",  .rev = IMX_CHIP_REVISION_1_2	}, | 
 | 33 | 	{ .srev = 0x28, .name = "i.MX31",    .v = "2.0",  .rev = IMX_CHIP_REVISION_2_0	}, | 
 | 34 | 	{ .srev = 0x29, .name = "i.MX31L",   .v = "2.0",  .rev = IMX_CHIP_REVISION_2_0	}, | 
| Daniel Mack | 52939c0 | 2009-11-21 20:17:18 +0100 | [diff] [blame] | 35 | }; | 
 | 36 |  | 
 | 37 | void __init mx31_read_cpu_rev(void) | 
 | 38 | { | 
 | 39 | 	u32 i, srev; | 
 | 40 |  | 
 | 41 | 	/* read SREV register from IIM module */ | 
| Sascha Hauer | fdb0387 | 2010-10-08 16:00:09 +0200 | [diff] [blame] | 42 | 	srev = __raw_readl(MX31_IO_ADDRESS(MX31_IIM_BASE_ADDR + MXC_IIMSREV)); | 
| Daniel Mack | 52939c0 | 2009-11-21 20:17:18 +0100 | [diff] [blame] | 43 |  | 
 | 44 | 	for (i = 0; i < ARRAY_SIZE(mx31_cpu_type); i++) | 
 | 45 | 		if (srev == mx31_cpu_type[i].srev) { | 
 | 46 | 			printk(KERN_INFO | 
 | 47 | 				"CPU identified as %s, silicon rev %s\n", | 
 | 48 | 				mx31_cpu_type[i].name, mx31_cpu_type[i].v); | 
 | 49 |  | 
 | 50 | 			mx31_cpu_rev = mx31_cpu_type[i].rev; | 
 | 51 | 			return; | 
 | 52 | 		} | 
 | 53 |  | 
| Dinh Nguyen | 9ab4650 | 2010-11-15 11:30:01 -0600 | [diff] [blame] | 54 | 	mx31_cpu_rev = IMX_CHIP_REVISION_UNKNOWN; | 
 | 55 |  | 
| Daniel Mack | 52939c0 | 2009-11-21 20:17:18 +0100 | [diff] [blame] | 56 | 	printk(KERN_WARNING "Unknown CPU identifier. srev = %02x\n", srev); | 
 | 57 | } |