2010-02-04 23:21:53 +03:00
/*
2010-11-15 20:30:00 +03:00
* Copyright 2008 - 2010 Freescale Semiconductor , Inc . All Rights Reserved .
2010-02-04 23:21:53 +03:00
*
* The code contained herein is licensed under the GNU General Public
* License . You may obtain a copy of the GNU General Public License
* Version 2 or later at the following locations :
*
* http : //www.opensource.org/licenses/gpl-license.html
* http : //www.gnu.org/copyleft/gpl.html
*
* This file contains the CPU initialization code .
*/
# include <linux/types.h>
# include <linux/kernel.h>
# include <linux/init.h>
2010-03-19 12:50:55 +03:00
# include <linux/module.h>
2010-02-04 23:21:53 +03:00
# include <mach/hardware.h>
2011-11-21 22:26:52 +04:00
# include <linux/io.h>
2010-02-04 23:21:53 +03:00
2011-08-26 09:35:23 +04:00
static int mx5_cpu_rev = - 1 ;
2010-03-19 12:50:55 +03:00
2010-11-15 20:30:01 +03:00
# define IIM_SREV 0x24
2011-03-22 00:30:35 +03:00
# define MX50_HW_ADADIG_DIGPROG 0xB0
2010-03-19 12:50:55 +03:00
2010-11-15 20:30:01 +03:00
static int get_mx51_srev ( void )
2010-03-19 12:50:55 +03:00
{
2010-11-15 20:30:01 +03:00
void __iomem * iim_base = MX51_IO_ADDRESS ( MX51_IIM_BASE_ADDR ) ;
u32 rev = readl ( iim_base + IIM_SREV ) & 0xff ;
2010-03-19 12:50:55 +03:00
2011-08-26 09:35:23 +04:00
switch ( rev ) {
case 0x0 :
2010-11-15 20:30:01 +03:00
return IMX_CHIP_REVISION_2_0 ;
2011-08-26 09:35:23 +04:00
case 0x10 :
2010-11-15 20:30:01 +03:00
return IMX_CHIP_REVISION_3_0 ;
2011-08-26 09:35:23 +04:00
default :
return IMX_CHIP_REVISION_UNKNOWN ;
}
2010-03-19 12:50:55 +03:00
}
/*
* Returns :
* the silicon revision of the cpu
* - EINVAL - not a mx51
*/
int mx51_revision ( void )
{
if ( ! cpu_is_mx51 ( ) )
return - EINVAL ;
2011-08-26 09:35:23 +04:00
if ( mx5_cpu_rev = = - 1 )
mx5_cpu_rev = get_mx51_srev ( ) ;
2010-03-19 12:50:55 +03:00
2011-08-26 09:35:23 +04:00
return mx5_cpu_rev ;
2010-03-19 12:50:55 +03:00
}
EXPORT_SYMBOL ( mx51_revision ) ;
2010-09-01 23:49:13 +04:00
# ifdef CONFIG_NEON
/*
* All versions of the silicon before Rev . 3 have broken NEON implementations .
* Dependent on link order - so the assumption is that vfp_init is called
* before us .
*/
2012-04-26 07:42:34 +04:00
int __init mx51_neon_fixup ( void )
2010-09-01 23:49:13 +04:00
{
2011-11-21 22:26:52 +04:00
if ( mx51_revision ( ) < IMX_CHIP_REVISION_3_0 & &
( elf_hwcap & HWCAP_NEON ) ) {
2010-09-01 23:49:13 +04:00
elf_hwcap & = ~ HWCAP_NEON ;
pr_info ( " Turning off NEON support, detected broken NEON implementation \n " ) ;
}
return 0 ;
}
# endif
2010-11-15 20:30:01 +03:00
static int get_mx53_srev ( void )
{
void __iomem * iim_base = MX51_IO_ADDRESS ( MX53_IIM_BASE_ADDR ) ;
u32 rev = readl ( iim_base + IIM_SREV ) & 0xff ;
2011-02-18 15:26:30 +03:00
switch ( rev ) {
case 0x0 :
2010-11-15 20:30:01 +03:00
return IMX_CHIP_REVISION_1_0 ;
2011-02-18 15:26:30 +03:00
case 0x2 :
2010-11-15 20:30:01 +03:00
return IMX_CHIP_REVISION_2_0 ;
2011-02-18 15:26:30 +03:00
case 0x3 :
return IMX_CHIP_REVISION_2_1 ;
default :
return IMX_CHIP_REVISION_UNKNOWN ;
}
2010-11-15 20:30:01 +03:00
}
2010-11-15 20:30:00 +03:00
/*
* Returns :
* the silicon revision of the cpu
* - EINVAL - not a mx53
*/
int mx53_revision ( void )
{
if ( ! cpu_is_mx53 ( ) )
return - EINVAL ;
2011-08-26 09:35:23 +04:00
if ( mx5_cpu_rev = = - 1 )
mx5_cpu_rev = get_mx53_srev ( ) ;
2010-11-15 20:30:00 +03:00
2011-08-26 09:35:23 +04:00
return mx5_cpu_rev ;
2010-11-15 20:30:00 +03:00
}
EXPORT_SYMBOL ( mx53_revision ) ;
2011-03-22 00:30:35 +03:00
static int get_mx50_srev ( void )
{
void __iomem * anatop = ioremap ( MX50_ANATOP_BASE_ADDR , SZ_8K ) ;
u32 rev ;
if ( ! anatop ) {
2011-08-26 09:35:23 +04:00
mx5_cpu_rev = - EINVAL ;
2011-03-22 00:30:35 +03:00
return 0 ;
}
rev = readl ( anatop + MX50_HW_ADADIG_DIGPROG ) ;
rev & = 0xff ;
iounmap ( anatop ) ;
if ( rev = = 0x0 )
return IMX_CHIP_REVISION_1_0 ;
else if ( rev = = 0x1 )
return IMX_CHIP_REVISION_1_1 ;
return 0 ;
}
/*
* Returns :
* the silicon revision of the cpu
* - EINVAL - not a mx50
*/
int mx50_revision ( void )
{
if ( ! cpu_is_mx50 ( ) )
return - EINVAL ;
2011-08-26 09:35:23 +04:00
if ( mx5_cpu_rev = = - 1 )
mx5_cpu_rev = get_mx50_srev ( ) ;
2011-03-22 00:30:35 +03:00
2011-08-26 09:35:23 +04:00
return mx5_cpu_rev ;
2011-03-22 00:30:35 +03:00
}
EXPORT_SYMBOL ( mx50_revision ) ;