input: misc: Invensense MPU 5.0.1 driver
[linux-2.6.git] / include / linux / mpu.h
1 /*
2 * Copyright (C) 2012 Invensense, Inc.
3 *
4 * This software is licensed under the terms of the GNU General Public
5 * License version 2, as published by the Free Software Foundation, and
6 * may be copied, distributed, and modified under those terms.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 * GNU General Public License for more details.
12 *
13 */
14
15 /**
16  *  @addtogroup  DRIVERS
17  *  @brief       Hardware drivers.
18  *
19  *  @{
20  *      @file    mpu.h
21  *      @brief   mpu definition
22  */
23
24 #ifndef __MPU_H_
25 #define __MPU_H_
26
27 #ifdef __KERNEL__
28 #include <linux/types.h>
29 #include <linux/ioctl.h>
30 #elif defined LINUX
31 #include <sys/ioctl.h>
32 #include <linux/types.h>
33 #else
34 #include "mltypes.h"
35 #endif
36
37 struct mpu_read_write {
38         /* Memory address or register address depending on ioctl */
39         __u16 address;
40         __u16 length;
41         __u8 *data;
42 };
43
44 enum mpuirq_data_type {
45         MPUIRQ_DATA_TYPE_MPU_DATA_READY_IRQ,
46         MPUIRQ_DATA_TYPE_MPU_FIFO_READY_IRQ,
47         MPUIRQ_DATA_TYPE_SLAVE_IRQ,
48         MPUIRQ_DATA_TYPE_PM_EVENT,
49         MPUIRQ_DATA_TYPE_NUM_TYPES,
50 };
51
52 /* User space PM event notification */
53 #define MPU_PM_EVENT_SUSPEND_PREPARE (3)
54 #define MPU_PM_EVENT_POST_SUSPEND    (4)
55
56 /**
57  * struct mpuirq_data - structure to report what and when
58  * @interruptcount      : The number of times this IRQ has occured since open
59  * @irqtime             : monotonic time of the IRQ in ns
60  * @data_type           : The type of this IRQ enum mpuirq_data_type
61  * @data                : Data associated with this IRQ
62  */
63 struct mpuirq_data {
64         __u32 interruptcount;
65         __s64 irqtime_ns;
66         __u32 data_type;
67         __s32 data;
68 };
69
70 enum ext_slave_config_key {
71         /* TODO: Remove these first six. */
72         MPU_SLAVE_CONFIG_ODR_SUSPEND,
73         MPU_SLAVE_CONFIG_ODR_RESUME,
74         MPU_SLAVE_CONFIG_FSR_SUSPEND,
75         MPU_SLAVE_CONFIG_FSR_RESUME,
76         MPU_SLAVE_CONFIG_IRQ_SUSPEND,
77         MPU_SLAVE_CONFIG_IRQ_RESUME,
78         MPU_SLAVE_CONFIG_ODR,
79         MPU_SLAVE_CONFIG_FSR,
80         MPU_SLAVE_CONFIG_MOT_THS,
81         MPU_SLAVE_CONFIG_NMOT_THS,
82         MPU_SLAVE_CONFIG_MOT_DUR,
83         MPU_SLAVE_CONFIG_NMOT_DUR,
84         MPU_SLAVE_CONFIG_IRQ,
85         MPU_SLAVE_WRITE_REGISTERS,
86         MPU_SLAVE_READ_REGISTERS,
87         MPU_SLAVE_CONFIG_INTERNAL_REFERENCE,
88         /* AMI 306 specific config keys */
89         MPU_SLAVE_PARAM,
90         MPU_SLAVE_WINDOW,
91         MPU_SLAVE_READWINPARAMS,
92         MPU_SLAVE_SEARCHOFFSET,
93         /* MPU3050 and MPU6050 Keys */
94         MPU_SLAVE_INT_CONFIG,
95         MPU_SLAVE_EXT_SYNC,
96         MPU_SLAVE_FULL_SCALE,
97         MPU_SLAVE_LPF,
98         MPU_SLAVE_CLK_SRC,
99         MPU_SLAVE_DIVIDER,
100         MPU_SLAVE_DMP_ENABLE,
101         MPU_SLAVE_FIFO_ENABLE,
102         MPU_SLAVE_DMP_CFG1,
103         MPU_SLAVE_DMP_CFG2,
104         MPU_SLAVE_TC,
105         MPU_SLAVE_GYRO,
106         MPU_SLAVE_ADDR,
107         MPU_SLAVE_PRODUCT_REVISION,
108         MPU_SLAVE_SILICON_REVISION,
109         MPU_SLAVE_PRODUCT_ID,
110         MPU_SLAVE_GYRO_SENS_TRIM,
111         MPU_SLAVE_ACCEL_SENS_TRIM,
112         MPU_SLAVE_RAM,
113         /* -------------------------- */
114         MPU_SLAVE_CONFIG_NUM_CONFIG_KEYS
115 };
116
117 /* For the MPU_SLAVE_CONFIG_IRQ_SUSPEND and MPU_SLAVE_CONFIG_IRQ_RESUME */
118 enum ext_slave_config_irq_type {
119         MPU_SLAVE_IRQ_TYPE_NONE,
120         MPU_SLAVE_IRQ_TYPE_MOTION,
121         MPU_SLAVE_IRQ_TYPE_DATA_READY,
122 };
123
124 /* Structure for the following IOCTS's
125  * MPU_CONFIG_GYRO
126  * MPU_CONFIG_ACCEL
127  * MPU_CONFIG_COMPASS
128  * MPU_CONFIG_PRESSURE
129  * MPU_GET_CONFIG_GYRO
130  * MPU_GET_CONFIG_ACCEL
131  * MPU_GET_CONFIG_COMPASS
132  * MPU_GET_CONFIG_PRESSURE
133  *
134  * @key one of enum ext_slave_config_key
135  * @len length of data pointed to by data
136  * @apply zero if communication with the chip is not necessary, false otherwise
137  *        This flag can be used to select cached data or to refresh cashed data
138  *        cache data to be pushed later or push immediately.  If true and the
139  *        slave is on the secondary bus the MPU will first enger bypass mode
140  *        before calling the slaves .config or .get_config funcion
141  * @data pointer to the data to confgure or get
142  */
143 struct ext_slave_config {
144         __u8 key;
145         __u16 len;
146         __u8 apply;
147         void *data;
148 };
149
150 enum ext_slave_type {
151         EXT_SLAVE_TYPE_GYROSCOPE,
152         EXT_SLAVE_TYPE_ACCEL,
153         EXT_SLAVE_TYPE_COMPASS,
154         EXT_SLAVE_TYPE_PRESSURE,
155         /*EXT_SLAVE_TYPE_TEMPERATURE */
156
157         EXT_SLAVE_NUM_TYPES
158 };
159 enum secondary_slave_type {
160         SECONDARY_SLAVE_TYPE_NONE,
161         SECONDARY_SLAVE_TYPE_ACCEL,
162         SECONDARY_SLAVE_TYPE_COMPASS,
163         SECONDARY_SLAVE_TYPE_PRESSURE,
164
165         SECONDARY_SLAVE_TYPE_TYPES
166 };
167
168 enum ext_slave_id {
169         ID_INVALID = 0,
170         GYRO_ID_MPU3050,
171         GYRO_ID_MPU6050A2,
172         GYRO_ID_MPU6050B1,
173         GYRO_ID_MPU6050B1_NO_ACCEL,
174         GYRO_ID_ITG3500,
175
176         ACCEL_ID_LIS331,
177         ACCEL_ID_LSM303DLX,
178         ACCEL_ID_LIS3DH,
179         ACCEL_ID_KXSD9,
180         ACCEL_ID_KXTF9,
181         ACCEL_ID_BMA150,
182         ACCEL_ID_BMA222,
183         ACCEL_ID_BMA250,
184         ACCEL_ID_ADXL34X,
185         ACCEL_ID_MMA8450,
186         ACCEL_ID_MMA845X,
187         ACCEL_ID_MPU6050,
188
189         COMPASS_ID_AK8963,
190         COMPASS_ID_AK8975,
191         COMPASS_ID_AK8972,
192         COMPASS_ID_AMI30X,
193         COMPASS_ID_AMI306,
194         COMPASS_ID_YAS529,
195         COMPASS_ID_YAS530,
196         COMPASS_ID_HMC5883,
197         COMPASS_ID_LSM303DLH,
198         COMPASS_ID_LSM303DLM,
199         COMPASS_ID_MMC314X,
200         COMPASS_ID_HSCDTD002B,
201         COMPASS_ID_HSCDTD004A,
202
203         PRESSURE_ID_BMA085,
204 };
205
206 #define INV_PROD_KEY(ver, rev) (ver * 100 + rev)
207
208 enum ext_slave_endian {
209         EXT_SLAVE_BIG_ENDIAN,
210         EXT_SLAVE_LITTLE_ENDIAN,
211         EXT_SLAVE_FS8_BIG_ENDIAN,
212         EXT_SLAVE_FS16_BIG_ENDIAN,
213 };
214
215 enum ext_slave_bus {
216         EXT_SLAVE_BUS_INVALID = -1,
217         EXT_SLAVE_BUS_PRIMARY = 0,
218         EXT_SLAVE_BUS_SECONDARY = 1
219 };
220
221
222 /**
223  *  struct ext_slave_platform_data - Platform data for mpu3050 and mpu6050
224  *  slave devices
225  *
226  *  @type: the type of slave device based on the enum ext_slave_type
227  *         definitions.
228  *  @irq: the irq number attached to the slave if any.
229  *  @adapt_num: the I2C adapter number.
230  *  @bus: the bus the slave is attached to: enum ext_slave_bus
231  *  @address: the I2C slave address of the slave device.
232  *  @orientation: the mounting matrix of the device relative to MPU.
233  *  @irq_data: private data for the slave irq handler
234  *  @private_data: additional data, user customizable.  Not touched by the MPU
235  *                 driver.
236  *
237  * The orientation matricies are 3x3 rotation matricies
238  * that are applied to the data to rotate from the mounting orientation to the
239  * platform orientation.  The values must be one of 0, 1, or -1 and each row and
240  * column should have exactly 1 non-zero value.
241  */
242 struct ext_slave_platform_data {
243         __u8 type;
244         __u32 irq;
245         __u32 adapt_num;
246         __u32 bus;
247         __u8 address;
248         __s8 orientation[9];
249         void *irq_data;
250         void *private_data;
251 };
252
253 struct fix_pnt_range {
254         __s32 mantissa;
255         __s32 fraction;
256 };
257
258 static inline long range_fixedpoint_to_long_mg(struct fix_pnt_range rng)
259 {
260         return (long)(rng.mantissa * 1000 + rng.fraction / 10);
261 }
262
263 struct ext_slave_read_trigger {
264         __u8 reg;
265         __u8 value;
266 };
267
268 /**
269  *  struct ext_slave_descr - Description of the slave device for programming.
270  *
271  *  @suspend:   function pointer to put the device in suspended state
272  *  @resume:    function pointer to put the device in running state
273  *  @read:      function that reads the device data
274  *  @init:      function used to preallocate memory used by the driver
275  *  @exit:      function used to free memory allocated for the driver
276  *  @config:    function used to configure the device
277  *  @get_config:function used to get the device's configuration
278  *
279  *  @name:      text name of the device
280  *  @type:      device type. enum ext_slave_type
281  *  @id:        enum ext_slave_id
282  *  @read_reg:  starting register address to retrieve data.
283  *  @read_len:  length in bytes of the sensor data.  Typically  6.
284  *  @endian:    byte order of the data. enum ext_slave_endian
285  *  @range:     full scale range of the slave ouput: struct fix_pnt_range
286  *  @trigger:   If reading data first requires writing a register this is the
287  *              data to write.
288  *
289  *  Defines the functions and information about the slave the mpu3050 and
290  *  mpu6050 needs to use the slave device.
291  */
292 struct ext_slave_descr {
293         int (*init) (void *mlsl_handle,
294                      struct ext_slave_descr *slave,
295                      struct ext_slave_platform_data *pdata);
296         int (*exit) (void *mlsl_handle,
297                      struct ext_slave_descr *slave,
298                      struct ext_slave_platform_data *pdata);
299         int (*suspend) (void *mlsl_handle,
300                         struct ext_slave_descr *slave,
301                         struct ext_slave_platform_data *pdata);
302         int (*resume) (void *mlsl_handle,
303                        struct ext_slave_descr *slave,
304                        struct ext_slave_platform_data *pdata);
305         int (*read) (void *mlsl_handle,
306                      struct ext_slave_descr *slave,
307                      struct ext_slave_platform_data *pdata,
308                      __u8 *data);
309         int (*config) (void *mlsl_handle,
310                        struct ext_slave_descr *slave,
311                        struct ext_slave_platform_data *pdata,
312                        struct ext_slave_config *config);
313         int (*get_config) (void *mlsl_handle,
314                            struct ext_slave_descr *slave,
315                            struct ext_slave_platform_data *pdata,
316                            struct ext_slave_config *config);
317
318         char *name;
319         __u8 type;
320         __u8 id;
321         __u8 read_reg;
322         __u8 read_len;
323         __u8 endian;
324         struct fix_pnt_range range;
325         struct ext_slave_read_trigger *trigger;
326 };
327
328 /**
329  * struct mpu_platform_data - Platform data for the mpu driver
330  * @int_config:         Bits [7:3] of the int config register.
331  * @level_shifter:      0: VLogic, 1: VDD
332  * @orientation:        Orientation matrix of the gyroscope
333  * @sec_slave_type:     secondary slave device type, can be compass, accel, etc
334  * @sec_slave_id:       id of the secondary slave device
335  * @secondary_i2c_address: secondary device's i2c address
336  * @secondary_orientation: secondary device's orientation matrix
337  *
338  * Contains platform specific information on how to configure the MPU3050 to
339  * work on this platform.  The orientation matricies are 3x3 rotation matricies
340  * that are applied to the data to rotate from the mounting orientation to the
341  * platform orientation.  The values must be one of 0, 1, or -1 and each row and
342  * column should have exactly 1 non-zero value.
343  */
344 struct mpu_platform_data {
345         __u8 int_config;
346         __u8 level_shifter;
347         __s8 orientation[9];
348         enum secondary_slave_type sec_slave_type;
349         enum ext_slave_id sec_slave_id;
350         __u16 secondary_i2c_addr;
351         __u8 secondary_read_reg;
352         __s8 secondary_orientation[9];
353         __u8 key[16];
354 };
355
356 #endif  /* __MPU_H_ */