2009-11-21 22:17:18 +03:00
/*
2011-03-17 11:40:29 +03:00
* MX31 CPU type detection
2009-11-21 22:17:18 +03:00
*
* Copyright ( c ) 2009 Daniel Mack < daniel @ caiaq . de >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*/
# include <linux/module.h>
# include <linux/io.h>
2012-09-13 17:01:00 +04:00
# include "common.h"
2012-09-14 10:14:45 +04:00
# include "hardware.h"
2012-09-13 17:18:39 +04:00
# include "iim.h"
2009-11-21 22:17:18 +03:00
2011-08-26 09:35:21 +04:00
static int mx31_cpu_rev = - 1 ;
2009-11-21 22:17:18 +03:00
2011-03-17 11:40:29 +03:00
static struct {
2009-11-21 22:17:18 +03:00
u8 srev ;
const char * name ;
unsigned int rev ;
2011-08-26 09:35:21 +04:00
} mx31_cpu_type [ ] = {
{ . srev = 0x00 , . name = " i.MX31(L) " , . rev = IMX_CHIP_REVISION_1_0 } ,
{ . srev = 0x10 , . name = " i.MX31 " , . rev = IMX_CHIP_REVISION_1_1 } ,
{ . srev = 0x11 , . name = " i.MX31L " , . rev = IMX_CHIP_REVISION_1_1 } ,
{ . srev = 0x12 , . name = " i.MX31 " , . rev = IMX_CHIP_REVISION_1_1 } ,
{ . srev = 0x13 , . name = " i.MX31L " , . rev = IMX_CHIP_REVISION_1_1 } ,
{ . srev = 0x14 , . name = " i.MX31 " , . rev = IMX_CHIP_REVISION_1_2 } ,
{ . srev = 0x15 , . name = " i.MX31L " , . rev = IMX_CHIP_REVISION_1_2 } ,
{ . srev = 0x28 , . name = " i.MX31 " , . rev = IMX_CHIP_REVISION_2_0 } ,
{ . srev = 0x29 , . name = " i.MX31L " , . rev = IMX_CHIP_REVISION_2_0 } ,
2009-11-21 22:17:18 +03:00
} ;
2011-08-26 09:35:21 +04:00
static int mx31_read_cpu_rev ( void )
2009-11-21 22:17:18 +03:00
{
u32 i , srev ;
/* read SREV register from IIM module */
2010-10-08 18:00:09 +04:00
srev = __raw_readl ( MX31_IO_ADDRESS ( MX31_IIM_BASE_ADDR + MXC_IIMSREV ) ) ;
2011-08-26 09:35:21 +04:00
srev & = 0xff ;
2009-11-21 22:17:18 +03:00
for ( i = 0 ; i < ARRAY_SIZE ( mx31_cpu_type ) ; i + + )
if ( srev = = mx31_cpu_type [ i ] . srev ) {
2011-08-26 09:35:21 +04:00
imx_print_silicon_rev ( mx31_cpu_type [ i ] . name ,
mx31_cpu_type [ i ] . rev ) ;
return mx31_cpu_type [ i ] . rev ;
2009-11-21 22:17:18 +03:00
}
2011-08-26 09:35:21 +04:00
imx_print_silicon_rev ( " i.MX31 " , IMX_CHIP_REVISION_UNKNOWN ) ;
return IMX_CHIP_REVISION_UNKNOWN ;
}
int mx31_revision ( void )
{
if ( mx31_cpu_rev = = - 1 )
mx31_cpu_rev = mx31_read_cpu_rev ( ) ;
2010-11-15 20:30:01 +03:00
2011-08-26 09:35:21 +04:00
return mx31_cpu_rev ;
2009-11-21 22:17:18 +03:00
}
2011-08-26 09:35:21 +04:00
EXPORT_SYMBOL ( mx31_revision ) ;