2010-01-21 16:53:02 -08:00
/*
* arch / arm / mach - tegra / board - harmony . c
*
* 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>
2010-01-21 16:53:02 -08:00
# include <asm/hardware/cache-l2x0.h>
# 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"
2010-01-28 16:40:29 -08:00
2010-08-23 18:37:25 -07:00
void ( * arch_reset ) ( char mode , const char * cmd ) = tegra_assert_system_reset ;
void tegra_assert_system_reset ( char mode , const char * cmd )
{
void __iomem * reset = IO_ADDRESS ( TEGRA_CLK_RESET_BASE + 0x04 ) ;
u32 reg ;
2011-02-17 08:13:57 -08:00
/* use *_related to avoid spinlock since caches are off */
reg = readl_relaxed ( reset ) ;
2010-08-23 18:37:25 -07:00
reg | = 0x04 ;
2011-02-17 08:13:57 -08:00
writel_relaxed ( reg , reset ) ;
2010-08-23 18:37:25 -07:00
}
2010-01-28 16:40:29 -08:00
static __initdata struct tegra_clk_init_table common_clk_init_table [ ] = {
/* 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 } ,
} ;
2010-01-21 16:53:02 -08:00
2011-09-08 17:31:32 -07:00
static void __init tegra_init_cache ( void )
2010-01-21 16:53:02 -08:00
{
# ifdef CONFIG_CACHE_L2X0
void __iomem * p = IO_ADDRESS ( TEGRA_ARM_PERIF_BASE ) + 0x3000 ;
2011-01-22 00:36:14 -08:00
writel_relaxed ( 0x331 , p + L2X0_TAG_LATENCY_CTRL ) ;
writel_relaxed ( 0x441 , p + L2X0_DATA_LATENCY_CTRL ) ;
2010-01-21 16:53:02 -08:00
l2x0_init ( p , 0x6C080001 , 0x8200c3fe ) ;
# endif
2010-04-05 13:16:42 -07:00
2010-01-21 16:53:02 -08:00
}
2011-02-21 17:10:14 -08:00
void __init tegra_init_early ( void )
2010-01-21 16:53:02 -08:00
{
2010-06-23 15:49:17 -07:00
tegra_init_fuse ( ) ;
2010-01-28 16:40:29 -08:00
tegra_init_clock ( ) ;
tegra_clk_init_from_table ( common_clk_init_table ) ;
2010-01-21 16:53:02 -08:00
tegra_init_cache ( ) ;
}