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