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