diff options
Diffstat (limited to 'arch/arm/mach-tegra/board-harmony.c')
-rw-r--r-- | arch/arm/mach-tegra/board-harmony.c | 145 |
1 files changed, 116 insertions, 29 deletions
diff --git a/arch/arm/mach-tegra/board-harmony.c b/arch/arm/mach-tegra/board-harmony.c index b9dbdb1289d0..75c918a86a31 100644 --- a/arch/arm/mach-tegra/board-harmony.c +++ b/arch/arm/mach-tegra/board-harmony.c | |||
@@ -2,6 +2,7 @@ | |||
2 | * arch/arm/mach-tegra/board-harmony.c | 2 | * arch/arm/mach-tegra/board-harmony.c |
3 | * | 3 | * |
4 | * Copyright (C) 2010 Google, Inc. | 4 | * Copyright (C) 2010 Google, Inc. |
5 | * Copyright (C) 2011 NVIDIA, Inc. | ||
5 | * | 6 | * |
6 | * This software is licensed under the terms of the GNU General Public | 7 | * This software is licensed under the terms of the GNU General Public |
7 | * License version 2, as published by the Free Software Foundation, and | 8 | * License version 2, as published by the Free Software Foundation, and |
@@ -22,43 +23,27 @@ | |||
22 | #include <linux/dma-mapping.h> | 23 | #include <linux/dma-mapping.h> |
23 | #include <linux/pda_power.h> | 24 | #include <linux/pda_power.h> |
24 | #include <linux/io.h> | 25 | #include <linux/io.h> |
26 | #include <linux/gpio.h> | ||
27 | #include <linux/i2c.h> | ||
28 | #include <linux/i2c-tegra.h> | ||
29 | |||
30 | #include <sound/wm8903.h> | ||
25 | 31 | ||
26 | #include <asm/mach-types.h> | 32 | #include <asm/mach-types.h> |
27 | #include <asm/mach/arch.h> | 33 | #include <asm/mach/arch.h> |
28 | #include <asm/mach/time.h> | 34 | #include <asm/mach/time.h> |
29 | #include <asm/setup.h> | 35 | #include <asm/setup.h> |
30 | 36 | ||
37 | #include <mach/harmony_audio.h> | ||
31 | #include <mach/iomap.h> | 38 | #include <mach/iomap.h> |
32 | #include <mach/irqs.h> | 39 | #include <mach/irqs.h> |
40 | #include <mach/sdhci.h> | ||
33 | 41 | ||
34 | #include "board.h" | 42 | #include "board.h" |
35 | #include "board-harmony.h" | 43 | #include "board-harmony.h" |
36 | #include "clock.h" | 44 | #include "clock.h" |
37 | 45 | #include "devices.h" | |
38 | /* NVidia bootloader tags */ | 46 | #include "gpio-names.h" |
39 | #define ATAG_NVIDIA 0x41000801 | ||
40 | |||
41 | #define ATAG_NVIDIA_RM 0x1 | ||
42 | #define ATAG_NVIDIA_DISPLAY 0x2 | ||
43 | #define ATAG_NVIDIA_FRAMEBUFFER 0x3 | ||
44 | #define ATAG_NVIDIA_CHIPSHMOO 0x4 | ||
45 | #define ATAG_NVIDIA_CHIPSHMOOPHYS 0x5 | ||
46 | #define ATAG_NVIDIA_PRESERVED_MEM_0 0x10000 | ||
47 | #define ATAG_NVIDIA_PRESERVED_MEM_N 2 | ||
48 | #define ATAG_NVIDIA_FORCE_32 0x7fffffff | ||
49 | |||
50 | struct tag_tegra { | ||
51 | __u32 bootarg_key; | ||
52 | __u32 bootarg_len; | ||
53 | char bootarg[1]; | ||
54 | }; | ||
55 | |||
56 | static int __init parse_tag_nvidia(const struct tag *tag) | ||
57 | { | ||
58 | |||
59 | return 0; | ||
60 | } | ||
61 | __tagtable(ATAG_NVIDIA, parse_tag_nvidia); | ||
62 | 47 | ||
63 | static struct plat_serial8250_port debug_uart_platform_data[] = { | 48 | static struct plat_serial8250_port debug_uart_platform_data[] = { |
64 | { | 49 | { |
@@ -82,8 +67,81 @@ static struct platform_device debug_uart = { | |||
82 | }, | 67 | }, |
83 | }; | 68 | }; |
84 | 69 | ||
70 | static struct harmony_audio_platform_data harmony_audio_pdata = { | ||
71 | .gpio_spkr_en = TEGRA_GPIO_SPKR_EN, | ||
72 | .gpio_hp_det = TEGRA_GPIO_HP_DET, | ||
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 = { | ||
78 | .name = "tegra-snd-harmony", | ||
79 | .id = 0, | ||
80 | .dev = { | ||
81 | .platform_data = &harmony_audio_pdata, | ||
82 | }, | ||
83 | }; | ||
84 | |||
85 | static struct tegra_i2c_platform_data harmony_i2c1_platform_data = { | ||
86 | .bus_clk_rate = 400000, | ||
87 | }; | ||
88 | |||
89 | static struct tegra_i2c_platform_data harmony_i2c2_platform_data = { | ||
90 | .bus_clk_rate = 400000, | ||
91 | }; | ||
92 | |||
93 | static struct tegra_i2c_platform_data harmony_i2c3_platform_data = { | ||
94 | .bus_clk_rate = 400000, | ||
95 | }; | ||
96 | |||
97 | static struct tegra_i2c_platform_data harmony_dvc_platform_data = { | ||
98 | .bus_clk_rate = 400000, | ||
99 | }; | ||
100 | |||
101 | static struct wm8903_platform_data harmony_wm8903_pdata = { | ||
102 | .irq_active_low = 0, | ||
103 | .micdet_cfg = 0, | ||
104 | .micdet_delay = 100, | ||
105 | .gpio_base = HARMONY_GPIO_WM8903(0), | ||
106 | .gpio_cfg = { | ||
107 | WM8903_GPIO_NO_CONFIG, | ||
108 | WM8903_GPIO_NO_CONFIG, | ||
109 | 0, | ||
110 | WM8903_GPIO_NO_CONFIG, | ||
111 | WM8903_GPIO_NO_CONFIG, | ||
112 | }, | ||
113 | }; | ||
114 | |||
115 | static struct i2c_board_info __initdata wm8903_board_info = { | ||
116 | I2C_BOARD_INFO("wm8903", 0x1a), | ||
117 | .platform_data = &harmony_wm8903_pdata, | ||
118 | .irq = TEGRA_GPIO_TO_IRQ(TEGRA_GPIO_CDC_IRQ), | ||
119 | }; | ||
120 | |||
121 | static void __init harmony_i2c_init(void) | ||
122 | { | ||
123 | tegra_i2c_device1.dev.platform_data = &harmony_i2c1_platform_data; | ||
124 | tegra_i2c_device2.dev.platform_data = &harmony_i2c2_platform_data; | ||
125 | tegra_i2c_device3.dev.platform_data = &harmony_i2c3_platform_data; | ||
126 | tegra_i2c_device4.dev.platform_data = &harmony_dvc_platform_data; | ||
127 | |||
128 | platform_device_register(&tegra_i2c_device1); | ||
129 | platform_device_register(&tegra_i2c_device2); | ||
130 | platform_device_register(&tegra_i2c_device3); | ||
131 | platform_device_register(&tegra_i2c_device4); | ||
132 | |||
133 | i2c_register_board_info(0, &wm8903_board_info, 1); | ||
134 | } | ||
135 | |||
85 | static struct platform_device *harmony_devices[] __initdata = { | 136 | static struct platform_device *harmony_devices[] __initdata = { |
86 | &debug_uart, | 137 | &debug_uart, |
138 | &tegra_sdhci_device1, | ||
139 | &tegra_sdhci_device2, | ||
140 | &tegra_sdhci_device4, | ||
141 | &tegra_i2s_device1, | ||
142 | &tegra_das_device, | ||
143 | &tegra_pcm_device, | ||
144 | &harmony_audio_device, | ||
87 | }; | 145 | }; |
88 | 146 | ||
89 | static void __init tegra_harmony_fixup(struct machine_desc *desc, | 147 | static void __init tegra_harmony_fixup(struct machine_desc *desc, |
@@ -99,25 +157,54 @@ static void __init tegra_harmony_fixup(struct machine_desc *desc, | |||
99 | static __initdata struct tegra_clk_init_table harmony_clk_init_table[] = { | 157 | static __initdata struct tegra_clk_init_table harmony_clk_init_table[] = { |
100 | /* name parent rate enabled */ | 158 | /* name parent rate enabled */ |
101 | { "uartd", "pll_p", 216000000, true }, | 159 | { "uartd", "pll_p", 216000000, true }, |
160 | { "pll_a", "pll_p_out1", 56448000, true }, | ||
161 | { "pll_a_out0", "pll_a", 11289600, true }, | ||
162 | { "cdev1", NULL, 0, true }, | ||
163 | { "i2s1", "pll_a_out0", 11289600, false}, | ||
102 | { NULL, NULL, 0, 0}, | 164 | { NULL, NULL, 0, 0}, |
103 | }; | 165 | }; |
104 | 166 | ||
167 | |||
168 | static struct tegra_sdhci_platform_data sdhci_pdata1 = { | ||
169 | .cd_gpio = -1, | ||
170 | .wp_gpio = -1, | ||
171 | .power_gpio = -1, | ||
172 | }; | ||
173 | |||
174 | static struct tegra_sdhci_platform_data sdhci_pdata2 = { | ||
175 | .cd_gpio = TEGRA_GPIO_SD2_CD, | ||
176 | .wp_gpio = TEGRA_GPIO_SD2_WP, | ||
177 | .power_gpio = TEGRA_GPIO_SD2_POWER, | ||
178 | }; | ||
179 | |||
180 | static struct tegra_sdhci_platform_data sdhci_pdata4 = { | ||
181 | .cd_gpio = TEGRA_GPIO_SD4_CD, | ||
182 | .wp_gpio = TEGRA_GPIO_SD4_WP, | ||
183 | .power_gpio = TEGRA_GPIO_SD4_POWER, | ||
184 | .is_8bit = 1, | ||
185 | }; | ||
186 | |||
105 | static void __init tegra_harmony_init(void) | 187 | static void __init tegra_harmony_init(void) |
106 | { | 188 | { |
107 | tegra_common_init(); | ||
108 | |||
109 | tegra_clk_init_from_table(harmony_clk_init_table); | 189 | tegra_clk_init_from_table(harmony_clk_init_table); |
110 | 190 | ||
111 | harmony_pinmux_init(); | 191 | harmony_pinmux_init(); |
112 | 192 | ||
193 | tegra_sdhci_device1.dev.platform_data = &sdhci_pdata1; | ||
194 | tegra_sdhci_device2.dev.platform_data = &sdhci_pdata2; | ||
195 | tegra_sdhci_device4.dev.platform_data = &sdhci_pdata4; | ||
196 | |||
113 | platform_add_devices(harmony_devices, ARRAY_SIZE(harmony_devices)); | 197 | platform_add_devices(harmony_devices, ARRAY_SIZE(harmony_devices)); |
198 | harmony_i2c_init(); | ||
199 | harmony_regulator_init(); | ||
114 | } | 200 | } |
115 | 201 | ||
116 | MACHINE_START(HARMONY, "harmony") | 202 | MACHINE_START(HARMONY, "harmony") |
117 | .boot_params = 0x00000100, | 203 | .boot_params = 0x00000100, |
118 | .fixup = tegra_harmony_fixup, | 204 | .fixup = tegra_harmony_fixup, |
119 | .init_irq = tegra_init_irq, | ||
120 | .init_machine = tegra_harmony_init, | ||
121 | .map_io = tegra_map_common_io, | 205 | .map_io = tegra_map_common_io, |
206 | .init_early = tegra_init_early, | ||
207 | .init_irq = tegra_init_irq, | ||
122 | .timer = &tegra_timer, | 208 | .timer = &tegra_timer, |
209 | .init_machine = tegra_harmony_init, | ||
123 | MACHINE_END | 210 | MACHINE_END |