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-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:41:27 +04:00
# include <mach/emac.h>
2009-04-15 23:38:58 +04:00
2009-04-15 23:39:23 +04:00
# include "clock.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 ;
2009-04-15 23:41:40 +04:00
int davinci_intc_type ;
2009-04-15 23:40:00 +04:00
2009-04-15 23:41:27 +04:00
void davinci_get_mac_addr ( struct memory_accessor * mem_acc , void * context )
{
char * mac_addr = davinci_soc_info . emac_pdata - > mac_addr ;
off_t offset = ( off_t ) context ;
/* Read MAC addr from EEPROM */
if ( mem_acc - > read ( mem_acc , mac_addr , offset , ETH_ALEN ) = = ETH_ALEN )
pr_info ( " Read MAC addr from EEPROM: %pM \n " , mac_addr ) ;
}
2009-04-15 23:39:09 +04:00
static struct davinci_id * __init davinci_get_id ( u32 jtag_id )
{
int i ;
struct davinci_id * dip ;
u8 variant = ( jtag_id & 0xf0000000 ) > > 28 ;
u16 part_no = ( jtag_id & 0x0ffff000 ) > > 12 ;
for ( i = 0 , dip = davinci_soc_info . ids ; i < davinci_soc_info . ids_num ;
i + + , dip + + )
/* Don't care about the manufacturer right now */
if ( ( dip - > part_no = = part_no ) & & ( dip - > variant = = variant ) )
return dip ;
return NULL ;
}
2009-04-15 23:38:58 +04:00
void __init davinci_common_init ( struct davinci_soc_info * soc_info )
{
int ret ;
2009-04-15 23:39:09 +04:00
struct davinci_id * dip ;
2009-04-15 23:38:58 +04:00
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 .
*/
2009-04-15 23:39:09 +04:00
davinci_soc_info . jtag_id = __raw_readl ( davinci_soc_info . jtag_id_base ) ;
dip = davinci_get_id ( davinci_soc_info . jtag_id ) ;
if ( ! dip ) {
ret = - EINVAL ;
2009-10-01 11:11:06 +04:00
pr_err ( " Unknown DaVinci JTAG ID 0x%x \n " ,
davinci_soc_info . jtag_id ) ;
2009-04-15 23:39:09 +04:00
goto err ;
}
davinci_soc_info . cpu_id = dip - > cpu_id ;
pr_info ( " DaVinci %s variant 0x%x \n " , dip - > name , dip - > variant ) ;
2009-04-15 23:38:58 +04:00
2009-04-15 23:39:23 +04:00
if ( davinci_soc_info . cpu_clks ) {
ret = davinci_clk_init ( davinci_soc_info . cpu_clks ) ;
if ( ret ! = 0 )
goto err ;
}
2009-04-15 23:40:00 +04:00
davinci_intc_base = davinci_soc_info . intc_base ;
2009-04-15 23:41:40 +04:00
davinci_intc_type = davinci_soc_info . intc_type ;
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
}