ARM: tegra12: set CPU rate to 2.2GHz for sku 0x87
[linux-3.10.git] / arch / arm / mach-tegra / board-loki-sensors.c
1 /*
2  * arch/arm/mach-tegra/board-loki-sensors.c
3  *
4  * Copyright (c) 2013-2014, NVIDIA CORPORATION.  All rights reserved.
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms and conditions of the GNU General Public License,
8  * version 2, as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13  * more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  */
18
19 #include <linux/i2c.h>
20 #include <linux/gpio.h>
21 #include <linux/mpu.h>
22 #include <linux/delay.h>
23 #include <linux/err.h>
24 #include <linux/nct1008.h>
25 #include <linux/tegra-fuse.h>
26 #include <media/camera.h>
27 #include <media/mt9m114.h>
28 #include <media/ov7695.h>
29 #include <mach/gpio-tegra.h>
30 #include <mach/edp.h>
31 #include <mach/io_dpd.h>
32 #include <linux/gpio.h>
33 #include <linux/therm_est.h>
34 #include <linux/platform_device.h>
35 #include <linux/regulator/consumer.h>
36 #include <linux/generic_adc_thermal.h>
37
38 #include "board.h"
39 #include "board-common.h"
40 #include "board-loki.h"
41 #include "tegra-board-id.h"
42 #include "dvfs.h"
43 #include "cpu-tegra.h"
44
45 static struct board_info board_info;
46
47 #ifndef CONFIG_USE_OF
48
49 /* MPU board file definition    */
50 static struct mpu_platform_data mpu6050_gyro_data = {
51         .int_config     = 0x10,
52         .level_shifter  = 0,
53         /* Located in board_[platformname].h */
54         .orientation    = MPU_GYRO_ORIENTATION,
55         .sec_slave_type = SECONDARY_SLAVE_TYPE_NONE,
56         .key            = {0x4E, 0xCC, 0x7E, 0xEB, 0xF6, 0x1E, 0x35, 0x22,
57                         0x00, 0x34, 0x0D, 0x65, 0x32, 0xE9, 0x94, 0x89},
58 };
59
60 /* MPU board file definition    */
61 static struct mpu_platform_data mpu6050_gyro_data_fab_0 = {
62         .int_config     = 0x10,
63         .level_shifter  = 0,
64         /* Located in board_[platformname].h */
65         .orientation    = MPU_GYRO_ORIENTATION_FAB0,
66         .sec_slave_type = SECONDARY_SLAVE_TYPE_NONE,
67         .key            = {0x4E, 0xCC, 0x7E, 0xEB, 0xF6, 0x1E, 0x35, 0x22,
68                         0x00, 0x34, 0x0D, 0x65, 0x32, 0xE9, 0x94, 0x89},
69 };
70
71 /* MPU board file definition    */
72 static struct mpu_platform_data mpu6050_gyro_data_t_1_95 = {
73         .int_config     = 0x10,
74         .level_shifter  = 0,
75         /* Located in board_[platformname].h */
76         .orientation    = MPU_GYRO_ORIENTATION_T_1_95,
77         .sec_slave_type = SECONDARY_SLAVE_TYPE_NONE,
78         .key            = {0x4E, 0xCC, 0x7E, 0xEB, 0xF6, 0x1E, 0x35, 0x22,
79                         0x00, 0x34, 0x0D, 0x65, 0x32, 0xE9, 0x94, 0x89},
80 };
81
82 static struct mpu_platform_data mpu_compass_data = {
83         .orientation    = MPU_COMPASS_ORIENTATION,
84         .config         = NVI_CONFIG_BOOT_HOST,
85 };
86
87 static struct i2c_board_info __initdata inv_mpu6050_i2c0_board_info[] = {
88         {
89                 I2C_BOARD_INFO(MPU_GYRO_NAME, MPU_GYRO_ADDR),
90                 .platform_data = &mpu6050_gyro_data,
91         },
92         {
93                 I2C_BOARD_INFO(MPU_COMPASS_NAME, MPU_COMPASS_ADDR),
94                 .platform_data = &mpu_compass_data,
95         },
96 };
97
98 static void mpuirq_init(void)
99 {
100         int ret = 0;
101         unsigned gyro_irq_gpio = MPU_GYRO_IRQ_GPIO;
102         unsigned gyro_bus_num = MPU_GYRO_BUS_NUM;
103         char *gyro_name = MPU_GYRO_NAME;
104
105         pr_info("*** MPU START *** mpuirq_init...\n");
106
107         ret = gpio_request(gyro_irq_gpio, gyro_name);
108
109         if (ret < 0) {
110                 pr_err("%s: gpio_request failed %d\n", __func__, ret);
111                 return;
112         }
113
114         ret = gpio_direction_input(gyro_irq_gpio);
115         if (ret < 0) {
116                 pr_err("%s: gpio_direction_input failed %d\n", __func__, ret);
117                 gpio_free(gyro_irq_gpio);
118                 return;
119         }
120         pr_info("*** MPU END *** mpuirq_init...\n");
121
122         if (board_info.board_id == BOARD_E2549)
123                 inv_mpu6050_i2c0_board_info[0].platform_data =
124                                                 &mpu6050_gyro_data_t_1_95;
125         else {
126                 struct board_info displayboard_info;
127                 tegra_get_display_board_info(&displayboard_info);
128                 if (displayboard_info.fab == 0x0)
129                         inv_mpu6050_i2c0_board_info[0].platform_data =
130                                 &mpu6050_gyro_data_fab_0;
131         }
132         inv_mpu6050_i2c0_board_info[0].irq = gpio_to_irq(MPU_GYRO_IRQ_GPIO);
133         i2c_register_board_info(gyro_bus_num, inv_mpu6050_i2c0_board_info,
134                 ARRAY_SIZE(inv_mpu6050_i2c0_board_info));
135 }
136
137 #else
138
139 static void mpu_dt_update(void)
140 {
141         struct device_node *np;
142         struct board_info displayboard_info;
143         static signed char mpu_gyro_orientation_1_95[] = {
144                 0,  1,  0,  0,  0,  1,  1,  0,  0
145         };
146         static signed char mpu_gyro_orientation_fab0[] = {
147                 0, -1,  0, -1,  0,  0,  0,  0, -1
148         };
149         static struct property orientation = {
150                 .name = "invensense,orientation",
151                 .value = mpu_gyro_orientation_1_95,
152                 .length = sizeof(mpu_gyro_orientation_1_95),
153         };
154
155         np = of_find_compatible_node(NULL, NULL, "invensense,mpu6050");
156         if (np == NULL) {
157                 pr_err("%s: Cannot find mpu6050 node\n", __func__);
158                 return;
159         }
160
161         if (board_info.board_id == BOARD_E2549) {
162                 of_update_property(np, &orientation);
163         } else {
164                 tegra_get_display_board_info(&displayboard_info);
165                 if (displayboard_info.fab == 0x0) {
166                         orientation.value = mpu_gyro_orientation_fab0;
167                         of_update_property(np, &orientation);
168                 }
169         }
170
171         of_node_put(np);
172 }
173
174 #endif
175
176 static struct tegra_io_dpd csia_io = {
177         .name                   = "CSIA",
178         .io_dpd_reg_index       = 0,
179         .io_dpd_bit             = 0,
180 };
181
182 static struct tegra_io_dpd csib_io = {
183         .name                   = "CSIB",
184         .io_dpd_reg_index       = 0,
185         .io_dpd_bit             = 1,
186 };
187
188 static struct tegra_io_dpd csie_io = {
189         .name                   = "CSIE",
190         .io_dpd_reg_index       = 1,
191         .io_dpd_bit             = 12,
192 };
193
194 static int loki_mt9m114_power_on(struct mt9m114_power_rail *pw)
195 {
196         int err;
197         if (unlikely(!pw || !pw->avdd || !pw->iovdd))
198                 return -EFAULT;
199
200         /* disable CSIA IOs DPD mode to turn on front camera for ardbeg */
201         tegra_io_dpd_disable(&csia_io);
202
203         gpio_set_value(CAM_RSTN, 0);
204         gpio_set_value(CAM2_PWDN, 1);
205         usleep_range(1000, 1020);
206
207         err = regulator_enable(pw->iovdd);
208         if (unlikely(err))
209                 goto mt9m114_iovdd_fail;
210
211         err = regulator_enable(pw->avdd);
212         if (unlikely(err))
213                 goto mt9m114_avdd_fail;
214
215         usleep_range(1000, 1020);
216         gpio_set_value(CAM_RSTN, 1);
217         gpio_set_value(CAM2_PWDN, 0);
218         usleep_range(1000, 1020);
219
220         /* return 1 to skip the in-driver power_on swquence */
221         return 1;
222
223 mt9m114_avdd_fail:
224         regulator_disable(pw->iovdd);
225
226 mt9m114_iovdd_fail:
227         gpio_set_value(CAM_RSTN, 0);
228         /* put CSIA IOs into DPD mode to save additional power for ardbeg */
229         tegra_io_dpd_enable(&csia_io);
230         return -ENODEV;
231 }
232
233 static int loki_mt9m114_power_off(struct mt9m114_power_rail *pw)
234 {
235         if (unlikely(!pw || !pw->avdd || !pw->iovdd)) {
236                 /* put CSIA IOs into DPD mode to
237                  * save additional power for ardbeg
238                  */
239                 tegra_io_dpd_enable(&csia_io);
240                 return -EFAULT;
241         }
242
243         usleep_range(100, 120);
244         gpio_set_value(CAM_RSTN, 0);
245         usleep_range(100, 120);
246         regulator_disable(pw->avdd);
247         usleep_range(100, 120);
248         regulator_disable(pw->iovdd);
249
250         /* put CSIA IOs into DPD mode to save additional power for ardbeg */
251         tegra_io_dpd_enable(&csia_io);
252         return 1;
253 }
254
255 struct mt9m114_platform_data loki_mt9m114_pdata = {
256         .power_on = loki_mt9m114_power_on,
257         .power_off = loki_mt9m114_power_off,
258 };
259
260 static int loki_ov7695_power_on(struct ov7695_power_rail *pw)
261 {
262         int err;
263
264         if (unlikely(WARN_ON(!pw || !pw->avdd || !pw->iovdd)))
265                 return -EFAULT;
266
267         /* disable CSIA IOs DPD mode to turn on front camera for ardbeg */
268         tegra_io_dpd_disable(&csia_io);
269
270         gpio_set_value(CAM2_PWDN, 0);
271         usleep_range(1000, 1020);
272
273         err = regulator_enable(pw->avdd);
274         if (unlikely(err))
275                 goto ov7695_avdd_fail;
276         usleep_range(300, 320);
277
278         err = regulator_enable(pw->iovdd);
279         if (unlikely(err))
280                 goto ov7695_iovdd_fail;
281         usleep_range(1000, 1020);
282
283         gpio_set_value(CAM2_PWDN, 1);
284         usleep_range(1000, 1020);
285
286         return 0;
287
288 ov7695_iovdd_fail:
289         regulator_disable(pw->avdd);
290
291 ov7695_avdd_fail:
292         gpio_set_value(CAM_RSTN, 0);
293         /* put CSIA IOs into DPD mode to save additional power for ardbeg */
294         tegra_io_dpd_enable(&csia_io);
295         return -ENODEV;
296 }
297
298 static int loki_ov7695_power_off(struct ov7695_power_rail *pw)
299 {
300         if (unlikely(WARN_ON(!pw || !pw->avdd || !pw->iovdd))) {
301                 /* put CSIA IOs into DPD mode to
302                  * save additional power for ardbeg
303                  */
304                 tegra_io_dpd_enable(&csia_io);
305                 return -EFAULT;
306         }
307
308         usleep_range(100, 120);
309
310         regulator_disable(pw->iovdd);
311         usleep_range(100, 120);
312
313         regulator_disable(pw->avdd);
314         usleep_range(100, 120);
315
316         gpio_set_value(CAM2_PWDN, 0);
317
318         /* put CSIA IOs into DPD mode to save additional power for ardbeg */
319         tegra_io_dpd_enable(&csia_io);
320         return 0;
321 }
322
323 struct ov7695_platform_data loki_ov7695_pdata = {
324         .power_on = loki_ov7695_power_on,
325         .power_off = loki_ov7695_power_off,
326 };
327
328 static struct i2c_board_info loki_i2c_board_info_ov7695 = {
329         I2C_BOARD_INFO("ov7695", 0x21),
330         .platform_data = &loki_ov7695_pdata,
331 };
332
333 static struct camera_module loki_camera_module_info[] = {
334         {
335                 /* front camera */
336                 .sensor = &loki_i2c_board_info_ov7695,
337         },
338
339         {}
340 };
341
342 static struct camera_platform_data loki_pcl_pdata = {
343         .cfg = 0xAA55AA55,
344         .modules = loki_camera_module_info,
345 };
346
347 static struct platform_device loki_camera_generic = {
348         .name = "pcl-generic",
349         .id = -1,
350 };
351
352 static int loki_camera_init(void)
353 {
354         pr_debug("%s: ++\n", __func__);
355
356         /* put CSIA/B/E IOs into DPD mode to
357          * save additional power
358          */
359         tegra_io_dpd_enable(&csia_io);
360         tegra_io_dpd_enable(&csib_io);
361         tegra_io_dpd_enable(&csie_io);
362
363         platform_device_add_data(&loki_camera_generic,
364                 &loki_pcl_pdata, sizeof(loki_pcl_pdata));
365         platform_device_register(&loki_camera_generic);
366         return 0;
367 }
368
369 static struct throttle_table tj_throttle_table[] = {
370         /* CPU_THROT_LOW cannot be used by other than CPU */
371         /*      CPU,    GPU,  C2BUS,  C3BUS,   SCLK,    EMC   */
372         { { 2295000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
373         { { 2269500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
374         { { 2244000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
375         { { 2218500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
376         { { 2193000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
377         { { 2167500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
378         { { 2142000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
379         { { 2116500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
380         { { 2091000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
381         { { 2065500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
382         { { 2040000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
383         { { 2014500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
384         { { 1989000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
385         { { 1963500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
386         { { 1938000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
387         { { 1912500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
388         { { 1887000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
389         { { 1861500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
390         { { 1836000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
391         { { 1810500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
392         { { 1785000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
393         { { 1759500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
394         { { 1734000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
395         { { 1708500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
396         { { 1683000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
397         { { 1657500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
398         { { 1632000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
399         { { 1606500, 790000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
400         { { 1581000, 776000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
401         { { 1555500, 762000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
402         { { 1530000, 749000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
403         { { 1504500, 735000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
404         { { 1479000, 721000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
405         { { 1453500, 707000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
406         { { 1428000, 693000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
407         { { 1402500, 679000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
408         { { 1377000, 666000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
409         { { 1351500, 652000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
410         { { 1326000, 638000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
411         { { 1300500, 624000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
412         { { 1275000, 610000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
413         { { 1249500, 596000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
414         { { 1224000, 582000, NO_CAP, NO_CAP, NO_CAP, 792000 } },
415         { { 1198500, 569000, NO_CAP, NO_CAP, NO_CAP, 792000 } },
416         { { 1173000, 555000, NO_CAP, NO_CAP, 360000, 792000 } },
417         { { 1147500, 541000, NO_CAP, NO_CAP, 360000, 792000 } },
418         { { 1122000, 527000, NO_CAP, 684000, 360000, 792000 } },
419         { { 1096500, 513000, 444000, 684000, 360000, 792000 } },
420         { { 1071000, 499000, 444000, 684000, 360000, 792000 } },
421         { { 1045500, 486000, 444000, 684000, 360000, 792000 } },
422         { { 1020000, 472000, 444000, 684000, 324000, 792000 } },
423         { {  994500, 458000, 444000, 684000, 324000, 792000 } },
424         { {  969000, 444000, 444000, 600000, 324000, 792000 } },
425         { {  943500, 430000, 444000, 600000, 324000, 792000 } },
426         { {  918000, 416000, 396000, 600000, 324000, 792000 } },
427         { {  892500, 402000, 396000, 600000, 324000, 792000 } },
428         { {  867000, 389000, 396000, 600000, 324000, 792000 } },
429         { {  841500, 375000, 396000, 600000, 288000, 792000 } },
430         { {  816000, 361000, 396000, 600000, 288000, 792000 } },
431         { {  790500, 347000, 396000, 600000, 288000, 792000 } },
432         { {  765000, 333000, 396000, 504000, 288000, 792000 } },
433         { {  739500, 319000, 348000, 504000, 288000, 792000 } },
434         { {  714000, 306000, 348000, 504000, 288000, 624000 } },
435         { {  688500, 292000, 348000, 504000, 288000, 624000 } },
436         { {  663000, 278000, 348000, 504000, 288000, 624000 } },
437         { {  637500, 264000, 348000, 504000, 288000, 624000 } },
438         { {  612000, 250000, 348000, 504000, 252000, 624000 } },
439         { {  586500, 236000, 348000, 504000, 252000, 624000 } },
440         { {  561000, 222000, 348000, 420000, 252000, 624000 } },
441         { {  535500, 209000, 288000, 420000, 252000, 624000 } },
442         { {  510000, 195000, 288000, 420000, 252000, 624000 } },
443         { {  484500, 181000, 288000, 420000, 252000, 624000 } },
444         { {  459000, 167000, 288000, 420000, 252000, 624000 } },
445         { {  433500, 153000, 288000, 420000, 252000, 396000 } },
446         { {  408000, 139000, 288000, 420000, 252000, 396000 } },
447         { {  382500, 126000, 288000, 420000, 252000, 396000 } },
448         { {  357000, 112000, 288000, 420000, 252000, 396000 } },
449         { {  331500,  98000, 288000, 420000, 252000, 396000 } },
450         { {  306000,  84000, 288000, 420000, 252000, 396000 } },
451         { {  280500,  84000, 288000, 420000, 252000, 396000 } },
452         { {  255000,  84000, 288000, 420000, 252000, 396000 } },
453         { {  229500,  84000, 288000, 420000, 252000, 396000 } },
454         { {  204000,  84000, 288000, 420000, 252000, 396000 } },
455 };
456
457 static struct balanced_throttle tj_throttle = {
458         .throt_tab_size = ARRAY_SIZE(tj_throttle_table),
459         .throt_tab = tj_throttle_table,
460 };
461
462 static int __init loki_throttle_init(void)
463 {
464         if (of_machine_is_compatible("nvidia,loki"))
465                 balanced_throttle_register(&tj_throttle, "tegra-balanced");
466         return 0;
467 }
468 module_init(loki_throttle_init);
469
470 static int loki_fan_est_match(struct thermal_zone_device *thz, void *data)
471 {
472         return (strcmp((char *)data, thz->type) == 0);
473 }
474
475 static int loki_fan_est_get_temp(void *data, long *temp)
476 {
477         struct thermal_zone_device *thz;
478
479         thz = thermal_zone_device_find(data, loki_fan_est_match);
480
481         if (!thz || thz->ops->get_temp(thz, temp))
482                 *temp = 25000;
483
484         return 0;
485 }
486
487 static int active_trip_temps_loki[] = {0, 60000, 68000, 79000, 90000,
488                                 140000, 150000, 160000, 170000, 180000};
489 static int active_hysteresis_loki[] = {0, 20000, 7000, 10000, 10000,
490                                                         0, 0, 0, 0, 0};
491
492 static int active_trip_temps_foster[] = {0, 63000, 74000, 85000, 120000,
493                                 140000, 150000, 160000, 170000, 180000};
494 static int active_hysteresis_foster[] = {0, 15000, 11000, 6000, 4000,
495                                                         0, 0, 0, 0, 0};
496 /*Fan thermal estimator data for P2548*/
497 static struct therm_fan_est_data fan_est_data = {
498         .toffset = 0,
499         .polling_period = 1100,
500         .ndevs = 2,
501         .devs = {
502                         {
503                                 .dev_data = "CPU-therm",
504                                 .get_temp = loki_fan_est_get_temp,
505                                 .coeffs = {
506                                         50, 0, 0, 0,
507                                         0, 0, 0, 0,
508                                         0, 0, 0, 0,
509                                         0, 0, 0, 0,
510                                         0, 0, 0, 0
511                                 },
512                         },
513                         {
514                                 .dev_data = "GPU-therm",
515                                 .get_temp = loki_fan_est_get_temp,
516                                 .coeffs = {
517                                         50, 0, 0, 0,
518                                         0, 0, 0, 0,
519                                         0, 0, 0, 0,
520                                         0, 0, 0, 0,
521                                         0, 0, 0, 0
522                                 },
523                         },
524         },
525         .cdev_type = "pwm-fan",
526 };
527
528 static struct platform_device loki_fan_therm_est_device = {
529         .name   = "therm-fan-est",
530         .id     = -1,
531         .num_resources  = 0,
532         .dev = {
533                 .platform_data = &fan_est_data,
534         },
535 };
536
537 static int __init loki_fan_est_init(void)
538 {
539         if ((board_info.sku == 900) && (board_info.board_id == BOARD_P2530)) {
540                 memcpy((&fan_est_data)->active_trip_temps,
541                                 &active_trip_temps_foster,
542                                 sizeof(active_trip_temps_foster));
543                 memcpy((&fan_est_data)->active_hysteresis,
544                                 &active_hysteresis_foster,
545                                 sizeof(active_hysteresis_foster));
546         } else {
547                 memcpy((&fan_est_data)->active_trip_temps,
548                                 &active_trip_temps_loki,
549                                 sizeof(active_trip_temps_loki));
550                 memcpy((&fan_est_data)->active_hysteresis,
551                                 &active_hysteresis_loki,
552                                 sizeof(active_hysteresis_loki));
553         }
554
555         platform_device_register(&loki_fan_therm_est_device);
556
557         return 0;
558 }
559
560 struct ntc_thermistor_adc_table {
561         int temp; /* degree C */
562         int adc;
563 };
564
565 /* This values are only for TegraTab platform. */
566 static struct ntc_thermistor_adc_table loki_nff_thermistor_table[] = {
567         { -40, 2725 }, { -39, 2725 }, { -38, 2724 }, { -37, 2723 },
568         { -36, 2723 }, { -35, 2722 }, { -34, 2721 }, { -33, 2721 },
569         { -32, 2720 }, { -31, 2719 }, { -30, 2718 }, { -29, 2717 },
570         { -28, 2716 }, { -27, 2715 }, { -26, 2714 }, { -25, 2713 },
571         { -24, 2712 }, { -23, 2711 }, { -22, 2709 }, { -21, 2708 },
572         { -20, 2707 }, { -19, 2705 }, { -18, 2704 }, { -17, 2702 },
573         { -16, 2701 }, { -15, 2699 }, { -14, 2697 }, { -13, 2696 },
574         { -12, 2694 }, { -11, 2692 }, { -10, 2689 }, {  -9, 2687 },
575         {  -8, 2685 }, {  -7, 2683 }, {  -6, 2681 }, {  -5, 2678 },
576         {  -4, 2676 }, {  -3, 2673 }, {  -2, 2670 }, {  -1, 2667 },
577         {   0, 2664 }, {   1, 2661 }, {   2, 2658 }, {   3, 2655 },
578         {   4, 2651 }, {   5, 2647 }, {   6, 2644 }, {   7, 2641 },
579         {   8, 2637 }, {   9, 2633 }, {  10, 2628 }, {  11, 2624 },
580         {  12, 2620 }, {  13, 2615 }, {  14, 2610 }, {  15, 2605 },
581         {  16, 2600 }, {  17, 2596 }, {  18, 2590 }, {  19, 2585 },
582         {  20, 2578 }, {  21, 2573 }, {  22, 2567 }, {  23, 2561 },
583         {  24, 2555 }, {  25, 2548 }, {  26, 2542 }, {  27, 2535 },
584         {  28, 2528 }, {  29, 2521 }, {  30, 2513 }, {  31, 2506 },
585         {  32, 2498 }, {  33, 2491 }, {  34, 2482 }, {  35, 2473 },
586         {  36, 2465 }, {  37, 2457 }, {  38, 2448 }, {  39, 2439 },
587         {  40, 2429 }, {  41, 2420 }, {  42, 2411 }, {  43, 2401 },
588         {  44, 2390 }, {  45, 2379 }, {  46, 2370 }, {  47, 2359 },
589         {  48, 2349 }, {  49, 2337 }, {  50, 2325 }, {  51, 2314 },
590         {  52, 2303 }, {  53, 2291 }, {  54, 2278 }, {  55, 2265 },
591         {  56, 2254 }, {  57, 2241 }, {  58, 2229 }, {  59, 2215 },
592         {  60, 2201 }, {  61, 2188 }, {  62, 2175 }, {  63, 2161 },
593         {  64, 2147 }, {  65, 2132 }, {  66, 2118 }, {  67, 2104 },
594         {  68, 2089 }, {  69, 2074 }, {  70, 2058 }, {  71, 2044 },
595         {  72, 2029 }, {  73, 2014 }, {  74, 1998 }, {  75, 1981 },
596         {  76, 1966 }, {  77, 1950 }, {  78, 1934 }, {  79, 1918 },
597         {  80, 1900 }, {  81, 1885 }, {  82, 1868 }, {  83, 1851 },
598         {  84, 1834 }, {  85, 1816 }, {  86, 1799 }, {  87, 1783 },
599         {  88, 1765 }, {  89, 1747 }, {  90, 1728 }, {  91, 1711 },
600         {  92, 1694 }, {  93, 1676 }, {  94, 1657 }, {  95, 1638 },
601         {  96, 1621 }, {  97, 1603 }, {  98, 1585 }, {  99, 1566 },
602         { 100, 1547 }, { 101, 1530 }, { 102, 1512 }, { 103, 1494 },
603         { 104, 1475 }, { 105, 1456 }, { 106, 1438 }, { 107, 1421 },
604         { 108, 1403 }, { 109, 1384 }, { 110, 1365 }, { 111, 1348 },
605         { 112, 1331 }, { 113, 1313 }, { 114, 1294 }, { 115, 1276 },
606         { 116, 1259 }, { 117, 1242 }, { 118, 1225 }, { 119, 1207 },
607         { 120, 1189 }, { 121, 1173 }, { 122, 1157 }, { 123, 1140 },
608         { 124, 1123 }, { 125, 1106 },
609 };
610
611 static struct ntc_thermistor_adc_table loki_ffd_thermistor_table[] = {
612         { -40, 4082 }, { -39, 4082 }, { -38, 4081 }, { -37, 4079 },
613         { -36, 4078 }, { -35, 4077 }, { -34, 4075 }, { -33, 4074 },
614         { -32, 4072 }, { -31, 4071 }, { -30, 4068 }, { -29, 4067 },
615         { -28, 4065 }, { -27, 4063 }, { -26, 4060 }, { -25, 4058 },
616         { -24, 4055 }, { -23, 4053 }, { -22, 4050 }, { -21, 4047 },
617         { -20, 4043 }, { -19, 4040 }, { -18, 4036 }, { -17, 4033 },
618         { -16, 4028 }, { -15, 4023 }, { -14, 4019 }, { -13, 4015 },
619         { -12, 4010 }, { -11, 4004 }, { -10, 3998 }, {  -9, 3992 },
620         {  -8, 3987 }, {  -7, 3980 }, {  -6, 3973 }, {  -5, 3964 },
621         {  -4, 3958 }, {  -3, 3950 }, {  -2, 3942 }, {  -1, 3932 },
622         {   0, 3922 }, {   1, 3913 }, {   2, 3904 }, {   3, 3893 },
623         {   4, 3881 }, {   5, 3868 }, {   6, 3857 }, {   7, 3845 },
624         {   8, 3832 }, {   9, 3817 }, {  10, 3801 }, {  11, 3788 },
625         {  12, 3773 }, {  13, 3757 }, {  14, 3739 }, {  15, 3719 },
626         {  16, 3703 }, {  17, 3685 }, {  18, 3666 }, {  19, 3644 },
627         {  20, 3621 }, {  21, 3601 }, {  22, 3580 }, {  23, 3557 },
628         {  24, 3532 }, {  25, 3504 }, {  26, 3481 }, {  27, 3456 },
629         {  28, 3429 }, {  29, 3400 }, {  30, 3368 }, {  31, 3342 },
630         {  32, 3314 }, {  33, 3283 }, {  34, 3250 }, {  35, 3214 },
631         {  36, 3184 }, {  37, 3153 }, {  38, 3119 }, {  39, 3082 },
632         {  40, 3043 }, {  41, 3010 }, {  42, 2975 }, {  43, 2938 },
633         {  44, 2899 }, {  45, 2856 }, {  46, 2821 }, {  47, 2784 },
634         {  48, 2744 }, {  49, 2702 }, {  50, 2658 }, {  51, 2621 },
635         {  52, 2582 }, {  53, 2541 }, {  54, 2498 }, {  55, 2452 },
636         {  56, 2414 }, {  57, 2374 }, {  58, 2332 }, {  59, 2288 },
637         {  60, 2242 }, {  61, 2204 }, {  62, 2164 }, {  63, 2123 },
638         {  64, 2079 }, {  65, 2034 }, {  66, 1996 }, {  67, 1958 },
639         {  68, 1917 }, {  69, 1875 }, {  70, 1832 }, {  71, 1795 },
640         {  72, 1758 }, {  73, 1719 }, {  74, 1679 }, {  75, 1638 },
641         {  76, 1604 }, {  77, 1568 }, {  78, 1532 }, {  79, 1495 },
642         {  80, 1456 }, {  81, 1424 }, {  82, 1392 }, {  83, 1358 },
643         {  84, 1324 }, {  85, 1289 }, {  86, 1259 }, {  87, 1229 },
644         {  88, 1199 }, {  89, 1167 }, {  90, 1135 }, {  91, 1109 },
645         {  92, 1082 }, {  93, 1054 }, {  94, 1026 }, {  95,  997 },
646         {  96,  973 }, {  97,  949 }, {  98,  924 }, {  99,  899 },
647         { 100,  874 }, { 101,  853 }, { 102,  831 }, { 103,  809 },
648         { 104,  787 }, { 105,  765 }, { 106,  746 }, { 107,  727 },
649         { 108,  707 }, { 109,  688 }, { 110,  668 }, { 111,  652 },
650         { 112,  635 }, { 113,  618 }, { 114,  601 }, { 115,  584 },
651         { 116,  569 }, { 117,  555 }, { 118,  540 }, { 119,  525 },
652         { 120,  510 }, { 121,  498 }, { 122,  485 }, { 123,  472 },
653         { 124,  459 }, { 125,  446 },
654 };
655
656 static struct ntc_thermistor_adc_table *thermistor_table;
657 static int thermistor_table_size;
658
659 static int gadc_thermal_thermistor_adc_to_temp(
660                 struct gadc_thermal_platform_data *pdata, int val, int val2)
661 {
662         int temp = 0, adc_hi, adc_lo;
663         int i;
664
665         for (i = 0; i < thermistor_table_size; i++)
666                 if (val >= thermistor_table[i].adc)
667                         break;
668
669         if (i == 0) {
670                 temp = thermistor_table[i].temp * 1000;
671         } else if (i >= (thermistor_table_size - 1)) {
672                 temp = thermistor_table[thermistor_table_size - 1].temp * 1000;
673         } else {
674                 adc_hi = thermistor_table[i - 1].adc;
675                 adc_lo = thermistor_table[i].adc;
676                 temp = thermistor_table[i].temp * 1000;
677                 temp -= ((val - adc_lo) * 1000 / (adc_hi - adc_lo));
678         }
679
680         return temp;
681 };
682
683 #define TDIODE_PRECISION_MULTIPLIER     1000000000LL
684 #define TDIODE_MIN_TEMP                 -25000LL
685 #define TDIODE_MAX_TEMP                 125000LL
686
687 static int gadc_thermal_tdiode_adc_to_temp(
688                 struct gadc_thermal_platform_data *pdata, int val, int val2)
689 {
690         /*
691          * Series resistance cancellation using multi-current ADC measurement.
692          * diode temp = ((adc2 - k * adc1) - (b2 - k * b1)) / (m2 - k * m1)
693          * - adc1 : ADC raw with current source 400uA
694          * - m1, b1 : calculated with current source 400uA
695          * - adc2 : ADC raw with current source 800uA
696          * - m2, b2 : calculated with current source 800uA
697          * - k : 2 (= 800uA / 400uA)
698          */
699         const s64 m1 = -0.00571005 * TDIODE_PRECISION_MULTIPLIER;
700         const s64 b1 = 2524.29891 * TDIODE_PRECISION_MULTIPLIER;
701         const s64 m2 = -0.005519811 * TDIODE_PRECISION_MULTIPLIER;
702         const s64 b2 = 2579.354349 * TDIODE_PRECISION_MULTIPLIER;
703         s64 temp = TDIODE_PRECISION_MULTIPLIER;
704
705         temp *= (s64)((val2) - 2 * (val));
706         temp -= (b2 - 2 * b1);
707         temp = div64_s64(temp, (m2 - 2 * m1));
708         temp = min_t(s64, max_t(s64, temp, TDIODE_MIN_TEMP), TDIODE_MAX_TEMP);
709         return temp;
710 };
711
712 static struct gadc_thermal_platform_data gadc_thermal_thermistor_pdata = {
713         .iio_channel_name = "thermistor",
714         .tz_name = "Tboard",
715         .temp_offset = 0,
716         .adc_to_temp = gadc_thermal_thermistor_adc_to_temp,
717 };
718
719 static struct gadc_thermal_platform_data gadc_thermal_tdiode_pdata = {
720         .iio_channel_name = "tdiode",
721         .tz_name = "Tdiode",
722         .temp_offset = 0,
723         .adc_to_temp = gadc_thermal_tdiode_adc_to_temp,
724 };
725
726 static struct platform_device gadc_thermal_thermistor = {
727         .name   = "generic-adc-thermal",
728         .id     = 0,
729         .dev    = {
730                 .platform_data = &gadc_thermal_thermistor_pdata,
731         },
732 };
733
734 static struct platform_device gadc_thermal_tdiode = {
735         .name   = "generic-adc-thermal",
736         .id     = 1,
737         .dev    = {
738                 .platform_data = &gadc_thermal_tdiode_pdata,
739         },
740 };
741
742 static struct platform_device *gadc_thermal_devices[] = {
743         &gadc_thermal_thermistor,
744         &gadc_thermal_tdiode,
745 };
746
747 int __init loki_sensors_init(void)
748 {
749         tegra_get_board_info(&board_info);
750         platform_add_devices(gadc_thermal_devices,
751                         ARRAY_SIZE(gadc_thermal_devices));
752
753         if (board_info.board_id == BOARD_E2548 ||
754                         board_info.board_id == BOARD_E2549) {
755                 thermistor_table = &loki_nff_thermistor_table[0];
756                 thermistor_table_size = ARRAY_SIZE(loki_nff_thermistor_table);
757         } else if (board_info.board_id == BOARD_P2530) {
758                 thermistor_table = &loki_ffd_thermistor_table[0];
759                 thermistor_table_size = ARRAY_SIZE(loki_ffd_thermistor_table);
760         }
761
762         loki_fan_est_init();
763         if (!(board_info.board_id == BOARD_P2530 &&
764                 board_info.sku == BOARD_SKU_FOSTER)) {
765 #ifndef CONFIG_USE_OF
766                 mpuirq_init();
767 #else
768                 mpu_dt_update();
769 #endif
770
771                 if (board_info.board_id != BOARD_E2549)
772                         loki_camera_init();
773         }
774         return 0;
775 }