arm: tegra: Move all tj dependent thermals from nct to soc_therm
[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 board_info board_info;
53
54 static struct throttle_table tj_throttle_table[] = {
55                 /* CPU_THROT_LOW cannot be used by other than CPU */
56                 /* NO_CAP cannot be used by CPU */
57                 /*    CPU,   C2BUS,   C3BUS,    SCLK,     EMC */
58                 { { 1530000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
59                 { { 1428000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
60                 { { 1326000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
61                 { { 1224000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
62                 { { 1122000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
63                 { { 1020000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
64                 { {  918000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
65                 { {  816000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
66                 { {  714000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
67                 { {  612000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
68                 { {  612000,  564000,  564000,  NO_CAP,  NO_CAP } },
69                 { {  612000,  528000,  528000,  NO_CAP,  NO_CAP } },
70                 { {  612000,  492000,  492000,  NO_CAP,  NO_CAP } },
71                 { {  612000,  420000,  420000,  NO_CAP,  NO_CAP } },
72                 { {  612000,  408000,  408000,  NO_CAP,  NO_CAP } },
73                 { {  612000,  360000,  360000,  NO_CAP,  NO_CAP } },
74                 { {  612000,  360000,  360000,  312000,  NO_CAP } },
75                 { {  510000,  360000,  360000,  312000,  480000 } },
76                 { {  468000,  360000,  360000,  312000,  480000 } },
77                 { {  468000,  276000,  276000,  208000,  480000 } },
78                 { {  372000,  276000,  276000,  208000,  204000 } },
79                 { {  288000,  276000,  276000,  208000,  204000 } },
80                 { {  252000,  276000,  228000,  208000,  102000 } },
81                 { {  204000,  276000,  228000,  208000,  102000 } },
82                 { {  102000,  276000,  228000,  208000,  102000 } },
83           { { CPU_THROT_LOW,  276000,  228000,  208000,  102000 } },
84 };
85
86 static struct balanced_throttle tj_throttle = {
87         .throt_tab_size = ARRAY_SIZE(tj_throttle_table),
88         .throt_tab = tj_throttle_table,
89 };
90
91 static int __init roth_throttle_init(void)
92 {
93         if (machine_is_roth())
94                 balanced_throttle_register(&tj_throttle, "tegra-balanced");
95         return 0;
96 }
97 module_init(roth_throttle_init);
98
99 static struct nct1008_platform_data roth_nct1008_pdata = {
100         .supported_hwrev = true,
101         .ext_range = true,
102         .conv_rate = 0x08,
103         .offset = 0,
104         .shutdown_ext_limit = 85, /* C */
105         .shutdown_local_limit = 120, /* C */
106         .loc_name = "soc",
107
108         .passive_delay = 2000,
109
110         .num_trips = 1,
111         .trips = {
112                 /* Thermal Throttling */
113                 [0] = {
114                         .cdev_type = "tegra-balanced",
115                         .trip_temp = 75000,
116                         .trip_type = THERMAL_TRIP_PASSIVE,
117                         .upper = THERMAL_NO_LIMIT,
118                         .lower = THERMAL_NO_LIMIT,
119                         .hysteresis = 0,
120                 },
121         },
122 };
123
124 static struct nct1008_platform_data roth_nct1008_left_pdata = {
125         .supported_hwrev = true,
126         .ext_range = true,
127         .conv_rate = 0x08,
128         .offset = 0,
129         .loc_name = "left",
130         .shutdown_ext_limit = 90, /* C */
131         .shutdown_local_limit = 120, /* C */
132 };
133
134 static struct nct1008_platform_data roth_nct1008_right_pdata = {
135         .supported_hwrev = true,
136         .ext_range = true,
137         .conv_rate = 0x08,
138         .offset = 0,
139         .loc_name = "right",
140         .shutdown_ext_limit = 90, /* C */
141         .shutdown_local_limit = 120, /* C */
142 };
143
144 static struct i2c_board_info roth_i2c4_nct1008_board_info[] = {
145         {
146                 I2C_BOARD_INFO("nct1008", 0x4C),
147                 .platform_data = &roth_nct1008_pdata,
148                 .irq = -1,
149         }
150 };
151
152 static struct i2c_board_info roth_i2c4_nct1008_lr_board_info[] = {
153         {
154                 I2C_BOARD_INFO("nct1008", 0x4C),
155                 .platform_data = &roth_nct1008_left_pdata,
156                 .irq = -1,
157         },
158         {
159                 I2C_BOARD_INFO("nct1008", 0x4D),
160                 .platform_data = &roth_nct1008_right_pdata,
161                 .irq = -1,
162         }
163 };
164
165 #define VI_PINMUX(_pingroup, _mux, _pupd, _tri, _io, _lock, _ioreset) \
166         {                                                       \
167                 .pingroup       = TEGRA_PINGROUP_##_pingroup,   \
168                 .func           = TEGRA_MUX_##_mux,             \
169                 .pupd           = TEGRA_PUPD_##_pupd,           \
170                 .tristate       = TEGRA_TRI_##_tri,             \
171                 .io             = TEGRA_PIN_##_io,              \
172                 .lock           = TEGRA_PIN_LOCK_##_lock,       \
173                 .od             = TEGRA_PIN_OD_DEFAULT,         \
174                 .ioreset        = TEGRA_PIN_IO_RESET_##_ioreset \
175         }
176
177 /* MPU board file definition    */
178 static struct mpu_platform_data mpu6050_gyro_data = {
179         .int_config     = 0x10,
180         .level_shifter  = 0,
181         /* Located in board_[platformname].h */
182         .orientation    = MPU_GYRO_ORIENTATION,
183         .sec_slave_type = SECONDARY_SLAVE_TYPE_NONE,
184         .key            = {0x4E, 0xCC, 0x7E, 0xEB, 0xF6, 0x1E, 0x35, 0x22,
185                            0x00, 0x34, 0x0D, 0x65, 0x32, 0xE9, 0x94, 0x89},
186 };
187
188 static struct i2c_board_info __initdata inv_mpu6050_i2c2_board_info[] = {
189         {
190                 I2C_BOARD_INFO(MPU_GYRO_NAME, MPU_GYRO_ADDR),
191                 .platform_data = &mpu6050_gyro_data,
192         },
193 };
194
195 static void mpuirq_init(void)
196 {
197         int ret = 0;
198         unsigned gyro_irq_gpio = MPU_GYRO_IRQ_GPIO;
199         unsigned gyro_bus_num = MPU_GYRO_BUS_NUM;
200         char *gyro_name = MPU_GYRO_NAME;
201
202         pr_info("*** MPU START *** mpuirq_init...\n");
203
204         ret = gpio_request(gyro_irq_gpio, gyro_name);
205
206         if (ret < 0) {
207                 pr_err("%s: gpio_request failed %d\n", __func__, ret);
208                 return;
209         }
210
211         ret = gpio_direction_input(gyro_irq_gpio);
212         if (ret < 0) {
213                 pr_err("%s: gpio_direction_input failed %d\n", __func__, ret);
214                 gpio_free(gyro_irq_gpio);
215                 return;
216         }
217         pr_info("*** MPU END *** mpuirq_init...\n");
218
219         inv_mpu6050_i2c2_board_info[0].irq = gpio_to_irq(MPU_GYRO_IRQ_GPIO);
220         i2c_register_board_info(gyro_bus_num, inv_mpu6050_i2c2_board_info,
221                 ARRAY_SIZE(inv_mpu6050_i2c2_board_info));
222 }
223
224 static int roth_nct1008_init(void)
225 {
226         int nct1008_port = TEGRA_GPIO_PX6;
227         int ret = 0;
228
229         tegra_platform_edp_init(roth_nct1008_pdata.trips,
230                                 &roth_nct1008_pdata.num_trips);
231         tegra_add_cdev_trips(roth_nct1008_pdata.trips,
232                                 &roth_nct1008_pdata.num_trips);
233         tegra_add_tj_trips(roth_nct1008_pdata.trips,
234                                 &roth_nct1008_pdata.num_trips);
235
236         roth_i2c4_nct1008_board_info[0].irq = gpio_to_irq(nct1008_port);
237         pr_info("%s: roth nct1008 irq %d", __func__, \
238                                 roth_i2c4_nct1008_board_info[0].irq);
239
240         ret = gpio_request(nct1008_port, "temp_alert");
241         if (ret < 0)
242                 return ret;
243
244         ret = gpio_direction_input(nct1008_port);
245         if (ret < 0) {
246                 pr_info("%s: calling gpio_free(nct1008_port)", __func__);
247                 gpio_free(nct1008_port);
248         }
249
250         /* roth has thermal sensor on GEN1-I2C i.e. instance 0 */
251         i2c_register_board_info(0, roth_i2c4_nct1008_board_info,
252                 ARRAY_SIZE(roth_i2c4_nct1008_board_info));
253
254         i2c_register_board_info(1, roth_i2c4_nct1008_lr_board_info,
255                 ARRAY_SIZE(roth_i2c4_nct1008_lr_board_info));
256         return ret;
257 }
258
259 static struct i2c_board_info __initdata bq20z45_pdata[] = {
260         {
261                 I2C_BOARD_INFO("sbs-battery", 0x0B),
262         },
263 };
264
265 #ifdef CONFIG_TEGRA_SKIN_THROTTLE
266 static int tegra_skin_match(struct thermal_zone_device *thz, void *data)
267 {
268         return strcmp((char *)data, thz->type) == 0;
269 }
270
271 static int tegra_skin_get_temp(void *data, long *temp)
272 {
273         struct thermal_zone_device *thz;
274
275         thz = thermal_zone_device_find(data, tegra_skin_match);
276
277         if (!thz || thz->ops->get_temp(thz, temp))
278                 *temp = 25000;
279
280         return 0;
281 }
282
283 static struct therm_est_data skin_data = {
284         .cdev_type = "skin-balanced",
285         .toffset = 9793,
286         .polling_period = 1100,
287         .ndevs = 2,
288         .tc1 = 5,
289         .tc2 = 1,
290         .devs = {
291                         {
292                                 .dev_data = "nct_ext",
293                                 .get_temp = tegra_skin_get_temp,
294                                 .coeffs = {
295                                         2, 1, 1, 1,
296                                         1, 1, 1, 1,
297                                         1, 1, 1, 0,
298                                         1, 1, 0, 0,
299                                         0, 0, -1, -7
300                                 },
301                         },
302                         {
303                                 .dev_data = "nct_int",
304                                 .get_temp = tegra_skin_get_temp,
305                                 .coeffs = {
306                                         -11, -7, -5, -3,
307                                         -3, -2, -1, 0,
308                                         0, 0, 1, 1,
309                                         1, 2, 2, 3,
310                                         4, 6, 11, 18
311                                 },
312                         },
313         },
314         .trip_temp = 43000,
315         .passive_delay = 5000,
316 };
317
318 static struct throttle_table skin_throttle_table[] = {
319                 /* CPU_THROT_LOW cannot be used by other than CPU */
320                 /* NO_CAP cannot be used by CPU */
321                 /*    CPU,   C2BUS,   C3BUS,    SCLK,     EMC */
322                 { { 1530000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
323                 { { 1530000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
324                 { { 1326000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
325                 { { 1326000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
326                 { { 1326000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
327                 { { 1326000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
328                 { { 1326000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
329                 { { 1122000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
330                 { { 1122000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
331                 { { 1122000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
332                 { { 1122000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
333                 { { 1122000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
334                 { { 1122000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
335                 { { 1020000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
336                 { { 1020000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
337                 { { 1020000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
338                 { { 1020000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
339                 { { 1020000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
340                 { { 1020000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
341                 { {  918000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
342                 { {  918000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
343                 { {  918000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
344                 { {  918000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
345                 { {  918000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
346                 { {  918000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
347                 { {  816000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
348                 { {  816000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
349                 { {  816000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
350                 { {  816000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
351                 { {  816000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
352                 { {  816000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
353                 { {  714000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
354                 { {  714000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
355                 { {  714000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
356                 { {  714000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
357                 { {  714000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
358                 { {  714000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
359                 { {  612000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
360                 { {  612000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
361                 { {  612000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
362                 { {  612000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
363                 { {  612000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
364                 { {  612000,  NO_CAP,  NO_CAP,  NO_CAP,  NO_CAP } },
365                 { {  612000,  564000,  564000,  NO_CAP,  NO_CAP } },
366                 { {  612000,  564000,  564000,  NO_CAP,  NO_CAP } },
367                 { {  612000,  528000,  528000,  NO_CAP,  NO_CAP } },
368                 { {  612000,  528000,  528000,  NO_CAP,  NO_CAP } },
369                 { {  612000,  492000,  492000,  NO_CAP,  NO_CAP } },
370                 { {  612000,  492000,  492000,  NO_CAP,  NO_CAP } },
371                 { {  612000,  420000,  420000,  NO_CAP,  NO_CAP } },
372                 { {  612000,  420000,  420000,  NO_CAP,  NO_CAP } },
373                 { {  612000,  408000,  408000,  NO_CAP,  NO_CAP } },
374                 { {  612000,  408000,  408000,  NO_CAP,  NO_CAP } },
375                 { {  612000,  360000,  360000,  NO_CAP,  NO_CAP } },
376                 { {  612000,  360000,  360000,  NO_CAP,  NO_CAP } },
377                 { {  510000,  360000,  360000,  312000,  NO_CAP } },
378                 { {  510000,  360000,  360000,  312000,  NO_CAP } },
379                 { {  510000,  360000,  360000,  312000,  480000 } },
380                 { {  510000,  360000,  360000,  312000,  480000 } },
381                 { {  510000,  360000,  360000,  312000,  480000 } },
382                 { {  510000,  360000,  360000,  312000,  480000 } },
383                 { {  510000,  360000,  360000,  312000,  480000 } },
384                 { {  510000,  360000,  360000,  312000,  480000 } },
385                 { {  468000,  360000,  360000,  312000,  480000 } },
386                 { {  468000,  360000,  360000,  312000,  480000 } },
387                 { {  468000,  276000,  276000,  208000,  480000 } },
388                 { {  468000,  276000,  276000,  208000,  480000 } },
389                 { {  372000,  276000,  276000,  208000,  204000 } },
390                 { {  372000,  276000,  276000,  208000,  204000 } },
391                 { {  288000,  276000,  276000,  208000,  204000 } },
392                 { {  288000,  276000,  276000,  208000,  204000 } },
393                 { {  252000,  276000,  228000,  208000,  102000 } },
394                 { {  252000,  276000,  228000,  208000,  102000 } },
395                 { {  204000,  276000,  228000,  208000,  102000 } },
396                 { {  204000,  276000,  228000,  208000,  102000 } },
397                 { {  102000,  276000,  228000,  208000,  102000 } },
398           { { CPU_THROT_LOW,  276000,  228000,  208000,  102000 } },
399 };
400
401 static struct balanced_throttle skin_throttle = {
402         .throt_tab_size = ARRAY_SIZE(skin_throttle_table),
403         .throt_tab = skin_throttle_table,
404 };
405
406 static int __init roth_skin_init(void)
407 {
408         if (machine_is_roth()) {
409                 balanced_throttle_register(&skin_throttle, "skin-balanced");
410                 tegra_skin_therm_est_device.dev.platform_data = &skin_data;
411                 platform_device_register(&tegra_skin_therm_est_device);
412         }
413
414         return 0;
415 }
416 late_initcall(roth_skin_init);
417 #endif
418
419 static int roth_fan_est_match(struct thermal_zone_device *thz, void *data)
420 {
421         return (strcmp((char *)data, thz->type) == 0);
422 }
423
424 static int roth_fan_est_get_temp(void *data, long *temp)
425 {
426         struct thermal_zone_device *thz;
427
428         thz = thermal_zone_device_find(data, roth_fan_est_match);
429
430         if (!thz || thz->ops->get_temp(thz, temp))
431                 *temp = 25000;
432
433         return 0;
434 }
435
436 static struct therm_fan_est_data fan_est_data = {
437         .toffset = 0,
438         .polling_period = 1100,
439         .ndevs = 2,
440         .devs = {
441                         {
442                                 .dev_data = "nct_ext_soc",
443                                 .get_temp = roth_fan_est_get_temp,
444                                 .coeffs = {
445                                         100, 0, 0, 0,
446                                         0, 0, 0, 0,
447                                         0, 0, 0, 0,
448                                         0, 0, 0, 0,
449                                         0, 0, 0, 0
450                                 },
451                         },
452                         {
453                                 .dev_data = "nct_int_soc",
454                                 .get_temp = roth_fan_est_get_temp,
455                                 .coeffs = {
456                                         0, 0, 0, 0,
457                                         0, 0, 0, 0,
458                                         0, 0, 0, 0,
459                                         0, 0, 0, 0,
460                                         0, 0, 0, 0
461                                 },
462                         },
463         },
464         .active_trip_temps = {57000, 58000, 59000, 60000, 61000, 62000, 63000,
465                 64000, 65000, 68000},
466 };
467
468 static struct platform_device roth_fan_therm_est_device = {
469         .name   = "therm-fan-est",
470         .id     = -1,
471         .num_resources  = 0,
472         .dev = {
473                 .platform_data = &fan_est_data,
474         },
475 };
476
477 static int __init roth_fan_est_init(void)
478 {
479         platform_device_register(&roth_fan_therm_est_device);
480         return 0;
481 }
482 int __init roth_sensors_init(void)
483 {
484         int err;
485
486         tegra_get_board_info(&board_info);
487
488         err = roth_nct1008_init();
489         if (err)
490                 return err;
491
492         mpuirq_init();
493
494         roth_fan_est_init();
495
496         if (0)
497                 i2c_register_board_info(0, bq20z45_pdata,
498                         ARRAY_SIZE(bq20z45_pdata));
499
500         return 0;
501 }