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