19dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/*
29dbf091da080508e9f632d307f357beb79a0766bManuel Stahl * itg3200.h -- support InvenSense ITG3200
39dbf091da080508e9f632d307f357beb79a0766bManuel Stahl *              Digital 3-Axis Gyroscope driver
49dbf091da080508e9f632d307f357beb79a0766bManuel Stahl *
59dbf091da080508e9f632d307f357beb79a0766bManuel Stahl * Copyright (c) 2011 Christian Strobel <christian.strobel@iis.fraunhofer.de>
69dbf091da080508e9f632d307f357beb79a0766bManuel Stahl * Copyright (c) 2011 Manuel Stahl <manuel.stahl@iis.fraunhofer.de>
79dbf091da080508e9f632d307f357beb79a0766bManuel Stahl * Copyright (c) 2012 Thorsten Nowak <thorsten.nowak@iis.fraunhofer.de>
89dbf091da080508e9f632d307f357beb79a0766bManuel Stahl *
99dbf091da080508e9f632d307f357beb79a0766bManuel Stahl * This program is free software; you can redistribute it and/or modify
109dbf091da080508e9f632d307f357beb79a0766bManuel Stahl * it under the terms of the GNU General Public License version 2 as
119dbf091da080508e9f632d307f357beb79a0766bManuel Stahl * published by the Free Software Foundation.
129dbf091da080508e9f632d307f357beb79a0766bManuel Stahl */
139dbf091da080508e9f632d307f357beb79a0766bManuel Stahl
149dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#ifndef I2C_ITG3200_H_
159dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define I2C_ITG3200_H_
169dbf091da080508e9f632d307f357beb79a0766bManuel Stahl
179dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#include <linux/iio/iio.h>
189dbf091da080508e9f632d307f357beb79a0766bManuel Stahl
199dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* Register with I2C address (34h) */
209dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_REG_ADDRESS		0x00
219dbf091da080508e9f632d307f357beb79a0766bManuel Stahl
229dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* Sample rate divider
239dbf091da080508e9f632d307f357beb79a0766bManuel Stahl * Range: 0 to 255
249dbf091da080508e9f632d307f357beb79a0766bManuel Stahl * Default value: 0x00 */
259dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_REG_SAMPLE_RATE_DIV	0x15
269dbf091da080508e9f632d307f357beb79a0766bManuel Stahl
279dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* Digital low pass filter settings */
289dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_REG_DLPF		0x16
299dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* DLPF full scale range */
309dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_DLPF_FS_SEL_2000	0x18
319dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* Bandwidth (Hz) and internal sample rate
329dbf091da080508e9f632d307f357beb79a0766bManuel Stahl * (kHz) of DLPF */
339dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_DLPF_256_8		0x00
349dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_DLPF_188_1		0x01
359dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_DLPF_98_1		0x02
369dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_DLPF_42_1		0x03
379dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_DLPF_20_1		0x04
389dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_DLPF_10_1		0x05
399dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_DLPF_5_1		0x06
409dbf091da080508e9f632d307f357beb79a0766bManuel Stahl
419dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_DLPF_CFG_MASK		0x07
429dbf091da080508e9f632d307f357beb79a0766bManuel Stahl
439dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* Configuration for interrupt operations */
449dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_REG_IRQ_CONFIG		0x17
459dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* Logic level */
469dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_IRQ_ACTIVE_LOW		0x80
479dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_IRQ_ACTIVE_HIGH		0x00
489dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* Drive type */
499dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_IRQ_OPEN_DRAIN		0x40
509dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_IRQ_PUSH_PULL		0x00
519dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* Latch mode */
529dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_IRQ_LATCH_UNTIL_CLEARED	0x20
539dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_IRQ_LATCH_50US_PULSE	0x00
549dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* Latch clear method */
559dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_IRQ_LATCH_CLEAR_ANY	0x10
569dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_IRQ_LATCH_CLEAR_STATUS	0x00
579dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* Enable interrupt when device is ready */
589dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_IRQ_DEVICE_RDY_ENABLE	0x04
599dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* Enable interrupt when data is available */
609dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_IRQ_DATA_RDY_ENABLE	0x01
619dbf091da080508e9f632d307f357beb79a0766bManuel Stahl
629dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* Determine the status of ITG-3200 interrupts */
639dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_REG_IRQ_STATUS		0x1A
649dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* Status of 'device is ready'-interrupt */
659dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_IRQ_DEVICE_RDY_STATUS	0x04
669dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* Status of 'data is available'-interrupt */
679dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_IRQ_DATA_RDY_STATUS	0x01
689dbf091da080508e9f632d307f357beb79a0766bManuel Stahl
699dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* Sensor registers */
709dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_REG_TEMP_OUT_H		0x1B
719dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_REG_TEMP_OUT_L		0x1C
729dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_REG_GYRO_XOUT_H		0x1D
739dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_REG_GYRO_XOUT_L		0x1E
749dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_REG_GYRO_YOUT_H		0x1F
759dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_REG_GYRO_YOUT_L		0x20
769dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_REG_GYRO_ZOUT_H		0x21
779dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_REG_GYRO_ZOUT_L		0x22
789dbf091da080508e9f632d307f357beb79a0766bManuel Stahl
799dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* Power management */
809dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_REG_POWER_MANAGEMENT	0x3E
819dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* Reset device and internal registers to the
829dbf091da080508e9f632d307f357beb79a0766bManuel Stahl * power-up-default settings */
839dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_RESET			0x80
849dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* Enable low power sleep mode */
859dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_SLEEP			0x40
869dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* Put according gyroscope in standby mode */
879dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_STANDBY_GYRO_X		0x20
889dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_STANDBY_GYRO_Y		0x10
899dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_STANDBY_GYRO_Z		0x08
909dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/* Determine the device clock source */
919dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_CLK_INTERNAL		0x00
929dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_CLK_GYRO_X		0x01
939dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_CLK_GYRO_Y		0x02
949dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_CLK_GYRO_Z		0x03
959dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_CLK_EXT_32K		0x04
969dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#define ITG3200_CLK_EXT_19M		0x05
979dbf091da080508e9f632d307f357beb79a0766bManuel Stahl
989dbf091da080508e9f632d307f357beb79a0766bManuel Stahl
999dbf091da080508e9f632d307f357beb79a0766bManuel Stahl/**
1009dbf091da080508e9f632d307f357beb79a0766bManuel Stahl * struct itg3200 - device instance specific data
1019dbf091da080508e9f632d307f357beb79a0766bManuel Stahl * @i2c:    actual i2c_client
1029dbf091da080508e9f632d307f357beb79a0766bManuel Stahl * @trig:   data ready trigger from itg3200 pin
1039dbf091da080508e9f632d307f357beb79a0766bManuel Stahl **/
1049dbf091da080508e9f632d307f357beb79a0766bManuel Stahlstruct itg3200 {
1059dbf091da080508e9f632d307f357beb79a0766bManuel Stahl	struct i2c_client	*i2c;
1069dbf091da080508e9f632d307f357beb79a0766bManuel Stahl	struct iio_trigger	*trig;
1079dbf091da080508e9f632d307f357beb79a0766bManuel Stahl};
1089dbf091da080508e9f632d307f357beb79a0766bManuel Stahl
1099dbf091da080508e9f632d307f357beb79a0766bManuel Stahlenum ITG3200_SCAN_INDEX {
1109dbf091da080508e9f632d307f357beb79a0766bManuel Stahl	ITG3200_SCAN_TEMP,
1119dbf091da080508e9f632d307f357beb79a0766bManuel Stahl	ITG3200_SCAN_GYRO_X,
1129dbf091da080508e9f632d307f357beb79a0766bManuel Stahl	ITG3200_SCAN_GYRO_Y,
1139dbf091da080508e9f632d307f357beb79a0766bManuel Stahl	ITG3200_SCAN_GYRO_Z,
1149dbf091da080508e9f632d307f357beb79a0766bManuel Stahl	ITG3200_SCAN_ELEMENTS,
1159dbf091da080508e9f632d307f357beb79a0766bManuel Stahl};
1169dbf091da080508e9f632d307f357beb79a0766bManuel Stahl
1179dbf091da080508e9f632d307f357beb79a0766bManuel Stahlint itg3200_write_reg_8(struct iio_dev *indio_dev,
1189dbf091da080508e9f632d307f357beb79a0766bManuel Stahl		u8 reg_address, u8 val);
1199dbf091da080508e9f632d307f357beb79a0766bManuel Stahl
1209dbf091da080508e9f632d307f357beb79a0766bManuel Stahlint itg3200_read_reg_8(struct iio_dev *indio_dev,
1219dbf091da080508e9f632d307f357beb79a0766bManuel Stahl		u8 reg_address, u8 *val);
1229dbf091da080508e9f632d307f357beb79a0766bManuel Stahl
1239dbf091da080508e9f632d307f357beb79a0766bManuel Stahl
1249dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#ifdef CONFIG_IIO_BUFFER
1259dbf091da080508e9f632d307f357beb79a0766bManuel Stahl
1269dbf091da080508e9f632d307f357beb79a0766bManuel Stahlvoid itg3200_remove_trigger(struct iio_dev *indio_dev);
1279dbf091da080508e9f632d307f357beb79a0766bManuel Stahlint itg3200_probe_trigger(struct iio_dev *indio_dev);
1289dbf091da080508e9f632d307f357beb79a0766bManuel Stahl
1299dbf091da080508e9f632d307f357beb79a0766bManuel Stahlint itg3200_buffer_configure(struct iio_dev *indio_dev);
1309dbf091da080508e9f632d307f357beb79a0766bManuel Stahlvoid itg3200_buffer_unconfigure(struct iio_dev *indio_dev);
1319dbf091da080508e9f632d307f357beb79a0766bManuel Stahl
1329dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#else /* CONFIG_IIO_BUFFER */
1339dbf091da080508e9f632d307f357beb79a0766bManuel Stahl
1349dbf091da080508e9f632d307f357beb79a0766bManuel Stahlstatic inline void itg3200_remove_trigger(struct iio_dev *indio_dev)
1359dbf091da080508e9f632d307f357beb79a0766bManuel Stahl{
1369dbf091da080508e9f632d307f357beb79a0766bManuel Stahl}
1379dbf091da080508e9f632d307f357beb79a0766bManuel Stahl
1389dbf091da080508e9f632d307f357beb79a0766bManuel Stahlstatic inline int itg3200_probe_trigger(struct iio_dev *indio_dev)
1399dbf091da080508e9f632d307f357beb79a0766bManuel Stahl{
1409dbf091da080508e9f632d307f357beb79a0766bManuel Stahl	return 0;
1419dbf091da080508e9f632d307f357beb79a0766bManuel Stahl}
1429dbf091da080508e9f632d307f357beb79a0766bManuel Stahl
1439dbf091da080508e9f632d307f357beb79a0766bManuel Stahlstatic inline int itg3200_buffer_configure(struct iio_dev *indio_dev)
1449dbf091da080508e9f632d307f357beb79a0766bManuel Stahl{
1459dbf091da080508e9f632d307f357beb79a0766bManuel Stahl	return 0;
1469dbf091da080508e9f632d307f357beb79a0766bManuel Stahl}
1479dbf091da080508e9f632d307f357beb79a0766bManuel Stahl
1489dbf091da080508e9f632d307f357beb79a0766bManuel Stahlstatic inline void itg3200_buffer_unconfigure(struct iio_dev *indio_dev)
1499dbf091da080508e9f632d307f357beb79a0766bManuel Stahl{
1509dbf091da080508e9f632d307f357beb79a0766bManuel Stahl}
1519dbf091da080508e9f632d307f357beb79a0766bManuel Stahl
152e6251fc244a18a53830f38de84e4fcaee2f58662Paul Bolle#endif  /* CONFIG_IIO_BUFFER */
1539dbf091da080508e9f632d307f357beb79a0766bManuel Stahl
1549dbf091da080508e9f632d307f357beb79a0766bManuel Stahl#endif /* ITG3200_H_ */
155