2011-06-20 11:47:27 -06:00
/*
* This file contains common code that is intended to be used across
* boards so that it ' s not replicated .
*
* Copyright ( C ) 2011 Xilinx
*
* This software is licensed under the terms of the GNU General Public
* License version 2 , as published by the Free Software Foundation , and
* may be copied , distributed , and modified under those terms .
*
* 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 .
*/
# include <linux/init.h>
# include <linux/kernel.h>
# include <linux/cpumask.h>
# include <linux/platform_device.h>
# include <linux/clk.h>
2012-11-08 12:04:26 -06:00
# include <linux/clk/zynq.h>
2013-03-20 10:15:28 +01:00
# include <linux/clocksource.h>
2012-11-08 12:04:26 -06:00
# include <linux/of_address.h>
2011-06-20 11:47:27 -06:00
# include <linux/of_irq.h>
# include <linux/of_platform.h>
2011-07-07 11:35:20 +00:00
# include <linux/of.h>
2011-06-20 11:47:27 -06:00
2011-07-07 11:35:20 +00:00
# include <asm/mach/arch.h>
2011-06-20 11:47:27 -06:00
# include <asm/mach/map.h>
2012-10-31 11:11:59 -06:00
# include <asm/mach/time.h>
2011-07-07 11:35:20 +00:00
# include <asm/mach-types.h>
2011-06-20 11:47:27 -06:00
# include <asm/page.h>
2012-11-19 11:38:29 -06:00
# include <asm/pgtable.h>
2013-03-20 11:11:43 +01:00
# include <asm/smp_scu.h>
2011-06-20 11:47:27 -06:00
# include <asm/hardware/cache-l2x0.h>
# include "common.h"
2013-03-20 11:11:43 +01:00
void __iomem * zynq_scu_base ;
2011-06-20 11:47:27 -06:00
static struct of_device_id zynq_of_bus_ids [ ] __initdata = {
{ . compatible = " simple-bus " , } ,
{ }
} ;
/**
2013-03-27 13:07:00 +01:00
* zynq_init_machine - System specific initialization , intended to be
* called from board specific initialization .
2011-06-20 11:47:27 -06:00
*/
2013-03-27 13:07:00 +01:00
static void __init zynq_init_machine ( void )
2011-06-20 11:47:27 -06:00
{
/*
* 64 KB way size , 8 - way associativity , parity disabled
*/
2012-10-23 17:34:22 -05:00
l2x0_of_init ( 0x02060000 , 0xF0F0FFFF ) ;
2011-06-20 11:47:27 -06:00
of_platform_bus_probe ( NULL , zynq_of_bus_ids , NULL ) ;
}
2013-03-27 13:07:00 +01:00
static void __init zynq_timer_init ( void )
2012-10-31 11:11:59 -06:00
{
2013-03-27 12:37:53 +01:00
zynq_slcr_init ( ) ;
2013-03-20 10:24:59 +01:00
clocksource_of_init ( ) ;
2012-10-31 11:11:59 -06:00
}
2013-03-20 11:11:43 +01:00
static struct map_desc zynq_cortex_a9_scu_map __initdata = {
. length = SZ_256 ,
. type = MT_DEVICE ,
} ;
static void __init zynq_scu_map_io ( void )
{
unsigned long base ;
base = scu_a9_get_base ( ) ;
zynq_cortex_a9_scu_map . pfn = __phys_to_pfn ( base ) ;
/* Expected address is in vmalloc area that's why simple assign here */
zynq_cortex_a9_scu_map . virtual = base ;
iotable_init ( & zynq_cortex_a9_scu_map , 1 ) ;
zynq_scu_base = ( void __iomem * ) base ;
BUG_ON ( ! zynq_scu_base ) ;
}
2011-06-20 11:47:27 -06:00
/**
2013-03-27 13:07:00 +01:00
* zynq_map_io - Create memory mappings needed for early I / O .
2011-06-20 11:47:27 -06:00
*/
2013-03-27 13:07:00 +01:00
static void __init zynq_map_io ( void )
2011-06-20 11:47:27 -06:00
{
2012-11-19 10:16:01 -06:00
debug_ll_io_init ( ) ;
2013-03-20 11:11:43 +01:00
zynq_scu_map_io ( ) ;
2011-06-20 11:47:27 -06:00
}
2011-07-07 11:35:20 +00:00
2013-03-20 11:42:15 +01:00
static void zynq_system_reset ( char mode , const char * cmd )
{
zynq_slcr_system_reset ( ) ;
}
2013-03-27 13:07:00 +01:00
static const char * const zynq_dt_match [ ] = {
2012-10-31 12:24:48 -06:00
" xlnx,zynq-7000 " ,
2011-07-07 11:35:20 +00:00
NULL
} ;
2013-06-13 14:13:37 +02:00
DT_MACHINE_START ( XILINX_EP107 , " Xilinx Zynq Platform " )
2013-03-20 13:50:12 +01:00
. smp = smp_ops ( zynq_smp_ops ) ,
2013-03-27 13:07:00 +01:00
. map_io = zynq_map_io ,
. init_machine = zynq_init_machine ,
. init_time = zynq_timer_init ,
. dt_compat = zynq_dt_match ,
2013-03-20 11:42:15 +01:00
. restart = zynq_system_reset ,
2011-07-07 11:35:20 +00:00
MACHINE_END