ARM: tegra: loki: fix build error due to warning
[linux-3.10.git] / arch / arm / mach-tegra / board-loki-sensors.c
1 /*
2  * arch/arm/mach-tegra/board-loki-sensors.c
3  *
4  * Copyright (c) 2013, NVIDIA CORPORATION.  All rights reserved.
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms and conditions of the GNU General Public License,
8  * version 2, as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13  * more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  */
18
19 #include <linux/i2c.h>
20 #include <linux/gpio.h>
21 #include <linux/mpu.h>
22 #include <linux/delay.h>
23 #include <linux/err.h>
24 #include <linux/nct1008.h>
25 #include <media/mt9m114.h>
26 #include <mach/gpio-tegra.h>
27 #include <mach/edp.h>
28 #include <mach/tegra_fuse.h>
29 #include <linux/gpio.h>
30 #include <linux/therm_est.h>
31 #include <linux/iio/light/jsa1127.h>
32 #include <linux/platform_device.h>
33 #include <linux/regulator/consumer.h>
34
35 #include "board.h"
36 #include "board-common.h"
37 #include "board-loki.h"
38 #include "tegra-board-id.h"
39 #include "dvfs.h"
40 #include "cpu-tegra.h"
41
42 /* MPU board file definition    */
43 static struct mpu_platform_data mpu6050_gyro_data = {
44         .int_config     = 0x10,
45         .level_shifter  = 0,
46         /* Located in board_[platformname].h */
47         .orientation    = MPU_GYRO_ORIENTATION,
48         .sec_slave_type = SECONDARY_SLAVE_TYPE_NONE,
49         .key            = {0x4E, 0xCC, 0x7E, 0xEB, 0xF6, 0x1E, 0x35, 0x22,
50                         0x00, 0x34, 0x0D, 0x65, 0x32, 0xE9, 0x94, 0x89},
51 };
52
53
54 static struct i2c_board_info __initdata inv_mpu6050_i2c0_board_info[] = {
55         {
56                 I2C_BOARD_INFO(MPU_GYRO_NAME, MPU_GYRO_ADDR),
57                 .platform_data = &mpu6050_gyro_data,
58         },
59 };
60
61 static void mpuirq_init(void)
62 {
63         int ret = 0;
64         unsigned gyro_irq_gpio = MPU_GYRO_IRQ_GPIO;
65         unsigned gyro_bus_num = MPU_GYRO_BUS_NUM;
66         char *gyro_name = MPU_GYRO_NAME;
67
68         pr_info("*** MPU START *** mpuirq_init...\n");
69
70         ret = gpio_request(gyro_irq_gpio, gyro_name);
71
72         if (ret < 0) {
73                 pr_err("%s: gpio_request failed %d\n", __func__, ret);
74                 return;
75         }
76
77         ret = gpio_direction_input(gyro_irq_gpio);
78         if (ret < 0) {
79                 pr_err("%s: gpio_direction_input failed %d\n", __func__, ret);
80                 gpio_free(gyro_irq_gpio);
81                 return;
82         }
83         pr_info("*** MPU END *** mpuirq_init...\n");
84
85         inv_mpu6050_i2c0_board_info[0].irq = gpio_to_irq(MPU_GYRO_IRQ_GPIO);
86         i2c_register_board_info(gyro_bus_num, inv_mpu6050_i2c0_board_info,
87                 ARRAY_SIZE(inv_mpu6050_i2c0_board_info));
88 }
89
90 struct jsa1127_platform_data jsa1127_platform_data = {
91         .rint = 100,
92         .integration_time = 200,
93         .use_internal_integration_timing = 1,
94 };
95
96 static struct i2c_board_info loki_i2c_jsa1127_board_info[] = {
97         {
98                 I2C_BOARD_INFO(JSA1127_NAME, JSA1127_SLAVE_ADDRESS),
99                 .platform_data = &jsa1127_platform_data,
100         }
101 };
102
103 static void loki_jsa1127_init(void)
104 {
105         i2c_register_board_info(0, loki_i2c_jsa1127_board_info,
106                 ARRAY_SIZE(loki_i2c_jsa1127_board_info));
107 }
108
109 static int loki_mt9m114_power_on(struct mt9m114_power_rail *pw)
110 {
111         int err;
112         if (unlikely(!pw || !pw->avdd || !pw->iovdd))
113                 return -EFAULT;
114
115         gpio_set_value(CAM_RSTN, 0);
116         gpio_set_value(CAM2_PWDN, 1);
117         usleep_range(1000, 1020);
118
119         err = regulator_enable(pw->iovdd);
120         if (unlikely(err))
121                 goto mt9m114_iovdd_fail;
122
123         err = regulator_enable(pw->avdd);
124         if (unlikely(err))
125                 goto mt9m114_avdd_fail;
126
127         usleep_range(1000, 1020);
128         gpio_set_value(CAM_RSTN, 1);
129         gpio_set_value(CAM2_PWDN, 0);
130         usleep_range(1000, 1020);
131
132         /* return 1 to skip the in-driver power_on swquence */
133         return 1;
134
135 mt9m114_avdd_fail:
136         regulator_disable(pw->iovdd);
137
138 mt9m114_iovdd_fail:
139         gpio_set_value(CAM_RSTN, 0);
140         return -ENODEV;
141 }
142
143 static int loki_mt9m114_power_off(struct mt9m114_power_rail *pw)
144 {
145         if (unlikely(!pw || !pw->avdd || !pw->iovdd))
146                 return -EFAULT;
147
148         usleep_range(100, 120);
149         gpio_set_value(CAM_RSTN, 0);
150         usleep_range(100, 120);
151         regulator_disable(pw->avdd);
152         usleep_range(100, 120);
153         regulator_disable(pw->iovdd);
154
155         return 1;
156 }
157
158 struct mt9m114_platform_data loki_mt9m114_pdata = {
159         .power_on = loki_mt9m114_power_on,
160         .power_off = loki_mt9m114_power_off,
161 };
162
163 static struct i2c_board_info loki_i2c_board_info_e2548[] = {
164         {
165                 I2C_BOARD_INFO("mt9m114", 0x48),
166                 .platform_data = &loki_mt9m114_pdata,
167         },
168 };
169
170 static int loki_camera_init(void)
171 {
172         pr_debug("%s: ++\n", __func__);
173
174         i2c_register_board_info(2, loki_i2c_board_info_e2548,
175                         ARRAY_SIZE(loki_i2c_board_info_e2548));
176         return 0;
177 }
178
179 static struct throttle_table tj_throttle_table[] = {
180         /* CPU_THROT_LOW cannot be used by other than CPU */
181         /*      CPU,  C2BUS,  C3BUS,   SCLK,    EMC   */
182         { { 1810500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
183         { { 1785000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
184         { { 1759500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
185         { { 1734000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
186         { { 1708500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
187         { { 1683000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
188         { { 1657500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
189         { { 1632000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
190         { { 1606500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
191         { { 1581000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
192         { { 1555500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
193         { { 1530000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
194         { { 1504500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
195         { { 1479000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
196         { { 1453500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
197         { { 1428000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
198         { { 1402500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
199         { { 1377000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
200         { { 1351500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
201         { { 1326000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
202         { { 1300500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
203         { { 1275000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
204         { { 1249500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
205         { { 1224000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
206         { { 1198500, NO_CAP, NO_CAP, NO_CAP, NO_CAP } },
207         { { 1173000, 636000, NO_CAP, NO_CAP, NO_CAP } },
208         { { 1147500, 636000, NO_CAP, NO_CAP, NO_CAP } },
209         { { 1122000, 636000, NO_CAP, NO_CAP, NO_CAP } },
210         { { 1096500, 636000, NO_CAP, NO_CAP, NO_CAP } },
211         { { 1071000, 636000, NO_CAP, NO_CAP, NO_CAP } },
212         { { 1045500, 636000, NO_CAP, NO_CAP, NO_CAP } },
213         { { 1020000, 636000, NO_CAP, NO_CAP, NO_CAP } },
214         { {  994500, 636000, NO_CAP, NO_CAP, NO_CAP } },
215         { {  969000, 600000, NO_CAP, NO_CAP, NO_CAP } },
216         { {  943500, 600000, NO_CAP, NO_CAP, NO_CAP } },
217         { {  918000, 600000, NO_CAP, NO_CAP, NO_CAP } },
218         { {  892500, 600000, NO_CAP, NO_CAP, NO_CAP } },
219         { {  867000, 600000, NO_CAP, NO_CAP, NO_CAP } },
220         { {  841500, 564000, NO_CAP, NO_CAP, NO_CAP } },
221         { {  816000, 564000, NO_CAP, NO_CAP, 792000 } },
222         { {  790500, 564000, NO_CAP, 372000, 792000 } },
223         { {  765000, 564000, 468000, 372000, 792000 } },
224         { {  739500, 528000, 468000, 372000, 792000 } },
225         { {  714000, 528000, 468000, 336000, 792000 } },
226         { {  688500, 528000, 420000, 336000, 792000 } },
227         { {  663000, 492000, 420000, 336000, 792000 } },
228         { {  637500, 492000, 420000, 336000, 408000 } },
229         { {  612000, 492000, 420000, 300000, 408000 } },
230         { {  586500, 492000, 360000, 336000, 408000 } },
231         { {  561000, 420000, 420000, 300000, 408000 } },
232         { {  535500, 420000, 360000, 228000, 408000 } },
233         { {  510000, 420000, 288000, 228000, 408000 } },
234         { {  484500, 324000, 288000, 228000, 408000 } },
235         { {  459000, 324000, 288000, 228000, 408000 } },
236         { {  433500, 324000, 288000, 228000, 408000 } },
237         { {  408000, 324000, 288000, 228000, 408000 } },
238 };
239
240 static struct balanced_throttle tj_throttle = {
241         .throt_tab_size = ARRAY_SIZE(tj_throttle_table),
242         .throt_tab = tj_throttle_table,
243 };
244
245 static int __init loki_throttle_init(void)
246 {
247         if (of_machine_is_compatible("nvidia,loki"))
248                 balanced_throttle_register(&tj_throttle, "tegra-balanced");
249         return 0;
250 }
251 module_init(loki_throttle_init);
252
253 static struct nct1008_platform_data loki_nct72_pdata = {
254         .supported_hwrev = true,
255         .ext_range = true,
256         .conv_rate = 0x06, /* 4Hz conversion rate */
257         .offset = 0,
258         .shutdown_ext_limit = 95, /* C */
259         .shutdown_local_limit = 120, /* C */
260
261         .passive_delay = 2000,
262
263         .num_trips = 3,
264         .trips = {
265                 /* Thermal Throttling */
266                 [0] = {
267                         .cdev_type = "tegra-balanced",
268                         .trip_temp = 83000,
269                         .trip_type = THERMAL_TRIP_PASSIVE,
270                         .upper = THERMAL_NO_LIMIT,
271                         .lower = THERMAL_NO_LIMIT,
272                         .hysteresis = 1000,
273                 },
274                 [1] = {
275                         .cdev_type = "tegra-hard",
276                         .trip_temp = 86000, /* shutdown_ext_limit - 2C */
277                         .trip_type = THERMAL_TRIP_PASSIVE,
278                         .upper = 1,
279                         .lower = 1,
280                         .hysteresis = 6000,
281                 },
282                 [2] = {
283                         .cdev_type = "suspend_soctherm",
284                         .trip_temp = 50000,
285                         .trip_type = THERMAL_TRIP_ACTIVE,
286                         .upper = 1,
287                         .lower = 1,
288                         .hysteresis = 5000,
289                 },
290         },
291 };
292
293 static struct i2c_board_info loki_i2c_nct72_board_info[] = {
294         {
295                 I2C_BOARD_INFO("nct72", 0x4c),
296                 .platform_data = &loki_nct72_pdata,
297                 .irq = -1,
298         }
299 };
300
301 static int loki_nct72_init(void)
302 {
303         int nct72_port = TEGRA_GPIO_PI6;
304         int ret = 0;
305         int i;
306         struct thermal_trip_info *trip_state;
307
308         /* Raise NCT's thresholds if soctherm CP,FT fuses are ok */
309         if (!tegra_fuse_calib_base_get_cp(NULL, NULL) &&
310             !tegra_fuse_calib_base_get_ft(NULL, NULL)) {
311                 /* Raise NCT's shutdown point by 20C */
312                 loki_nct72_pdata.shutdown_ext_limit += 20;
313                 /* Remove tegra-balanced cooling device from NCT pdata */
314                 for (i = 0; i < loki_nct72_pdata.num_trips; i++) {
315                         trip_state = &loki_nct72_pdata.trips[i];
316                         if (!strncmp(trip_state->cdev_type, "tegra-balanced",
317                                         THERMAL_NAME_LENGTH)) {
318                                 trip_state->cdev_type = "_none_";
319                                 break;
320                         }
321                 }
322         } else {
323                 tegra_platform_edp_init(loki_nct72_pdata.trips,
324                                         &loki_nct72_pdata.num_trips,
325                                         12000); /* edp temperature margin */
326         }
327
328
329         tegra_add_cdev_trips(loki_nct72_pdata.trips,
330                                 &loki_nct72_pdata.num_trips);
331         tegra_add_tj_trips(loki_nct72_pdata.trips,
332                                 &loki_nct72_pdata.num_trips);
333         loki_i2c_nct72_board_info[0].irq = gpio_to_irq(nct72_port);
334
335         ret = gpio_request(nct72_port, "temp_alert");
336         if (ret < 0)
337                 return ret;
338
339         ret = gpio_direction_input(nct72_port);
340         if (ret < 0) {
341                 pr_info("%s: calling gpio_free(nct72_port)", __func__);
342                 gpio_free(nct72_port);
343         }
344
345         /* loki has thermal sensor on GEN2-I2C i.e. instance 1 */
346         i2c_register_board_info(0, loki_i2c_nct72_board_info,
347                 ARRAY_SIZE(loki_i2c_nct72_board_info));
348
349         return ret;
350 }
351
352 static int loki_fan_est_match(struct thermal_zone_device *thz, void *data)
353 {
354         return (strcmp((char *)data, thz->type) == 0);
355 }
356
357 static int loki_fan_est_get_temp(void *data, long *temp)
358 {
359         struct thermal_zone_device *thz;
360
361         thz = thermal_zone_device_find(data, loki_fan_est_match);
362
363         if (!thz || thz->ops->get_temp(thz, temp))
364                 *temp = 25000;
365
366         return 0;
367 }
368
369 /*Fan thermal estimator data for P2548*/
370 static struct therm_fan_est_data fan_est_data_p2548 = {
371         .toffset = 0,
372         .polling_period = 1100,
373         .ndevs = 2,
374         .devs = {
375                         {
376                                 .dev_data = "Tdiode_soc",
377                                 .get_temp = loki_fan_est_get_temp,
378                                 .coeffs = {
379                                         100, 0, 0, 0,
380                                         0, 0, 0, 0,
381                                         0, 0, 0, 0,
382                                         0, 0, 0, 0,
383                                         0, 0, 0, 0
384                                 },
385                         },
386                         {
387                                 .dev_data = "Tboard_soc",
388                                 .get_temp = loki_fan_est_get_temp,
389                                 .coeffs = {
390                                         0, 0, 0, 0,
391                                         0, 0, 0, 0,
392                                         0, 0, 0, 0,
393                                         0, 0, 0, 0,
394                                         0, 0, 0, 0
395                                 },
396                         },
397         },
398         .cdev_type = "pwm-fan",
399         .active_trip_temps = {0, 47000, 55000, 67000, 103000,
400                                 140000, 150000, 160000, 170000, 180000},
401         .active_hysteresis = {0, 12000, 7000, 10000, 0, 0, 0, 0, 0, 0},
402 };
403
404 static struct platform_device loki_fan_therm_est_device_p2548 = {
405         .name   = "therm-fan-est",
406         .id     = -1,
407         .num_resources  = 0,
408         .dev = {
409                 .platform_data = &fan_est_data_p2548,
410         },
411 };
412
413 static int __init loki_fan_est_init(void)
414 {
415         struct board_info board_info;
416
417         tegra_get_board_info(&board_info);
418         platform_device_register(&loki_fan_therm_est_device_p2548);
419
420         return 0;
421 }
422 int __init loki_sensors_init(void)
423 {
424         mpuirq_init();
425         loki_camera_init();
426         loki_nct72_init();
427         loki_jsa1127_init();
428         loki_fan_est_init();
429
430         return 0;
431 }