diff options
Diffstat (limited to 'arch/arm/mach-tegra/board-cardhu-pm298-power-rails.c')
-rw-r--r-- | arch/arm/mach-tegra/board-cardhu-pm298-power-rails.c | 803 |
1 files changed, 803 insertions, 0 deletions
diff --git a/arch/arm/mach-tegra/board-cardhu-pm298-power-rails.c b/arch/arm/mach-tegra/board-cardhu-pm298-power-rails.c new file mode 100644 index 00000000000..8a862270e89 --- /dev/null +++ b/arch/arm/mach-tegra/board-cardhu-pm298-power-rails.c | |||
@@ -0,0 +1,803 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-tegra/board-cardhu-pm298-power-rails.c | ||
3 | * | ||
4 | * Copyright (C) 2011 NVIDIA, Inc. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program; if not, write to the Free Software | ||
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | ||
18 | * 02111-1307, USA | ||
19 | */ | ||
20 | #include <linux/i2c.h> | ||
21 | #include <linux/pda_power.h> | ||
22 | #include <linux/platform_device.h> | ||
23 | #include <linux/resource.h> | ||
24 | #include <linux/regulator/machine.h> | ||
25 | #include <linux/gpio.h> | ||
26 | #include <linux/io.h> | ||
27 | #include <linux/regulator/gpio-switch-regulator.h> | ||
28 | #include <linux/regulator/fixed.h> | ||
29 | #include <linux/mfd/max77663-core.h> | ||
30 | #include <linux/regulator/max77663-regulator.h> | ||
31 | |||
32 | #include <mach/iomap.h> | ||
33 | #include <mach/irqs.h> | ||
34 | #include <mach/pinmux.h> | ||
35 | #include <mach/edp.h> | ||
36 | |||
37 | #include "gpio-names.h" | ||
38 | #include "board.h" | ||
39 | #include "board-cardhu.h" | ||
40 | #include "pm.h" | ||
41 | #include "wakeups-t3.h" | ||
42 | |||
43 | #define PMC_CTRL 0x0 | ||
44 | #define PMC_CTRL_INTR_LOW BIT(17) | ||
45 | |||
46 | static struct regulator_consumer_supply max77663_sd0_supply[] = { | ||
47 | REGULATOR_SUPPLY("vdd_cpu_pmu", NULL), | ||
48 | REGULATOR_SUPPLY("vdd_cpu", NULL), | ||
49 | REGULATOR_SUPPLY("vdd_sys", NULL), | ||
50 | }; | ||
51 | |||
52 | static struct regulator_consumer_supply max77663_sd1_supply[] = { | ||
53 | REGULATOR_SUPPLY("vdd_core", NULL), | ||
54 | REGULATOR_SUPPLY("en_vddio_ddr_1v2", NULL), | ||
55 | }; | ||
56 | |||
57 | static struct regulator_consumer_supply max77663_sd2_supply[] = { | ||
58 | REGULATOR_SUPPLY("avdd_hdmi_pll", NULL), | ||
59 | REGULATOR_SUPPLY("avdd_usb_pll", NULL), | ||
60 | REGULATOR_SUPPLY("avdd_osc", NULL), | ||
61 | REGULATOR_SUPPLY("vdd1v8_satelite", NULL), | ||
62 | REGULATOR_SUPPLY("vddio_uart", NULL), | ||
63 | REGULATOR_SUPPLY("pwrdet_uart", NULL), | ||
64 | REGULATOR_SUPPLY("vddio_audio", NULL), | ||
65 | REGULATOR_SUPPLY("pwrdet_audio", NULL), | ||
66 | REGULATOR_SUPPLY("vddio_bb", NULL), | ||
67 | REGULATOR_SUPPLY("pwrdet_bb", NULL), | ||
68 | REGULATOR_SUPPLY("vddio_lcd_pmu", NULL), | ||
69 | REGULATOR_SUPPLY("pwrdet_lcd", NULL), | ||
70 | REGULATOR_SUPPLY("vddio_cam", NULL), | ||
71 | REGULATOR_SUPPLY("pwrdet_cam", NULL), | ||
72 | REGULATOR_SUPPLY("vddio_vi", NULL), | ||
73 | REGULATOR_SUPPLY("pwrdet_vi", NULL), | ||
74 | REGULATOR_SUPPLY("ldo6", NULL), | ||
75 | REGULATOR_SUPPLY("ldo7", NULL), | ||
76 | REGULATOR_SUPPLY("ldo8", NULL), | ||
77 | REGULATOR_SUPPLY("vcore_audio", NULL), | ||
78 | REGULATOR_SUPPLY("avcore_audio", NULL), | ||
79 | REGULATOR_SUPPLY("vddio_sdmmc", "sdhci-tegra.2"), | ||
80 | REGULATOR_SUPPLY("pwrdet_sdmmc3", NULL), | ||
81 | REGULATOR_SUPPLY("vcore1_lpddr2", NULL), | ||
82 | REGULATOR_SUPPLY("vcom_1v8", NULL), | ||
83 | REGULATOR_SUPPLY("pmuio_1v8", NULL), | ||
84 | REGULATOR_SUPPLY("avdd_ic_usb", NULL), | ||
85 | REGULATOR_SUPPLY("vdd_gen1v8", NULL), | ||
86 | }; | ||
87 | |||
88 | static struct regulator_consumer_supply max77663_sd3_supply[] = { | ||
89 | REGULATOR_SUPPLY("vdd_gen1v5", NULL), | ||
90 | REGULATOR_SUPPLY("vcore_lcd", NULL), | ||
91 | REGULATOR_SUPPLY("track_ldo1", NULL), | ||
92 | REGULATOR_SUPPLY("external_ldo_1v2", NULL), | ||
93 | REGULATOR_SUPPLY("vcore_cam1", NULL), | ||
94 | REGULATOR_SUPPLY("vcore_cam2", NULL), | ||
95 | REGULATOR_SUPPLY("avdd_pexb", NULL), | ||
96 | REGULATOR_SUPPLY("vdd_pexb", NULL), | ||
97 | REGULATOR_SUPPLY("avdd_pex_pll", NULL), | ||
98 | REGULATOR_SUPPLY("avdd_pexa", NULL), | ||
99 | REGULATOR_SUPPLY("vdd_pexa", NULL), | ||
100 | REGULATOR_SUPPLY("vcom_1v2", NULL), | ||
101 | REGULATOR_SUPPLY("vdio_hsic", NULL), | ||
102 | }; | ||
103 | |||
104 | static struct regulator_consumer_supply max77663_ldo0_supply[] = { | ||
105 | REGULATOR_SUPPLY("vdd_ddr_hs", NULL), | ||
106 | }; | ||
107 | |||
108 | static struct regulator_consumer_supply max77663_ldo1_supply[] = { | ||
109 | REGULATOR_SUPPLY("avdd_plla_p_c_s", NULL), | ||
110 | REGULATOR_SUPPLY("avdd_pllm", NULL), | ||
111 | REGULATOR_SUPPLY("avdd_pllu_d", NULL), | ||
112 | REGULATOR_SUPPLY("avdd_pllu_d2", NULL), | ||
113 | REGULATOR_SUPPLY("avdd_pllx", NULL), | ||
114 | }; | ||
115 | |||
116 | static struct regulator_consumer_supply max77663_ldo2_supply[] = { | ||
117 | REGULATOR_SUPPLY("avdd_dsi_csi", NULL), | ||
118 | REGULATOR_SUPPLY("pwrdet_mipi", NULL), | ||
119 | }; | ||
120 | |||
121 | static struct regulator_consumer_supply max77663_ldo3_supply[] = { | ||
122 | REGULATOR_SUPPLY("vddio_sdmmc", "sdhci-tegra.3"), | ||
123 | REGULATOR_SUPPLY("pwrdet_sdmmc4", NULL), | ||
124 | }; | ||
125 | |||
126 | static struct regulator_consumer_supply max77663_ldo4_supply[] = { | ||
127 | REGULATOR_SUPPLY("vdd_rtc", NULL), | ||
128 | }; | ||
129 | |||
130 | static struct regulator_consumer_supply max77663_ldo5_supply[] = { | ||
131 | REGULATOR_SUPPLY("vddio_sdmmc", "sdhci-tegra.0"), | ||
132 | REGULATOR_SUPPLY("pwrdet_sdmmc1", NULL), | ||
133 | }; | ||
134 | |||
135 | static struct regulator_consumer_supply max77663_ldo6_supply[] = { | ||
136 | REGULATOR_SUPPLY("vddio_sys", NULL), | ||
137 | }; | ||
138 | |||
139 | static struct regulator_consumer_supply max77663_ldo7_supply[] = { | ||
140 | REGULATOR_SUPPLY("unused_ldo7", NULL), | ||
141 | }; | ||
142 | |||
143 | static struct regulator_consumer_supply max77663_ldo8_supply[] = { | ||
144 | REGULATOR_SUPPLY("vcore_mmc", NULL), | ||
145 | }; | ||
146 | |||
147 | static struct max77663_regulator_fps_cfg max77663_fps_cfgs[] = { | ||
148 | { | ||
149 | .src = FPS_SRC_0, | ||
150 | .en_src = FPS_EN_SRC_EN0, | ||
151 | .time_period = FPS_TIME_PERIOD_DEF, | ||
152 | }, | ||
153 | { | ||
154 | .src = FPS_SRC_1, | ||
155 | .en_src = FPS_EN_SRC_EN1, | ||
156 | .time_period = FPS_TIME_PERIOD_DEF, | ||
157 | }, | ||
158 | { | ||
159 | .src = FPS_SRC_2, | ||
160 | .en_src = FPS_EN_SRC_EN0, | ||
161 | .time_period = FPS_TIME_PERIOD_DEF, | ||
162 | }, | ||
163 | }; | ||
164 | |||
165 | #define MAX77663_PDATA_INIT(_id, _min_uV, _max_uV, _supply_reg, \ | ||
166 | _always_on, _boot_on, _apply_uV, \ | ||
167 | _init_apply, _init_enable, _init_uV, \ | ||
168 | _fps_src, _fps_pu_period, _fps_pd_period, _flags) \ | ||
169 | static struct max77663_regulator_platform_data max77663_regulator_pdata_##_id = \ | ||
170 | { \ | ||
171 | .init_data = { \ | ||
172 | .constraints = { \ | ||
173 | .min_uV = _min_uV, \ | ||
174 | .max_uV = _max_uV, \ | ||
175 | .valid_modes_mask = (REGULATOR_MODE_NORMAL | \ | ||
176 | REGULATOR_MODE_STANDBY), \ | ||
177 | .valid_ops_mask = (REGULATOR_CHANGE_MODE | \ | ||
178 | REGULATOR_CHANGE_STATUS | \ | ||
179 | REGULATOR_CHANGE_VOLTAGE), \ | ||
180 | .always_on = _always_on, \ | ||
181 | .boot_on = _boot_on, \ | ||
182 | .apply_uV = _apply_uV, \ | ||
183 | }, \ | ||
184 | .num_consumer_supplies = \ | ||
185 | ARRAY_SIZE(max77663_##_id##_supply), \ | ||
186 | .consumer_supplies = max77663_##_id##_supply, \ | ||
187 | .supply_regulator = _supply_reg, \ | ||
188 | }, \ | ||
189 | .init_apply = _init_apply, \ | ||
190 | .init_enable = _init_enable, \ | ||
191 | .init_uV = _init_uV, \ | ||
192 | .fps_src = _fps_src, \ | ||
193 | .fps_pu_period = _fps_pu_period, \ | ||
194 | .fps_pd_period = _fps_pd_period, \ | ||
195 | .fps_cfgs = max77663_fps_cfgs, \ | ||
196 | .flags = _flags, \ | ||
197 | } | ||
198 | |||
199 | MAX77663_PDATA_INIT(sd0, 600000, 3387500, NULL, 1, 0, 0, | ||
200 | 0, 0, -1, FPS_SRC_NONE, -1, -1, EN2_CTRL_SD0 | SD_FSRADE_DISABLE); | ||
201 | |||
202 | MAX77663_PDATA_INIT(sd1, 800000, 1587500, NULL, 1, 0, 0, | ||
203 | 1, 1, -1, FPS_SRC_1, -1, -1, SD_FSRADE_DISABLE); | ||
204 | |||
205 | MAX77663_PDATA_INIT(sd2, 600000, 3387500, NULL, 1, 0, 0, | ||
206 | 1, 1, -1, FPS_SRC_NONE, -1, -1, 0); | ||
207 | |||
208 | MAX77663_PDATA_INIT(sd3, 600000, 3387500, NULL, 0, 0, 0, | ||
209 | 1, 1, -1, FPS_SRC_NONE, -1, -1, 0); | ||
210 | |||
211 | MAX77663_PDATA_INIT(ldo0, 800000, 2350000, max77663_rails(sd2), 0, 0, 0, | ||
212 | 1, 1, -1, FPS_SRC_NONE, -1, -1, 0); | ||
213 | |||
214 | MAX77663_PDATA_INIT(ldo1, 800000, 2350000, max77663_rails(sd2), 0, 0, 0, | ||
215 | 1, 1, -1, FPS_SRC_NONE, -1, -1, 0); | ||
216 | |||
217 | MAX77663_PDATA_INIT(ldo2, 800000, 3950000, max77663_rails(sd2), 0, 0, 0, | ||
218 | 0, 0, -1, FPS_SRC_NONE, -1, -1, 0); | ||
219 | |||
220 | MAX77663_PDATA_INIT(ldo3, 800000, 3950000, NULL, 0, 0, 0, | ||
221 | 1, 1, -1, FPS_SRC_NONE, -1, -1, 0); | ||
222 | |||
223 | MAX77663_PDATA_INIT(ldo4, 800000, 1587500, NULL, 0, 0, 0, | ||
224 | 1, 1, -1, FPS_SRC_NONE, -1, -1, 0); | ||
225 | |||
226 | MAX77663_PDATA_INIT(ldo5, 800000, 3950000, NULL, 0, 0, 0, | ||
227 | 0, 0, -1, FPS_SRC_NONE, -1, -1, 0); | ||
228 | |||
229 | MAX77663_PDATA_INIT(ldo6, 800000, 3950000, NULL, 1, 0, 0, | ||
230 | 1, 1, -1, FPS_SRC_NONE, -1, -1, 0); | ||
231 | |||
232 | MAX77663_PDATA_INIT(ldo7, 800000, 3950000, NULL, 0, 0, 0, | ||
233 | 0, 0, -1, FPS_SRC_NONE, -1, -1, 0); | ||
234 | |||
235 | MAX77663_PDATA_INIT(ldo8, 800000, 3950000, NULL, 0, 0, 0, | ||
236 | 1, 1, -1, FPS_SRC_NONE, -1, -1, 0); | ||
237 | |||
238 | #define MAX77663_REG(_id, _data) \ | ||
239 | { \ | ||
240 | .name = "max77663-regulator", \ | ||
241 | .id = MAX77663_REGULATOR_ID_##_id, \ | ||
242 | .platform_data = &max77663_regulator_pdata_##_data, \ | ||
243 | .pdata_size = sizeof(max77663_regulator_pdata_##_data), \ | ||
244 | } | ||
245 | |||
246 | #define MAX77663_RTC() \ | ||
247 | { \ | ||
248 | .name = "max77663-rtc", \ | ||
249 | .id = 0, \ | ||
250 | } | ||
251 | |||
252 | static struct mfd_cell max77663_subdevs[] = { | ||
253 | MAX77663_REG(SD0, sd0), | ||
254 | MAX77663_REG(SD1, sd1), | ||
255 | MAX77663_REG(SD2, sd2), | ||
256 | MAX77663_REG(SD3, sd3), | ||
257 | MAX77663_REG(LDO0, ldo0), | ||
258 | MAX77663_REG(LDO1, ldo1), | ||
259 | MAX77663_REG(LDO2, ldo2), | ||
260 | MAX77663_REG(LDO3, ldo3), | ||
261 | MAX77663_REG(LDO4, ldo4), | ||
262 | MAX77663_REG(LDO5, ldo5), | ||
263 | MAX77663_REG(LDO6, ldo6), | ||
264 | MAX77663_REG(LDO7, ldo7), | ||
265 | MAX77663_REG(LDO8, ldo8), | ||
266 | MAX77663_RTC(), | ||
267 | }; | ||
268 | |||
269 | struct max77663_gpio_config max77663_gpio_cfgs[] = { | ||
270 | { | ||
271 | .gpio = MAX77663_GPIO0, | ||
272 | .dir = GPIO_DIR_OUT, | ||
273 | .dout = GPIO_DOUT_LOW, | ||
274 | .out_drv = GPIO_OUT_DRV_PUSH_PULL, | ||
275 | .alternate = GPIO_ALT_DISABLE, | ||
276 | }, | ||
277 | { | ||
278 | .gpio = MAX77663_GPIO1, | ||
279 | .dir = GPIO_DIR_OUT, | ||
280 | .dout = GPIO_DOUT_HIGH, | ||
281 | .out_drv = GPIO_OUT_DRV_OPEN_DRAIN, | ||
282 | .alternate = GPIO_ALT_DISABLE, | ||
283 | }, | ||
284 | { | ||
285 | .gpio = MAX77663_GPIO2, | ||
286 | .dir = GPIO_DIR_OUT, | ||
287 | .dout = GPIO_DOUT_HIGH, | ||
288 | .out_drv = GPIO_OUT_DRV_OPEN_DRAIN, | ||
289 | .alternate = GPIO_ALT_DISABLE, | ||
290 | }, | ||
291 | { | ||
292 | .gpio = MAX77663_GPIO3, | ||
293 | .dir = GPIO_DIR_OUT, | ||
294 | .dout = GPIO_DOUT_HIGH, | ||
295 | .out_drv = GPIO_OUT_DRV_OPEN_DRAIN, | ||
296 | .alternate = GPIO_ALT_DISABLE, | ||
297 | }, | ||
298 | { | ||
299 | .gpio = MAX77663_GPIO4, | ||
300 | .out_drv = GPIO_OUT_DRV_PUSH_PULL, | ||
301 | .alternate = GPIO_ALT_ENABLE, | ||
302 | }, | ||
303 | { | ||
304 | .gpio = MAX77663_GPIO5, | ||
305 | .dir = GPIO_DIR_OUT, | ||
306 | .dout = GPIO_DOUT_LOW, | ||
307 | .out_drv = GPIO_OUT_DRV_PUSH_PULL, | ||
308 | .alternate = GPIO_ALT_DISABLE, | ||
309 | }, | ||
310 | { | ||
311 | .gpio = MAX77663_GPIO6, | ||
312 | .dir = GPIO_DIR_OUT, | ||
313 | .dout = GPIO_DOUT_LOW, | ||
314 | .out_drv = GPIO_OUT_DRV_PUSH_PULL, | ||
315 | .alternate = GPIO_ALT_DISABLE, | ||
316 | }, | ||
317 | { | ||
318 | .gpio = MAX77663_GPIO7, | ||
319 | .dir = GPIO_DIR_OUT, | ||
320 | .dout = GPIO_DOUT_LOW, | ||
321 | .out_drv = GPIO_OUT_DRV_PUSH_PULL, | ||
322 | .alternate = GPIO_ALT_DISABLE, | ||
323 | }, | ||
324 | }; | ||
325 | |||
326 | static struct max77663_platform_data max7763_pdata = { | ||
327 | .irq_base = MAX77663_IRQ_BASE, | ||
328 | .gpio_base = MAX77663_GPIO_BASE, | ||
329 | |||
330 | .num_gpio_cfgs = ARRAY_SIZE(max77663_gpio_cfgs), | ||
331 | .gpio_cfgs = max77663_gpio_cfgs, | ||
332 | |||
333 | .num_subdevs = ARRAY_SIZE(max77663_subdevs), | ||
334 | .sub_devices = max77663_subdevs, | ||
335 | |||
336 | .use_power_off = true, | ||
337 | }; | ||
338 | |||
339 | static struct i2c_board_info __initdata max77663_regulators[] = { | ||
340 | { | ||
341 | /* The I2C address was determined by OTP factory setting */ | ||
342 | I2C_BOARD_INFO("max77663", 0x1C), | ||
343 | .irq = INT_EXTERNAL_PMU, | ||
344 | .platform_data = &max7763_pdata, | ||
345 | }, | ||
346 | }; | ||
347 | |||
348 | int __init cardhu_pm298_regulator_init(void) | ||
349 | { | ||
350 | struct board_info board_info; | ||
351 | struct board_info pmu_board_info; | ||
352 | void __iomem *pmc = IO_ADDRESS(TEGRA_PMC_BASE); | ||
353 | u32 pmc_ctrl; | ||
354 | |||
355 | /* configure the power management controller to trigger PMU | ||
356 | * interrupts when low */ | ||
357 | pmc_ctrl = readl(pmc + PMC_CTRL); | ||
358 | writel(pmc_ctrl | PMC_CTRL_INTR_LOW, pmc + PMC_CTRL); | ||
359 | |||
360 | /* The regulator details have complete constraints */ | ||
361 | tegra_get_board_info(&board_info); | ||
362 | tegra_get_pmu_board_info(&pmu_board_info); | ||
363 | if (pmu_board_info.board_id != BOARD_PMU_PM298) { | ||
364 | pr_err("%s(): Board ID is not proper\n", __func__); | ||
365 | return -ENODEV; | ||
366 | } | ||
367 | |||
368 | i2c_register_board_info(4, max77663_regulators, | ||
369 | ARRAY_SIZE(max77663_regulators)); | ||
370 | |||
371 | return 0; | ||
372 | } | ||
373 | |||
374 | static struct regulator_consumer_supply fixed_reg_en_track_ldo2_supply[] = { | ||
375 | REGULATOR_SUPPLY("avdd_sata", NULL), | ||
376 | REGULATOR_SUPPLY("vdd_sata", NULL), | ||
377 | REGULATOR_SUPPLY("avdd_sata_pll", NULL), | ||
378 | REGULATOR_SUPPLY("avdd_plle", NULL), | ||
379 | }; | ||
380 | |||
381 | static struct regulator_consumer_supply fixed_reg_en_5v0_supply[] = { | ||
382 | REGULATOR_SUPPLY("vdd_5v0_sys", NULL), | ||
383 | REGULATOR_SUPPLY("vdd_5v0_sby", NULL), | ||
384 | REGULATOR_SUPPLY("vdd_hall", NULL), | ||
385 | REGULATOR_SUPPLY("vterm_ddr", NULL), | ||
386 | REGULATOR_SUPPLY("v2ref_ddr", NULL), | ||
387 | }; | ||
388 | |||
389 | static struct regulator_consumer_supply fixed_reg_en_ddr_supply[] = { | ||
390 | REGULATOR_SUPPLY("mem_vddio_ddr", NULL), | ||
391 | REGULATOR_SUPPLY("t30_vddio_ddr", NULL), | ||
392 | }; | ||
393 | |||
394 | static struct regulator_consumer_supply fixed_reg_en_3v3_sys_supply[] = { | ||
395 | REGULATOR_SUPPLY("avdd_vdac", NULL), | ||
396 | REGULATOR_SUPPLY("vdd_lvds", NULL), | ||
397 | REGULATOR_SUPPLY("vdd_pnl", NULL), | ||
398 | REGULATOR_SUPPLY("vcom_3v3", NULL), | ||
399 | REGULATOR_SUPPLY("vdd_3v3", NULL), | ||
400 | REGULATOR_SUPPLY("vddio_pex_ctl", NULL), | ||
401 | REGULATOR_SUPPLY("pwrdet_pex_ctl", NULL), | ||
402 | REGULATOR_SUPPLY("hvdd_pex_pmu", NULL), | ||
403 | REGULATOR_SUPPLY("avdd_hdmi", NULL), | ||
404 | REGULATOR_SUPPLY("vpp_fuse", NULL), | ||
405 | REGULATOR_SUPPLY("avdd_usb", NULL), | ||
406 | REGULATOR_SUPPLY("vdd_ddr_rx", NULL), | ||
407 | REGULATOR_SUPPLY("vcore_nand", NULL), | ||
408 | REGULATOR_SUPPLY("hvdd_sata", NULL), | ||
409 | REGULATOR_SUPPLY("vddio_gmi_pmu", NULL), | ||
410 | REGULATOR_SUPPLY("pwrdet_nand", NULL), | ||
411 | REGULATOR_SUPPLY("avdd_cam1", NULL), | ||
412 | REGULATOR_SUPPLY("vdd_af", NULL), | ||
413 | REGULATOR_SUPPLY("avdd_cam2", NULL), | ||
414 | REGULATOR_SUPPLY("vdd_acc", NULL), | ||
415 | REGULATOR_SUPPLY("vdd_phtl", NULL), | ||
416 | REGULATOR_SUPPLY("vddio_tp", NULL), | ||
417 | REGULATOR_SUPPLY("vdd_led", NULL), | ||
418 | REGULATOR_SUPPLY("vddio_cec", NULL), | ||
419 | REGULATOR_SUPPLY("vdd_cmps", NULL), | ||
420 | REGULATOR_SUPPLY("vdd_temp", NULL), | ||
421 | REGULATOR_SUPPLY("vpp_kfuse", NULL), | ||
422 | REGULATOR_SUPPLY("vddio_ts", NULL), | ||
423 | REGULATOR_SUPPLY("vdd_ir_led", NULL), | ||
424 | REGULATOR_SUPPLY("vddio_1wire", NULL), | ||
425 | REGULATOR_SUPPLY("avddio_audio", NULL), | ||
426 | REGULATOR_SUPPLY("vdd_ec", NULL), | ||
427 | REGULATOR_SUPPLY("vcom_pa", NULL), | ||
428 | REGULATOR_SUPPLY("vdd_3v3_devices", NULL), | ||
429 | REGULATOR_SUPPLY("vdd_3v3_dock", NULL), | ||
430 | REGULATOR_SUPPLY("vdd_3v3_edid", NULL), | ||
431 | REGULATOR_SUPPLY("vdd_3v3_hdmi_cec", NULL), | ||
432 | REGULATOR_SUPPLY("vdd_3v3_gmi", NULL), | ||
433 | REGULATOR_SUPPLY("vdd_3v3_spk_amp", NULL), | ||
434 | REGULATOR_SUPPLY("vdd_3v3_sensor", NULL), | ||
435 | REGULATOR_SUPPLY("vdd_3v3_cam", NULL), | ||
436 | REGULATOR_SUPPLY("vdd_3v3_als", NULL), | ||
437 | REGULATOR_SUPPLY("debug_cons", NULL), | ||
438 | REGULATOR_SUPPLY("vdd", "4-004c"), | ||
439 | }; | ||
440 | |||
441 | /* DIS_5V_SWITCH from AP SPI2_SCK X02 */ | ||
442 | static struct regulator_consumer_supply fixed_reg_dis_5v_switch_supply[] = { | ||
443 | REGULATOR_SUPPLY("master_5v_switch", NULL), | ||
444 | }; | ||
445 | |||
446 | /* EN_VDD_BL */ | ||
447 | static struct regulator_consumer_supply fixed_reg_en_vdd_bl_supply[] = { | ||
448 | REGULATOR_SUPPLY("vdd_backlight", NULL), | ||
449 | REGULATOR_SUPPLY("vdd_backlight1", NULL), | ||
450 | }; | ||
451 | |||
452 | /* EN_3V3_MODEM from AP GPIO VI_VSYNCH D06*/ | ||
453 | static struct regulator_consumer_supply fixed_reg_en_3v3_modem_supply[] = { | ||
454 | REGULATOR_SUPPLY("vdd_3v3_mini_card", NULL), | ||
455 | REGULATOR_SUPPLY("vdd_mini_card", NULL), | ||
456 | }; | ||
457 | /* EN_VDD_PNL1 from AP GPIO VI_D6 L04*/ | ||
458 | static struct regulator_consumer_supply fixed_reg_en_vdd_pnl1_supply[] = { | ||
459 | REGULATOR_SUPPLY("vdd_lcd_panel", NULL), | ||
460 | }; | ||
461 | |||
462 | /* CAM1_LDO_EN from AP GPIO KB_ROW6 R06*/ | ||
463 | static struct regulator_consumer_supply fixed_reg_cam1_ldo_en_supply[] = { | ||
464 | REGULATOR_SUPPLY("vdd_2v8_cam1", NULL), | ||
465 | REGULATOR_SUPPLY("vdd", "6-0072"), | ||
466 | }; | ||
467 | |||
468 | /* CAM2_LDO_EN from AP GPIO KB_ROW7 R07*/ | ||
469 | static struct regulator_consumer_supply fixed_reg_cam2_ldo_en_supply[] = { | ||
470 | REGULATOR_SUPPLY("vdd_2v8_cam2", NULL), | ||
471 | REGULATOR_SUPPLY("vdd", "7-0072"), | ||
472 | }; | ||
473 | |||
474 | /* CAM3_LDO_EN from AP GPIO KB_ROW8 S00*/ | ||
475 | static struct regulator_consumer_supply fixed_reg_cam3_ldo_en_supply[] = { | ||
476 | REGULATOR_SUPPLY("vdd_cam3", NULL), | ||
477 | }; | ||
478 | |||
479 | /* EN_VDD_COM from AP GPIO SDMMC3_DAT5 D00*/ | ||
480 | static struct regulator_consumer_supply fixed_reg_en_vdd_com_supply[] = { | ||
481 | REGULATOR_SUPPLY("vdd_com_bd", NULL), | ||
482 | }; | ||
483 | |||
484 | /* EN_VDD_SDMMC1 from AP GPIO VI_HSYNC D07*/ | ||
485 | static struct regulator_consumer_supply fixed_reg_en_vdd_sdmmc1_supply[] = { | ||
486 | REGULATOR_SUPPLY("vddio_sd_slot", "sdhci-tegra.0"), | ||
487 | }; | ||
488 | |||
489 | /* EN_3V3_EMMC from AP GPIO SDMMC3_DAT4 D01*/ | ||
490 | static struct regulator_consumer_supply fixed_reg_en_3v3_emmc_supply[] = { | ||
491 | REGULATOR_SUPPLY("vdd_emmc_core", NULL), | ||
492 | }; | ||
493 | |||
494 | /* EN_3V3_PEX_HVDD from AP GPIO VI_D09 L07*/ | ||
495 | static struct regulator_consumer_supply fixed_reg_en_3v3_pex_hvdd_supply[] = { | ||
496 | REGULATOR_SUPPLY("hvdd_pex", NULL), | ||
497 | }; | ||
498 | |||
499 | /* EN_3v3_FUSE from AP GPIO VI_D08 L06*/ | ||
500 | static struct regulator_consumer_supply fixed_reg_en_3v3_fuse_supply[] = { | ||
501 | REGULATOR_SUPPLY("vdd_fuse", NULL), | ||
502 | }; | ||
503 | |||
504 | /* EN_1V8_CAM from AP GPIO GPIO_PBB4 PBB04*/ | ||
505 | static struct regulator_consumer_supply fixed_reg_en_1v8_cam_supply[] = { | ||
506 | REGULATOR_SUPPLY("vdd_1v8_cam1", NULL), | ||
507 | REGULATOR_SUPPLY("vdd_1v8_cam2", NULL), | ||
508 | REGULATOR_SUPPLY("vdd_1v8_cam3", NULL), | ||
509 | REGULATOR_SUPPLY("vdd_i2c", "6-0072"), | ||
510 | REGULATOR_SUPPLY("vdd_i2c", "7-0072"), | ||
511 | REGULATOR_SUPPLY("vdd_i2c", "2-0033"), | ||
512 | }; | ||
513 | |||
514 | static struct regulator_consumer_supply fixed_reg_en_vbrtr_supply[] = { | ||
515 | REGULATOR_SUPPLY("vdd_vbrtr", NULL), | ||
516 | }; | ||
517 | |||
518 | |||
519 | /* EN_USB1_VBUS_OC*/ | ||
520 | static struct regulator_consumer_supply gpio_switch_en_usb1_vbus_oc_supply[] = { | ||
521 | REGULATOR_SUPPLY("vdd_vbus_micro_usb", NULL), | ||
522 | }; | ||
523 | static int gpio_switch_en_usb1_vbus_oc_voltages[] = { 5000}; | ||
524 | |||
525 | /*EN_USB3_VBUS_OC*/ | ||
526 | static struct regulator_consumer_supply gpio_switch_en_usb3_vbus_oc_supply[] = { | ||
527 | REGULATOR_SUPPLY("vdd_vbus_typea_usb", NULL), | ||
528 | }; | ||
529 | static int gpio_switch_en_usb3_vbus_oc_voltages[] = { 5000}; | ||
530 | |||
531 | /* EN_VDDIO_VID_OC from AP GPIO VI_PCLK T00*/ | ||
532 | static struct regulator_consumer_supply gpio_switch_en_vddio_vid_oc_supply[] = { | ||
533 | REGULATOR_SUPPLY("vdd_hdmi_con", NULL), | ||
534 | }; | ||
535 | static int gpio_switch_en_vddio_vid_oc_voltages[] = { 5000}; | ||
536 | |||
537 | |||
538 | static int enable_load_switch_rail( | ||
539 | struct gpio_switch_regulator_subdev_data *psubdev_data) | ||
540 | { | ||
541 | int ret; | ||
542 | |||
543 | if (psubdev_data->pin_group <= 0) | ||
544 | return -EINVAL; | ||
545 | |||
546 | /* Tristate and make pin as input*/ | ||
547 | ret = tegra_pinmux_set_tristate(psubdev_data->pin_group, | ||
548 | TEGRA_TRI_TRISTATE); | ||
549 | if (ret < 0) | ||
550 | return ret; | ||
551 | return gpio_direction_input(psubdev_data->gpio_nr); | ||
552 | } | ||
553 | |||
554 | static int disable_load_switch_rail( | ||
555 | struct gpio_switch_regulator_subdev_data *psubdev_data) | ||
556 | { | ||
557 | int ret; | ||
558 | |||
559 | if (psubdev_data->pin_group <= 0) | ||
560 | return -EINVAL; | ||
561 | |||
562 | /* Un-tristate and driver low */ | ||
563 | ret = tegra_pinmux_set_tristate(psubdev_data->pin_group, | ||
564 | TEGRA_TRI_NORMAL); | ||
565 | if (ret < 0) | ||
566 | return ret; | ||
567 | return gpio_direction_output(psubdev_data->gpio_nr, 0); | ||
568 | } | ||
569 | |||
570 | /* Macro for defining gpio switch regulator sub device data */ | ||
571 | #define GREG_INIT(_id, _var, _name, _input_supply, _always_on, _boot_on, \ | ||
572 | _gpio_nr, _active_low, _init_state, _pg, _enable, _disable) \ | ||
573 | static struct gpio_switch_regulator_subdev_data gpio_pdata_##_var = \ | ||
574 | { \ | ||
575 | .regulator_name = "gpio-switch-"#_name, \ | ||
576 | .input_supply = _input_supply, \ | ||
577 | .id = _id, \ | ||
578 | .gpio_nr = _gpio_nr, \ | ||
579 | .pin_group = _pg, \ | ||
580 | .active_low = _active_low, \ | ||
581 | .init_state = _init_state, \ | ||
582 | .voltages = gpio_switch_##_name##_voltages, \ | ||
583 | .n_voltages = ARRAY_SIZE(gpio_switch_##_name##_voltages), \ | ||
584 | .num_consumer_supplies = \ | ||
585 | ARRAY_SIZE(gpio_switch_##_name##_supply), \ | ||
586 | .consumer_supplies = gpio_switch_##_name##_supply, \ | ||
587 | .constraints = { \ | ||
588 | .valid_modes_mask = (REGULATOR_MODE_NORMAL | \ | ||
589 | REGULATOR_MODE_STANDBY), \ | ||
590 | .valid_ops_mask = (REGULATOR_CHANGE_MODE | \ | ||
591 | REGULATOR_CHANGE_STATUS | \ | ||
592 | REGULATOR_CHANGE_VOLTAGE), \ | ||
593 | .always_on = _always_on, \ | ||
594 | .boot_on = _boot_on, \ | ||
595 | }, \ | ||
596 | .enable_rail = _enable, \ | ||
597 | .disable_rail = _disable, \ | ||
598 | }; \ | ||
599 | static struct gpio_switch_regulator_subdev_data \ | ||
600 | *gpio_pdata_##_var##_list[] = { \ | ||
601 | &gpio_pdata_##_var, \ | ||
602 | }; \ | ||
603 | static struct gpio_switch_regulator_platform_data gs_##_var##_pdata = \ | ||
604 | { \ | ||
605 | .num_subdevs = 1, \ | ||
606 | .subdevs = gpio_pdata_##_var##_list, \ | ||
607 | }; \ | ||
608 | static struct platform_device gswitch_reg_##_var##_dev = { \ | ||
609 | .name = "gpio-switch-regulator", \ | ||
610 | .id = _id, \ | ||
611 | .dev = { \ | ||
612 | .platform_data = &gs_##_var##_pdata, \ | ||
613 | }, \ | ||
614 | } | ||
615 | |||
616 | /* Macro for defining fixed regulator sub device data */ | ||
617 | #define FIXED_SUPPLY(_name) "fixed_reg_"#_name | ||
618 | #define FIXED_REG(_id, _var, _name, _in_supply, _always_on, _boot_on, \ | ||
619 | _gpio_nr, _active_high, _boot_state, _millivolts) \ | ||
620 | static struct regulator_init_data ri_data_##_var = \ | ||
621 | { \ | ||
622 | .supply_regulator = _in_supply, \ | ||
623 | .num_consumer_supplies = \ | ||
624 | ARRAY_SIZE(fixed_reg_##_name##_supply), \ | ||
625 | .consumer_supplies = fixed_reg_##_name##_supply, \ | ||
626 | .constraints = { \ | ||
627 | .valid_modes_mask = (REGULATOR_MODE_NORMAL | \ | ||
628 | REGULATOR_MODE_STANDBY), \ | ||
629 | .valid_ops_mask = (REGULATOR_CHANGE_MODE | \ | ||
630 | REGULATOR_CHANGE_STATUS | \ | ||
631 | REGULATOR_CHANGE_VOLTAGE), \ | ||
632 | .always_on = _always_on, \ | ||
633 | .boot_on = _boot_on, \ | ||
634 | }, \ | ||
635 | }; \ | ||
636 | static struct fixed_voltage_config fixed_reg_##_var##_pdata = \ | ||
637 | { \ | ||
638 | .supply_name = FIXED_SUPPLY(_name), \ | ||
639 | .microvolts = _millivolts * 1000, \ | ||
640 | .gpio = _gpio_nr, \ | ||
641 | .enable_high = _active_high, \ | ||
642 | .enabled_at_boot = _boot_state, \ | ||
643 | .init_data = &ri_data_##_var, \ | ||
644 | }; \ | ||
645 | static struct platform_device fixed_reg_##_var##_dev = { \ | ||
646 | .name = "reg-fixed-voltage", \ | ||
647 | .id = _id, \ | ||
648 | .dev = { \ | ||
649 | .platform_data = &fixed_reg_##_var##_pdata, \ | ||
650 | }, \ | ||
651 | } | ||
652 | |||
653 | /* common to most of boards*/ | ||
654 | FIXED_REG(0, en_track_ldo2, en_track_ldo2, NULL, 0, 0, MAX77663_GPIO_BASE + MAX77663_GPIO0, true, 0, 3300); | ||
655 | FIXED_REG(1, en_5v0, en_5v0, NULL, 1, 0, MAX77663_GPIO_BASE + MAX77663_GPIO2, true, 1, 5000); | ||
656 | FIXED_REG(2, en_ddr, en_ddr, NULL, 1, 0, MAX77663_GPIO_BASE + MAX77663_GPIO3, true, 1, 1500); | ||
657 | FIXED_REG(3, en_3v3_sys, en_3v3_sys, NULL, 1, 0, MAX77663_GPIO_BASE + MAX77663_GPIO1, true, 1, 3300); | ||
658 | FIXED_REG(4, en_vdd_bl, en_vdd_bl, NULL, 0, 0, TEGRA_GPIO_PK3, true, 1, 5000); | ||
659 | FIXED_REG(5, en_3v3_modem, en_3v3_modem, NULL, 1, 0, TEGRA_GPIO_PD6, true, 1, 3300); | ||
660 | FIXED_REG(6, en_vdd_pnl1, en_vdd_pnl1, FIXED_SUPPLY(en_3v3_sys), 0, 0, TEGRA_GPIO_PL4, true, 1, 3300); | ||
661 | FIXED_REG(7, cam3_ldo_en, cam3_ldo_en, FIXED_SUPPLY(en_3v3_sys), 0, 0, TEGRA_GPIO_PS0, true, 0, 3300); | ||
662 | FIXED_REG(8, en_vdd_com, en_vdd_com, FIXED_SUPPLY(en_3v3_sys), 1, 0, TEGRA_GPIO_PD0, true, 1, 3300); | ||
663 | FIXED_REG(9, en_3v3_fuse, en_3v3_fuse, FIXED_SUPPLY(en_3v3_sys), 0, 0, TEGRA_GPIO_PL6, true, 0, 3300); | ||
664 | FIXED_REG(10, en_3v3_emmc, en_3v3_emmc, FIXED_SUPPLY(en_3v3_sys), 1, 0, TEGRA_GPIO_PD1, true, 1, 3300); | ||
665 | FIXED_REG(11, en_vdd_sdmmc1, en_vdd_sdmmc1, FIXED_SUPPLY(en_3v3_sys), 0, 0, TEGRA_GPIO_PD7, true, 1, 3300); | ||
666 | FIXED_REG(12, en_3v3_pex_hvdd, en_3v3_pex_hvdd, FIXED_SUPPLY(en_3v3_sys), 0, 0, TEGRA_GPIO_PL7, true, 0, 3300); | ||
667 | FIXED_REG(13, en_1v8_cam, en_1v8_cam, max77663_rails(sd2), 0, 0, TEGRA_GPIO_PBB4, true, 0, 1800); | ||
668 | |||
669 | /*Specific to pm269*/ | ||
670 | FIXED_REG(4, en_vdd_bl_pm269, en_vdd_bl, NULL, 0, 0, TEGRA_GPIO_PH3, true, 1, 5000); | ||
671 | FIXED_REG(6, en_vdd_pnl1_pm269, en_vdd_pnl1, FIXED_SUPPLY(en_3v3_sys), 0, 0, TEGRA_GPIO_PW1, true, 0, 3300); | ||
672 | FIXED_REG(9, en_3v3_fuse_pm269, en_3v3_fuse, FIXED_SUPPLY(en_3v3_sys), 0, 0, TEGRA_GPIO_PC1, true, 0, 3300); | ||
673 | FIXED_REG(12, en_3v3_pex_hvdd_pm269, en_3v3_pex_hvdd, FIXED_SUPPLY(en_3v3_sys), 0, 0, TEGRA_GPIO_PC6, true, 0, 3300); | ||
674 | |||
675 | /* Specific to E1187/E1186/E1256 */ | ||
676 | FIXED_REG(14, dis_5v_switch_e118x, dis_5v_switch, FIXED_SUPPLY(en_5v0), 0, 0, TEGRA_GPIO_PX2, false, 0, 5000); | ||
677 | |||
678 | /* E1198/E1291 specific*/ | ||
679 | FIXED_REG(18, cam1_ldo_en, cam1_ldo_en, FIXED_SUPPLY(en_3v3_sys), 0, 0, TEGRA_GPIO_PR6, true, 0, 2800); | ||
680 | FIXED_REG(19, cam2_ldo_en, cam2_ldo_en, FIXED_SUPPLY(en_3v3_sys), 0, 0, TEGRA_GPIO_PR7, true, 0, 2800); | ||
681 | FIXED_REG(22, en_vbrtr, en_vbrtr, FIXED_SUPPLY(en_3v3_sys), 0, 0, PMU_TCA6416_GPIO_PORT12, true, 0, 3300); | ||
682 | |||
683 | /**** Open collector Load switches ****/ | ||
684 | /*Specific to pm269*/ | ||
685 | GREG_INIT(17, en_vddio_vid_oc_pm269, en_vddio_vid_oc, "master_5v_switch", | ||
686 | 0, 0, TEGRA_GPIO_PP2, false, 0, TEGRA_PINGROUP_DAP3_DOUT, | ||
687 | enable_load_switch_rail, disable_load_switch_rail); | ||
688 | |||
689 | /* Specific to E1187/E1186/E1256 */ | ||
690 | GREG_INIT(15, en_usb1_vbus_oc_e118x, en_usb1_vbus_oc, "master_5v_switch", | ||
691 | 0, 0, TEGRA_GPIO_PI4, false, 0, TEGRA_PINGROUP_GMI_RST_N, | ||
692 | enable_load_switch_rail, disable_load_switch_rail); | ||
693 | GREG_INIT(16, en_usb3_vbus_oc_e118x, en_usb3_vbus_oc, "master_5v_switch", | ||
694 | 0, 0, TEGRA_GPIO_PH7, false, 0, TEGRA_PINGROUP_GMI_AD15, | ||
695 | enable_load_switch_rail, disable_load_switch_rail); | ||
696 | GREG_INIT(17, en_vddio_vid_oc_e118x, en_vddio_vid_oc, "master_5v_switch", | ||
697 | 0, 0, TEGRA_GPIO_PT0, false, 0, TEGRA_PINGROUP_VI_PCLK, | ||
698 | enable_load_switch_rail, disable_load_switch_rail); | ||
699 | |||
700 | /* | ||
701 | * Creating the fixed/gpio-switch regulator device tables for different boards | ||
702 | */ | ||
703 | #define ADD_FIXED_REG(_name) (&fixed_reg_##_name##_dev) | ||
704 | #define ADD_GPIO_REG(_name) (&gswitch_reg_##_name##_dev) | ||
705 | |||
706 | #define COMMON_FIXED_REG \ | ||
707 | ADD_FIXED_REG(en_track_ldo2), \ | ||
708 | ADD_FIXED_REG(en_5v0), \ | ||
709 | ADD_FIXED_REG(en_ddr), \ | ||
710 | ADD_FIXED_REG(en_3v3_sys), \ | ||
711 | ADD_FIXED_REG(en_3v3_modem), \ | ||
712 | ADD_FIXED_REG(en_vdd_pnl1), \ | ||
713 | ADD_FIXED_REG(cam1_ldo_en), \ | ||
714 | ADD_FIXED_REG(cam2_ldo_en), \ | ||
715 | ADD_FIXED_REG(cam3_ldo_en), \ | ||
716 | ADD_FIXED_REG(en_vdd_com), \ | ||
717 | ADD_FIXED_REG(en_3v3_fuse), \ | ||
718 | ADD_FIXED_REG(en_3v3_emmc), \ | ||
719 | ADD_FIXED_REG(en_vdd_sdmmc1), \ | ||
720 | ADD_FIXED_REG(en_3v3_pex_hvdd), \ | ||
721 | ADD_FIXED_REG(en_1v8_cam), | ||
722 | |||
723 | #define PM269_FIXED_REG \ | ||
724 | ADD_FIXED_REG(en_track_ldo2), \ | ||
725 | ADD_FIXED_REG(en_5v0), \ | ||
726 | ADD_FIXED_REG(en_ddr), \ | ||
727 | ADD_FIXED_REG(en_vdd_bl_pm269), \ | ||
728 | ADD_FIXED_REG(en_3v3_sys), \ | ||
729 | ADD_FIXED_REG(en_3v3_modem), \ | ||
730 | ADD_FIXED_REG(en_vdd_pnl1_pm269), \ | ||
731 | ADD_FIXED_REG(cam1_ldo_en), \ | ||
732 | ADD_FIXED_REG(cam2_ldo_en), \ | ||
733 | ADD_FIXED_REG(cam3_ldo_en), \ | ||
734 | ADD_FIXED_REG(en_vdd_com), \ | ||
735 | ADD_FIXED_REG(en_3v3_fuse_pm269), \ | ||
736 | ADD_FIXED_REG(en_3v3_emmc), \ | ||
737 | ADD_FIXED_REG(en_3v3_pex_hvdd_pm269), \ | ||
738 | ADD_FIXED_REG(en_1v8_cam), \ | ||
739 | ADD_FIXED_REG(dis_5v_switch_e118x), \ | ||
740 | ADD_GPIO_REG(en_usb1_vbus_oc_e118x), \ | ||
741 | ADD_GPIO_REG(en_usb3_vbus_oc_e118x), \ | ||
742 | ADD_GPIO_REG(en_vddio_vid_oc_pm269), | ||
743 | |||
744 | #define E118x_FIXED_REG \ | ||
745 | ADD_FIXED_REG(en_vdd_bl), \ | ||
746 | ADD_FIXED_REG(dis_5v_switch_e118x), \ | ||
747 | ADD_FIXED_REG(en_vbrtr), \ | ||
748 | ADD_GPIO_REG(en_usb1_vbus_oc_e118x), \ | ||
749 | ADD_GPIO_REG(en_usb3_vbus_oc_e118x), \ | ||
750 | ADD_GPIO_REG(en_vddio_vid_oc_e118x), \ | ||
751 | |||
752 | /* Gpio switch regulator platform data for E1186/E1187/E1256*/ | ||
753 | static struct platform_device *fixed_reg_devs_e118x[] = { | ||
754 | COMMON_FIXED_REG | ||
755 | E118x_FIXED_REG | ||
756 | }; | ||
757 | |||
758 | /* Gpio switch regulator platform data for PM269*/ | ||
759 | static struct platform_device *fixed_reg_devs_pm269[] = { | ||
760 | PM269_FIXED_REG | ||
761 | }; | ||
762 | |||
763 | int __init cardhu_pm298_gpio_switch_regulator_init(void) | ||
764 | { | ||
765 | int i; | ||
766 | struct board_info board_info; | ||
767 | struct platform_device **fixed_reg_devs; | ||
768 | int nfixreg_devs; | ||
769 | |||
770 | tegra_get_board_info(&board_info); | ||
771 | |||
772 | switch (board_info.board_id) { | ||
773 | case BOARD_PM269: | ||
774 | case BOARD_PM305: | ||
775 | case BOARD_PM311: | ||
776 | case BOARD_E1257: | ||
777 | nfixreg_devs = ARRAY_SIZE(fixed_reg_devs_pm269); | ||
778 | fixed_reg_devs = fixed_reg_devs_pm269; | ||
779 | break; | ||
780 | |||
781 | default: | ||
782 | nfixreg_devs = ARRAY_SIZE(fixed_reg_devs_e118x); | ||
783 | fixed_reg_devs = fixed_reg_devs_e118x; | ||
784 | break; | ||
785 | } | ||
786 | |||
787 | for (i = 0; i < nfixreg_devs; ++i) { | ||
788 | int gpio_nr; | ||
789 | if (!strncmp(fixed_reg_devs[i]->name, "gpio", 4)) { | ||
790 | struct gpio_switch_regulator_platform_data *gs_pdata = | ||
791 | fixed_reg_devs[i]->dev.platform_data; | ||
792 | gpio_nr = gs_pdata->subdevs[0]->gpio_nr; | ||
793 | } else { | ||
794 | struct fixed_voltage_config *fixed_reg_pdata = | ||
795 | fixed_reg_devs[i]->dev.platform_data; | ||
796 | gpio_nr = fixed_reg_pdata->gpio; | ||
797 | } | ||
798 | |||
799 | if (gpio_nr < TEGRA_NR_GPIOS) | ||
800 | tegra_gpio_enable(gpio_nr); | ||
801 | } | ||
802 | return platform_add_devices(fixed_reg_devs, nfixreg_devs); | ||
803 | } | ||