ARM: tegra12: set CPU rate to 2.2GHz for sku 0x87
[linux-3.10.git] / arch / arm / mach-tegra / board-dalmore-sensors.c
1 /*
2  * arch/arm/mach-tegra/board-dalmore-sensors.c
3  *
4  * Copyright (c) 2012-2013 NVIDIA CORPORATION, All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions are
8  * met:
9  *
10  * Redistributions of source code must retain the above copyright notice,
11  * this list of conditions and the following disclaimer.
12  *
13  * Redistributions in binary form must reproduce the above copyright
14  * notice, this list of conditions and the following disclaimer in the
15  * documentation and/or other materials provided with the distribution.
16  *
17  * Neither the name of NVIDIA CORPORATION nor the names of its contributors
18  * may be used to endorse or promote products derived from this software
19  * without specific prior written permission.
20  *
21  * This software is licensed under the terms of the GNU General Public
22  * License version 2, as published by the Free Software Foundation, and
23  * may be copied, distributed, and modified under those terms.
24  *
25  * This program is distributed in the hope that it will be useful,
26  * but WITHOUT ANY WARRANTY; without even the implied warranty of
27  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
28  * GNU General Public License for more details.
29  */
30
31 #include <linux/i2c.h>
32 #include <linux/delay.h>
33 #include <linux/mpu.h>
34 #include <linux/regulator/consumer.h>
35 #include <linux/gpio.h>
36 #include <linux/therm_est.h>
37 #include <linux/nct1008.h>
38 #include <linux/pid_thermal_gov.h>
39 #include <mach/edp.h>
40 #include <linux/edp.h>
41 #include <mach/gpio-tegra.h>
42 #include <mach/pinmux-t11.h>
43 #include <mach/pinmux.h>
44 #ifndef CONFIG_OF
45 #include <media/imx091.h>
46 #include <media/ad5816.h>
47 #include <media/ov9772.h>
48 #endif
49 #include <media/as364x.h>
50 #include <generated/mach-types.h>
51 #include <linux/power/sbs-battery.h>
52
53 #include "gpio-names.h"
54 #include "board.h"
55 #include "board-common.h"
56 #include "board-dalmore.h"
57 #include "cpu-tegra.h"
58 #include "devices.h"
59 #include "tegra-board-id.h"
60 #include "dvfs.h"
61
62 #ifndef CONFIG_OF
63 static struct nvc_gpio_pdata imx091_gpio_pdata[] = {
64         {IMX091_GPIO_RESET, CAM_RSTN, true, false},
65         {IMX091_GPIO_PWDN, CAM1_POWER_DWN_GPIO, true, false},
66         {IMX091_GPIO_GP1, CAM_GPIO1, true, false}
67 };
68 #endif
69
70 static struct board_info board_info;
71
72 static struct throttle_table tj_throttle_table[] = {
73         /* CPU_THROT_LOW cannot be used by other than CPU */
74         /*      CPU,  C2BUS,  C3BUS,   SCLK,    EMC   */
75         { { 1810500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
76         { { 1785000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
77         { { 1759500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
78         { { 1734000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
79         { { 1708500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
80         { { 1683000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
81         { { 1657500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
82         { { 1632000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
83         { { 1606500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
84         { { 1581000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
85         { { 1555500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
86         { { 1530000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
87         { { 1504500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
88         { { 1479000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
89         { { 1453500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
90         { { 1428000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
91         { { 1402500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
92         { { 1377000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
93         { { 1351500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
94         { { 1326000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
95         { { 1300500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
96         { { 1275000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
97         { { 1249500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
98         { { 1224000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
99         { { 1198500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
100         { { 1173000, 636000, NO_CAP, NO_CAP, NO_CAP } },
101         { { 1147500, 636000, NO_CAP, NO_CAP, NO_CAP } },
102         { { 1122000, 636000, NO_CAP, NO_CAP, NO_CAP } },
103         { { 1096500, 636000, NO_CAP, NO_CAP, NO_CAP } },
104         { { 1071000, 636000, NO_CAP, NO_CAP, NO_CAP } },
105         { { 1045500, 636000, NO_CAP, NO_CAP, NO_CAP } },
106         { { 1020000, 636000, NO_CAP, NO_CAP, NO_CAP } },
107         { {  994500, 636000, NO_CAP, NO_CAP, NO_CAP } },
108         { {  969000, 600000, NO_CAP, NO_CAP, NO_CAP } },
109         { {  943500, 600000, NO_CAP, NO_CAP, NO_CAP } },
110         { {  918000, 600000, NO_CAP, NO_CAP, NO_CAP } },
111         { {  892500, 600000, NO_CAP, NO_CAP, NO_CAP } },
112         { {  867000, 600000, NO_CAP, NO_CAP, NO_CAP } },
113         { {  841500, 564000, NO_CAP, NO_CAP, NO_CAP } },
114         { {  816000, 564000, NO_CAP, NO_CAP, 792000 } },
115         { {  790500, 564000, NO_CAP, 372000, 792000 } },
116         { {  765000, 564000, 468000, 372000, 792000 } },
117         { {  739500, 528000, 468000, 372000, 792000 } },
118         { {  714000, 528000, 468000, 336000, 792000 } },
119         { {  688500, 528000, 420000, 336000, 792000 } },
120         { {  663000, 492000, 420000, 336000, 792000 } },
121         { {  637500, 492000, 420000, 336000, 408000 } },
122         { {  612000, 492000, 420000, 300000, 408000 } },
123         { {  586500, 492000, 360000, 336000, 408000 } },
124         { {  561000, 420000, 420000, 300000, 408000 } },
125         { {  535500, 420000, 360000, 228000, 408000 } },
126         { {  510000, 420000, 288000, 228000, 408000 } },
127         { {  484500, 324000, 288000, 228000, 408000 } },
128         { {  459000, 324000, 288000, 228000, 408000 } },
129         { {  433500, 324000, 288000, 228000, 408000 } },
130         { {  408000, 324000, 288000, 228000, 408000 } },
131 };
132
133 static struct balanced_throttle tj_throttle = {
134         .throt_tab_size = ARRAY_SIZE(tj_throttle_table),
135         .throt_tab = tj_throttle_table,
136 };
137
138 static int __init dalmore_throttle_init(void)
139 {
140         if (machine_is_dalmore())
141                 balanced_throttle_register(&tj_throttle, "tegra-balanced");
142         return 0;
143 }
144 module_init(dalmore_throttle_init);
145
146 static struct nct1008_platform_data dalmore_nct1008_pdata = {
147         .supported_hwrev = true,
148         .ext_range = true,
149         .conv_rate = 0x06, /* 4Hz conversion rate */
150         .shutdown_ext_limit = 105, /* C */
151         .shutdown_local_limit = 120, /* C */
152
153         .num_trips = 1,
154         .trips = {
155                 {
156                         .cdev_type = "suspend_soctherm",
157                         .trip_temp = 50000,
158                         .trip_type = THERMAL_TRIP_ACTIVE,
159                         .upper = 1,
160                         .lower = 1,
161                         .hysteresis = 5000,
162                 },
163         },
164 };
165
166 static struct i2c_board_info dalmore_i2c4_nct1008_board_info[] = {
167         {
168                 I2C_BOARD_INFO("nct1008", 0x4C),
169                 .platform_data = &dalmore_nct1008_pdata,
170                 .irq = -1,
171         }
172 };
173
174 #define VI_PINMUX(_pingroup, _mux, _pupd, _tri, _io, _lock, _ioreset) \
175         {                                                       \
176                 .pingroup       = TEGRA_PINGROUP_##_pingroup,   \
177                 .func           = TEGRA_MUX_##_mux,             \
178                 .pupd           = TEGRA_PUPD_##_pupd,           \
179                 .tristate       = TEGRA_TRI_##_tri,             \
180                 .io             = TEGRA_PIN_##_io,              \
181                 .lock           = TEGRA_PIN_LOCK_##_lock,       \
182                 .od             = TEGRA_PIN_OD_DEFAULT,         \
183                 .ioreset        = TEGRA_PIN_IO_RESET_##_ioreset \
184 }
185
186 #ifndef CONFIG_OF
187 static int dalmore_focuser_power_on(struct ad5816_power_rail *pw)
188 {
189         int err;
190
191         if (unlikely(WARN_ON(!pw || !pw->vdd || !pw->vdd_i2c)))
192                 return -EFAULT;
193
194         err = regulator_enable(pw->vdd_i2c);
195         if (unlikely(err))
196                 goto ad5816_vdd_i2c_fail;
197
198         err = regulator_enable(pw->vdd);
199         if (unlikely(err))
200                 goto ad5816_vdd_fail;
201
202         return 0;
203
204 ad5816_vdd_fail:
205         regulator_disable(pw->vdd_i2c);
206
207 ad5816_vdd_i2c_fail:
208         pr_err("%s FAILED\n", __func__);
209
210         return -ENODEV;
211 }
212
213 static int dalmore_focuser_power_off(struct ad5816_power_rail *pw)
214 {
215         if (unlikely(WARN_ON(!pw || !pw->vdd || !pw->vdd_i2c)))
216                 return -EFAULT;
217
218         regulator_disable(pw->vdd);
219         regulator_disable(pw->vdd_i2c);
220
221         return 0;
222 }
223
224 static struct tegra_pingroup_config mclk_disable =
225         VI_PINMUX(CAM_MCLK, VI, NORMAL, NORMAL, OUTPUT, DEFAULT, DEFAULT);
226
227 static struct tegra_pingroup_config mclk_enable =
228         VI_PINMUX(CAM_MCLK, VI_ALT3, NORMAL, NORMAL, OUTPUT, DEFAULT, DEFAULT);
229
230 static struct tegra_pingroup_config pbb0_disable =
231         VI_PINMUX(GPIO_PBB0, VI, NORMAL, NORMAL, OUTPUT, DEFAULT, DEFAULT);
232
233 static struct tegra_pingroup_config pbb0_enable =
234         VI_PINMUX(GPIO_PBB0, VI_ALT3, NORMAL, NORMAL, OUTPUT, DEFAULT, DEFAULT);
235 #endif
236
237 /*
238  * As a workaround, dalmore_vcmvdd need to be allocated to activate the
239  * sensor devices. This is due to the focuser device(AD5816) will hook up
240  * the i2c bus if it is not powered up.
241 */
242 static struct regulator *dalmore_vcmvdd;
243
244 static int dalmore_get_vcmvdd(void)
245 {
246         if (!dalmore_vcmvdd) {
247                 dalmore_vcmvdd = regulator_get(NULL, "vdd_af_cam1");
248                 if (unlikely(WARN_ON(IS_ERR(dalmore_vcmvdd)))) {
249                         pr_err("%s: can't get regulator vcmvdd: %ld\n",
250                                 __func__, PTR_ERR(dalmore_vcmvdd));
251                         dalmore_vcmvdd = NULL;
252                         return -ENODEV;
253                 }
254         }
255         return 0;
256 }
257
258 #ifndef CONFIG_OF
259 static int dalmore_imx091_power_on(struct nvc_regulator *vreg)
260 {
261         int err;
262
263         if (unlikely(WARN_ON(!vreg)))
264                 return -EFAULT;
265
266         if (dalmore_get_vcmvdd())
267                 goto imx091_poweron_fail;
268
269         gpio_set_value(CAM1_POWER_DWN_GPIO, 0);
270         usleep_range(10, 20);
271
272         err = regulator_enable(vreg[IMX091_VREG_AVDD].vreg);
273         if (err)
274                 goto imx091_avdd_fail;
275
276         err = regulator_enable(vreg[IMX091_VREG_IOVDD].vreg);
277         if (err)
278                 goto imx091_iovdd_fail;
279
280         usleep_range(1, 2);
281         gpio_set_value(CAM1_POWER_DWN_GPIO, 1);
282
283         err = regulator_enable(dalmore_vcmvdd);
284         if (unlikely(err))
285                 goto imx091_vcmvdd_fail;
286
287         tegra_pinmux_config_table(&mclk_enable, 1);
288         usleep_range(300, 310);
289
290         return 1;
291
292 imx091_vcmvdd_fail:
293         regulator_disable(vreg[IMX091_VREG_IOVDD].vreg);
294
295 imx091_iovdd_fail:
296         regulator_disable(vreg[IMX091_VREG_AVDD].vreg);
297
298 imx091_avdd_fail:
299         gpio_set_value(CAM1_POWER_DWN_GPIO, 0);
300
301 imx091_poweron_fail:
302         pr_err("%s FAILED\n", __func__);
303         return -ENODEV;
304 }
305
306 static int dalmore_imx091_power_off(struct nvc_regulator *vreg)
307 {
308         if (unlikely(WARN_ON(!vreg)))
309                 return -EFAULT;
310
311         usleep_range(1, 2);
312         tegra_pinmux_config_table(&mclk_disable, 1);
313         gpio_set_value(CAM1_POWER_DWN_GPIO, 0);
314         usleep_range(1, 2);
315
316         regulator_disable(dalmore_vcmvdd);
317         regulator_disable(vreg[IMX091_VREG_IOVDD].vreg);
318         regulator_disable(vreg[IMX091_VREG_AVDD].vreg);
319
320         return 1;
321 }
322
323 static struct nvc_imager_cap imx091_cap = {
324         .identifier             = "IMX091",
325         .sensor_nvc_interface   = 3,
326         .pixel_types[0]         = 0x100,
327         .orientation            = 0,
328         .direction              = 0,
329         .initial_clock_rate_khz = 6000,
330         .clock_profiles[0] = {
331                 .external_clock_khz     = 24000,
332                 .clock_multiplier       = 850000, /* value / 1,000,000 */
333         },
334         .clock_profiles[1] = {
335                 .external_clock_khz     = 0,
336                 .clock_multiplier       = 0,
337         },
338         .h_sync_edge            = 0,
339         .v_sync_edge            = 0,
340         .mclk_on_vgp0           = 0,
341         .csi_port               = 0,
342         .data_lanes             = 4,
343         .virtual_channel_id     = 0,
344         .discontinuous_clk_mode = 1,
345         .cil_threshold_settle   = 0x0,
346         .min_blank_time_width   = 16,
347         .min_blank_time_height  = 16,
348         .preferred_mode_index   = 0,
349         .focuser_guid           = NVC_FOCUS_GUID(0),
350         .torch_guid             = NVC_TORCH_GUID(0),
351         .cap_version            = NVC_IMAGER_CAPABILITIES_VERSION2,
352 };
353
354 static struct imx091_platform_data imx091_pdata = {
355         .num                    = 0,
356         .sync                   = 0,
357         .dev_name               = "camera",
358         .gpio_count             = ARRAY_SIZE(imx091_gpio_pdata),
359         .gpio                   = imx091_gpio_pdata,
360         .flash_cap              = {
361                 .sdo_trigger_enabled = 1,
362                 .adjustable_flash_timing = 1,
363         },
364         .cap                    = &imx091_cap,
365         .power_on               = dalmore_imx091_power_on,
366         .power_off              = dalmore_imx091_power_off,
367 };
368 #endif
369
370 static struct sbs_platform_data sbs_pdata = {
371         .poll_retry_count = 100,
372         .i2c_retry_count = 2,
373 };
374
375 #ifndef CONFIG_OF
376 static int dalmore_ov9772_power_on(struct ov9772_power_rail *pw)
377 {
378         int err;
379
380         if (unlikely(!pw || !pw->avdd || !pw->dovdd))
381                 return -EFAULT;
382
383         if (dalmore_get_vcmvdd())
384                 goto ov9772_get_vcmvdd_fail;
385
386         gpio_set_value(CAM2_POWER_DWN_GPIO, 0);
387         gpio_set_value(CAM_RSTN, 0);
388
389         err = regulator_enable(pw->avdd);
390         if (unlikely(err))
391                 goto ov9772_avdd_fail;
392
393         err = regulator_enable(pw->dovdd);
394         if (unlikely(err))
395                 goto ov9772_dovdd_fail;
396
397         gpio_set_value(CAM_RSTN, 1);
398         gpio_set_value(CAM2_POWER_DWN_GPIO, 1);
399
400         err = regulator_enable(dalmore_vcmvdd);
401         if (unlikely(err))
402                 goto ov9772_vcmvdd_fail;
403
404         tegra_pinmux_config_table(&pbb0_enable, 1);
405         usleep_range(340, 380);
406
407         /* return 1 to skip the in-driver power_on sequence */
408         return 1;
409
410 ov9772_vcmvdd_fail:
411         regulator_disable(pw->dovdd);
412
413 ov9772_dovdd_fail:
414         regulator_disable(pw->avdd);
415
416 ov9772_avdd_fail:
417         gpio_set_value(CAM_RSTN, 0);
418         gpio_set_value(CAM2_POWER_DWN_GPIO, 0);
419
420 ov9772_get_vcmvdd_fail:
421         pr_err("%s FAILED\n", __func__);
422         return -ENODEV;
423 }
424
425 static int dalmore_ov9772_power_off(struct ov9772_power_rail *pw)
426 {
427         if (unlikely(!pw || !dalmore_vcmvdd || !pw->avdd || !pw->dovdd))
428                 return -EFAULT;
429
430         usleep_range(21, 25);
431         tegra_pinmux_config_table(&pbb0_disable, 1);
432
433         gpio_set_value(CAM2_POWER_DWN_GPIO, 0);
434         gpio_set_value(CAM_RSTN, 0);
435
436         regulator_disable(dalmore_vcmvdd);
437         regulator_disable(pw->dovdd);
438         regulator_disable(pw->avdd);
439
440         /* return 1 to skip the in-driver power_off sequence */
441         return 1;
442 }
443
444 static struct nvc_gpio_pdata ov9772_gpio_pdata[] = {
445         { OV9772_GPIO_TYPE_SHTDN, CAM2_POWER_DWN_GPIO, true, 0, },
446         { OV9772_GPIO_TYPE_PWRDN, CAM_RSTN, true, 0, },
447 };
448
449 static struct ov9772_platform_data dalmore_ov9772_pdata = {
450         .num            = 1,
451         .dev_name       = "camera",
452         .gpio_count     = ARRAY_SIZE(ov9772_gpio_pdata),
453         .gpio           = ov9772_gpio_pdata,
454         .power_on       = dalmore_ov9772_power_on,
455         .power_off      = dalmore_ov9772_power_off,
456 };
457 #endif
458
459 static int dalmore_as3648_power_on(struct as364x_power_rail *pw)
460 {
461         int err = dalmore_get_vcmvdd();
462
463         if (err)
464                 return err;
465
466         return regulator_enable(dalmore_vcmvdd);
467 }
468
469 static int dalmore_as3648_power_off(struct as364x_power_rail *pw)
470 {
471         if (!dalmore_vcmvdd)
472                 return -ENODEV;
473
474         return regulator_disable(dalmore_vcmvdd);
475 }
476
477 static struct as364x_platform_data dalmore_as3648_pdata = {
478         .config         = {
479                 .led_mask       = 3,
480                 .max_total_current_mA = 1000,
481                 .max_peak_current_mA = 600,
482                 .vin_low_v_run_mV = 3070,
483                 .strobe_type = 1,
484                 },
485         .pinstate       = {
486                 .mask   = 1 << (CAM_FLASH_STROBE - TEGRA_GPIO_PBB0),
487                 .values = 1 << (CAM_FLASH_STROBE - TEGRA_GPIO_PBB0)
488                 },
489         .dev_name       = "torch",
490         .type           = AS3648,
491         .gpio_strobe    = CAM_FLASH_STROBE,
492
493         .power_on_callback = dalmore_as3648_power_on,
494         .power_off_callback = dalmore_as3648_power_off,
495 };
496
497 #ifndef CONFIG_OF
498 static struct ad5816_platform_data dalmore_ad5816_pdata = {
499         .cfg = 0,
500         .num = 0,
501         .sync = 0,
502         .dev_name = "focuser",
503         .power_on = dalmore_focuser_power_on,
504         .power_off = dalmore_focuser_power_off,
505 };
506 #endif
507
508 static struct i2c_board_info dalmore_i2c_board_info_e1625[] = {
509 #ifndef CONFIG_OF
510         {
511                 I2C_BOARD_INFO("imx091", 0x36),
512                 .platform_data = &imx091_pdata,
513         },
514         {
515                 I2C_BOARD_INFO("ov9772", 0x10),
516                 .platform_data = &dalmore_ov9772_pdata,
517         },
518 #endif
519         {
520                 I2C_BOARD_INFO("as3648", 0x30),
521                 .platform_data = &dalmore_as3648_pdata,
522         },
523 #ifndef CONFIG_OF
524         {
525                 I2C_BOARD_INFO("ad5816", 0x0E),
526                 .platform_data = &dalmore_ad5816_pdata,
527         },
528 #endif
529 };
530
531 static int dalmore_camera_init(void)
532 {
533 #ifndef CONFIG_OF
534         tegra_pinmux_config_table(&mclk_disable, 1);
535         tegra_pinmux_config_table(&pbb0_disable, 1);
536 #endif
537
538         i2c_register_board_info(2, dalmore_i2c_board_info_e1625,
539                 ARRAY_SIZE(dalmore_i2c_board_info_e1625));
540         return 0;
541 }
542
543 #define TEGRA_CAMERA_GPIO(_gpio, _label, _value)                \
544         {                                                       \
545                 .gpio = _gpio,                                  \
546                 .label = _label,                                \
547                 .value = _value,                                \
548         }
549
550 static struct i2c_board_info dalmore_i2c_board_info_cm3218[] = {
551         {
552                 I2C_BOARD_INFO("cm3218", 0x48),
553         },
554 };
555
556 /* MPU board file definition    */
557 static struct mpu_platform_data mpu9150_gyro_data = {
558         .int_config     = 0x10,
559         .level_shifter  = 0,
560         /* Located in board_[platformname].h */
561         .orientation    = MPU_GYRO_ORIENTATION,
562         .sec_slave_type = SECONDARY_SLAVE_TYPE_NONE,
563         .key            = {0x4E, 0xCC, 0x7E, 0xEB, 0xF6, 0x1E, 0x35, 0x22,
564                            0x00, 0x34, 0x0D, 0x65, 0x32, 0xE9, 0x94, 0x89},
565 };
566
567 static struct mpu_platform_data mpu_compass_data = {
568         .orientation    = MPU_COMPASS_ORIENTATION,
569         .config         = NVI_CONFIG_BOOT_MPU,
570 };
571
572 static struct mpu_platform_data bmp180_pdata = {
573         .config         = NVI_CONFIG_BOOT_MPU,
574 };
575
576 static struct i2c_board_info __initdata inv_mpu9150_i2c2_board_info[] = {
577         {
578                 I2C_BOARD_INFO(MPU_GYRO_NAME, MPU_GYRO_ADDR),
579                 .platform_data = &mpu9150_gyro_data,
580         },
581         {
582                 /* The actual BMP180 address is 0x77 but because this conflicts
583                  * with another device, this address is hacked so Linux will
584                  * call the driver.  The conflict is technically okay since the
585                  * BMP180 is behind the MPU.  Also, the BMP180 driver uses a
586                  * hard-coded address of 0x77 since it can't be changed anyway.
587                  */
588                 I2C_BOARD_INFO("bmp180", 0x78),
589                 .platform_data = &bmp180_pdata,
590         },
591         {
592                 I2C_BOARD_INFO(MPU_COMPASS_NAME, MPU_COMPASS_ADDR),
593                 .platform_data = &mpu_compass_data,
594         },
595 };
596
597 static void mpuirq_init(void)
598 {
599         int ret = 0;
600         unsigned gyro_irq_gpio = MPU_GYRO_IRQ_GPIO;
601         unsigned gyro_bus_num = MPU_GYRO_BUS_NUM;
602         char *gyro_name = MPU_GYRO_NAME;
603
604         pr_info("*** MPU START *** mpuirq_init...\n");
605
606         ret = gpio_request(gyro_irq_gpio, gyro_name);
607
608         if (ret < 0) {
609                 pr_err("%s: gpio_request failed %d\n", __func__, ret);
610                 return;
611         }
612
613         ret = gpio_direction_input(gyro_irq_gpio);
614         if (ret < 0) {
615                 pr_err("%s: gpio_direction_input failed %d\n", __func__, ret);
616                 gpio_free(gyro_irq_gpio);
617                 return;
618         }
619         pr_info("*** MPU END *** mpuirq_init...\n");
620
621         inv_mpu9150_i2c2_board_info[0].irq = gpio_to_irq(MPU_GYRO_IRQ_GPIO);
622         i2c_register_board_info(gyro_bus_num, inv_mpu9150_i2c2_board_info,
623                 ARRAY_SIZE(inv_mpu9150_i2c2_board_info));
624 }
625
626 static int dalmore_nct1008_init(void)
627 {
628         int nct1008_port;
629         int ret = 0;
630
631         if ((board_info.board_id == BOARD_E1612) ||
632             (board_info.board_id == BOARD_E1641) ||
633             (board_info.board_id == BOARD_E1613) ||
634             (board_info.board_id == BOARD_P2454))
635         {
636                 /* per email from Matt 9/10/2012 */
637                 nct1008_port = TEGRA_GPIO_PX6;
638         } else if (board_info.board_id == BOARD_E1611) {
639                 if (board_info.fab == 0x04)
640                         nct1008_port = TEGRA_GPIO_PO4;
641                 else
642                         nct1008_port = TEGRA_GPIO_PX6;
643         } else {
644                 nct1008_port = TEGRA_GPIO_PX6;
645                 pr_err("Warning: nct alert_port assumed TEGRA_GPIO_PX6"
646                         " for unknown dalmore board id E%d\n",
647                         board_info.board_id);
648         }
649
650         tegra_add_all_vmin_trips(dalmore_nct1008_pdata.trips,
651                                 &dalmore_nct1008_pdata.num_trips);
652
653         dalmore_i2c4_nct1008_board_info[0].irq = gpio_to_irq(nct1008_port);
654         pr_info("%s: dalmore nct1008 irq %d",
655                         __func__, dalmore_i2c4_nct1008_board_info[0].irq);
656
657         ret = gpio_request(nct1008_port, "temp_alert");
658         if (ret < 0)
659                 return ret;
660
661         ret = gpio_direction_input(nct1008_port);
662         if (ret < 0) {
663                 pr_info("%s: calling gpio_free(nct1008_port)", __func__);
664                 gpio_free(nct1008_port);
665         }
666
667         /* dalmore has thermal sensor on GEN1-I2C i.e. instance 0 */
668         i2c_register_board_info(0, dalmore_i2c4_nct1008_board_info,
669                 ARRAY_SIZE(dalmore_i2c4_nct1008_board_info));
670
671         return ret;
672 }
673
674 static struct i2c_board_info __initdata bq20z45_pdata[] = {
675         {
676                 I2C_BOARD_INFO("sbs-battery", 0x0B),
677                 .platform_data = &sbs_pdata,
678         },
679 };
680
681 #ifdef CONFIG_TEGRA_SKIN_THROTTLE
682 static struct thermal_trip_info skin_trips[] = {
683         {
684                 .cdev_type = "skin-balanced",
685                 .trip_temp = 43000,
686                 .trip_type = THERMAL_TRIP_PASSIVE,
687                 .upper = THERMAL_NO_LIMIT,
688                 .lower = THERMAL_NO_LIMIT,
689                 .hysteresis = 0,
690         },
691         {
692                 .cdev_type = "tegra-shutdown",
693                 .trip_temp = 57000,
694                 .trip_type = THERMAL_TRIP_CRITICAL,
695                 .upper = THERMAL_NO_LIMIT,
696                 .lower = THERMAL_NO_LIMIT,
697                 .hysteresis = 0,
698         },
699 };
700
701 static struct therm_est_subdevice skin_devs[] = {
702         {
703                 .dev_data = "Tdiode",
704                 .coeffs = {
705                         2, 1, 1, 1,
706                         1, 1, 1, 1,
707                         1, 1, 1, 0,
708                         1, 1, 0, 0,
709                         0, 0, -1, -7
710                 },
711         },
712         {
713                 .dev_data = "Tboard",
714                 .coeffs = {
715                         -11, -7, -5, -3,
716                         -3, -2, -1, 0,
717                         0, 0, 1, 1,
718                         1, 2, 2, 3,
719                         4, 6, 11, 18
720                 },
721         },
722 };
723
724 static struct pid_thermal_gov_params skin_pid_params = {
725         .max_err_temp = 4000,
726         .max_err_gain = 1000,
727
728         .gain_p = 1000,
729         .gain_d = 0,
730
731         .up_compensation = 15,
732         .down_compensation = 15,
733 };
734
735 static struct thermal_zone_params skin_tzp = {
736         .governor_name = "pid_thermal_gov",
737         .governor_params = &skin_pid_params,
738 };
739
740 static struct therm_est_data skin_data = {
741         .num_trips = ARRAY_SIZE(skin_trips),
742         .trips = skin_trips,
743         .toffset = 9793,
744         .polling_period = 1100,
745         .passive_delay = 15000,
746         .tc1 = 10,
747         .tc2 = 1,
748         .ndevs = ARRAY_SIZE(skin_devs),
749         .devs = skin_devs,
750         .tzp = &skin_tzp,
751 };
752
753 static struct throttle_table skin_throttle_table[] = {
754         /* CPU_THROT_LOW cannot be used by other than CPU */
755         /*      CPU,  C2BUS,  C3BUS,   SCLK,    EMC   */
756         { { 1810500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
757         { { 1785000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
758         { { 1759500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
759         { { 1734000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
760         { { 1708500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
761         { { 1683000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
762         { { 1657500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
763         { { 1632000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
764         { { 1606500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
765         { { 1581000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
766         { { 1555500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
767         { { 1530000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
768         { { 1504500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
769         { { 1479000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
770         { { 1453500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
771         { { 1428000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
772         { { 1402500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
773         { { 1377000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
774         { { 1351500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
775         { { 1326000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
776         { { 1300500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
777         { { 1275000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
778         { { 1249500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
779         { { 1224000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
780         { { 1198500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
781         { { 1173000, 636000, NO_CAP, NO_CAP, NO_CAP } },
782         { { 1147500, 636000, NO_CAP, NO_CAP, NO_CAP } },
783         { { 1122000, 636000, NO_CAP, NO_CAP, NO_CAP } },
784         { { 1096500, 636000, NO_CAP, NO_CAP, NO_CAP } },
785         { { 1071000, 636000, NO_CAP, NO_CAP, NO_CAP } },
786         { { 1045500, 636000, NO_CAP, NO_CAP, NO_CAP } },
787         { { 1020000, 636000, NO_CAP, NO_CAP, NO_CAP } },
788         { {  994500, 636000, NO_CAP, NO_CAP, NO_CAP } },
789         { {  969000, 600000, NO_CAP, NO_CAP, NO_CAP } },
790         { {  943500, 600000, NO_CAP, NO_CAP, NO_CAP } },
791         { {  918000, 600000, NO_CAP, NO_CAP, NO_CAP } },
792         { {  892500, 600000, NO_CAP, NO_CAP, NO_CAP } },
793         { {  867000, 600000, NO_CAP, NO_CAP, NO_CAP } },
794         { {  841500, 564000, NO_CAP, NO_CAP, NO_CAP } },
795         { {  816000, 564000, NO_CAP, NO_CAP, 792000 } },
796         { {  790500, 564000, NO_CAP, 372000, 792000 } },
797         { {  765000, 564000, 468000, 372000, 792000 } },
798         { {  739500, 528000, 468000, 372000, 792000 } },
799         { {  714000, 528000, 468000, 336000, 792000 } },
800         { {  688500, 528000, 420000, 336000, 792000 } },
801         { {  663000, 492000, 420000, 336000, 792000 } },
802         { {  637500, 492000, 420000, 336000, 408000 } },
803         { {  612000, 492000, 420000, 300000, 408000 } },
804         { {  586500, 492000, 360000, 336000, 408000 } },
805         { {  561000, 420000, 420000, 300000, 408000 } },
806         { {  535500, 420000, 360000, 228000, 408000 } },
807         { {  510000, 420000, 288000, 228000, 408000 } },
808         { {  484500, 324000, 288000, 228000, 408000 } },
809         { {  459000, 324000, 288000, 228000, 408000 } },
810         { {  433500, 324000, 288000, 228000, 408000 } },
811         { {  408000, 324000, 288000, 228000, 408000 } },
812 };
813
814 static struct balanced_throttle skin_throttle = {
815         .throt_tab_size = ARRAY_SIZE(skin_throttle_table),
816         .throt_tab = skin_throttle_table,
817 };
818
819 static int __init dalmore_skin_init(void)
820 {
821         if (machine_is_dalmore()) {
822                 balanced_throttle_register(&skin_throttle, "skin-balanced");
823                 tegra_skin_therm_est_device.dev.platform_data = &skin_data;
824                 platform_device_register(&tegra_skin_therm_est_device);
825         }
826
827         return 0;
828 }
829 late_initcall(dalmore_skin_init);
830 #endif
831
832 int __init dalmore_sensors_init(void)
833 {
834         int err;
835
836         tegra_get_board_info(&board_info);
837
838         err = dalmore_nct1008_init();
839         if (err)
840                 return err;
841
842         dalmore_camera_init();
843         mpuirq_init();
844
845         i2c_register_board_info(0, dalmore_i2c_board_info_cm3218,
846                 ARRAY_SIZE(dalmore_i2c_board_info_cm3218));
847
848         i2c_register_board_info(0, bq20z45_pdata,
849                 ARRAY_SIZE(bq20z45_pdata));
850
851         return 0;
852 }