2009-04-15 23:38:58 +04:00
/*
* Code commons to all DaVinci SoCs .
*
* Author : Mark A . Greer < mgreer @ mvista . com >
*
* 2009 ( c ) MontaVista Software , Inc . This file is licensed under
* the terms of the GNU General Public License version 2. This program
* is licensed " as is " without any warranty of any kind , whether express
* or implied .
*/
# include <linux/module.h>
# include <linux/io.h>
2009-04-15 23:41:27 +04:00
# include <linux/etherdevice.h>
2009-11-19 13:28:25 +03:00
# include <linux/davinci_emac.h>
2011-08-04 17:51:45 +04:00
# include <linux/dma-mapping.h>
2009-04-15 23:38:58 +04:00
# include <asm/tlb.h>
# include <asm/mach/map.h>
# include <mach/common.h>
2009-04-15 23:39:09 +04:00
# include <mach/cputype.h>
2009-04-15 23:38:58 +04:00
struct davinci_soc_info davinci_soc_info ;
EXPORT_SYMBOL ( davinci_soc_info ) ;
2009-04-15 23:40:00 +04:00
void __iomem * davinci_intc_base ;
2010-05-08 01:06:34 +04:00
static int __init davinci_init_id ( struct davinci_soc_info * soc_info )
2009-04-15 23:39:09 +04:00
{
2010-05-08 01:06:34 +04:00
int i ;
struct davinci_id * dip ;
u8 variant ;
u16 part_no ;
void __iomem * base ;
base = ioremap ( soc_info - > jtag_id_reg , SZ_4K ) ;
if ( ! base ) {
pr_err ( " Unable to map JTAG ID register \n " ) ;
return - ENOMEM ;
}
soc_info - > jtag_id = __raw_readl ( base ) ;
iounmap ( base ) ;
2009-04-15 23:39:09 +04:00
2010-05-08 01:06:34 +04:00
variant = ( soc_info - > jtag_id & 0xf0000000 ) > > 28 ;
part_no = ( soc_info - > jtag_id & 0x0ffff000 ) > > 12 ;
for ( i = 0 , dip = soc_info - > ids ; i < soc_info - > ids_num ;
2009-04-15 23:39:09 +04:00
i + + , dip + + )
/* Don't care about the manufacturer right now */
2010-05-08 01:06:34 +04:00
if ( ( dip - > part_no = = part_no ) & & ( dip - > variant = = variant ) ) {
soc_info - > cpu_id = dip - > cpu_id ;
pr_info ( " DaVinci %s variant 0x%x \n " , dip - > name ,
dip - > variant ) ;
return 0 ;
}
pr_err ( " Unknown DaVinci JTAG ID 0x%x \n " , soc_info - > jtag_id ) ;
return - EINVAL ;
2009-04-15 23:39:09 +04:00
}
2017-10-16 13:08:23 +03:00
void __init davinci_common_init ( const struct davinci_soc_info * soc_info )
2009-04-15 23:38:58 +04:00
{
int ret ;
if ( ! soc_info ) {
ret = - EINVAL ;
goto err ;
}
memcpy ( & davinci_soc_info , soc_info , sizeof ( struct davinci_soc_info ) ) ;
if ( davinci_soc_info . io_desc & & ( davinci_soc_info . io_desc_num > 0 ) )
iotable_init ( davinci_soc_info . io_desc ,
davinci_soc_info . io_desc_num ) ;
/*
* Normally devicemaps_init ( ) would flush caches and tlb after
* mdesc - > map_io ( ) , but we must also do it here because of the CPU
* revision check below .
*/
local_flush_tlb_all ( ) ;
flush_cache_all ( ) ;
/*
* We want to check CPU revision early for cpu_is_xxxx ( ) macros .
* IO space mapping must be initialized before we can do that .
*/
2010-05-08 01:06:34 +04:00
ret = davinci_init_id ( & davinci_soc_info ) ;
if ( ret < 0 )
2009-04-15 23:39:09 +04:00
goto err ;
2009-04-15 23:38:58 +04:00
2009-04-15 23:39:23 +04:00
2009-04-15 23:38:58 +04:00
return ;
err :
2009-10-01 11:11:06 +04:00
panic ( " davinci_common_init: SoC Initialization failed \n " ) ;
2009-04-15 23:38:58 +04:00
}
2012-04-26 05:45:39 +04:00
void __init davinci_init_late ( void )
{
davinci_cpufreq_init ( ) ;
}