ARM: tegra12: set CPU rate to 2.2GHz for sku 0x87
[linux-3.10.git] / arch / arm / mach-tegra / board-pluto-sensors.c
1 /*
2  * arch/arm/mach-tegra/board-pluto-sensors.c
3  *
4  * Copyright (c) 2012-2013, 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 #include <linux/i2c.h>
19 #include <linux/delay.h>
20 #include <linux/regulator/consumer.h>
21 #include <linux/gpio.h>
22 #include <linux/mpu.h>
23 #include <linux/max77665-charger.h>
24 #include <linux/mfd/max77665.h>
25 #include <linux/input/max77665-haptic.h>
26 #include <linux/power/max17042_battery.h>
27 #include <linux/power/power_supply_extcon.h>
28 #include <linux/nct1008.h>
29 #include <linux/io.h>
30 #include <linux/interrupt.h>
31 #include <linux/pid_thermal_gov.h>
32 #include <mach/edp.h>
33 #include <mach/gpio-tegra.h>
34 #include <mach/pinmux-t11.h>
35 #include <mach/pinmux.h>
36 #include <media/max77665-flash.h>
37 #ifndef CONFIG_OF
38 #include <media/imx091.h>
39 #include <media/imx132.h>
40 #include <media/ad5816.h>
41 #endif
42 #include <asm/mach-types.h>
43
44 #include "gpio-names.h"
45 #include "board.h"
46 #include "board-common.h"
47 #include "board-pluto.h"
48 #include "cpu-tegra.h"
49 #include "devices.h"
50 #include "tegra-board-id.h"
51 #include "dvfs.h"
52 #include "pm.h"
53 #include "battery-ini-model-data.h"
54
55 #ifndef CONFIG_OF
56 static struct nvc_gpio_pdata imx091_gpio_pdata[] = {
57         {IMX091_GPIO_RESET, CAM_RSTN, true, false},
58         {IMX091_GPIO_PWDN, CAM1_POWER_DWN_GPIO, true, false},
59         {IMX091_GPIO_GP1, CAM_GPIO1, true, false}
60 };
61 #endif
62
63 static struct board_info board_info;
64
65 static struct max17042_platform_data max17042_pdata = {
66         .config_data = &pluto_yoku_2000mA_max17042_battery,
67         .init_data  = NULL,
68         .num_init_data = 0,
69         .enable_por_init = 1, /* Use POR init from Maxim appnote */
70         .enable_current_sense = 1,
71         .r_sns = 0,
72         .is_battery_present = false, /* False as default */
73 };
74
75 static struct i2c_board_info max17042_device[] = {
76         {
77                 I2C_BOARD_INFO("max17042", 0x36),
78                 .platform_data = &max17042_pdata,
79         },
80 };
81
82 static struct nvc_torch_lumi_level_v1 pluto_max77665_lumi_tbl[] = {
83         {0, 100000},
84         {1, 201690},
85         {2, 298080},
86         {3, 387700},
87         {4, 479050},
88         {5, 562000},
89         {6, 652560},
90         {7, 732150},
91         {8, 816050},
92         {9, 896710},
93         {10, 976890},
94         {11, 1070160},
95         {12, 1151000},
96         {13, 1227790},
97         {14, 1287690},
98         {15, 1375060},
99 };
100
101 static struct max77665_f_platform_data pluto_max77665_flash_pdata = {
102         .config         = {
103                 .led_mask               = 3,
104                 /* set to true only when using the torch strobe input
105                  * to trigger the flash.
106                  */
107                 .flash_on_torch         = false,
108                 /* use ONE-SHOOT flash mode - flash triggered at the
109                  * raising edge of strobe or strobe signal.
110                  */
111                 .flash_mode             = 1,
112                 /* .flash_on_torch         = true, */
113                 .max_total_current_mA   = 1000,
114                 .max_peak_current_mA    = 600,
115                 .max_flash_threshold_mV = 3400,
116                 .max_flash_hysteresis_mV = 200,
117                 .max_flash_lbdly_f_uS   = 256,
118                 .max_flash_lbdly_r_uS   = 256,
119                 .led_config[0] = {
120                         .flash_torch_ratio = 18100,
121                         .granularity = 1000,
122                         .flash_levels = ARRAY_SIZE(pluto_max77665_lumi_tbl),
123                         .lumi_levels = pluto_max77665_lumi_tbl,
124                         },
125                 .led_config[1] = {
126                         .flash_torch_ratio = 18100,
127                         .granularity = 1000,
128                         .flash_levels = ARRAY_SIZE(pluto_max77665_lumi_tbl),
129                         .lumi_levels = pluto_max77665_lumi_tbl,
130                         },
131                 },
132         .pinstate       = {
133                 .mask   = 1 << (CAM_FLASH_STROBE - TEGRA_GPIO_PBB0),
134                 .values = 1 << (CAM_FLASH_STROBE - TEGRA_GPIO_PBB0),
135                 },
136         .dev_name       = "torch",
137         .gpio_strobe    = CAM_FLASH_STROBE,
138 };
139
140 static struct max77665_haptic_platform_data max77665_haptic_pdata = {
141         .pwm_channel_id = 2,
142         .pwm_period = 50,
143         .type = MAX77665_HAPTIC_LRA,
144         .mode = MAX77665_INTERNAL_MODE,
145         .internal_mode_pattern = 0,
146         .pattern_cycle = 10,
147         .pattern_signal_period = 0xD0,
148         .pwm_divisor = MAX77665_PWM_DIVISOR_128,
149         .feedback_duty_cycle = 12,
150         .invert = MAX77665_INVERT_OFF,
151         .cont_mode = MAX77665_CONT_MODE,
152         .motor_startup_val = 0,
153         .scf_val = 2,
154 };
155
156 static struct max77665_charger_cable maxim_cable[] = {
157         {
158                 .name           = "USB",
159         },
160         {
161                 .name           = "USB-Host",
162         },
163         {
164                 .name           = "TA",
165         },
166         {
167                 .name           = "Fast-charger",
168         },
169         {
170                 .name           = "Slow-charger",
171         },
172         {
173                 .name           = "Charge-downstream",
174         },
175 };
176
177 static struct regulator_consumer_supply max77665_charger_supply[] = {
178         REGULATOR_SUPPLY("usb_bat_chg", "tegra-udc.0"),
179 };
180
181 static struct max77665_charger_plat_data max77665_charger = {
182         .fast_chg_cc = 1500, /* fast charger current*/
183         .term_volt = 3700, /* charger termination voltage */
184         .curr_lim = 1500, /* input current limit */
185         .num_cables = MAX_CABLES,
186         .cables = maxim_cable,
187         .extcon_name = "tegra-udc",
188         .is_battery_present = false, /* false as default */
189         .consumer_supplies = max77665_charger_supply,
190         .num_consumer_supplies = ARRAY_SIZE(max77665_charger_supply),
191 };
192
193 static struct max77665_muic_platform_data max77665_muic = {
194         .ext_conn_name = "MAX77665_MUIC_ID",
195 };
196
197 struct max77665_system_interrupt max77665_sys_int = {
198         .enable_thermal_interrupt = true,
199         .enable_low_sys_interrupt = true,
200 };
201
202 static struct max77665_platform_data pluto_max77665_pdata = {
203         .irq_base = MAX77665_TEGRA_IRQ_BASE,
204         .irq_flag = IRQF_ONESHOT | IRQF_TRIGGER_FALLING,
205         .system_interrupt = &max77665_sys_int,
206         .muic_platform_data = {
207                 .pdata = &max77665_muic,
208                 .size = sizeof(max77665_muic),
209                 },
210         .charger_platform_data = {
211                 .pdata = &max77665_charger,
212                 .size = sizeof(max77665_charger),
213                 },
214         .flash_platform_data = {
215                 .pdata = &pluto_max77665_flash_pdata,
216                 .size = sizeof(pluto_max77665_flash_pdata),
217                 },
218         .haptic_platform_data = {
219                 .pdata = &max77665_haptic_pdata,
220                 .size = sizeof(max77665_haptic_pdata),
221                 },
222 };
223
224 static struct i2c_board_info pluto_i2c_board_info_max77665[] = {
225         {
226                 I2C_BOARD_INFO("max77665", 0x66),
227                 .platform_data = &pluto_max77665_pdata,
228                 .irq = (TEGRA_SOC_OC_IRQ_BASE + TEGRA_SOC_OC_IRQ_4),
229         },
230 };
231
232 static struct power_supply_extcon_plat_data psy_extcon_pdata = {
233         .extcon_name = "tegra-udc",
234 };
235
236 static struct platform_device psy_extcon_device = {
237         .name = "power-supply-extcon",
238         .id = -1,
239         .dev = {
240                 .platform_data = &psy_extcon_pdata,
241         },
242 };
243
244
245 /* isl29029 support is provided by isl29028*/
246 static struct i2c_board_info pluto_i2c1_isl_board_info[] = {
247         {
248                 I2C_BOARD_INFO("isl29028", 0x44),
249         }
250 };
251
252 static struct throttle_table tj_throttle_table[] = {
253         /* CPU_THROT_LOW cannot be used by other than CPU */
254         /*      CPU,  C2BUS,  C3BUS,   SCLK,    EMC   */
255         { { 1810500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
256         { { 1785000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
257         { { 1759500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
258         { { 1734000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
259         { { 1708500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
260         { { 1683000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
261         { { 1657500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
262         { { 1632000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
263         { { 1606500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
264         { { 1581000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
265         { { 1555500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
266         { { 1530000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
267         { { 1504500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
268         { { 1479000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
269         { { 1453500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
270         { { 1428000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
271         { { 1402500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
272         { { 1377000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
273         { { 1351500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
274         { { 1326000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
275         { { 1300500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
276         { { 1275000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
277         { { 1249500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
278         { { 1224000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
279         { { 1198500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
280         { { 1173000, 636000, NO_CAP, NO_CAP, NO_CAP } },
281         { { 1147500, 636000, NO_CAP, NO_CAP, NO_CAP } },
282         { { 1122000, 636000, NO_CAP, NO_CAP, NO_CAP } },
283         { { 1096500, 636000, NO_CAP, NO_CAP, NO_CAP } },
284         { { 1071000, 636000, NO_CAP, NO_CAP, NO_CAP } },
285         { { 1045500, 636000, NO_CAP, NO_CAP, NO_CAP } },
286         { { 1020000, 636000, NO_CAP, NO_CAP, NO_CAP } },
287         { {  994500, 636000, NO_CAP, NO_CAP, NO_CAP } },
288         { {  969000, 600000, NO_CAP, NO_CAP, NO_CAP } },
289         { {  943500, 600000, NO_CAP, NO_CAP, NO_CAP } },
290         { {  918000, 600000, NO_CAP, NO_CAP, NO_CAP } },
291         { {  892500, 600000, NO_CAP, NO_CAP, NO_CAP } },
292         { {  867000, 600000, NO_CAP, NO_CAP, NO_CAP } },
293         { {  841500, 564000, NO_CAP, NO_CAP, NO_CAP } },
294         { {  816000, 564000, NO_CAP, NO_CAP, 792000 } },
295         { {  790500, 564000, NO_CAP, 372000, 792000 } },
296         { {  765000, 564000, 468000, 372000, 792000 } },
297         { {  739500, 528000, 468000, 372000, 792000 } },
298         { {  714000, 528000, 468000, 336000, 792000 } },
299         { {  688500, 528000, 420000, 336000, 792000 } },
300         { {  663000, 492000, 420000, 336000, 792000 } },
301         { {  637500, 492000, 420000, 336000, 408000 } },
302         { {  612000, 492000, 420000, 300000, 408000 } },
303         { {  586500, 492000, 360000, 336000, 408000 } },
304         { {  561000, 420000, 420000, 300000, 408000 } },
305         { {  535500, 420000, 360000, 228000, 408000 } },
306         { {  510000, 420000, 288000, 228000, 408000 } },
307         { {  484500, 324000, 288000, 228000, 408000 } },
308         { {  459000, 324000, 288000, 228000, 408000 } },
309         { {  433500, 324000, 288000, 228000, 408000 } },
310         { {  408000, 324000, 288000, 228000, 408000 } },
311 };
312
313 static struct balanced_throttle tj_throttle = {
314         .throt_tab_size = ARRAY_SIZE(tj_throttle_table),
315         .throt_tab = tj_throttle_table,
316 };
317
318 static int __init pluto_throttle_init(void)
319 {
320         if (machine_is_tegra_pluto())
321                 balanced_throttle_register(&tj_throttle, "tegra-balanced");
322         return 0;
323 }
324 module_init(pluto_throttle_init);
325
326 static struct nct1008_platform_data pluto_nct1008_pdata = {
327         .supported_hwrev = true,
328         .ext_range = true,
329         .conv_rate = 0x06, /* 4Hz conversion rate */
330         .offset = 0,
331         .shutdown_ext_limit = 105, /* C */
332         .shutdown_local_limit = 120, /* C */
333
334         .num_trips = 1,
335         .trips = {
336                 {
337                         .cdev_type = "suspend_soctherm",
338                         .trip_temp = 50000,
339                         .trip_type = THERMAL_TRIP_ACTIVE,
340                         .upper = 1,
341                         .lower = 1,
342                         .hysteresis = 5000,
343                 },
344         },
345
346 #ifdef CONFIG_TEGRA_LP1_LOW_COREVOLTAGE
347         .suspend_ext_limit_hi = 25000,
348         .suspend_ext_limit_lo = 20000,
349         .suspend_with_wakeup = tegra_is_lp1_suspend_mode,
350 #endif
351 };
352
353 static struct i2c_board_info pluto_i2c4_nct1008_board_info[] = {
354         {
355                 I2C_BOARD_INFO("nct1008", 0x4C),
356                 .platform_data = &pluto_nct1008_pdata,
357                 .irq = -1,
358         }
359 };
360
361 #ifndef CONFIG_OF
362 #define VI_PINMUX(_pingroup, _mux, _pupd, _tri, _io, _lock, _ioreset) \
363         {                                                       \
364                 .pingroup       = TEGRA_PINGROUP_##_pingroup,   \
365                 .func           = TEGRA_MUX_##_mux,             \
366                 .pupd           = TEGRA_PUPD_##_pupd,           \
367                 .tristate       = TEGRA_TRI_##_tri,             \
368                 .io             = TEGRA_PIN_##_io,              \
369                 .lock           = TEGRA_PIN_LOCK_##_lock,       \
370                 .od             = TEGRA_PIN_OD_DEFAULT,         \
371                 .ioreset        = TEGRA_PIN_IO_RESET_##_ioreset \
372 }
373
374 static int pluto_focuser_power_on(struct ad5816_power_rail *pw)
375 {
376         int err;
377
378         if (unlikely(WARN_ON(!pw || !pw->vdd || !pw->vdd_i2c)))
379                 return -EFAULT;
380
381         err = regulator_enable(pw->vdd_i2c);
382         if (unlikely(err))
383                 goto ad5816_vdd_i2c_fail;
384
385         err = regulator_enable(pw->vdd);
386         if (unlikely(err))
387                 goto ad5816_vdd_fail;
388
389         return 0;
390
391 ad5816_vdd_fail:
392         regulator_disable(pw->vdd_i2c);
393
394 ad5816_vdd_i2c_fail:
395         pr_err("%s FAILED\n", __func__);
396
397         return -ENODEV;
398 }
399
400 static int pluto_focuser_power_off(struct ad5816_power_rail *pw)
401 {
402         if (unlikely(WARN_ON(!pw || !pw->vdd || !pw->vdd_i2c)))
403                 return -EFAULT;
404
405         regulator_disable(pw->vdd);
406         regulator_disable(pw->vdd_i2c);
407
408         return 0;
409 }
410
411 static struct tegra_pingroup_config mclk_disable =
412         VI_PINMUX(CAM_MCLK, VI, NORMAL, NORMAL, OUTPUT, DEFAULT, DEFAULT);
413
414 static struct tegra_pingroup_config mclk_enable =
415         VI_PINMUX(CAM_MCLK, VI_ALT3, NORMAL, NORMAL, OUTPUT, DEFAULT, DEFAULT);
416
417 static struct tegra_pingroup_config pbb0_disable =
418         VI_PINMUX(GPIO_PBB0, VI, NORMAL, NORMAL, OUTPUT, DEFAULT, DEFAULT);
419
420 static struct tegra_pingroup_config pbb0_enable =
421         VI_PINMUX(GPIO_PBB0, VI_ALT3, NORMAL, NORMAL, OUTPUT, DEFAULT, DEFAULT);
422
423 /*
424  * more regulators need to be allocated to activate the sensor devices.
425  * pluto_vcmvdd: this is a workaround due to the focuser device(AD5816) will
426  *               hook up the i2c bus if it is not powered up.
427  * pluto_i2cvdd: by default, the power supply on the i2c bus is OFF. So it
428  *               should be turned on every time any sensor device is activated.
429 */
430 static struct regulator *pluto_vcmvdd;
431 static struct regulator *pluto_i2cvdd;
432
433 static int pluto_get_extra_regulators(void)
434 {
435         if (!pluto_vcmvdd) {
436                 pluto_vcmvdd = regulator_get(NULL, "vdd_af_cam1");
437                 if (WARN_ON(IS_ERR(pluto_vcmvdd))) {
438                         pr_err("%s: can't get regulator vdd_af_cam1: %ld\n",
439                                 __func__, PTR_ERR(pluto_vcmvdd));
440                         pluto_vcmvdd = NULL;
441                         return -ENODEV;
442                 }
443         }
444
445         if (!pluto_i2cvdd) {
446                 pluto_i2cvdd = regulator_get(NULL, "vddio_cam_mb");
447                 if (unlikely(WARN_ON(IS_ERR(pluto_i2cvdd)))) {
448                         pr_err("%s: can't get regulator vddio_cam_mb: %ld\n",
449                                 __func__, PTR_ERR(pluto_i2cvdd));
450                         pluto_i2cvdd = NULL;
451                         return -ENODEV;
452                 }
453         }
454
455         return 0;
456 }
457
458 static int pluto_imx091_power_on(struct nvc_regulator *vreg)
459 {
460         int err;
461
462         if (unlikely(WARN_ON(!vreg)))
463                 return -EFAULT;
464
465         if (pluto_get_extra_regulators())
466                 goto imx091_poweron_fail;
467
468         gpio_set_value(CAM1_POWER_DWN_GPIO, 0);
469         usleep_range(10, 20);
470
471         err = regulator_enable(vreg[IMX091_VREG_AVDD].vreg);
472         if (unlikely(err))
473                 goto imx091_avdd_fail;
474
475         err = regulator_enable(vreg[IMX091_VREG_DVDD].vreg);
476         if (unlikely(err))
477                 goto imx091_dvdd_fail;
478
479         err = regulator_enable(vreg[IMX091_VREG_IOVDD].vreg);
480         if (unlikely(err))
481                 goto imx091_iovdd_fail;
482
483         usleep_range(1, 2);
484         gpio_set_value(CAM1_POWER_DWN_GPIO, 1);
485
486         tegra_pinmux_config_table(&mclk_enable, 1);
487         err = regulator_enable(pluto_i2cvdd);
488         if (unlikely(err))
489                 goto imx091_i2c_fail;
490
491         err = regulator_enable(pluto_vcmvdd);
492         if (unlikely(err))
493                 goto imx091_vcm_fail;
494         usleep_range(300, 310);
495
496         return 1;
497
498 imx091_vcm_fail:
499         regulator_disable(pluto_i2cvdd);
500
501 imx091_i2c_fail:
502         tegra_pinmux_config_table(&mclk_disable, 1);
503         gpio_set_value(CAM1_POWER_DWN_GPIO, 0);
504         regulator_disable(vreg[IMX091_VREG_IOVDD].vreg);
505
506 imx091_iovdd_fail:
507         regulator_disable(vreg[IMX091_VREG_DVDD].vreg);
508
509 imx091_dvdd_fail:
510         regulator_disable(vreg[IMX091_VREG_AVDD].vreg);
511
512 imx091_avdd_fail:
513 imx091_poweron_fail:
514         pr_err("%s FAILED\n", __func__);
515         return -ENODEV;
516 }
517
518 static int pluto_imx091_power_off(struct nvc_regulator *vreg)
519 {
520         if (unlikely(WARN_ON(!vreg)))
521                 return -EFAULT;
522
523         usleep_range(1, 2);
524         tegra_pinmux_config_table(&mclk_disable, 1);
525         gpio_set_value(CAM1_POWER_DWN_GPIO, 0);
526         usleep_range(1, 2);
527
528         regulator_disable(vreg[IMX091_VREG_IOVDD].vreg);
529         regulator_disable(vreg[IMX091_VREG_DVDD].vreg);
530         regulator_disable(vreg[IMX091_VREG_AVDD].vreg);
531         if (pluto_i2cvdd)
532                 regulator_disable(pluto_i2cvdd);
533         if (pluto_vcmvdd)
534                 regulator_disable(pluto_vcmvdd);
535
536         return 0;
537 }
538
539 static struct nvc_imager_cap imx091_cap = {
540         .identifier             = "IMX091",
541         .sensor_nvc_interface   = 3,
542         .pixel_types[0]         = 0x100,
543         .orientation            = 0,
544         .direction              = 0,
545         .initial_clock_rate_khz = 6000,
546         .clock_profiles[0] = {
547                 .external_clock_khz     = 24000,
548                 .clock_multiplier       = 850000, /* value / 1,000,000 */
549         },
550         .clock_profiles[1] = {
551                 .external_clock_khz     = 0,
552                 .clock_multiplier       = 0,
553         },
554         .h_sync_edge            = 0,
555         .v_sync_edge            = 0,
556         .mclk_on_vgp0           = 0,
557         .csi_port               = 0,
558         .data_lanes             = 4,
559         .virtual_channel_id     = 0,
560         .discontinuous_clk_mode = 1,
561         .cil_threshold_settle   = 0x0,
562         .min_blank_time_width   = 16,
563         .min_blank_time_height  = 16,
564         .preferred_mode_index   = 0,
565         .focuser_guid           = NVC_FOCUS_GUID(0),
566         .torch_guid             = NVC_TORCH_GUID(0),
567         .cap_version            = NVC_IMAGER_CAPABILITIES_VERSION2,
568 };
569
570 static struct imx091_platform_data imx091_pdata = {
571         .num                    = 0,
572         .sync                   = 0,
573         .dev_name               = "camera",
574         .gpio_count             = ARRAY_SIZE(imx091_gpio_pdata),
575         .gpio                   = imx091_gpio_pdata,
576         .flash_cap              = {
577                 .sdo_trigger_enabled = 1,
578                 .adjustable_flash_timing = 1,
579         },
580         .cap                    = &imx091_cap,
581         .power_on               = pluto_imx091_power_on,
582         .power_off              = pluto_imx091_power_off,
583 };
584
585 static int pluto_imx132_power_on(struct imx132_power_rail *pw)
586 {
587         int err;
588
589         if (unlikely(WARN_ON(!pw || !pw->avdd || !pw->iovdd || !pw->dvdd)))
590                 return -EFAULT;
591
592         if (pluto_get_extra_regulators())
593                 goto pluto_imx132_poweron_fail;
594
595         gpio_set_value(CAM2_POWER_DWN_GPIO, 0);
596
597         tegra_pinmux_config_table(&pbb0_enable, 1);
598
599         err = regulator_enable(pluto_i2cvdd);
600         if (unlikely(err))
601                 goto imx132_i2c_fail;
602
603         err = regulator_enable(pluto_vcmvdd);
604         if (unlikely(err))
605                 goto imx132_vcm_fail;
606
607         err = regulator_enable(pw->avdd);
608         if (unlikely(err))
609                 goto imx132_avdd_fail;
610
611         err = regulator_enable(pw->dvdd);
612         if (unlikely(err))
613                 goto imx132_dvdd_fail;
614
615         err = regulator_enable(pw->iovdd);
616         if (unlikely(err))
617                 goto imx132_iovdd_fail;
618
619         usleep_range(1, 2);
620
621         gpio_set_value(CAM2_POWER_DWN_GPIO, 1);
622
623         return 0;
624
625 imx132_iovdd_fail:
626         regulator_disable(pw->dvdd);
627
628 imx132_dvdd_fail:
629         regulator_disable(pw->avdd);
630
631 imx132_avdd_fail:
632         regulator_disable(pluto_vcmvdd);
633
634 imx132_vcm_fail:
635         regulator_disable(pluto_i2cvdd);
636
637 imx132_i2c_fail:
638         tegra_pinmux_config_table(&pbb0_disable, 1);
639
640 pluto_imx132_poweron_fail:
641         pr_err("%s failed.\n", __func__);
642         return -ENODEV;
643 }
644
645 static int pluto_imx132_power_off(struct imx132_power_rail *pw)
646 {
647         if (unlikely(WARN_ON(!pw || !pw->avdd || !pw->iovdd || !pw->dvdd ||
648                         !pluto_i2cvdd || !pluto_vcmvdd)))
649                 return -EFAULT;
650
651         gpio_set_value(CAM2_POWER_DWN_GPIO, 0);
652
653         usleep_range(1, 2);
654
655         regulator_disable(pw->iovdd);
656         regulator_disable(pw->dvdd);
657         regulator_disable(pw->avdd);
658
659         tegra_pinmux_config_table(&pbb0_disable, 1);
660
661         regulator_disable(pluto_vcmvdd);
662         regulator_disable(pluto_i2cvdd);
663
664         return 0;
665 }
666
667 struct imx132_platform_data imx132_pdata = {
668         .power_on = pluto_imx132_power_on,
669         .power_off = pluto_imx132_power_off,
670 };
671
672 static struct ad5816_platform_data pluto_ad5816_pdata = {
673         .cfg            = 0,
674         .num            = 0,
675         .sync           = 0,
676         .dev_name       = "focuser",
677         .power_on       = pluto_focuser_power_on,
678         .power_off      = pluto_focuser_power_off,
679 };
680
681 static struct i2c_board_info pluto_i2c_board_info_e1625[] = {
682         {
683                 I2C_BOARD_INFO("imx091", 0x10),
684                 .platform_data = &imx091_pdata,
685         },
686         {
687                 I2C_BOARD_INFO("imx132", 0x36),
688                 .platform_data = &imx132_pdata,
689         },
690         {
691                 I2C_BOARD_INFO("ad5816", 0x0E),
692                 .platform_data = &pluto_ad5816_pdata,
693         },
694 };
695
696 static int pluto_camera_init(void)
697 {
698         pr_debug("%s: ++\n", __func__);
699
700         tegra_pinmux_config_table(&mclk_disable, 1);
701         tegra_pinmux_config_table(&pbb0_disable, 1);
702         i2c_register_board_info(2, pluto_i2c_board_info_e1625,
703                 ARRAY_SIZE(pluto_i2c_board_info_e1625));
704
705         return 0;
706 }
707 #endif
708
709 /* MPU board file definition */
710 static struct mpu_platform_data mpu_gyro_data = {
711         .int_config     = 0x00,
712         .level_shifter  = 0,
713         .orientation    = MPU_GYRO_ORIENTATION,
714         .sec_slave_type = SECONDARY_SLAVE_TYPE_NONE,
715         .key            = {0x4E, 0xCC, 0x7E, 0xEB, 0xF6, 0x1E, 0x35, 0x22,
716                            0x00, 0x34, 0x0D, 0x65, 0x32, 0xE9, 0x94, 0x89},
717 };
718
719 static struct mpu_platform_data mpu_compass_data = {
720         .orientation    = MPU_COMPASS_ORIENTATION,
721         .config         = NVI_CONFIG_BOOT_MPU,
722 };
723
724 static struct mpu_platform_data bmp180_pdata = {
725         .config         = NVI_CONFIG_BOOT_MPU,
726 };
727
728 static struct i2c_board_info __initdata inv_mpu_i2c0_board_info[] = {
729         {
730                 I2C_BOARD_INFO(MPU_GYRO_NAME, MPU_GYRO_ADDR),
731                 .platform_data = &mpu_gyro_data,
732         },
733         {
734                 /* The actual BMP180 address is 0x77 but because this conflicts
735                  * with another device, this address is hacked so Linux will
736                  * call the driver.  The conflict is technically okay since the
737                  * BMP180 is behind the MPU.  Also, the BMP180 driver uses a
738                  * hard-coded address of 0x77 since it can't be changed anyway.
739                  */
740                 I2C_BOARD_INFO("bmp180", 0x78),
741                 .platform_data = &bmp180_pdata,
742         },
743         {
744                 I2C_BOARD_INFO(MPU_COMPASS_NAME, MPU_COMPASS_ADDR),
745                 .platform_data = &mpu_compass_data,
746         },
747 };
748
749 static void mpuirq_init(void)
750 {
751         int ret = 0;
752         int i = 0;
753
754         pr_info("*** MPU START *** mpuirq_init...\n");
755
756         /* MPU-IRQ assignment */
757         ret = gpio_request(MPU_GYRO_IRQ_GPIO, MPU_GYRO_NAME);
758         if (ret < 0) {
759                 pr_err("%s: gpio_request failed %d\n", __func__, ret);
760                 return;
761         }
762
763         ret = gpio_direction_input(MPU_GYRO_IRQ_GPIO);
764         if (ret < 0) {
765                 pr_err("%s: gpio_direction_input failed %d\n", __func__, ret);
766                 gpio_free(MPU_GYRO_IRQ_GPIO);
767                 return;
768         }
769         pr_info("*** MPU END *** mpuirq_init...\n");
770
771         inv_mpu_i2c0_board_info[i++].irq = gpio_to_irq(MPU_GYRO_IRQ_GPIO);
772 #if MPU_COMPASS_IRQ_GPIO
773         inv_mpu_i2c0_board_info[i++].irq = gpio_to_irq(MPU_COMPASS_IRQ_GPIO);
774 #endif
775         i2c_register_board_info(MPU_GYRO_BUS_NUM, inv_mpu_i2c0_board_info,
776                 ARRAY_SIZE(inv_mpu_i2c0_board_info));
777 }
778
779 static int pluto_nct1008_init(void)
780 {
781         int nct1008_port;
782         int ret = 0;
783
784         if (board_info.board_id == BOARD_E1580 ||
785             board_info.board_id == BOARD_E1575 ||
786             board_info.board_id == BOARD_E1577) {
787                 nct1008_port = TEGRA_GPIO_PX6;
788         } else {
789                 nct1008_port = TEGRA_GPIO_PX6;
790                 pr_err("Warning: nct alert port assumed TEGRA_GPIO_PX6 for unknown pluto board id E%d\n",
791                         board_info.board_id);
792         }
793
794         tegra_add_all_vmin_trips(pluto_nct1008_pdata.trips,
795                                 &pluto_nct1008_pdata.num_trips);
796
797         pluto_i2c4_nct1008_board_info[0].irq =
798                 gpio_to_irq(nct1008_port);
799         pr_info("%s: pluto nct1008 irq %d",
800                         __func__, pluto_i2c4_nct1008_board_info[0].irq);
801
802         ret = gpio_request(nct1008_port, "temp_alert");
803         if (ret < 0)
804                 return ret;
805
806         ret = gpio_direction_input(nct1008_port);
807         if (ret < 0) {
808                 pr_info("%s: calling gpio_free(nct1008_port)", __func__);
809                 gpio_free(nct1008_port);
810         }
811
812         /* pluto has thermal sensor on GEN1-I2C i.e. instance 0 */
813         i2c_register_board_info(0, pluto_i2c4_nct1008_board_info,
814                 ARRAY_SIZE(pluto_i2c4_nct1008_board_info));
815
816         return ret;
817 }
818
819 #ifdef CONFIG_TEGRA_SKIN_THROTTLE
820 static struct thermal_trip_info skin_trips[] = {
821         {
822                 .cdev_type = "skin-balanced",
823                 .trip_temp = 43000,
824                 .trip_type = THERMAL_TRIP_PASSIVE,
825                 .upper = THERMAL_NO_LIMIT,
826                 .lower = THERMAL_NO_LIMIT,
827                 .hysteresis = 0,
828         },
829         {
830                 .cdev_type = "tegra-shutdown",
831                 .trip_temp = 57000,
832                 .trip_type = THERMAL_TRIP_CRITICAL,
833                 .upper = THERMAL_NO_LIMIT,
834                 .lower = THERMAL_NO_LIMIT,
835                 .hysteresis = 0,
836         },
837 };
838
839 static struct therm_est_subdevice skin_devs[] = {
840         {
841                 .dev_data = "Tdiode",
842                 .coeffs = {
843                         2, 1, 1, 1,
844                         1, 1, 1, 1,
845                         1, 1, 1, 0,
846                         1, 1, 0, 0,
847                         0, 0, -1, -7
848                 },
849         },
850         {
851                 .dev_data = "Tboard",
852                 .coeffs = {
853                         -11, -7, -5, -3,
854                         -3, -2, -1, 0,
855                         0, 0, 1, 1,
856                         1, 2, 2, 3,
857                         4, 6, 11, 18
858                 },
859         },
860 };
861
862 static struct pid_thermal_gov_params skin_pid_params = {
863         .max_err_temp = 4000,
864         .max_err_gain = 1000,
865
866         .gain_p = 1000,
867         .gain_d = 0,
868
869         .up_compensation = 15,
870         .down_compensation = 15,
871 };
872
873 static struct thermal_zone_params skin_tzp = {
874         .governor_name = "pid_thermal_gov",
875         .governor_params = &skin_pid_params,
876 };
877
878 static struct therm_est_data skin_data = {
879         .num_trips = ARRAY_SIZE(skin_trips),
880         .trips = skin_trips,
881         .toffset = 9793,
882         .polling_period = 1100,
883         .passive_delay = 15000,
884         .tc1 = 10,
885         .tc2 = 1,
886         .ndevs = ARRAY_SIZE(skin_devs),
887         .devs = skin_devs,
888         .tzp = &skin_tzp,
889 };
890
891 static struct throttle_table skin_throttle_table[] = {
892         /* CPU_THROT_LOW cannot be used by other than CPU */
893         /*      CPU,  C2BUS,  C3BUS,   SCLK,    EMC   */
894         { { 1810500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
895         { { 1785000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
896         { { 1759500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
897         { { 1734000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
898         { { 1708500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
899         { { 1683000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
900         { { 1657500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
901         { { 1632000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
902         { { 1606500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
903         { { 1581000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
904         { { 1555500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
905         { { 1530000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
906         { { 1504500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
907         { { 1479000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
908         { { 1453500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
909         { { 1428000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
910         { { 1402500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
911         { { 1377000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
912         { { 1351500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
913         { { 1326000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
914         { { 1300500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
915         { { 1275000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
916         { { 1249500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
917         { { 1224000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
918         { { 1198500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
919         { { 1173000, 636000, NO_CAP, NO_CAP, NO_CAP } },
920         { { 1147500, 636000, NO_CAP, NO_CAP, NO_CAP } },
921         { { 1122000, 636000, NO_CAP, NO_CAP, NO_CAP } },
922         { { 1096500, 636000, NO_CAP, NO_CAP, NO_CAP } },
923         { { 1071000, 636000, NO_CAP, NO_CAP, NO_CAP } },
924         { { 1045500, 636000, NO_CAP, NO_CAP, NO_CAP } },
925         { { 1020000, 636000, NO_CAP, NO_CAP, NO_CAP } },
926         { {  994500, 636000, NO_CAP, NO_CAP, NO_CAP } },
927         { {  969000, 600000, NO_CAP, NO_CAP, NO_CAP } },
928         { {  943500, 600000, NO_CAP, NO_CAP, NO_CAP } },
929         { {  918000, 600000, NO_CAP, NO_CAP, NO_CAP } },
930         { {  892500, 600000, NO_CAP, NO_CAP, NO_CAP } },
931         { {  867000, 600000, NO_CAP, NO_CAP, NO_CAP } },
932         { {  841500, 564000, NO_CAP, NO_CAP, NO_CAP } },
933         { {  816000, 564000, NO_CAP, NO_CAP, 792000 } },
934         { {  790500, 564000, NO_CAP, 372000, 792000 } },
935         { {  765000, 564000, 468000, 372000, 792000 } },
936         { {  739500, 528000, 468000, 372000, 792000 } },
937         { {  714000, 528000, 468000, 336000, 792000 } },
938         { {  688500, 528000, 420000, 336000, 792000 } },
939         { {  663000, 492000, 420000, 336000, 792000 } },
940         { {  637500, 492000, 420000, 336000, 408000 } },
941         { {  612000, 492000, 420000, 300000, 408000 } },
942         { {  586500, 492000, 360000, 336000, 408000 } },
943         { {  561000, 420000, 420000, 300000, 408000 } },
944         { {  535500, 420000, 360000, 228000, 408000 } },
945         { {  510000, 420000, 288000, 228000, 408000 } },
946         { {  484500, 324000, 288000, 228000, 408000 } },
947         { {  459000, 324000, 288000, 228000, 408000 } },
948         { {  433500, 324000, 288000, 228000, 408000 } },
949         { {  408000, 324000, 288000, 228000, 408000 } },
950 };
951
952 static struct balanced_throttle skin_throttle = {
953         .throt_tab_size = ARRAY_SIZE(skin_throttle_table),
954         .throt_tab = skin_throttle_table,
955 };
956
957 static int __init pluto_skin_init(void)
958 {
959         if (machine_is_tegra_pluto()) {
960                 balanced_throttle_register(&skin_throttle, "skin-balanced");
961                 tegra_skin_therm_est_device.dev.platform_data = &skin_data;
962                 platform_device_register(&tegra_skin_therm_est_device);
963         }
964
965         return 0;
966 }
967 late_initcall(pluto_skin_init);
968 #endif
969
970 void __init max77665_init(void)
971 {
972         int err;
973
974         /* For battery presence into charger driver */
975         if (get_power_supply_type() == POWER_SUPPLY_TYPE_BATTERY)
976                 max77665_charger.is_battery_present = true;
977
978         err = i2c_register_board_info(4, pluto_i2c_board_info_max77665,
979                 ARRAY_SIZE(pluto_i2c_board_info_max77665));
980         if (err)
981                 pr_err("%s: max77665 device register failed.\n", __func__);
982
983         platform_device_register(&psy_extcon_device);
984
985         return;
986 }
987
988 int __init pluto_sensors_init(void)
989 {
990         int err;
991
992         tegra_get_board_info(&board_info);
993
994         pr_debug("%s: ++\n", __func__);
995
996 #ifndef CONFIG_OF
997         pluto_camera_init();
998 #endif
999         err = pluto_nct1008_init();
1000         if (err)
1001                 return err;
1002
1003         err = i2c_register_board_info(0, pluto_i2c1_isl_board_info,
1004                                 ARRAY_SIZE(pluto_i2c1_isl_board_info));
1005         if (err)
1006                 pr_err("%s: isl board register failed.\n", __func__);
1007
1008         mpuirq_init();
1009         max77665_init();
1010
1011         if (get_power_supply_type() == POWER_SUPPLY_TYPE_BATTERY)
1012                 max17042_pdata.is_battery_present = true;
1013
1014         err = i2c_register_board_info(0, max17042_device,
1015                                 ARRAY_SIZE(max17042_device));
1016         if (err)
1017                 pr_err("%s: max17042 device register failed.\n", __func__);
1018
1019
1020         return 0;
1021 }