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