165b935aaSMarc Dietrich /*
265b935aaSMarc Dietrich  * arch/arm/mach-tegra/board-paz00.c
365b935aaSMarc Dietrich  *
465b935aaSMarc Dietrich  * Copyright (C) 2011 Marc Dietrich <marvin24@gmx.de>
565b935aaSMarc Dietrich  *
665b935aaSMarc Dietrich  * Based on board-harmony.c
765b935aaSMarc Dietrich  * Copyright (C) 2010 Google, Inc.
865b935aaSMarc Dietrich  *
965b935aaSMarc Dietrich  * This software is licensed under the terms of the GNU General Public
1065b935aaSMarc Dietrich  * License version 2, as published by the Free Software Foundation, and
1165b935aaSMarc Dietrich  * may be copied, distributed, and modified under those terms.
1265b935aaSMarc Dietrich  *
1365b935aaSMarc Dietrich  * This program is distributed in the hope that it will be useful,
1465b935aaSMarc Dietrich  * but WITHOUT ANY WARRANTY; without even the implied warranty of
1565b935aaSMarc Dietrich  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1665b935aaSMarc Dietrich  * GNU General Public License for more details.
1765b935aaSMarc Dietrich  *
1865b935aaSMarc Dietrich  */
1965b935aaSMarc Dietrich 
2065b935aaSMarc Dietrich #include <linux/kernel.h>
2165b935aaSMarc Dietrich #include <linux/init.h>
2265b935aaSMarc Dietrich #include <linux/platform_device.h>
2365b935aaSMarc Dietrich #include <linux/serial_8250.h>
2465b935aaSMarc Dietrich #include <linux/clk.h>
2565b935aaSMarc Dietrich #include <linux/dma-mapping.h>
2665b935aaSMarc Dietrich #include <linux/pda_power.h>
2765b935aaSMarc Dietrich #include <linux/io.h>
28dda9cd28SMarc Dietrich #include <linux/i2c.h>
29dda9cd28SMarc Dietrich #include <linux/i2c-tegra.h>
3065b935aaSMarc Dietrich 
3165b935aaSMarc Dietrich #include <asm/mach-types.h>
3265b935aaSMarc Dietrich #include <asm/mach/arch.h>
3365b935aaSMarc Dietrich #include <asm/mach/time.h>
3465b935aaSMarc Dietrich #include <asm/setup.h>
3565b935aaSMarc Dietrich 
3665b935aaSMarc Dietrich #include <mach/iomap.h>
3765b935aaSMarc Dietrich #include <mach/irqs.h>
3865b935aaSMarc Dietrich #include <mach/sdhci.h>
3965b935aaSMarc Dietrich 
4065b935aaSMarc Dietrich #include "board.h"
4165b935aaSMarc Dietrich #include "board-paz00.h"
4265b935aaSMarc Dietrich #include "clock.h"
4365b935aaSMarc Dietrich #include "devices.h"
4465b935aaSMarc Dietrich #include "gpio-names.h"
4565b935aaSMarc Dietrich 
4665b935aaSMarc Dietrich static struct plat_serial8250_port debug_uart_platform_data[] = {
4765b935aaSMarc Dietrich 	{
4865b935aaSMarc Dietrich 		.membase	= IO_ADDRESS(TEGRA_UARTD_BASE),
4965b935aaSMarc Dietrich 		.mapbase	= TEGRA_UARTD_BASE,
5065b935aaSMarc Dietrich 		.irq		= INT_UARTD,
5165b935aaSMarc Dietrich 		.flags		= UPF_BOOT_AUTOCONF,
5265b935aaSMarc Dietrich 		.iotype		= UPIO_MEM,
5365b935aaSMarc Dietrich 		.regshift	= 2,
5465b935aaSMarc Dietrich 		.uartclk	= 216000000,
5565b935aaSMarc Dietrich 	}, {
5665b935aaSMarc Dietrich 		.flags		= 0
5765b935aaSMarc Dietrich 	}
5865b935aaSMarc Dietrich };
5965b935aaSMarc Dietrich 
6065b935aaSMarc Dietrich static struct platform_device debug_uart = {
6165b935aaSMarc Dietrich 	.name = "serial8250",
6265b935aaSMarc Dietrich 	.id = PLAT8250_DEV_PLATFORM,
6365b935aaSMarc Dietrich 	.dev = {
6465b935aaSMarc Dietrich 		.platform_data = debug_uart_platform_data,
6565b935aaSMarc Dietrich 	},
6665b935aaSMarc Dietrich };
6765b935aaSMarc Dietrich 
6865b935aaSMarc Dietrich static struct platform_device *paz00_devices[] __initdata = {
6965b935aaSMarc Dietrich 	&debug_uart,
7065b935aaSMarc Dietrich 	&tegra_sdhci_device1,
7165b935aaSMarc Dietrich 	&tegra_sdhci_device2,
7265b935aaSMarc Dietrich 	&tegra_sdhci_device4,
7365b935aaSMarc Dietrich };
7465b935aaSMarc Dietrich 
75dda9cd28SMarc Dietrich static struct tegra_i2c_platform_data paz00_i2c1_platform_data = {
76dda9cd28SMarc Dietrich 	.bus_clk_rate   = 400000,
77dda9cd28SMarc Dietrich };
78dda9cd28SMarc Dietrich 
79dda9cd28SMarc Dietrich static struct tegra_i2c_platform_data paz00_i2c2_platform_data = {
80dda9cd28SMarc Dietrich 	.bus_clk_rate   = 400000,
81dda9cd28SMarc Dietrich };
82dda9cd28SMarc Dietrich 
83dda9cd28SMarc Dietrich static struct tegra_i2c_platform_data paz00_dvc_platform_data = {
84dda9cd28SMarc Dietrich 	.bus_clk_rate   = 400000,
85dda9cd28SMarc Dietrich };
86dda9cd28SMarc Dietrich 
87dda9cd28SMarc Dietrich static void paz00_i2c_init(void)
88dda9cd28SMarc Dietrich {
89dda9cd28SMarc Dietrich 	tegra_i2c_device1.dev.platform_data = &paz00_i2c1_platform_data;
90dda9cd28SMarc Dietrich 	tegra_i2c_device2.dev.platform_data = &paz00_i2c2_platform_data;
91dda9cd28SMarc Dietrich 	tegra_i2c_device4.dev.platform_data = &paz00_dvc_platform_data;
92dda9cd28SMarc Dietrich 
93dda9cd28SMarc Dietrich 	platform_device_register(&tegra_i2c_device1);
94dda9cd28SMarc Dietrich 	platform_device_register(&tegra_i2c_device2);
95dda9cd28SMarc Dietrich 	platform_device_register(&tegra_i2c_device4);
96dda9cd28SMarc Dietrich }
97dda9cd28SMarc Dietrich 
9865b935aaSMarc Dietrich static void __init tegra_paz00_fixup(struct machine_desc *desc,
9965b935aaSMarc Dietrich 	struct tag *tags, char **cmdline, struct meminfo *mi)
10065b935aaSMarc Dietrich {
10165b935aaSMarc Dietrich 	mi->nr_banks = 1;
10265b935aaSMarc Dietrich 	mi->bank[0].start = PHYS_OFFSET;
10365b935aaSMarc Dietrich 	mi->bank[0].size = 448 * SZ_1M;
10465b935aaSMarc Dietrich }
10565b935aaSMarc Dietrich 
10665b935aaSMarc Dietrich static __initdata struct tegra_clk_init_table paz00_clk_init_table[] = {
10765b935aaSMarc Dietrich 	/* name		parent		rate		enabled */
10865b935aaSMarc Dietrich 	{ "uartd",	"pll_p",	216000000,	true },
10965b935aaSMarc Dietrich 	{ NULL,		NULL,		0,		0},
11065b935aaSMarc Dietrich };
11165b935aaSMarc Dietrich 
11265b935aaSMarc Dietrich 
11365b935aaSMarc Dietrich static struct tegra_sdhci_platform_data sdhci_pdata1 = {
11465b935aaSMarc Dietrich 	.cd_gpio	= TEGRA_GPIO_SD1_CD,
11565b935aaSMarc Dietrich 	.wp_gpio	= TEGRA_GPIO_SD1_WP,
11665b935aaSMarc Dietrich 	.power_gpio	= TEGRA_GPIO_SD1_POWER,
11765b935aaSMarc Dietrich };
11865b935aaSMarc Dietrich 
11965b935aaSMarc Dietrich static struct tegra_sdhci_platform_data sdhci_pdata2 = {
12065b935aaSMarc Dietrich 	.cd_gpio	= -1,
12165b935aaSMarc Dietrich 	.wp_gpio	= -1,
12265b935aaSMarc Dietrich 	.power_gpio	= -1,
12365b935aaSMarc Dietrich };
12465b935aaSMarc Dietrich 
12565b935aaSMarc Dietrich static struct tegra_sdhci_platform_data sdhci_pdata4 = {
12665b935aaSMarc Dietrich 	.cd_gpio	= TEGRA_GPIO_SD4_CD,
12765b935aaSMarc Dietrich 	.wp_gpio	= TEGRA_GPIO_SD4_WP,
12865b935aaSMarc Dietrich 	.power_gpio	= TEGRA_GPIO_SD4_POWER,
12965b935aaSMarc Dietrich 	.is_8bit	= 1,
13065b935aaSMarc Dietrich };
13165b935aaSMarc Dietrich 
13265b935aaSMarc Dietrich static void __init tegra_paz00_init(void)
13365b935aaSMarc Dietrich {
13465b935aaSMarc Dietrich 	tegra_clk_init_from_table(paz00_clk_init_table);
13565b935aaSMarc Dietrich 
13665b935aaSMarc Dietrich 	paz00_pinmux_init();
13765b935aaSMarc Dietrich 
13865b935aaSMarc Dietrich 	tegra_sdhci_device1.dev.platform_data = &sdhci_pdata1;
13965b935aaSMarc Dietrich 	tegra_sdhci_device2.dev.platform_data = &sdhci_pdata2;
14065b935aaSMarc Dietrich 	tegra_sdhci_device4.dev.platform_data = &sdhci_pdata4;
14165b935aaSMarc Dietrich 
14265b935aaSMarc Dietrich 	platform_add_devices(paz00_devices, ARRAY_SIZE(paz00_devices));
143dda9cd28SMarc Dietrich 
144dda9cd28SMarc Dietrich 	paz00_i2c_init();
14565b935aaSMarc Dietrich }
14665b935aaSMarc Dietrich 
14765b935aaSMarc Dietrich MACHINE_START(PAZ00, "paz00")
14865b935aaSMarc Dietrich 	.boot_params	= 0x00000100,
14965b935aaSMarc Dietrich 	.fixup		= tegra_paz00_fixup,
15065b935aaSMarc Dietrich 	.map_io         = tegra_map_common_io,
15165b935aaSMarc Dietrich 	.init_early	= tegra_init_early,
15265b935aaSMarc Dietrich 	.init_irq       = tegra_init_irq,
15365b935aaSMarc Dietrich 	.timer          = &tegra_timer,
15465b935aaSMarc Dietrich 	.init_machine   = tegra_paz00_init,
15565b935aaSMarc Dietrich MACHINE_END
156