Driver: Misc: Sensors: MPU: enable kxtf9 and ak8975
[linux-2.6.git] / include / linux / mpu.h
1 /*
2  $License:
3     Copyright (C) 2010 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 #ifdef __KERNEL__
24 #include <linux/types.h>
25 #endif
26
27 #ifdef M_HW
28 #include "mpu6000.h"
29 #else
30 #include "mpu3050.h"
31 #endif
32
33 /* Number of axes on each sensor */
34 #define GYRO_NUM_AXES    (3)
35 #define ACCEL_NUM_AXES   (3)
36 #define COMPASS_NUM_AXES (3)
37
38 /* IOCTL commands for /dev/mpu */
39 #define MPU_SET_MPU_CONFIG          (0x00)
40 #define MPU_SET_INT_CONFIG          (0x01)
41 #define MPU_SET_EXT_SYNC            (0x02)
42 #define MPU_SET_FULL_SCALE          (0x03)
43 #define MPU_SET_LPF                 (0x04)
44 #define MPU_SET_CLK_SRC             (0x05)
45 #define MPU_SET_DIVIDER             (0x06)
46 #define MPU_SET_LEVEL_SHIFTER       (0x07)
47 #define MPU_SET_DMP_ENABLE          (0x08)
48 #define MPU_SET_FIFO_ENABLE         (0x09)
49 #define MPU_SET_DMP_CFG1            (0x0a)
50 #define MPU_SET_DMP_CFG2            (0x0b)
51 #define MPU_SET_OFFSET_TC           (0x0c)
52 #define MPU_SET_RAM                 (0x0d)
53
54 #define MPU_SET_PLATFORM_DATA       (0x0e)
55
56 #define MPU_GET_MPU_CONFIG          (0x80)
57 #define MPU_GET_INT_CONFIG          (0x81)
58 #define MPU_GET_EXT_SYNC            (0x82)
59 #define MPU_GET_FULL_SCALE          (0x83)
60 #define MPU_GET_LPF                 (0x84)
61 #define MPU_GET_CLK_SRC             (0x85)
62 #define MPU_GET_DIVIDER             (0x86)
63 #define MPU_GET_LEVEL_SHIFTER       (0x87)
64 #define MPU_GET_DMP_ENABLE          (0x88)
65 #define MPU_GET_FIFO_ENABLE         (0x89)
66 #define MPU_GET_DMP_CFG1            (0x8a)
67 #define MPU_GET_DMP_CFG2            (0x8b)
68 #define MPU_GET_OFFSET_TC           (0x8c)
69 #define MPU_GET_RAM                 (0x8d)
70
71 #define MPU_READ_REGISTER           (0x40)
72 #define MPU_WRITE_REGISTER          (0x41)
73 #define MPU_READ_MEMORY             (0x42)
74 #define MPU_WRITE_MEMORY            (0x43)
75
76 #define MPU_SUSPEND                 (0x44)
77 #define MPU_RESUME                  (0x45)
78 #define MPU_READ_COMPASS            (0x46)
79 #define MPU_READ_ACCEL              (0x47)
80 #define MPU_READ_PRESSURE           (0x48)
81
82 #define MPU_CONFIG_ACCEL            (0x20)
83 #define MPU_CONFIG_COMPASS          (0x21)
84 #define MPU_CONFIG_PRESSURE         (0x22)
85
86 /* Structure for the following IOCTL's:
87    MPU_SET_RAM
88    MPU_GET_RAM
89    MPU_READ_REGISTER
90    MPU_WRITE_REGISTER
91    MPU_READ_MEMORY
92    MPU_WRITE_MEMORY
93 */
94 struct mpu_read_write {
95         unsigned short address;
96         unsigned short length;
97         unsigned char *data;
98 };
99
100 /* Structure for the following IOCTL's
101    MPU_SUSPEND
102    MPU_RESUME
103 */
104 struct mpu_suspend_resume {
105         int gyro;
106         int accel;
107         int compass;
108         int pressure;
109 };
110
111 struct irq_data {
112         int interruptcount;
113         unsigned long long irqtime;
114         int data_type;
115         int data_size;
116         void *data;
117 };
118 enum ext_slave_config_key {
119     MPU_SLAVE_CONFIG_ODR_SUSPEND,
120     MPU_SLAVE_CONFIG_ODR_RESUME,
121     MPU_SLAVE_CONFIG_FSR_SUSPEND,
122     MPU_SLAVE_CONFIG_FSR_RESUME,
123     MPU_SLAVE_CONFIG_MOT_THS,
124     MPU_SLAVE_CONFIG_NMOT_THS,
125     MPU_SLAVE_CONFIG_MOT_DUR,
126     MPU_SLAVE_CONFIG_NMOT_DUR,
127     MPU_SLAVE_CONFIG_NUM_CONFIG_KEYS,
128 };
129 /* Structure for the following IOCTS's
130  * MPU_CONFIG_ACCEL
131  * MPU_CONFIG_COMPASS
132  * MPU_CONFIG_PRESSURE
133  */
134 struct ext_slave_config {
135         int key;
136         int len;
137         void *data;
138 };
139
140 enum ext_slave_type {
141         EXT_SLAVE_TYPE_GYROSCOPE,
142         EXT_SLAVE_TYPE_ACCELEROMETER,
143         EXT_SLAVE_TYPE_COMPASS,
144         EXT_SLAVE_TYPE_PRESSURE,
145         /*EXT_SLAVE_TYPE_TEMPERATURE */
146 };
147
148 enum ext_slave_id {
149         ID_INVALID = 0,
150
151         ACCEL_ID_LIS331,
152         ACCEL_ID_LSM303,
153         ACCEL_ID_KXSD9,
154         ACCEL_ID_KXTF9,
155         ACCEL_ID_BMA150,
156         ACCEL_ID_BMA222,
157         ACCEL_ID_ADI346,
158         ACCEL_ID_MMA8450,
159         ACCEL_ID_MMA8451,
160         ACCEL_ID_MPU6000,
161
162         COMPASS_ID_AKM,
163         COMPASS_ID_AMI30X,
164         COMPASS_ID_YAS529,
165         COMPASS_ID_HMC5883,
166         COMPASS_ID_LSM303,
167         COMPASS_ID_MMC314X,
168         COMPASS_ID_HSCDTD002B,
169
170         PRESSURE_ID_BMA085,
171 };
172
173 enum ext_slave_endian {
174         EXT_SLAVE_BIG_ENDIAN,
175         EXT_SLAVE_LITTLE_ENDIAN,
176         EXT_SLAVE_FS8_BIG_ENDIAN,
177         EXT_SLAVE_FS16_BIG_ENDIAN,
178 };
179
180 enum ext_slave_bus {
181         EXT_SLAVE_BUS_INVALID = -1,
182         EXT_SLAVE_BUS_PRIMARY = 0,
183         EXT_SLAVE_BUS_SECONDARY = 1
184 };
185
186
187 /**
188  *  struct ext_slave_platform_data - Platform data for mpu3050 slave devices
189  *
190  *  @get_slave_descr: Function pointer to retrieve the struct ext_slave_descr
191  *                    for this slave
192  *  @irq: the irq number attached to the slave if any.
193  *  @adapt_num: the I2C adapter number.
194  *  @bus: the bus the slave is attached to: enum ext_slave_bus
195  *  @address: the I2C slave address of the slave device.
196  *  @orientation: the mounting matrix of the device relative to MPU.
197  *  @irq_data: private data for the slave irq handler
198  *  @private_data: additional data, user customizable.  Not touched by the MPU
199  *                 driver.
200  *
201  * The orientation matricies are 3x3 rotation matricies
202  * that are applied to the data to rotate from the mounting orientation to the
203  * platform orientation.  The values must be one of 0, 1, or -1 and each row and
204  * column should have exactly 1 non-zero value.
205  */
206 struct ext_slave_platform_data {
207         struct ext_slave_descr *(*get_slave_descr) (void);
208         int irq;
209         int adapt_num;
210         int bus;
211         unsigned char address;
212         signed char orientation[9];
213         void *irq_data;
214         void *private_data;
215 };
216
217
218 struct tFixPntRange {
219         long mantissa;
220         long fraction;
221 };
222
223 /**
224  *  struct ext_slave_descr - Description of the slave device for programming.
225  *
226  *  @suspend:   function pointer to put the device in suspended state
227  *  @resume:    function pointer to put the device in running state
228  *  @read:      function that reads the device data
229  *  @init:      function used to preallocate memory used by the driver
230  *  @exit:      function used to free memory allocated for the driver
231  *  @config:    function used to configure the device
232  *
233  *  @name:      text name of the device
234  *  @type:      device type. enum ext_slave_type
235  *  @id:        enum ext_slave_id
236  *  @reg:       starting register address to retrieve data.
237  *  @len:       length in bytes of the sensor data.  Should be 6.
238  *  @endian:    byte order of the data. enum ext_slave_endian
239  *  @range:     full scale range of the slave ouput: struct tFixPntRange
240  *
241  *  Defines the functions and information about the slave the mpu3050 needs to
242  *  use the slave device.
243  */
244 struct ext_slave_descr {
245         int (*init) (void *mlsl_handle,
246                      struct ext_slave_descr *slave,
247                      struct ext_slave_platform_data *pdata);
248         int (*exit) (void *mlsl_handle,
249                      struct ext_slave_descr *slave,
250                      struct ext_slave_platform_data *pdata);
251         int (*suspend) (void *mlsl_handle,
252                         struct ext_slave_descr *slave,
253                         struct ext_slave_platform_data *pdata);
254         int (*resume) (void *mlsl_handle,
255                        struct ext_slave_descr *slave,
256                        struct ext_slave_platform_data *pdata);
257         int (*read) (void *mlsl_handle,
258                      struct ext_slave_descr *slave,
259                      struct ext_slave_platform_data *pdata,
260                      unsigned char *data);
261         int (*config) (void *mlsl_handle,
262                        struct ext_slave_descr *slave,
263                        struct ext_slave_platform_data *pdata,
264                        struct ext_slave_config *config);
265
266         char *name;
267         unsigned char type;
268         unsigned char id;
269         unsigned char reg;
270         unsigned int len;
271         unsigned char endian;
272         struct tFixPntRange range;
273 };
274
275 /**
276  * struct mpu3050_platform_data - Platform data for the mpu3050 driver
277  * @int_config:         Bits [7:3] of the int config register.
278  * @orientation:        Orientation matrix of the gyroscope
279  * @level_shifter:      0: VLogic, 1: VDD
280  * @accel:              Accel platform data
281  * @compass:            Compass platform data
282  * @pressure:           Pressure platform data
283  *
284  * Contains platform specific information on how to configure the MPU3050 to
285  * work on this platform.  The orientation matricies are 3x3 rotation matricies
286  * that are applied to the data to rotate from the mounting orientation to the
287  * platform orientation.  The values must be one of 0, 1, or -1 and each row and
288  * column should have exactly 1 non-zero value.
289  */
290 struct mpu3050_platform_data {
291         unsigned char int_config;
292         signed char orientation[MPU_NUM_AXES * MPU_NUM_AXES];
293         unsigned char level_shifter;
294         struct ext_slave_platform_data accel;
295         struct ext_slave_platform_data compass;
296         struct ext_slave_platform_data pressure;
297 };
298
299
300 /*
301     Accelerometer
302 */
303 #define get_accel_slave_descr NULL
304
305 #ifdef CONFIG_SENSORS_ADXL346   /* ADI accelerometer */
306 struct ext_slave_descr *adxl346_get_slave_descr(void);
307 #undef get_accel_slave_descr
308 #define get_accel_slave_descr adxl346_get_slave_descr
309 #endif
310
311 #ifdef CONFIG_SENSORS_BMA150    /* Bosch accelerometer */
312 struct ext_slave_descr *bma150_get_slave_descr(void);
313 #undef get_accel_slave_descr
314 #define get_accel_slave_descr bma150_get_slave_descr
315 #endif
316
317 #ifdef CONFIG_SENSORS_BMA222    /* Bosch 222 accelerometer */
318 struct ext_slave_descr *bma222_get_slave_descr(void);
319 #undef get_accel_slave_descr
320 #define get_accel_slave_descr bma222_get_slave_descr
321 #endif
322
323 #ifdef CONFIG_SENSORS_KXSD9     /* Kionix accelerometer */
324 struct ext_slave_descr *kxsd9_get_slave_descr(void);
325 #undef get_accel_slave_descr
326 #define get_accel_slave_descr kxsd9_get_slave_descr
327 #endif
328
329 #ifdef CONFIG_SENSORS_KXTF9_MPU /* Kionix accelerometer */
330 struct ext_slave_descr *kxtf9_get_slave_descr(void);
331 #undef get_accel_slave_descr
332 #define get_accel_slave_descr kxtf9_get_slave_descr
333 #endif
334
335 #ifdef CONFIG_SENSORS_LIS331DLH /* ST accelerometer */
336 struct ext_slave_descr *lis331dlh_get_slave_descr(void);
337 #undef get_accel_slave_descr
338 #define get_accel_slave_descr lis331dlh_get_slave_descr
339 #endif
340
341 #ifdef CONFIG_SENSORS_LSM303DLHA        /* ST accelerometer */
342 struct ext_slave_descr *lsm303dlha_get_slave_descr(void);
343 #undef get_accel_slave_descr
344 #define get_accel_slave_descr lsm303dlha_get_slave_descr
345 #endif
346
347 /* MPU6000 Accel */
348 #if defined(CONFIG_SENSORS_MPU6000) || defined(CONFIG_SENSORS_MPU6000_MODULE)
349 struct ext_slave_descr *mantis_get_slave_descr(void);
350 #undef get_accel_slave_descr
351 #define get_accel_slave_descr mantis_get_slave_descr
352 #endif
353
354 #ifdef CONFIG_SENSORS_MMA8450   /* Freescale accelerometer */
355 struct ext_slave_descr *mma8450_get_slave_descr(void);
356 #undef get_accel_slave_descr
357 #define get_accel_slave_descr mma8450_get_slave_descr
358 #endif
359
360 #ifdef CONFIG_SENSORS_MMA8451   /* Freescale accelerometer */
361 struct ext_slave_descr *mma8451_get_slave_descr(void);
362 #undef get_accel_slave_descr
363 #define get_accel_slave_descr mma8451_get_slave_descr
364 #endif
365
366
367 /*
368     Compass
369 */
370 #define get_compass_slave_descr NULL
371
372 #ifdef CONFIG_SENSORS_AK8975_MPU        /* AKM compass */
373 struct ext_slave_descr *ak8975_get_slave_descr(void);
374 #undef get_compass_slave_descr
375 #define get_compass_slave_descr ak8975_get_slave_descr
376 #endif
377
378 #ifdef CONFIG_SENSORS_AMI30X    /* AICHI Steel compass */
379 struct ext_slave_descr *ami30x_get_slave_descr(void);
380 #undef get_compass_slave_descr
381 #define get_compass_slave_descr ami30x_get_slave_descr
382 #endif
383
384 #ifdef CONFIG_SENSORS_HMC5883   /* Honeywell compass */
385 struct ext_slave_descr *hmc5883_get_slave_descr(void);
386 #undef get_compass_slave_descr
387 #define get_compass_slave_descr hmc5883_get_slave_descr
388 #endif
389
390 #ifdef CONFIG_SENSORS_MMC314X   /* MEMSIC compass */
391 struct ext_slave_descr *mmc314x_get_slave_descr(void);
392 #undef get_compass_slave_descr
393 #define get_compass_slave_descr mmc314x_get_slave_descr
394 #endif
395
396 #ifdef CONFIG_SENSORS_LSM303DLHM        /* ST compass */
397 struct ext_slave_descr *lsm303dlhm_get_slave_descr(void);
398 #undef get_compass_slave_descr
399 #define get_compass_slave_descr lsm303dlhm_get_slave_descr
400 #endif
401
402 #ifdef CONFIG_SENSORS_YAS529    /* Yamaha compass */
403 struct ext_slave_descr *yas529_get_slave_descr(void);
404 #undef get_compass_slave_descr
405 #define get_compass_slave_descr yas529_get_slave_descr
406 #endif
407
408 #ifdef CONFIG_SENSORS_HSCDTD002B        /* Alps compass */
409 struct ext_slave_descr *hscdtd002b_get_slave_descr(void);
410 #undef get_compass_slave_descr
411 #define get_compass_slave_descr hscdtd002b_get_slave_descr
412 #endif
413
414 /*
415     Pressure
416 */
417 #define get_pressure_slave_descr NULL
418
419 #ifdef CONFIG_SENSORS_BMA085    /* BMA pressure */
420 struct ext_slave_descr *bma085_get_slave_descr(void);
421 #undef get_pressure_slave_descr
422 #define get_pressure_slave_descr bma085_get_slave_descr
423 #endif
424
425 #endif                          /* __MPU_H_ */