2010-01-22 03:53:02 +03:00
/*
2011-12-14 19:03:17 +04:00
* arch / arm / mach - tegra / common . c
2010-01-22 03:53:02 +03:00
*
* Copyright ( C ) 2010 Google , Inc .
*
* Author :
* Colin Cross < ccross @ android . com >
*
* 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/io.h>
2010-04-06 00:16:42 +04:00
# include <linux/clk.h>
# include <linux/delay.h>
2011-12-14 19:03:17 +04:00
# include <linux/of_irq.h>
2010-01-22 03:53:02 +03:00
# include <asm/hardware/cache-l2x0.h>
2011-12-14 19:03:17 +04:00
# include <asm/hardware/gic.h>
2010-01-22 03:53:02 +03:00
# include <mach/iomap.h>
2010-08-24 05:37:25 +04:00
# include <mach/system.h>
2010-01-22 03:53:02 +03:00
# include "board.h"
2010-01-29 03:40:29 +03:00
# include "clock.h"
2010-06-24 02:49:17 +04:00
# include "fuse.h"
2010-01-29 03:40:29 +03:00
2010-08-24 05:37:25 +04:00
void ( * arch_reset ) ( char mode , const char * cmd ) = tegra_assert_system_reset ;
2011-12-14 19:03:17 +04:00
static const struct of_device_id tegra_dt_irq_match [ ] __initconst = {
{ . compatible = " arm,cortex-a9-gic " , . data = gic_of_init } ,
{ }
} ;
void __init tegra_dt_init_irq ( void )
{
tegra_init_irq ( ) ;
of_irq_init ( tegra_dt_irq_match ) ;
}
2010-08-24 05:37:25 +04:00
void tegra_assert_system_reset ( char mode , const char * cmd )
{
2011-12-14 19:03:19 +04:00
void __iomem * reset = IO_ADDRESS ( TEGRA_PMC_BASE + 0 ) ;
2010-08-24 05:37:25 +04:00
u32 reg ;
2011-02-17 19:13:57 +03:00
reg = readl_relaxed ( reset ) ;
2011-12-14 19:03:19 +04:00
reg | = 0x10 ;
2011-02-17 19:13:57 +03:00
writel_relaxed ( reg , reset ) ;
2010-08-24 05:37:25 +04:00
}
2011-12-14 19:03:17 +04:00
# ifdef CONFIG_ARCH_TEGRA_2x_SOC
static __initdata struct tegra_clk_init_table tegra20_clk_init_table [ ] = {
2010-01-29 03:40:29 +03:00
/* name parent rate enabled */
{ " clk_m " , NULL , 0 , true } ,
{ " pll_p " , " clk_m " , 216000000 , true } ,
{ " pll_p_out1 " , " pll_p " , 28800000 , true } ,
{ " pll_p_out2 " , " pll_p " , 48000000 , true } ,
{ " pll_p_out3 " , " pll_p " , 72000000 , true } ,
{ " pll_p_out4 " , " pll_p " , 108000000 , true } ,
2010-06-25 05:57:00 +04:00
{ " sclk " , " pll_p_out4 " , 108000000 , true } ,
{ " hclk " , " sclk " , 108000000 , true } ,
2010-01-29 03:40:29 +03:00
{ " pclk " , " hclk " , 54000000 , true } ,
2011-02-22 04:05:36 +03:00
{ " csite " , NULL , 0 , true } ,
{ " emc " , NULL , 0 , true } ,
{ " cpu " , NULL , 0 , true } ,
2010-01-29 03:40:29 +03:00
{ NULL , NULL , 0 , 0 } ,
} ;
2011-12-14 19:03:17 +04:00
# endif
2010-01-22 03:53:02 +03:00
2011-12-14 19:03:20 +04:00
static void __init tegra_init_cache ( u32 tag_latency , u32 data_latency )
2010-01-22 03:53:02 +03:00
{
# ifdef CONFIG_CACHE_L2X0
void __iomem * p = IO_ADDRESS ( TEGRA_ARM_PERIF_BASE ) + 0x3000 ;
2011-12-14 19:03:20 +04:00
u32 aux_ctrl , cache_type ;
2010-01-22 03:53:02 +03:00
2011-12-14 19:03:20 +04:00
writel_relaxed ( tag_latency , p + L2X0_TAG_LATENCY_CTRL ) ;
writel_relaxed ( data_latency , p + L2X0_DATA_LATENCY_CTRL ) ;
2010-01-22 03:53:02 +03:00
2011-12-14 19:03:20 +04:00
cache_type = readl ( p + L2X0_CACHE_TYPE ) ;
aux_ctrl = ( cache_type & 0x700 ) < < ( 17 - 8 ) ;
aux_ctrl | = 0x6C000001 ;
l2x0_init ( p , aux_ctrl , 0x8200c3fe ) ;
2010-01-22 03:53:02 +03:00
# endif
2010-04-06 00:16:42 +04:00
2010-01-22 03:53:02 +03:00
}
2011-12-14 19:03:17 +04:00
# ifdef CONFIG_ARCH_TEGRA_2x_SOC
void __init tegra20_init_early ( void )
2010-01-22 03:53:02 +03:00
{
2010-06-24 02:49:17 +04:00
tegra_init_fuse ( ) ;
2011-12-14 19:03:17 +04:00
tegra2_init_clocks ( ) ;
tegra_clk_init_from_table ( tegra20_clk_init_table ) ;
2011-12-14 19:03:20 +04:00
tegra_init_cache ( 0x331 , 0x441 ) ;
2010-01-22 03:53:02 +03:00
}
2011-12-14 19:03:17 +04:00
# endif
2011-12-14 19:03:25 +04:00
# ifdef CONFIG_ARCH_TEGRA_3x_SOC
void __init tegra30_init_early ( void )
{
tegra_init_cache ( 0x441 , 0x551 ) ;
}
# endif