ARM: tegra12: set CPU rate to 2.2GHz for sku 0x87
[linux-3.10.git] / arch / arm / mach-tegra / board-ardbeg-sensors.c
1 /*
2  * arch/arm/mach-tegra/board-ardbeg-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/pid_thermal_gov.h>
26 #include <linux/power/sbs-battery.h>
27 #include <linux/tegra-fuse.h>
28 #include <mach/edp.h>
29 #include <mach/pinmux-t12.h>
30 #include <mach/pinmux.h>
31 #include <mach/io_dpd.h>
32 #include <media/camera.h>
33 #include <media/ar0261.h>
34 #include <media/imx135.h>
35 #include <media/dw9718.h>
36 #include <media/as364x.h>
37 #include <media/ov5693.h>
38 #include <media/ov7695.h>
39 #include <media/mt9m114.h>
40 #include <media/ad5823.h>
41 #include <media/max77387.h>
42
43 #include <linux/platform_device.h>
44 #include <media/soc_camera.h>
45 #include <media/soc_camera_platform.h>
46 #include <media/tegra_v4l2_camera.h>
47 #include <linux/generic_adc_thermal.h>
48
49 #include "cpu-tegra.h"
50 #include "devices.h"
51 #include "board.h"
52 #include "board-common.h"
53 #include "board-ardbeg.h"
54 #include "tegra-board-id.h"
55
56 static struct i2c_board_info ardbeg_i2c_board_info_cm32181[] = {
57         {
58                 I2C_BOARD_INFO("cm32181", 0x48),
59         },
60 };
61
62 /* MPU board file definition    */
63 static struct mpu_platform_data mpu9250_gyro_data = {
64         .int_config     = 0x10,
65         .level_shifter  = 0,
66         /* Located in board_[platformname].h */
67         .orientation    = MPU_GYRO_ORIENTATION,
68         .sec_slave_type = SECONDARY_SLAVE_TYPE_NONE,
69         .key            = {0x4E, 0xCC, 0x7E, 0xEB, 0xF6, 0x1E, 0x35, 0x22,
70                         0x00, 0x34, 0x0D, 0x65, 0x32, 0xE9, 0x94, 0x89},
71 };
72
73 static struct mpu_platform_data mpu9250_gyro_data_e1762 = {
74         .int_config     = 0x10,
75         .level_shifter  = 0,
76         /* Located in board_[platformname].h */
77         .orientation    = MPU_GYRO_ORIENTATION_E1762,
78         .sec_slave_type = SECONDARY_SLAVE_TYPE_NONE,
79         .key            = {0x4E, 0xCC, 0x7E, 0xEB, 0xF6, 0x1E, 0x35, 0x22,
80                         0x00, 0x34, 0x0D, 0x65, 0x32, 0xE9, 0x94, 0x89},
81 };
82
83 static struct mpu_platform_data mpu_compass_data = {
84         .orientation    = MPU_COMPASS_ORIENTATION,
85         .config         = NVI_CONFIG_BOOT_MPU,
86 };
87
88 static struct mpu_platform_data mpu_bmp_pdata = {
89         .config         = NVI_CONFIG_BOOT_MPU,
90 };
91
92 static struct i2c_board_info __initdata inv_mpu9250_i2c0_board_info[] = {
93         {
94                 I2C_BOARD_INFO(MPU_GYRO_NAME, MPU_GYRO_ADDR),
95                 .platform_data = &mpu9250_gyro_data,
96         },
97         {
98                 /* The actual BMP180 address is 0x77 but because this conflicts
99                  * with another device, this address is hacked so Linux will
100                  * call the driver.  The conflict is technically okay since the
101                  * BMP180 is behind the MPU.  Also, the BMP180 driver uses a
102                  * hard-coded address of 0x77 since it can't be changed anyway.
103                  */
104                 I2C_BOARD_INFO(MPU_BMP_NAME, MPU_BMP_ADDR),
105                 .platform_data = &mpu_bmp_pdata,
106         },
107         {
108                 I2C_BOARD_INFO(MPU_COMPASS_NAME, MPU_COMPASS_ADDR),
109                 .platform_data = &mpu_compass_data,
110         },
111 };
112
113 static void mpuirq_init(void)
114 {
115         int ret = 0;
116         unsigned gyro_irq_gpio = MPU_GYRO_IRQ_GPIO;
117         unsigned gyro_bus_num = MPU_GYRO_BUS_NUM;
118         char *gyro_name = MPU_GYRO_NAME;
119         struct board_info board_info;
120
121         pr_info("*** MPU START *** mpuirq_init...\n");
122
123         tegra_get_board_info(&board_info);
124
125         ret = gpio_request(gyro_irq_gpio, gyro_name);
126         if (ret < 0) {
127                 pr_err("%s: gpio_request failed %d\n", __func__, ret);
128                 return;
129         }
130
131         ret = gpio_direction_input(gyro_irq_gpio);
132         if (ret < 0) {
133                 pr_err("%s: gpio_direction_input failed %d\n", __func__, ret);
134                 gpio_free(gyro_irq_gpio);
135                 return;
136         }
137         pr_info("*** MPU END *** mpuirq_init...\n");
138
139         /* TN8 with diferent Compass address from ardbeg */
140         if (of_machine_is_compatible("nvidia,tn8"))
141                 inv_mpu9250_i2c0_board_info[2].addr = MPU_COMPASS_ADDR_TN8;
142
143         if (board_info.board_id == BOARD_E1762)
144                 inv_mpu9250_i2c0_board_info[0].platform_data =
145                                         &mpu9250_gyro_data_e1762;
146         inv_mpu9250_i2c0_board_info[0].irq = gpio_to_irq(MPU_GYRO_IRQ_GPIO);
147         i2c_register_board_info(gyro_bus_num, inv_mpu9250_i2c0_board_info,
148                 ARRAY_SIZE(inv_mpu9250_i2c0_board_info));
149 }
150
151 /*
152  * Soc Camera platform driver for testing
153  */
154 #if IS_ENABLED(CONFIG_SOC_CAMERA_PLATFORM)
155 static int ardbeg_soc_camera_add(struct soc_camera_device *icd);
156 static void ardbeg_soc_camera_del(struct soc_camera_device *icd);
157
158 static int ardbeg_soc_camera_set_capture(struct soc_camera_platform_info *info,
159                 int enable)
160 {
161         /* TODO: probably add clk opertaion here */
162         return 0; /* camera sensor always enabled */
163 }
164
165 static struct soc_camera_platform_info ardbeg_soc_camera_info = {
166         .format_name = "RGB4",
167         .format_depth = 32,
168         .format = {
169                 .code = V4L2_MBUS_FMT_RGBA8888_4X8_LE,
170                 .colorspace = V4L2_COLORSPACE_SRGB,
171                 .field = V4L2_FIELD_NONE,
172                 .width = 1280,
173                 .height = 720,
174         },
175         .set_capture = ardbeg_soc_camera_set_capture,
176 };
177
178 static struct tegra_camera_platform_data ardbeg_camera_platform_data = {
179         .flip_v                 = 0,
180         .flip_h                 = 0,
181         .port                   = TEGRA_CAMERA_PORT_CSI_A,
182         .lanes                  = 4,
183         .continuous_clk         = 0,
184 };
185
186 static struct soc_camera_link ardbeg_soc_camera_link = {
187         .bus_id         = 0, /* This must match the .id of tegra_vi01_device */
188         .add_device     = ardbeg_soc_camera_add,
189         .del_device     = ardbeg_soc_camera_del,
190         .module_name    = "soc_camera_platform",
191         .priv           = &ardbeg_camera_platform_data,
192         .dev_priv       = &ardbeg_soc_camera_info,
193 };
194
195 static struct platform_device *ardbeg_pdev;
196
197 static void ardbeg_soc_camera_release(struct device *dev)
198 {
199         soc_camera_platform_release(&ardbeg_pdev);
200 }
201
202 static int ardbeg_soc_camera_add(struct soc_camera_device *icd)
203 {
204         return soc_camera_platform_add(icd, &ardbeg_pdev,
205                         &ardbeg_soc_camera_link,
206                         ardbeg_soc_camera_release, 0);
207 }
208
209 static void ardbeg_soc_camera_del(struct soc_camera_device *icd)
210 {
211         soc_camera_platform_del(icd, ardbeg_pdev, &ardbeg_soc_camera_link);
212 }
213
214 static struct platform_device ardbeg_soc_camera_device = {
215         .name   = "soc-camera-pdrv",
216         .id     = 0,
217         .dev    = {
218                 .platform_data = &ardbeg_soc_camera_link,
219         },
220 };
221 #endif
222
223 static struct regulator *ardbeg_vcmvdd;
224
225 static int ardbeg_get_extra_regulators(void)
226 {
227         if (!ardbeg_vcmvdd) {
228                 ardbeg_vcmvdd = regulator_get(NULL, "avdd_af1_cam");
229                 if (WARN_ON(IS_ERR(ardbeg_vcmvdd))) {
230                         pr_err("%s: can't get regulator avdd_af1_cam: %ld\n",
231                                         __func__, PTR_ERR(ardbeg_vcmvdd));
232                         regulator_put(ardbeg_vcmvdd);
233                         ardbeg_vcmvdd = NULL;
234                         return -ENODEV;
235                 }
236         }
237
238         return 0;
239 }
240
241 static struct tegra_io_dpd csia_io = {
242         .name                   = "CSIA",
243         .io_dpd_reg_index       = 0,
244         .io_dpd_bit             = 0,
245 };
246
247 static struct tegra_io_dpd csib_io = {
248         .name                   = "CSIB",
249         .io_dpd_reg_index       = 0,
250         .io_dpd_bit             = 1,
251 };
252
253 static struct tegra_io_dpd csie_io = {
254         .name                   = "CSIE",
255         .io_dpd_reg_index       = 1,
256         .io_dpd_bit             = 12,
257 };
258
259 static int ardbeg_ar0261_power_on(struct ar0261_power_rail *pw)
260 {
261         int err;
262
263         if (unlikely(WARN_ON(!pw || !pw->avdd || !pw->iovdd || !pw->dvdd)))
264                 return -EFAULT;
265
266         /* disable CSIE IOs DPD mode to turn on front camera for ardbeg */
267         tegra_io_dpd_disable(&csie_io);
268
269         if (ardbeg_get_extra_regulators())
270                 goto ardbeg_ar0261_poweron_fail;
271
272         gpio_set_value(CAM_RSTN, 0);
273         gpio_set_value(CAM_AF_PWDN, 1);
274
275
276         err = regulator_enable(ardbeg_vcmvdd);
277         if (unlikely(err))
278                 goto ar0261_vcm_fail;
279
280         err = regulator_enable(pw->dvdd);
281         if (unlikely(err))
282                 goto ar0261_dvdd_fail;
283
284         err = regulator_enable(pw->avdd);
285         if (unlikely(err))
286                 goto ar0261_avdd_fail;
287
288         err = regulator_enable(pw->iovdd);
289         if (unlikely(err))
290                 goto ar0261_iovdd_fail;
291
292         usleep_range(1, 2);
293         gpio_set_value(CAM2_PWDN, 1);
294
295         gpio_set_value(CAM_RSTN, 1);
296
297         return 0;
298 ar0261_iovdd_fail:
299         regulator_disable(pw->dvdd);
300
301 ar0261_dvdd_fail:
302         regulator_disable(pw->avdd);
303
304 ar0261_avdd_fail:
305         regulator_disable(ardbeg_vcmvdd);
306
307 ar0261_vcm_fail:
308         pr_err("%s vcmvdd failed.\n", __func__);
309         return -ENODEV;
310
311 ardbeg_ar0261_poweron_fail:
312         /* put CSIE IOs into DPD mode to save additional power for ardbeg */
313         tegra_io_dpd_enable(&csie_io);
314         pr_err("%s failed.\n", __func__);
315         return -ENODEV;
316 }
317
318 static int ardbeg_ar0261_power_off(struct ar0261_power_rail *pw)
319 {
320         if (unlikely(WARN_ON(!pw || !pw->avdd || !pw->iovdd || !pw->dvdd ||
321                                         !ardbeg_vcmvdd))) {
322                 /* put CSIE IOs into DPD mode to
323                  * save additional power for ardbeg
324                  */
325                 tegra_io_dpd_enable(&csie_io);
326                 return -EFAULT;
327         }
328
329         gpio_set_value(CAM_RSTN, 0);
330
331         usleep_range(1, 2);
332
333         regulator_disable(pw->iovdd);
334         regulator_disable(pw->dvdd);
335         regulator_disable(pw->avdd);
336         regulator_disable(ardbeg_vcmvdd);
337         /* put CSIE IOs into DPD mode to save additional power for ardbeg */
338         tegra_io_dpd_enable(&csie_io);
339         return 0;
340 }
341
342 struct ar0261_platform_data ardbeg_ar0261_data = {
343         .power_on = ardbeg_ar0261_power_on,
344         .power_off = ardbeg_ar0261_power_off,
345         .mclk_name = "mclk2",
346 };
347
348 static int ardbeg_imx135_get_extra_regulators(struct imx135_power_rail *pw)
349 {
350         if (!pw->ext_reg1) {
351                 pw->ext_reg1 = regulator_get(NULL, "imx135_reg1");
352                 if (WARN_ON(IS_ERR(pw->ext_reg1))) {
353                         pr_err("%s: can't get regulator imx135_reg1: %ld\n",
354                                 __func__, PTR_ERR(pw->ext_reg1));
355                         pw->ext_reg1 = NULL;
356                         return -ENODEV;
357                 }
358         }
359
360         if (!pw->ext_reg2) {
361                 pw->ext_reg2 = regulator_get(NULL, "imx135_reg2");
362                 if (WARN_ON(IS_ERR(pw->ext_reg2))) {
363                         pr_err("%s: can't get regulator imx135_reg2: %ld\n",
364                                 __func__, PTR_ERR(pw->ext_reg2));
365                         pw->ext_reg2 = NULL;
366                         return -ENODEV;
367                 }
368         }
369
370         return 0;
371 }
372
373 static int ardbeg_imx135_power_on(struct imx135_power_rail *pw)
374 {
375         int err;
376
377         if (unlikely(WARN_ON(!pw || !pw->iovdd || !pw->avdd)))
378                 return -EFAULT;
379
380         /* disable CSIA/B IOs DPD mode to turn on camera for ardbeg */
381         tegra_io_dpd_disable(&csia_io);
382         tegra_io_dpd_disable(&csib_io);
383
384         if (ardbeg_imx135_get_extra_regulators(pw))
385                 goto imx135_poweron_fail;
386
387         err = regulator_enable(pw->ext_reg1);
388         if (unlikely(err))
389                 goto imx135_ext_reg1_fail;
390
391         err = regulator_enable(pw->ext_reg2);
392         if (unlikely(err))
393                 goto imx135_ext_reg2_fail;
394
395
396         gpio_set_value(CAM_AF_PWDN, 1);
397         gpio_set_value(CAM1_PWDN, 0);
398         usleep_range(10, 20);
399
400         err = regulator_enable(pw->avdd);
401         if (err)
402                 goto imx135_avdd_fail;
403
404         err = regulator_enable(pw->iovdd);
405         if (err)
406                 goto imx135_iovdd_fail;
407
408         usleep_range(1, 2);
409         gpio_set_value(CAM1_PWDN, 1);
410
411         usleep_range(300, 310);
412
413         return 1;
414
415
416 imx135_iovdd_fail:
417         regulator_disable(pw->avdd);
418
419 imx135_avdd_fail:
420         if (pw->ext_reg2)
421                 regulator_disable(pw->ext_reg2);
422
423 imx135_ext_reg2_fail:
424         if (pw->ext_reg1)
425                 regulator_disable(pw->ext_reg1);
426         gpio_set_value(CAM_AF_PWDN, 0);
427
428 imx135_ext_reg1_fail:
429 imx135_poweron_fail:
430         tegra_io_dpd_enable(&csia_io);
431         tegra_io_dpd_enable(&csib_io);
432         pr_err("%s failed.\n", __func__);
433         return -ENODEV;
434 }
435
436 static int ardbeg_imx135_power_off(struct imx135_power_rail *pw)
437 {
438         if (unlikely(WARN_ON(!pw || !pw->iovdd || !pw->avdd))) {
439                 tegra_io_dpd_enable(&csia_io);
440                 tegra_io_dpd_enable(&csib_io);
441                 return -EFAULT;
442         }
443
444         regulator_disable(pw->iovdd);
445         regulator_disable(pw->avdd);
446
447         regulator_disable(pw->ext_reg1);
448         regulator_disable(pw->ext_reg2);
449
450         /* put CSIA/B IOs into DPD mode to save additional power for ardbeg */
451         tegra_io_dpd_enable(&csia_io);
452         tegra_io_dpd_enable(&csib_io);
453         return 0;
454 }
455
456 struct imx135_platform_data ardbeg_imx135_data = {
457         .flash_cap = {
458                 .enable = 1,
459                 .edge_trig_en = 1,
460                 .start_edge = 0,
461                 .repeat = 1,
462                 .delay_frm = 0,
463         },
464         .power_on = ardbeg_imx135_power_on,
465         .power_off = ardbeg_imx135_power_off,
466 };
467
468 static int ardbeg_dw9718_power_on(struct dw9718_power_rail *pw)
469 {
470         int err;
471         pr_info("%s\n", __func__);
472
473         if (unlikely(!pw || !pw->vdd || !pw->vdd_i2c))
474                 return -EFAULT;
475
476         err = regulator_enable(pw->vdd);
477         if (unlikely(err))
478                 goto dw9718_vdd_fail;
479
480         err = regulator_enable(pw->vdd_i2c);
481         if (unlikely(err))
482                 goto dw9718_i2c_fail;
483
484         usleep_range(1000, 1020);
485
486         /* return 1 to skip the in-driver power_on sequence */
487         pr_debug("%s --\n", __func__);
488         return 1;
489
490 dw9718_i2c_fail:
491         regulator_disable(pw->vdd);
492
493 dw9718_vdd_fail:
494         pr_err("%s FAILED\n", __func__);
495         return -ENODEV;
496 }
497
498 static int ardbeg_dw9718_power_off(struct dw9718_power_rail *pw)
499 {
500         pr_info("%s\n", __func__);
501
502         if (unlikely(!pw || !pw->vdd || !pw->vdd_i2c))
503                 return -EFAULT;
504
505         regulator_disable(pw->vdd);
506         regulator_disable(pw->vdd_i2c);
507
508         return 1;
509 }
510
511 static u16 dw9718_devid;
512 static int ardbeg_dw9718_detect(void *buf, size_t size)
513 {
514         dw9718_devid = 0x9718;
515         return 0;
516 }
517
518 static struct nvc_focus_cap dw9718_cap = {
519         .settle_time = 30,
520         .slew_rate = 0x3A200C,
521         .focus_macro = 450,
522         .focus_infinity = 200,
523         .focus_hyper = 200,
524 };
525
526 static struct dw9718_platform_data ardbeg_dw9718_data = {
527         .cfg = NVC_CFG_NODEV,
528         .num = 0,
529         .sync = 0,
530         .dev_name = "focuser",
531         .cap = &dw9718_cap,
532         .power_on = ardbeg_dw9718_power_on,
533         .power_off = ardbeg_dw9718_power_off,
534         .detect = ardbeg_dw9718_detect,
535 };
536
537 static struct as364x_platform_data ardbeg_as3648_data = {
538         .config         = {
539                 .led_mask       = 3,
540                 .max_total_current_mA = 1000,
541                 .max_peak_current_mA = 600,
542                 .max_torch_current_mA = 600,
543                 .vin_low_v_run_mV = 3070,
544                 .strobe_type = 1,
545                 },
546         .pinstate       = {
547                 .mask   = 1 << (CAM_FLASH_STROBE - TEGRA_GPIO_PBB0),
548                 .values = 1 << (CAM_FLASH_STROBE - TEGRA_GPIO_PBB0)
549                 },
550         .dev_name       = "torch",
551         .type           = AS3648,
552         .gpio_strobe    = CAM_FLASH_STROBE,
553 };
554
555 static int ardbeg_ov7695_power_on(struct ov7695_power_rail *pw)
556 {
557         int err;
558
559         if (unlikely(WARN_ON(!pw || !pw->avdd || !pw->iovdd)))
560                 return -EFAULT;
561
562         /* disable CSIE IOs DPD mode to turn on front camera for ardbeg */
563         tegra_io_dpd_disable(&csie_io);
564
565         gpio_set_value(CAM2_PWDN, 0);
566         usleep_range(1000, 1020);
567
568         err = regulator_enable(pw->avdd);
569         if (unlikely(err))
570                 goto ov7695_avdd_fail;
571         usleep_range(300, 320);
572
573         err = regulator_enable(pw->iovdd);
574         if (unlikely(err))
575                 goto ov7695_iovdd_fail;
576         usleep_range(1000, 1020);
577
578         gpio_set_value(CAM2_PWDN, 1);
579         usleep_range(1000, 1020);
580
581         return 0;
582
583 ov7695_iovdd_fail:
584         regulator_disable(pw->avdd);
585
586 ov7695_avdd_fail:
587         gpio_set_value(CAM_RSTN, 0);
588         /* put CSIE IOs into DPD mode to save additional power for ardbeg */
589         tegra_io_dpd_enable(&csie_io);
590         return -ENODEV;
591 }
592
593 static int ardbeg_ov7695_power_off(struct ov7695_power_rail *pw)
594 {
595         if (unlikely(WARN_ON(!pw || !pw->avdd || !pw->iovdd))) {
596                 /* put CSIE IOs into DPD mode to
597                  * save additional power for ardbeg
598                  */
599                 tegra_io_dpd_enable(&csie_io);
600                 return -EFAULT;
601         }
602         usleep_range(100, 120);
603
604         gpio_set_value(CAM2_PWDN, 0);
605         usleep_range(100, 120);
606
607         regulator_disable(pw->iovdd);
608         usleep_range(100, 120);
609
610         regulator_disable(pw->avdd);
611
612         /* put CSIE IOs into DPD mode to save additional power for ardbeg */
613         tegra_io_dpd_enable(&csie_io);
614         return 0;
615 }
616
617 struct ov7695_platform_data ardbeg_ov7695_pdata = {
618         .power_on = ardbeg_ov7695_power_on,
619         .power_off = ardbeg_ov7695_power_off,
620         .mclk_name = "mclk2",
621 };
622
623 static int ardbeg_mt9m114_power_on(struct mt9m114_power_rail *pw)
624 {
625         int err;
626         if (unlikely(!pw || !pw->avdd || !pw->iovdd))
627                 return -EFAULT;
628
629         /* disable CSIE IOs DPD mode to turn on front camera for ardbeg */
630         tegra_io_dpd_disable(&csie_io);
631
632         gpio_set_value(CAM_RSTN, 0);
633         gpio_set_value(CAM2_PWDN, 1);
634         usleep_range(1000, 1020);
635
636         err = regulator_enable(pw->iovdd);
637         if (unlikely(err))
638                 goto mt9m114_iovdd_fail;
639
640         err = regulator_enable(pw->avdd);
641         if (unlikely(err))
642                 goto mt9m114_avdd_fail;
643
644         usleep_range(1000, 1020);
645         gpio_set_value(CAM_RSTN, 1);
646         gpio_set_value(CAM2_PWDN, 0);
647         usleep_range(1000, 1020);
648
649         /* return 1 to skip the in-driver power_on swquence */
650         return 1;
651
652 mt9m114_avdd_fail:
653         regulator_disable(pw->iovdd);
654
655 mt9m114_iovdd_fail:
656         gpio_set_value(CAM_RSTN, 0);
657         /* put CSIE IOs into DPD mode to save additional power for ardbeg */
658         tegra_io_dpd_enable(&csie_io);
659         return -ENODEV;
660 }
661
662 static int ardbeg_mt9m114_power_off(struct mt9m114_power_rail *pw)
663 {
664         if (unlikely(!pw || !pw->avdd || !pw->iovdd)) {
665                 /* put CSIE IOs into DPD mode to
666                  * save additional power for ardbeg
667                  */
668                 tegra_io_dpd_enable(&csie_io);
669                 return -EFAULT;
670         }
671
672         usleep_range(100, 120);
673         gpio_set_value(CAM_RSTN, 0);
674         usleep_range(100, 120);
675         regulator_disable(pw->avdd);
676         usleep_range(100, 120);
677         regulator_disable(pw->iovdd);
678
679         /* put CSIE IOs into DPD mode to save additional power for ardbeg */
680         tegra_io_dpd_enable(&csie_io);
681         return 1;
682 }
683
684 struct mt9m114_platform_data ardbeg_mt9m114_pdata = {
685         .power_on = ardbeg_mt9m114_power_on,
686         .power_off = ardbeg_mt9m114_power_off,
687         .mclk_name = "mclk2",
688 };
689
690
691 static int ardbeg_ov5693_power_on(struct ov5693_power_rail *pw)
692 {
693         int err;
694
695         if (unlikely(WARN_ON(!pw || !pw->dovdd || !pw->avdd)))
696                 return -EFAULT;
697
698         /* disable CSIA/B IOs DPD mode to turn on camera for ardbeg */
699         tegra_io_dpd_disable(&csia_io);
700         tegra_io_dpd_disable(&csib_io);
701
702         if (ardbeg_get_extra_regulators())
703                 goto ov5693_poweron_fail;
704
705         gpio_set_value(CAM1_PWDN, 0);
706         usleep_range(10, 20);
707
708         err = regulator_enable(pw->avdd);
709         if (err)
710                 goto ov5693_avdd_fail;
711
712         err = regulator_enable(pw->dovdd);
713         if (err)
714                 goto ov5693_iovdd_fail;
715
716         udelay(2);
717         gpio_set_value(CAM1_PWDN, 1);
718
719         err = regulator_enable(ardbeg_vcmvdd);
720         if (unlikely(err))
721                 goto ov5693_vcmvdd_fail;
722
723         usleep_range(300, 310);
724
725         return 0;
726
727 ov5693_vcmvdd_fail:
728         regulator_disable(pw->dovdd);
729
730 ov5693_iovdd_fail:
731         regulator_disable(pw->avdd);
732
733 ov5693_avdd_fail:
734         gpio_set_value(CAM1_PWDN, 0);
735
736 ov5693_poweron_fail:
737         /* put CSIA/B IOs into DPD mode to save additional power for ardbeg */
738         tegra_io_dpd_enable(&csia_io);
739         tegra_io_dpd_enable(&csib_io);
740         pr_err("%s FAILED\n", __func__);
741         return -ENODEV;
742 }
743
744 static int ardbeg_ov5693_power_off(struct ov5693_power_rail *pw)
745 {
746         if (unlikely(WARN_ON(!pw || !pw->dovdd || !pw->avdd))) {
747                 /* put CSIA/B IOs into DPD mode to
748                  * save additional power for ardbeg
749                  */
750                 tegra_io_dpd_enable(&csia_io);
751                 tegra_io_dpd_enable(&csib_io);
752                 return -EFAULT;
753         }
754
755         usleep_range(21, 25);
756         gpio_set_value(CAM1_PWDN, 0);
757         udelay(2);
758
759         regulator_disable(ardbeg_vcmvdd);
760         regulator_disable(pw->dovdd);
761         regulator_disable(pw->avdd);
762
763         /* put CSIA/B IOs into DPD mode to save additional power for ardbeg */
764         tegra_io_dpd_enable(&csia_io);
765         tegra_io_dpd_enable(&csib_io);
766         return 0;
767 }
768
769 static struct nvc_gpio_pdata ov5693_gpio_pdata[] = {
770         { OV5693_GPIO_TYPE_PWRDN, CAM_RSTN, true, 0, },
771 };
772
773 static struct ov5693_platform_data ardbeg_ov5693_pdata = {
774         .gpio_count     = ARRAY_SIZE(ov5693_gpio_pdata),
775         .gpio           = ov5693_gpio_pdata,
776         .power_on       = ardbeg_ov5693_power_on,
777         .power_off      = ardbeg_ov5693_power_off,
778 };
779
780 static int ardbeg_ad5823_power_on(struct ad5823_platform_data *pdata)
781 {
782         int err = 0;
783
784         pr_info("%s\n", __func__);
785         gpio_set_value_cansleep(pdata->gpio, 1);
786         pdata->pwr_dev = AD5823_PWR_DEV_ON;
787
788         return err;
789 }
790
791 static int ardbeg_ad5823_power_off(struct ad5823_platform_data *pdata)
792 {
793         pr_info("%s\n", __func__);
794         gpio_set_value_cansleep(pdata->gpio, 0);
795         pdata->pwr_dev = AD5823_PWR_DEV_OFF;
796
797         return 0;
798 }
799
800 static struct ad5823_platform_data ardbeg_ad5823_pdata = {
801         .gpio = CAM_AF_PWDN,
802         .power_on       = ardbeg_ad5823_power_on,
803         .power_off      = ardbeg_ad5823_power_off,
804 };
805
806 static struct i2c_board_info    ardbeg_i2c_board_info_imx135 = {
807         I2C_BOARD_INFO("imx135", 0x10),
808         .platform_data = &ardbeg_imx135_data,
809 };
810
811 static struct i2c_board_info    ardbeg_i2c_board_info_ar0261 = {
812         I2C_BOARD_INFO("ar0261", 0x36),
813         .platform_data = &ardbeg_ar0261_data,
814 };
815
816 static struct i2c_board_info    ardbeg_i2c_board_info_dw9718 = {
817         I2C_BOARD_INFO("dw9718", 0x0c),
818         .platform_data = &ardbeg_dw9718_data,
819 };
820
821 static struct i2c_board_info    ardbeg_i2c_board_info_ov5693 = {
822         I2C_BOARD_INFO("ov5693", 0x10),
823         .platform_data = &ardbeg_ov5693_pdata,
824 };
825
826 static struct i2c_board_info    ardbeg_i2c_board_info_ov7695 = {
827         I2C_BOARD_INFO("ov7695", 0x21),
828         .platform_data = &ardbeg_ov7695_pdata,
829 };
830
831 static struct i2c_board_info    ardbeg_i2c_board_info_mt9m114 = {
832         I2C_BOARD_INFO("mt9m114", 0x48),
833         .platform_data = &ardbeg_mt9m114_pdata,
834 };
835
836 static struct i2c_board_info    ardbeg_i2c_board_info_ad5823 = {
837         I2C_BOARD_INFO("ad5823", 0x0c),
838         .platform_data = &ardbeg_ad5823_pdata,
839 };
840
841 static struct i2c_board_info    ardbeg_i2c_board_info_as3648 = {
842                 I2C_BOARD_INFO("as3648", 0x30),
843                 .platform_data = &ardbeg_as3648_data,
844 };
845
846 static struct camera_module ardbeg_camera_module_info[] = {
847         /* E1823 camera board */
848         {
849                 /* rear camera */
850                 .sensor = &ardbeg_i2c_board_info_imx135,
851                 .focuser = &ardbeg_i2c_board_info_dw9718,
852                 .flash = &ardbeg_i2c_board_info_as3648,
853         },
854         {
855                 /* front camera */
856                 .sensor = &ardbeg_i2c_board_info_ar0261,
857         },
858         /* E1793 camera board */
859         {
860                 /* rear camera */
861                 .sensor = &ardbeg_i2c_board_info_ov5693,
862                 .focuser = &ardbeg_i2c_board_info_ad5823,
863                 .flash = &ardbeg_i2c_board_info_as3648,
864         },
865         {
866                 /* front camera */
867                 .sensor = &ardbeg_i2c_board_info_ov7695,
868         },
869         /* E1806 camera board has the same rear camera module as E1793,
870            but the front camera is different */
871         {
872                 /* front camera */
873                 .sensor = &ardbeg_i2c_board_info_mt9m114,
874         },
875
876         {}
877 };
878
879 static struct camera_platform_data ardbeg_pcl_pdata = {
880         .cfg = 0xAA55AA55,
881         .modules = ardbeg_camera_module_info,
882 };
883
884 static struct platform_device ardbeg_camera_generic = {
885         .name = "pcl-generic",
886         .id = -1,
887 };
888
889 static int ardbeg_camera_init(void)
890 {
891         pr_debug("%s: ++\n", __func__);
892
893         /* put CSIA/B/E IOs into DPD mode to
894          * save additional power for ardbeg
895          */
896         tegra_io_dpd_enable(&csia_io);
897         tegra_io_dpd_enable(&csib_io);
898         tegra_io_dpd_enable(&csie_io);
899
900         platform_device_add_data(&ardbeg_camera_generic,
901                 &ardbeg_pcl_pdata, sizeof(ardbeg_pcl_pdata));
902         platform_device_register(&ardbeg_camera_generic);
903
904 #if IS_ENABLED(CONFIG_SOC_CAMERA_PLATFORM)
905         platform_device_register(&ardbeg_soc_camera_device);
906 #endif
907
908         return 0;
909 }
910
911 static struct pid_thermal_gov_params cpu_pid_params = {
912         .max_err_temp = 4000,
913         .max_err_gain = 1000,
914
915         .gain_p = 1000,
916         .gain_d = 0,
917
918         .up_compensation = 15,
919         .down_compensation = 15,
920 };
921
922 static struct thermal_zone_params cpu_tzp = {
923         .governor_name = "pid_thermal_gov",
924         .governor_params = &cpu_pid_params,
925 };
926
927 static struct throttle_table cpu_throttle_table[] = {
928         /* CPU_THROT_LOW cannot be used by other than CPU */
929         /*      CPU,    GPU,  C2BUS,  C3BUS,   SCLK,    EMC   */
930         { { 2295000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
931         { { 2269500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
932         { { 2244000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
933         { { 2218500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
934         { { 2193000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
935         { { 2167500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
936         { { 2142000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
937         { { 2116500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
938         { { 2091000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
939         { { 2065500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
940         { { 2040000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
941         { { 2014500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
942         { { 1989000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
943         { { 1963500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
944         { { 1938000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
945         { { 1912500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
946         { { 1887000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
947         { { 1861500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
948         { { 1836000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
949         { { 1810500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
950         { { 1785000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
951         { { 1759500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
952         { { 1734000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
953         { { 1708500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
954         { { 1683000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
955         { { 1657500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
956         { { 1632000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
957         { { 1606500, 790000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
958         { { 1581000, 776000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
959         { { 1555500, 762000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
960         { { 1530000, 749000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
961         { { 1504500, 735000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
962         { { 1479000, 721000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
963         { { 1453500, 707000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
964         { { 1428000, 693000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
965         { { 1402500, 679000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
966         { { 1377000, 666000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
967         { { 1351500, 652000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
968         { { 1326000, 638000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
969         { { 1300500, 624000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
970         { { 1275000, 610000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
971         { { 1249500, 596000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
972         { { 1224000, 582000, NO_CAP, NO_CAP, NO_CAP, 792000 } },
973         { { 1198500, 569000, NO_CAP, NO_CAP, NO_CAP, 792000 } },
974         { { 1173000, 555000, NO_CAP, NO_CAP, 360000, 792000 } },
975         { { 1147500, 541000, NO_CAP, NO_CAP, 360000, 792000 } },
976         { { 1122000, 527000, NO_CAP, 684000, 360000, 792000 } },
977         { { 1096500, 513000, 444000, 684000, 360000, 792000 } },
978         { { 1071000, 499000, 444000, 684000, 360000, 792000 } },
979         { { 1045500, 486000, 444000, 684000, 360000, 792000 } },
980         { { 1020000, 472000, 444000, 684000, 324000, 792000 } },
981         { {  994500, 458000, 444000, 684000, 324000, 792000 } },
982         { {  969000, 444000, 444000, 600000, 324000, 792000 } },
983         { {  943500, 430000, 444000, 600000, 324000, 792000 } },
984         { {  918000, 416000, 396000, 600000, 324000, 792000 } },
985         { {  892500, 402000, 396000, 600000, 324000, 792000 } },
986         { {  867000, 389000, 396000, 600000, 324000, 792000 } },
987         { {  841500, 375000, 396000, 600000, 288000, 792000 } },
988         { {  816000, 361000, 396000, 600000, 288000, 792000 } },
989         { {  790500, 347000, 396000, 600000, 288000, 792000 } },
990         { {  765000, 333000, 396000, 504000, 288000, 792000 } },
991         { {  739500, 319000, 348000, 504000, 288000, 792000 } },
992         { {  714000, 306000, 348000, 504000, 288000, 624000 } },
993         { {  688500, 292000, 348000, 504000, 288000, 624000 } },
994         { {  663000, 278000, 348000, 504000, 288000, 624000 } },
995         { {  637500, 264000, 348000, 504000, 288000, 624000 } },
996         { {  612000, 250000, 348000, 504000, 252000, 624000 } },
997         { {  586500, 236000, 348000, 504000, 252000, 624000 } },
998         { {  561000, 222000, 348000, 420000, 252000, 624000 } },
999         { {  535500, 209000, 288000, 420000, 252000, 624000 } },
1000         { {  510000, 195000, 288000, 420000, 252000, 624000 } },
1001         { {  484500, 181000, 288000, 420000, 252000, 624000 } },
1002         { {  459000, 167000, 288000, 420000, 252000, 624000 } },
1003         { {  433500, 153000, 288000, 420000, 252000, 396000 } },
1004         { {  408000, 139000, 288000, 420000, 252000, 396000 } },
1005         { {  382500, 126000, 288000, 420000, 252000, 396000 } },
1006         { {  357000, 112000, 288000, 420000, 252000, 396000 } },
1007         { {  331500,  98000, 288000, 420000, 252000, 396000 } },
1008         { {  306000,  84000, 288000, 420000, 252000, 396000 } },
1009         { {  280500,  84000, 288000, 420000, 252000, 396000 } },
1010         { {  255000,  84000, 288000, 420000, 252000, 396000 } },
1011         { {  229500,  84000, 288000, 420000, 252000, 396000 } },
1012         { {  204000,  84000, 288000, 420000, 252000, 396000 } },
1013 };
1014
1015 static struct balanced_throttle cpu_throttle = {
1016         .throt_tab_size = ARRAY_SIZE(cpu_throttle_table),
1017         .throt_tab = cpu_throttle_table,
1018 };
1019
1020 static struct throttle_table gpu_throttle_table[] = {
1021         /* CPU_THROT_LOW cannot be used by other than CPU */
1022         /*      CPU,    GPU,  C2BUS,  C3BUS,   SCLK,    EMC   */
1023         { { 2295000, 782800, 480000, 756000, 384000, 924000 } },
1024         { { 2269500, 772200, 480000, 756000, 384000, 924000 } },
1025         { { 2244000, 761600, 480000, 756000, 384000, 924000 } },
1026         { { 2218500, 751100, 480000, 756000, 384000, 924000 } },
1027         { { 2193000, 740500, 480000, 756000, 384000, 924000 } },
1028         { { 2167500, 729900, 480000, 756000, 384000, 924000 } },
1029         { { 2142000, 719300, 480000, 756000, 384000, 924000 } },
1030         { { 2116500, 708700, 480000, 756000, 384000, 924000 } },
1031         { { 2091000, 698100, 480000, 756000, 384000, 924000 } },
1032         { { 2065500, 687500, 480000, 756000, 384000, 924000 } },
1033         { { 2040000, 676900, 480000, 756000, 384000, 924000 } },
1034         { { 2014500, 666000, 480000, 756000, 384000, 924000 } },
1035         { { 1989000, 656000, 480000, 756000, 384000, 924000 } },
1036         { { 1963500, 645000, 480000, 756000, 384000, 924000 } },
1037         { { 1938000, 635000, 480000, 756000, 384000, 924000 } },
1038         { { 1912500, 624000, 480000, 756000, 384000, 924000 } },
1039         { { 1887000, 613000, 480000, 756000, 384000, 924000 } },
1040         { { 1861500, 603000, 480000, 756000, 384000, 924000 } },
1041         { { 1836000, 592000, 480000, 756000, 384000, 924000 } },
1042         { { 1810500, 582000, 480000, 756000, 384000, 924000 } },
1043         { { 1785000, 571000, 480000, 756000, 384000, 924000 } },
1044         { { 1759500, 560000, 480000, 756000, 384000, 924000 } },
1045         { { 1734000, 550000, 480000, 756000, 384000, 924000 } },
1046         { { 1708500, 539000, 480000, 756000, 384000, 924000 } },
1047         { { 1683000, 529000, 480000, 756000, 384000, 924000 } },
1048         { { 1657500, 518000, 480000, 756000, 384000, 924000 } },
1049         { { 1632000, 508000, 480000, 756000, 384000, 924000 } },
1050         { { 1606500, 497000, 480000, 756000, 384000, 924000 } },
1051         { { 1581000, 486000, 480000, 756000, 384000, 924000 } },
1052         { { 1555500, 476000, 480000, 756000, 384000, 924000 } },
1053         { { 1530000, 465000, 480000, 756000, 384000, 924000 } },
1054         { { 1504500, 455000, 480000, 756000, 384000, 924000 } },
1055         { { 1479000, 444000, 480000, 756000, 384000, 924000 } },
1056         { { 1453500, 433000, 480000, 756000, 384000, 924000 } },
1057         { { 1428000, 423000, 480000, 756000, 384000, 924000 } },
1058         { { 1402500, 412000, 480000, 756000, 384000, 924000 } },
1059         { { 1377000, 402000, 480000, 756000, 384000, 924000 } },
1060         { { 1351500, 391000, 480000, 756000, 384000, 924000 } },
1061         { { 1326000, 380000, 480000, 756000, 384000, 924000 } },
1062         { { 1300500, 370000, 480000, 756000, 384000, 924000 } },
1063         { { 1275000, 359000, 480000, 756000, 384000, 924000 } },
1064         { { 1249500, 349000, 480000, 756000, 384000, 924000 } },
1065         { { 1224000, 338000, 480000, 756000, 384000, 792000 } },
1066         { { 1198500, 328000, 480000, 756000, 384000, 792000 } },
1067         { { 1173000, 317000, 480000, 756000, 360000, 792000 } },
1068         { { 1147500, 306000, 480000, 756000, 360000, 792000 } },
1069         { { 1122000, 296000, 480000, 684000, 360000, 792000 } },
1070         { { 1096500, 285000, 444000, 684000, 360000, 792000 } },
1071         { { 1071000, 275000, 444000, 684000, 360000, 792000 } },
1072         { { 1045500, 264000, 444000, 684000, 360000, 792000 } },
1073         { { 1020000, 253000, 444000, 684000, 324000, 792000 } },
1074         { {  994500, 243000, 444000, 684000, 324000, 792000 } },
1075         { {  969000, 232000, 444000, 600000, 324000, 792000 } },
1076         { {  943500, 222000, 444000, 600000, 324000, 792000 } },
1077         { {  918000, 211000, 396000, 600000, 324000, 792000 } },
1078         { {  892500, 200000, 396000, 600000, 324000, 792000 } },
1079         { {  867000, 190000, 396000, 600000, 324000, 792000 } },
1080         { {  841500, 179000, 396000, 600000, 288000, 792000 } },
1081         { {  816000, 169000, 396000, 600000, 288000, 792000 } },
1082         { {  790500, 158000, 396000, 600000, 288000, 792000 } },
1083         { {  765000, 148000, 396000, 504000, 288000, 792000 } },
1084         { {  739500, 137000, 348000, 504000, 288000, 792000 } },
1085         { {  714000, 126000, 348000, 504000, 288000, 624000 } },
1086         { {  688500, 116000, 348000, 504000, 288000, 624000 } },
1087         { {  663000, 105000, 348000, 504000, 288000, 624000 } },
1088         { {  637500,  95000, 348000, 504000, 288000, 624000 } },
1089         { {  612000,  84000, 348000, 504000, 252000, 624000 } },
1090         { {  586500,  84000, 348000, 504000, 252000, 624000 } },
1091         { {  561000,  84000, 348000, 420000, 252000, 624000 } },
1092         { {  535500,  84000, 288000, 420000, 252000, 624000 } },
1093         { {  510000,  84000, 288000, 420000, 252000, 624000 } },
1094         { {  484500,  84000, 288000, 420000, 252000, 624000 } },
1095         { {  459000,  84000, 288000, 420000, 252000, 624000 } },
1096         { {  433500,  84000, 288000, 420000, 252000, 396000 } },
1097         { {  408000,  84000, 288000, 420000, 252000, 396000 } },
1098         { {  382500,  84000, 288000, 420000, 252000, 396000 } },
1099         { {  357000,  84000, 288000, 420000, 252000, 396000 } },
1100         { {  331500,  84000, 288000, 420000, 252000, 396000 } },
1101         { {  306000,  84000, 288000, 420000, 252000, 396000 } },
1102         { {  280500,  84000, 288000, 420000, 252000, 396000 } },
1103         { {  255000,  84000, 288000, 420000, 252000, 396000 } },
1104         { {  229500,  84000, 288000, 420000, 252000, 396000 } },
1105         { {  204000,  84000, 288000, 420000, 252000, 396000 } },
1106 };
1107
1108 static struct balanced_throttle gpu_throttle = {
1109         .throt_tab_size = ARRAY_SIZE(gpu_throttle_table),
1110         .throt_tab = gpu_throttle_table,
1111 };
1112
1113 static int __init ardbeg_tj_throttle_init(void)
1114 {
1115         if (of_machine_is_compatible("nvidia,ardbeg") ||
1116             of_machine_is_compatible("nvidia,tn8") ||
1117             of_machine_is_compatible("nvidia,jetson-tk1")) {
1118                 balanced_throttle_register(&cpu_throttle, "cpu-balanced");
1119                 balanced_throttle_register(&gpu_throttle, "gpu-balanced");
1120         }
1121
1122         return 0;
1123 }
1124 module_init(ardbeg_tj_throttle_init);
1125
1126 #ifdef CONFIG_TEGRA_SKIN_THROTTLE
1127 static struct thermal_trip_info skin_trips[] = {
1128         {
1129                 .cdev_type = "skin-balanced",
1130                 .trip_temp = 43000,
1131                 .trip_type = THERMAL_TRIP_PASSIVE,
1132                 .upper = THERMAL_NO_LIMIT,
1133                 .lower = THERMAL_NO_LIMIT,
1134                 .hysteresis = 0,
1135         }
1136 };
1137
1138 static struct therm_est_subdevice skin_devs[] = {
1139         {
1140                 .dev_data = "Tdiode_tegra",
1141                 .coeffs = {
1142                         2, 1, 1, 1,
1143                         1, 1, 1, 1,
1144                         1, 1, 1, 0,
1145                         1, 1, 0, 0,
1146                         0, 0, -1, -7
1147                 },
1148         },
1149         {
1150                 .dev_data = "Tboard_tegra",
1151                 .coeffs = {
1152                         -11, -7, -5, -3,
1153                         -3, -2, -1, 0,
1154                         0, 0, 1, 1,
1155                         1, 2, 2, 3,
1156                         4, 6, 11, 18
1157                 },
1158         },
1159 };
1160
1161 static struct therm_est_subdevice tn8ffd_skin_devs[] = {
1162         {
1163                 .dev_data = "Tdiode",
1164                 .coeffs = {
1165                         3, 0, 0, 0,
1166                         1, 0, -1, 0,
1167                         1, 0, 0, 1,
1168                         1, 0, 0, 0,
1169                         0, 1, 2, 2
1170                 },
1171         },
1172         {
1173                 .dev_data = "Tboard",
1174                 .coeffs = {
1175                         1, 1, 2, 8,
1176                         6, -8, -13, -9,
1177                         -9, -8, -17, -18,
1178                         -18, -16, 2, 17,
1179                         15, 27, 42, 60
1180                 },
1181         },
1182 };
1183
1184 static struct pid_thermal_gov_params skin_pid_params = {
1185         .max_err_temp = 4000,
1186         .max_err_gain = 1000,
1187
1188         .gain_p = 1000,
1189         .gain_d = 0,
1190
1191         .up_compensation = 15,
1192         .down_compensation = 15,
1193 };
1194
1195 static struct thermal_zone_params skin_tzp = {
1196         .governor_name = "pid_thermal_gov",
1197         .governor_params = &skin_pid_params,
1198 };
1199
1200 static struct therm_est_data skin_data = {
1201         .num_trips = ARRAY_SIZE(skin_trips),
1202         .trips = skin_trips,
1203         .polling_period = 1100,
1204         .passive_delay = 15000,
1205         .tc1 = 10,
1206         .tc2 = 1,
1207         .tzp = &skin_tzp,
1208 };
1209
1210 static struct throttle_table skin_throttle_table[] = {
1211         /* CPU_THROT_LOW cannot be used by other than CPU */
1212         /*      CPU,    GPU,  C2BUS,  C3BUS,   SCLK,    EMC   */
1213         { { 2295000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
1214         { { 2269500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
1215         { { 2244000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
1216         { { 2218500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
1217         { { 2193000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
1218         { { 2167500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
1219         { { 2142000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
1220         { { 2116500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
1221         { { 2091000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
1222         { { 2065500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
1223         { { 2040000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
1224         { { 2014500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
1225         { { 1989000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
1226         { { 1963500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
1227         { { 1938000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
1228         { { 1912500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
1229         { { 1887000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
1230         { { 1861500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
1231         { { 1836000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
1232         { { 1810500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
1233         { { 1785000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
1234         { { 1759500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
1235         { { 1734000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
1236         { { 1708500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
1237         { { 1683000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
1238         { { 1657500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
1239         { { 1632000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
1240         { { 1606500, 790000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
1241         { { 1581000, 776000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
1242         { { 1555500, 762000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
1243         { { 1530000, 749000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
1244         { { 1504500, 735000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
1245         { { 1479000, 721000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
1246         { { 1453500, 707000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
1247         { { 1428000, 693000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
1248         { { 1402500, 679000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
1249         { { 1377000, 666000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
1250         { { 1351500, 652000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
1251         { { 1326000, 638000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
1252         { { 1300500, 624000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
1253         { { 1275000, 610000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
1254         { { 1249500, 596000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
1255         { { 1224000, 582000, NO_CAP, NO_CAP, NO_CAP, 792000 } },
1256         { { 1198500, 569000, NO_CAP, NO_CAP, NO_CAP, 792000 } },
1257         { { 1173000, 555000, NO_CAP, NO_CAP, 360000, 792000 } },
1258         { { 1147500, 541000, NO_CAP, NO_CAP, 360000, 792000 } },
1259         { { 1122000, 527000, NO_CAP, 684000, 360000, 792000 } },
1260         { { 1096500, 513000, 444000, 684000, 360000, 792000 } },
1261         { { 1071000, 499000, 444000, 684000, 360000, 792000 } },
1262         { { 1045500, 486000, 444000, 684000, 360000, 792000 } },
1263         { { 1020000, 472000, 444000, 684000, 324000, 792000 } },
1264         { {  994500, 458000, 444000, 684000, 324000, 792000 } },
1265         { {  969000, 444000, 444000, 600000, 324000, 792000 } },
1266         { {  943500, 430000, 444000, 600000, 324000, 792000 } },
1267         { {  918000, 416000, 396000, 600000, 324000, 792000 } },
1268         { {  892500, 402000, 396000, 600000, 324000, 792000 } },
1269         { {  867000, 389000, 396000, 600000, 324000, 792000 } },
1270         { {  841500, 375000, 396000, 600000, 288000, 792000 } },
1271         { {  816000, 361000, 396000, 600000, 288000, 792000 } },
1272         { {  790500, 347000, 396000, 600000, 288000, 792000 } },
1273         { {  765000, 333000, 396000, 504000, 288000, 792000 } },
1274         { {  739500, 319000, 348000, 504000, 288000, 792000 } },
1275         { {  714000, 306000, 348000, 504000, 288000, 624000 } },
1276         { {  688500, 292000, 348000, 504000, 288000, 624000 } },
1277         { {  663000, 278000, 348000, 504000, 288000, 624000 } },
1278         { {  637500, 264000, 348000, 504000, 288000, 624000 } },
1279         { {  612000, 250000, 348000, 504000, 252000, 624000 } },
1280         { {  586500, 236000, 348000, 504000, 252000, 624000 } },
1281         { {  561000, 222000, 348000, 420000, 252000, 624000 } },
1282         { {  535500, 209000, 288000, 420000, 252000, 624000 } },
1283         { {  510000, 195000, 288000, 420000, 252000, 624000 } },
1284         { {  484500, 181000, 288000, 420000, 252000, 624000 } },
1285         { {  459000, 167000, 288000, 420000, 252000, 624000 } },
1286         { {  433500, 153000, 288000, 420000, 252000, 396000 } },
1287         { {  408000, 139000, 288000, 420000, 252000, 396000 } },
1288         { {  382500, 126000, 288000, 420000, 252000, 396000 } },
1289         { {  357000, 112000, 288000, 420000, 252000, 396000 } },
1290         { {  331500,  98000, 288000, 420000, 252000, 396000 } },
1291         { {  306000,  84000, 288000, 420000, 252000, 396000 } },
1292         { {  280500,  84000, 288000, 420000, 252000, 396000 } },
1293         { {  255000,  84000, 288000, 420000, 252000, 396000 } },
1294         { {  229500,  84000, 288000, 420000, 252000, 396000 } },
1295         { {  204000,  84000, 288000, 420000, 252000, 396000 } },
1296 };
1297
1298 static struct balanced_throttle skin_throttle = {
1299         .throt_tab_size = ARRAY_SIZE(skin_throttle_table),
1300         .throt_tab = skin_throttle_table,
1301 };
1302
1303 static int __init ardbeg_skin_init(void)
1304 {
1305         struct board_info board_info;
1306
1307         tegra_get_board_info(&board_info);
1308
1309         if (of_machine_is_compatible("nvidia,ardbeg") ||
1310                 of_machine_is_compatible("nvidia,tn8")) {
1311                 if (board_info.board_id == BOARD_P1761 ||
1312                         board_info.board_id == BOARD_E1784 ||
1313                         board_info.board_id == BOARD_E1922) {
1314                         skin_data.ndevs = ARRAY_SIZE(tn8ffd_skin_devs);
1315                         skin_data.devs = tn8ffd_skin_devs;
1316                         skin_data.toffset = 4034;
1317                 } else {
1318                         skin_data.ndevs = ARRAY_SIZE(skin_devs);
1319                         skin_data.devs = skin_devs;
1320                         skin_data.toffset = 9793;
1321                 }
1322
1323                 balanced_throttle_register(&skin_throttle, "skin-balanced");
1324                 tegra_skin_therm_est_device.dev.platform_data = &skin_data;
1325                 platform_device_register(&tegra_skin_therm_est_device);
1326         }
1327         return 0;
1328 }
1329 late_initcall(ardbeg_skin_init);
1330 #endif
1331
1332 static struct nct1008_platform_data ardbeg_nct72_pdata = {
1333         .loc_name = "tegra",
1334
1335         .supported_hwrev = true,
1336         .ext_range = true,
1337         .conv_rate = 0x06, /* 4Hz conversion rate */
1338         .offset = 0,
1339         .shutdown_ext_limit = 95, /* C */
1340         .shutdown_local_limit = 120, /* C */
1341
1342         .passive_delay = 1000,
1343         .tzp = &cpu_tzp,
1344
1345         .num_trips = 2,
1346         .trips = {
1347                 {
1348                         .cdev_type = "shutdown_warning",
1349                         .trip_temp = 93000,
1350                         .trip_type = THERMAL_TRIP_PASSIVE,
1351                         .upper = THERMAL_NO_LIMIT,
1352                         .lower = THERMAL_NO_LIMIT,
1353                 },
1354                 {
1355                         .cdev_type = "cpu-balanced",
1356                         .trip_temp = 83000,
1357                         .trip_type = THERMAL_TRIP_PASSIVE,
1358                         .upper = THERMAL_NO_LIMIT,
1359                         .lower = THERMAL_NO_LIMIT,
1360                         .hysteresis = 1000,
1361                 },
1362         },
1363 };
1364
1365 #ifdef CONFIG_TEGRA_SKIN_THROTTLE
1366 static struct nct1008_platform_data ardbeg_nct72_tskin_pdata = {
1367         .loc_name = "skin",
1368
1369         .supported_hwrev = true,
1370         .ext_range = true,
1371         .conv_rate = 0x06, /* 4Hz conversion rate */
1372         .offset = 0,
1373         .shutdown_ext_limit = 85, /* C */
1374         .shutdown_local_limit = 120, /* C */
1375
1376         .passive_delay = 10000,
1377         .polling_delay = 1000,
1378         .tzp = &skin_tzp,
1379
1380         .num_trips = 1,
1381         .trips = {
1382                 {
1383                         .cdev_type = "skin-balanced",
1384                         .trip_temp = 50000,
1385                         .trip_type = THERMAL_TRIP_PASSIVE,
1386                         .upper = THERMAL_NO_LIMIT,
1387                         .lower = THERMAL_NO_LIMIT,
1388                 },
1389         },
1390 };
1391 #endif
1392
1393 static struct i2c_board_info ardbeg_i2c_nct72_board_info[] = {
1394         {
1395                 I2C_BOARD_INFO("nct72", 0x4c),
1396                 .platform_data = &ardbeg_nct72_pdata,
1397                 .irq = -1,
1398         },
1399 #ifdef CONFIG_TEGRA_SKIN_THROTTLE
1400         {
1401                 I2C_BOARD_INFO("nct72", 0x4d),
1402                 .platform_data = &ardbeg_nct72_tskin_pdata,
1403                 .irq = -1,
1404         }
1405 #endif
1406 };
1407
1408 static int ardbeg_nct72_init(void)
1409 {
1410         s32 base_cp, shft_cp;
1411         u32 base_ft, shft_ft;
1412         int nct72_port = TEGRA_GPIO_PI6;
1413         int ret = 0;
1414         int i;
1415         struct thermal_trip_info *trip_state;
1416         struct board_info board_info;
1417
1418         tegra_get_board_info(&board_info);
1419         /* raise NCT's thresholds if soctherm CP,FT fuses are ok */
1420         if ((tegra_fuse_calib_base_get_cp(&base_cp, &shft_cp) >= 0) &&
1421             (tegra_fuse_calib_base_get_ft(&base_ft, &shft_ft) >= 0)) {
1422                 ardbeg_nct72_pdata.shutdown_ext_limit += 20;
1423                 for (i = 0; i < ardbeg_nct72_pdata.num_trips; i++) {
1424                         trip_state = &ardbeg_nct72_pdata.trips[i];
1425                         if (!strncmp(trip_state->cdev_type, "cpu-balanced",
1426                                         THERMAL_NAME_LENGTH)) {
1427                                 trip_state->cdev_type = "_none_";
1428                                 break;
1429                         }
1430                 }
1431         } else {
1432                 tegra_platform_edp_init(ardbeg_nct72_pdata.trips,
1433                                         &ardbeg_nct72_pdata.num_trips,
1434                                         12000); /* edp temperature margin */
1435                 tegra_add_cpu_vmax_trips(ardbeg_nct72_pdata.trips,
1436                                 &ardbeg_nct72_pdata.num_trips);
1437                 tegra_add_tgpu_trips(ardbeg_nct72_pdata.trips,
1438                                      &ardbeg_nct72_pdata.num_trips);
1439                 tegra_add_vc_trips(ardbeg_nct72_pdata.trips,
1440                                      &ardbeg_nct72_pdata.num_trips);
1441                 tegra_add_core_vmax_trips(ardbeg_nct72_pdata.trips,
1442                                      &ardbeg_nct72_pdata.num_trips);
1443         }
1444
1445         tegra_add_all_vmin_trips(ardbeg_nct72_pdata.trips,
1446                                 &ardbeg_nct72_pdata.num_trips);
1447
1448         ardbeg_i2c_nct72_board_info[0].irq = gpio_to_irq(nct72_port);
1449
1450         ret = gpio_request(nct72_port, "temp_alert");
1451         if (ret < 0)
1452                 return ret;
1453
1454         ret = gpio_direction_input(nct72_port);
1455         if (ret < 0) {
1456                 pr_info("%s: calling gpio_free(nct72_port)", __func__);
1457                 gpio_free(nct72_port);
1458         }
1459
1460         /* ardbeg has thermal sensor on GEN2-I2C i.e. instance 1 */
1461         if (board_info.board_id == BOARD_PM358 ||
1462                         board_info.board_id == BOARD_PM359 ||
1463                         board_info.board_id == BOARD_PM370 ||
1464                         board_info.board_id == BOARD_PM374 ||
1465                         board_info.board_id == BOARD_PM363)
1466                 i2c_register_board_info(1, ardbeg_i2c_nct72_board_info,
1467                 ARRAY_SIZE(ardbeg_i2c_nct72_board_info));
1468         else if (board_info.board_id == BOARD_PM375 ||
1469                         board_info.board_id == BOARD_PM377) {
1470                 /* its a developer board and may not have soctherm driver */
1471                 ardbeg_nct72_pdata.shutdown_ext_limit = 100;
1472                 ardbeg_nct72_pdata.shutdown_local_limit = 95;
1473                 i2c_register_board_info(0, ardbeg_i2c_nct72_board_info,
1474                                 ARRAY_SIZE(ardbeg_i2c_nct72_board_info));
1475         } else
1476                 i2c_register_board_info(1, ardbeg_i2c_nct72_board_info,
1477                 ARRAY_SIZE(ardbeg_i2c_nct72_board_info));
1478
1479         return ret;
1480 }
1481
1482 static struct sbs_platform_data sbs_pdata = {
1483         .poll_retry_count       = 100,
1484         .i2c_retry_count        = 2,
1485 };
1486
1487 static struct i2c_board_info __initdata bq20z45_pdata[] = {
1488         {
1489                 I2C_BOARD_INFO("sbs-battery", 0x0B),
1490                 .platform_data = &sbs_pdata,
1491         },
1492 };
1493
1494 struct ntc_thermistor_adc_table {
1495         int temp; /* degree C */
1496         int adc;
1497 };
1498
1499 static struct ntc_thermistor_adc_table tn8_thermistor_table[] = {
1500         { -40, 2578 }, { -39, 2577 }, { -38, 2576 }, { -37, 2575 },
1501         { -36, 2574 }, { -35, 2573 }, { -34, 2572 }, { -33, 2571 },
1502         { -32, 2569 }, { -31, 2568 }, { -30, 2567 }, { -29, 2565 },
1503         { -28, 2563 }, { -27, 2561 }, { -26, 2559 }, { -25, 2557 },
1504         { -24, 2555 }, { -23, 2553 }, { -22, 2550 }, { -21, 2548 },
1505         { -20, 2545 }, { -19, 2542 }, { -18, 2539 }, { -17, 2536 },
1506         { -16, 2532 }, { -15, 2529 }, { -14, 2525 }, { -13, 2521 },
1507         { -12, 2517 }, { -11, 2512 }, { -10, 2507 }, {  -9, 2502 },
1508         {  -8, 2497 }, {  -7, 2492 }, {  -6, 2486 }, {  -5, 2480 },
1509         {  -4, 2473 }, {  -3, 2467 }, {  -2, 2460 }, {  -1, 2452 },
1510         {   0, 2445 }, {   1, 2437 }, {   2, 2428 }, {   3, 2419 },
1511         {   4, 2410 }, {   5, 2401 }, {   6, 2391 }, {   7, 2380 },
1512         {   8, 2369 }, {   9, 2358 }, {  10, 2346 }, {  11, 2334 },
1513         {  12, 2322 }, {  13, 2308 }, {  14, 2295 }, {  15, 2281 },
1514         {  16, 2266 }, {  17, 2251 }, {  18, 2236 }, {  19, 2219 },
1515         {  20, 2203 }, {  21, 2186 }, {  22, 2168 }, {  23, 2150 },
1516         {  24, 2131 }, {  25, 2112 }, {  26, 2092 }, {  27, 2072 },
1517         {  28, 2052 }, {  29, 2030 }, {  30, 2009 }, {  31, 1987 },
1518         {  32, 1964 }, {  33, 1941 }, {  34, 1918 }, {  35, 1894 },
1519         {  36, 1870 }, {  37, 1845 }, {  38, 1820 }, {  39, 1795 },
1520         {  40, 1769 }, {  41, 1743 }, {  42, 1717 }, {  43, 1691 },
1521         {  44, 1664 }, {  45, 1637 }, {  46, 1610 }, {  47, 1583 },
1522         {  48, 1555 }, {  49, 1528 }, {  50, 1500 }, {  51, 1472 },
1523         {  52, 1445 }, {  53, 1417 }, {  54, 1390 }, {  55, 1362 },
1524         {  56, 1334 }, {  57, 1307 }, {  58, 1280 }, {  59, 1253 },
1525         {  60, 1226 }, {  61, 1199 }, {  62, 1172 }, {  63, 1146 },
1526         {  64, 1120 }, {  65, 1094 }, {  66, 1069 }, {  67, 1044 },
1527         {  68, 1019 }, {  69,  994 }, {  70,  970 }, {  71,  946 },
1528         {  72,  922 }, {  73,  899 }, {  74,  877 }, {  75,  854 },
1529         {  76,  832 }, {  77,  811 }, {  78,  789 }, {  79,  769 },
1530         {  80,  748 }, {  81,  729 }, {  82,  709 }, {  83,  690 },
1531         {  84,  671 }, {  85,  653 }, {  86,  635 }, {  87,  618 },
1532         {  88,  601 }, {  89,  584 }, {  90,  568 }, {  91,  552 },
1533         {  92,  537 }, {  93,  522 }, {  94,  507 }, {  95,  493 },
1534         {  96,  479 }, {  97,  465 }, {  98,  452 }, {  99,  439 },
1535         { 100,  427 }, { 101,  415 }, { 102,  403 }, { 103,  391 },
1536         { 104,  380 }, { 105,  369 }, { 106,  359 }, { 107,  349 },
1537         { 108,  339 }, { 109,  329 }, { 110,  320 }, { 111,  310 },
1538         { 112,  302 }, { 113,  293 }, { 114,  285 }, { 115,  277 },
1539         { 116,  269 }, { 117,  261 }, { 118,  254 }, { 119,  247 },
1540         { 120,  240 }, { 121,  233 }, { 122,  226 }, { 123,  220 },
1541         { 124,  214 }, { 125,  208 },
1542 };
1543
1544 static struct ntc_thermistor_adc_table *thermistor_table;
1545 static int thermistor_table_size;
1546
1547 static int gadc_thermal_thermistor_adc_to_temp(
1548                 struct gadc_thermal_platform_data *pdata, int val, int val2)
1549 {
1550         int temp = 0, adc_hi, adc_lo;
1551         int i;
1552
1553         for (i = 0; i < thermistor_table_size; i++)
1554                 if (val >= thermistor_table[i].adc)
1555                         break;
1556
1557         if (i == 0) {
1558                 temp = thermistor_table[i].temp * 1000;
1559         } else if (i >= (thermistor_table_size - 1)) {
1560                 temp = thermistor_table[thermistor_table_size - 1].temp * 1000;
1561         } else {
1562                 adc_hi = thermistor_table[i - 1].adc;
1563                 adc_lo = thermistor_table[i].adc;
1564                 temp = thermistor_table[i].temp * 1000;
1565                 temp -= ((val - adc_lo) * 1000 / (adc_hi - adc_lo));
1566         }
1567
1568         return temp;
1569 };
1570
1571 #define TDIODE_PRECISION_MULTIPLIER     1000000000LL
1572 #define TDIODE_MIN_TEMP                 -25000LL
1573 #define TDIODE_MAX_TEMP                 125000LL
1574
1575 static int gadc_thermal_tdiode_adc_to_temp(
1576                 struct gadc_thermal_platform_data *pdata, int val, int val2)
1577 {
1578         /*
1579          * Series resistance cancellation using multi-current ADC measurement.
1580          * diode temp = ((adc2 - k * adc1) - (b2 - k * b1)) / (m2 - k * m1)
1581          * - adc1 : ADC raw with current source 400uA
1582          * - m1, b1 : calculated with current source 400uA
1583          * - adc2 : ADC raw with current source 800uA
1584          * - m2, b2 : calculated with current source 800uA
1585          * - k : 2 (= 800uA / 400uA)
1586          */
1587         const s64 m1 = -0.00571005 * TDIODE_PRECISION_MULTIPLIER;
1588         const s64 b1 = 2524.29891 * TDIODE_PRECISION_MULTIPLIER;
1589         const s64 m2 = -0.005519811 * TDIODE_PRECISION_MULTIPLIER;
1590         const s64 b2 = 2579.354349 * TDIODE_PRECISION_MULTIPLIER;
1591         s64 temp = TDIODE_PRECISION_MULTIPLIER;
1592
1593         temp *= (s64)((val2) - 2 * (val));
1594         temp -= (b2 - 2 * b1);
1595         temp = div64_s64(temp, (m2 - 2 * m1));
1596         temp = min_t(s64, max_t(s64, temp, TDIODE_MIN_TEMP), TDIODE_MAX_TEMP);
1597         return temp;
1598 };
1599
1600 static struct gadc_thermal_platform_data gadc_thermal_thermistor_pdata = {
1601         .iio_channel_name = "thermistor",
1602         .tz_name = "Tboard",
1603         .temp_offset = 0,
1604         .adc_to_temp = gadc_thermal_thermistor_adc_to_temp,
1605 };
1606
1607 static struct gadc_thermal_platform_data gadc_thermal_tdiode_pdata = {
1608         .iio_channel_name = "tdiode",
1609         .tz_name = "Tdiode",
1610         .temp_offset = 0,
1611         .dual_mode = true,
1612         .adc_to_temp = gadc_thermal_tdiode_adc_to_temp,
1613 };
1614
1615 static struct platform_device gadc_thermal_thermistor = {
1616         .name   = "generic-adc-thermal",
1617         .id     = 1,
1618         .dev    = {
1619                 .platform_data = &gadc_thermal_thermistor_pdata,
1620         },
1621 };
1622
1623 static struct platform_device gadc_thermal_tdiode = {
1624         .name   = "generic-adc-thermal",
1625         .id     = 2,
1626         .dev    = {
1627                 .platform_data = &gadc_thermal_tdiode_pdata,
1628         },
1629 };
1630
1631 static struct platform_device *gadc_thermal_devices[] = {
1632         &gadc_thermal_thermistor,
1633         &gadc_thermal_tdiode,
1634 };
1635
1636 int __init ardbeg_sensors_init(void)
1637 {
1638         struct board_info board_info;
1639         tegra_get_board_info(&board_info);
1640         /* PM363 and PM359 , PM375, PM377 don't have mpu 9250 mounted */
1641         /* TN8 sensors use Device Tree */
1642         if (board_info.board_id != BOARD_PM363 &&
1643                 board_info.board_id != BOARD_PM359 &&
1644                 board_info.board_id != BOARD_PM375 &&
1645                 board_info.board_id != BOARD_PM377 &&
1646                 !of_machine_is_compatible("nvidia,tn8"))
1647                 mpuirq_init();
1648         ardbeg_camera_init();
1649
1650         if (board_info.board_id == BOARD_P1761 ||
1651                 board_info.board_id == BOARD_E1784 ||
1652                 board_info.board_id == BOARD_E1922) {
1653                 platform_add_devices(gadc_thermal_devices,
1654                                 ARRAY_SIZE(gadc_thermal_devices));
1655                 thermistor_table = &tn8_thermistor_table[0];
1656                 thermistor_table_size = ARRAY_SIZE(tn8_thermistor_table);
1657         } else
1658                 ardbeg_nct72_init();
1659
1660         /* TN8 and PM359, PM375, PM377 don't have ALS CM32181 */
1661         if (!of_machine_is_compatible("nvidia,tn8") &&
1662             board_info.board_id != BOARD_PM359 &&
1663             board_info.board_id != BOARD_PM375 &&
1664             board_info.board_id != BOARD_PM377)
1665                 i2c_register_board_info(0, ardbeg_i2c_board_info_cm32181,
1666                         ARRAY_SIZE(ardbeg_i2c_board_info_cm32181));
1667
1668         if (get_power_supply_type() == POWER_SUPPLY_TYPE_BATTERY)
1669                 i2c_register_board_info(1, bq20z45_pdata,
1670                         ARRAY_SIZE(bq20z45_pdata));
1671
1672         return 0;
1673 }