2008-07-05 12:02:59 +04:00
/*
* Copyright 2007 Freescale Semiconductor , Inc . All Rights Reserved .
* Copyright 2008 Juergen Beisert , kernel @ pengutronix . 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 .
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston ,
* MA 02110 - 1301 , USA .
*/
/*
* i . MX27 specific CPU detection code
*/
# include <linux/io.h>
# include <linux/module.h>
2012-09-14 10:14:45 +04:00
# include "hardware.h"
2008-07-05 12:02:59 +04:00
2011-08-26 09:35:20 +04:00
static int mx27_cpu_rev = - 1 ;
static int mx27_cpu_partnumber ;
2008-07-05 12:02:59 +04:00
2009-02-16 17:13:43 +03:00
# define SYS_CHIP_ID 0x00 /* The offset of CHIP ID register */
2011-08-26 09:35:20 +04:00
static int mx27_read_cpu_rev ( void )
2008-07-05 12:02:59 +04:00
{
u32 val ;
/*
* now we have access to the IO registers . As we need
* the silicon revision very early we read it here to
* avoid any further hooks
*/
2009-12-16 19:30:27 +03:00
val = __raw_readl ( MX27_IO_ADDRESS ( MX27_SYSCTRL_BASE_ADDR
+ SYS_CHIP_ID ) ) ;
2008-07-05 12:02:59 +04:00
2011-08-26 09:35:20 +04:00
mx27_cpu_partnumber = ( int ) ( ( val > > 12 ) & 0xFFFF ) ;
2010-11-15 20:30:01 +03:00
switch ( val > > 28 ) {
case 0 :
2011-08-26 09:35:20 +04:00
return IMX_CHIP_REVISION_1_0 ;
2010-11-15 20:30:01 +03:00
case 1 :
2011-08-26 09:35:20 +04:00
return IMX_CHIP_REVISION_2_0 ;
2010-11-15 20:30:01 +03:00
case 2 :
2011-08-26 09:35:20 +04:00
return IMX_CHIP_REVISION_2_1 ;
2010-11-15 20:30:01 +03:00
default :
2011-08-26 09:35:20 +04:00
return IMX_CHIP_REVISION_UNKNOWN ;
2010-11-15 20:30:01 +03:00
}
2008-07-05 12:02:59 +04:00
}
/*
* Returns :
* the silicon revision of the cpu
* - EINVAL - not a mx27
*/
int mx27_revision ( void )
{
2011-08-26 09:35:20 +04:00
if ( mx27_cpu_rev = = - 1 )
mx27_cpu_rev = mx27_read_cpu_rev ( ) ;
2008-07-05 12:02:59 +04:00
2011-08-26 09:35:20 +04:00
if ( mx27_cpu_partnumber ! = 0x8821 )
2008-07-05 12:02:59 +04:00
return - EINVAL ;
2011-08-26 09:35:20 +04:00
return mx27_cpu_rev ;
2008-07-05 12:02:59 +04:00
}
EXPORT_SYMBOL ( mx27_revision ) ;