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