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