Commit | Line | Data |
---|---|---|
42a7bf4d CC |
1 | /* |
2 | * arch/arm/mach-tegra/board-harmony.c | |
3 | * | |
4 | * Copyright (C) 2010 Google, Inc. | |
ef2b1a0f | 5 | * Copyright (C) 2011 NVIDIA, Inc. |
42a7bf4d CC |
6 | * |
7 | * This software is licensed under the terms of the GNU General Public | |
8 | * License version 2, as published by the Free Software Foundation, and | |
9 | * may be copied, distributed, and modified under those terms. | |
10 | * | |
11 | * This program is distributed in the hope that it will be useful, | |
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 | * GNU General Public License for more details. | |
15 | * | |
16 | */ | |
17 | ||
18 | #include <linux/kernel.h> | |
19 | #include <linux/init.h> | |
20 | #include <linux/platform_device.h> | |
21 | #include <linux/serial_8250.h> | |
22 | #include <linux/clk.h> | |
23 | #include <linux/dma-mapping.h> | |
24 | #include <linux/pda_power.h> | |
25 | #include <linux/io.h> | |
ef2b1a0f | 26 | #include <linux/gpio.h> |
de4855d9 | 27 | #include <linux/i2c.h> |
42a7bf4d | 28 | |
fba3b2fc SW |
29 | #include <sound/wm8903.h> |
30 | ||
42a7bf4d CC |
31 | #include <asm/mach-types.h> |
32 | #include <asm/mach/arch.h> | |
33 | #include <asm/mach/time.h> | |
34 | #include <asm/setup.h> | |
35 | ||
4651d556 | 36 | #include <mach/tegra_wm8903_pdata.h> |
42a7bf4d CC |
37 | #include <mach/iomap.h> |
38 | #include <mach/irqs.h> | |
875d4af6 | 39 | #include <mach/sdhci.h> |
42a7bf4d CC |
40 | |
41 | #include "board.h" | |
42 | #include "board-harmony.h" | |
43 | #include "clock.h" | |
875d4af6 OJ |
44 | #include "devices.h" |
45 | #include "gpio-names.h" | |
42a7bf4d | 46 | |
42a7bf4d CC |
47 | static struct plat_serial8250_port debug_uart_platform_data[] = { |
48 | { | |
49 | .membase = IO_ADDRESS(TEGRA_UARTD_BASE), | |
50 | .mapbase = TEGRA_UARTD_BASE, | |
51 | .irq = INT_UARTD, | |
52 | .flags = UPF_BOOT_AUTOCONF, | |
53 | .iotype = UPIO_MEM, | |
54 | .regshift = 2, | |
55 | .uartclk = 216000000, | |
56 | }, { | |
57 | .flags = 0 | |
58 | } | |
59 | }; | |
60 | ||
61 | static struct platform_device debug_uart = { | |
62 | .name = "serial8250", | |
63 | .id = PLAT8250_DEV_PLATFORM, | |
64 | .dev = { | |
65 | .platform_data = debug_uart_platform_data, | |
66 | }, | |
67 | }; | |
68 | ||
4651d556 | 69 | static struct tegra_wm8903_platform_data harmony_audio_pdata = { |
ef2b1a0f SW |
70 | .gpio_spkr_en = TEGRA_GPIO_SPKR_EN, |
71 | .gpio_hp_det = TEGRA_GPIO_HP_DET, | |
61a6d076 | 72 | .gpio_hp_mute = -1, |
ef2b1a0f SW |
73 | .gpio_int_mic_en = TEGRA_GPIO_INT_MIC_EN, |
74 | .gpio_ext_mic_en = TEGRA_GPIO_EXT_MIC_EN, | |
75 | }; | |
76 | ||
77 | static struct platform_device harmony_audio_device = { | |
7b33af25 | 78 | .name = "tegra-snd-wm8903", |
ef2b1a0f SW |
79 | .id = 0, |
80 | .dev = { | |
81 | .platform_data = &harmony_audio_pdata, | |
82 | }, | |
83 | }; | |
84 | ||
fba3b2fc SW |
85 | static struct wm8903_platform_data harmony_wm8903_pdata = { |
86 | .irq_active_low = 0, | |
87 | .micdet_cfg = 0, | |
88 | .micdet_delay = 100, | |
06fc9a30 | 89 | .gpio_base = HARMONY_GPIO_WM8903(0), |
fba3b2fc SW |
90 | .gpio_cfg = { |
91 | WM8903_GPIO_NO_CONFIG, | |
92 | WM8903_GPIO_NO_CONFIG, | |
93 | 0, | |
94 | WM8903_GPIO_NO_CONFIG, | |
95 | WM8903_GPIO_NO_CONFIG, | |
96 | }, | |
97 | }; | |
98 | ||
99 | static struct i2c_board_info __initdata wm8903_board_info = { | |
100 | I2C_BOARD_INFO("wm8903", 0x1a), | |
101 | .platform_data = &harmony_wm8903_pdata, | |
102 | .irq = TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_CDC_IRQ), | |
103 | }; | |
104 | ||
de4855d9 OJ |
105 | static void __init harmony_i2c_init(void) |
106 | { | |
de4855d9 OJ |
107 | platform_device_register(&tegra_i2c_device1); |
108 | platform_device_register(&tegra_i2c_device2); | |
109 | platform_device_register(&tegra_i2c_device3); | |
110 | platform_device_register(&tegra_i2c_device4); | |
fba3b2fc SW |
111 | |
112 | i2c_register_board_info(0, &wm8903_board_info, 1); | |
de4855d9 OJ |
113 | } |
114 | ||
42a7bf4d CC |
115 | static struct platform_device *harmony_devices[] __initdata = { |
116 | &debug_uart, | |
875d4af6 OJ |
117 | &tegra_sdhci_device1, |
118 | &tegra_sdhci_device2, | |
119 | &tegra_sdhci_device4, | |
ef2b1a0f SW |
120 | &tegra_i2s_device1, |
121 | &tegra_das_device, | |
122 | &tegra_pcm_device, | |
123 | &harmony_audio_device, | |
42a7bf4d CC |
124 | }; |
125 | ||
0744a3ee RK |
126 | static void __init tegra_harmony_fixup(struct tag *tags, char **cmdline, |
127 | struct meminfo *mi) | |
42a7bf4d CC |
128 | { |
129 | mi->nr_banks = 2; | |
130 | mi->bank[0].start = PHYS_OFFSET; | |
42a7bf4d CC |
131 | mi->bank[0].size = 448 * SZ_1M; |
132 | mi->bank[1].start = SZ_512M; | |
42a7bf4d CC |
133 | mi->bank[1].size = SZ_512M; |
134 | } | |
135 | ||
136 | static __initdata struct tegra_clk_init_table harmony_clk_init_table[] = { | |
137 | /* name parent rate enabled */ | |
138 | { "uartd", "pll_p", 216000000, true }, | |
ef2b1a0f SW |
139 | { "pll_a", "pll_p_out1", 56448000, true }, |
140 | { "pll_a_out0", "pll_a", 11289600, true }, | |
141 | { "cdev1", NULL, 0, true }, | |
142 | { "i2s1", "pll_a_out0", 11289600, false}, | |
42a7bf4d CC |
143 | { NULL, NULL, 0, 0}, |
144 | }; | |
145 | ||
875d4af6 OJ |
146 | |
147 | static struct tegra_sdhci_platform_data sdhci_pdata1 = { | |
148 | .cd_gpio = -1, | |
149 | .wp_gpio = -1, | |
150 | .power_gpio = -1, | |
151 | }; | |
152 | ||
153 | static struct tegra_sdhci_platform_data sdhci_pdata2 = { | |
986afbe4 SW |
154 | .cd_gpio = TEGRA_GPIO_SD2_CD, |
155 | .wp_gpio = TEGRA_GPIO_SD2_WP, | |
156 | .power_gpio = TEGRA_GPIO_SD2_POWER, | |
875d4af6 OJ |
157 | }; |
158 | ||
159 | static struct tegra_sdhci_platform_data sdhci_pdata4 = { | |
986afbe4 SW |
160 | .cd_gpio = TEGRA_GPIO_SD4_CD, |
161 | .wp_gpio = TEGRA_GPIO_SD4_WP, | |
162 | .power_gpio = TEGRA_GPIO_SD4_POWER, | |
875d4af6 OJ |
163 | .is_8bit = 1, |
164 | }; | |
165 | ||
42a7bf4d CC |
166 | static void __init tegra_harmony_init(void) |
167 | { | |
42a7bf4d CC |
168 | tegra_clk_init_from_table(harmony_clk_init_table); |
169 | ||
170 | harmony_pinmux_init(); | |
171 | ||
875d4af6 OJ |
172 | tegra_sdhci_device1.dev.platform_data = &sdhci_pdata1; |
173 | tegra_sdhci_device2.dev.platform_data = &sdhci_pdata2; | |
174 | tegra_sdhci_device4.dev.platform_data = &sdhci_pdata4; | |
175 | ||
42a7bf4d | 176 | platform_add_devices(harmony_devices, ARRAY_SIZE(harmony_devices)); |
de4855d9 | 177 | harmony_i2c_init(); |
6f168f2f | 178 | harmony_regulator_init(); |
42a7bf4d CC |
179 | } |
180 | ||
181 | MACHINE_START(HARMONY, "harmony") | |
182 | .boot_params = 0x00000100, | |
42a7bf4d | 183 | .fixup = tegra_harmony_fixup, |
42a7bf4d | 184 | .map_io = tegra_map_common_io, |
0cf6230a CC |
185 | .init_early = tegra_init_early, |
186 | .init_irq = tegra_init_irq, | |
42a7bf4d | 187 | .timer = &tegra_timer, |
0cf6230a | 188 | .init_machine = tegra_harmony_init, |
42a7bf4d | 189 | MACHINE_END |