arm: tegra: Move driver files to drivers/platform
[linux-3.10.git] / arch / arm / mach-tegra / board-p1859.c
1 /*
2  * arch/arm/mach-tegra/board-p1859.c
3  *
4  * Copyright (c) 2013-2014, NVIDIA CORPORATION.  All rights reserved.
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms and conditions of the GNU General Public License,
8  * version 2, as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13  * more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  */
18
19 #include <linux/platform_device.h>
20 #include <linux/i2c.h>
21 #include <linux/kernel.h>
22 #include <linux/clocksource.h>
23 #include <linux/irqchip.h>
24
25 #include <asm/mach/arch.h>
26 #include <linux/platform/tegra/isomgr.h>
27 #include <mach/board_id.h>
28
29 #include "iomap.h"
30 #include "board.h"
31 #include <linux/platform/tegra/clock.h>
32 #include "vcm30_t124.h"
33 #include "board-p1859.h"
34 #include "devices.h"
35 #include "board-common.h"
36 #include <linux/platform/tegra/common.h>
37 #include "therm-monitor.h"
38 #include "board-panel.h"
39 #include "tegra-of-dev-auxdata.h"
40
41 static int is_e1860_b00;
42
43 static __initdata struct tegra_clk_init_table e1860_a0x_i2s_clk_table[] = {
44 /*
45  * audio clock tables based on baseboard revision. These rates will be set
46  * early on during boot up. Also, they will remain fixed throughout.
47  */
48 /*         clock        parent          rate            enable (always-on) */
49         { "i2s4_sync",  NULL,           12288000,       false},
50         { "audio4",     "i2s4_sync",    12288000,       false},
51         { "audio4_2x",  "audio4",       12288000,       false},
52         { "i2s2_sync",  NULL,           12288000,       false},
53         { "audio2",     "i2s2_sync",    12288000,       false},
54         { "audio2_2x",  "audio2",       12288000,       false},
55         { "i2s0",       "pll_a_out0",   3072000,        false},
56         { "i2s1",       "pll_a_out0",   3072000,        false},
57         { "i2s2",       "audio2_2x",    12288000,       false},
58         { "i2s3",       "pll_a_out0",   3072000,        false},
59         { "i2s4",       "audio4_2x",    12288000,       false},
60         { "extern1",    "pll_a_out0",   12288000,       false},
61         { NULL,         NULL,           0,              0},
62 };
63
64 static __initdata struct tegra_clk_init_table e1860_b0x_i2s_clk_table[] = {
65 /*         clock        parent          rate            enable (always-on) */
66         { "i2s4_sync",  NULL,           12288000,       false},
67         { "audio4",     "i2s4_sync",    12288000,       false},
68         { "audio4_2x",  "audio4",       12288000,       false},
69         { "i2s2_sync",  NULL,           12288000,       false},
70         { "audio2",     "i2s2_sync",    12288000,       false},
71         { "audio2_2x",  "audio2",       12288000,       false},
72         { "i2s0",       "pll_a_out0",   12288000,       false},
73         { "i2s1",       "pll_a_out0",   3072000,        false},
74         { "i2s2",       "pll_a_out0",   512000, false},
75         { "i2s3",       "pll_a_out0",   3072000,        false},
76         { "i2s4",       "audio4_2x",    12288000,       false},
77         { "extern1",    "pll_a_out0",   24576000,       false},
78         { NULL,         NULL,           0,              0},
79 };
80
81 static int __init e1860_fixed_target_rate_init(void)
82 {
83         int modem_id = tegra_get_modem_id();
84
85         struct tegra_clk_init_table e1860_b0x_i2s4_clk_table[] = {
86                 { "i2s4", "pll_a_out0", 1024000, false},
87                 { NULL,    NULL,        0,        0},
88         };
89
90         struct tegra_clk_init_table *clk_table = (is_e1860_b00) ?
91                         e1860_b0x_i2s_clk_table : e1860_a0x_i2s_clk_table;
92
93         /* Set rate of audio clocks */
94         tegra_clk_init_from_table(clk_table);
95
96         /* Set target fixed rate of audio clocks */
97         tegra_vcm30_t124_set_fixed_rate(clk_table);
98
99         /* For voice call in b0x, set i2s4 clock in master mode */
100         if (is_e1860_b00 && modem_id) {
101                 tegra_clk_init_from_table(e1860_b0x_i2s4_clk_table);
102                 tegra_vcm30_t124_set_fixed_rate(e1860_b0x_i2s4_clk_table);
103         }
104
105         return 0;
106 }
107
108 /* I2C devices */
109 static struct i2c_board_info __initdata ak4618_board_info = {
110         I2C_BOARD_INFO("ak4618", 0x10),
111 };
112
113 static struct i2c_board_info __initdata wm8731_board_info = {
114         I2C_BOARD_INFO("wm8731", 0x1a),
115 };
116
117 static struct i2c_board_info __initdata ad1937_board_info = {
118         I2C_BOARD_INFO("ad1937", 0x07),
119 };
120
121 /* Display panel/HDMI */
122 static int p1859_dev_dummy(struct device *dev)
123 {
124         return 0;
125 }
126
127 static int p1859_dummy(void)
128 {
129         return 0;
130 }
131
132 struct tegra_panel_ops p1859_hdmi_ops = {
133         .enable = p1859_dev_dummy,
134         .disable = p1859_dummy,
135         .postsuspend = p1859_dummy,
136         .hotplug_init = p1859_dev_dummy,
137 };
138
139 static int tegra_p1859_notifier_call(struct notifier_block *nb,
140                                     unsigned long event, void *data)
141 {
142 #ifndef CONFIG_TEGRA_HDMI_PRIMARY
143         struct device *dev = data;
144 #endif
145
146         switch (event) {
147         case BUS_NOTIFY_BIND_DRIVER:
148 #ifndef CONFIG_TEGRA_HDMI_PRIMARY
149                 if (dev->of_node) {
150                         if (of_device_is_compatible(dev->of_node,
151                                 "pwm-backlight")) {
152                                 tegra_pwm_bl_ops_register(dev);
153                         }
154                 }
155 #endif
156                 break;
157         default:
158                 break;
159         }
160         return NOTIFY_DONE;
161 }
162
163 static struct notifier_block platform_nb = {
164         .notifier_call = tegra_p1859_notifier_call,
165 };
166
167 static void p1859_panel_init(void)
168 {
169         tegra_set_fixed_panel_ops(true,
170                 &edp_a_1080p_14_0_ops, "a-edp,1080p-14-0");
171         tegra_set_fixed_panel_ops(false, &p1859_hdmi_ops, "hdmi,display");
172         tegra_set_fixed_pwm_bl_ops(edp_a_1080p_14_0_ops.pwm_bl_ops);
173         bus_register_notifier(&platform_bus_type, &platform_nb);
174 }
175
176 static void __init p1859_i2c_init(void)
177 {
178         i2c_register_board_info(0, &ak4618_board_info, 1);
179         i2c_register_board_info(0, &wm8731_board_info, 1);
180         i2c_register_board_info(0, &ad1937_board_info, 1);
181 }
182
183 static struct platform_device *p1859_devices[] __initdata = {
184         &tegra_rtc_device,
185 #if defined(CONFIG_TEGRA_WATCHDOG)
186         &tegra_wdt0_device,
187 #endif
188 };
189
190 static void __init tegra_p1859_early_init(void)
191 {
192         struct tegra_clk_init_table *clk_table = (is_e1860_b00) ?
193                         e1860_b0x_i2s_clk_table : e1860_a0x_i2s_clk_table;
194
195         /* Early init for vcm30t124 MCM */
196         tegra_vcm30_t124_early_init();
197
198         /* Board specific clock POR */
199         tegra_clk_init_from_table(clk_table);
200         e1860_fixed_target_rate_init();
201
202         tegra_clk_verify_parents();
203
204         tegra_soc_device_init("p1859");
205 }
206
207 static void __init tegra_p1859_late_init(void)
208 {
209         /* Create procfs entries for board_serial, skuinfo etc */
210         tegra_init_board_info();
211
212         /* Initialize the vcm30t124 specific devices */
213         tegra_vcm30_t124_therm_mon_init();
214         tegra_vcm30_t124_soctherm_init();
215         tegra_vcm30_t124_usb_init();
216
217         /* Initialize p1859 board specific devices */
218         p1859_i2c_init();
219         p1859_pca953x_init();
220         p1859_audio_init();
221
222         platform_add_devices(p1859_devices, ARRAY_SIZE(p1859_devices));
223
224 #ifdef CONFIG_TEGRA_WIFI_ENABLE
225         p1859_wifi_init();
226 #endif
227         p1859_regulator_init();
228
229         tegra_vcm30_t124_suspend_init();
230
231         isomgr_init();
232         p1859_panel_init();
233 }
234
235 static void __init tegra_p1859_dt_init(void)
236 {
237         is_e1860_b00 = tegra_is_board(NULL, "61860", NULL, "300", NULL);
238
239         tegra_p1859_early_init();
240
241 #ifdef CONFIG_USE_OF
242         tegra_vcm30_t124_populate_auxdata();
243 #endif
244
245         tegra_p1859_late_init();
246 }
247
248 static const char * const p1859_dt_board_compat[] = {
249         "nvidia,p1859",
250         NULL
251 };
252
253 DT_MACHINE_START(P1859, "p1859")
254         .atag_offset    = 0x100,
255         .smp            = smp_ops(tegra_smp_ops),
256         .map_io         = tegra_map_common_io,
257         .reserve        = tegra_vcm30_t124_reserve,
258         .init_early     = tegra12x_init_early,
259         .init_irq       = irqchip_init,
260         .init_time      = clocksource_of_init,
261         .init_machine   = tegra_p1859_dt_init,
262         .restart        = tegra_assert_system_reset,
263         .dt_compat      = p1859_dt_board_compat,
264         .init_late      = tegra_init_late
265 MACHINE_END
266
267 static const char * const vcm30t124_dt_board_compat[] = {
268         "nvidia,vcm30t124",
269         NULL
270 };
271
272 DT_MACHINE_START(VCM30T124, "vcm30t124")
273         .atag_offset    = 0x100,
274         .smp            = smp_ops(tegra_smp_ops),
275         .map_io         = tegra_map_common_io,
276         .reserve        = tegra_vcm30_t124_reserve,
277         .init_early     = tegra12x_init_early,
278         .init_irq       = irqchip_init,
279         .init_time      = clocksource_of_init,
280         .init_machine   = tegra_p1859_dt_init,
281         .restart        = tegra_assert_system_reset,
282         .dt_compat      = vcm30t124_dt_board_compat,
283         .init_late      = tegra_init_late
284 MACHINE_END