input: misc: fix sysfs permissions
[linux-3.10.git] / drivers / input / misc / mpu / inv_gyro.h
1 /*
2 * Copyright (C) 2012 Invensense, Inc.
3 * Copyright (c) 2013, NVIDIA CORPORATION.  All rights reserved.
4 *
5 * This software is licensed under the terms of the GNU General Public
6 * License version 2, as published by the Free Software Foundation, and
7 * may be copied, distributed, and modified under those terms.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 * GNU General Public License for more details.
13 *
14 */
15
16 /**
17  *  @addtogroup DRIVERS
18  *  @brief      Hardware drivers.
19  *
20  *  @{
21  *      @file  inv_gyro.h
22  *      @brief Struct definitions for the Invensense gyro driver.
23  */
24
25 #ifndef _INV_GYRO_H_
26 #define _INV_GYRO_H_
27
28 #include <linux/i2c.h>
29 #include <linux/kfifo.h>
30 #include <linux/miscdevice.h>
31 #include <linux/input.h>
32 #include <linux/spinlock.h>
33 #include <linux/mpu.h>
34 #include <linux/regulator/consumer.h>
35 #include "dmpKey.h"
36
37
38 #define GYRO_INPUT_RESOLUTION           (1)
39 #define ACCL_INPUT_RESOLUTION           (1)
40 #define NVI_BYPASS_TIMEOUT_MS           (1000)
41 #define NVI_FIFO_SIZE_3050              (512)
42 #define NVI_FIFO_SIZE_6050              (1024)
43 #define NVI_FIFO_SIZE_6500              (4096)
44 #define NVI_FIFO_SAMPLE_SIZE_MAX        (38)
45 #define NVI_DELAY_US_MAX                (256000)
46 #define NVI_DELAY_US_MIN                (15000)
47 #define NVI_DELAY_DEFAULT               (50000)
48 #define NVI_INPUT_GYRO_DELAY_US_MIN     (5000)
49 #define NVI_INPUT_ACCL_DELAY_US_MIN     (5000)
50 #define NVI_TEMP_EN                     (1 << 0)
51 #define NVI_TEMP_GYRO                   (1 << 1)
52 #define NVI_TEMP_ACCL                   (1 << 2)
53 #define NVI_MOT_DIS                     (0)
54 #define NVI_MOT_EN                      (1)
55 #define NVI_MOT_DBG                     (2)
56
57 #define NVI_PM_ERR                      (0)
58 #define NVI_PM_AUTO                     (1)
59 #define NVI_PM_OFF_FORCE                (2)
60 #define NVI_PM_OFF                      (3)
61 #define NVI_PM_STDBY                    (4)
62 #define NVI_PM_ON_CYCLE                 (5)
63 #define NVI_PM_ON                       (6)
64 #define NVI_PM_ON_FULL                  (7)
65
66 /**
67  *  struct inv_reg_map_s - Notable slave registers.
68  *  @who_am_i:          Upper 6 bits of the device's slave address.
69  *  @sample_rate_div:   Divider applied to gyro output rate.
70  *  @lpf:               Configures internal LPF.
71  *  @product_id:        Product revision.
72  *  @bank_sel:          Selects between memory banks.
73  *  @user_ctrl:         Enables/resets the FIFO.
74  *  @fifo_en:           Determines which data will appear in FIFO.
75  *  @gyro_config:       gyro config register.
76  *  @accl_config:       accel config register
77  *  @fifo_count_h:      Upper byte of FIFO count.
78  *  @fifo_r_w:          FIFO register.
79  *  @raw_gyro           Address of first gyro register.
80  *  @raw_accl           Address of first accel register.
81  *  @temperature        temperature register
82  *  @int_enable:        Interrupt enable register.
83  *  @int_status:        Interrupt flags.
84  *  @pwr_mgmt_1:        Controls chip's power state and clock source.
85  *  @pwr_mgmt_2:        Controls power state of individual sensors.
86  *  @mem_start_addr:    Address of first memory read.
87  *  @mem_r_w:           Access to memory.
88  *  @prgm_strt_addrh    firmware program start address register
89  */
90 struct inv_reg_map_s {
91         u8 who_am_i;
92         u8 sample_rate_div;
93         u8 lpf;
94         u8 product_id;
95         u8 bank_sel;
96         u8 user_ctrl;
97         u8 fifo_en;
98         u8 gyro_config;
99         u8 accl_config;
100         u8 fifo_count_h;
101         u8 fifo_r_w;
102         u8 raw_gyro;
103         u8 raw_accl;
104         u8 temperature;
105         u8 int_enable;
106         u8 int_status;
107         u8 pwr_mgmt_1;
108         u8 pwr_mgmt_2;
109         u8 mem_start_addr;
110         u8 mem_r_w;
111         u8 prgm_strt_addrh;
112
113         u8 accl_fifo_en;
114         u8 fifo_reset;
115         u8 i2c_mst_reset;
116         u8 cycle;
117 };
118
119 enum inv_devices {
120         INV_ITG3500,
121         INV_MPU3050,
122         INV_MPU6050,
123         INV_MPU9150,
124         INV_MPU6500,
125         INV_MPU9250,
126         INV_MPU6XXX,
127         INV_NUM_PARTS
128 };
129
130 struct nvi_hal {
131         unsigned int fifo_size;
132         unsigned long *lpa_tbl;
133         unsigned int lpa_tbl_n;
134 };
135
136 /**
137  *  struct test_setup_t - set up parameters for self test.
138  *  @sample_rate: sensitity for gyro.
139  *  @sample_rate: sample rate, i.e, fifo rate.
140  *  @lpf:       low pass filter.
141  *  @gyro_fsr:  full scale range.
142  *  @accl_fsr:  accel full scale range.
143  *  @accl_sens: accel sensitivity
144  */
145 struct test_setup_t {
146         int gyro_sens;
147         int sample_rate;
148         int lpf;
149         int gyro_fsr;
150         int accl_fsr;
151         unsigned int accl_sens[3];
152 };
153
154 /**
155  *  struct inv_hw_s - Other important hardware information.
156  *  @num_reg:   Number of registers on device.
157  *  @name:      name of the chip
158  */
159 struct inv_hw_s {
160         unsigned char num_reg;
161         unsigned char *name;
162 };
163
164 /**
165  *  struct inv_chip_config_s - Cached chip configuration data.
166  *  @gyro_fsr:          Full scale range.
167  *  @lpf:               Digital low pass filter frequency.
168  *  @clk_src:           Clock source.
169  *  @accl_fsr:          accel full scale range.
170  *  @fifo_rate:         FIFO update rate.
171  *  @enable:            master enable to enable output
172  *  @accl_enable:       enable accel functionality
173  *  @accl_fifo_enable:  enable accel data output
174  *  @gyro_enable:       enable gyro functionality
175  *  @gyro_fifo_enable:  enable gyro data output
176  *  @compass_enable:    enable compass
177  *  @is_asleep:         1 if chip is powered down.
178  *  @dmp_on:            dmp is on/off
179  *  @firmware_loaded:   flag indicate firmware loaded or not.
180  *  @lpa_mod:           low power mode
181  *  @lpa_freq:          low power accel frequency.
182  *  @prog_start_addr:   firmware program start address
183  */
184 struct inv_chip_config_s {
185         unsigned char lpf;
186         unsigned char clk_src;
187         unsigned char enable;
188         unsigned char gyro_enable;
189         unsigned char gyro_fifo_enable;
190         unsigned long gyro_delay_us;
191         unsigned int gyro_resolution;
192         unsigned char gyro_fsr;
193         unsigned char accl_enable;
194         unsigned char accl_fifo_enable;
195         unsigned long accl_delay_us;
196         unsigned int accl_resolution;
197         unsigned char accl_fsr;
198         unsigned long lpa_delay_us;
199         unsigned char temp_enable;
200         unsigned char temp_fifo_enable;
201         unsigned char dmp_on;
202         unsigned char firmware_loaded;
203         unsigned char mot_enable;
204         unsigned char mot_dur;
205         unsigned char mot_ctrl;
206         unsigned int mot_cnt;
207         unsigned int fifo_thr;
208         unsigned int  prog_start_addr;
209         unsigned long min_delay_us;
210         long long gyro_start_delay_ns;
211         unsigned int bypass_timeout_ms;
212         unsigned char is_asleep;
213 };
214
215 /**
216  *  struct inv_chip_info_s - Chip related information.
217  *  @product_id:        Product id.
218  *  @product_revision:  Product revision.
219  *  @silicon_revision:  Silicon revision.
220  *  @software_revision: software revision.
221  *  @multi:             accel specific multiplier.
222  *  @compass_sens:      compass sensitivity.
223  *  @gyro_sens_trim:    Gyro sensitivity trim factor.
224  *  @accl_sens_trim:    accel sensitivity trim factor.
225  */
226 struct inv_chip_info_s {
227         unsigned char product_id;
228         unsigned char product_revision;
229         unsigned char silicon_revision;
230         unsigned char software_revision;
231         unsigned char multi;
232         unsigned char compass_sens[3];
233         unsigned long gyro_sens_trim;
234         unsigned long accl_sens_trim;
235 };
236
237 /**
238  *  struct inv_trigger_s - Variables passed between interrupt and kernel space.
239  *  @irq:               Interrupt number.
240  *  @timestamps:        Timestamp buffer.
241  */
242 struct inv_trigger_s {
243 #define TIMESTAMP_FIFO_SIZE 32
244         unsigned long irq;
245         DECLARE_KFIFO(timestamps, long long, TIMESTAMP_FIFO_SIZE);
246 };
247
248 /**
249  *  struct inv_flick_s structure to store flick data.
250  *  @lower:     lower bound of flick.
251  *  @upper:     upper bound of flick.
252  *  @counter:   counterof flick.
253  *  @int_on:    interrupt on for flick.
254  *  @msg_on;    message to carry flick
255  *  @axis:      axis of flick
256  */
257 struct inv_flick_s {
258         int lower;
259         int upper;
260         int counter;
261         char int_on;
262         char msg_on;
263         char axis;
264 };
265
266 /**
267  *  struct inv_tap_s structure to store tap data.
268  *  @tap_on:    tap on
269  *  @min_taps:  minimut taps counted.
270  *  @thresh:    tap threshold.
271  *  @time:      tap time.
272  */
273 struct inv_tap_s {
274         char tap_on;
275         char min_tap;
276         short thresh;
277         short time;
278 };
279
280 /**
281  * struct inv_regulator_s structure to store regulator
282  */
283 struct inv_regulator_s {
284         struct regulator *regulator_vlogic;
285         struct regulator *regulator_vdd;
286 };
287
288 #define AUX_PORT_MAX                    (5)
289 #define AUX_PORT_SPECIAL                (4)
290 #define AUX_PORT_BYPASS                 (-1)
291 #define AUX_EXT_DATA_REG_MAX            (24)
292 #define AUX_DEV_VALID_READ_LOOP_MAX     (20)
293 #define AUX_DEV_VALID_READ_DELAY_MS     (5)
294
295 struct aux_port {
296         struct nvi_mpu_port nmp;
297         unsigned short ext_data_offset;
298         bool hw_valid;
299         bool hw_en;
300         bool hw_do;
301         bool enable;
302         bool fifo_en;
303 };
304
305 struct aux_ports {
306         struct aux_port port[AUX_PORT_MAX];
307         s64 bypass_timeout_ns;
308         unsigned int bypass_lock;
309         u8 delay_hw;
310         unsigned short ext_data_n;
311         unsigned char ext_data[AUX_EXT_DATA_REG_MAX];
312         unsigned char clock_i2c;
313         bool reset_i2c;
314         bool reset_fifo;
315         bool enable;
316         bool en3050;
317         bool dbg;
318 };
319
320 struct nvi_hw {
321         u8 aux_vddio;
322         u8 smplrt_div;
323         u8 config;
324         u8 gyro_config;
325         u8 accl_config;
326         u8 accl_config2;
327         u8 lposc_clksel;
328         u8 mot_thr;
329         u8 mot_dur;
330         u8 zrmot_thr;
331         u8 zrmot_dur;
332         u8 fifo_en;
333         u8 i2c_mst_ctrl;
334         u8 i2c_slv_addr[AUX_PORT_MAX];
335         u8 i2c_slv_reg[AUX_PORT_MAX];
336         u8 i2c_slv_ctrl[AUX_PORT_SPECIAL];
337         u8 i2c_slv4_do;
338         u8 i2c_slv4_ctrl;
339         u8 int_pin_cfg;
340         u8 int_enable;
341         u8 i2c_slv_do[AUX_PORT_SPECIAL];
342         u8 i2c_mst_delay_ctrl;
343         u8 mot_detect_ctrl;
344         u8 user_ctrl;
345         u8 pwr_mgmt_1;
346         u8 pwr_mgmt_2;
347 };
348
349 struct inv_mpu_slave;
350 /**
351  *  struct inv_gyro_state_s - Driver state variables.
352  *  @chip_config:       Cached attribute information.
353  *  @chip_info:         Chip information from read-only registers.
354  *  @flick:             flick data structure
355  *  @reg:               Map of important registers.
356  *  @hw:                Other hardware-specific information.
357  *  @idev:              Handle to input device.
358  *  @idev_dmp:          Handle to input device for DMP.
359  *  @idev_compass:      Handle to input device for compass.
360  *  @chip_type:         chip type.
361  *  @time_stamp_lock:   spin lock to time stamp.
362  *  @inv_class:         store class handle.
363  *  @inv_dev:           store device handle.
364  *  @i2c:               i2c client handle.
365  *  @plat_data:         platform data.
366  *  @mpu_slave:         mpu slave handle.
367  *  @fifo_counter:      MPU3050 specific work around.
368  *  @has_compass:       has compass or not.
369  *  @compass_scale:     compass scale.
370  *  @i2c_addr:          i2c address.
371  *  @compass_divider:   slow down compass rate.
372  *  @compass_counter:   slow down compass rate.
373  *  @sample_divider:    sample divider for dmp.
374  *  @fifo_divider:      fifo divider for dmp.
375  *  @sl_handle:         Handle to I2C port.
376  *  @irq_dur_us:        duration between each irq.
377  *  @last_isr_time:     last isr time.
378  *  @early_suspend:     struct for early suspend.
379  *  @early_suspend_enable: sysfs interface to store current early_suspend.
380  *  @inv_regulator_s:   Regulator sturcture to store regulator.
381  */
382 struct inv_gyro_state_s {
383         struct inv_chip_config_s chip_config;
384         struct inv_chip_info_s chip_info;
385         struct inv_flick_s flick;
386         struct inv_tap_s tap;
387         struct inv_reg_map_s *reg;
388         struct inv_hw_s *hw_s;
389         struct inv_trigger_s trigger;
390         struct input_dev *idev;
391         struct input_dev *idev_dmp;
392         enum   inv_devices chip_type;
393         spinlock_t time_stamp_lock;
394         struct class *inv_class;
395         struct device *inv_dev;
396         struct i2c_client *i2c;
397         struct mpu_platform_data plat_data;
398         struct inv_mpu_slave *mpu_slave;
399         struct regulator_bulk_data vreg[2];
400         bool fifo_reset_3050;
401         unsigned char i2c_addr;
402         unsigned char sample_divider;
403         unsigned char fifo_divider;
404         void *sl_handle;
405         struct mutex mutex;
406         struct mutex mutex_temp;
407         struct nvi_hw hw;
408         struct nvi_hal hal;
409         struct aux_ports aux;
410         int pm;
411         unsigned long sample_delay_us;
412         u16 fifo_sample_size;
413         bool shutdown;
414         bool suspend;
415         unsigned int mot_cnt;
416         short temp_val;
417         s64 temp_ts;
418         s64 fifo_ts;
419         s64 gyro_start_ts;
420 #if DEBUG_SYSFS_INTERFACE
421         u16 dbg_i2c_addr;
422         u8 dbg_reg;
423 #endif /* DEBUG_SYSFS_INTERFACE */
424         u8 buf[NVI_FIFO_SAMPLE_SIZE_MAX * 2]; /* (* 2)=FIFO OVERFLOW OFFSET */
425 };
426
427 /* produces an unique identifier for each device based on the
428    combination of product version and product revision */
429 struct prod_rev_map_t {
430         unsigned short mpl_product_key;
431         unsigned char silicon_rev;
432         unsigned short gyro_trim;
433         unsigned short accel_trim;
434 };
435 /**
436  *  struct inv_mpu_slave - MPU slave structure.
437  *  @suspend:           suspend operation.
438  *  @resume:            resume operation.
439  *  @setup:             setup chip. initialization.
440  *  @create_sysfs:      create chip specific sysfs entries.
441  *  @remove_sysfs:      remove chip specific sysfs entries.
442  *  @combine_data:      combine raw data into meaningful data.
443  *  @get_mode:          get current chip mode.
444  */
445 struct inv_mpu_slave {
446         int (*suspend)(struct inv_gyro_state_s *);
447         int (*resume)(struct inv_gyro_state_s *);
448         int (*setup)(struct inv_gyro_state_s *);
449         int (*combine_data)(unsigned char *in, short *out);
450         int (*get_mode)(struct inv_gyro_state_s *);
451         int (*set_lpf)(struct inv_gyro_state_s *, int rate);
452         int (*set_fs)(struct inv_gyro_state_s *, int fs);
453 };
454
455 /* register definition*/
456 #define REG_3050_AUX_VDDIO      (0x13)
457 #define REG_3050_SLAVE_ADDR     (0x14)
458 #define REG_3050_SLAVE_REG      (0x18)
459 #define REG_3050_AUX_XOUT_H     (0x23)
460
461 #define REG_3500_OTP            (0x00)
462 #define REG_AUX_VDDIO           (0x01)
463 #define REG_ST_GCT_X            (0x0D)
464 #define REG_6500_LP_ACCEL_ODR   (0x1E)
465 #define REG_MOT_THR             (0x1F)
466 #define REG_MOT_DUR             (0x20)
467 #define REG_ZMOT_THR            (0x21)
468 #define REG_ZMOT_DUR            (0x22)
469 #define REG_I2C_MST_CTRL        (0x24)
470 #define BIT_SLV3_FIFO_EN        (0x20)
471 #define REG_I2C_SLV0_ADDR       (0x25)
472 #define REG_I2C_SLV0_REG        (0x26)
473 #define REG_I2C_SLV0_CTRL       (0x27)
474 #define BITS_I2C_SLV_CTRL_LEN   (0x0F)
475 #define BITS_I2C_SLV_REG_DIS    (0x10)
476 #define REG_I2C_SLV4_ADDR       (0x31)
477 #define REG_I2C_SLV4_REG        (0x32)
478 #define REG_I2C_SLV4_DO         (0x33)
479 #define REG_I2C_SLV4_CTRL       (0x34)
480 #define REG_I2C_SLV4_DI         (0x35)
481 #define REG_I2C_MST_STATUS      (0x36)
482 #define REG_I2C_SLV0_DO         (0x63)
483 #define REG_FIFO_EN             (0x23)
484
485 #define BITS_I2C_MST_DLY        (0x1F)
486 #define REG_INT_PIN_CFG         (0x37)
487 #define REG_DMP_INT_STATUS      (0x39)
488 #define REG_EXT_SENS_DATA_00    (0x49)
489 #define REG_I2C_MST_DELAY_CTRL  (0x67)
490 #define REG_MOT_DETECT_CTRL     (0x69)
491 #define REG_BANK_SEL            (0x6D)
492 #define REG_MEM_START           (0x6E)
493 #define REG_MEM_RW              (0x6F)
494
495 /* bit definitions */
496 #define BIT_3050_VDDIO          (0x04)
497 #define BIT_3050_AUX_IF_EN      (0x20)
498 #define BIT_3050_AUX_IF_RST     (0x08)
499 #define BIT_3050_FIFO_RST       (0x02)
500
501 #define BIT_BYPASS_EN           (0x2)
502 #define BIT_WAIT_FOR_ES         (0x40)
503 #define BIT_I2C_MST_P_NSR       (0x10)
504 #define BIT_I2C_READ            (0x80)
505 #define BIT_SLV_EN              (0x80)
506
507 #define BIT_DMP_EN              (0x80)
508 #define BIT_FIFO_EN             (0x40)
509 #define BIT_I2C_MST_EN          (0x20)
510 #define BIT_DMP_RST             (0x08)
511 #define BIT_FIFO_RST            (0x04)
512 #define BIT_I2C_MST_RST         (0x02)
513
514 #define BIT_SLV0_DLY_EN         (0x01)
515 #define BIT_SLV1_DLY_EN         (0x02)
516 #define BIT_DELAY_ES_SHADOW     (0x80)
517
518 #define BIT_MOT_EN              (0x40)
519 #define BIT_ZMOT_EN             (0x20)
520 #define BIT_FIFO_OVERFLOW       (0x10)
521 #define BIT_DATA_RDY_EN         (0x01)
522 #define BIT_DMP_INT_EN          (0x02)
523
524 #define BIT_PWR_ACCL_STBY       (0x38)
525 #define BIT_PWR_GYRO_STBY       (0x07)
526
527 #define BIT_TEMP_FIFO_EN        (0x80)
528 #define BIT_GYRO_XOUT           (0x40)
529 #define BIT_GYRO_YOUT           (0x20)
530 #define BIT_GYRO_ZOUT           (0x10)
531 #define BIT_ACCEL_OUT           (0x08)
532 #define BITS_GYRO_OUT           (0x70)
533 #define BITS_SELF_TEST_EN       (0xE0)
534 #define BITS_3050_ACCL_OUT      (0x0E)
535 #define BIT_3050_FIFO_FOOTER    (0x01)
536 #define BITS_3050_POWER1        (0x30)
537 #define BITS_3050_POWER2        (0x10)
538 #define BITS_3050_GYRO_STANDBY  (0x38)
539 #define BITS_FSR                (0x18)
540 #define BITS_LPF                (0x07)
541 #define BITS_CLK                (0x07)
542 #define BIT_RESET               (0x80)
543 #define BIT_SLEEP               (0x40)
544 #define BIT_CYCLE               (0x20)
545 #define BIT_LPA_FREQ            (0xC0)
546 #define BIT_STBY_XA             (0x20)
547 #define BIT_STBY_YA             (0x10)
548 #define BIT_STBY_ZA             (0x08)
549 #define BIT_STBY_XG             (0x04)
550 #define BIT_STBY_YG             (0x02)
551 #define BIT_STBY_ZG             (0x01)
552
553 #define DMP_START_ADDR          (0x400)
554 #define BYTES_FOR_DMP           (16)
555 #define BYTES_PER_SENSOR        (6)
556 #define FIFO_THRESHOLD           500
557 #define POWER_UP_TIME           (40)
558 #define MPU_MEM_BANK_SIZE        (256)
559 #define MPL_PROD_KEY(ver, rev) (ver * 100 + rev)
560 #define NUM_OF_PROD_REVS (ARRAY_SIZE(prod_rev_map))
561 /*---- MPU6050 Silicon Revisions ----*/
562 #define MPU_SILICON_REV_A2              1       /* MPU6050A2 Device */
563 #define MPU_SILICON_REV_B1              2       /* MPU6050B1 Device */
564
565 #define MPU6050_ID                      (0x68)
566 #define MPU6500_ID                      (0x70)
567 #define MPU6500_PRODUCT_REVISION        (1)
568 #define MPU6500_MEM_REV_ADDR            (0x17)
569 #define MPU6500_REV                     (2)
570 #define MPU9250_ID                      (0x71)
571
572 #define BIT_PRFTCH_EN                           0x40
573 #define BIT_CFG_USER_BANK                       0x20
574 #define BITS_MEM_SEL                            0x1f
575 /* time stamp tolerance */
576 #define TIME_STAMP_TOR           (5)
577 #define MAX_CATCH_UP             (5)
578 #define DEFAULT_ACCL_TRIM        (16384)
579 #define DEFAULT_GYRO_TRIM        (131)
580 #define MAX_FIFO_RATE            (1000000)
581 #define MIN_FIFO_RATE            (4000)
582 #define ONE_K_HZ                 (1000)
583
584 /* authenticate key */
585 #define D_AUTH_OUT               (32)
586 #define D_AUTH_IN                (36)
587 #define D_AUTH_A                 (40)
588 #define D_AUTH_B                 (44)
589
590 /* flick related defines */
591 #define DATA_INT            (2097)
592 #define DATA_MSG_ON         (262144)
593
594 /*tap related defines */
595 #define INV_TAP                               0x08
596 #define INV_NUM_TAP_AXES (3)
597
598 #define INV_TAP_AXIS_X_POS                    0x20
599 #define INV_TAP_AXIS_X_NEG                    0x10
600 #define INV_TAP_AXIS_Y_POS                    0x08
601 #define INV_TAP_AXIS_Y_NEG                    0x04
602 #define INV_TAP_AXIS_Z_POS                    0x02
603 #define INV_TAP_AXIS_Z_NEG                    0x01
604 #define INV_TAP_ALL_DIRECTIONS                0x3f
605
606 #define INV_TAP_AXIS_X                        0x1
607 #define INV_TAP_AXIS_Y                        0x2
608 #define INV_TAP_AXIS_Z                        0x4
609
610 #define INV_TAP_AXIS_ALL                      \
611                 (INV_TAP_AXIS_X            |   \
612                 INV_TAP_AXIS_Y             |   \
613                 INV_TAP_AXIS_Z)
614
615 #define INT_SRC_TAP    0x01
616 #define INT_SRC_ORIENT 0x02
617
618 /*orientation related */
619 #define INV_X_UP                          0x01
620 #define INV_X_DOWN                        0x02
621 #define INV_Y_UP                          0x04
622 #define INV_Y_DOWN                        0x08
623 #define INV_Z_UP                          0x10
624 #define INV_Z_DOWN                        0x20
625 #define INV_ORIENTATION_ALL               0x3F
626
627 #define INV_ORIENTATION_FLIP              0x40
628 #define INV_X_AXIS_INDEX                 (0x00)
629 #define INV_Y_AXIS_INDEX                 (0x01)
630 #define INV_Z_AXIS_INDEX                 (0x02)
631
632 #define INV_ELEMENT_1                    (0x0001)
633 #define INV_ELEMENT_2                    (0x0002)
634 #define INV_ELEMENT_3                    (0x0004)
635 #define INV_ELEMENT_4                    (0x0008)
636 #define INV_ELEMENT_5                    (0x0010)
637 #define INV_ELEMENT_6                    (0x0020)
638 #define INV_ELEMENT_7                    (0x0040)
639 #define INV_ELEMENT_8                    (0x0080)
640 #define INV_ALL                          (0xFFFF)
641 #define INV_ELEMENT_MASK                 (0x00FF)
642 #define INV_GYRO_ACC_MASK                (0x007E)
643
644 enum inv_filter_e {
645         INV_FILTER_256HZ_NOLPF2 = 0,
646         INV_FILTER_188HZ,
647         INV_FILTER_98HZ,
648         INV_FILTER_42HZ,
649         INV_FILTER_20HZ,
650         INV_FILTER_10HZ,
651         INV_FILTER_5HZ,
652         INV_FILTER_2100HZ_NOLPF,
653         NUM_FILTER
654 };
655 /*==== MPU6050B1 MEMORY ====*/
656 enum MPU_MEMORY_BANKS {
657         MEM_RAM_BANK_0 = 0,
658         MEM_RAM_BANK_1,
659         MEM_RAM_BANK_2,
660         MEM_RAM_BANK_3,
661         MEM_RAM_BANK_4,
662         MEM_RAM_BANK_5,
663         MEM_RAM_BANK_6,
664         MEM_RAM_BANK_7,
665         MEM_RAM_BANK_8,
666         MEM_RAM_BANK_9,
667         MEM_RAM_BANK_10,
668         MEM_RAM_BANK_11,
669         MPU_MEM_NUM_RAM_BANKS,
670         MPU_MEM_OTP_BANK_0 = 16
671 };
672
673 enum inv_fsr_e {
674         INV_FSR_250DPS = 0,
675         INV_FSR_500DPS,
676         INV_FSR_1000DPS,
677         INV_FSR_2000DPS,
678         NUM_FSR
679 };
680 enum inv_accl_fs_e {
681         INV_FS_02G = 0,
682         INV_FS_04G,
683         INV_FS_08G,
684         INV_FS_16G,
685         NUM_ACCL_FSR
686 };
687
688 enum inv_clock_sel_e {
689         INV_CLK_INTERNAL = 0,
690         INV_CLK_PLL,
691         NUM_CLK
692 };
693
694 int inv_hw_self_test(struct inv_gyro_state_s *st, int *gyro_bias_regular);
695 int inv_get_silicon_rev_mpu6050(struct inv_gyro_state_s *st);
696 int inv_get_silicon_rev_mpu6500(struct inv_gyro_state_s *st);
697 int inv_i2c_read_base(struct inv_gyro_state_s *st, unsigned short i2c_addr,
698         unsigned char reg, unsigned short length, unsigned char *data);
699 int inv_i2c_single_write_base(struct inv_gyro_state_s *st,
700         unsigned short i2c_addr, unsigned char reg, unsigned char data);
701 #define inv_i2c_read(st, reg, len, data) \
702         inv_i2c_read_base(st, st->i2c_addr, reg, len, data)
703 #define inv_i2c_single_write(st, reg, data) \
704         inv_i2c_single_write_base(st, st->i2c_addr, reg, data)
705 #define inv_secondary_read(reg, len, data) \
706         inv_i2c_read_base(st, st->plat_data.secondary_i2c_addr, reg, len, data)
707 #define inv_secondary_write(reg, data) \
708         inv_i2c_single_write_base(st, st->plat_data.secondary_i2c_addr, \
709                 reg, data)
710 int nvi_gyro_enable(struct inv_gyro_state_s *inf,
711                     unsigned char enable, unsigned char fifo_enable);
712 int nvi_accl_enable(struct inv_gyro_state_s *inf,
713                     unsigned char enable, unsigned char fifo_enable);
714
715 int mpu_memory_write(struct i2c_adapter *i2c_adap,
716                             unsigned char mpu_addr,
717                             unsigned short mem_addr,
718                             unsigned int len, unsigned char const *data);
719 int mpu_memory_read(struct i2c_adapter *i2c_adap,
720                            unsigned char mpu_addr,
721                            unsigned short mem_addr,
722                            unsigned int len, unsigned char *data);
723 void inv_setup_reg_mpu3050(struct inv_reg_map_s *reg);
724 int inv_init_config_mpu3050(struct inv_gyro_state_s *st);
725 int set_3050_bypass(struct inv_gyro_state_s *st, int enable);
726 int inv_register_kxtf9_slave(struct inv_gyro_state_s *st);
727 s64 get_time_ns(void);
728 int inv_get_accl_bias(struct inv_gyro_state_s *st, int *accl_bias_regular);
729
730 int inv_enable_tap_dmp(struct inv_gyro_state_s *st, unsigned char on);
731 int inv_enable_orientation_dmp(struct inv_gyro_state_s *st);
732 unsigned short inv_dmp_get_address(unsigned short key);
733
734 ssize_t inv_dmp_firmware_write(struct file *fp, struct kobject *kobj,
735         struct bin_attribute *attr, char *buf, loff_t pos, size_t size);
736
737 ssize_t inv_dmp_firmware_read(struct file *filp, struct kobject *kobj,
738                               struct bin_attribute *bin_attr, char *buf,
739                               loff_t off, size_t count);
740
741 #define mem_w(a, b, c) mpu_memory_write(st->sl_handle, \
742                         st->i2c_addr, a, b, c)
743 #define mem_w_key(key, b, c) mpu_memory_write(st->sl_handle, \
744                         st->i2c_addr, inv_dmp_get_address(key), b, c)
745
746 #endif  /* #ifndef _INV_GYRO_H_ */
747