ARM: tegra: pcie: Remove dock detect variable
[linux-3.10.git] / arch / arm / mach-tegra / board-roth-sensors.c
1 /*
2  * arch/arm/mach-tegra/board-roth-sensors.c
3  *
4  * Copyright (c) 2012-2013 NVIDIA CORPORATION, All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions are
8  * met:
9  *
10  * Redistributions of source code must retain the above copyright notice,
11  * this list of conditions and the following disclaimer.
12  *
13  * Redistributions in binary form must reproduce the above copyright
14  * notice, this list of conditions and the following disclaimer in the
15  * documentation and/or other materials provided with the distribution.
16  *
17  * Neither the name of NVIDIA CORPORATION nor the names of its contributors
18  * may be used to endorse or promote products derived from this software
19  * without specific prior written permission.
20  *
21  * This software is licensed under the terms of the GNU General Public
22  * License version 2, as published by the Free Software Foundation, and
23  * may be copied, distributed, and modified under those terms.
24  *
25  * This program is distributed in the hope that it will be useful,
26  * but WITHOUT ANY WARRANTY; without even the implied warranty of
27  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
28  * GNU General Public License for more details.
29  */
30
31 #include <linux/i2c.h>
32 #include <linux/delay.h>
33 #include <linux/mpu.h>
34 #include <linux/gpio.h>
35 #include <linux/therm_est.h>
36 #include <linux/nct1008.h>
37 #include <mach/edp.h>
38 #include <mach/gpio-tegra.h>
39 #include <mach/pinmux-t11.h>
40 #include <mach/pinmux.h>
41 #include <generated/mach-types.h>
42
43 #include "gpio-names.h"
44 #include "board.h"
45 #include "board-common.h"
46 #include "board-roth.h"
47 #include "cpu-tegra.h"
48 #include "devices.h"
49 #include "tegra-board-id.h"
50 #include "dvfs.h"
51
52 static struct throttle_table tj_throttle_table[] = {
53         /* CPU_THROT_LOW cannot be used by other than CPU */
54         /*      CPU,  C2BUS,  C3BUS,   SCLK,    EMC   */
55         { { 1810500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
56         { { 1785000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
57         { { 1759500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
58         { { 1734000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
59         { { 1708500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
60         { { 1683000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
61         { { 1657500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
62         { { 1632000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
63         { { 1606500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
64         { { 1581000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
65         { { 1555500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
66         { { 1530000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
67         { { 1504500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
68         { { 1479000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
69         { { 1453500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
70         { { 1428000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
71         { { 1402500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
72         { { 1377000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
73         { { 1351500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
74         { { 1326000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
75         { { 1300500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
76         { { 1275000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
77         { { 1249500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
78         { { 1224000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
79         { { 1198500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
80         { { 1173000, 636000, NO_CAP, NO_CAP, NO_CAP } },
81         { { 1147500, 636000, NO_CAP, NO_CAP, NO_CAP } },
82         { { 1122000, 636000, NO_CAP, NO_CAP, NO_CAP } },
83         { { 1096500, 636000, NO_CAP, NO_CAP, NO_CAP } },
84         { { 1071000, 636000, NO_CAP, NO_CAP, NO_CAP } },
85         { { 1045500, 636000, NO_CAP, NO_CAP, NO_CAP } },
86         { { 1020000, 636000, NO_CAP, NO_CAP, NO_CAP } },
87         { {  994500, 636000, NO_CAP, NO_CAP, NO_CAP } },
88         { {  969000, 600000, NO_CAP, NO_CAP, NO_CAP } },
89         { {  943500, 600000, NO_CAP, NO_CAP, NO_CAP } },
90         { {  918000, 600000, NO_CAP, NO_CAP, NO_CAP } },
91         { {  892500, 600000, NO_CAP, NO_CAP, NO_CAP } },
92         { {  867000, 600000, NO_CAP, NO_CAP, NO_CAP } },
93         { {  841500, 564000, NO_CAP, NO_CAP, NO_CAP } },
94         { {  816000, 564000, NO_CAP, NO_CAP, 792000 } },
95         { {  790500, 564000, NO_CAP, 372000, 792000 } },
96         { {  765000, 564000, 468000, 372000, 792000 } },
97         { {  739500, 528000, 468000, 372000, 792000 } },
98         { {  714000, 528000, 468000, 336000, 792000 } },
99         { {  688500, 528000, 420000, 336000, 792000 } },
100         { {  663000, 492000, 420000, 336000, 792000 } },
101         { {  637500, 492000, 420000, 336000, 408000 } },
102         { {  612000, 492000, 420000, 300000, 408000 } },
103         { {  586500, 492000, 360000, 336000, 408000 } },
104         { {  561000, 420000, 420000, 300000, 408000 } },
105         { {  535500, 420000, 360000, 228000, 408000 } },
106         { {  510000, 420000, 288000, 228000, 408000 } },
107         { {  484500, 324000, 288000, 228000, 408000 } },
108         { {  459000, 324000, 288000, 228000, 408000 } },
109         { {  433500, 324000, 288000, 228000, 408000 } },
110         { {  408000, 324000, 288000, 228000, 408000 } },
111 };
112
113 static struct balanced_throttle tj_throttle = {
114         .throt_tab_size = ARRAY_SIZE(tj_throttle_table),
115         .throt_tab = tj_throttle_table,
116 };
117
118 static struct throttle_table tj_hard_throttle_table[] = {
119         { {  204000,  420000,  360000,  208000,  204000 } },
120 };
121
122 static struct balanced_throttle tj_hard_throttle = {
123         .throt_tab_size = ARRAY_SIZE(tj_hard_throttle_table),
124         .throt_tab = tj_hard_throttle_table,
125 };
126
127 static int __init roth_throttle_init(void)
128 {
129         if (machine_is_roth()) {
130                 balanced_throttle_register(&tj_throttle, "tegra-balanced");
131                 balanced_throttle_register(&tj_hard_throttle, "tegra-hard");
132         }
133
134         return 0;
135 }
136 module_init(roth_throttle_init);
137
138 static struct nct1008_platform_data roth_nct1008_pdata = {
139         .supported_hwrev = true,
140         .ext_range = true,
141         .conv_rate = 0x08,
142         .offset = 0,
143         .shutdown_ext_limit = 91, /* C */
144         .shutdown_local_limit = 120, /* C */
145         .loc_name = "soc",
146
147         .passive_delay = 2000,
148
149         .num_trips = 2,
150         .trips = {
151                 /* Thermal Throttling */
152                 [0] = {
153                         .cdev_type = "tegra-balanced",
154                         .trip_temp = 80000,
155                         .trip_type = THERMAL_TRIP_PASSIVE,
156                         .upper = THERMAL_NO_LIMIT,
157                         .lower = THERMAL_NO_LIMIT,
158                         .hysteresis = 0,
159                 },
160                 [1] = {
161                         .cdev_type = "tegra-hard",
162                         .trip_temp = 86000, /* shutdown_ext_limit - 2C */
163                         .trip_type = THERMAL_TRIP_PASSIVE,
164                         .upper = 1,
165                         .lower = 1,
166                         .hysteresis = 6000,
167                 },
168                 [2] = {
169                         .cdev_type = "suspend_soctherm",
170                         .trip_temp = 50000,
171                         .trip_type = THERMAL_TRIP_ACTIVE,
172                         .upper = 1,
173                         .lower = 1,
174                         .hysteresis = 5000,
175                 },
176         },
177 };
178
179 static struct i2c_board_info roth_i2c4_nct1008_board_info[] = {
180         {
181                 I2C_BOARD_INFO("nct1008", 0x4C),
182                 .platform_data = &roth_nct1008_pdata,
183                 .irq = -1,
184         }
185 };
186
187 #define VI_PINMUX(_pingroup, _mux, _pupd, _tri, _io, _lock, _ioreset) \
188         {                                                       \
189                 .pingroup       = TEGRA_PINGROUP_##_pingroup,   \
190                 .func           = TEGRA_MUX_##_mux,             \
191                 .pupd           = TEGRA_PUPD_##_pupd,           \
192                 .tristate       = TEGRA_TRI_##_tri,             \
193                 .io             = TEGRA_PIN_##_io,              \
194                 .lock           = TEGRA_PIN_LOCK_##_lock,       \
195                 .od             = TEGRA_PIN_OD_DEFAULT,         \
196                 .ioreset        = TEGRA_PIN_IO_RESET_##_ioreset \
197         }
198
199 /* MPU board file definition    */
200 static struct mpu_platform_data mpu6050_gyro_data = {
201         .int_config     = 0x10,
202         .level_shifter  = 0,
203         /* Located in board_[platformname].h */
204         .orientation    = MPU_GYRO_ORIENTATION,
205         .sec_slave_type = SECONDARY_SLAVE_TYPE_NONE,
206         .key            = {0x4E, 0xCC, 0x7E, 0xEB, 0xF6, 0x1E, 0x35, 0x22,
207                            0x00, 0x34, 0x0D, 0x65, 0x32, 0xE9, 0x94, 0x89},
208 };
209
210 static struct i2c_board_info __initdata inv_mpu6050_i2c2_board_info[] = {
211         {
212                 I2C_BOARD_INFO(MPU_GYRO_NAME, MPU_GYRO_ADDR),
213                 .platform_data = &mpu6050_gyro_data,
214         },
215 };
216
217 static void mpuirq_init(void)
218 {
219         int ret = 0;
220         unsigned gyro_irq_gpio = MPU_GYRO_IRQ_GPIO;
221         unsigned gyro_bus_num = MPU_GYRO_BUS_NUM;
222         char *gyro_name = MPU_GYRO_NAME;
223
224         pr_info("*** MPU START *** mpuirq_init...\n");
225
226         ret = gpio_request(gyro_irq_gpio, gyro_name);
227
228         if (ret < 0) {
229                 pr_err("%s: gpio_request failed %d\n", __func__, ret);
230                 return;
231         }
232
233         ret = gpio_direction_input(gyro_irq_gpio);
234         if (ret < 0) {
235                 pr_err("%s: gpio_direction_input failed %d\n", __func__, ret);
236                 gpio_free(gyro_irq_gpio);
237                 return;
238         }
239         pr_info("*** MPU END *** mpuirq_init...\n");
240
241         inv_mpu6050_i2c2_board_info[0].irq = gpio_to_irq(MPU_GYRO_IRQ_GPIO);
242         i2c_register_board_info(gyro_bus_num, inv_mpu6050_i2c2_board_info,
243                 ARRAY_SIZE(inv_mpu6050_i2c2_board_info));
244 }
245
246 static int roth_nct1008_init(void)
247 {
248         int nct1008_port = TEGRA_GPIO_PX6;
249         int ret = 0;
250
251         tegra_platform_edp_init(roth_nct1008_pdata.trips,
252                                 &roth_nct1008_pdata.num_trips,
253                                 0); /* edp temperature margin */
254         tegra_add_all_vmin_trips(roth_nct1008_pdata.trips,
255                                 &roth_nct1008_pdata.num_trips);
256         tegra_add_cpu_vmax_trips(roth_nct1008_pdata.trips,
257                                 &roth_nct1008_pdata.num_trips);
258         tegra_add_core_edp_trips(roth_nct1008_pdata.trips,
259                                 &roth_nct1008_pdata.num_trips);
260
261         roth_i2c4_nct1008_board_info[0].irq = gpio_to_irq(nct1008_port);
262         pr_info("%s: roth nct1008 irq %d", __func__, \
263                                 roth_i2c4_nct1008_board_info[0].irq);
264
265         ret = gpio_request(nct1008_port, "temp_alert");
266         if (ret < 0)
267                 return ret;
268
269         ret = gpio_direction_input(nct1008_port);
270         if (ret < 0) {
271                 pr_info("%s: calling gpio_free(nct1008_port)", __func__);
272                 gpio_free(nct1008_port);
273         }
274
275         /* roth has thermal sensor on GEN1-I2C i.e. instance 0 */
276         i2c_register_board_info(0, roth_i2c4_nct1008_board_info,
277                 ARRAY_SIZE(roth_i2c4_nct1008_board_info));
278
279         return ret;
280 }
281
282 #ifdef CONFIG_TEGRA_SKIN_THROTTLE
283 static struct thermal_trip_info skin_trips[] = {
284         {
285                 .cdev_type = "skin-balanced",
286                 .trip_temp = 45000,
287                 .trip_type = THERMAL_TRIP_PASSIVE,
288                 .upper = THERMAL_NO_LIMIT,
289                 .lower = THERMAL_NO_LIMIT,
290                 .hysteresis = 0,
291         },
292         {
293                 .cdev_type = "tegra-shutdown",
294                 .trip_temp = 57000,
295                 .trip_type = THERMAL_TRIP_CRITICAL,
296                 .upper = THERMAL_NO_LIMIT,
297                 .lower = THERMAL_NO_LIMIT,
298                 .hysteresis = 0,
299         },
300 };
301
302 static struct therm_est_subdevice skin_devs[] = {
303         {
304                 .dev_data = "Tdiode",
305                 .coeffs = {
306                         2, 1, 1, 1,
307                         1, 1, 1, 1,
308                         1, 1, 1, 0,
309                         1, 1, 0, 0,
310                         0, 0, -1, -7
311                 },
312         },
313         {
314                 .dev_data = "Tboard",
315                 .coeffs = {
316                         -11, -7, -5, -3,
317                         -3, -2, -1, 0,
318                         0, 0, 1, 1,
319                         1, 2, 2, 3,
320                         4, 6, 11, 18
321                 },
322         },
323 };
324
325 static struct therm_est_data skin_data = {
326         .num_trips = ARRAY_SIZE(skin_trips),
327         .trips = skin_trips,
328         .toffset = 9793,
329         .polling_period = 1100,
330         .passive_delay = 15000,
331         .tc1 = 10,
332         .tc2 = 1,
333         .ndevs = ARRAY_SIZE(skin_devs),
334         .devs = skin_devs,
335 };
336
337 static struct throttle_table skin_throttle_table[] = {
338         /* CPU_THROT_LOW cannot be used by other than CPU */
339         /*      CPU,  C2BUS,  C3BUS,   SCLK,    EMC   */
340         { { 1810500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
341         { { 1785000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
342         { { 1759500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
343         { { 1734000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
344         { { 1708500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
345         { { 1683000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
346         { { 1657500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
347         { { 1632000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
348         { { 1606500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
349         { { 1581000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
350         { { 1555500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
351         { { 1530000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
352         { { 1504500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
353         { { 1479000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
354         { { 1453500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
355         { { 1428000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
356         { { 1402500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
357         { { 1377000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
358         { { 1351500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
359         { { 1326000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
360         { { 1300500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
361         { { 1275000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
362         { { 1249500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
363         { { 1224000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
364         { { 1198500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
365         { { 1173000, 636000, NO_CAP, NO_CAP, NO_CAP } },
366         { { 1147500, 636000, NO_CAP, NO_CAP, NO_CAP } },
367         { { 1122000, 636000, NO_CAP, NO_CAP, NO_CAP } },
368         { { 1096500, 636000, NO_CAP, NO_CAP, NO_CAP } },
369         { { 1071000, 636000, NO_CAP, NO_CAP, NO_CAP } },
370         { { 1045500, 636000, NO_CAP, NO_CAP, NO_CAP } },
371         { { 1020000, 636000, NO_CAP, NO_CAP, NO_CAP } },
372         { {  994500, 636000, NO_CAP, NO_CAP, NO_CAP } },
373         { {  969000, 600000, NO_CAP, NO_CAP, NO_CAP } },
374         { {  943500, 600000, NO_CAP, NO_CAP, NO_CAP } },
375         { {  918000, 600000, NO_CAP, NO_CAP, NO_CAP } },
376         { {  892500, 600000, NO_CAP, NO_CAP, NO_CAP } },
377         { {  867000, 600000, NO_CAP, NO_CAP, NO_CAP } },
378         { {  841500, 564000, NO_CAP, NO_CAP, NO_CAP } },
379         { {  816000, 564000, NO_CAP, NO_CAP, 792000 } },
380         { {  790500, 564000, NO_CAP, 372000, 792000 } },
381         { {  765000, 564000, 468000, 372000, 792000 } },
382         { {  739500, 528000, 468000, 372000, 792000 } },
383         { {  714000, 528000, 468000, 336000, 792000 } },
384         { {  688500, 528000, 420000, 336000, 792000 } },
385         { {  663000, 492000, 420000, 336000, 792000 } },
386         { {  637500, 492000, 420000, 336000, 408000 } },
387         { {  612000, 492000, 420000, 300000, 408000 } },
388         { {  586500, 492000, 360000, 336000, 408000 } },
389         { {  561000, 420000, 420000, 300000, 408000 } },
390         { {  535500, 420000, 360000, 228000, 408000 } },
391         { {  510000, 420000, 288000, 228000, 408000 } },
392         { {  484500, 324000, 288000, 228000, 408000 } },
393         { {  459000, 324000, 288000, 228000, 408000 } },
394         { {  433500, 324000, 288000, 228000, 408000 } },
395         { {  408000, 324000, 288000, 228000, 408000 } },
396 };
397
398 static struct balanced_throttle skin_throttle = {
399         .throt_tab_size = ARRAY_SIZE(skin_throttle_table),
400         .throt_tab = skin_throttle_table,
401 };
402
403 static int __init roth_skin_init(void)
404 {
405         if (machine_is_roth()) {
406                 balanced_throttle_register(&skin_throttle, "skin-balanced");
407                 tegra_skin_therm_est_device.dev.platform_data = &skin_data;
408                 platform_device_register(&tegra_skin_therm_est_device);
409         }
410
411         return 0;
412 }
413 late_initcall(roth_skin_init);
414 #endif
415
416 static int roth_fan_est_match(struct thermal_zone_device *thz, void *data)
417 {
418         return (strcmp((char *)data, thz->type) == 0);
419 }
420
421 static int roth_fan_est_get_temp(void *data, long *temp)
422 {
423         struct thermal_zone_device *thz;
424
425         thz = thermal_zone_device_find(data, roth_fan_est_match);
426
427         if (!thz || thz->ops->get_temp(thz, temp))
428                 *temp = 25000;
429
430         return 0;
431 }
432
433 /*Fan thermal estimator init data for P2454*/
434 static struct therm_fan_est_data fan_est_data_p2454 = {
435         .toffset = 0,
436         .polling_period = 1100,
437         .ndevs = 2,
438         .devs = {
439                         {
440                                 .dev_data = "Tdiode_soc",
441                                 .get_temp = roth_fan_est_get_temp,
442                                 .coeffs = {
443                                         100, 0, 0, 0,
444                                         0, 0, 0, 0,
445                                         0, 0, 0, 0,
446                                         0, 0, 0, 0,
447                                         0, 0, 0, 0
448                                 },
449                         },
450                         {
451                                 .dev_data = "Tboard_soc",
452                                 .get_temp = roth_fan_est_get_temp,
453                                 .coeffs = {
454                                         0, 0, 0, 0,
455                                         0, 0, 0, 0,
456                                         0, 0, 0, 0,
457                                         0, 0, 0, 0,
458                                         0, 0, 0, 0
459                                 },
460                         },
461         },
462         .cdev_type = "pwm-fan",
463         .active_trip_temps = {0, 70000, 82000, 120000, 130000,
464                                 140000, 150000, 160000, 170000, 180000},
465         .active_hysteresis = {0, 10000, 7000, 0, 0, 0, 0, 0, 0, 0},
466 };
467
468 static struct platform_device roth_fan_therm_est_device_p2454 = {
469         .name   = "therm-fan-est",
470         .id     = -1,
471         .num_resources  = 0,
472         .dev = {
473                 .platform_data = &fan_est_data_p2454,
474         },
475 };
476
477 /*Fan thermal estimator data for P2560*/
478 static struct therm_fan_est_data fan_est_data_p2560 = {
479         .toffset = 0,
480         .polling_period = 1100,
481         .ndevs = 2,
482         .devs = {
483                         {
484                                 .dev_data = "nct_ext_soc",
485                                 .get_temp = roth_fan_est_get_temp,
486                                 .coeffs = {
487                                         100, 0, 0, 0,
488                                         0, 0, 0, 0,
489                                         0, 0, 0, 0,
490                                         0, 0, 0, 0,
491                                         0, 0, 0, 0
492                                 },
493                         },
494                         {
495                                 .dev_data = "nct_int_soc",
496                                 .get_temp = roth_fan_est_get_temp,
497                                 .coeffs = {
498                                         0, 0, 0, 0,
499                                         0, 0, 0, 0,
500                                         0, 0, 0, 0,
501                                         0, 0, 0, 0,
502                                         0, 0, 0, 0
503                                 },
504                         },
505         },
506         .cdev_type = "pwm-fan",
507         .active_trip_temps = {0, 47000, 55000, 67000, 103000,
508                                 140000, 150000, 160000, 170000, 180000},
509         .active_hysteresis = {0, 12000, 7000, 10000, 0, 0, 0, 0, 0, 0},
510 };
511
512 static struct platform_device roth_fan_therm_est_device_p2560 = {
513         .name   = "therm-fan-est",
514         .id     = -1,
515         .num_resources  = 0,
516         .dev = {
517                 .platform_data = &fan_est_data_p2560,
518         },
519 };
520
521 static int __init roth_fan_est_init(void)
522 {
523         struct board_info board_info;
524
525         tegra_get_board_info(&board_info);
526         if (board_info.board_id == BOARD_P2560)
527                 platform_device_register(&roth_fan_therm_est_device_p2560);
528         else
529                 platform_device_register(&roth_fan_therm_est_device_p2454);
530
531         return 0;
532 }
533
534 int __init roth_sensors_init(void)
535 {
536         int err;
537
538         err = roth_nct1008_init();
539         if (err)
540                 return err;
541
542         mpuirq_init();
543
544         roth_fan_est_init();
545
546         return 0;
547 }