2005-11-10 17:26:51 +03:00
/*
* linux / arch / arm / mach - omap2 / id . c
*
* OMAP2 CPU identification code
*
* Copyright ( C ) 2005 Nokia Corporation
* Written by Tony Lindgren < tony @ atomide . com >
*
2011-02-17 20:55:03 +03:00
* Copyright ( C ) 2009 - 11 Texas Instruments
2009-05-29 01:16:04 +04:00
* Added OMAP4 support - Santosh Shilimkar < santosh . shilimkar @ ti . com >
*
2005-11-10 17:26:51 +03:00
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*/
# include <linux/module.h>
# include <linux/kernel.h>
# include <linux/init.h>
2008-09-06 15:10:45 +04:00
# include <linux/io.h>
2005-11-10 17:26:51 +03:00
2008-08-10 21:08:10 +04:00
# include <asm/cputype.h>
2005-11-10 17:26:51 +03:00
2009-10-20 20:40:47 +04:00
# include <plat/common.h>
# include <plat/cpu.h>
2006-12-07 04:14:05 +03:00
2010-08-02 15:21:41 +04:00
# include <mach/id.h>
2010-10-08 21:40:20 +04:00
# include "control.h"
2008-07-03 13:24:45 +04:00
static struct omap_chip_id omap_chip ;
2008-12-11 04:36:31 +03:00
static unsigned int omap_revision ;
2009-11-22 21:10:53 +03:00
u32 omap3_features ;
2008-12-11 04:36:31 +03:00
unsigned int omap_rev ( void )
{
return omap_revision ;
}
EXPORT_SYMBOL ( omap_rev ) ;
2008-07-03 13:24:45 +04:00
/**
* 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 ) ;
2009-06-23 14:30:23 +04:00
int omap_type ( void )
{
u32 val = 0 ;
2009-11-22 21:11:24 +03:00
if ( cpu_is_omap24xx ( ) ) {
2009-06-23 14:30:23 +04:00
val = omap_ctrl_readl ( OMAP24XX_CONTROL_STATUS ) ;
2009-11-22 21:11:24 +03:00
} else if ( cpu_is_omap34xx ( ) ) {
2009-06-23 14:30:23 +04:00
val = omap_ctrl_readl ( OMAP343X_CONTROL_STATUS ) ;
2010-02-18 11:59:10 +03:00
} else if ( cpu_is_omap44xx ( ) ) {
2010-09-28 00:02:58 +04:00
val = omap_ctrl_readl ( OMAP4_CTRL_MODULE_CORE_STATUS ) ;
2009-11-22 21:11:24 +03:00
} else {
2009-06-23 14:30:23 +04:00
pr_err ( " Cannot detect omap type! \n " ) ;
goto out ;
}
val & = OMAP2_DEVICETYPE_MASK ;
val > > = 8 ;
out :
return val ;
}
EXPORT_SYMBOL ( omap_type ) ;
2008-12-11 04:36:30 +03:00
/*----------------------------------------------------------------------------*/
2008-07-03 13:24:45 +04:00
2008-12-11 04:36:30 +03:00
# define OMAP_TAP_IDCODE 0x0204
# define OMAP_TAP_DIE_ID_0 0x0218
# define OMAP_TAP_DIE_ID_1 0x021C
# define OMAP_TAP_DIE_ID_2 0x0220
# define OMAP_TAP_DIE_ID_3 0x0224
2008-07-03 13:24:45 +04:00
2011-03-13 01:50:54 +03:00
# define OMAP_TAP_DIE_ID_44XX_0 0x0200
# define OMAP_TAP_DIE_ID_44XX_1 0x0208
# define OMAP_TAP_DIE_ID_44XX_2 0x020c
# define OMAP_TAP_DIE_ID_44XX_3 0x0210
2008-12-11 04:36:30 +03:00
# define read_tap_reg(reg) __raw_readl(tap_base + (reg))
2008-07-03 13:24:45 +04:00
2008-12-11 04:36:30 +03:00
struct omap_id {
u16 hawkeye ; /* Silicon type (Hawkeye id) */
u8 dev ; /* Device type from production_id reg */
2008-12-11 04:36:31 +03:00
u32 type ; /* Combined type id copied to omap_revision */
2008-12-11 04:36:30 +03:00
} ;
2008-07-03 13:24:45 +04:00
2008-12-11 04:36:30 +03:00
/* Register values to detect the OMAP version */
static struct omap_id omap_ids [ ] __initdata = {
{ . hawkeye = 0xb5d9 , . dev = 0x0 , . type = 0x24200024 } ,
{ . hawkeye = 0xb5d9 , . dev = 0x1 , . type = 0x24201024 } ,
{ . hawkeye = 0xb5d9 , . dev = 0x2 , . type = 0x24202024 } ,
{ . hawkeye = 0xb5d9 , . dev = 0x4 , . type = 0x24220024 } ,
{ . hawkeye = 0xb5d9 , . dev = 0x8 , . type = 0x24230024 } ,
{ . hawkeye = 0xb68a , . dev = 0x0 , . type = 0x24300024 } ,
} ;
2008-07-03 13:24:45 +04:00
2008-12-11 04:36:30 +03:00
static void __iomem * tap_base ;
static u16 tap_prod_id ;
2005-11-10 17:26:51 +03:00
2010-08-02 15:21:41 +04:00
void omap_get_die_id ( struct omap_die_id * odi )
{
2011-03-13 01:50:54 +03:00
if ( cpu_is_omap44xx ( ) ) {
odi - > id_0 = read_tap_reg ( OMAP_TAP_DIE_ID_44XX_0 ) ;
odi - > id_1 = read_tap_reg ( OMAP_TAP_DIE_ID_44XX_1 ) ;
odi - > id_2 = read_tap_reg ( OMAP_TAP_DIE_ID_44XX_2 ) ;
odi - > id_3 = read_tap_reg ( OMAP_TAP_DIE_ID_44XX_3 ) ;
return ;
}
2010-08-02 15:21:41 +04:00
odi - > id_0 = read_tap_reg ( OMAP_TAP_DIE_ID_0 ) ;
odi - > id_1 = read_tap_reg ( OMAP_TAP_DIE_ID_1 ) ;
odi - > id_2 = read_tap_reg ( OMAP_TAP_DIE_ID_2 ) ;
odi - > id_3 = read_tap_reg ( OMAP_TAP_DIE_ID_3 ) ;
}
2010-08-02 15:21:40 +04:00
static void __init omap24xx_check_revision ( void )
2005-11-10 17:26:51 +03:00
{
int i , j ;
2008-12-11 04:36:30 +03:00
u32 idcode , prod_id ;
2005-11-10 17:26:51 +03:00
u16 hawkeye ;
2008-12-11 04:36:30 +03:00
u8 dev_type , rev ;
2010-08-02 15:21:41 +04:00
struct omap_die_id odi ;
2005-11-10 17:26:51 +03:00
idcode = read_tap_reg ( OMAP_TAP_IDCODE ) ;
2008-10-06 16:49:16 +04:00
prod_id = read_tap_reg ( tap_prod_id ) ;
2005-11-10 17:26:51 +03:00
hawkeye = ( idcode > > 12 ) & 0xffff ;
rev = ( idcode > > 28 ) & 0x0f ;
dev_type = ( prod_id > > 16 ) & 0x0f ;
2010-08-02 15:21:41 +04:00
omap_get_die_id ( & odi ) ;
2005-11-10 17:26:51 +03:00
2008-07-03 13:24:45 +04:00
pr_debug ( " OMAP_TAP_IDCODE 0x%08x REV %i HAWKEYE 0x%04x MANF %03x \n " ,
idcode , rev , hawkeye , ( idcode > > 1 ) & 0x7ff ) ;
2010-08-02 15:21:41 +04:00
pr_debug ( " OMAP_TAP_DIE_ID_0: 0x%08x \n " , odi . id_0 ) ;
2008-07-03 13:24:45 +04:00
pr_debug ( " OMAP_TAP_DIE_ID_1: 0x%08x DEV_REV: %i \n " ,
2010-08-02 15:21:41 +04:00
odi . id_1 , ( odi . id_1 > > 28 ) & 0xf ) ;
pr_debug ( " OMAP_TAP_DIE_ID_2: 0x%08x \n " , odi . id_2 ) ;
pr_debug ( " OMAP_TAP_DIE_ID_3: 0x%08x \n " , odi . id_3 ) ;
2008-07-03 13:24:45 +04:00
pr_debug ( " OMAP_TAP_PROD_ID_0: 0x%08x DEV_TYPE: %i \n " ,
prod_id , dev_type ) ;
2005-11-10 17:26:51 +03:00
/* Check hawkeye ids */
for ( i = 0 ; i < ARRAY_SIZE ( omap_ids ) ; i + + ) {
if ( hawkeye = = omap_ids [ i ] . hawkeye )
break ;
}
if ( i = = ARRAY_SIZE ( omap_ids ) ) {
printk ( KERN_ERR " Unknown OMAP CPU id \n " ) ;
return ;
}
for ( j = i ; j < ARRAY_SIZE ( omap_ids ) ; j + + ) {
if ( dev_type = = omap_ids [ j ] . dev )
break ;
}
if ( j = = ARRAY_SIZE ( omap_ids ) ) {
printk ( KERN_ERR " Unknown OMAP device type. "
" Handling it as OMAP%04x \n " ,
omap_ids [ i ] . type > > 16 ) ;
j = i ;
}
2008-12-11 04:36:31 +03:00
pr_info ( " OMAP%04x " , omap_rev ( ) > > 16 ) ;
if ( ( omap_rev ( ) > > 8 ) & 0x0f )
pr_info ( " ES%x " , ( omap_rev ( ) > > 12 ) & 0xf ) ;
2008-07-03 13:24:45 +04:00
pr_info ( " \n " ) ;
2008-12-11 04:36:30 +03:00
}
2009-11-22 21:10:53 +03:00
# define OMAP3_CHECK_FEATURE(status,feat) \
if ( ( ( status & OMAP3_ # # feat # # _MASK ) \
> > OMAP3_ # # feat # # _SHIFT ) ! = FEAT_ # # feat # # _NONE ) { \
omap3_features | = OMAP3_HAS_ # # feat ; \
}
2010-08-02 15:21:40 +04:00
static void __init omap3_check_features ( void )
2009-11-22 21:10:53 +03:00
{
u32 status ;
omap3_features = 0 ;
status = omap_ctrl_readl ( OMAP3_CONTROL_OMAP_STATUS ) ;
OMAP3_CHECK_FEATURE ( status , L2CACHE ) ;
OMAP3_CHECK_FEATURE ( status , IVA ) ;
OMAP3_CHECK_FEATURE ( status , SGX ) ;
OMAP3_CHECK_FEATURE ( status , NEON ) ;
OMAP3_CHECK_FEATURE ( status , ISP ) ;
2010-02-23 08:09:10 +03:00
if ( cpu_is_omap3630 ( ) )
omap3_features | = OMAP3_HAS_192MHZ_CLK ;
2010-08-02 15:21:40 +04:00
if ( ! cpu_is_omap3505 ( ) & & ! cpu_is_omap3517 ( ) )
omap3_features | = OMAP3_HAS_IO_WAKEUP ;
2009-11-22 21:10:53 +03:00
2011-02-16 19:31:39 +03:00
omap3_features | = OMAP3_HAS_SDRC ;
2009-11-22 21:10:53 +03:00
/*
* TODO : Get additional info ( where applicable )
* e . g . Size of L2 cache .
*/
}
2011-02-16 19:31:39 +03:00
static void __init ti816x_check_features ( void )
{
omap3_features = OMAP3_HAS_NEON ;
}
2010-08-02 15:21:40 +04:00
static void __init omap3_check_revision ( void )
2008-12-11 04:36:30 +03:00
{
u32 cpuid , idcode ;
u16 hawkeye ;
u8 rev ;
2010-01-20 02:40:26 +03:00
omap_chip . oc = CHIP_IS_OMAP3430 ;
2008-12-11 04:36:30 +03:00
/*
* We cannot access revision registers on ES1 .0 .
* If the processor type is Cortex - A8 and the revision is 0x0
* it means its Cortex r0p0 which is 3430 ES1 .0 .
*/
cpuid = read_cpuid ( CPUID_ID ) ;
if ( ( ( ( cpuid > > 4 ) & 0xfff ) = = 0xc08 ) & & ( ( cpuid & 0xf ) = = 0x0 ) ) {
2008-12-11 04:36:31 +03:00
omap_revision = OMAP3430_REV_ES1_0 ;
2010-01-20 02:40:26 +03:00
omap_chip . oc | = CHIP_IS_OMAP3430ES1 ;
2009-11-22 21:10:54 +03:00
return ;
2008-12-11 04:36:30 +03:00
}
/*
* Detection for 34 xx ES2 .0 and above can be done with just
* hawkeye and rev . See TRM 1.5 .2 Device Identification .
* Note that rev does not map directly to our defined processor
* revision numbers as ES1 .0 uses value 0.
*/
idcode = read_tap_reg ( OMAP_TAP_IDCODE ) ;
hawkeye = ( idcode > > 12 ) & 0xffff ;
rev = ( idcode > > 28 ) & 0xff ;
2008-07-03 13:24:45 +04:00
2009-11-22 21:10:56 +03:00
switch ( hawkeye ) {
case 0xb7ae :
/* Handle 34xx/35xx devices */
2008-12-11 04:36:30 +03:00
switch ( rev ) {
2009-11-22 21:10:54 +03:00
case 0 : /* Take care of early samples */
case 1 :
2008-12-11 04:36:31 +03:00
omap_revision = OMAP3430_REV_ES2_0 ;
2010-01-20 02:40:26 +03:00
omap_chip . oc | = CHIP_IS_OMAP3430ES2 ;
2008-12-11 04:36:30 +03:00
break ;
case 2 :
2008-12-11 04:36:31 +03:00
omap_revision = OMAP3430_REV_ES2_1 ;
2010-01-20 02:40:26 +03:00
omap_chip . oc | = CHIP_IS_OMAP3430ES2 ;
2008-12-11 04:36:30 +03:00
break ;
case 3 :
2008-12-11 04:36:31 +03:00
omap_revision = OMAP3430_REV_ES3_0 ;
2010-01-20 02:40:26 +03:00
omap_chip . oc | = CHIP_IS_OMAP3430ES3_0 ;
2008-12-11 04:36:30 +03:00
break ;
2009-01-29 19:57:16 +03:00
case 4 :
2010-01-20 02:40:26 +03:00
omap_revision = OMAP3430_REV_ES3_1 ;
omap_chip . oc | = CHIP_IS_OMAP3430ES3_1 ;
break ;
case 7 :
2009-11-22 21:11:24 +03:00
/* FALLTHROUGH */
2008-12-11 04:36:30 +03:00
default :
/* Use the latest known revision as default */
2010-01-20 02:40:26 +03:00
omap_revision = OMAP3430_REV_ES3_1_2 ;
/* REVISIT: Add CHIP_IS_OMAP3430ES3_1_2? */
omap_chip . oc | = CHIP_IS_OMAP3430ES3_1 ;
2008-12-11 04:36:30 +03:00
}
2009-11-22 21:10:56 +03:00
break ;
2009-11-22 21:10:58 +03:00
case 0xb868 :
/* Handle OMAP35xx/AM35xx devices
*
* Set the device to be OMAP3505 here . Actual device
* is identified later based on the features .
2010-01-20 02:40:26 +03:00
*
* REVISIT : AM3505 / AM3517 should have their own CHIP_IS
2009-11-22 21:10:58 +03:00
*/
omap_revision = OMAP3505_REV ( rev ) ;
2010-01-20 02:40:26 +03:00
omap_chip . oc | = CHIP_IS_OMAP3430ES3_1 ;
2009-11-22 21:10:58 +03:00
break ;
2009-11-22 21:11:24 +03:00
case 0xb891 :
2010-08-03 23:59:24 +04:00
/* Handle 36xx devices */
omap_chip . oc | = CHIP_IS_OMAP3630ES1 ;
switch ( rev ) {
case 0 : /* Take care of early samples */
omap_revision = OMAP3630_REV_ES1_0 ;
break ;
case 1 :
omap_revision = OMAP3630_REV_ES1_1 ;
omap_chip . oc | = CHIP_IS_OMAP3630ES1_1 ;
break ;
case 2 :
default :
omap_revision = OMAP3630_REV_ES1_2 ;
omap_chip . oc | = CHIP_IS_OMAP3630ES1_2 ;
}
2010-08-16 10:21:19 +04:00
break ;
2011-02-16 19:31:39 +03:00
case 0xb81e :
omap_chip . oc = CHIP_IS_TI816X ;
switch ( rev ) {
case 0 :
omap_revision = TI8168_REV_ES1_0 ;
break ;
case 1 :
omap_revision = TI8168_REV_ES1_1 ;
break ;
default :
omap_revision = TI8168_REV_ES1_1 ;
}
break ;
2009-11-22 21:10:56 +03:00
default :
/* Unknown default to latest silicon rev as default*/
2010-08-03 23:59:24 +04:00
omap_revision = OMAP3630_REV_ES1_2 ;
omap_chip . oc | = CHIP_IS_OMAP3630ES1_2 ;
2008-12-11 04:36:30 +03:00
}
2005-11-10 17:26:51 +03:00
}
2010-08-02 15:21:40 +04:00
static void __init omap4_check_revision ( void )
2009-12-12 03:16:34 +03:00
{
u32 idcode ;
u16 hawkeye ;
u8 rev ;
/*
* The IC rev detection is done with hawkeye and rev .
* Note that rev does not map directly to defined processor
* revision numbers as ES1 .0 uses value 0.
*/
idcode = read_tap_reg ( OMAP_TAP_IDCODE ) ;
hawkeye = ( idcode > > 12 ) & 0xffff ;
2011-02-17 20:55:03 +03:00
rev = ( idcode > > 28 ) & 0xf ;
2009-12-12 03:16:34 +03:00
2010-09-16 17:14:46 +04:00
/*
2011-07-02 06:30:21 +04:00
* Few initial 4430 ES2 .0 samples IDCODE is same as ES1 .0
2010-09-16 17:14:46 +04:00
* Use ARM register to detect the correct ES version
*/
2011-07-02 06:30:21 +04:00
if ( ! rev & & ( hawkeye ! = 0xb94e ) ) {
2010-09-16 17:14:46 +04:00
idcode = read_cpuid ( CPUID_ID ) ;
rev = ( idcode & 0xf ) - 1 ;
}
switch ( hawkeye ) {
case 0xb852 :
switch ( rev ) {
case 0 :
omap_revision = OMAP4430_REV_ES1_0 ;
omap_chip . oc | = CHIP_IS_OMAP4430ES1 ;
break ;
case 1 :
2011-02-17 20:55:03 +03:00
default :
2010-09-16 17:14:46 +04:00
omap_revision = OMAP4430_REV_ES2_0 ;
omap_chip . oc | = CHIP_IS_OMAP4430ES2 ;
2011-02-17 20:55:03 +03:00
}
break ;
case 0xb95c :
switch ( rev ) {
case 3 :
omap_revision = OMAP4430_REV_ES2_1 ;
omap_chip . oc | = CHIP_IS_OMAP4430ES2_1 ;
2010-09-16 17:14:46 +04:00
break ;
2011-02-17 20:55:03 +03:00
case 4 :
2010-09-16 17:14:46 +04:00
default :
2011-02-17 20:55:03 +03:00
omap_revision = OMAP4430_REV_ES2_2 ;
omap_chip . oc | = CHIP_IS_OMAP4430ES2_2 ;
}
break ;
2011-07-02 06:30:21 +04:00
case 0xb94e :
switch ( rev ) {
case 0 :
default :
omap_revision = OMAP4460_REV_ES1_0 ;
omap_chip . oc | = CHIP_IS_OMAP4460ES1_0 ;
break ;
}
break ;
2010-09-16 17:14:46 +04:00
default :
2011-02-17 20:55:03 +03:00
/* Unknown default to latest silicon rev as default */
omap_revision = OMAP4430_REV_ES2_2 ;
omap_chip . oc | = CHIP_IS_OMAP4430ES2_2 ;
2009-12-12 03:16:34 +03:00
}
2011-02-17 20:55:03 +03:00
pr_info ( " OMAP%04x ES%d.%d \n " , omap_rev ( ) > > 16 ,
( ( omap_rev ( ) > > 12 ) & 0xf ) , ( ( omap_rev ( ) > > 8 ) & 0xf ) ) ;
2009-12-12 03:16:34 +03:00
}
2009-11-22 21:10:53 +03:00
# define OMAP3_SHOW_FEATURE(feat) \
2009-11-22 21:11:13 +03:00
if ( omap3_has_ # # feat ( ) ) \
printk ( # feat " " ) ;
2009-11-22 21:10:53 +03:00
2010-08-02 15:21:40 +04:00
static void __init omap3_cpuinfo ( void )
2009-11-22 21:10:53 +03:00
{
2009-11-22 21:10:54 +03:00
u8 rev = GET_OMAP_REVISION ( ) ;
char cpu_name [ 16 ] , cpu_rev [ 16 ] ;
/* 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 .
*/
2009-11-22 21:11:24 +03:00
if ( cpu_is_omap3630 ( ) ) {
2009-11-22 21:10:58 +03:00
strcpy ( cpu_name , " OMAP3630 " ) ;
2009-11-22 21:11:24 +03:00
} else if ( cpu_is_omap3505 ( ) ) {
2009-11-22 21:10:58 +03:00
/*
* AM35xx devices
*/
if ( omap3_has_sgx ( ) ) {
omap_revision = OMAP3517_REV ( rev ) ;
strcpy ( cpu_name , " AM3517 " ) ;
2009-11-22 21:11:24 +03:00
} else {
2009-11-22 21:10:58 +03:00
/* Already set in omap3_check_revision() */
strcpy ( cpu_name , " AM3505 " ) ;
}
2011-02-16 19:31:39 +03:00
} else if ( cpu_is_ti816x ( ) ) {
strcpy ( cpu_name , " TI816X " ) ;
2009-11-22 21:11:24 +03:00
} else if ( omap3_has_iva ( ) & & omap3_has_sgx ( ) ) {
/* OMAP3430, OMAP3525, OMAP3515, OMAP3503 devices */
2009-11-22 21:10:58 +03:00
strcpy ( cpu_name , " OMAP3430/3530 " ) ;
2009-12-12 03:16:37 +03:00
} else if ( omap3_has_iva ( ) ) {
2009-11-22 21:10:54 +03:00
omap_revision = OMAP3525_REV ( rev ) ;
2009-11-22 21:10:58 +03:00
strcpy ( cpu_name , " OMAP3525 " ) ;
2009-12-12 03:16:37 +03:00
} else if ( omap3_has_sgx ( ) ) {
2009-11-22 21:10:54 +03:00
omap_revision = OMAP3515_REV ( rev ) ;
2009-11-22 21:10:58 +03:00
strcpy ( cpu_name , " OMAP3515 " ) ;
2009-11-22 21:11:24 +03:00
} else {
2009-11-22 21:10:54 +03:00
omap_revision = OMAP3503_REV ( rev ) ;
2009-11-22 21:10:58 +03:00
strcpy ( cpu_name , " OMAP3503 " ) ;
2009-11-22 21:10:54 +03:00
}
2011-02-16 19:31:39 +03:00
if ( cpu_is_omap3630 ( ) | | cpu_is_ti816x ( ) ) {
2010-10-02 03:35:24 +04:00
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 " ) ;
}
2009-11-22 21:10:54 +03:00
}
2009-11-22 21:11:24 +03:00
/* Print verbose information */
2009-11-22 21:11:13 +03:00
pr_info ( " %s ES%s ( " , cpu_name , cpu_rev ) ;
2009-11-22 21:10:54 +03:00
2009-11-22 21:10:53 +03:00
OMAP3_SHOW_FEATURE ( l2cache ) ;
OMAP3_SHOW_FEATURE ( iva ) ;
OMAP3_SHOW_FEATURE ( sgx ) ;
OMAP3_SHOW_FEATURE ( neon ) ;
OMAP3_SHOW_FEATURE ( isp ) ;
2010-02-23 08:09:10 +03:00
OMAP3_SHOW_FEATURE ( 192 mhz_clk ) ;
2009-11-22 21:11:13 +03:00
printk ( " ) \n " ) ;
2009-11-22 21:10:53 +03:00
}
2008-12-11 04:36:30 +03:00
/*
* Try to detect the exact revision of the omap we ' re running on
*/
2008-12-11 04:36:30 +03:00
void __init omap2_check_revision ( void )
{
2008-12-11 04:36:30 +03:00
/*
* At this point we have an idea about the processor revision set
* earlier with omap2_set_globals_tap ( ) .
*/
2009-11-22 21:11:24 +03:00
if ( cpu_is_omap24xx ( ) ) {
2008-12-11 04:36:30 +03:00
omap24xx_check_revision ( ) ;
2009-11-22 21:11:24 +03:00
} else if ( cpu_is_omap34xx ( ) ) {
2009-11-22 21:10:53 +03:00
omap3_check_revision ( ) ;
2011-02-16 19:31:39 +03:00
/* TI816X doesn't have feature register */
if ( ! cpu_is_ti816x ( ) )
omap3_check_features ( ) ;
else
ti816x_check_features ( ) ;
2009-11-22 21:10:53 +03:00
omap3_cpuinfo ( ) ;
2010-01-20 02:40:26 +03:00
return ;
2009-11-22 21:11:24 +03:00
} else if ( cpu_is_omap44xx ( ) ) {
2009-12-12 03:16:34 +03:00
omap4_check_revision ( ) ;
2009-05-29 01:16:04 +04:00
return ;
2009-11-22 21:11:24 +03:00
} else {
2008-12-11 04:36:30 +03:00
pr_err ( " OMAP revision unknown, please fix! \n " ) ;
2009-11-22 21:11:24 +03:00
}
2008-12-11 04:36:30 +03:00
/*
* 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 ;
2010-01-20 02:40:26 +03:00
return ;
2008-12-11 04:36:30 +03:00
} else if ( cpu_is_omap242x ( ) ) {
/* Currently only supports 2420ES2.1.1 and 2420-all */
omap_chip . oc | = CHIP_IS_OMAP2420 ;
2010-01-20 02:40:26 +03:00
return ;
2008-12-11 04:36:30 +03:00
}
2010-01-20 02:40:26 +03:00
pr_err ( " Uninitialized omap_chip, please fix! \n " ) ;
2008-12-11 04:36:30 +03:00
}
2008-12-11 04:36:30 +03:00
/*
* Set up things for map_io and processor detection later on . Gets called
* pretty much first thing from board init . For multi - omap , this gets
* cpu_is_omapxxxx ( ) working accurately enough for map_io . Then we ' ll try to
* detect the exact revision later on in omap2_detect_revision ( ) once map_io
* is done .
*/
2008-10-06 16:49:16 +04:00
void __init omap2_set_globals_tap ( struct omap_globals * omap2_globals )
{
2008-12-11 04:36:31 +03:00
omap_revision = omap2_globals - > class ;
2008-10-06 16:49:16 +04:00
tap_base = omap2_globals - > tap ;
2008-12-11 04:36:30 +03:00
if ( cpu_is_omap34xx ( ) )
2008-10-06 16:49:16 +04:00
tap_prod_id = 0x0210 ;
else
tap_prod_id = 0x0208 ;
}