2011-07-19 17:26:54 -06:00
/*
2013-02-13 19:15:50 +02:00
* NVIDIA Tegra SoC device tree board support
2011-07-19 17:26:54 -06:00
*
2013-02-13 19:15:50 +02:00
* Copyright ( C ) 2011 , 2013 , NVIDIA Corporation
2011-07-19 17:26:54 -06: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 09:44:49 +02:00
# include <linux/clk/tegra.h>
2011-07-19 17:26:54 -06:00
# include <linux/dma-mapping.h>
2014-07-11 09:44:49 +02:00
# include <linux/init.h>
# include <linux/io.h>
# include <linux/irqchip.h>
2011-07-19 17:26:54 -06:00
# include <linux/irqdomain.h>
2014-07-11 09:44:49 +02:00
# include <linux/kernel.h>
2011-07-19 17:26:54 -06:00
# include <linux/of_address.h>
# include <linux/of_fdt.h>
2014-07-11 09:44:49 +02:00
# include <linux/of.h>
2011-07-19 17:26:54 -06:00
# include <linux/of_platform.h>
# include <linux/pda_power.h>
2014-07-11 09:44:49 +02:00
# include <linux/platform_device.h>
# include <linux/serial_8250.h>
2013-03-14 08:48:40 +08:00
# include <linux/slab.h>
# include <linux/sys_soc.h>
2012-08-27 14:22:48 -07:00
# include <linux/usb/tegra_usb_phy.h>
2011-07-19 17:26:54 -06:00
2014-07-11 09:52:41 +02:00
# include <soc/tegra/fuse.h>
2014-07-11 13:19:06 +02:00
# include <soc/tegra/pmc.h>
2014-07-11 09:52:41 +02:00
2013-08-20 15:47:38 -06:00
# include <asm/hardware/cache-l2x0.h>
2011-07-19 17:26:54 -06:00
# include <asm/mach/arch.h>
# include <asm/mach/time.h>
2014-07-11 09:44:49 +02:00
# include <asm/mach-types.h>
2011-07-19 17:26:54 -06:00
# include <asm/setup.h>
2013-11-24 15:30:49 +09:00
# include <asm/trusted_foundations.h>
2011-07-19 17:26:54 -06:00
# include "board.h"
2011-09-08 13:15:22 +01:00
# include "common.h"
2013-08-20 15:47:38 -06:00
# include "cpuidle.h"
2012-10-04 14:24:09 -06:00
# include "iomap.h"
2013-08-20 15:47:38 -06: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-05 14:10:53 -07:00
u32 tegra_uart_config [ 3 ] = {
2013-08-20 15:47:38 -06: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 15:30:49 +09:00
of_register_trusted_foundations ( ) ;
2013-11-12 13:03:16 -07:00
tegra_cpu_reset_handler_init ( ) ;
2013-08-20 15:47:38 -06:00
}
static void __init tegra_dt_init_irq ( void )
{
tegra_init_irq ( ) ;
irqchip_init ( ) ;
}
2012-08-27 14:22:48 -07:00
2011-07-19 17:26:54 -06:00
static void __init tegra_dt_init ( void )
{
2013-03-14 08:48:40 +08: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 18:36:37 +03:00
soc_dev_attr - > revision = kasprintf ( GFP_KERNEL , " %d " ,
tegra_sku_info . revision ) ;
2014-07-11 09:52:41 +02:00
soc_dev_attr - > soc_id = kasprintf ( GFP_KERNEL , " %u " , tegra_get_chip_id ( ) ) ;
2013-03-14 08:48:40 +08: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-16 15:12:32 -07:00
/*
* Finished with the static registrations now ; fill in the missing
* devices
*/
2013-03-14 08:48:40 +08:00
out :
2016-06-01 14:53:05 +08:00
of_platform_default_populate ( NULL , NULL , parent ) ;
2011-07-19 17:26:54 -06:00
}
2012-05-02 13:43:26 -06:00
static void __init tegra_dt_init_late ( void )
{
2013-08-20 15:47:38 -06:00
tegra_init_suspend ( ) ;
tegra_cpuidle_init ( ) ;
2012-05-02 13:43:26 -06:00
2016-06-22 14:39:41 +02:00
if ( IS_ENABLED ( CONFIG_ARCH_TEGRA_2x_SOC ) & &
of_machine_is_compatible ( " compal,paz00 " ) )
tegra_paz00_wifikill_init ( ) ;
2012-05-02 13:43:26 -06:00
}
2013-02-13 19:15:50 +02:00
static const char * const tegra_dt_board_compat [ ] = {
2013-10-08 12:50:03 +08:00
" nvidia,tegra124 " ,
2013-02-13 19:15:50 +02:00
" nvidia,tegra114 " ,
" nvidia,tegra30 " ,
2012-02-27 18:26:16 -07:00
" nvidia,tegra20 " ,
2011-07-19 17:26:54 -06:00
NULL
} ;
2013-02-13 19:15:50 +02:00
DT_MACHINE_START ( TEGRA_DT , " NVIDIA Tegra SoC (Flattened Device Tree) " )
2014-04-28 15:36:04 +01:00
. l2c_aux_val = 0x3c400001 ,
. l2c_aux_mask = 0xc20fc3fe ,
2011-09-08 13:15:22 +01:00
. smp = smp_ops ( tegra_smp_ops ) ,
2014-04-28 15:36:04 +01:00
. map_io = tegra_map_common_io ,
2013-02-13 19:15:48 +02:00
. init_early = tegra_init_early ,
2011-11-29 18:29:19 -07:00
. init_irq = tegra_dt_init_irq ,
2011-07-19 17:26:54 -06:00
. init_machine = tegra_dt_init ,
2012-05-02 13:43:26 -06:00
. init_late = tegra_dt_init_late ,
2013-02-13 19:15:50 +02:00
. dt_compat = tegra_dt_board_compat ,
2011-07-19 17:26:54 -06:00
MACHINE_END