be8dcfa891199fc5b405daf74f000807b015314b
[linux-3.10.git] / drivers / iio / imu / nvi_mpu / nvi.h
1 /*
2 * Copyright (C) 2012 Invensense, Inc.
3 * Copyright (c) 2013-2015, 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 #ifndef _NVI_H_
17 #define _NVI_H_
18
19 #include <asm/atomic.h>
20 #include <linux/i2c.h>
21 #include <linux/miscdevice.h>
22 #include <linux/regulator/consumer.h>
23 #include <linux/mpu_iio.h>
24 #include <linux/nvs.h>
25
26 #define MPU6050_ID                      (0x68)
27 #define MPU6500_ID                      (0x70)
28 #define MPU6515_ID                      (0x74)
29 #define MPU9250_ID                      (0x71)
30 #define MPU9350_ID                      (0x72)
31 #define ICM20628_ID                     (0xA2)
32 #define ICM20630_ID                     (0xAB)
33 #define ICM20632_ID                     (0xAD)
34
35 #define NVI_BYPASS_TIMEOUT_MS           (1000)
36 #define POWER_UP_TIME                   (100)
37 #define REG_UP_TIME                     (5)
38 #define POR_MS                          (100)
39 #define GYRO_STARTUP_DELAY_NS           (100000000) /* 100ms */
40 #define NVI_IRQ_STORM_MIN_NS            (1000000) /* storm if irq faster 1ms */
41 #define NVI_IRQ_STORM_MAX_N             (100) /* max storm irqs b4 dis irq */
42 #define NVI_FIFO_SAMPLE_SIZE_MAX        (38)
43 #define FIFO_THRESHOLD                  (800)
44 #define KBUF_SZ                         (64)
45
46 #define AXIS_X                          (0)
47 #define AXIS_Y                          (1)
48 #define AXIS_Z                          (2)
49 #define AXIS_N                          (3)
50 #define DEV_ACCEL                       (0)
51 #define DEV_ANGLVEL                     (1)
52 #define DEV_TEMP                        (2)
53 #define DEV_TEMP_EN                     (1 << 0)
54 #define DEV_TEMP_GYRO                   (1 << 1)
55 #define DEV_N                           (3)
56 #define DEV_AUX                         (3)
57 #define DEV_N_AUX                       (4)
58 #define DEV_DMP                         (5)
59 #define EN_STDBY                        (16)
60 #define EN_LPA                          (17)
61 #define EN_FW                           (18)
62 #define DEV_MASTER                      (31)
63 #define DEV_MPU_MASK                    ((1 << DEV_ACCEL) | \
64                                         (1 << DEV_ANGLVEL) | \
65                                         (1 << DEV_TEMP))
66 #define DEV_PM_ON_FULL                  (1 << DEV_ANGLVEL)
67 #define DEV_PM_ON                       ((1 << DEV_TEMP) | \
68                                         (1 << DEV_AUX) | \
69                                         (1 << DEV_DMP))
70 #define DEV_PM_LPA                      ((1 << EN_LPA) | (1 << DEV_ACCEL))
71 #define DEV_PM_STDBY                    ((1 << EN_STDBY) | (1 << EN_FW))
72 #define NVI_PM_ERR                      (0)
73 #define NVI_PM_AUTO                     (1)
74 #define NVI_PM_OFF_FORCE                (2)
75 #define NVI_PM_OFF                      (3)
76 #define NVI_PM_STDBY                    (4)
77 #define NVI_PM_ON_CYCLE                 (5)
78 #define NVI_PM_ON                       (6)
79 #define NVI_PM_ON_FULL                  (7)
80 #define INV_CLK_INTERNAL                (0)
81 #define INV_CLK_PLL                     (1)
82
83 #define NVI_DBG_SPEW_MSG                (1 << 0)
84 #define NVI_DBG_SPEW_AUX                (1 << 1)
85 #define NVI_DBG_SPEW_FIFO               (1 << 2)
86 #define NVI_DBG_SPEW_BUF                (1 << 3)
87 /* registers */
88 #define REG_FIFO_RST_BANK               (0)
89 #define REG_FIFO_RST                    (0x68)
90 #define REG_FIFO_CFG_BANK               (0)
91 #define REG_FIFO_CFG                    (0x76)
92 /* register bits */
93 #define BITS_SELF_TEST_EN               (0xE0)
94 #define BIT_ACCEL_FCHOCIE_B             (0x08)
95 #define BIT_FIFO_SIZE_1K                (0x40)
96 #define BITS_GYRO_OUT                   (0x70)
97 #define BIT_I2C_MST_P_NSR               (0x10)
98 #define BIT_I2C_READ                    (0x80)
99 #define BITS_I2C_SLV_CTRL_LEN           (0x0F)
100 #define BIT_I2C_SLV_REG_DIS             (0x10)
101 #define BIT_SLV_EN                      (0x80)
102 #define BITS_I2C_MST_DLY                (0x1F)
103 #define BIT_BYPASS_EN                   (0x02)
104 #define BIT_DATA_RDY_EN                 (0x01)
105 #define BIT_DMP_INT_EN                  (0x02)
106 #define BIT_FIFO_OVERFLOW               (0x10)
107 #define BIT_ZMOT_EN                     (0x20)
108 #define BIT_MOT_EN                      (0x40)
109 #define BIT_6500_WOM_EN                 (0x40)
110 #define BIT_SLV0_DLY_EN                 (0x01)
111 #define BIT_SLV1_DLY_EN                 (0x02)
112 #define BIT_SLV2_DLY_EN                 (0x04)
113 #define BIT_SLV3_DLY_EN                 (0x08)
114 #define BIT_DELAY_ES_SHADOW             (0x80)
115 #define BIT_ACCEL_INTEL_MODE            (0x40)
116 #define BIT_ACCEL_INTEL_ENABLE          (0x80)
117 #define BITS_USER_CTRL_RST              (0x0F)
118 #define BIT_SIG_COND_RST                (0x01)
119 #define BIT_I2C_MST_RST                 (0x02)
120 #define BIT_FIFO_RST                    (0x04)
121 #define BIT_DMP_RST                     (0x08)
122 #define BIT_I2C_MST_EN                  (0x20)
123 #define BIT_FIFO_EN                     (0x40)
124 #define BIT_DMP_EN                      (0x80)
125 #define BIT_CLK_MASK                    (0x07)
126 #define BIT_CYCLE                       (0x20)
127 #define BIT_SLEEP                       (0x40)
128 #define BIT_H_RESET                     (0x80)
129 #define BIT_STBY_ZG                     (0x01)
130 #define BIT_STBY_YG                     (0x02)
131 #define BIT_STBY_XG                     (0x04)
132 #define BIT_STBY_ZA                     (0x08)
133 #define BIT_STBY_YA                     (0x10)
134 #define BIT_STBY_XA                     (0x20)
135 #define BIT_PWR_GYRO_STBY               (0x07)
136 #define BIT_PWR_ACCEL_STBY              (0x38)
137 #define BIT_PWR_PRESSURE_STBY           (0x40)
138 #define BIT_LPA_FREQ                    (0xC0)
139
140 #define AUX_PORT_MAX                    (5)
141 #define AUX_PORT_IO                     (4)
142 #define AUX_EXT_DATA_REG_MAX            (24)
143 #define AUX_DEV_VALID_READ_LOOP_MAX     (20)
144 #define AUX_DEV_VALID_READ_DELAY_MS     (5)
145
146
147 struct nvi_state;
148
149 enum nvi_part {
150         MPU6050 = 1,
151         MPU6500,
152         MPU6515,
153         ICM20628,
154 };
155
156 enum inv_accel_fs_e {
157         INV_FS_02G = 0,
158         INV_FS_04G,
159         INV_FS_08G,
160         INV_FS_16G,
161         NUM_ACCEL_FSR
162 };
163
164 enum inv_fsr_e {
165         INV_FSR_250DPS = 0,
166         INV_FSR_500DPS,
167         INV_FSR_1000DPS,
168         INV_FSR_2000DPS,
169         NUM_FSR
170 };
171
172 struct nvi_rr {
173         struct nvs_float max_range;
174         struct nvs_float resolution;
175 };
176
177 struct nvi_hal_dev {
178         int version;
179         int selftest_scale;
180         struct nvi_rr *rr;
181         struct nvs_float scale;
182         struct nvs_float offset;
183         struct nvs_float milliamp;
184 };
185
186 struct nvi_smplrt {
187         unsigned int dev;
188         unsigned int delay_us_min;
189         unsigned int delay_us_max;
190         unsigned int delay_us_dflt;
191         unsigned int dev_delays_n;
192         const unsigned int *dev_delays;
193         unsigned int lpf_us_tbl_n;
194         const unsigned int *lpf_us_tbl;
195         unsigned int base_hz;
196         int (*lpf_wr)(struct nvi_state *st, u8 test, u8 avg, u8 fsr, u8 lpf);
197 };
198
199 struct nvi_br {
200         u8 bank;
201         u8 reg;
202         u32 dflt;
203 };
204
205 struct nvi_hal_reg {
206         struct nvi_br self_test_x_gyro;
207         struct nvi_br self_test_y_gyro;
208         struct nvi_br self_test_z_gyro;
209         struct nvi_br self_test_x_accel;
210         struct nvi_br self_test_y_accel;
211         struct nvi_br self_test_z_accel;
212         struct nvi_br xg_offset_h;
213         struct nvi_br yg_offset_h;
214         struct nvi_br zg_offset_h;
215         struct nvi_br a_offset_h[AXIS_N];
216         struct nvi_br smplrt_div[DEV_N_AUX];
217         struct nvi_br gyro_config1;
218         struct nvi_br gyro_config2;
219         struct nvi_br accel_config;
220         struct nvi_br accel_config2;
221         struct nvi_br lp_config;
222         struct nvi_br mot_thr;
223         struct nvi_br mot_dur;
224         struct nvi_br fifo_en;
225         struct nvi_br int_pin_cfg;
226         struct nvi_br int_enable;
227         struct nvi_br int_status;
228         struct nvi_br accel_xout_h;
229         struct nvi_br temp_out_h;
230         struct nvi_br gyro_xout_h;
231         struct nvi_br ext_sens_data_00;
232         struct nvi_br signal_path_reset;
233         struct nvi_br accel_intel_ctrl;
234         struct nvi_br user_ctrl;
235         struct nvi_br pwr_mgmt_1;
236         struct nvi_br pwr_mgmt_2;
237         struct nvi_br fifo_count_h;
238         struct nvi_br fifo_r_w;
239         struct nvi_br who_am_i;
240         struct nvi_br i2c_mst_status;
241         struct nvi_br i2c_mst_odr_config;
242         struct nvi_br i2c_mst_ctrl;
243         struct nvi_br i2c_mst_delay_ctrl;
244         struct nvi_br i2c_slv0_addr;
245         struct nvi_br i2c_slv0_reg;
246         struct nvi_br i2c_slv0_ctrl;
247         struct nvi_br i2c_slv4_ctrl;
248         struct nvi_br i2c_slv0_do;
249         struct nvi_br i2c_slv4_do;
250         struct nvi_br i2c_slv4_di;
251         struct nvi_br reg_bank_sel;
252 };
253
254 struct nvi_hal_bit {
255         u8 smplrt_div_n[DEV_N_AUX];
256         u8 i2c_mst_int_en;
257         u8 dmp_int_en;
258         u8 pll_rdy_en;
259         u8 wom_int_en;
260         u8 reg_wof_en;
261         u8 raw_data_0_rdy_en;
262         u8 raw_data_1_rdy_en;
263         u8 raw_data_2_rdy_en;
264         u8 raw_data_3_rdy_en;
265         u8 fifo_overflow_en;
266         u8 fifo_wm_en;
267         u8 bit_int_enable_max;
268         u8 slv_fifo_en[AUX_PORT_IO];
269         u8 temp_fifo_en;
270         u8 gyro_x_fifo_en;
271         u8 gyro_y_fifo_en;
272         u8 gyro_z_fifo_en;
273         u8 accel_fifo_en;
274         u8 bit_fifo_en_max;
275 };
276
277 struct nvi_rc {
278         u16 accel_offset[AXIS_N];
279         u16 gyro_offset[AXIS_N];
280         u16 smplrt_div[DEV_N_AUX];
281         u8 gyro_config1;
282         u8 gyro_config2;
283         u8 accel_config;
284         u8 accel_config2;
285         u8 lp_config;
286         u8 mot_thr;
287         u8 mot_dur;
288         u16 fifo_en;
289         u8 int_pin_cfg;
290         u32 int_enable;
291         u8 i2c_mst_odr_config;
292         u8 i2c_mst_ctrl;
293         u8 i2c_mst_delay_ctrl;
294         u8 i2c_slv_addr[AUX_PORT_MAX];
295         u8 i2c_slv_reg[AUX_PORT_MAX];
296         u8 i2c_slv_ctrl[AUX_PORT_MAX];
297         u8 i2c_slv_do[AUX_PORT_MAX];
298         u8 mot_detect_ctrl;
299         u8 user_ctrl;
300         u8 pwr_mgmt_1;
301         u8 pwr_mgmt_2;
302         u8 reg_bank_sel;
303 };
304
305 struct nvi_hal {
306         enum nvi_part part;
307         unsigned int regs_n;
308         unsigned int reg_bank_n;
309         unsigned int fifo_size;
310         const unsigned long *lpa_tbl;
311         unsigned int lpa_tbl_n;
312         const struct nvi_smplrt *smplrt[DEV_N_AUX];
313         const struct nvi_hal_dev *dev[DEV_N];
314         const struct nvi_hal_reg *reg;
315         const struct nvi_hal_bit *bit;
316         unsigned int fifo_read_n;
317         unsigned int (**fifo_read)(struct nvi_state *st,
318                                    unsigned int buf_i, s64 ts);
319         void (*por2rc)(struct nvi_state *st);
320         int (*init)(struct nvi_state *st);
321 };
322
323 struct aux_port {
324         struct nvi_mpu_port nmp;
325         unsigned short ext_data_offset;
326         bool hw_valid;
327         bool hw_en;
328         bool hw_do;
329         bool fifo_en;
330         bool flush;
331         unsigned int batch_flags;
332         unsigned int batch_period_us;
333         unsigned int batch_timeout_us;
334 };
335
336 struct aux_ports {
337         struct aux_port port[AUX_PORT_MAX];
338         s64 bypass_timeout_ns;
339         unsigned int bypass_lock;
340         u8 delay_hw;
341         unsigned short ext_data_n;
342         unsigned char ext_data[AUX_EXT_DATA_REG_MAX];
343         unsigned char clock_i2c;
344         bool reset_i2c;
345         bool reset_fifo;
346 };
347
348 /**
349  *  struct inv_chip_config_s - Cached chip configuration data.
350  *  @fsr:               Full scale range.
351  *  @lpf:               Digital low pass filter frequency.
352  *  @accel_fs:          accel full scale range.
353  *  @has_footer:        MPU3050 specific work around.
354  *  @has_compass:       has compass or not.
355  *  @has_pressure:      has pressure sensor or not.
356  *  @enable:            master enable to enable output
357  *  @accel_enable:      enable accel functionality
358  *  @gyro_enable:       enable gyro functionality
359  *  @is_asleep:         1 if chip is powered down.
360  *  @dmp_on:            dmp is on/off.
361  *  @dmp_int_on:        dmp interrupt on/off.
362  *  @step_indicator_on: step indicate bit added to the sensor or not.
363  *  @dmp_event_int_on:  dmp event interrupt on/off.
364  *  @firmware_loaded:   flag indicate firmware loaded or not.
365  *  @lpa_mod:           low power mode.
366  *  @display_orient_on: display orientation on/off.
367  *  @normal_compass_measure: discard first compass data after reset.
368  *  @normal_pressure_measure: discard first pressure data after reset.
369  *  @smd_enable: disable/enable SMD function.
370  *  @adjust_time: flag to indicate whether adjust chip clock or not.
371  *  @smd_triggered: smd is triggered.
372  *  @lpa_freq:          low power frequency
373  *  @prog_start_addr:   firmware program start address.
374  *  @fifo_rate:         current FIFO update rate.
375  *  @bytes_per_datum: number of bytes for 1 sample data.
376  */
377 struct inv_chip_config_s {
378         u32 fsr:2;
379         u32 lpf:3;
380         u32 accel_fs:2;
381         u32 has_footer:1;
382         u32 has_compass:1;
383         u32 has_pressure:1;
384         u32 enable:1;
385         u32 accel_enable:1;
386         u32 gyro_enable:1;
387         u32 is_asleep:1;
388         u32 dmp_on:1;
389         u32 dmp_int_on:1;
390         u32 dmp_event_int_on:1;
391         u32 step_indicator_on:1;
392         u32 firmware_loaded:1;
393         u32 lpa_mode:1;
394         u32 display_orient_on:1;
395         u32 normal_compass_measure:1;
396         u32 normal_pressure_measure:1;
397         u32 smd_enable:1;
398         u32 adjust_time:1;
399         u32 smd_triggered:1;
400         u16 lpa_freq;
401         u16 prog_start_addr;
402         u16 fifo_rate;
403         u16 bytes_per_datum;
404
405         s64 gyro_start_delay_ns;
406         unsigned int lpa_delay_us;
407         unsigned int bypass_timeout_ms;
408         unsigned int temp_fifo_en;
409         unsigned int fifo_thr;
410 };
411
412 /**
413  *  struct inv_chip_info_s - Chip related information.
414  *  @product_id:        Product id.
415  *  @product_revision:  Product revision.
416  *  @silicon_revision:  Silicon revision.
417  *  @software_revision: software revision.
418  *  @multi:             accel specific multiplier.
419  *  @compass_sens:      compass sensitivity.
420  *  @gyro_sens_trim:    Gyro sensitivity trim factor.
421  *  @accel_sens_trim:    accel sensitivity trim factor.
422  */
423 struct inv_chip_info_s {
424         u8 product_id;
425         u8 product_revision;
426         u8 silicon_revision;
427         u8 software_revision;
428         u8 multi;
429         u8 compass_sens[3];
430         u32 gyro_sens_trim;
431         u32 accel_sens_trim;
432 };
433
434 /**
435  * struct self_test_setting - self test settables from sysfs
436  * samples: number of samples used in self test.
437  * threshold: threshold fail/pass criterion in self test.
438  *            This value is in the percentage multiplied by 100.
439  *            So 14% would be 14.
440  */
441 struct self_test_setting {
442         u16 samples;
443         u16 threshold;
444 };
445
446 struct nvi_state {
447         struct i2c_client *i2c;
448         void *nvs_st[DEV_N];
449         struct nvs_fn_if *nvs;
450         struct sensor_cfg cfg[DEV_N];
451         struct regulator_bulk_data vreg[2];
452         struct notifier_block nb_vreg[2];
453         struct mpu_platform_data pdata;
454         const struct nvi_hal *hal;      /* Hardware Abstraction Layer */
455         struct nvi_rc rc;
456         struct aux_ports aux;
457         s64 vreg_en_ts[2];
458         unsigned int sts;               /* status flags */
459         unsigned int errs;              /* error count */
460         unsigned int info;              /* info data to return */
461         unsigned int dbg;               /* debug flags */
462         unsigned int master_enable;     /* global enable */
463         unsigned int enabled[DEV_N_AUX]; /* enable status */
464         unsigned int delay_us[DEV_N_AUX]; /* device sampling delay */
465         unsigned int smplrt_delay_us[DEV_N_AUX]; /* source sampling delay */
466         unsigned int batch_flags[DEV_N]; /* batch flags */
467         unsigned int batch_timeout_us[DEV_N]; /* batch timeout us */
468         unsigned int fsync[DEV_N];      /* FSYNC configuration */
469         unsigned short i2c_addr;        /* I2C address */
470         bool rc_dis;
471         bool irq_dis;
472         bool flush[DEV_N];
473         int pm;
474
475         struct inv_chip_config_s chip_config;
476         struct inv_chip_info_s chip_info;
477         struct self_test_setting self_test;
478         int accel_bias[AXIS_N];
479         int gyro_bias[AXIS_N];
480         s16 input_accel_offset[AXIS_N];
481         s16 input_gyro_offset[AXIS_N];
482         s16 rom_accel_offset[AXIS_N];
483         s16 rom_gyro_offset[AXIS_N];
484         u8 st_data_accel[AXIS_N];
485         u8 st_data_gyro[AXIS_N];
486
487         unsigned int irq_storm_n;
488         atomic64_t ts_irq;
489         s64 ts_last;
490         s64 ts_gyro;
491         u16 fifo_sample_size;
492         u8 buf[NVI_FIFO_SAMPLE_SIZE_MAX * 2]; /* (* 2)=FIFO OVERFLOW OFFSET */
493 #ifdef NVI_I2C_DEBUG_INTERFACE
494         u16 dbg_i2c_addr;
495         u8 dbg_bank;
496         u8 dbg_reg;
497 #endif /* NVI_I2C_DEBUG_INTERFACE */
498 };
499
500 s64 nvi_get_time_ns(void);
501 int nvi_i2c_read(struct nvi_state *st, u16 addr, u8 reg, u16 len, u8 *buf);
502 int nvi_i2c_rd(struct nvi_state *st, u8 bank, u8 reg, u16 len, u8 *buf);
503 int nvi_i2c_write(struct nvi_state *st, u16 addr, u16 len, u8 *buf);
504 int nvi_i2c_wr(struct nvi_state *st, u8 reg, u8 val);
505 int nvi_wr_accel_offset(struct nvi_state *st, unsigned int axis, u16 offset);
506 int nvi_wr_gyro_offset(struct nvi_state *st, unsigned int axis, u16 offset);
507 int nvi_wr_gyro_config(struct nvi_state *st, u8 test, u8 avg, u8 fsr, u8 lpf);
508 int nvi_wr_accel_config(struct nvi_state *st, u8 test, u8 avg, u8 fsr, u8 lpf);
509 int nvi_wr_smplrt_div(struct nvi_state *st, unsigned int dev, u16 val);
510 int nvi_wr_lp_config(struct nvi_state *st, u8 val);
511 int nvi_wr_fifo_en(struct nvi_state *st, u16 fifo_en);
512 int nvi_int_able(struct nvi_state *st, bool enable);
513 int nvi_wr_user_ctrl(struct nvi_state *st, u8 user_ctrl);
514 int nvi_user_ctrl_en(struct nvi_state *st, bool fifo_enable, bool i2c_enable);
515 int nvi_wr_pwr_mgmt_1(struct nvi_state *st, u8 pwr_mgmt_1);
516 int nvi_pm_wr(struct nvi_state *st, u8 pwr_mgmt_1, u8 pwr_mgmt_2, u8 lpa);
517 int nvi_pm(struct nvi_state *st, int pm_req);
518 int nvi_en(struct nvi_state *st);
519
520 int inv_icm_init(struct nvi_state *st);
521 int inv_get_silicon_rev_mpu6050(struct nvi_state *st);
522 int inv_get_silicon_rev_mpu6500(struct nvi_state *st);
523 int inv_hw_self_test(struct nvi_state *st, int snsr_id);
524
525 u16 inv_dmp_get_address(u16 key);
526
527 #endif /* _NVI_H_ */
528