blob: fc638f0c7388606dd55b9a5f27646bc1141fdf84 [file] [log] [blame]
Flemmardfb6d1e42013-05-23 15:18:38 -07001/******************** (C) COPYRIGHT 2011 STMicroelectronics ********************
2*
3* File Name : r3gd20_gyr_sysfs.c
4* Authors : MH - C&I BU - Application Team
5* : Carmine Iascone (carmine.iascone@st.com)
6* : Matteo Dameno (matteo.dameno@st.com)
7* : Both authors are willing to be considered the contact
8* : and update points for the driver.
9* Version : V 1.1.5 sysfs
10* Date : 2011/Sep/24
11* Description : R3GD20 digital output gyroscope sensor API
12*
13********************************************************************************
14*
15* This program is free software; you can redistribute it and/or modify
16* it under the terms of the GNU General Public License version 2 as
17* published by the Free Software Foundation.
18*
19* THE PRESENT SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES
20* OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, FOR THE SOLE
21* PURPOSE TO SUPPORT YOUR APPLICATION DEVELOPMENT.
22* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
23* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
24* CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
25* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
26*
27********************************************************************************
28* REVISON HISTORY
29*
30* VERSION | DATE | AUTHORS | DESCRIPTION
31* 1.0 | 2010/May/02 | Carmine Iascone | First Release
32* 1.1.3 | 2011/Jun/24 | Matteo Dameno | Corrects ODR Bug
33* 1.1.4 | 2011/Sep/02 | Matteo Dameno | SMB Bus Mng,
34* | | | forces BDU setting
35* 1.1.5 | 2011/Sep/24 | Matteo Dameno | Introduces FIFO Feat.
36* 1.1.5.1 | 2011/Nov/6 | Morris Chen | change name from l3g to r3g
37* | change default FS to 2000DPS
38* | change default poll_rate to 50ms
39* | chage the attribute of sysfs file as 666
40*******************************************************************************/
41
42#include <linux/i2c.h>
43#include <linux/mutex.h>
44#include <linux/input-polldev.h>
45#include <linux/interrupt.h>
46#include <linux/gpio.h>
47#include <linux/slab.h>
48
49#include <linux/r3gd20.h>
50#include <linux/delay.h>
51#include <linux/export.h>
52#include <linux/module.h>
53
54#define D(x...) printk(KERN_DEBUG "[GYRO][R3GD20] " x)
55#define I(x...) printk(KERN_INFO "[GYRO][R3GD20] " x)
56#define E(x...) printk(KERN_ERR "[GYRO][R3GD20 ERROR] " x)
57#define DIF(x...) \
58 if (debug_flag) \
59 printk(KERN_DEBUG "[GYRO][R3GD20 DEBUG] " x)
60
61#define FS_MAX 32768
62
63#define WHO_AM_I 0x0F
64
65#define CTRL_REG1 0x20
66#define CTRL_REG2 0x21
67#define CTRL_REG3 0x22
68#define CTRL_REG4 0x23
69#define CTRL_REG5 0x24
70#define REFERENCE 0x25
71#define FIFO_CTRL_REG 0x2E
72#define FIFO_SRC_REG 0x2F
73#define OUT_X_L 0x28
74
75#define AXISDATA_REG OUT_X_L
76
77#define ALL_ZEROES 0x00
78#define PM_OFF 0x00
79#define PM_NORMAL 0x08
80#define ENABLE_ALL_AXES 0x07
81#define ENABLE_NO_AXES 0x00
82#define BW00 0x00
83#define BW01 0x10
84#define BW10 0x20
85#define BW11 0x30
86#define ODR095 0x00
87#define ODR190 0x40
88#define ODR380 0x80
89#define ODR760 0xC0
90
91#define I2_DRDY 0x08
92#define I2_WTM 0x04
93#define I2_OVRUN 0x02
94#define I2_EMPTY 0x01
95#define I2_NONE 0x00
96#define I2_MASK 0x0F
97
98#define FS_MASK 0x30
99#define BDU_ENABLE 0x80
100
101#define FIFO_ENABLE 0x40
102#define HPF_ENALBE 0x11
103
104#define FIFO_MODE_MASK 0xE0
105#define FIFO_MODE_BYPASS 0x00
106#define FIFO_MODE_FIFO 0x20
107#define FIFO_MODE_STREAM 0x40
108#define FIFO_MODE_STR2FIFO 0x60
109#define FIFO_MODE_BYPASS2STR 0x80
110#define FIFO_WATERMARK_MASK 0x1F
111
112#define FIFO_STORED_DATA_MASK 0x1F
113
114
115#define FUZZ 0
116#define FLAT 0
117#define I2C_AUTO_INCREMENT 0x80
118
119#define RES_CTRL_REG1 0
120#define RES_CTRL_REG2 1
121#define RES_CTRL_REG3 2
122#define RES_CTRL_REG4 3
123#define RES_CTRL_REG5 4
124#define RES_FIFO_CTRL_REG 5
125#define RESUME_ENTRIES 6
126
127#define TOLERENCE 1071
128
129#define DEBUG 0
130
131#define HTC_WQ 1
132#define HTC_SUSPEND 1
133#define HTC_ATTR 1
134
135#define HW_WAKE_UP_TIME 160
136
137#define WHOAMI_R3GD20 0x00D4
138
139
140struct r3gd20_triple {
141 short x,
142 y,
143 z;
144};
145
146struct output_rate {
147 int poll_rate_ms;
148 u8 mask;
149};
150
151static const struct output_rate odr_table[] = {
152
153 { 2, ODR760|BW10},
154 { 3, ODR380|BW01},
155 { 6, ODR190|BW00},
156 { 11, ODR095|BW00},
157};
158
159static int use_smbus;
160
161static const struct r3gd20_gyr_platform_data default_r3gd20_gyr_pdata = {
162 .fs_range = R3GD20_GYR_FS_2000DPS,
163 .axis_map_x = 0,
164 .axis_map_y = 1,
165 .axis_map_z = 2,
166 .negate_x = 0,
167 .negate_y = 0,
168 .negate_z = 0,
169
170 .poll_interval = 50,
171 .min_interval = R3GD20_MIN_POLL_PERIOD_MS,
172
173
174
175
176 .watermark = 0,
177 .fifomode = 0,
178};
179
180#ifdef HTC_WQ
181static void polling_do_work(struct work_struct *w);
182static DECLARE_DELAYED_WORK(polling_work, polling_do_work);
183#endif
184
185struct r3gd20_data {
186 struct i2c_client *client;
187 struct r3gd20_gyr_platform_data *pdata;
188
189 struct mutex lock;
190
191 struct input_polled_dev *input_poll_dev;
192 int hw_initialized;
193
194 atomic_t enabled;
195
196 u8 reg_addr;
197 u8 resume_state[RESUME_ENTRIES];
198
199 int irq2;
200 struct work_struct irq2_work;
201 struct workqueue_struct *irq2_work_queue;
202
203 bool polling_enabled;
204#ifdef HTC_WQ
205 struct workqueue_struct *gyro_wq;
206 struct input_dev *gyro_input_dev;
207#endif
208
209#ifdef HTC_ATTR
210 struct class *htc_gyro_class;
211 struct device *gyro_dev;
212#endif
213 int cali_data_x;
214 int cali_data_y;
215 int cali_data_z;
216};
217
218#ifdef HTC_WQ
219struct r3gd20_data *g_gyro;
220#endif
221
222static int debug_flag;
223
224static int r3gd20_i2c_read(struct r3gd20_data *gyr,
225 u8 *buf, int len)
226{
227 int ret;
228 u8 reg = buf[0];
229 u8 cmd = reg;
230
231
232 if (use_smbus) {
233 if (len == 1) {
234 ret = i2c_smbus_read_byte_data(gyr->client, cmd);
235 buf[0] = ret & 0xff;
236#if DEBUG
237 dev_warn(&gyr->client->dev,
238 "i2c_smbus_read_byte_data: ret=0x%02x, len:%d ,"
239 "command=0x%02x, buf[0]=0x%02x\n",
240 ret, len, cmd , buf[0]);
241#endif
242 } else if (len > 1) {
243
244 ret = i2c_smbus_read_i2c_block_data(gyr->client,
245 cmd, len, buf);
246#if DEBUG
247 dev_warn(&gyr->client->dev,
248 "i2c_smbus_read_i2c_block_data: ret:%d len:%d, "
249 "command=0x%02x, ",
250 ret, len, cmd);
251
252 unsigned int ii;
253 for (ii = 0; ii < len; ii++)
254 D("buf[%d]=0x%02x,", ii, buf[ii]);
255
256 D("\n");
257#endif
258 } else
259 ret = -1;
260
261 if (ret < 0) {
262 dev_err(&gyr->client->dev,
263 "read transfer error: len:%d, command=0x%02x\n",
264 len, cmd);
265 return 0;
266 }
267 return len;
268 }
269
270
271 ret = i2c_master_send(gyr->client, &cmd, sizeof(cmd));
272 if (ret != sizeof(cmd))
273 return ret;
274
275 return i2c_master_recv(gyr->client, buf, len);
276}
277
278static int r3gd20_i2c_write(struct r3gd20_data *gyr, u8 *buf, int len)
279{
280 int ret;
281 u8 reg, value;
282
283 reg = buf[0];
284 value = buf[1];
285
286 if (use_smbus) {
287 if (len == 1) {
288 ret = i2c_smbus_write_byte_data(gyr->client, reg, value);
289#if DEBUG
290 dev_warn(&gyr->client->dev,
291 "i2c_smbus_write_byte_data: ret=%d, len:%d, "
292 "command=0x%02x, value=0x%02x\n",
293 ret, len, reg , value);
294#endif
295 return ret;
296 } else if (len > 1) {
297 ret = i2c_smbus_write_i2c_block_data(gyr->client,
298 reg, len, buf + 1);
299#if DEBUG
300 dev_warn(&gyr->client->dev,
301 "i2c_smbus_write_i2c_block_data: ret=%d, "
302 "len:%d, command=0x%02x, ",
303 ret, len, reg);
304 unsigned int ii;
305 for (ii = 0; ii < (len + 1); ii++)
306 D("value[%d]=0x%02x,", ii, buf[ii]);
307
308 D("\n");
309#endif
310 return ret;
311 }
312 }
313
314 ret = i2c_master_send(gyr->client, buf, len+1);
315 return (ret == len+1) ? 0 : ret;
316}
317
318
319static int r3gd20_register_write(struct r3gd20_data *gyro, u8 *buf,
320 u8 reg_address, u8 new_value)
321{
322 int err;
323
324 buf[0] = reg_address;
325 buf[1] = new_value;
326 err = r3gd20_i2c_write(gyro, buf, 1);
327 if (err < 0)
328 return err;
329
330 return err;
331}
332
333static int r3gd20_register_read(struct r3gd20_data *gyro, u8 *buf,
334 u8 reg_address)
335{
336
337 int err = -1;
338 buf[0] = (reg_address);
339 err = r3gd20_i2c_read(gyro, buf, 1);
340 return err;
341}
342
343static int r3gd20_register_update(struct r3gd20_data *gyro, u8 *buf,
344 u8 reg_address, u8 mask, u8 new_bit_values)
345{
346 int err = -1;
347 u8 init_val;
348 u8 updated_val;
349 err = r3gd20_register_read(gyro, buf, reg_address);
350 if (!(err < 0)) {
351 init_val = buf[0];
352 updated_val = ((mask & new_bit_values) | ((~mask) & init_val));
353 err = r3gd20_register_write(gyro, buf, reg_address,
354 updated_val);
355 }
356 return err;
357}
358
359#if 1
360static int r3gd20_update_watermark(struct r3gd20_data *gyro,
361 u8 watermark)
362{
363 int res = 0;
364 u8 buf[2];
365 u8 new_value;
366
367 mutex_lock(&gyro->lock);
368 new_value = (watermark % 0x20);
369 res = r3gd20_register_update(gyro, buf, FIFO_CTRL_REG,
370 FIFO_WATERMARK_MASK, new_value);
371 if (res < 0) {
372 E("%s : failed to update watermark\n", __func__);
373 return res;
374 }
375 E("%s : new_value:0x%02x,watermark:0x%02x\n",
376 __func__, new_value, watermark);
377
378 gyro->resume_state[RES_FIFO_CTRL_REG] =
379 ((FIFO_WATERMARK_MASK & new_value) |
380 (~FIFO_WATERMARK_MASK &
381 gyro->resume_state[RES_FIFO_CTRL_REG]));
382 gyro->pdata->watermark = new_value;
383 mutex_unlock(&gyro->lock);
384 return res;
385}
386
387static int r3gd20_update_fifomode(struct r3gd20_data *gyro, u8 fifomode)
388{
389 int res;
390 u8 buf[2];
391 u8 new_value;
392
393 new_value = fifomode;
394 res = r3gd20_register_update(gyro, buf, FIFO_CTRL_REG,
395 FIFO_MODE_MASK, new_value);
396 if (res < 0) {
397 E("%s : failed to update fifoMode\n", __func__);
398 return res;
399 }
400 gyro->resume_state[RES_FIFO_CTRL_REG] =
401 ((FIFO_MODE_MASK & new_value) |
402 (~FIFO_MODE_MASK &
403 gyro->resume_state[RES_FIFO_CTRL_REG]));
404 gyro->pdata->fifomode = new_value;
405
406 return res;
407}
408
409static int r3gd20_fifo_reset(struct r3gd20_data *gyro)
410{
411 u8 oldmode;
412 int res;
413
414 oldmode = gyro->pdata->fifomode;
415 res = r3gd20_update_fifomode(gyro, FIFO_MODE_BYPASS);
416 if (res < 0)
417 return res;
418 res = r3gd20_update_fifomode(gyro, oldmode);
419 if (res >= 0)
420 I("%s : fifo reset to: 0x%02x\n", __func__, oldmode);
421 return res;
422}
423
424static int r3gd20_fifo_hwenable(struct r3gd20_data *gyro,
425 u8 enable)
426{
427 int res;
428 u8 buf[2];
429 u8 set = 0x00;
430 if (enable)
431 set = FIFO_ENABLE;
432 res = r3gd20_register_update(gyro, buf, CTRL_REG5,
433 FIFO_ENABLE, set);
434 if (res < 0) {
435 E("%s : fifo_hw switch to:0x%02x failed\n", __func__, set);
436 return res;
437 }
438 gyro->resume_state[RES_CTRL_REG5] =
439 ((FIFO_ENABLE & set) |
440 (~FIFO_ENABLE & gyro->resume_state[RES_CTRL_REG5]));
441 I("%s : fifo_hw_enable set to:0x%02x\n", __func__, set);
442 return res;
443}
444
445static int r3gd20_manage_int2settings(struct r3gd20_data *gyro,
446 u8 fifomode)
447{
448 int res;
449 u8 buf[2];
450 bool enable_fifo_hw;
451 bool recognized_mode = false;
452 u8 int2bits = I2_NONE;
453
454
455 switch (fifomode) {
456 case FIFO_MODE_FIFO:
457
458 recognized_mode = true;
459 int2bits = (I2_WTM | I2_OVRUN);
460 res = r3gd20_register_update(gyro, buf, CTRL_REG3,
461 I2_MASK, int2bits);
462 if (res < 0) {
463 E("%s : failed to update CTRL_REG3:0x%02x\n",
464 __func__, fifomode);
465 goto err_mutex_unlock;
466 }
467 gyro->resume_state[RES_CTRL_REG3] =
468 ((I2_MASK & int2bits) |
469 (~(I2_MASK) & gyro->resume_state[RES_CTRL_REG3]));
470 enable_fifo_hw = true;
471 break;
472
473 case FIFO_MODE_BYPASS:
474 recognized_mode = true;
475
476 if (gyro->polling_enabled)
477 int2bits = I2_NONE;
478 else
479 int2bits = I2_DRDY;
480 res = r3gd20_register_update(gyro, buf, CTRL_REG3,
481 I2_MASK, int2bits);
482 if (res < 0) {
483 E("%s : failed to update to CTRL_REG3:0x%02x\n",
484 __func__, fifomode);
485 goto err_mutex_unlock;
486 }
487 gyro->resume_state[RES_CTRL_REG3] =
488 ((I2_MASK & int2bits) |
489 (~I2_MASK & gyro->resume_state[RES_CTRL_REG3]));
490 enable_fifo_hw = false;
491 break;
492 default:
493 recognized_mode = false;
494 res = r3gd20_register_update(gyro, buf, CTRL_REG3,
495 I2_MASK, I2_NONE);
496 if (res < 0) {
497 E("%s : failed to update CTRL_REG3:0x%02x\n",
498 __func__, fifomode);
499 goto err_mutex_unlock;
500 }
501 enable_fifo_hw = false;
502 gyro->resume_state[RES_CTRL_REG3] =
503 ((I2_MASK & 0x00) |
504 (~I2_MASK & gyro->resume_state[RES_CTRL_REG3]));
505 break;
506
507 }
508 if (recognized_mode) {
509 res = r3gd20_update_fifomode(gyro, fifomode);
510 if (res < 0) {
511 E("%s : failed to set fifoMode\n", __func__);
512 goto err_mutex_unlock;
513 }
514 }
515 res = r3gd20_fifo_hwenable(gyro, enable_fifo_hw);
516
517err_mutex_unlock:
518
519 return res;
520}
521
522#endif
523static int r3gd20_update_fs_range(struct r3gd20_data *gyro,
524 u8 new_fs)
525{
526 int res ;
527 u8 buf[2];
528
529 buf[0] = CTRL_REG4;
530
531 res = r3gd20_register_update(gyro, buf, CTRL_REG4,
532 FS_MASK, new_fs);
533
534 if (res < 0) {
535 E("%s : failed to update fs:0x%02x\n",
536 __func__, new_fs);
537 return res;
538 }
539 gyro->resume_state[RES_CTRL_REG4] =
540 ((FS_MASK & new_fs) |
541 (~FS_MASK & gyro->resume_state[RES_CTRL_REG4]));
542
543 return res;
544}
545
546
547static int r3gd20_update_odr(struct r3gd20_data *gyro,
548 unsigned int poll_interval_ms)
549{
550 int err = -1;
551 int i;
552 u8 config[2];
553
554 for (i = ARRAY_SIZE(odr_table) - 1; i >= 0; i--) {
555 if ((odr_table[i].poll_rate_ms <= poll_interval_ms) || (i == 0))
556 break;
557 }
558
559 config[1] = odr_table[i].mask;
560 config[1] |= (ENABLE_ALL_AXES + PM_NORMAL);
561
562 if (atomic_read(&gyro->enabled)) {
563 config[0] = CTRL_REG1;
564 err = r3gd20_i2c_write(gyro, config, 1);
565 if (err < 0)
566 return err;
567 gyro->resume_state[RES_CTRL_REG1] = config[1];
568 }
569
570
571 return err;
572}
573
574static int r3gd20_get_data(struct r3gd20_data *gyro,
575 struct r3gd20_triple *data)
576{
577 int err;
578 unsigned char gyro_out[6];
579
580 s16 hw_d[3] = { 0 };
581
582 gyro_out[0] = (I2C_AUTO_INCREMENT | AXISDATA_REG);
583
584 err = r3gd20_i2c_read(gyro, gyro_out, 6);
585
586 if (err < 0)
587 return err;
588
589 hw_d[0] = (s16) (((gyro_out[1]) << 8) | gyro_out[0]);
590 hw_d[1] = (s16) (((gyro_out[3]) << 8) | gyro_out[2]);
591 hw_d[2] = (s16) (((gyro_out[5]) << 8) | gyro_out[4]);
592
593 data->x = ((gyro->pdata->negate_x) ? (-hw_d[gyro->pdata->axis_map_x])
594 : (hw_d[gyro->pdata->axis_map_x]));
595 data->y = ((gyro->pdata->negate_y) ? (-hw_d[gyro->pdata->axis_map_y])
596 : (hw_d[gyro->pdata->axis_map_y]));
597 data->z = ((gyro->pdata->negate_z) ? (-hw_d[gyro->pdata->axis_map_z])
598 : (hw_d[gyro->pdata->axis_map_z]));
599
600 DIF("gyro_out: x = %d, y = %d, z = %d\n",
601 data->x, data->y, data->z);
602
603 return err;
604}
605
606static void r3gd20_report_values(struct r3gd20_data *gyr,
607 struct r3gd20_triple *data)
608{
609 struct input_dev *input = gyr->input_poll_dev->input;
610
611#ifdef HTC_WQ
612 input = g_gyro->gyro_input_dev;
613#endif
614
615 input_report_abs(input, ABS_X, data->x);
616 input_report_abs(input, ABS_Y, data->y);
617 input_report_abs(input, ABS_Z, data->z);
618 input_sync(input);
619}
620
621#ifdef HTC_WQ
622static void polling_do_work(struct work_struct *w)
623{
624 struct r3gd20_data *gyro = g_gyro;
625 struct r3gd20_triple data_out;
626 int err;
627
628 mutex_lock(&gyro->lock);
629 err = r3gd20_get_data(gyro, &data_out);
630 if (err < 0)
631 dev_err(&gyro->client->dev, "get_gyroscope_data failed\n");
632 else
633 r3gd20_report_values(gyro, &data_out);
634
635 mutex_unlock(&gyro->lock);
636
637 DIF("interval = %d\n", gyro->input_poll_dev->
638 poll_interval);
639
640 queue_delayed_work(gyro->gyro_wq, &polling_work,
641 msecs_to_jiffies(gyro->input_poll_dev->
642 poll_interval));
643}
644#endif
645
646static int r3gd20_hw_init(struct r3gd20_data *gyro)
647{
648 int err;
649 u8 buf[6];
650
651 I("%s hw init\n", R3GD20_GYR_DEV_NAME);
652
653 buf[0] = (I2C_AUTO_INCREMENT | CTRL_REG1);
654 buf[1] = gyro->resume_state[RES_CTRL_REG1];
655 buf[2] = gyro->resume_state[RES_CTRL_REG2];
656 buf[3] = gyro->resume_state[RES_CTRL_REG3];
657 buf[4] = gyro->resume_state[RES_CTRL_REG4];
658 buf[5] = gyro->resume_state[RES_CTRL_REG5];
659
660 err = r3gd20_i2c_write(gyro, buf, 5);
661 if (err < 0)
662 return err;
663
664 buf[0] = FIFO_CTRL_REG;
665 buf[1] = gyro->resume_state[RES_FIFO_CTRL_REG];
666 err = r3gd20_i2c_write(gyro, buf, 1);
667 if (err < 0)
668 return err;
669
670 gyro->hw_initialized = 1;
671
672 return err;
673}
674
675static void r3gd20_device_power_off(struct r3gd20_data *dev_data)
676{
677 int err;
678 u8 buf[2];
679
680 I("%s:\n", __func__);
681
682 buf[0] = CTRL_REG1;
683 buf[1] = PM_OFF;
684 err = r3gd20_i2c_write(dev_data, buf, 1);
685 if (err < 0)
686 dev_err(&dev_data->client->dev, "soft power off failed\n");
687
688 if (dev_data->pdata->power_off) {
689
690 disable_irq_nosync(dev_data->irq2);
691 dev_data->pdata->power_off();
692 dev_data->hw_initialized = 0;
693 }
694
695 if (dev_data->hw_initialized) {
696
697
698 if (dev_data->pdata->gpio_int2 > 0) {
699 disable_irq_nosync(dev_data->irq2);
700 I("%s: power off: irq2 disabled\n",
701 R3GD20_GYR_DEV_NAME);
702 }
703 dev_data->hw_initialized = 0;
704 }
705}
706
707static int r3gd20_device_power_on(struct r3gd20_data *dev_data)
708{
709 int err;
710
711 if (dev_data->pdata->power_on) {
712 err = dev_data->pdata->power_on();
713 if (err < 0)
714 return err;
715 if (dev_data->pdata->gpio_int2 > 0)
716 enable_irq(dev_data->irq2);
717 }
718
719
720 if (!dev_data->hw_initialized) {
721 err = r3gd20_hw_init(dev_data);
722 if (err < 0) {
723 r3gd20_device_power_off(dev_data);
724 return err;
725 }
726 }
727
728 if (dev_data->hw_initialized) {
729 D("dev_data->pdata->gpio_int2 = %d\n", dev_data->pdata->gpio_int2);
730 if (dev_data->pdata->gpio_int2 > 0) {
731 enable_irq(dev_data->irq2);
732 I("%s: power on: irq2 enabled\n",
733 R3GD20_GYR_DEV_NAME);
734 }
735 }
736
737 return 0;
738}
739
740static int r3gd20_enable(struct r3gd20_data *dev_data)
741{
742 int err;
743
744 D("%s: enabled = %d\n", __func__, atomic_read(&dev_data->enabled));
745
746 if (!atomic_cmpxchg(&dev_data->enabled, 0, 1)) {
747 if (dev_data->pdata->power_LPM)
748 dev_data->pdata->power_LPM(0);
749
750 err = r3gd20_device_power_on(dev_data);
751 if (err < 0) {
752 atomic_set(&dev_data->enabled, 0);
753 return err;
754 }
755#ifdef HTC_WQ
756 D("Manually queue work!! HW_WAKE_UP_TIME = %d\n",
757 HW_WAKE_UP_TIME);
758 queue_delayed_work(dev_data->gyro_wq, &polling_work,
759 msecs_to_jiffies(HW_WAKE_UP_TIME));
760#else
761 D("%s: queue work: interval = %d\n",
762 __func__, dev_data->input_poll_dev->poll_interval);
763 schedule_delayed_work(&dev_data->input_poll_dev->work,
764 msecs_to_jiffies(dev_data->input_poll_dev->poll_interval));
765#endif
766 }
767
768 return 0;
769}
770
771static int r3gd20_disable(struct r3gd20_data *dev_data)
772{
773 DIF("%s: dev_data->enabled = %d\n", __func__,
774 atomic_read(&dev_data->enabled));
775
776 if (atomic_cmpxchg(&dev_data->enabled, 1, 0))
777 r3gd20_device_power_off(dev_data);
778
779 I("%s: polling disabled\n", __func__);
780 DIF("%s: dev_data->enabled = %d\n", __func__,
781 atomic_read(&dev_data->enabled));
782
783 if (dev_data->pdata->power_LPM)
784 dev_data->pdata->power_LPM(1);
785
786#ifdef HTC_WQ
787 cancel_delayed_work_sync(&polling_work);
788#else
789 cancel_delayed_work_sync(&dev_data->input_poll_dev->work);
790#endif
791
792 return 0;
793}
794
795static ssize_t attr_polling_rate_show(struct device *dev,
796 struct device_attribute *attr,
797 char *buf)
798{
799 int val;
800
801 struct r3gd20_data *gyro = g_gyro;
802
803 mutex_lock(&gyro->lock);
804 val = gyro->input_poll_dev->poll_interval;
805 mutex_unlock(&gyro->lock);
806 return sprintf(buf, "%d\n", val);
807}
808
809static ssize_t attr_polling_rate_store(struct device *dev,
810 struct device_attribute *attr,
811 const char *buf, size_t size)
812{
813
814 struct r3gd20_data *gyro = g_gyro;
815 unsigned long interval_ms;
816
817 if (strict_strtoul(buf, 10, &interval_ms))
818 return -EINVAL;
819 if (!interval_ms)
820 return -EINVAL;
821 interval_ms = max((unsigned int)interval_ms, gyro->pdata->min_interval);
822 mutex_lock(&gyro->lock);
823 gyro->input_poll_dev->poll_interval = interval_ms;
824 gyro->pdata->poll_interval = interval_ms;
825 D("r3gd20: %s: gyro->input_poll_dev->poll_interval = %d\n", __func__, gyro->input_poll_dev->poll_interval);
826 r3gd20_update_odr(gyro, interval_ms);
827 mutex_unlock(&gyro->lock);
828 return size;
829}
830
831static ssize_t attr_range_show(struct device *dev,
832 struct device_attribute *attr, char *buf)
833{
834
835 struct r3gd20_data *gyro = g_gyro;
836 int range = 0;
837 u8 val;
838 mutex_lock(&gyro->lock);
839 val = gyro->pdata->fs_range;
840
841 switch (val) {
842 case R3GD20_GYR_FS_250DPS:
843 range = 250;
844 break;
845 case R3GD20_GYR_FS_500DPS:
846 range = 500;
847 break;
848 case R3GD20_GYR_FS_2000DPS:
849 range = 2000;
850 break;
851 }
852 mutex_unlock(&gyro->lock);
853
854 return sprintf(buf, "%d\n", range);
855}
856
857static ssize_t attr_range_store(struct device *dev,
858 struct device_attribute *attr,
859 const char *buf, size_t size)
860{
861
862 struct r3gd20_data *gyro = g_gyro;
863 unsigned long val;
864 if (strict_strtoul(buf, 10, &val))
865 return -EINVAL;
866 mutex_lock(&gyro->lock);
867 gyro->pdata->fs_range = val;
868 r3gd20_update_fs_range(gyro, val);
869 mutex_unlock(&gyro->lock);
870 return size;
871}
872
873static ssize_t attr_enable_show(struct device *dev,
874 struct device_attribute *attr, char *buf)
875{
876
877 struct r3gd20_data *gyro = g_gyro;
878 int val = atomic_read(&gyro->enabled);
879
880 return sprintf(buf, "%d\n", val);
881}
882
883static ssize_t attr_enable_store(struct device *dev,
884 struct device_attribute *attr,
885 const char *buf, size_t size)
886{
887
888 struct r3gd20_data *gyro = g_gyro;
889 unsigned long val;
890
891 DIF("%s: buf = %s", __func__, buf);
892
893 if (strict_strtoul(buf, 10, &val))
894 return -EINVAL;
895
896 if (val)
897 r3gd20_enable(gyro);
898 else
899 r3gd20_disable(gyro);
900
901 return size;
902}
903
904static ssize_t attr_polling_mode_show(struct device *dev,
905 struct device_attribute *attr, char *buf)
906{
907 int val = 0;
908
909 struct r3gd20_data *gyro = g_gyro;
910
911 mutex_lock(&gyro->lock);
912 if (gyro->polling_enabled)
913 val = 1;
914 mutex_unlock(&gyro->lock);
915 return sprintf(buf, "%d\n", val);
916}
917
918static ssize_t attr_polling_mode_store(struct device *dev,
919 struct device_attribute *attr,
920 const char *buf, size_t size)
921{
922
923 struct r3gd20_data *gyro = g_gyro;
924 unsigned long val;
925
926 if (strict_strtoul(buf, 10, &val))
927 return -EINVAL;
928
929 mutex_lock(&gyro->lock);
930 if (val) {
931 gyro->polling_enabled = true;
932 r3gd20_manage_int2settings(gyro, FIFO_MODE_BYPASS);
933 if (gyro->polling_enabled) {
934 D("polling enabled\n");
935#ifdef HTC_WQ
936 queue_delayed_work(gyro->gyro_wq, &polling_work,
937 msecs_to_jiffies(gyro->input_poll_dev->
938 poll_interval));
939#else
940 schedule_delayed_work(&gyro->input_poll_dev->work,
941 msecs_to_jiffies(gyro->
942 pdata->poll_interval));
943#endif
944 }
945 } else {
946 if (gyro->polling_enabled) {
947 D("polling disabled\n");
948#ifdef HTC_WQ
949 cancel_delayed_work_sync(&polling_work);
950#else
951 cancel_delayed_work_sync(&gyro->input_poll_dev->work);
952#endif
953 }
954 gyro->polling_enabled = false;
955 r3gd20_manage_int2settings(gyro, gyro->pdata->fifomode);
956 }
957 mutex_unlock(&gyro->lock);
958 return size;
959}
960
961static ssize_t attr_watermark_store(struct device *dev,
962 struct device_attribute *attr,
963 const char *buf, size_t size)
964{
965
966 struct r3gd20_data *gyro = g_gyro;
967 unsigned long watermark;
968 int res;
969
970 if (strict_strtoul(buf, 16, &watermark))
971 return -EINVAL;
972
973 res = r3gd20_update_watermark(gyro, watermark);
974 if (res < 0)
975 return res;
976
977 return size;
978}
979
980static ssize_t attr_watermark_show(struct device *dev,
981 struct device_attribute *attr, char *buf)
982{
983
984 struct r3gd20_data *gyro = g_gyro;
985 int val = gyro->pdata->watermark;
986 return sprintf(buf, "0x%02x\n", val);
987}
988
989static ssize_t attr_fifomode_store(struct device *dev,
990 struct device_attribute *attr,
991 const char *buf, size_t size)
992{
993
994 struct r3gd20_data *gyro = g_gyro;
995 unsigned long fifomode;
996 int res;
997
998 if (strict_strtoul(buf, 16, &fifomode))
999 return -EINVAL;
1000
1001 D("%s, got value:0x%02x\n", __func__, (u8)fifomode);
1002
1003 mutex_lock(&gyro->lock);
1004 res = r3gd20_manage_int2settings(gyro, (u8) fifomode);
1005 mutex_unlock(&gyro->lock);
1006
1007 if (res < 0)
1008 return res;
1009 return size;
1010}
1011
1012static ssize_t attr_fifomode_show(struct device *dev,
1013 struct device_attribute *attr, char *buf)
1014{
1015
1016 struct r3gd20_data *gyro = g_gyro;
1017 u8 val = gyro->pdata->fifomode;
1018 return sprintf(buf, "0x%02x\n", val);
1019}
1020
1021#ifdef DEBUG
1022static ssize_t attr_reg_set(struct device *dev, struct device_attribute *attr,
1023 const char *buf, size_t size)
1024{
1025 int rc;
1026
1027 struct r3gd20_data *gyro = g_gyro;
1028 u8 x[2];
1029 unsigned long val;
1030
1031 if (strict_strtoul(buf, 16, &val))
1032 return -EINVAL;
1033 mutex_lock(&gyro->lock);
1034 x[0] = gyro->reg_addr;
1035 mutex_unlock(&gyro->lock);
1036 x[1] = val;
1037 rc = r3gd20_i2c_write(gyro, x, 1);
1038 return size;
1039}
1040
1041static ssize_t attr_reg_get(struct device *dev, struct device_attribute *attr,
1042 char *buf)
1043{
1044 ssize_t ret;
1045
1046 struct r3gd20_data *gyro = g_gyro;
1047 int rc;
1048 u8 data;
1049
1050 mutex_lock(&gyro->lock);
1051 data = gyro->reg_addr;
1052 mutex_unlock(&gyro->lock);
1053 rc = r3gd20_i2c_read(gyro, &data, 1);
1054 ret = sprintf(buf, "0x%02x\n", data);
1055 return ret;
1056}
1057
1058static ssize_t attr_addr_set(struct device *dev, struct device_attribute *attr,
1059 const char *buf, size_t size)
1060{
1061
1062 struct r3gd20_data *gyro = g_gyro;
1063 unsigned long val;
1064
1065 if (strict_strtoul(buf, 16, &val))
1066 return -EINVAL;
1067
1068 mutex_lock(&gyro->lock);
1069
1070 gyro->reg_addr = val;
1071
1072 mutex_unlock(&gyro->lock);
1073
1074 return size;
1075}
1076#endif
1077
1078static ssize_t attr_debug_show(struct device *dev,
1079 struct device_attribute *attr, char *buf)
1080{
1081 char *s = buf;
1082
1083 s += sprintf(s, "debug_flag = %d\n", debug_flag);
1084
1085 return s - buf;
1086}
1087
1088static ssize_t attr_debug_store(struct device *dev,
1089 struct device_attribute *attr,
1090 const char *buf, size_t count)
1091{
1092 debug_flag = -1;
1093 sscanf(buf, "%d", &debug_flag);
1094
1095 D("%s: debug_flag = %d\n", __func__, debug_flag);
1096
1097 return count;
1098}
1099
1100static ssize_t attr_cali_data_show(struct device *dev,
1101 struct device_attribute *attr, char *buf)
1102{
1103 char *s = buf;
1104 struct r3gd20_data *gyro = g_gyro;
1105
1106 s += sprintf(s, "Stored calibration data (x, y, z) = (%d, %d, %d)\n",
1107 gyro->cali_data_x, gyro->cali_data_y,
1108 gyro->cali_data_z);
1109
1110 D("%s: Calibration data (x, y, z) = (%d, %d, %d)\n",
1111 __func__, gyro->cali_data_x, gyro->cali_data_y,
1112 gyro->cali_data_z);
1113 return s - buf;
1114}
1115
1116static int is_valid_cali(int cali_data)
1117{
1118 if ((cali_data < TOLERENCE) && (cali_data > -TOLERENCE))
1119 return 1;
1120 else
1121 return 0;
1122}
1123
1124static ssize_t attr_cali_data_store(struct device *dev,
1125 struct device_attribute *attr,
1126 const char *buf, size_t count)
1127{
1128 struct r3gd20_data *gyro = g_gyro;
1129
1130 D("%s: \n", __func__);
1131
1132 if(sscanf(buf, "%d %d %d", &(gyro->cali_data_x), &(gyro->cali_data_y),
1133 &(gyro->cali_data_z)) != 3) {
1134 E("%s: input format error!\n", __func__);
1135 return count;
1136 }
1137
1138 if (!is_valid_cali(gyro->cali_data_x) ||
1139 !is_valid_cali(gyro->cali_data_y) ||
1140 !is_valid_cali(gyro->cali_data_z)) {
1141 E("%s: Invalid calibration data (x, y, z) = (%d, %d, %d)",
1142 __func__, gyro->cali_data_x, gyro->cali_data_y,
1143 gyro->cali_data_z);
1144 return count;
1145 }
1146
1147 D("%s: Stored calibration data (x, y, z) = (%d, %d, %d)\n",
1148 __func__, gyro->cali_data_x, gyro->cali_data_y,
1149 gyro->cali_data_z);
1150
1151 return count;
1152}
1153
1154static struct device_attribute attributes[] = {
1155 __ATTR(pollrate_ms, 0664, attr_polling_rate_show,
1156 attr_polling_rate_store),
1157 __ATTR(range, 0664, attr_range_show, attr_range_store),
1158 __ATTR(enable_device, 0664, attr_enable_show, attr_enable_store),
1159 __ATTR(enable_polling, 0664, attr_polling_mode_show, attr_polling_mode_store),
1160 __ATTR(fifo_samples, 0664, attr_watermark_show, attr_watermark_store),
1161 __ATTR(fifo_mode, 0664, attr_fifomode_show, attr_fifomode_store),
1162 __ATTR(cali_data, 0664, attr_cali_data_show, attr_cali_data_store),
1163#ifdef DEBUG
1164 __ATTR(reg_value, 0664, attr_reg_get, attr_reg_set),
1165 __ATTR(reg_addr, 0664, NULL, attr_addr_set),
1166 __ATTR(debug, 0664, attr_debug_show, attr_debug_store),
1167#endif
1168};
1169
1170static int create_sysfs_interfaces(struct device *dev)
1171{
1172 int i;
1173
1174#ifdef HTC_ATTR
1175 struct r3gd20_data *gyro = g_gyro;
1176 int ret = 0;
1177
1178 if (gyro == NULL) {
1179 E("%s: g_gyro == NULL!!\n", __func__);
1180 return -2;
1181 }
1182
1183 gyro->htc_gyro_class = class_create(THIS_MODULE, "htc_gyro");
1184 if (IS_ERR(gyro->htc_gyro_class)) {
1185 ret = PTR_ERR(gyro->htc_gyro_class);
1186 gyro->htc_gyro_class = NULL;
1187 E("%s: could not allocate gyro->htc_gyro_class\n", __func__);
1188 goto err_create_class;
1189 }
1190
1191 gyro->gyro_dev = device_create(gyro->htc_gyro_class,
1192 NULL, 0, "%s", "gyro");
1193 if (unlikely(IS_ERR(gyro->gyro_dev))) {
1194 ret = PTR_ERR(gyro->gyro_dev);
1195 gyro->gyro_dev = NULL;
1196 E("%s: could not allocate gyro->gyro_dev\n", __func__);
1197 goto err_create_gyro_device;
1198 }
1199
1200 for (i = 0; i < ARRAY_SIZE(attributes); i++)
1201 if (device_create_file(gyro->gyro_dev, attributes + i)) {
1202 E("%s: could not allocate attribute files\n",
1203 __func__);
1204 goto err_create_device_file;
1205 }
1206 return 0;
1207
1208err_create_device_file:
1209 device_unregister(gyro->gyro_dev);
1210err_create_gyro_device:
1211 class_destroy(gyro->htc_gyro_class);
1212err_create_class:
1213 return ret;
1214
1215#else
1216
1217 for (i = 0; i < ARRAY_SIZE(attributes); i++)
1218 if (device_create_file(dev, attributes + i))
1219 goto error;
1220 return 0;
1221
1222error:
1223 for ( ; i >= 0; i--)
1224 device_remove_file(dev, attributes + i);
1225 dev_err(dev, "%s:Unable to create interface\n", __func__);
1226 return -1;
1227
1228#endif
1229
1230}
1231
1232static int remove_sysfs_interfaces(struct device *dev)
1233{
1234 int i;
1235 for (i = 0; i < ARRAY_SIZE(attributes); i++)
1236 device_remove_file(dev, attributes + i);
1237 return 0;
1238}
1239
1240static void report_triple(struct r3gd20_data *gyro)
1241{
1242 int err;
1243 struct r3gd20_triple data_out;
1244
1245 err = r3gd20_get_data(gyro, &data_out);
1246 if (err < 0)
1247 dev_err(&gyro->client->dev, "get_gyroscope_data failed\n");
1248 else
1249 r3gd20_report_values(gyro, &data_out);
1250}
1251
1252static void r3gd20_input_poll_func(struct input_polled_dev *dev)
1253{
1254 struct r3gd20_data *gyro = dev->private;
1255
1256 struct r3gd20_triple data_out;
1257
1258 int err;
1259
1260 DIF("%s: gyro->enabled = %d\n",
1261 __func__, atomic_read(&gyro->enabled));
1262 if (atomic_read(&gyro->enabled) == 0)
1263 return;
1264
1265
1266
1267
1268 mutex_lock(&gyro->lock);
1269 err = r3gd20_get_data(gyro, &data_out);
1270 if (err < 0)
1271 dev_err(&gyro->client->dev, "get_gyroscope_data failed\n");
1272 else
1273 r3gd20_report_values(gyro, &data_out);
1274
1275 mutex_unlock(&gyro->lock);
1276
1277}
1278
1279static void r3gd20_irq2_fifo(struct r3gd20_data *gyro)
1280{
1281 int err;
1282 u8 buf[2];
1283 u8 int_source;
1284 u8 samples;
1285 u8 workingmode;
1286 u8 stored_samples;
1287
1288 mutex_lock(&gyro->lock);
1289
1290 workingmode = gyro->pdata->fifomode;
1291
1292
1293
1294
1295
1296 switch (workingmode) {
1297 case FIFO_MODE_BYPASS:
1298 {
1299 report_triple(gyro);
1300 break;
1301 }
1302 case FIFO_MODE_FIFO:
1303 samples = (gyro->pdata->watermark)+1;
1304
1305 err = r3gd20_register_read(gyro, buf, FIFO_SRC_REG);
1306 if (err > 0)
1307 dev_err(&gyro->client->dev, "error reading fifo source reg\n");
1308
1309 int_source = buf[0];
1310
1311
1312 stored_samples = int_source & FIFO_STORED_DATA_MASK;
1313
1314
1315 for (; samples > 0; samples--) {
1316#if DEBUG
1317 input_report_abs(gyro->input_poll_dev->input, ABS_MISC, 1);
1318 input_sync(gyro->input_poll_dev->input);
1319#endif
1320
1321 report_triple(gyro);
1322
1323#if DEBUG
1324 input_report_abs(gyro->input_poll_dev->input, ABS_MISC, 0);
1325 input_sync(gyro->input_poll_dev->input);
1326#endif
1327 }
1328 r3gd20_fifo_reset(gyro);
1329 break;
1330 }
1331#if DEBUG
1332 input_report_abs(gyro->input_poll_dev->input, ABS_MISC, 3);
1333 input_sync(gyro->input_poll_dev->input);
1334#endif
1335
1336 mutex_unlock(&gyro->lock);
1337}
1338
1339static irqreturn_t r3gd20_isr2(int irq, void *dev)
1340{
1341 struct r3gd20_data *gyro = dev;
1342
1343 disable_irq_nosync(irq);
1344#if DEBUG
1345 input_report_abs(gyro->input_poll_dev->input, ABS_MISC, 2);
1346 input_sync(gyro->input_poll_dev->input);
1347#endif
1348 queue_work(gyro->irq2_work_queue, &gyro->irq2_work);
1349 I("%s: isr2 queued\n", R3GD20_GYR_DEV_NAME);
1350
1351 return IRQ_HANDLED;
1352}
1353
1354static void r3gd20_irq2_work_func(struct work_struct *work)
1355{
1356
1357 struct r3gd20_data *gyro =
1358 container_of(work, struct r3gd20_data, irq2_work);
1359 r3gd20_irq2_fifo(gyro);
1360
1361 I("%s: IRQ2 served\n", R3GD20_GYR_DEV_NAME);
1362 enable_irq(gyro->irq2);
1363}
1364
1365
1366int r3gd20_input_open(struct input_dev *input)
1367{
1368 struct r3gd20_data *gyro = input_get_drvdata(input);
1369
1370 DIF("%s:\n", __func__);
1371
1372
1373 return 0;
1374
1375 return r3gd20_enable(gyro);
1376}
1377
1378void r3gd20_input_close(struct input_dev *dev)
1379{
1380 struct r3gd20_data *gyro = input_get_drvdata(dev);
1381
1382 r3gd20_disable(gyro);
1383}
1384
1385static int r3gd20_validate_pdata(struct r3gd20_data *gyro)
1386{
1387
1388 gyro->pdata->min_interval =
1389 max((unsigned int) R3GD20_MIN_POLL_PERIOD_MS,
1390 gyro->pdata->min_interval);
1391
1392 gyro->pdata->poll_interval = max(gyro->pdata->poll_interval,
1393 gyro->pdata->min_interval);
1394
1395 if (gyro->pdata->axis_map_x > 2 ||
1396 gyro->pdata->axis_map_y > 2 ||
1397 gyro->pdata->axis_map_z > 2) {
1398 dev_err(&gyro->client->dev,
1399 "invalid axis_map value x:%u y:%u z%u\n",
1400 gyro->pdata->axis_map_x,
1401 gyro->pdata->axis_map_y,
1402 gyro->pdata->axis_map_z);
1403 return -EINVAL;
1404 }
1405
1406
1407 if (gyro->pdata->negate_x > 1 ||
1408 gyro->pdata->negate_y > 1 ||
1409 gyro->pdata->negate_z > 1) {
1410 dev_err(&gyro->client->dev,
1411 "invalid negate value x:%u y:%u z:%u\n",
1412 gyro->pdata->negate_x,
1413 gyro->pdata->negate_y,
1414 gyro->pdata->negate_z);
1415 return -EINVAL;
1416 }
1417
1418
1419 if (gyro->pdata->poll_interval < gyro->pdata->min_interval) {
1420 dev_err(&gyro->client->dev,
1421 "minimum poll interval violated\n");
1422 return -EINVAL;
1423 }
1424 return 0;
1425}
1426
1427static int r3gd20_input_init(struct r3gd20_data *gyro)
1428{
1429 int err = -1;
1430 struct input_dev *input;
1431
1432
1433
1434 gyro->input_poll_dev = input_allocate_polled_device();
1435 if (!gyro->input_poll_dev) {
1436 err = -ENOMEM;
1437 dev_err(&gyro->client->dev,
1438 "input device allocation failed\n");
1439 goto err0;
1440 }
1441
1442 gyro->input_poll_dev->private = gyro;
1443 gyro->input_poll_dev->poll = r3gd20_input_poll_func;
1444 gyro->input_poll_dev->poll_interval = gyro->pdata->poll_interval;
1445
1446#ifdef HTC_WQ
1447 input = input_allocate_device();
1448 if (!input) {
1449 E("%s: could not allocate ls input device\n", __func__);
1450 return -ENOMEM;
1451 }
1452 gyro->gyro_input_dev = input;
1453#else
1454 input = gyro->input_poll_dev->input;
1455#endif
1456
1457 input->open = r3gd20_input_open;
1458 input->close = r3gd20_input_close;
1459
1460 input->id.bustype = BUS_I2C;
1461 input->dev.parent = &gyro->client->dev;
1462
1463#ifdef HTC_WQ
1464 input_set_drvdata(input, gyro);
1465#else
1466 input_set_drvdata(gyro->input_poll_dev->input, gyro);
1467#endif
1468
1469 set_bit(EV_ABS, input->evbit);
1470
1471#if DEBUG
1472 set_bit(EV_KEY, input->keybit);
1473 set_bit(KEY_LEFT, input->keybit);
1474 input_set_abs_params(input, ABS_MISC, 0, 1, 0, 0);
1475#endif
1476
1477 input_set_abs_params(input, ABS_X, -FS_MAX, FS_MAX, FUZZ, FLAT);
1478 input_set_abs_params(input, ABS_Y, -FS_MAX, FS_MAX, FUZZ, FLAT);
1479 input_set_abs_params(input, ABS_Z, -FS_MAX, FS_MAX, FUZZ, FLAT);
1480
1481 input->name = R3GD20_GYR_DEV_NAME;
1482
1483#ifdef HTC_WQ
1484 err = input_register_device(input);
1485#else
1486 err = input_register_polled_device(gyro->input_poll_dev);
1487#endif
1488 if (err) {
1489 dev_err(&gyro->client->dev,
1490 "unable to register input polled device %s\n",
1491 gyro->input_poll_dev->input->name);
1492 goto err1;
1493 }
1494
1495 return 0;
1496
1497err1:
1498 input_free_polled_device(gyro->input_poll_dev);
1499err0:
1500 return err;
1501}
1502
1503static void r3gd20_input_cleanup(struct r3gd20_data *gyro)
1504{
1505 input_unregister_polled_device(gyro->input_poll_dev);
1506 input_free_polled_device(gyro->input_poll_dev);
1507}
1508
1509static int to_signed_int(char *value)
1510{
1511 int ret_int = 0;
1512
1513 if (value == NULL)
1514 ret_int = 0;
1515 else {
1516 ret_int = value[0] | (value[1] << 8) |
1517 (value[2] << 16) |
1518 (value[3] << 24);
1519 }
1520
1521 return ret_int;
1522}
1523
1524static int r3gd20_probe(struct i2c_client *client,
1525 const struct i2c_device_id *devid)
1526{
1527 struct r3gd20_data *gyro;
1528
1529 u32 smbus_func = I2C_FUNC_SMBUS_BYTE_DATA |
1530 I2C_FUNC_SMBUS_WORD_DATA | I2C_FUNC_SMBUS_I2C_BLOCK ;
1531
1532 int err = -1;
1533
1534 I("%s: probe start v03.\n", R3GD20_GYR_DEV_NAME);
1535
1536
1537 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
1538 dev_warn(&client->dev, "client not i2c capable\n");
1539 if (i2c_check_functionality(client->adapter, smbus_func)) {
1540 use_smbus = 1;
1541 dev_warn(&client->dev, "client using SMBUS\n");
1542 } else {
1543 err = -ENODEV;
1544 dev_err(&client->dev, "client nor SMBUS capable\n");
1545 goto err0;
1546 }
1547 }
1548
1549
1550
1551 gyro = kzalloc(sizeof(*gyro), GFP_KERNEL);
1552 if (gyro == NULL) {
1553 dev_err(&client->dev,
1554 "failed to allocate memory for module data\n");
1555 err = -ENOMEM;
1556 goto err0;
1557 }
1558
1559 g_gyro = gyro;
1560
1561 mutex_init(&gyro->lock);
1562 mutex_lock(&gyro->lock);
1563 gyro->client = client;
1564
1565 gyro->pdata = kmalloc(sizeof(*gyro->pdata), GFP_KERNEL);
1566 if (gyro->pdata == NULL) {
1567 dev_err(&client->dev,
1568 "failed to allocate memory for pdata: %d\n", err);
1569 goto err1;
1570 }
1571
1572 if (client->dev.platform_data == NULL) {
1573 memcpy(gyro->pdata, &default_r3gd20_gyr_pdata,
1574 sizeof(*gyro->pdata));
1575 } else {
1576 memcpy(gyro->pdata, client->dev.platform_data,
1577 sizeof(*gyro->pdata));
1578 }
1579
1580 err = r3gd20_validate_pdata(gyro);
1581 if (err < 0) {
1582 dev_err(&client->dev, "failed to validate platform data\n");
1583 goto err1_1;
1584 }
1585
1586 i2c_set_clientdata(client, gyro);
1587
1588 if (gyro->pdata->init) {
1589 err = gyro->pdata->init();
1590 if (err < 0) {
1591 dev_err(&client->dev, "init failed: %d\n", err);
1592 goto err1_1;
1593 }
1594 }
1595
1596
1597 memset(gyro->resume_state, 0, ARRAY_SIZE(gyro->resume_state));
1598
1599 gyro->resume_state[RES_CTRL_REG1] = ALL_ZEROES | ENABLE_ALL_AXES;
1600 gyro->resume_state[RES_CTRL_REG2] = ALL_ZEROES;
1601 gyro->resume_state[RES_CTRL_REG3] = ALL_ZEROES;
1602 gyro->resume_state[RES_CTRL_REG4] = ALL_ZEROES | BDU_ENABLE;
1603 gyro->resume_state[RES_CTRL_REG5] = ALL_ZEROES;
1604 gyro->resume_state[RES_FIFO_CTRL_REG] = ALL_ZEROES;
1605
1606 gyro->polling_enabled = true;
1607
1608 err = r3gd20_device_power_on(gyro);
1609 if (err < 0) {
1610 dev_err(&client->dev, "power on failed: %d\n", err);
1611 goto err2;
1612 }
1613
1614 atomic_set(&gyro->enabled, 1);
1615
1616 err = r3gd20_update_fs_range(gyro, gyro->pdata->fs_range);
1617 if (err < 0) {
1618 dev_err(&client->dev, "update_fs_range failed\n");
1619 goto err2;
1620 }
1621
1622 err = r3gd20_update_odr(gyro, gyro->pdata->poll_interval);
1623 if (err < 0) {
1624 dev_err(&client->dev, "update_odr failed\n");
1625 goto err2;
1626 }
1627
1628 err = r3gd20_input_init(gyro);
1629 if (err < 0)
1630 goto err3;
1631
1632 err = create_sysfs_interfaces(&client->dev);
1633 if (err < 0) {
1634 dev_err(&client->dev,
1635 "%s device register failed\n", R3GD20_GYR_DEV_NAME);
1636 goto err4;
1637 }
1638
1639 r3gd20_device_power_off(gyro);
1640
1641
1642 atomic_set(&gyro->enabled, 0);
1643
1644
1645 if (gyro->pdata->gpio_int2 > 0) {
1646 gyro->irq2 = gpio_to_irq(gyro->pdata->gpio_int2);
1647 I("%s: %s has set irq2 to irq:"
1648 " %d mapped on gpio:%d\n",
1649 R3GD20_GYR_DEV_NAME, __func__, gyro->irq2,
1650 gyro->pdata->gpio_int2);
1651
1652 INIT_WORK(&gyro->irq2_work, r3gd20_irq2_work_func);
1653 gyro->irq2_work_queue =
1654 create_singlethread_workqueue("r3gd20_gyr_wq2");
1655 if (!gyro->irq2_work_queue) {
1656 err = -ENOMEM;
1657 dev_err(&client->dev, "cannot create "
1658 "work queue2: %d\n", err);
1659 goto err5;
1660 }
1661
1662 err = request_irq(gyro->irq2, r3gd20_isr2,
1663 IRQF_TRIGGER_HIGH, "r3gd20_gyr_irq2", gyro);
1664
1665 if (err < 0) {
1666 dev_err(&client->dev, "request irq2 failed: %d\n", err);
1667 goto err6;
1668 }
1669 disable_irq_nosync(gyro->irq2);
1670 }
1671
1672 mutex_unlock(&gyro->lock);
1673
1674 gyro->cali_data_x = to_signed_int(&gyro_gsensor_kvalue[4]);
1675 gyro->cali_data_y = to_signed_int(&gyro_gsensor_kvalue[8]);
1676 gyro->cali_data_z = to_signed_int(&gyro_gsensor_kvalue[12]);
1677 D("%s: Calibration data (x, y, z) = (%d, %d, %d)\n",
1678 __func__, gyro->cali_data_x, gyro->cali_data_y,
1679 gyro->cali_data_z);
1680
1681#ifdef HTC_WQ
1682 gyro->gyro_wq = create_singlethread_workqueue("gyro_wq");
1683 if (!gyro->gyro_wq) {
1684 E("%s: can't create workqueue\n", __func__);
1685 err = -ENOMEM;
1686 goto err_create_singlethread_workqueue;
1687 }
1688#endif
1689 debug_flag = 0;
1690
1691 I("%s: %s probed: device created successfully\n",
1692 __func__, R3GD20_GYR_DEV_NAME);
1693
1694 return 0;
1695
1696
1697#ifdef HTC_WQ
1698err_create_singlethread_workqueue:
1699#endif
1700err6:
1701 destroy_workqueue(gyro->irq2_work_queue);
1702err5:
1703 r3gd20_device_power_off(gyro);
1704 remove_sysfs_interfaces(&client->dev);
1705err4:
1706 r3gd20_input_cleanup(gyro);
1707err3:
1708 r3gd20_device_power_off(gyro);
1709err2:
1710 if (gyro->pdata->exit)
1711 gyro->pdata->exit();
1712err1_1:
1713 mutex_unlock(&gyro->lock);
1714 kfree(gyro->pdata);
1715err1:
1716 kfree(gyro);
1717err0:
1718 E("%s: Driver Initialization failed\n", R3GD20_GYR_DEV_NAME);
1719 return err;
1720}
1721
1722static int r3gd20_remove(struct i2c_client *client)
1723{
1724 struct r3gd20_data *gyro = i2c_get_clientdata(client);
1725#if DEBUG
1726 I("R3GD20 driver removing\n");
1727#endif
1728
1729 if (gyro->pdata->gpio_int2 > 0) {
1730 free_irq(gyro->irq2, gyro);
1731 gpio_free(gyro->pdata->gpio_int2);
1732 destroy_workqueue(gyro->irq2_work_queue);
1733 }
1734
1735 r3gd20_input_cleanup(gyro);
1736 r3gd20_device_power_off(gyro);
1737 remove_sysfs_interfaces(&client->dev);
1738
1739 kfree(gyro->pdata);
1740 kfree(gyro);
1741 return 0;
1742}
1743
1744#ifdef HTC_SUSPEND
1745
1746static int r3gd20_suspend(struct i2c_client *client, pm_message_t mesg)
1747{
1748#ifdef CONFIG_SUSPEND
1749 struct r3gd20_data *data = i2c_get_clientdata(client);
1750 u8 buf[2];
1751 int err = -1;
1752
1753 DIF("%s: ++\n", __func__);
1754
1755#if DEBUG
1756 I("r3gd20_suspend\n");
1757#endif
1758
1759
1760 mutex_lock(&data->lock);
1761 if (data->polling_enabled) {
1762 D("polling disabled\n");
1763#ifdef HTC_WQ
1764 cancel_delayed_work_sync(&polling_work);
1765#else
1766 cancel_delayed_work_sync(&data->input_poll_dev->work);
1767#endif
1768
1769 }
1770
1771#ifdef SLEEP
1772 err = r3gd20_register_update(data, buf, CTRL_REG1,
1773 0x0F, (ENABLE_NO_AXES | PM_NORMAL));
1774#else
1775 err = r3gd20_register_update(data, buf, CTRL_REG1,
1776 0x08, PM_OFF);
1777#endif
1778 mutex_unlock(&data->lock);
1779
1780
1781#endif
1782 D("%s:--\n", __func__);
1783 return err;
1784}
1785
1786static int r3gd20_resume(struct i2c_client *client)
1787{
1788#ifdef CONFIG_SUSPEND
1789 struct r3gd20_data *data = i2c_get_clientdata(client);
1790 u8 buf[2];
1791 int err = -1;
1792
1793 D("%s:++\n", __func__);
1794#if DEBUG
1795 I("r3gd20_resume\n");
1796#endif
1797
1798 if (atomic_read(&data->enabled)) {
1799 mutex_lock(&data->lock);
1800
1801 if (data->polling_enabled) {
1802 D("polling enabled\n");
1803#ifdef HTC_WQ
1804 queue_delayed_work(data->gyro_wq, &polling_work,
1805 msecs_to_jiffies(data->input_poll_dev->
1806 poll_interval));
1807#else
1808 schedule_delayed_work(&data->input_poll_dev->work,
1809 msecs_to_jiffies(data->
1810 pdata->poll_interval));
1811#endif
1812 }
1813#ifdef SLEEP
1814 err = r3gd20_register_update(data, buf, CTRL_REG1,
1815 0x0F, (ENABLE_ALL_AXES | PM_NORMAL));
1816#else
1817 err = r3gd20_register_update(data, buf, CTRL_REG1,
1818 0x08, PM_NORMAL);
1819#endif
1820 mutex_unlock(&data->lock);
1821
1822 }
1823
1824#endif
1825 D("%s:--\n", __func__);
1826 return 0;
1827}
1828
1829#else
1830
1831static int r3gd20_suspend(struct device *dev)
1832{
1833#define SLEEP
1834#ifdef CONFIG_SUSPEND
1835 struct i2c_client *client = to_i2c_client(dev);
1836 struct r3gd20_data *data = i2c_get_clientdata(client);
1837 u8 buf[2];
1838 int err = -1;
1839
1840 D("%s:\n", __func__);
1841
1842#if DEBUG
1843 I("r3gd20_suspend\n");
1844#endif
1845 I("%s\n", __func__);
1846 if (atomic_read(&data->enabled)) {
1847 mutex_lock(&data->lock);
1848 if (data->polling_enabled) {
1849 D("polling disabled\n");
1850#ifdef HTC_WQ
1851 cancel_delayed_work_sync(&polling_work);
1852#else
1853 cancel_delayed_work_sync(&data->input_poll_dev->work);
1854#endif
1855
1856 }
1857#ifdef SLEEP
1858 err = r3gd20_register_update(data, buf, CTRL_REG1,
1859 0x0F, (ENABLE_NO_AXES | PM_NORMAL));
1860#else
1861 err = r3gd20_register_update(data, buf, CTRL_REG1,
1862 0x08, PM_OFF);
1863#endif
1864 mutex_unlock(&data->lock);
1865 }
1866
1867#endif
1868 return err;
1869}
1870
1871static int r3gd20_resume(struct device *dev)
1872{
1873#ifdef CONFIG_SUSPEND
1874 struct i2c_client *client = to_i2c_client(dev);
1875 struct r3gd20_data *data = i2c_get_clientdata(client);
1876 u8 buf[2];
1877 int err = -1;
1878
1879 D("%s:\n", __func__);
1880#if DEBUG
1881 I("r3gd20_resume\n");
1882#endif
1883 I("%s\n", __func__);
1884 if (atomic_read(&data->enabled)) {
1885 mutex_lock(&data->lock);
1886 if (data->polling_enabled) {
1887 D("polling enabled\n");
1888#ifdef HTC_WQ
1889 queue_delayed_work(data->gyro_wq, &polling_work,
1890 msecs_to_jiffies(data->input_poll_dev->
1891 poll_interval));
1892#else
1893 schedule_delayed_work(&data->input_poll_dev->work,
1894 msecs_to_jiffies(data->
1895 pdata->poll_interval));
1896#endif
1897 }
1898#ifdef SLEEP
1899 err = r3gd20_register_update(data, buf, CTRL_REG1,
1900 0x0F, (ENABLE_ALL_AXES | PM_NORMAL));
1901#else
1902 err = r3gd20_register_update(data, buf, CTRL_REG1,
1903 0x08, PM_NORMAL);
1904#endif
1905 mutex_unlock(&data->lock);
1906
1907 }
1908
1909#endif
1910 return 0;
1911}
1912
1913#endif
1914
1915static const struct i2c_device_id r3gd20_id[] = {
1916 { R3GD20_GYR_DEV_NAME , 0 },
1917 {},
1918};
1919
1920MODULE_DEVICE_TABLE(i2c, r3gd20_id);
1921
1922#ifndef HTC_SUSPEND
1923static struct dev_pm_ops r3gd20_pm = {
1924 .suspend = r3gd20_suspend,
1925 .resume = r3gd20_resume,
1926};
1927#endif
1928
1929static struct i2c_driver r3gd20_driver = {
1930 .driver = {
1931 .owner = THIS_MODULE,
1932 .name = R3GD20_GYR_DEV_NAME,
1933#ifndef HTC_SUSPEND
1934 .pm = &r3gd20_pm,
1935#endif
1936 },
1937 .probe = r3gd20_probe,
1938 .remove = __devexit_p(r3gd20_remove),
1939 .id_table = r3gd20_id,
1940#ifdef HTC_SUSPEND
1941 .suspend = r3gd20_suspend,
1942 .resume = r3gd20_resume,
1943#endif
1944
1945};
1946
1947static int __init r3gd20_init(void)
1948{
1949#if DEBUG
1950 I("%s: gyroscope sysfs driver init\n", R3GD20_GYR_DEV_NAME);
1951#endif
1952 return i2c_add_driver(&r3gd20_driver);
1953}
1954
1955static void __exit r3gd20_exit(void)
1956{
1957#if DEBUG
1958 I("%s exit\n", R3GD20_GYR_DEV_NAME);
1959#endif
1960 i2c_del_driver(&r3gd20_driver);
1961 return;
1962}
1963
1964module_init(r3gd20_init);
1965module_exit(r3gd20_exit);
1966
1967MODULE_DESCRIPTION("r3gd20 digital gyroscope sysfs driver");
1968MODULE_AUTHOR("Matteo Dameno, Carmine Iascone, STMicroelectronics");
1969MODULE_LICENSE("GPL");
1970