2011-07-20 03:26:54 +04:00
/*
2013-02-13 21:15:50 +04:00
* NVIDIA Tegra SoC device tree board support
2011-07-20 03:26:54 +04:00
*
2013-02-13 21:15:50 +04:00
* Copyright ( C ) 2011 , 2013 , NVIDIA Corporation
2011-07-20 03:26:54 +04:00
* Copyright ( C ) 2010 Secret Lab Technologies , Ltd .
* Copyright ( C ) 2010 Google , Inc .
*
* 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/clk.h>
2014-07-11 11:44:49 +04:00
# include <linux/clk/tegra.h>
2011-07-20 03:26:54 +04:00
# include <linux/dma-mapping.h>
2014-07-11 11:44:49 +04:00
# include <linux/init.h>
# include <linux/io.h>
# include <linux/irqchip.h>
2011-07-20 03:26:54 +04:00
# include <linux/irqdomain.h>
2014-07-11 11:44:49 +04:00
# include <linux/kernel.h>
2011-07-20 03:26:54 +04:00
# include <linux/of_address.h>
# include <linux/of_fdt.h>
2014-07-11 11:44:49 +04:00
# include <linux/of.h>
2011-07-20 03:26:54 +04:00
# include <linux/of_platform.h>
# include <linux/pda_power.h>
2014-07-11 11:44:49 +04:00
# include <linux/platform_device.h>
# include <linux/serial_8250.h>
2013-03-14 04:48:40 +04:00
# include <linux/slab.h>
# include <linux/sys_soc.h>
2012-08-28 01:22:48 +04:00
# include <linux/usb/tegra_usb_phy.h>
2011-07-20 03:26:54 +04:00
2014-07-11 11:52:41 +04:00
# include <soc/tegra/fuse.h>
2014-07-11 15:19:06 +04:00
# include <soc/tegra/pmc.h>
2014-07-11 11:52:41 +04:00
2013-08-21 01:47:38 +04:00
# include <asm/hardware/cache-l2x0.h>
2011-07-20 03:26:54 +04:00
# include <asm/mach/arch.h>
# include <asm/mach/time.h>
2014-07-11 11:44:49 +04:00
# include <asm/mach-types.h>
2011-07-20 03:26:54 +04:00
# include <asm/setup.h>
2013-11-24 10:30:49 +04:00
# include <asm/trusted_foundations.h>
2011-07-20 03:26:54 +04:00
# include "board.h"
2011-09-08 16:15:22 +04:00
# include "common.h"
2013-08-21 01:47:38 +04:00
# include "cpuidle.h"
2014-08-26 10:14:04 +04:00
# include "flowctrl.h"
2012-10-05 00:24:09 +04:00
# include "iomap.h"
2013-08-21 01:47:38 +04:00
# include "irq.h"
# include "pm.h"
# include "reset.h"
# include "sleep.h"
/*
* 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 .
*/
2013-11-06 01:10:53 +04:00
u32 tegra_uart_config [ 3 ] = {
2013-08-21 01:47:38 +04:00
/* Debug UART initialization required */
1 ,
/* Debug UART physical address */
0 ,
/* Debug UART virtual address */
0 ,
} ;
static void __init tegra_init_early ( void )
{
2013-11-24 10:30:49 +04:00
of_register_trusted_foundations ( ) ;
2013-11-13 00:03:16 +04:00
tegra_cpu_reset_handler_init ( ) ;
2014-08-26 10:14:04 +04:00
tegra_flowctrl_init ( ) ;
2013-08-21 01:47:38 +04:00
}
static void __init tegra_dt_init_irq ( void )
{
tegra_init_irq ( ) ;
irqchip_init ( ) ;
}
2012-08-28 01:22:48 +04:00
2011-07-20 03:26:54 +04:00
static void __init tegra_dt_init ( void )
{
2013-03-14 04:48:40 +04:00
struct soc_device_attribute * soc_dev_attr ;
struct soc_device * soc_dev ;
struct device * parent = NULL ;
soc_dev_attr = kzalloc ( sizeof ( * soc_dev_attr ) , GFP_KERNEL ) ;
if ( ! soc_dev_attr )
goto out ;
soc_dev_attr - > family = kasprintf ( GFP_KERNEL , " Tegra " ) ;
2014-06-12 19:36:37 +04:00
soc_dev_attr - > revision = kasprintf ( GFP_KERNEL , " %d " ,
tegra_sku_info . revision ) ;
2014-07-11 11:52:41 +04:00
soc_dev_attr - > soc_id = kasprintf ( GFP_KERNEL , " %u " , tegra_get_chip_id ( ) ) ;
2013-03-14 04:48:40 +04:00
soc_dev = soc_device_register ( soc_dev_attr ) ;
if ( IS_ERR ( soc_dev ) ) {
kfree ( soc_dev_attr - > family ) ;
kfree ( soc_dev_attr - > revision ) ;
kfree ( soc_dev_attr - > soc_id ) ;
kfree ( soc_dev_attr ) ;
goto out ;
}
parent = soc_device_to_device ( soc_dev ) ;
2011-12-17 02:12:32 +04:00
/*
* Finished with the static registrations now ; fill in the missing
* devices
*/
2013-03-14 04:48:40 +04:00
out :
2013-07-25 22:38:04 +04:00
of_platform_populate ( NULL , of_default_bus_match_table , NULL , parent ) ;
2011-07-20 03:26:54 +04:00
}
2012-05-03 02:05:44 +04:00
static void __init paz00_init ( void )
{
2013-02-13 21:15:50 +04:00
if ( IS_ENABLED ( CONFIG_ARCH_TEGRA_2x_SOC ) )
tegra_paz00_wifikill_init ( ) ;
2012-05-03 02:05:44 +04:00
}
2012-05-02 23:43:26 +04:00
static struct {
char * machine ;
void ( * init ) ( void ) ;
} board_init_funcs [ ] = {
2012-05-03 02:05:44 +04:00
{ " compal,paz00 " , paz00_init } ,
2012-05-02 23:43:26 +04:00
} ;
static void __init tegra_dt_init_late ( void )
{
int i ;
2013-08-21 01:47:38 +04:00
tegra_init_suspend ( ) ;
tegra_cpuidle_init ( ) ;
2012-05-02 23:43:26 +04:00
for ( i = 0 ; i < ARRAY_SIZE ( board_init_funcs ) ; i + + ) {
if ( of_machine_is_compatible ( board_init_funcs [ i ] . machine ) ) {
board_init_funcs [ i ] . init ( ) ;
break ;
}
}
}
2013-02-13 21:15:50 +04:00
static const char * const tegra_dt_board_compat [ ] = {
2013-10-08 08:50:03 +04:00
" nvidia,tegra124 " ,
2013-02-13 21:15:50 +04:00
" nvidia,tegra114 " ,
" nvidia,tegra30 " ,
2012-02-28 05:26:16 +04:00
" nvidia,tegra20 " ,
2011-07-20 03:26:54 +04:00
NULL
} ;
2013-02-13 21:15:50 +04:00
DT_MACHINE_START ( TEGRA_DT , " NVIDIA Tegra SoC (Flattened Device Tree) " )
2014-04-28 18:36:04 +04:00
. l2c_aux_val = 0x3c400001 ,
. l2c_aux_mask = 0xc20fc3fe ,
2011-09-08 16:15:22 +04:00
. smp = smp_ops ( tegra_smp_ops ) ,
2014-04-28 18:36:04 +04:00
. map_io = tegra_map_common_io ,
2013-02-13 21:15:48 +04:00
. init_early = tegra_init_early ,
2011-11-30 05:29:19 +04:00
. init_irq = tegra_dt_init_irq ,
2011-07-20 03:26:54 +04:00
. init_machine = tegra_dt_init ,
2012-05-02 23:43:26 +04:00
. init_late = tegra_dt_init_late ,
2013-02-13 21:15:50 +04:00
. dt_compat = tegra_dt_board_compat ,
2011-07-20 03:26:54 +04:00
MACHINE_END