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
2012-02-10 03:47:49 +04:00
# include <mach/powergate.h>
2010-01-22 03:53:02 +03:00
# include "board.h"
2010-01-29 03:40:29 +03:00
# include "clock.h"
2011-09-08 16:15:22 +04:00
# include "common.h"
2010-06-24 02:49:17 +04:00
# include "fuse.h"
2012-10-05 00:24:09 +04:00
# include "iomap.h"
2012-01-26 01:43:28 +04:00
# include "pmc.h"
2012-06-20 16:36:34 +04:00
# include "apbio.h"
2012-08-16 13:31:51 +04:00
# include "sleep.h"
2010-01-29 03:40:29 +03:00
2012-01-06 14:43:22 +04: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-29 03:40:29 +03:00
2011-12-19 23:24:05 +04:00
# ifdef CONFIG_OF
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 ) ;
}
2011-12-19 23:24:05 +04:00
# endif
2011-12-14 19:03:17 +04:00
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 } ,
2012-04-13 00:13:05 +04:00
{ " pll_p_out4 " , " pll_p " , 24000000 , true } ,
2012-04-13 00:09:39 +04:00
{ " pll_c " , " clk_m " , 600000000 , true } ,
{ " pll_c_out1 " , " pll_c " , 120000000 , true } ,
{ " sclk " , " pll_c_out1 " , 120000000 , true } ,
{ " hclk " , " sclk " , 120000000 , true } ,
2012-04-21 02:58:18 +04:00
{ " pclk " , " hclk " , 60000000 , 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
2012-04-23 12:31:49 +04:00
# ifdef CONFIG_ARCH_TEGRA_3x_SOC
static __initdata struct tegra_clk_init_table tegra30_clk_init_table [ ] = {
/* name parent rate enabled */
{ " clk_m " , NULL , 0 , true } ,
{ " pll_p " , " clk_m " , 408000000 , true } ,
{ " pll_p_out1 " , " pll_p " , 9600000 , true } ,
2012-10-29 14:25:29 +04:00
{ " pll_p_out4 " , " pll_p " , 102000000 , true } ,
{ " sclk " , " pll_p_out4 " , 102000000 , true } ,
{ " hclk " , " sclk " , 102000000 , true } ,
{ " pclk " , " hclk " , 51000000 , true } ,
2012-04-23 12:31:49 +04:00
{ NULL , NULL , 0 , 0 } ,
} ;
# endif
2012-10-29 14:25:57 +04:00
static void __init tegra_init_cache ( void )
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
cache_type = readl ( p + L2X0_CACHE_TYPE ) ;
aux_ctrl = ( cache_type & 0x700 ) < < ( 17 - 8 ) ;
aux_ctrl | = 0x6C000001 ;
2012-10-29 14:25:57 +04:00
l2x0_of_init ( 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
{
2012-06-20 16:36:34 +04:00
tegra_apb_io_init ( ) ;
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 ) ;
2012-10-29 14:25:57 +04:00
tegra_init_cache ( ) ;
2012-01-26 01:43:28 +04:00
tegra_pmc_init ( ) ;
2012-02-10 03:47:49 +04:00
tegra_powergate_init ( ) ;
2012-08-16 13:31:52 +04:00
tegra20_hotplug_init ( ) ;
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 )
{
2012-06-20 16:36:34 +04:00
tegra_apb_io_init ( ) ;
2012-02-10 03:47:43 +04:00
tegra_init_fuse ( ) ;
2012-01-09 09:35:13 +04:00
tegra30_init_clocks ( ) ;
2012-04-23 12:31:49 +04:00
tegra_clk_init_from_table ( tegra30_clk_init_table ) ;
2012-10-29 14:25:57 +04:00
tegra_init_cache ( ) ;
2012-01-26 01:43:28 +04:00
tegra_pmc_init ( ) ;
2012-02-10 03:47:49 +04:00
tegra_powergate_init ( ) ;
2012-08-16 13:31:51 +04:00
tegra30_hotplug_init ( ) ;
2011-12-14 19:03:25 +04:00
}
# endif
2012-05-02 13:08:06 +04:00
void __init tegra_init_late ( void )
{
tegra_powergate_debugfs_init ( ) ;
}