2011-07-19 17:26:54 -06:00
/*
* nVidia Tegra device tree board support
*
* 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/kernel.h>
# include <linux/init.h>
# include <linux/platform_device.h>
# include <linux/serial_8250.h>
# include <linux/clk.h>
# include <linux/dma-mapping.h>
# include <linux/irqdomain.h>
# include <linux/of.h>
# include <linux/of_address.h>
# include <linux/of_fdt.h>
# include <linux/of_irq.h>
# include <linux/of_platform.h>
# include <linux/pda_power.h>
# include <linux/io.h>
# include <linux/i2c.h>
# include <linux/i2c-tegra.h>
2011-09-06 10:23:45 +01:00
# include <asm/hardware/gic.h>
2011-07-19 17:26:54 -06:00
# include <asm/mach-types.h>
# include <asm/mach/arch.h>
# include <asm/mach/time.h>
# include <asm/setup.h>
# include <mach/iomap.h>
# include <mach/irqs.h>
# include "board.h"
# include "board-harmony.h"
# include "clock.h"
# include "devices.h"
struct of_dev_auxdata tegra20_auxdata_lookup [ ] __initdata = {
OF_DEV_AUXDATA ( " nvidia,tegra20-sdhci " , TEGRA_SDMMC1_BASE , " sdhci-tegra.0 " , NULL ) ,
OF_DEV_AUXDATA ( " nvidia,tegra20-sdhci " , TEGRA_SDMMC2_BASE , " sdhci-tegra.1 " , NULL ) ,
OF_DEV_AUXDATA ( " nvidia,tegra20-sdhci " , TEGRA_SDMMC3_BASE , " sdhci-tegra.2 " , NULL ) ,
OF_DEV_AUXDATA ( " nvidia,tegra20-sdhci " , TEGRA_SDMMC4_BASE , " sdhci-tegra.3 " , NULL ) ,
OF_DEV_AUXDATA ( " nvidia,tegra20-i2c " , TEGRA_I2C_BASE , " tegra-i2c.0 " , NULL ) ,
OF_DEV_AUXDATA ( " nvidia,tegra20-i2c " , TEGRA_I2C2_BASE , " tegra-i2c.1 " , NULL ) ,
OF_DEV_AUXDATA ( " nvidia,tegra20-i2c " , TEGRA_I2C3_BASE , " tegra-i2c.2 " , NULL ) ,
2011-12-17 23:29:31 -07:00
OF_DEV_AUXDATA ( " nvidia,tegra20-i2c-dvc " , TEGRA_DVC_BASE , " tegra-i2c.3 " , NULL ) ,
2012-04-06 10:30:52 -06:00
OF_DEV_AUXDATA ( " nvidia,tegra20-i2s " , TEGRA_I2S1_BASE , " tegra20-i2s.0 " , NULL ) ,
OF_DEV_AUXDATA ( " nvidia,tegra20-i2s " , TEGRA_I2S2_BASE , " tegra20-i2s.1 " , NULL ) ,
OF_DEV_AUXDATA ( " nvidia,tegra20-das " , TEGRA_APB_MISC_DAS_BASE , " tegra20-das " , NULL ) ,
2011-11-04 09:12:40 +00:00
OF_DEV_AUXDATA ( " nvidia,tegra20-ehci " , TEGRA_USB_BASE , " tegra-ehci.0 " ,
2012-03-19 13:57:13 -06:00
& tegra_ehci1_pdata ) ,
2011-11-04 09:12:40 +00:00
OF_DEV_AUXDATA ( " nvidia,tegra20-ehci " , TEGRA_USB2_BASE , " tegra-ehci.1 " ,
2012-03-19 13:57:13 -06:00
& tegra_ehci2_pdata ) ,
2011-11-04 09:12:40 +00:00
OF_DEV_AUXDATA ( " nvidia,tegra20-ehci " , TEGRA_USB3_BASE , " tegra-ehci.2 " ,
2012-03-19 13:57:13 -06:00
& tegra_ehci3_pdata ) ,
2012-06-26 12:48:31 +05:30
OF_DEV_AUXDATA ( " nvidia,tegra20-apbdma " , 0x6000a000 , " tegra-apbdma " , NULL ) ,
2011-07-19 17:26:54 -06:00
{ }
} ;
static __initdata struct tegra_clk_init_table tegra_dt_clk_init_table [ ] = {
/* name parent rate enabled */
{ " uartd " , " pll_p " , 216000000 , true } ,
2011-11-04 09:12:40 +00:00
{ " usbd " , " clk_m " , 12000000 , false } ,
{ " usb2 " , " clk_m " , 12000000 , false } ,
{ " usb3 " , " clk_m " , 12000000 , false } ,
2011-12-07 15:13:42 -07:00
{ " pll_a " , " pll_p_out1 " , 56448000 , true } ,
{ " pll_a_out0 " , " pll_a " , 11289600 , true } ,
{ " cdev1 " , NULL , 0 , true } ,
{ " i2s1 " , " pll_a_out0 " , 11289600 , false } ,
{ " i2s2 " , " pll_a_out0 " , 11289600 , false } ,
2011-07-19 17:26:54 -06:00
{ NULL , NULL , 0 , 0 } ,
} ;
static struct of_device_id tegra_dt_match_table [ ] __initdata = {
{ . compatible = " simple-bus " , } ,
{ }
} ;
static void __init tegra_dt_init ( void )
{
tegra_clk_init_from_table ( tegra_dt_clk_init_table ) ;
2011-12-16 15:12:32 -07:00
/*
* Finished with the static registrations now ; fill in the missing
* devices
*/
of_platform_populate ( NULL , tegra_dt_match_table ,
tegra20_auxdata_lookup , NULL ) ;
2011-07-19 17:26:54 -06:00
}
2012-05-02 13:43:26 -06:00
# ifdef CONFIG_MACH_TRIMSLICE
static void __init trimslice_init ( void )
{
int ret ;
ret = tegra_pcie_init ( true , true ) ;
if ( ret )
pr_err ( " tegra_pci_init() failed: %d \n " , ret ) ;
}
# endif
2012-05-02 15:47:12 -06:00
# ifdef CONFIG_MACH_HARMONY
static void __init harmony_init ( void )
{
int ret ;
ret = harmony_regulator_init ( ) ;
if ( ret ) {
pr_err ( " harmony_regulator_init() failed: %d \n " , ret ) ;
return ;
}
ret = harmony_pcie_init ( ) ;
if ( ret )
pr_err ( " harmony_pcie_init() failed: %d \n " , ret ) ;
}
# endif
2012-05-02 16:05:44 -06:00
# ifdef CONFIG_MACH_PAZ00
static void __init paz00_init ( void )
{
tegra_paz00_wifikill_init ( ) ;
}
# endif
2012-05-02 13:43:26 -06:00
static struct {
char * machine ;
void ( * init ) ( void ) ;
} board_init_funcs [ ] = {
# ifdef CONFIG_MACH_TRIMSLICE
{ " compulab,trimslice " , trimslice_init } ,
# endif
2012-05-02 15:47:12 -06:00
# ifdef CONFIG_MACH_HARMONY
{ " nvidia,harmony " , harmony_init } ,
# endif
2012-05-02 16:05:44 -06:00
# ifdef CONFIG_MACH_PAZ00
{ " compal,paz00 " , paz00_init } ,
# endif
2012-05-02 13:43:26 -06:00
} ;
static void __init tegra_dt_init_late ( void )
{
int i ;
tegra_init_late ( ) ;
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 ;
}
}
}
2011-12-14 17:03:17 +02:00
static const char * tegra20_dt_board_compat [ ] = {
2012-02-27 18:26:16 -07:00
" nvidia,tegra20 " ,
2011-07-19 17:26:54 -06:00
NULL
} ;
2011-12-14 17:03:17 +02:00
DT_MACHINE_START ( TEGRA_DT , " nVidia Tegra20 (Flattened Device Tree) " )
2011-07-19 17:26:54 -06:00
. map_io = tegra_map_common_io ,
2011-12-14 17:03:17 +02:00
. init_early = tegra20_init_early ,
2011-11-29 18:29:19 -07:00
. init_irq = tegra_dt_init_irq ,
2011-09-06 10:23:45 +01:00
. handle_irq = gic_handle_irq ,
2011-07-19 17:26:54 -06:00
. timer = & tegra_timer ,
. init_machine = tegra_dt_init ,
2012-05-02 13:43:26 -06:00
. init_late = tegra_dt_init_late ,
2011-11-05 08:48:33 +00:00
. restart = tegra_assert_system_reset ,
2011-12-14 17:03:17 +02:00
. dt_compat = tegra20_dt_board_compat ,
2011-07-19 17:26:54 -06:00
MACHINE_END