2010-01-21 16:53:02 -08:00
/*
2011-12-14 17:03:17 +02:00
* arch / arm / mach - tegra / common . c
2010-01-21 16:53:02 -08: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-05 13:16:42 -07:00
# include <linux/clk.h>
# include <linux/delay.h>
2011-12-14 17:03:17 +02:00
# include <linux/of_irq.h>
2010-01-21 16:53:02 -08:00
# include <asm/hardware/cache-l2x0.h>
2011-12-14 17:03:17 +02:00
# include <asm/hardware/gic.h>
2010-01-21 16:53:02 -08:00
# include <mach/iomap.h>
2010-08-23 18:37:25 -07:00
# include <mach/system.h>
2010-01-21 16:53:02 -08:00
# include "board.h"
2010-01-28 16:40:29 -08:00
# include "clock.h"
2010-06-23 15:49:17 -07:00
# include "fuse.h"
2012-01-25 14:43:28 -07:00
# include "pmc.h"
2010-01-28 16:40:29 -08:00
2012-01-06 10:43:22 +00:00
/*
* Storage for debug - macro . S ' s state .
*
* This must be in . data not . bss so that it gets initialized each time the
* kernel is loaded . The data is declared here rather than debug - macro . S so
* that multiple inclusions of debug - macro . S point at the same data .
*/
# define TEGRA_DEBUG_UART_OFFSET (TEGRA_DEBUG_UART_BASE & 0xFFFF)
u32 tegra_uart_config [ 3 ] = {
/* Debug UART initialization required */
1 ,
/* Debug UART physical address */
( u32 ) ( IO_APB_PHYS + TEGRA_DEBUG_UART_OFFSET ) ,
/* Debug UART virtual address */
( u32 ) ( IO_APB_VIRT + TEGRA_DEBUG_UART_OFFSET ) ,
} ;
2010-01-28 16:40:29 -08:00
2011-12-19 12:24:05 -07:00
# ifdef CONFIG_OF
2011-12-14 17:03:17 +02: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 ) ;
}
2011-12-19 12:24:05 -07:00
# endif
2011-12-14 17:03:17 +02:00
2010-08-23 18:37:25 -07:00
void tegra_assert_system_reset ( char mode , const char * cmd )
{
2011-12-14 17:03:19 +02:00
void __iomem * reset = IO_ADDRESS ( TEGRA_PMC_BASE + 0 ) ;
2010-08-23 18:37:25 -07:00
u32 reg ;
2011-02-17 08:13:57 -08:00
reg = readl_relaxed ( reset ) ;
2011-12-14 17:03:19 +02:00
reg | = 0x10 ;
2011-02-17 08:13:57 -08:00
writel_relaxed ( reg , reset ) ;
2010-08-23 18:37:25 -07:00
}
2011-12-14 17:03:17 +02:00
# ifdef CONFIG_ARCH_TEGRA_2x_SOC
static __initdata struct tegra_clk_init_table tegra20_clk_init_table [ ] = {
2010-01-28 16:40:29 -08: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-24 18:57:00 -07:00
{ " sclk " , " pll_p_out4 " , 108000000 , true } ,
{ " hclk " , " sclk " , 108000000 , true } ,
2010-01-28 16:40:29 -08:00
{ " pclk " , " hclk " , 54000000 , true } ,
2011-02-21 17:05:36 -08:00
{ " csite " , NULL , 0 , true } ,
{ " emc " , NULL , 0 , true } ,
{ " cpu " , NULL , 0 , true } ,
2010-01-28 16:40:29 -08:00
{ NULL , NULL , 0 , 0 } ,
} ;
2011-12-14 17:03:17 +02:00
# endif
2010-01-21 16:53:02 -08:00
2011-12-14 17:03:20 +02:00
static void __init tegra_init_cache ( u32 tag_latency , u32 data_latency )
2010-01-21 16:53:02 -08:00
{
# ifdef CONFIG_CACHE_L2X0
void __iomem * p = IO_ADDRESS ( TEGRA_ARM_PERIF_BASE ) + 0x3000 ;
2011-12-14 17:03:20 +02:00
u32 aux_ctrl , cache_type ;
2010-01-21 16:53:02 -08:00
2011-12-14 17:03:20 +02:00
writel_relaxed ( tag_latency , p + L2X0_TAG_LATENCY_CTRL ) ;
writel_relaxed ( data_latency , p + L2X0_DATA_LATENCY_CTRL ) ;
2010-01-21 16:53:02 -08:00
2011-12-14 17:03:20 +02: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-21 16:53:02 -08:00
# endif
2010-04-05 13:16:42 -07:00
2010-01-21 16:53:02 -08:00
}
2011-12-14 17:03:17 +02:00
# ifdef CONFIG_ARCH_TEGRA_2x_SOC
void __init tegra20_init_early ( void )
2010-01-21 16:53:02 -08:00
{
2010-06-23 15:49:17 -07:00
tegra_init_fuse ( ) ;
2011-12-14 17:03:17 +02:00
tegra2_init_clocks ( ) ;
tegra_clk_init_from_table ( tegra20_clk_init_table ) ;
2011-12-14 17:03:20 +02:00
tegra_init_cache ( 0x331 , 0x441 ) ;
2012-01-25 14:43:28 -07:00
tegra_pmc_init ( ) ;
2010-01-21 16:53:02 -08:00
}
2011-12-14 17:03:17 +02:00
# endif
2011-12-14 17:03:25 +02:00
# ifdef CONFIG_ARCH_TEGRA_3x_SOC
void __init tegra30_init_early ( void )
{
2012-01-09 05:35:13 +00:00
tegra30_init_clocks ( ) ;
2011-12-14 17:03:25 +02:00
tegra_init_cache ( 0x441 , 0x551 ) ;
2012-01-25 14:43:28 -07:00
tegra_pmc_init ( ) ;
2011-12-14 17:03:25 +02:00
}
# endif