18e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely/* 28e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely * nVidia Tegra device tree board support 38e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely * 48e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely * Copyright (C) 2010 Secret Lab Technologies, Ltd. 58e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely * Copyright (C) 2010 Google, Inc. 68e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely * 78e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely * This software is licensed under the terms of the GNU General Public 88e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely * License version 2, as published by the Free Software Foundation, and 98e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely * may be copied, distributed, and modified under those terms. 108e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely * 118e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely * This program is distributed in the hope that it will be useful, 128e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely * but WITHOUT ANY WARRANTY; without even the implied warranty of 138e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 148e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely * GNU General Public License for more details. 158e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely * 168e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely */ 178e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely 188e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely#include <linux/kernel.h> 198e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely#include <linux/init.h> 208e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely#include <linux/platform_device.h> 218e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely#include <linux/serial_8250.h> 228e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely#include <linux/clk.h> 238e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely#include <linux/dma-mapping.h> 248e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely#include <linux/irqdomain.h> 258e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely#include <linux/of.h> 268e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely#include <linux/of_address.h> 278e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely#include <linux/of_fdt.h> 288e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely#include <linux/of_irq.h> 298e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely#include <linux/of_platform.h> 308e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely#include <linux/pda_power.h> 318e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely#include <linux/io.h> 328e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely#include <linux/i2c.h> 338e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely#include <linux/i2c-tegra.h> 348e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely 35afed2a261825e83cf9564dec60961e8aba6dc701Marc Zyngier#include <asm/hardware/gic.h> 368e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely#include <asm/mach-types.h> 378e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely#include <asm/mach/arch.h> 388e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely#include <asm/mach/time.h> 398e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely#include <asm/setup.h> 400d4f74792e2946cb2ef40a1673851eda1041358cpdeschrijver@nvidia.com#include <asm/hardware/gic.h> 418e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely 428e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely#include <mach/iomap.h> 438e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely#include <mach/irqs.h> 448e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely 458e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely#include "board.h" 468e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely#include "board-harmony.h" 478e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely#include "clock.h" 488e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely#include "devices.h" 498e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely 508e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likelyvoid harmony_pinmux_init(void); 51cc2afa43d43cd07d5a34516262d7489e183311a1Marc Dietrichvoid paz00_pinmux_init(void); 528e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likelyvoid seaboard_pinmux_init(void); 53a7db2c15938668999d4ceb1caec3723d88e38c80Stephen Warrenvoid trimslice_pinmux_init(void); 54add29e61d4651fc2f87dab443f47faa70ee96f8fPeter De Schrijvervoid ventana_pinmux_init(void); 558e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely 568e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likelystruct of_dev_auxdata tegra20_auxdata_lookup[] __initdata = { 571a4a30c8494c44972b05106d1eb16a7530dd74d4Stephen Warren OF_DEV_AUXDATA("nvidia,tegra20-pinmux", TEGRA_APB_MISC_BASE + 0x14, "tegra-pinmux", NULL), 581a4a30c8494c44972b05106d1eb16a7530dd74d4Stephen Warren OF_DEV_AUXDATA("nvidia,tegra20-gpio", TEGRA_GPIO_BASE, "tegra-gpio", NULL), 598e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely OF_DEV_AUXDATA("nvidia,tegra20-sdhci", TEGRA_SDMMC1_BASE, "sdhci-tegra.0", NULL), 608e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely OF_DEV_AUXDATA("nvidia,tegra20-sdhci", TEGRA_SDMMC2_BASE, "sdhci-tegra.1", NULL), 618e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely OF_DEV_AUXDATA("nvidia,tegra20-sdhci", TEGRA_SDMMC3_BASE, "sdhci-tegra.2", NULL), 628e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely OF_DEV_AUXDATA("nvidia,tegra20-sdhci", TEGRA_SDMMC4_BASE, "sdhci-tegra.3", NULL), 638e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely OF_DEV_AUXDATA("nvidia,tegra20-i2c", TEGRA_I2C_BASE, "tegra-i2c.0", NULL), 648e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely OF_DEV_AUXDATA("nvidia,tegra20-i2c", TEGRA_I2C2_BASE, "tegra-i2c.1", NULL), 658e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely OF_DEV_AUXDATA("nvidia,tegra20-i2c", TEGRA_I2C3_BASE, "tegra-i2c.2", NULL), 660bc2ecb6e5b7e61113e48336b818051b094006a9Stephen Warren OF_DEV_AUXDATA("nvidia,tegra20-i2c-dvc", TEGRA_DVC_BASE, "tegra-i2c.3", NULL), 678e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely OF_DEV_AUXDATA("nvidia,tegra20-i2s", TEGRA_I2S1_BASE, "tegra-i2s.0", NULL), 68f110164ed68e0a039aff0378d66de157c3816abaStephen Warren OF_DEV_AUXDATA("nvidia,tegra20-i2s", TEGRA_I2S2_BASE, "tegra-i2s.1", NULL), 698e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely OF_DEV_AUXDATA("nvidia,tegra20-das", TEGRA_APB_MISC_DAS_BASE, "tegra-das", NULL), 704a53f4e692c5df8a4bf9bf059b8007d575b0204aOlof Johansson OF_DEV_AUXDATA("nvidia,tegra20-ehci", TEGRA_USB_BASE, "tegra-ehci.0", 718c3ec84102d171a24f050a086bfc546e9de93f9fStephen Warren &tegra_ehci1_pdata), 724a53f4e692c5df8a4bf9bf059b8007d575b0204aOlof Johansson OF_DEV_AUXDATA("nvidia,tegra20-ehci", TEGRA_USB2_BASE, "tegra-ehci.1", 738c3ec84102d171a24f050a086bfc546e9de93f9fStephen Warren &tegra_ehci2_pdata), 744a53f4e692c5df8a4bf9bf059b8007d575b0204aOlof Johansson OF_DEV_AUXDATA("nvidia,tegra20-ehci", TEGRA_USB3_BASE, "tegra-ehci.2", 758c3ec84102d171a24f050a086bfc546e9de93f9fStephen Warren &tegra_ehci3_pdata), 768e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely {} 778e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely}; 788e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely 798e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likelystatic __initdata struct tegra_clk_init_table tegra_dt_clk_init_table[] = { 808e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely /* name parent rate enabled */ 818e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely { "uartd", "pll_p", 216000000, true }, 824a53f4e692c5df8a4bf9bf059b8007d575b0204aOlof Johansson { "usbd", "clk_m", 12000000, false }, 834a53f4e692c5df8a4bf9bf059b8007d575b0204aOlof Johansson { "usb2", "clk_m", 12000000, false }, 844a53f4e692c5df8a4bf9bf059b8007d575b0204aOlof Johansson { "usb3", "clk_m", 12000000, false }, 85586187e22ddc87e95f8ac93f1a1b2a629c983aafStephen Warren { "pll_a", "pll_p_out1", 56448000, true }, 86586187e22ddc87e95f8ac93f1a1b2a629c983aafStephen Warren { "pll_a_out0", "pll_a", 11289600, true }, 87586187e22ddc87e95f8ac93f1a1b2a629c983aafStephen Warren { "cdev1", NULL, 0, true }, 88586187e22ddc87e95f8ac93f1a1b2a629c983aafStephen Warren { "i2s1", "pll_a_out0", 11289600, false}, 89586187e22ddc87e95f8ac93f1a1b2a629c983aafStephen Warren { "i2s2", "pll_a_out0", 11289600, false}, 908e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely { NULL, NULL, 0, 0}, 918e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely}; 928e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely 938e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likelystatic struct of_device_id tegra_dt_match_table[] __initdata = { 948e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely { .compatible = "simple-bus", }, 958e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely {} 968e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely}; 978e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely 98add29e61d4651fc2f87dab443f47faa70ee96f8fPeter De Schrijverstatic struct { 99add29e61d4651fc2f87dab443f47faa70ee96f8fPeter De Schrijver char *machine; 100add29e61d4651fc2f87dab443f47faa70ee96f8fPeter De Schrijver void (*init)(void); 101add29e61d4651fc2f87dab443f47faa70ee96f8fPeter De Schrijver} pinmux_configs[] = { 102a7db2c15938668999d4ceb1caec3723d88e38c80Stephen Warren { "compulab,trimslice", trimslice_pinmux_init }, 103add29e61d4651fc2f87dab443f47faa70ee96f8fPeter De Schrijver { "nvidia,harmony", harmony_pinmux_init }, 104cc2afa43d43cd07d5a34516262d7489e183311a1Marc Dietrich { "compal,paz00", paz00_pinmux_init }, 105add29e61d4651fc2f87dab443f47faa70ee96f8fPeter De Schrijver { "nvidia,seaboard", seaboard_pinmux_init }, 106add29e61d4651fc2f87dab443f47faa70ee96f8fPeter De Schrijver { "nvidia,ventana", ventana_pinmux_init }, 107add29e61d4651fc2f87dab443f47faa70ee96f8fPeter De Schrijver}; 108add29e61d4651fc2f87dab443f47faa70ee96f8fPeter De Schrijver 1098e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likelystatic void __init tegra_dt_init(void) 1108e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely{ 111add29e61d4651fc2f87dab443f47faa70ee96f8fPeter De Schrijver int i; 1128e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely 1138e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely tegra_clk_init_from_table(tegra_dt_clk_init_table); 1148e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely 115add29e61d4651fc2f87dab443f47faa70ee96f8fPeter De Schrijver for (i = 0; i < ARRAY_SIZE(pinmux_configs); i++) { 116add29e61d4651fc2f87dab443f47faa70ee96f8fPeter De Schrijver if (of_machine_is_compatible(pinmux_configs[i].machine)) { 117add29e61d4651fc2f87dab443f47faa70ee96f8fPeter De Schrijver pinmux_configs[i].init(); 118add29e61d4651fc2f87dab443f47faa70ee96f8fPeter De Schrijver break; 119add29e61d4651fc2f87dab443f47faa70ee96f8fPeter De Schrijver } 120add29e61d4651fc2f87dab443f47faa70ee96f8fPeter De Schrijver } 121add29e61d4651fc2f87dab443f47faa70ee96f8fPeter De Schrijver 122add29e61d4651fc2f87dab443f47faa70ee96f8fPeter De Schrijver WARN(i == ARRAY_SIZE(pinmux_configs), 123add29e61d4651fc2f87dab443f47faa70ee96f8fPeter De Schrijver "Unknown platform! Pinmuxing not initialized\n"); 124a58116f331fd30462b4a7372725e090e1a7d0eb7Stephen Warren 125a58116f331fd30462b4a7372725e090e1a7d0eb7Stephen Warren /* 126a58116f331fd30462b4a7372725e090e1a7d0eb7Stephen Warren * Finished with the static registrations now; fill in the missing 127a58116f331fd30462b4a7372725e090e1a7d0eb7Stephen Warren * devices 128a58116f331fd30462b4a7372725e090e1a7d0eb7Stephen Warren */ 129a58116f331fd30462b4a7372725e090e1a7d0eb7Stephen Warren of_platform_populate(NULL, tegra_dt_match_table, 130a58116f331fd30462b4a7372725e090e1a7d0eb7Stephen Warren tegra20_auxdata_lookup, NULL); 1318e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely} 1328e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely 133c37c07ddf26910f39cdc55df54640439d3a38083Peter De Schrijverstatic const char *tegra20_dt_board_compat[] = { 134c5444f39620b2b7801eb1997c41befdc8bcf78eaStephen Warren "nvidia,tegra20", 1358e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely NULL 1368e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely}; 1378e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely 138c37c07ddf26910f39cdc55df54640439d3a38083Peter De SchrijverDT_MACHINE_START(TEGRA_DT, "nVidia Tegra20 (Flattened Device Tree)") 1398e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely .map_io = tegra_map_common_io, 140c37c07ddf26910f39cdc55df54640439d3a38083Peter De Schrijver .init_early = tegra20_init_early, 1410d4f74792e2946cb2ef40a1673851eda1041358cpdeschrijver@nvidia.com .init_irq = tegra_dt_init_irq, 142afed2a261825e83cf9564dec60961e8aba6dc701Marc Zyngier .handle_irq = gic_handle_irq, 1438e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely .timer = &tegra_timer, 1448e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant Likely .init_machine = tegra_dt_init, 145abea3f2ce05f57e185b080e4a313f9fb519a0ecbRussell King .restart = tegra_assert_system_reset, 146c37c07ddf26910f39cdc55df54640439d3a38083Peter De Schrijver .dt_compat = tegra20_dt_board_compat, 1478e267f3da5f117d2f1316cf6ddf740f93f1c73aaGrant LikelyMACHINE_END 148