aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/k3g.h
blob: 636fbe2e08981bdc8083e79c4fe2265ce1de507d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
/*
 *  k3g.h -  ST Microelectronics three-axis gyroscope sensor
 *
 *  Copyright (c) 2010 Samsung Eletronics
 *  Donggeun Kim <dg77.kim@samsung.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */

#ifndef _K3G_H_
#define _K3G_H_

#define K3G_WHO_AM_I			0x0f
#define K3G_CTRL_REG1			0x20
#define K3G_CTRL_REG2			0x21
#define K3G_CTRL_REG3			0x22
#define K3G_CTRL_REG4			0x23
#define K3G_CTRL_REG5			0x24
#define K3G_REFERENCE			0x25
#define K3G_OUT_TEMP			0x26
#define K3G_STATUS_REG			0x27
#define K3G_OUT_X_L			0x28
#define K3G_OUT_X_H			0x29
#define K3G_OUT_Y_L			0x2a
#define K3G_OUT_Y_H			0x2b
#define K3G_OUT_Z_L			0x2c
#define K3G_OUT_Z_H			0x2d
#define K3G_FIFO_CTRL_REG		0x2e
#define K3G_FIFO_SRC_REG		0x2f
#define K3G_INT1_CFG_REG		0x30
#define K3G_INT1_SRC_REG		0x31
#define K3G_INT1_THS_XH			0x32
#define K3G_INT1_THS_XL			0x33
#define K3G_INT1_THS_YH			0x34
#define K3G_INT1_THS_YL			0x35
#define K3G_INT1_THS_ZH			0x36
#define K3G_INT1_THS_ZL			0x37
#define K3G_INT1_DURATION_REG		0x38

#define K3G_MULTI_OUT_X_L		0xa8

#define K3G_DATA_RATE_SHIFT		6
#define K3G_DATA_RATE_105HZ		((0x0) << K3G_DATA_RATE_SHIFT)
#define K3G_DATA_RATE_210HZ		((0x1) << K3G_DATA_RATE_SHIFT)
#define K3G_DATA_RATE_420HZ		((0x2) << K3G_DATA_RATE_SHIFT)
#define K3G_DATA_RATE_840HZ		((0x3) << K3G_DATA_RATE_SHIFT)
#define K3G_BANDWIDTH_SHIFT		4
#define K3G_BANDWIDTH_MASK		((0x3) << K3G_BANDWIDTH_SHIFT)
#define K3G_POWERDOWN_SHIFT		3
#define K3G_POWERDOWN_POWER_DOWN	((0x0) << K3G_POWERDOWN_SHIFT)
#define K3G_POWERDOWN_NORMAL		((0x1) << K3G_POWERDOWN_SHIFT)
#define K3G_POWERDOWN_MASK		((0x1) << K3G_POWERDOWN_SHIFT)
#define K3G_Z_EN_SHIFT			2
#define K3G_Z_EN			((0x1) << K3G_Z_EN_SHIFT)
#define K3G_Y_EN_SHIFT			1
#define K3G_Y_EN			((0x1) << K3G_Y_EN_SHIFT)
#define K3G_X_EN_SHIFT			0
#define K3G_X_EN			((0x1) << K3G_X_EN_SHIFT)

#define K3G_HIGH_PASS_FILTER_SHIFT				4
#define K3G_HIGH_PASS_FILTER_NORMAL_MODE_RESET_READING	\
			((0x0) << K3G_HIGH_PASS_FILTER_SHIFT)
#define K3G_HIGH_PASS_FILTER_REFERENCE_SIGNAL	\
			((0x1) << K3G_HIGH_PASS_FILTER_SHIFT)
#define K3G_HIGH_PASS_FILTER_NORMAL_MODE	\
			((0x2) << K3G_HIGH_PASS_FILTER_SHIFT)
#define K3G_HIGH_PASS_FILTER_AUTORESET_ON_INTERRUPT	\
			((0x3) << K3G_HIGH_PASS_FILTER_SHIFT)
#define K3G_HIGH_PASS_FILTER_CUTOFF_FREQ_SHIFT			0
#define K3G_HIGH_PASS_FILTER_CUTOFF_FREQ_MASK	\
			((0xf) << K3G_HIGH_PASS_FILTER_CUTOFF_FREQ_SHIFT)

#define K3G_INT1_EN_SHIFT			7
#define K3G_INT1_EN				((0x1) << K3G_INT1_EN_SHIFT)
#define K3G_INT1_BOOT_SHIFT			6
#define K3G_INT1_BOOT				((0x1) << K3G_INT1_BOOT_SHIFT)
#define K3G_INT1_ACTIVE_SHIFT			5
#define K3G_INT1_ACTIVE_HIGH			((0x0) << K3G_INT1_ACTIVE_SHIFT)
#define K3G_INT1_ACTIVE_LOW			((0x1) << K3G_INT1_ACTIVE_SHIFT)
#define K3G_INT_PUSH_PULL_OPEN_DRAIN_SHIFT	4
#define K3G_INT_PUSH_PULL	\
			((0x0) << K3G_INT_PUSH_PULL_OPEN_DRAIN_SHIFT)
#define K3G_INT_OPEN_DRAIN	\
			((0x1) << K3G_INT_PUSH_PULL_OPEN_DRAIN_SHIFT)
#define K3G_INT2_SRC_SHIFT			0
#define K3G_INT2_SRC_MASK			((0x0f) << K3G_INT2_SRC_SHIFT)
#define K3G_INT2_DATA_READY_SHIFT		3
#define K3G_INT2_DATA_READY		((0x1) << K3G_INT2_DATA_READY_SHIFT)
#define K3G_INT2_WATERMARK_SHIFT		2
#define K3G_INT2_WATERMARK		((0x1) << K3G_INT2_WATERMARK_SHIFT)
#define K3G_INT2_OVERRUN_SHIFT			1
#define K3G_INT2_OVERRUN		((0x1) << K3G_INT2_OVERRUN_SHIFT)
#define K3G_INT2_EMPTY_SHIFT			0
#define K3G_INT2_EMPTY			((0x1) << K3G_INT2_EMPTY_SHIFT)

#define K3G_BLOCK_DATA_UPDATE_SHIFT		7
#define K3G_BLOCK_DATA_UPDATE	\
			((0x1) << K3G_BLOCK_DATA_UPDATE_SHIFT)
#define K3G_BIG_LITTLE_ENDIAN_SHIFT		6
#define K3G_BIG_ENDIAN			((0x0) << K3G_BIG_LITTLE_ENDIAN_SHIFT)
#define K3G_LITTLE_ENDIAN		((0x1) << K3G_BIG_LITTLE_ENDIAN_SHIFT)
#define K3G_FULL_SCALE_SHIFT			4
#define K3G_FULL_SCALE_250DPS			((0x0) << K3G_FULL_SCALE_SHIFT)
#define K3G_FULL_SCALE_500DPS			((0x1) << K3G_FULL_SCALE_SHIFT)
#define K3G_FULL_SCALE_2000DPS			((0x2) << K3G_FULL_SCALE_SHIFT)
#define K3G_SELF_TEST_SHIFT			1
#define K3G_SELF_TESET_NORMAL			((0x0) << K3G_SELF_TEST_SHIFT)
#define K3G_SELF_TESET_0			((0x1) << K3G_SELF_TEST_SHIFT)
#define K3G_SELF_TESET_1			((0x3) << K3G_SELF_TEST_SHIFT)
#define K3G_SPI_MODE_SHIFT			0
#define K3G_SPI_FOUR_WIRE			((0x0) << K3G_SPI_MODE_SHIFT)
#define K3G_SPI_THREE_WIRE			((0x1) << K3G_SPI_MODE_SHIFT)

#define K3G_REBOOT_SHIFT			7
#define K3G_REBOOT				((0x1) << K3G_REBOOT_SHIFT)
#define K3G_FIFO_EN_SHIFT			6
#define K3G_FIFO_EN				((0x1) << K3G_FIFO_EN_SHIFT)
#define K3G_HIGH_PASS_FILTER_EN_SHIFT		4
#define K3G_HIGH_PASS_FILTER_EN	\
			((0x1) << K3G_HIGH_PASS_FILTER_EN_SHIFT)
#define K3G_INT1_SELECTION_SHIFT		2
#define K3G_INT1_SELECTION		((0x3) << K3G_INT1_SELECTION_SHIFT)
#define K3G_OUT_SELECTION_SHIFT			0
#define K3G_OUT_SELECTION		((0x3) << K3G_OUT_SELECTION_SHIFT)

#define K3G_ZYX_OVERRUN_SHIFT			7
#define K3G_ZYX_OVERRUN				((0x1) << K3G_ZYX_OVERRUN_SHIFT)
#define K3G_Z_OVERRUN_SHIFT			6
#define K3G_Z_OVERRUN				((0x1) << K3G_Z_OVERRUN_SHIFT)
#define K3G_Y_OVERRUN_SHIFT			5
#define K3G_Y_OVERRUN				((0x1) << K3G_Y_OVERRUN_SHIFT)
#define K3G_X_OVERRUN_SHIFT			4
#define K3G_X_OVERRUN				((0x1) << K3G_X_OVERRUN_SHIFT)
#define K3G_ZYX_DATA_AVAILABLE_SHIFT		3
#define K3G_ZYX_DATA_AVAILABEL	\
			((0x1) << K3G_ZYX_DATA_AVAILABLE_SHIFT)
#define K3G_Z_DATA_AVAILABLE_SHIFT		2
#define K3G_Z_DATA_AVAILABLE		((0x1) << K3G_Z_DATA_AVAILABLE_SHIFT)
#define K3G_Y_DATA_AVAILABLE_SHIFT		1
#define K3G_Y_DATA_AVAILABLE		((0x1) << K3G_Y_DATA_AVAILABLE_SHIFT)
#define K3G_X_DATA_AVAILABLE_SHIFT		0
#define K3G_X_DATA_AVAILABLE		((0x1) << K3G_X_DATA_AVAILABLE_SHIFT)

#define K3G_FIFO_MODE_SHIFT			5
#define K3G_FIFO_BYPASS_MODE			((0x0) << K3G_FIFO_MODE_SHIFT)
#define K3G_FIFO_FIFO_MODE			((0x1) << K3G_FIFO_MODE_SHIFT)
#define K3G_FIFO_STREAM_MODE			((0x2) << K3G_FIFO_MODE_SHIFT)
#define K3G_FIFO_STREAM_TO_FIFO_MODE		((0x3) << K3G_FIFO_MODE_SHIFT)
#define K3G_FIFO_BYPASS_TO_STREAM_MODE		((0x4) << K3G_FIFO_MODE_SHIFT)
#define K3G_FIFO_MODE_MASK			((0x7) << K3G_FIFO_MODE_SHIFT)
#define K3G_WATERMARK_THRES_SHIFT		0
#define K3G_WATERMARK_THRES_MASK	((0x1f) << K3G_WATERMARK_THRES_SHIFT)

#define K3G_WATERMARK_SHIFT			7
#define K3G_WATERMARK				((0x1) << K3G_WATERMARK_SHIFT)
#define K3G_OVERRUN_SHIFT			6
#define K3G_OVERRUN				((0x1) << K3G_OVERRUN_SHIFT)
#define K3G_EMPTY_SHIFT				5
#define K3G_EMPTY				((0x1) << K3G_EMPTY_SHIFT)
#define K3G_FIFO_STORED_SHIFT			0
#define K3G_FIFO_STORED_MASK		((0x1f) << K3G_FIFO_STORED_SHIFT)

#define K3G_AND_OR_COMBINATION_SHIFT		7
#define K3G_OR_COMBINATION		((0x0) << K3G_AND_OR_COMBINATION_SHIFT)
#define K3G_AND_COMBINATION		((0x1) << K3G_AND_OR_COMBINATION_SHIFT)
#define K3G_LATCH_INTERRUPT_SHIFT		6
#define K3G_INTERRUPT_NO_LATCHED	((0x0) << K3G_LATCH_INTERRUPT_SHIFT)
#define K3G_INTERRUPT_LATCHED		((0x1) << K3G_LATCH_INTERRUPT_SHIFT)
#define K3G_Z_HIGH_INT_EN_SHIFT			5
#define K3G_Z_HIGH_INT_EN		((0x1) << K3G_Z_HIGH_INT_EN_SHIFT)
#define K3G_Z_LOW_INT_EN_SHIFT			4
#define K3G_Z_LOW_INT_EN		((0x1) << K3G_Z_LOW_INT_EN_SHIFT)
#define K3G_Y_HIGH_INT_EN_SHIFT			3
#define K3G_Y_HIGH_INT_EN		((0x1) << K3G_Y_HIGH_INT_EN_SHIFT)
#define K3G_Y_LOW_INT_EN_SHIFT			2
#define K3G_Y_LOW_INT_EN		((0x1) << K3G_Y_LOW_INT_EN_SHIFT)
#define K3G_X_HIGH_INT_EN_SHIFT			1
#define K3G_X_HIGH_INT_EN		((0x1) << K3G_X_HIGH_INT_EN_SHIFT)
#define K3G_X_LOW_INT_EN_SHIFT			0
#define K3G_X_LOW_INT_EN		((0x1) << K3G_X_LOW_INT_EN_SHIFT)

#define K3G_INTERRUPT_ACTIVE_SHIFT		6
#define K3G_INTERRUPT_ACTIVE		((0x1) << K3G_INTERRUPT_ACTIVE_SHIFT)
#define K3G_Z_HIGH_SHIFT			5
#define K3G_Z_HIGH				((0x1) << K3G_Z_HIGH_SHIFT)
#define K3G_Z_LOW_SHIFT				4
#define K3G_Z_LOW				((0x1) << K3G_Z_LOW_SHIFT)
#define K3G_Y_HIGH_SHIFT			3
#define K3G_Y_HIGH				((0x1) << K3G_Y_HIGH_SHIFT)
#define K3G_Y_LOW_SHIFT				2
#define K3G_Y_LOW				((0x1) << K3G_Y_LOW_SHIFT)
#define K3G_X_HIGH_SHIFT			1
#define K3G_X_HIGH				((0x1) << K3G_X_HIGH_SHIFT)
#define K3G_X_LOW_SHIFT				0
#define K3G_X_LOW				((0x1) << K3G_X_LOW_SHIFT)

#define K3G_INT1_WAIT_EN_SHIFT			7
#define K3G_INT1_WAIT_EN		((0x1) << K3G_INT1_WAIT_EN_SHIFT)
#define K3G_INT1_DURATION_SHIFT			0
#define K3G_INT1_DURATION_MASK		((0x7f) << K3G_INT1_DURATION_SHIFT)

#define K3G_TEMP_SHIFT				0
#define K3G_TEMP_MASK				((0xff) << K3G_TEMP_SHIFT)

#define K3G_DEV_ID				0xd3

struct k3g_platform_data {
	int irq2;
	u8 data_rate;
	u8 bandwidth;
	u8 powerdown;
	u8 zen;
	u8 yen;
	u8 xen;
	u8 hpmode;
	u8 hpcf;
	u8 int1_enable;
	u8 int1_boot;
	u8 int1_hl_active;
	u8 int_pp_od;
	u8 int2_src;
	u8 block_data_update;
	u8 endian;
	u8 fullscale;
	u8 selftest;
	u8 spi_mode;
	u8 reboot;
	u8 fifo_enable;
	u8 hp_enable;
	u8 int1_sel;
	u8 out_sel;
	u8 fifo_mode;
	u8 fifo_threshold;
	u8 int1_combination;
	u8 int1_latch;
	u8 int1_z_high_enable;
	u8 int1_z_low_enable;
	u8 int1_y_high_enable;
	u8 int1_y_low_enable;
	u8 int1_x_high_enable;
	u8 int1_x_low_enable;
	u8 int1_wait_enable;
	u8 int1_wait_duration;
	u16 int1_z_threshold;
	u16 int1_y_threshold;
	u16 int1_x_threshold;
};

struct k3g_chip {
	struct i2c_client		*client;
	struct iio_dev			*indio_dev;
	struct work_struct		work_thresh;
	struct work_struct		work_fifo;
	struct iio_trigger		*trig;
	s64				last_timestamp;
	struct mutex			lock;
	struct mutex			ring_lock;
	struct k3g_platform_data	*pdata;
};

#endif