ARM: tegra12: set CPU rate to 2.2GHz for sku 0x87
[linux-3.10.git] / arch / arm / mach-tegra / board-macallan-sensors.c
1 /*
2  * arch/arm/mach-tegra/board-macallan-sensors.c
3  *
4  * Copyright (c) 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/cm3217.h>
39 #include <linux/pid_thermal_gov.h>
40 #include <mach/edp.h>
41 #include <linux/edp.h>
42 #include <mach/gpio-tegra.h>
43 #include <mach/pinmux-t11.h>
44 #include <mach/pinmux.h>
45 #include <media/imx091.h>
46 #include <media/ov9772.h>
47 #include <media/as364x.h>
48 #include <media/ad5816.h>
49 #include <generated/mach-types.h>
50 #include <linux/power/sbs-battery.h>
51
52 #include "gpio-names.h"
53 #include "board.h"
54 #include "board-common.h"
55 #include "board-macallan.h"
56 #include "cpu-tegra.h"
57 #include "devices.h"
58 #include "tegra-board-id.h"
59 #include "dvfs.h"
60
61 static struct nvc_gpio_pdata imx091_gpio_pdata[] = {
62         {IMX091_GPIO_RESET, CAM_RSTN, true, false},
63         {IMX091_GPIO_PWDN, CAM1_POWER_DWN_GPIO, true, false},
64         {IMX091_GPIO_GP1, CAM_GPIO1, true, false}
65 };
66
67 static struct board_info board_info;
68
69 static struct throttle_table tj_throttle_table[] = {
70         /* CPU_THROT_LOW cannot be used by other than CPU */
71         /*    CPU,   C2BUS,   C3BUS,   SCLK,    EMC */
72         { { 1810500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
73         { { 1785000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
74         { { 1759500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
75         { { 1734000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
76         { { 1708500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
77         { { 1683000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
78         { { 1657500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
79         { { 1632000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
80         { { 1606500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
81         { { 1581000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
82         { { 1555500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
83         { { 1530000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
84         { { 1504500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
85         { { 1479000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
86         { { 1453500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
87         { { 1428000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
88         { { 1402500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
89         { { 1377000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
90         { { 1351500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
91         { { 1326000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
92         { { 1300500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
93         { { 1275000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
94         { { 1249500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
95         { { 1224000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
96         { { 1198500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
97         { { 1173000, 636000, NO_CAP, NO_CAP, NO_CAP } },
98         { { 1147500, 636000, NO_CAP, NO_CAP, NO_CAP } },
99         { { 1122000, 636000, NO_CAP, NO_CAP, NO_CAP } },
100         { { 1096500, 636000, NO_CAP, NO_CAP, NO_CAP } },
101         { { 1071000, 636000, NO_CAP, NO_CAP, NO_CAP } },
102         { { 1045500, 636000, NO_CAP, NO_CAP, NO_CAP } },
103         { { 1020000, 636000, NO_CAP, NO_CAP, NO_CAP } },
104         { {  994500, 636000, NO_CAP, NO_CAP, NO_CAP } },
105         { {  969000, 600000, NO_CAP, NO_CAP, NO_CAP } },
106         { {  943500, 600000, NO_CAP, NO_CAP, NO_CAP } },
107         { {  918000, 600000, NO_CAP, NO_CAP, NO_CAP } },
108         { {  892500, 600000, NO_CAP, NO_CAP, NO_CAP } },
109         { {  867000, 600000, NO_CAP, NO_CAP, NO_CAP } },
110         { {  841500, 564000, NO_CAP, NO_CAP, NO_CAP } },
111         { {  816000, 564000, NO_CAP, NO_CAP, 792000 } },
112         { {  790500, 564000, NO_CAP, 372000, 792000 } },
113         { {  765000, 564000, 468000, 372000, 792000 } },
114         { {  739500, 528000, 468000, 372000, 792000 } },
115         { {  714000, 528000, 468000, 336000, 792000 } },
116         { {  688500, 528000, 420000, 336000, 792000 } },
117         { {  663000, 492000, 420000, 336000, 792000 } },
118         { {  637500, 492000, 420000, 336000, 408000 } },
119         { {  612000, 492000, 420000, 300000, 408000 } },
120         { {  586500, 492000, 360000, 336000, 408000 } },
121         { {  561000, 420000, 420000, 300000, 408000 } },
122         { {  535500, 420000, 360000, 228000, 408000 } },
123         { {  510000, 420000, 288000, 228000, 408000 } },
124         { {  484500, 324000, 288000, 228000, 408000 } },
125         { {  459000, 324000, 288000, 228000, 408000 } },
126         { {  433500, 324000, 288000, 228000, 408000 } },
127         { {  408000, 324000, 288000, 228000, 408000 } },
128 };
129
130 static struct balanced_throttle tj_throttle = {
131         .throt_tab_size = ARRAY_SIZE(tj_throttle_table),
132         .throt_tab = tj_throttle_table,
133 };
134
135 static int __init macallan_throttle_init(void)
136 {
137         if (machine_is_macallan())
138                 balanced_throttle_register(&tj_throttle, "tegra-balanced");
139         return 0;
140 }
141 module_init(macallan_throttle_init);
142
143 static struct nct1008_platform_data macallan_nct1008_pdata = {
144         .supported_hwrev = true,
145         .ext_range = true,
146         .conv_rate = 0x06, /* 4Hz conversion rate */
147         .shutdown_ext_limit = 105, /* C */
148         .shutdown_local_limit = 120, /* C */
149
150         .num_trips = 1,
151         .trips = {
152                 {
153                         .cdev_type = "suspend_soctherm",
154                         .trip_temp = 50000,
155                         .trip_type = THERMAL_TRIP_ACTIVE,
156                         .upper = 1,
157                         .lower = 1,
158                         .hysteresis = 5000,
159                 },
160         },
161 };
162
163 static struct i2c_board_info macallan_i2c4_nct1008_board_info[] = {
164         {
165                 I2C_BOARD_INFO("nct1008", 0x4C),
166                 .platform_data = &macallan_nct1008_pdata,
167                 .irq = -1,
168         }
169 };
170
171 #define VI_PINMUX(_pingroup, _mux, _pupd, _tri, _io, _lock, _ioreset) \
172         {                                                       \
173                 .pingroup       = TEGRA_PINGROUP_##_pingroup,   \
174                 .func           = TEGRA_MUX_##_mux,             \
175                 .pupd           = TEGRA_PUPD_##_pupd,           \
176                 .tristate       = TEGRA_TRI_##_tri,             \
177                 .io             = TEGRA_PIN_##_io,              \
178                 .lock           = TEGRA_PIN_LOCK_##_lock,       \
179                 .od             = TEGRA_PIN_OD_DEFAULT,         \
180                 .ioreset        = TEGRA_PIN_IO_RESET_##_ioreset \
181 }
182
183 static int macallan_focuser_power_on(struct ad5816_power_rail *pw)
184 {
185         int err;
186
187         if (unlikely(WARN_ON(!pw || !pw->vdd || !pw->vdd_i2c)))
188                 return -EFAULT;
189
190         err = regulator_enable(pw->vdd_i2c);
191         if (unlikely(err))
192                 goto ad5816_vdd_i2c_fail;
193
194         err = regulator_enable(pw->vdd);
195         if (unlikely(err))
196                 goto ad5816_vdd_fail;
197
198         return 0;
199
200 ad5816_vdd_fail:
201         regulator_disable(pw->vdd_i2c);
202
203 ad5816_vdd_i2c_fail:
204         pr_err("%s FAILED\n", __func__);
205
206         return -ENODEV;
207 }
208
209 static int macallan_focuser_power_off(struct ad5816_power_rail *pw)
210 {
211         if (unlikely(WARN_ON(!pw || !pw->vdd || !pw->vdd_i2c)))
212                 return -EFAULT;
213
214         regulator_disable(pw->vdd);
215         regulator_disable(pw->vdd_i2c);
216
217         return 0;
218 }
219
220 static struct tegra_pingroup_config mclk_disable =
221         VI_PINMUX(CAM_MCLK, VI, NORMAL, NORMAL, OUTPUT, DEFAULT, DEFAULT);
222
223 static struct tegra_pingroup_config mclk_enable =
224         VI_PINMUX(CAM_MCLK, VI_ALT3, NORMAL, NORMAL, OUTPUT, DEFAULT, DEFAULT);
225
226 static struct tegra_pingroup_config pbb0_disable =
227         VI_PINMUX(GPIO_PBB0, VI, NORMAL, NORMAL, OUTPUT, DEFAULT, DEFAULT);
228
229 static struct tegra_pingroup_config pbb0_enable =
230         VI_PINMUX(GPIO_PBB0, VI_ALT3, NORMAL, NORMAL, OUTPUT, DEFAULT, DEFAULT);
231
232 /*
233  * As a workaround, macallan_vcmvdd need to be allocated to activate the
234  * sensor devices. This is due to the focuser device(AD5816) will hook up
235  * the i2c bus if it is not powered up.
236 */
237 static struct regulator *macallan_vcmvdd;
238
239 static int macallan_get_vcmvdd(void)
240 {
241         if (!macallan_vcmvdd) {
242                 macallan_vcmvdd = regulator_get(NULL, "vdd_af_cam1");
243                 if (unlikely(WARN_ON(IS_ERR(macallan_vcmvdd)))) {
244                         pr_err("%s: can't get regulator vcmvdd: %ld\n",
245                                 __func__, PTR_ERR(macallan_vcmvdd));
246                         macallan_vcmvdd = NULL;
247                         return -ENODEV;
248                 }
249         }
250         return 0;
251 }
252
253 static int macallan_imx091_power_on(struct nvc_regulator *vreg)
254 {
255         int err;
256
257         if (unlikely(WARN_ON(!vreg)))
258                 return -EFAULT;
259
260         if (macallan_get_vcmvdd())
261                 goto imx091_poweron_fail;
262
263         gpio_set_value(CAM1_POWER_DWN_GPIO, 0);
264         usleep_range(10, 20);
265
266         err = regulator_enable(vreg[IMX091_VREG_AVDD].vreg);
267         if (err)
268                 goto imx091_avdd_fail;
269
270         err = regulator_enable(vreg[IMX091_VREG_DVDD].vreg);
271         if (err)
272                 goto imx091_dvdd_fail;
273
274         err = regulator_enable(vreg[IMX091_VREG_IOVDD].vreg);
275         if (err)
276                 goto imx091_iovdd_fail;
277
278         usleep_range(1, 2);
279         gpio_set_value(CAM1_POWER_DWN_GPIO, 1);
280
281         err = regulator_enable(macallan_vcmvdd);
282         if (unlikely(err))
283                 goto imx091_vcmvdd_fail;
284
285         tegra_pinmux_config_table(&mclk_enable, 1);
286         usleep_range(300, 310);
287
288         return 1;
289
290 imx091_vcmvdd_fail:
291         regulator_disable(vreg[IMX091_VREG_IOVDD].vreg);
292
293 imx091_iovdd_fail:
294         regulator_disable(vreg[IMX091_VREG_DVDD].vreg);
295
296 imx091_dvdd_fail:
297         regulator_disable(vreg[IMX091_VREG_AVDD].vreg);
298
299 imx091_avdd_fail:
300         gpio_set_value(CAM1_POWER_DWN_GPIO, 0);
301
302 imx091_poweron_fail:
303         pr_err("%s FAILED\n", __func__);
304         return -ENODEV;
305 }
306
307 static int macallan_imx091_power_off(struct nvc_regulator *vreg)
308 {
309         if (unlikely(WARN_ON(!vreg)))
310                 return -EFAULT;
311
312         usleep_range(1, 2);
313         tegra_pinmux_config_table(&mclk_disable, 1);
314         gpio_set_value(CAM1_POWER_DWN_GPIO, 0);
315         usleep_range(1, 2);
316
317         regulator_disable(macallan_vcmvdd);
318         regulator_disable(vreg[IMX091_VREG_IOVDD].vreg);
319         regulator_disable(vreg[IMX091_VREG_DVDD].vreg);
320         regulator_disable(vreg[IMX091_VREG_AVDD].vreg);
321
322         return 1;
323 }
324
325 static struct nvc_imager_cap imx091_cap = {
326         .identifier             = "IMX091",
327         .sensor_nvc_interface   = 3,
328         .pixel_types[0]         = 0x100,
329         .orientation            = 0,
330         .direction              = 0,
331         .initial_clock_rate_khz = 6000,
332         .clock_profiles[0] = {
333                 .external_clock_khz     = 24000,
334                 .clock_multiplier       = 850000, /* value / 1,000,000 */
335         },
336         .clock_profiles[1] = {
337                 .external_clock_khz     = 0,
338                 .clock_multiplier       = 0,
339         },
340         .h_sync_edge            = 0,
341         .v_sync_edge            = 0,
342         .mclk_on_vgp0           = 0,
343         .csi_port               = 0,
344         .data_lanes             = 4,
345         .virtual_channel_id     = 0,
346         .discontinuous_clk_mode = 1,
347         .cil_threshold_settle   = 0x0,
348         .min_blank_time_width   = 16,
349         .min_blank_time_height  = 16,
350         .preferred_mode_index   = 0,
351         .focuser_guid           = NVC_FOCUS_GUID(0),
352         .torch_guid             = NVC_TORCH_GUID(0),
353         .cap_version            = NVC_IMAGER_CAPABILITIES_VERSION2,
354 };
355
356 static struct imx091_platform_data imx091_pdata = {
357         .num                    = 0,
358         .sync                   = 0,
359         .dev_name               = "camera",
360         .gpio_count             = ARRAY_SIZE(imx091_gpio_pdata),
361         .gpio                   = imx091_gpio_pdata,
362         .flash_cap              = {
363                 .sdo_trigger_enabled = 1,
364                 .adjustable_flash_timing = 1,
365         },
366         .cap                    = &imx091_cap,
367         .power_on               = macallan_imx091_power_on,
368         .power_off              = macallan_imx091_power_off,
369 };
370
371 static int macallan_ov9772_power_on(struct ov9772_power_rail *pw)
372 {
373         int err;
374
375         if (unlikely(!pw || !pw->avdd || !pw->dovdd))
376                 return -EFAULT;
377
378         if (macallan_get_vcmvdd())
379                 goto ov9772_get_vcmvdd_fail;
380
381         gpio_set_value(CAM2_POWER_DWN_GPIO, 0);
382         gpio_set_value(CAM_RSTN, 0);
383
384         err = regulator_enable(pw->avdd);
385         if (unlikely(err))
386                 goto ov9772_avdd_fail;
387
388         err = regulator_enable(pw->dvdd);
389         if (unlikely(err))
390                 goto ov9772_dvdd_fail;
391
392         err = regulator_enable(pw->dovdd);
393         if (unlikely(err))
394                 goto ov9772_dovdd_fail;
395
396         gpio_set_value(CAM_RSTN, 1);
397         gpio_set_value(CAM2_POWER_DWN_GPIO, 1);
398
399         err = regulator_enable(macallan_vcmvdd);
400         if (unlikely(err))
401                 goto ov9772_vcmvdd_fail;
402
403         tegra_pinmux_config_table(&pbb0_enable, 1);
404         usleep_range(340, 380);
405
406         /* return 1 to skip the in-driver power_on sequence */
407         return 1;
408
409 ov9772_vcmvdd_fail:
410         regulator_disable(pw->dovdd);
411
412 ov9772_dovdd_fail:
413         regulator_disable(pw->dvdd);
414
415 ov9772_dvdd_fail:
416         regulator_disable(pw->avdd);
417
418 ov9772_avdd_fail:
419         gpio_set_value(CAM_RSTN, 0);
420         gpio_set_value(CAM2_POWER_DWN_GPIO, 0);
421
422 ov9772_get_vcmvdd_fail:
423         pr_err("%s FAILED\n", __func__);
424         return -ENODEV;
425 }
426
427 static int macallan_ov9772_power_off(struct ov9772_power_rail *pw)
428 {
429         if (unlikely(!pw || !macallan_vcmvdd || !pw->avdd || !pw->dovdd))
430                 return -EFAULT;
431
432         usleep_range(21, 25);
433         tegra_pinmux_config_table(&pbb0_disable, 1);
434
435         gpio_set_value(CAM2_POWER_DWN_GPIO, 0);
436         gpio_set_value(CAM_RSTN, 0);
437
438         regulator_disable(macallan_vcmvdd);
439         regulator_disable(pw->dovdd);
440         regulator_disable(pw->dvdd);
441         regulator_disable(pw->avdd);
442
443         /* return 1 to skip the in-driver power_off sequence */
444         return 1;
445 }
446
447 static struct nvc_gpio_pdata ov9772_gpio_pdata[] = {
448         { OV9772_GPIO_TYPE_SHTDN, CAM2_POWER_DWN_GPIO, true, 0, },
449         { OV9772_GPIO_TYPE_PWRDN, CAM_RSTN, true, 0, },
450 };
451
452 static struct ov9772_platform_data macallan_ov9772_pdata = {
453         .num            = 1,
454         .dev_name       = "camera",
455         .gpio_count     = ARRAY_SIZE(ov9772_gpio_pdata),
456         .gpio           = ov9772_gpio_pdata,
457         .power_on       = macallan_ov9772_power_on,
458         .power_off      = macallan_ov9772_power_off,
459 };
460
461 static int macallan_as3648_power_on(struct as364x_power_rail *pw)
462 {
463         int err = macallan_get_vcmvdd();
464
465         if (err)
466                 return err;
467
468         return regulator_enable(macallan_vcmvdd);
469 }
470
471 static int macallan_as3648_power_off(struct as364x_power_rail *pw)
472 {
473         if (!macallan_vcmvdd)
474                 return -ENODEV;
475
476         return regulator_disable(macallan_vcmvdd);
477 }
478
479 static struct as364x_platform_data macallan_as3648_pdata = {
480         .config         = {
481                 .led_mask       = 3,
482                 .max_total_current_mA = 1000,
483                 .max_peak_current_mA = 600,
484                 .vin_low_v_run_mV = 3070,
485                 .strobe_type = 1,
486                 },
487         .pinstate       = {
488                 .mask   = 1 << (CAM_FLASH_STROBE - TEGRA_GPIO_PBB0),
489                 .values = 1 << (CAM_FLASH_STROBE - TEGRA_GPIO_PBB0)
490                 },
491         .dev_name       = "torch",
492         .type           = AS3648,
493         .gpio_strobe    = CAM_FLASH_STROBE,
494         .power_on_callback = macallan_as3648_power_on,
495         .power_off_callback = macallan_as3648_power_off,
496 };
497
498 static struct ad5816_platform_data macallan_ad5816_pdata = {
499         .cfg = 0,
500         .num = 0,
501         .sync = 0,
502         .dev_name = "focuser",
503         .power_on = macallan_focuser_power_on,
504         .power_off = macallan_focuser_power_off,
505 };
506
507 static struct i2c_board_info macallan_i2c_board_info_e1625[] = {
508         {
509                 I2C_BOARD_INFO("imx091", 0x36),
510                 .platform_data = &imx091_pdata,
511         },
512         {
513                 I2C_BOARD_INFO("ov9772", 0x10),
514                 .platform_data = &macallan_ov9772_pdata,
515         },
516         {
517                 I2C_BOARD_INFO("as3648", 0x30),
518                 .platform_data = &macallan_as3648_pdata,
519         },
520         {
521                 I2C_BOARD_INFO("ad5816", 0x0E),
522                 .platform_data = &macallan_ad5816_pdata,
523         },
524 };
525
526 static int macallan_camera_init(void)
527 {
528         tegra_pinmux_config_table(&mclk_disable, 1);
529         tegra_pinmux_config_table(&pbb0_disable, 1);
530
531         i2c_register_board_info(2, macallan_i2c_board_info_e1625,
532                 ARRAY_SIZE(macallan_i2c_board_info_e1625));
533         return 0;
534 }
535
536 #define TEGRA_CAMERA_GPIO(_gpio, _label, _value)                \
537         {                                                       \
538                 .gpio = _gpio,                                  \
539                 .label = _label,                                \
540                 .value = _value,                                \
541         }
542
543 static struct cm3217_platform_data macallan_cm3217_pdata = {
544         .levels = {10, 160, 225, 320, 640, 1280, 2600, 5800, 8000, 10240},
545         .golden_adc = 0,
546         .power = 0,
547 };
548
549 static struct i2c_board_info macallan_i2c0_board_info_cm3217[] = {
550         {
551                 I2C_BOARD_INFO("cm3217", 0x10),
552                 .platform_data = &macallan_cm3217_pdata,
553         },
554 };
555
556 /* MPU board file definition    */
557 static struct mpu_platform_data mpu6050_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_mpu6050_i2c2_board_info[] = {
577         {
578                 I2C_BOARD_INFO(MPU_GYRO_NAME, MPU_GYRO_ADDR),
579                 .platform_data = &mpu6050_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_mpu6050_i2c2_board_info[0].irq = gpio_to_irq(MPU_GYRO_IRQ_GPIO);
622         i2c_register_board_info(gyro_bus_num, inv_mpu6050_i2c2_board_info,
623                 ARRAY_SIZE(inv_mpu6050_i2c2_board_info));
624 }
625
626 static int macallan_nct1008_init(void)
627 {
628         int nct1008_port;
629         int ret = 0;
630
631         nct1008_port = TEGRA_GPIO_PO4;
632
633         tegra_add_all_vmin_trips(macallan_nct1008_pdata.trips,
634                                 &macallan_nct1008_pdata.num_trips);
635
636         macallan_i2c4_nct1008_board_info[0].irq = gpio_to_irq(nct1008_port);
637         pr_info("%s: macallan nct1008 irq %d",
638                         __func__, macallan_i2c4_nct1008_board_info[0].irq);
639
640         ret = gpio_request(nct1008_port, "temp_alert");
641         if (ret < 0)
642                 return ret;
643
644         ret = gpio_direction_input(nct1008_port);
645         if (ret < 0) {
646                 pr_info("%s: calling gpio_free(nct1008_port)", __func__);
647                 gpio_free(nct1008_port);
648         }
649
650         /* macallan has thermal sensor on GEN1-I2C i.e. instance 0 */
651         i2c_register_board_info(0, macallan_i2c4_nct1008_board_info,
652                 ARRAY_SIZE(macallan_i2c4_nct1008_board_info));
653
654         return ret;
655 }
656
657 #ifdef CONFIG_TEGRA_SKIN_THROTTLE
658 static struct thermal_trip_info skin_trips[] = {
659         {
660                 .cdev_type = "skin-balanced",
661                 .trip_temp = 43000,
662                 .trip_type = THERMAL_TRIP_PASSIVE,
663                 .upper = THERMAL_NO_LIMIT,
664                 .lower = THERMAL_NO_LIMIT,
665                 .hysteresis = 0,
666         },
667         {
668                 .cdev_type = "tegra-shutdown",
669                 .trip_temp = 57000,
670                 .trip_type = THERMAL_TRIP_CRITICAL,
671                 .upper = THERMAL_NO_LIMIT,
672                 .lower = THERMAL_NO_LIMIT,
673                 .hysteresis = 0,
674         },
675 };
676
677 static struct therm_est_subdevice skin_devs[] = {
678         {
679                 .dev_data = "Tdiode",
680                 .coeffs = {
681                         2, 1, 1, 1,
682                         1, 1, 1, 1,
683                         1, 1, 1, 0,
684                         1, 1, 0, 0,
685                         0, 0, -1, -7
686                 },
687         },
688         {
689                 .dev_data = "Tboard",
690                 .coeffs = {
691                         -11, -7, -5, -3,
692                         -3, -2, -1, 0,
693                         0, 0, 1, 1,
694                         1, 2, 2, 3,
695                         4, 6, 11, 18
696                 },
697         },
698 };
699
700 static struct pid_thermal_gov_params skin_pid_params = {
701         .max_err_temp = 4000,
702         .max_err_gain = 1000,
703
704         .gain_p = 1000,
705         .gain_d = 0,
706
707         .up_compensation = 15,
708         .down_compensation = 15,
709 };
710
711 static struct thermal_zone_params skin_tzp = {
712         .governor_name = "pid_thermal_gov",
713         .governor_params = &skin_pid_params,
714 };
715
716 static struct therm_est_data skin_data = {
717         .num_trips = ARRAY_SIZE(skin_trips),
718         .trips = skin_trips,
719         .toffset = 9793,
720         .polling_period = 1100,
721         .passive_delay = 15000,
722         .tc1 = 10,
723         .tc2 = 1,
724         .ndevs = ARRAY_SIZE(skin_devs),
725         .devs = skin_devs,
726         .tzp = &skin_tzp,
727 };
728
729 static struct throttle_table skin_throttle_table[] = {
730         /* CPU_THROT_LOW cannot be used by other than CPU */
731         /*    CPU,   C2BUS,   C3BUS,   SCLK,    EMC    */
732         { { 1810500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
733         { { 1785000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
734         { { 1759500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
735         { { 1734000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
736         { { 1708500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
737         { { 1683000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
738         { { 1657500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
739         { { 1632000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
740         { { 1606500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
741         { { 1581000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
742         { { 1555500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
743         { { 1530000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
744         { { 1504500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
745         { { 1479000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
746         { { 1453500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
747         { { 1428000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
748         { { 1402500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
749         { { 1377000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
750         { { 1351500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
751         { { 1326000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
752         { { 1300500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
753         { { 1275000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
754         { { 1249500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
755         { { 1224000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
756         { { 1198500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
757         { { 1173000, 636000, NO_CAP, NO_CAP, NO_CAP } },
758         { { 1147500, 636000, NO_CAP, NO_CAP, NO_CAP } },
759         { { 1122000, 636000, NO_CAP, NO_CAP, NO_CAP } },
760         { { 1096500, 636000, NO_CAP, NO_CAP, NO_CAP } },
761         { { 1071000, 636000, NO_CAP, NO_CAP, NO_CAP } },
762         { { 1045500, 636000, NO_CAP, NO_CAP, NO_CAP } },
763         { { 1020000, 636000, NO_CAP, NO_CAP, NO_CAP } },
764         { {  994500, 636000, NO_CAP, NO_CAP, NO_CAP } },
765         { {  969000, 600000, NO_CAP, NO_CAP, NO_CAP } },
766         { {  943500, 600000, NO_CAP, NO_CAP, NO_CAP } },
767         { {  918000, 600000, NO_CAP, NO_CAP, NO_CAP } },
768         { {  892500, 600000, NO_CAP, NO_CAP, NO_CAP } },
769         { {  867000, 600000, NO_CAP, NO_CAP, NO_CAP } },
770         { {  841500, 564000, NO_CAP, NO_CAP, NO_CAP } },
771         { {  816000, 564000, NO_CAP, NO_CAP, 792000 } },
772         { {  790500, 564000, NO_CAP, 372000, 792000 } },
773         { {  765000, 564000, 468000, 372000, 792000 } },
774         { {  739500, 528000, 468000, 372000, 792000 } },
775         { {  714000, 528000, 468000, 336000, 792000 } },
776         { {  688500, 528000, 420000, 336000, 792000 } },
777         { {  663000, 492000, 420000, 336000, 792000 } },
778         { {  637500, 492000, 420000, 336000, 408000 } },
779         { {  612000, 492000, 420000, 300000, 408000 } },
780         { {  586500, 492000, 360000, 336000, 408000 } },
781         { {  561000, 420000, 420000, 300000, 408000 } },
782         { {  535500, 420000, 360000, 228000, 408000 } },
783         { {  510000, 420000, 288000, 228000, 408000 } },
784         { {  484500, 324000, 288000, 228000, 408000 } },
785         { {  459000, 324000, 288000, 228000, 408000 } },
786         { {  433500, 324000, 288000, 228000, 408000 } },
787         { {  408000, 324000, 288000, 228000, 408000 } },
788 };
789
790 static struct balanced_throttle skin_throttle = {
791         .throt_tab_size = ARRAY_SIZE(skin_throttle_table),
792         .throt_tab = skin_throttle_table,
793 };
794
795 static int __init macallan_skin_init(void)
796 {
797         if (machine_is_macallan()) {
798                 balanced_throttle_register(&skin_throttle, "skin-balanced");
799                 tegra_skin_therm_est_device.dev.platform_data = &skin_data;
800                 platform_device_register(&tegra_skin_therm_est_device);
801         }
802
803         return 0;
804 }
805 late_initcall(macallan_skin_init);
806 #endif
807
808 int __init macallan_sensors_init(void)
809 {
810         int err;
811
812         tegra_get_board_info(&board_info);
813
814         /* E1545+E1604 has no temp sensor. */
815         if (board_info.board_id != BOARD_E1545) {
816                 err = macallan_nct1008_init();
817                 if (err) {
818                         pr_err("%s: nct1008 register failed.\n", __func__);
819                         return err;
820                 }
821         }
822
823         macallan_camera_init();
824         mpuirq_init();
825
826         i2c_register_board_info(0, macallan_i2c0_board_info_cm3217,
827                                 ARRAY_SIZE(macallan_i2c0_board_info_cm3217));
828
829         return 0;
830 }