mm-only debug patch...
[mmotm.git] / drivers / staging / iio / accel / lis3l02dq.h
blob91a5375408c237a0a19e97e3c10891a8806c7d2d
1 /*
2 * LISL02DQ.h -- support STMicroelectronics LISD02DQ
3 * 3d 2g Linear Accelerometers via SPI
5 * Copyright (c) 2007 Jonathan Cameron <jic23@cam.ac.uk>
7 * Loosely based upon tle62x0.c
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation.
14 #ifndef SPI_LIS3L02DQ_H_
15 #define SPI_LIS3L02DQ_H_
16 #define LIS3L02DQ_READ_REG(a) ((a) | 0x80)
17 #define LIS3L02DQ_WRITE_REG(a) a
19 /* Calibration parameters */
20 #define LIS3L02DQ_REG_OFFSET_X_ADDR 0x16
21 #define LIS3L02DQ_REG_OFFSET_Y_ADDR 0x17
22 #define LIS3L02DQ_REG_OFFSET_Z_ADDR 0x18
24 #define LIS3L02DQ_REG_GAIN_X_ADDR 0x19
25 #define LIS3L02DQ_REG_GAIN_Y_ADDR 0x1A
26 #define LIS3L02DQ_REG_GAIN_Z_ADDR 0x1B
28 /* Control Register (1 of 2) */
29 #define LIS3L02DQ_REG_CTRL_1_ADDR 0x20
30 /* Power ctrl - either bit set corresponds to on*/
31 #define LIS3L02DQ_REG_CTRL_1_PD_ON 0xC0
33 /* Decimation Factor */
34 #define LIS3L02DQ_DEC_MASK 0x30
35 #define LIS3L02DQ_REG_CTRL_1_DF_128 0x00
36 #define LIS3L02DQ_REG_CTRL_1_DF_64 0x10
37 #define LIS3L02DQ_REG_CTRL_1_DF_32 0x20
38 #define LIS3L02DQ_REG_CTRL_1_DF_8 (0x10 | 0x20)
40 /* Self Test Enable */
41 #define LIS3L02DQ_REG_CTRL_1_SELF_TEST_ON 0x08
43 /* Axes enable ctrls */
44 #define LIS3L02DQ_REG_CTRL_1_AXES_Z_ENABLE 0x04
45 #define LIS3L02DQ_REG_CTRL_1_AXES_Y_ENABLE 0x02
46 #define LIS3L02DQ_REG_CTRL_1_AXES_X_ENABLE 0x01
48 /* Control Register (2 of 2) */
49 #define LIS3L02DQ_REG_CTRL_2_ADDR 0x21
51 /* Block Data Update only after MSB and LSB read */
52 #define LIS3L02DQ_REG_CTRL_2_BLOCK_UPDATE 0x40
54 /* Set to big endian output */
55 #define LIS3L02DQ_REG_CTRL_2_BIG_ENDIAN 0x20
57 /* Reboot memory content */
58 #define LIS3L02DQ_REG_CTRL_2_REBOOT_MEMORY 0x10
60 /* Interupt Enable - applies data ready to the RDY pad */
61 #define LIS3L02DQ_REG_CTRL_2_ENABLE_INTERRUPT 0x08
63 /* Enable Data Ready Generation - relationship with previous unclear in docs */
64 #define LIS3L02DQ_REG_CTRL_2_ENABLE_DATA_READY_GENERATION 0x04
66 /* SPI 3 wire mode */
67 #define LIS3L02DQ_REG_CTRL_2_THREE_WIRE_SPI_MODE 0x02
69 /* Data alignment, default is 12 bit right justified
70 * - option for 16 bit left justified */
71 #define LIS3L02DQ_REG_CTRL_2_DATA_ALIGNMENT_16_BIT_LEFT_JUSTIFIED 0x01
73 /* Interupt related stuff */
74 #define LIS3L02DQ_REG_WAKE_UP_CFG_ADDR 0x23
76 /* Switch from or combination fo conditions to and */
77 #define LIS3L02DQ_REG_WAKE_UP_CFG_BOOLEAN_AND 0x80
79 /* Latch interupt request,
80 * if on ack must be given by reading the ack register */
81 #define LIS3L02DQ_REG_WAKE_UP_CFG_LATCH_SRC 0x40
83 /* Z Interupt on High (above threshold)*/
84 #define LIS3L02DQ_REG_WAKE_UP_CFG_INTERRUPT_Z_HIGH 0x20
85 /* Z Interupt on Low */
86 #define LIS3L02DQ_REG_WAKE_UP_CFG_INTERRUPT_Z_LOW 0x10
87 /* Y Interupt on High */
88 #define LIS3L02DQ_REG_WAKE_UP_CFG_INTERRUPT_Y_HIGH 0x08
89 /* Y Interupt on Low */
90 #define LIS3L02DQ_REG_WAKE_UP_CFG_INTERRUPT_Y_LOW 0x04
91 /* X Interupt on High */
92 #define LIS3L02DQ_REG_WAKE_UP_CFG_INTERRUPT_X_HIGH 0x02
93 /* X Interupt on Low */
94 #define LIS3L02DQ_REG_WAKE_UP_CFG_INTERRUPT_X_LOW 0x01
96 /* Register that gives description of what caused interupt
97 * - latched if set in CFG_ADDRES */
98 #define LIS3L02DQ_REG_WAKE_UP_SRC_ADDR 0x24
99 /* top bit ignored */
100 /* Interupt Active */
101 #define LIS3L02DQ_REG_WAKE_UP_SRC_INTERRUPT_ACTIVATED 0x40
102 /* Interupts that have been triggered */
103 #define LIS3L02DQ_REG_WAKE_UP_SRC_INTERRUPT_Z_HIGH 0x20
104 #define LIS3L02DQ_REG_WAKE_UP_SRC_INTERRUPT_Z_LOW 0x10
105 #define LIS3L02DQ_REG_WAKE_UP_SRC_INTERRUPT_Y_HIGH 0x08
106 #define LIS3L02DQ_REG_WAKE_UP_SRC_INTERRUPT_Y_LOW 0x04
107 #define LIS3L02DQ_REG_WAKE_UP_SRC_INTERRUPT_X_HIGH 0x02
108 #define LIS3L02DQ_REG_WAKE_UP_SRC_INTERRUPT_X_LOW 0x01
110 #define LIS3L02DQ_REG_WAKE_UP_ACK_ADDR 0x25
112 /* Status register */
113 #define LIS3L02DQ_REG_STATUS_ADDR 0x27
114 /* XYZ axis data overrun - first is all overrun? */
115 #define LIS3L02DQ_REG_STATUS_XYZ_OVERRUN 0x80
116 #define LIS3L02DQ_REG_STATUS_Z_OVERRUN 0x40
117 #define LIS3L02DQ_REG_STATUS_Y_OVERRUN 0x20
118 #define LIS3L02DQ_REG_STATUS_X_OVERRUN 0x10
119 /* XYZ new data available - first is all 3 available? */
120 #define LIS3L02DQ_REG_STATUS_XYZ_NEW_DATA 0x08
121 #define LIS3L02DQ_REG_STATUS_Z_NEW_DATA 0x04
122 #define LIS3L02DQ_REG_STATUS_Y_NEW_DATA 0x02
123 #define LIS3L02DQ_REG_STATUS_X_NEW_DATA 0x01
125 /* The accelerometer readings - low and high bytes.
126 Form of high byte dependant on justification set in ctrl reg */
127 #define LIS3L02DQ_REG_OUT_X_L_ADDR 0x28
128 #define LIS3L02DQ_REG_OUT_X_H_ADDR 0x29
129 #define LIS3L02DQ_REG_OUT_Y_L_ADDR 0x2A
130 #define LIS3L02DQ_REG_OUT_Y_H_ADDR 0x2B
131 #define LIS3L02DQ_REG_OUT_Z_L_ADDR 0x2C
132 #define LIS3L02DQ_REG_OUT_Z_H_ADDR 0x2D
134 /* Threshold values for all axes and both above and below thresholds
135 * - i.e. there is only one value */
136 #define LIS3L02DQ_REG_THS_L_ADDR 0x2E
137 #define LIS3L02DQ_REG_THS_H_ADDR 0x2F
139 #define LIS3L02DQ_DEFAULT_CTRL1 (LIS3L02DQ_REG_CTRL_1_PD_ON \
140 | LIS3L02DQ_REG_CTRL_1_AXES_Z_ENABLE \
141 | LIS3L02DQ_REG_CTRL_1_AXES_Y_ENABLE \
142 | LIS3L02DQ_REG_CTRL_1_AXES_X_ENABLE \
143 | LIS3L02DQ_REG_CTRL_1_DF_128)
145 #define LIS3L02DQ_DEFAULT_CTRL2 0
147 #define LIS3L02DQ_MAX_TX 12
148 #define LIS3L02DQ_MAX_RX 12
150 * struct lis3l02dq_state - device instance specific data
151 * @us: actual spi_device
152 * @work_trigger_to_ring: bh for triggered event handling
153 * @work_cont_thresh: CLEAN
154 * @inter: used to check if new interrupt has been triggered
155 * @last_timestamp: passing timestamp from th to bh of interrupt handler
156 * @indio_dev: industrial I/O device structure
157 * @trig: data ready trigger registered with iio
158 * @tx: transmit buffer
159 * @rx: recieve buffer
160 * @buf_lock: mutex to protect tx and rx
162 struct lis3l02dq_state {
163 struct spi_device *us;
164 struct work_struct work_trigger_to_ring;
165 struct iio_work_cont work_cont_thresh;
166 bool inter;
167 s64 last_timestamp;
168 struct iio_dev *indio_dev;
169 struct iio_trigger *trig;
170 u8 *tx;
171 u8 *rx;
172 struct mutex buf_lock;
175 int lis3l02dq_spi_read_reg_8(struct device *dev,
176 u8 reg_address,
177 u8 *val);
179 int lis3l02dq_spi_write_reg_8(struct device *dev,
180 u8 reg_address,
181 u8 *val);
182 #define LIS3L02DQ_SCAN_ACC_X 0
183 #define LIS3L02DQ_SCAN_ACC_Y 1
184 #define LIS3L02DQ_SCAN_ACC_Z 2
187 #ifdef CONFIG_IIO_RING_BUFFER
188 /* At the moment triggers are only used for ring buffer
189 * filling. This may change!
191 void lis3l02dq_remove_trigger(struct iio_dev *indio_dev);
192 int lis3l02dq_probe_trigger(struct iio_dev *indio_dev);
194 ssize_t lis3l02dq_read_accel_from_ring(struct device *dev,
195 struct device_attribute *attr,
196 char *buf);
199 int lis3l02dq_configure_ring(struct iio_dev *indio_dev);
200 void lis3l02dq_unconfigure_ring(struct iio_dev *indio_dev);
202 int lis3l02dq_initialize_ring(struct iio_ring_buffer *ring);
203 void lis3l02dq_uninitialize_ring(struct iio_ring_buffer *ring);
204 #else /* CONFIG_IIO_RING_BUFFER */
206 static inline void lis3l02dq_remove_trigger(struct iio_dev *indio_dev) {};
207 static inline int lis3l02dq_probe_trigger(struct iio_dev *indio_dev)
209 return 0;
212 static inline ssize_t
213 lis3l02dq_read_accel_from_ring(struct device *dev,
214 struct device_attribute *attr,
215 char *buf)
217 return 0;
220 static int lis3l02dq_configure_ring(struct iio_dev *indio_dev)
222 return 0;
224 static inline void lis3l02dq_unconfigure_ring(struct iio_dev *indio_dev)
226 static inline int lis3l02dq_initialize_ring(struct iio_ring_buffer *ring)
228 return 0;
230 static inline void lis3l02dq_uninitialize_ring(struct iio_ring_buffer *ring) {};
231 #endif /* CONFIG_IIO_RING_BUFFER */
232 #endif /* SPI_LIS3L02DQ_H_ */