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