blob: aed377797ded1f6c2251eb0c9e151df66eb50e9f [file] [log] [blame]
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +00001/*
2 * KXCJK-1013 3-axis accelerometer driver
3 * Copyright (c) 2014, Intel Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms and conditions of the GNU General Public License,
7 * version 2, as published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 */
14
15#include <linux/module.h>
16#include <linux/i2c.h>
17#include <linux/interrupt.h>
18#include <linux/delay.h>
19#include <linux/bitops.h>
20#include <linux/slab.h>
21#include <linux/string.h>
22#include <linux/acpi.h>
23#include <linux/gpio/consumer.h>
Srinivas Pandruvada124e1b1d2014-05-08 22:58:00 +010024#include <linux/pm.h>
25#include <linux/pm_runtime.h>
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +000026#include <linux/iio/iio.h>
27#include <linux/iio/sysfs.h>
28#include <linux/iio/buffer.h>
29#include <linux/iio/trigger.h>
Srinivas Pandruvadab4b491c2014-08-22 20:01:00 +010030#include <linux/iio/events.h>
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +000031#include <linux/iio/trigger_consumer.h>
32#include <linux/iio/triggered_buffer.h>
33#include <linux/iio/accel/kxcjk_1013.h>
34
35#define KXCJK1013_DRV_NAME "kxcjk1013"
36#define KXCJK1013_IRQ_NAME "kxcjk1013_event"
37
38#define KXCJK1013_REG_XOUT_L 0x06
39/*
40 * From low byte X axis register, all the other addresses of Y and Z can be
41 * obtained by just applying axis offset. The following axis defines are just
42 * provide clarity, but not used.
43 */
44#define KXCJK1013_REG_XOUT_H 0x07
45#define KXCJK1013_REG_YOUT_L 0x08
46#define KXCJK1013_REG_YOUT_H 0x09
47#define KXCJK1013_REG_ZOUT_L 0x0A
48#define KXCJK1013_REG_ZOUT_H 0x0B
49
50#define KXCJK1013_REG_DCST_RESP 0x0C
51#define KXCJK1013_REG_WHO_AM_I 0x0F
52#define KXCJK1013_REG_INT_SRC1 0x16
53#define KXCJK1013_REG_INT_SRC2 0x17
54#define KXCJK1013_REG_STATUS_REG 0x18
55#define KXCJK1013_REG_INT_REL 0x1A
56#define KXCJK1013_REG_CTRL1 0x1B
57#define KXCJK1013_REG_CTRL2 0x1D
58#define KXCJK1013_REG_INT_CTRL1 0x1E
59#define KXCJK1013_REG_INT_CTRL2 0x1F
60#define KXCJK1013_REG_DATA_CTRL 0x21
61#define KXCJK1013_REG_WAKE_TIMER 0x29
62#define KXCJK1013_REG_SELF_TEST 0x3A
63#define KXCJK1013_REG_WAKE_THRES 0x6A
64
65#define KXCJK1013_REG_CTRL1_BIT_PC1 BIT(7)
66#define KXCJK1013_REG_CTRL1_BIT_RES BIT(6)
67#define KXCJK1013_REG_CTRL1_BIT_DRDY BIT(5)
68#define KXCJK1013_REG_CTRL1_BIT_GSEL1 BIT(4)
69#define KXCJK1013_REG_CTRL1_BIT_GSEL0 BIT(3)
70#define KXCJK1013_REG_CTRL1_BIT_WUFE BIT(1)
71#define KXCJK1013_REG_INT_REG1_BIT_IEA BIT(4)
72#define KXCJK1013_REG_INT_REG1_BIT_IEN BIT(5)
73
74#define KXCJK1013_DATA_MASK_12_BIT 0x0FFF
75#define KXCJK1013_MAX_STARTUP_TIME_US 100000
76
Srinivas Pandruvada124e1b1d2014-05-08 22:58:00 +010077#define KXCJK1013_SLEEP_DELAY_MS 2000
78
Srinivas Pandruvadab4b491c2014-08-22 20:01:00 +010079#define KXCJK1013_REG_INT_SRC2_BIT_ZP BIT(0)
80#define KXCJK1013_REG_INT_SRC2_BIT_ZN BIT(1)
81#define KXCJK1013_REG_INT_SRC2_BIT_YP BIT(2)
82#define KXCJK1013_REG_INT_SRC2_BIT_YN BIT(3)
83#define KXCJK1013_REG_INT_SRC2_BIT_XP BIT(4)
84#define KXCJK1013_REG_INT_SRC2_BIT_XN BIT(5)
85
86#define KXCJK1013_DEFAULT_WAKE_THRES 1
87
Daniel Balutac6861372014-03-09 08:33:00 +000088enum kx_chipset {
89 KXCJK1013,
90 KXCJ91008,
91 KXTJ21009,
92 KX_MAX_CHIPS /* this must be last */
93};
94
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +000095struct kxcjk1013_data {
96 struct i2c_client *client;
Srinivas Pandruvadab4b491c2014-08-22 20:01:00 +010097 struct iio_trigger *dready_trig;
98 struct iio_trigger *motion_trig;
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +000099 struct mutex mutex;
100 s16 buffer[8];
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +0000101 u8 odr_bits;
Srinivas Pandruvadaa735e3d2014-05-08 22:58:00 +0100102 u8 range;
Srinivas Pandruvadab4b491c2014-08-22 20:01:00 +0100103 int wake_thres;
104 int wake_dur;
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +0000105 bool active_high_intr;
Srinivas Pandruvadab4b491c2014-08-22 20:01:00 +0100106 bool dready_trigger_on;
107 int ev_enable_state;
108 bool motion_trigger_on;
109 int64_t timestamp;
Daniel Balutac6861372014-03-09 08:33:00 +0000110 enum kx_chipset chipset;
Bastien Nocera3bfa74f2014-05-11 22:09:00 +0100111 bool is_smo8500_device;
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +0000112};
113
114enum kxcjk1013_axis {
115 AXIS_X,
116 AXIS_Y,
117 AXIS_Z,
118};
119
120enum kxcjk1013_mode {
121 STANDBY,
122 OPERATION,
123};
124
Srinivas Pandruvadaa735e3d2014-05-08 22:58:00 +0100125enum kxcjk1013_range {
126 KXCJK1013_RANGE_2G,
127 KXCJK1013_RANGE_4G,
128 KXCJK1013_RANGE_8G,
129};
130
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +0000131static const struct {
132 int val;
133 int val2;
134 int odr_bits;
135} samp_freq_table[] = { {0, 781000, 0x08}, {1, 563000, 0x09},
Srinivas Pandruvadaf0ca9742014-07-17 01:42:00 +0100136 {3, 125000, 0x0A}, {6, 250000, 0x0B}, {12, 500000, 0},
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +0000137 {25, 0, 0x01}, {50, 0, 0x02}, {100, 0, 0x03},
138 {200, 0, 0x04}, {400, 0, 0x05}, {800, 0, 0x06},
139 {1600, 0, 0x07} };
140
141/* Refer to section 4 of the specification */
142static const struct {
143 int odr_bits;
144 int usec;
Daniel Balutac6861372014-03-09 08:33:00 +0000145} odr_start_up_times[KX_MAX_CHIPS][12] = {
146 /* KXCJK-1013 */
147 {
148 {0x08, 100000},
149 {0x09, 100000},
150 {0x0A, 100000},
151 {0x0B, 100000},
152 {0, 80000},
153 {0x01, 41000},
154 {0x02, 21000},
155 {0x03, 11000},
156 {0x04, 6400},
157 {0x05, 3900},
158 {0x06, 2700},
159 {0x07, 2100},
160 },
161 /* KXCJ9-1008 */
162 {
163 {0x08, 100000},
164 {0x09, 100000},
165 {0x0A, 100000},
166 {0x0B, 100000},
167 {0, 80000},
168 {0x01, 41000},
169 {0x02, 21000},
170 {0x03, 11000},
171 {0x04, 6400},
172 {0x05, 3900},
173 {0x06, 2700},
174 {0x07, 2100},
175 },
176 /* KXCTJ2-1009 */
177 {
178 {0x08, 1240000},
179 {0x09, 621000},
180 {0x0A, 309000},
181 {0x0B, 151000},
182 {0, 80000},
183 {0x01, 41000},
184 {0x02, 21000},
185 {0x03, 11000},
186 {0x04, 6000},
187 {0x05, 4000},
188 {0x06, 3000},
189 {0x07, 2000},
190 },
191};
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +0000192
Srinivas Pandruvadaa735e3d2014-05-08 22:58:00 +0100193static const struct {
194 u16 scale;
195 u8 gsel_0;
196 u8 gsel_1;
197} KXCJK1013_scale_table[] = { {9582, 0, 0},
198 {19163, 1, 0},
199 {38326, 0, 1} };
200
Srinivas Pandruvadab4b491c2014-08-22 20:01:00 +0100201static const struct {
202 int val;
203 int val2;
204 int odr_bits;
205} wake_odr_data_rate_table[] = { {0, 781000, 0x00},
206 {1, 563000, 0x01},
207 {3, 125000, 0x02},
208 {6, 250000, 0x03},
209 {12, 500000, 0x04},
210 {25, 0, 0x05},
211 {50, 0, 0x06},
212 {100, 0, 0x06},
213 {200, 0, 0x06},
214 {400, 0, 0x06},
215 {800, 0, 0x06},
216 {1600, 0, 0x06} };
217
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +0000218static int kxcjk1013_set_mode(struct kxcjk1013_data *data,
219 enum kxcjk1013_mode mode)
220{
221 int ret;
222
223 ret = i2c_smbus_read_byte_data(data->client, KXCJK1013_REG_CTRL1);
224 if (ret < 0) {
225 dev_err(&data->client->dev, "Error reading reg_ctrl1\n");
226 return ret;
227 }
228
229 if (mode == STANDBY)
230 ret &= ~KXCJK1013_REG_CTRL1_BIT_PC1;
231 else
232 ret |= KXCJK1013_REG_CTRL1_BIT_PC1;
233
234 ret = i2c_smbus_write_byte_data(data->client,
235 KXCJK1013_REG_CTRL1, ret);
236 if (ret < 0) {
237 dev_err(&data->client->dev, "Error writing reg_ctrl1\n");
238 return ret;
239 }
240
241 return 0;
242}
243
Srinivas Pandruvada124e1b1d2014-05-08 22:58:00 +0100244static int kxcjk1013_get_mode(struct kxcjk1013_data *data,
245 enum kxcjk1013_mode *mode)
246{
247 int ret;
248
249 ret = i2c_smbus_read_byte_data(data->client, KXCJK1013_REG_CTRL1);
250 if (ret < 0) {
251 dev_err(&data->client->dev, "Error reading reg_ctrl1\n");
252 return ret;
253 }
254
255 if (ret & KXCJK1013_REG_CTRL1_BIT_PC1)
256 *mode = OPERATION;
257 else
258 *mode = STANDBY;
259
260 return 0;
261}
262
Srinivas Pandruvadaa735e3d2014-05-08 22:58:00 +0100263static int kxcjk1013_set_range(struct kxcjk1013_data *data, int range_index)
264{
265 int ret;
266
267 ret = i2c_smbus_read_byte_data(data->client, KXCJK1013_REG_CTRL1);
268 if (ret < 0) {
269 dev_err(&data->client->dev, "Error reading reg_ctrl1\n");
270 return ret;
271 }
272
273 ret |= (KXCJK1013_scale_table[range_index].gsel_0 << 3);
274 ret |= (KXCJK1013_scale_table[range_index].gsel_1 << 4);
275
276 ret = i2c_smbus_write_byte_data(data->client,
277 KXCJK1013_REG_CTRL1,
278 ret);
279 if (ret < 0) {
280 dev_err(&data->client->dev, "Error writing reg_ctrl1\n");
281 return ret;
282 }
283
284 data->range = range_index;
285
286 return 0;
287}
288
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +0000289static int kxcjk1013_chip_init(struct kxcjk1013_data *data)
290{
291 int ret;
292
293 ret = i2c_smbus_read_byte_data(data->client, KXCJK1013_REG_WHO_AM_I);
294 if (ret < 0) {
295 dev_err(&data->client->dev, "Error reading who_am_i\n");
296 return ret;
297 }
298
299 dev_dbg(&data->client->dev, "KXCJK1013 Chip Id %x\n", ret);
300
301 ret = kxcjk1013_set_mode(data, STANDBY);
302 if (ret < 0)
303 return ret;
304
305 ret = i2c_smbus_read_byte_data(data->client, KXCJK1013_REG_CTRL1);
306 if (ret < 0) {
307 dev_err(&data->client->dev, "Error reading reg_ctrl1\n");
308 return ret;
309 }
310
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +0000311 /* Set 12 bit mode */
312 ret |= KXCJK1013_REG_CTRL1_BIT_RES;
313
314 ret = i2c_smbus_write_byte_data(data->client, KXCJK1013_REG_CTRL1,
315 ret);
316 if (ret < 0) {
317 dev_err(&data->client->dev, "Error reading reg_ctrl\n");
318 return ret;
319 }
320
Srinivas Pandruvadaa735e3d2014-05-08 22:58:00 +0100321 /* Setting range to 4G */
322 ret = kxcjk1013_set_range(data, KXCJK1013_RANGE_4G);
323 if (ret < 0)
324 return ret;
325
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +0000326 ret = i2c_smbus_read_byte_data(data->client, KXCJK1013_REG_DATA_CTRL);
327 if (ret < 0) {
328 dev_err(&data->client->dev, "Error reading reg_data_ctrl\n");
329 return ret;
330 }
331
332 data->odr_bits = ret;
333
334 /* Set up INT polarity */
335 ret = i2c_smbus_read_byte_data(data->client, KXCJK1013_REG_INT_CTRL1);
336 if (ret < 0) {
337 dev_err(&data->client->dev, "Error reading reg_int_ctrl1\n");
338 return ret;
339 }
340
341 if (data->active_high_intr)
342 ret |= KXCJK1013_REG_INT_REG1_BIT_IEA;
343 else
344 ret &= ~KXCJK1013_REG_INT_REG1_BIT_IEA;
345
346 ret = i2c_smbus_write_byte_data(data->client, KXCJK1013_REG_INT_CTRL1,
347 ret);
348 if (ret < 0) {
349 dev_err(&data->client->dev, "Error writing reg_int_ctrl1\n");
350 return ret;
351 }
352
Srinivas Pandruvada124e1b1d2014-05-08 22:58:00 +0100353 ret = kxcjk1013_set_mode(data, OPERATION);
354 if (ret < 0)
355 return ret;
356
Srinivas Pandruvadab4b491c2014-08-22 20:01:00 +0100357 data->wake_thres = KXCJK1013_DEFAULT_WAKE_THRES;
358
Srinivas Pandruvada124e1b1d2014-05-08 22:58:00 +0100359 return 0;
360}
361
Daniel Balutac9bf2372014-03-09 16:13:00 +0000362#ifdef CONFIG_PM_RUNTIME
Srinivas Pandruvada124e1b1d2014-05-08 22:58:00 +0100363static int kxcjk1013_get_startup_times(struct kxcjk1013_data *data)
364{
365 int i;
Daniel Balutac6861372014-03-09 08:33:00 +0000366 int idx = data->chipset;
Srinivas Pandruvada124e1b1d2014-05-08 22:58:00 +0100367
Daniel Balutac6861372014-03-09 08:33:00 +0000368 for (i = 0; i < ARRAY_SIZE(odr_start_up_times[idx]); ++i) {
369 if (odr_start_up_times[idx][i].odr_bits == data->odr_bits)
370 return odr_start_up_times[idx][i].usec;
Srinivas Pandruvada124e1b1d2014-05-08 22:58:00 +0100371 }
372
373 return KXCJK1013_MAX_STARTUP_TIME_US;
374}
Daniel Balutac9bf2372014-03-09 16:13:00 +0000375#endif
Srinivas Pandruvada124e1b1d2014-05-08 22:58:00 +0100376
377static int kxcjk1013_set_power_state(struct kxcjk1013_data *data, bool on)
378{
379 int ret;
380
381 if (on)
382 ret = pm_runtime_get_sync(&data->client->dev);
383 else {
384 pm_runtime_mark_last_busy(&data->client->dev);
385 ret = pm_runtime_put_autosuspend(&data->client->dev);
386 }
387 if (ret < 0) {
388 dev_err(&data->client->dev,
389 "Failed: kxcjk1013_set_power_state for %d\n", on);
390 return ret;
391 }
392
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +0000393 return 0;
394}
395
Srinivas Pandruvadab4b491c2014-08-22 20:01:00 +0100396static int kxcjk1013_chip_update_thresholds(struct kxcjk1013_data *data)
397{
398 int ret;
399
400 ret = i2c_smbus_write_byte_data(data->client,
401 KXCJK1013_REG_WAKE_TIMER,
402 data->wake_dur);
403 if (ret < 0) {
404 dev_err(&data->client->dev,
405 "Error writing reg_wake_timer\n");
406 return ret;
407 }
408
409 ret = i2c_smbus_write_byte_data(data->client,
410 KXCJK1013_REG_WAKE_THRES,
411 data->wake_thres);
412 if (ret < 0) {
413 dev_err(&data->client->dev, "Error writing reg_wake_thres\n");
414 return ret;
415 }
416
417 return 0;
418}
419
420static int kxcjk1013_setup_any_motion_interrupt(struct kxcjk1013_data *data,
421 bool status)
422{
423 int ret;
424 enum kxcjk1013_mode store_mode;
425
426 ret = kxcjk1013_get_mode(data, &store_mode);
427 if (ret < 0)
428 return ret;
429
430 /* This is requirement by spec to change state to STANDBY */
431 ret = kxcjk1013_set_mode(data, STANDBY);
432 if (ret < 0)
433 return ret;
434
435 ret = kxcjk1013_chip_update_thresholds(data);
436 if (ret < 0)
437 return ret;
438
439 ret = i2c_smbus_read_byte_data(data->client, KXCJK1013_REG_INT_CTRL1);
440 if (ret < 0) {
441 dev_err(&data->client->dev, "Error reading reg_int_ctrl1\n");
442 return ret;
443 }
444
445 if (status)
446 ret |= KXCJK1013_REG_INT_REG1_BIT_IEN;
447 else
448 ret &= ~KXCJK1013_REG_INT_REG1_BIT_IEN;
449
450 ret = i2c_smbus_write_byte_data(data->client, KXCJK1013_REG_INT_CTRL1,
451 ret);
452 if (ret < 0) {
453 dev_err(&data->client->dev, "Error writing reg_int_ctrl1\n");
454 return ret;
455 }
456
457 ret = i2c_smbus_read_byte_data(data->client, KXCJK1013_REG_CTRL1);
458 if (ret < 0) {
459 dev_err(&data->client->dev, "Error reading reg_ctrl1\n");
460 return ret;
461 }
462
463 if (status)
464 ret |= KXCJK1013_REG_CTRL1_BIT_WUFE;
465 else
466 ret &= ~KXCJK1013_REG_CTRL1_BIT_WUFE;
467
468 ret = i2c_smbus_write_byte_data(data->client,
469 KXCJK1013_REG_CTRL1, ret);
470 if (ret < 0) {
471 dev_err(&data->client->dev, "Error writing reg_ctrl1\n");
472 return ret;
473 }
474
475 if (store_mode == OPERATION) {
476 ret = kxcjk1013_set_mode(data, OPERATION);
477 if (ret < 0)
478 return ret;
479 }
480
481 return 0;
482}
483
484static int kxcjk1013_setup_new_data_interrupt(struct kxcjk1013_data *data,
485 bool status)
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +0000486{
487 int ret;
Srinivas Pandruvada124e1b1d2014-05-08 22:58:00 +0100488 enum kxcjk1013_mode store_mode;
489
490 ret = kxcjk1013_get_mode(data, &store_mode);
491 if (ret < 0)
492 return ret;
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +0000493
494 /* This is requirement by spec to change state to STANDBY */
495 ret = kxcjk1013_set_mode(data, STANDBY);
496 if (ret < 0)
497 return ret;
498
499 ret = i2c_smbus_read_byte_data(data->client, KXCJK1013_REG_INT_CTRL1);
500 if (ret < 0) {
501 dev_err(&data->client->dev, "Error reading reg_int_ctrl1\n");
502 return ret;
503 }
504
505 if (status)
506 ret |= KXCJK1013_REG_INT_REG1_BIT_IEN;
507 else
508 ret &= ~KXCJK1013_REG_INT_REG1_BIT_IEN;
509
510 ret = i2c_smbus_write_byte_data(data->client, KXCJK1013_REG_INT_CTRL1,
511 ret);
512 if (ret < 0) {
513 dev_err(&data->client->dev, "Error writing reg_int_ctrl1\n");
514 return ret;
515 }
516
517 ret = i2c_smbus_read_byte_data(data->client, KXCJK1013_REG_CTRL1);
518 if (ret < 0) {
519 dev_err(&data->client->dev, "Error reading reg_ctrl1\n");
520 return ret;
521 }
522
523 if (status)
524 ret |= KXCJK1013_REG_CTRL1_BIT_DRDY;
525 else
526 ret &= ~KXCJK1013_REG_CTRL1_BIT_DRDY;
527
528 ret = i2c_smbus_write_byte_data(data->client,
529 KXCJK1013_REG_CTRL1, ret);
530 if (ret < 0) {
531 dev_err(&data->client->dev, "Error writing reg_ctrl1\n");
532 return ret;
533 }
534
Srinivas Pandruvada124e1b1d2014-05-08 22:58:00 +0100535 if (store_mode == OPERATION) {
536 ret = kxcjk1013_set_mode(data, OPERATION);
537 if (ret < 0)
538 return ret;
539 }
540
541 return 0;
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +0000542}
543
544static int kxcjk1013_convert_freq_to_bit(int val, int val2)
545{
546 int i;
547
548 for (i = 0; i < ARRAY_SIZE(samp_freq_table); ++i) {
549 if (samp_freq_table[i].val == val &&
550 samp_freq_table[i].val2 == val2) {
551 return samp_freq_table[i].odr_bits;
552 }
553 }
554
555 return -EINVAL;
556}
557
Srinivas Pandruvadab4b491c2014-08-22 20:01:00 +0100558static int kxcjk1013_convert_wake_odr_to_bit(int val, int val2)
559{
560 int i;
561
562 for (i = 0; i < ARRAY_SIZE(wake_odr_data_rate_table); ++i) {
563 if (wake_odr_data_rate_table[i].val == val &&
564 wake_odr_data_rate_table[i].val2 == val2) {
565 return wake_odr_data_rate_table[i].odr_bits;
566 }
567 }
568
569 return -EINVAL;
570}
571
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +0000572static int kxcjk1013_set_odr(struct kxcjk1013_data *data, int val, int val2)
573{
574 int ret;
575 int odr_bits;
Srinivas Pandruvada124e1b1d2014-05-08 22:58:00 +0100576 enum kxcjk1013_mode store_mode;
577
578 ret = kxcjk1013_get_mode(data, &store_mode);
579 if (ret < 0)
580 return ret;
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +0000581
582 odr_bits = kxcjk1013_convert_freq_to_bit(val, val2);
583 if (odr_bits < 0)
584 return odr_bits;
585
586 /* To change ODR, the chip must be set to STANDBY as per spec */
587 ret = kxcjk1013_set_mode(data, STANDBY);
588 if (ret < 0)
589 return ret;
590
591 ret = i2c_smbus_write_byte_data(data->client, KXCJK1013_REG_DATA_CTRL,
592 odr_bits);
593 if (ret < 0) {
594 dev_err(&data->client->dev, "Error writing data_ctrl\n");
595 return ret;
596 }
597
598 data->odr_bits = odr_bits;
599
Srinivas Pandruvadab4b491c2014-08-22 20:01:00 +0100600 odr_bits = kxcjk1013_convert_wake_odr_to_bit(val, val2);
601 if (odr_bits < 0)
602 return odr_bits;
603
604 ret = i2c_smbus_write_byte_data(data->client, KXCJK1013_REG_CTRL2,
605 odr_bits);
606 if (ret < 0) {
607 dev_err(&data->client->dev, "Error writing reg_ctrl2\n");
608 return ret;
609 }
610
Srinivas Pandruvada124e1b1d2014-05-08 22:58:00 +0100611 if (store_mode == OPERATION) {
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +0000612 ret = kxcjk1013_set_mode(data, OPERATION);
613 if (ret < 0)
614 return ret;
615 }
616
617 return 0;
618}
619
620static int kxcjk1013_get_odr(struct kxcjk1013_data *data, int *val, int *val2)
621{
622 int i;
623
624 for (i = 0; i < ARRAY_SIZE(samp_freq_table); ++i) {
625 if (samp_freq_table[i].odr_bits == data->odr_bits) {
626 *val = samp_freq_table[i].val;
627 *val2 = samp_freq_table[i].val2;
628 return IIO_VAL_INT_PLUS_MICRO;
629 }
630 }
631
632 return -EINVAL;
633}
634
635static int kxcjk1013_get_acc_reg(struct kxcjk1013_data *data, int axis)
636{
637 u8 reg = KXCJK1013_REG_XOUT_L + axis * 2;
638 int ret;
639
640 ret = i2c_smbus_read_word_data(data->client, reg);
641 if (ret < 0) {
642 dev_err(&data->client->dev,
643 "failed to read accel_%c registers\n", 'x' + axis);
644 return ret;
645 }
646
647 return ret;
648}
649
Srinivas Pandruvadaa735e3d2014-05-08 22:58:00 +0100650static int kxcjk1013_set_scale(struct kxcjk1013_data *data, int val)
651{
652 int ret, i;
653 enum kxcjk1013_mode store_mode;
654
655
656 for (i = 0; i < ARRAY_SIZE(KXCJK1013_scale_table); ++i) {
657 if (KXCJK1013_scale_table[i].scale == val) {
658
659 ret = kxcjk1013_get_mode(data, &store_mode);
660 if (ret < 0)
661 return ret;
662
663 ret = kxcjk1013_set_mode(data, STANDBY);
664 if (ret < 0)
665 return ret;
666
667 ret = kxcjk1013_set_range(data, i);
668 if (ret < 0)
669 return ret;
670
671 if (store_mode == OPERATION) {
672 ret = kxcjk1013_set_mode(data, OPERATION);
673 if (ret)
674 return ret;
675 }
676
677 return 0;
678 }
679 }
680
681 return -EINVAL;
682}
683
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +0000684static int kxcjk1013_read_raw(struct iio_dev *indio_dev,
685 struct iio_chan_spec const *chan, int *val,
686 int *val2, long mask)
687{
688 struct kxcjk1013_data *data = iio_priv(indio_dev);
689 int ret;
690
691 switch (mask) {
692 case IIO_CHAN_INFO_RAW:
693 mutex_lock(&data->mutex);
694 if (iio_buffer_enabled(indio_dev))
695 ret = -EBUSY;
696 else {
Srinivas Pandruvada124e1b1d2014-05-08 22:58:00 +0100697 ret = kxcjk1013_set_power_state(data, true);
Srinivas Pandruvada88f6da72014-06-16 20:00:00 +0100698 if (ret < 0) {
699 mutex_unlock(&data->mutex);
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +0000700 return ret;
Srinivas Pandruvada88f6da72014-06-16 20:00:00 +0100701 }
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +0000702 ret = kxcjk1013_get_acc_reg(data, chan->scan_index);
Srinivas Pandruvada124e1b1d2014-05-08 22:58:00 +0100703 if (ret < 0) {
704 kxcjk1013_set_power_state(data, false);
705 mutex_unlock(&data->mutex);
706 return ret;
707 }
708 *val = sign_extend32(ret >> 4, 11);
709 ret = kxcjk1013_set_power_state(data, false);
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +0000710 }
711 mutex_unlock(&data->mutex);
712
713 if (ret < 0)
714 return ret;
715
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +0000716 return IIO_VAL_INT;
717
718 case IIO_CHAN_INFO_SCALE:
719 *val = 0;
Srinivas Pandruvadaa735e3d2014-05-08 22:58:00 +0100720 *val2 = KXCJK1013_scale_table[data->range].scale;
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +0000721 return IIO_VAL_INT_PLUS_MICRO;
722
723 case IIO_CHAN_INFO_SAMP_FREQ:
724 mutex_lock(&data->mutex);
725 ret = kxcjk1013_get_odr(data, val, val2);
726 mutex_unlock(&data->mutex);
727 return ret;
728
729 default:
730 return -EINVAL;
731 }
732}
733
734static int kxcjk1013_write_raw(struct iio_dev *indio_dev,
735 struct iio_chan_spec const *chan, int val,
736 int val2, long mask)
737{
738 struct kxcjk1013_data *data = iio_priv(indio_dev);
739 int ret;
740
741 switch (mask) {
742 case IIO_CHAN_INFO_SAMP_FREQ:
743 mutex_lock(&data->mutex);
744 ret = kxcjk1013_set_odr(data, val, val2);
745 mutex_unlock(&data->mutex);
746 break;
Srinivas Pandruvadaa735e3d2014-05-08 22:58:00 +0100747 case IIO_CHAN_INFO_SCALE:
748 if (val)
749 return -EINVAL;
750
751 mutex_lock(&data->mutex);
752 ret = kxcjk1013_set_scale(data, val2);
753 mutex_unlock(&data->mutex);
754 break;
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +0000755 default:
756 ret = -EINVAL;
757 }
758
759 return ret;
760}
761
Srinivas Pandruvadab4b491c2014-08-22 20:01:00 +0100762static int kxcjk1013_read_event(struct iio_dev *indio_dev,
763 const struct iio_chan_spec *chan,
764 enum iio_event_type type,
765 enum iio_event_direction dir,
766 enum iio_event_info info,
767 int *val, int *val2)
768{
769 struct kxcjk1013_data *data = iio_priv(indio_dev);
770
771 *val2 = 0;
772 switch (info) {
773 case IIO_EV_INFO_VALUE:
774 *val = data->wake_thres;
775 break;
776 case IIO_EV_INFO_PERIOD:
777 *val = data->wake_dur;
778 break;
779 default:
780 return -EINVAL;
781 }
782
783 return IIO_VAL_INT;
784}
785
786static int kxcjk1013_write_event(struct iio_dev *indio_dev,
787 const struct iio_chan_spec *chan,
788 enum iio_event_type type,
789 enum iio_event_direction dir,
790 enum iio_event_info info,
791 int val, int val2)
792{
793 struct kxcjk1013_data *data = iio_priv(indio_dev);
794
795 if (data->ev_enable_state)
796 return -EBUSY;
797
798 switch (info) {
799 case IIO_EV_INFO_VALUE:
800 data->wake_thres = val;
801 break;
802 case IIO_EV_INFO_PERIOD:
803 data->wake_dur = val;
804 break;
805 default:
806 return -EINVAL;
807 }
808
809 return 0;
810}
811
812static int kxcjk1013_read_event_config(struct iio_dev *indio_dev,
813 const struct iio_chan_spec *chan,
814 enum iio_event_type type,
815 enum iio_event_direction dir)
816{
817
818 struct kxcjk1013_data *data = iio_priv(indio_dev);
819
820 return data->ev_enable_state;
821}
822
823static int kxcjk1013_write_event_config(struct iio_dev *indio_dev,
824 const struct iio_chan_spec *chan,
825 enum iio_event_type type,
826 enum iio_event_direction dir,
827 int state)
828{
829 struct kxcjk1013_data *data = iio_priv(indio_dev);
830 int ret;
831
832 if (state && data->ev_enable_state)
833 return 0;
834
835 mutex_lock(&data->mutex);
836
837 if (!state && data->motion_trigger_on) {
838 data->ev_enable_state = 0;
839 mutex_unlock(&data->mutex);
840 return 0;
841 }
842
843 /*
844 * We will expect the enable and disable to do operation in
845 * in reverse order. This will happen here anyway as our
846 * resume operation uses sync mode runtime pm calls, the
847 * suspend operation will be delayed by autosuspend delay
848 * So the disable operation will still happen in reverse of
849 * enable operation. When runtime pm is disabled the mode
850 * is always on so sequence doesn't matter
851 */
852 ret = kxcjk1013_set_power_state(data, state);
853 if (ret < 0) {
854 mutex_unlock(&data->mutex);
855 return ret;
856 }
857
858 ret = kxcjk1013_setup_any_motion_interrupt(data, state);
859 if (ret < 0) {
860 mutex_unlock(&data->mutex);
861 return ret;
862 }
863
864 data->ev_enable_state = state;
865 mutex_unlock(&data->mutex);
866
867 return 0;
868}
869
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +0000870static int kxcjk1013_validate_trigger(struct iio_dev *indio_dev,
871 struct iio_trigger *trig)
872{
873 struct kxcjk1013_data *data = iio_priv(indio_dev);
874
Srinivas Pandruvadab4b491c2014-08-22 20:01:00 +0100875 if (data->dready_trig != trig && data->motion_trig != trig)
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +0000876 return -EINVAL;
877
878 return 0;
879}
880
881static IIO_CONST_ATTR_SAMP_FREQ_AVAIL(
882 "0.781000 1.563000 3.125000 6.250000 12.500000 25 50 100 200 400 800 1600");
883
Srinivas Pandruvadaa735e3d2014-05-08 22:58:00 +0100884static IIO_CONST_ATTR(in_accel_scale_available, "0.009582 0.019163 0.038326");
885
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +0000886static struct attribute *kxcjk1013_attributes[] = {
887 &iio_const_attr_sampling_frequency_available.dev_attr.attr,
Srinivas Pandruvadaa735e3d2014-05-08 22:58:00 +0100888 &iio_const_attr_in_accel_scale_available.dev_attr.attr,
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +0000889 NULL,
890};
891
892static const struct attribute_group kxcjk1013_attrs_group = {
893 .attrs = kxcjk1013_attributes,
894};
895
Srinivas Pandruvadab4b491c2014-08-22 20:01:00 +0100896static const struct iio_event_spec kxcjk1013_event = {
897 .type = IIO_EV_TYPE_THRESH,
898 .dir = IIO_EV_DIR_RISING | IIO_EV_DIR_FALLING,
899 .mask_separate = BIT(IIO_EV_INFO_VALUE) |
900 BIT(IIO_EV_INFO_ENABLE) |
901 BIT(IIO_EV_INFO_PERIOD)
902};
903
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +0000904#define KXCJK1013_CHANNEL(_axis) { \
905 .type = IIO_ACCEL, \
906 .modified = 1, \
907 .channel2 = IIO_MOD_##_axis, \
908 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
909 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \
910 BIT(IIO_CHAN_INFO_SAMP_FREQ), \
911 .scan_index = AXIS_##_axis, \
912 .scan_type = { \
913 .sign = 's', \
914 .realbits = 12, \
915 .storagebits = 16, \
916 .shift = 4, \
Peter Meerwaldf4e2f94d2014-07-14 21:38:00 +0100917 .endianness = IIO_CPU, \
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +0000918 }, \
Srinivas Pandruvadab4b491c2014-08-22 20:01:00 +0100919 .event_spec = &kxcjk1013_event, \
920 .num_event_specs = 1 \
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +0000921}
922
923static const struct iio_chan_spec kxcjk1013_channels[] = {
924 KXCJK1013_CHANNEL(X),
925 KXCJK1013_CHANNEL(Y),
926 KXCJK1013_CHANNEL(Z),
927 IIO_CHAN_SOFT_TIMESTAMP(3),
928};
929
930static const struct iio_info kxcjk1013_info = {
931 .attrs = &kxcjk1013_attrs_group,
932 .read_raw = kxcjk1013_read_raw,
933 .write_raw = kxcjk1013_write_raw,
Srinivas Pandruvadab4b491c2014-08-22 20:01:00 +0100934 .read_event_value = kxcjk1013_read_event,
935 .write_event_value = kxcjk1013_write_event,
936 .write_event_config = kxcjk1013_write_event_config,
937 .read_event_config = kxcjk1013_read_event_config,
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +0000938 .validate_trigger = kxcjk1013_validate_trigger,
939 .driver_module = THIS_MODULE,
940};
941
942static irqreturn_t kxcjk1013_trigger_handler(int irq, void *p)
943{
944 struct iio_poll_func *pf = p;
945 struct iio_dev *indio_dev = pf->indio_dev;
946 struct kxcjk1013_data *data = iio_priv(indio_dev);
947 int bit, ret, i = 0;
948
949 mutex_lock(&data->mutex);
950
951 for_each_set_bit(bit, indio_dev->buffer->scan_mask,
952 indio_dev->masklength) {
953 ret = kxcjk1013_get_acc_reg(data, bit);
954 if (ret < 0) {
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +0000955 mutex_unlock(&data->mutex);
956 goto err;
957 }
958 data->buffer[i++] = ret;
959 }
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +0000960 mutex_unlock(&data->mutex);
961
962 iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
Srinivas Pandruvadab4b491c2014-08-22 20:01:00 +0100963 data->timestamp);
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +0000964err:
965 iio_trigger_notify_done(indio_dev->trig);
966
967 return IRQ_HANDLED;
968}
969
Srinivas Pandruvada59bfeab2014-07-17 01:42:00 +0100970static int kxcjk1013_trig_try_reen(struct iio_trigger *trig)
971{
972 struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
973 struct kxcjk1013_data *data = iio_priv(indio_dev);
974 int ret;
975
976 ret = i2c_smbus_read_byte_data(data->client, KXCJK1013_REG_INT_REL);
977 if (ret < 0) {
978 dev_err(&data->client->dev, "Error reading reg_int_rel\n");
979 return ret;
980 }
981
982 return 0;
983}
984
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +0000985static int kxcjk1013_data_rdy_trigger_set_state(struct iio_trigger *trig,
986 bool state)
987{
988 struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
989 struct kxcjk1013_data *data = iio_priv(indio_dev);
Srinivas Pandruvada124e1b1d2014-05-08 22:58:00 +0100990 int ret;
991
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +0000992 mutex_lock(&data->mutex);
Srinivas Pandruvadab4b491c2014-08-22 20:01:00 +0100993
994 if (!state && data->ev_enable_state && data->motion_trigger_on) {
995 data->motion_trigger_on = false;
996 mutex_unlock(&data->mutex);
997 return 0;
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +0000998 }
Srinivas Pandruvadab4b491c2014-08-22 20:01:00 +0100999
1000 ret = kxcjk1013_set_power_state(data, state);
1001 if (ret < 0) {
1002 mutex_unlock(&data->mutex);
1003 return ret;
1004 }
1005 if (data->motion_trig == trig)
1006 ret = kxcjk1013_setup_any_motion_interrupt(data, state);
1007 else
1008 ret = kxcjk1013_setup_new_data_interrupt(data, state);
1009 if (ret < 0) {
1010 mutex_unlock(&data->mutex);
1011 return ret;
1012 }
1013 if (data->motion_trig == trig)
1014 data->motion_trigger_on = state;
1015 else
1016 data->dready_trigger_on = state;
1017
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +00001018 mutex_unlock(&data->mutex);
1019
1020 return 0;
1021}
1022
1023static const struct iio_trigger_ops kxcjk1013_trigger_ops = {
1024 .set_trigger_state = kxcjk1013_data_rdy_trigger_set_state,
Srinivas Pandruvada59bfeab2014-07-17 01:42:00 +01001025 .try_reenable = kxcjk1013_trig_try_reen,
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +00001026 .owner = THIS_MODULE,
1027};
1028
Srinivas Pandruvadab4b491c2014-08-22 20:01:00 +01001029static irqreturn_t kxcjk1013_event_handler(int irq, void *private)
1030{
1031 struct iio_dev *indio_dev = private;
1032 struct kxcjk1013_data *data = iio_priv(indio_dev);
1033 int ret;
1034
1035 ret = i2c_smbus_read_byte_data(data->client, KXCJK1013_REG_INT_SRC1);
1036 if (ret < 0) {
1037 dev_err(&data->client->dev, "Error reading reg_int_src1\n");
1038 goto ack_intr;
1039 }
1040
1041 if (ret & 0x02) {
1042 ret = i2c_smbus_read_byte_data(data->client,
1043 KXCJK1013_REG_INT_SRC2);
1044 if (ret < 0) {
1045 dev_err(&data->client->dev,
1046 "Error reading reg_int_src2\n");
1047 goto ack_intr;
1048 }
1049
1050 if (ret & KXCJK1013_REG_INT_SRC2_BIT_XN)
1051 iio_push_event(indio_dev,
1052 IIO_MOD_EVENT_CODE(IIO_ACCEL,
1053 0,
1054 IIO_MOD_X,
1055 IIO_EV_TYPE_THRESH,
1056 IIO_EV_DIR_FALLING),
1057 data->timestamp);
1058 if (ret & KXCJK1013_REG_INT_SRC2_BIT_XP)
1059 iio_push_event(indio_dev,
1060 IIO_MOD_EVENT_CODE(IIO_ACCEL,
1061 0,
1062 IIO_MOD_X,
1063 IIO_EV_TYPE_THRESH,
1064 IIO_EV_DIR_RISING),
1065 data->timestamp);
1066
1067
1068 if (ret & KXCJK1013_REG_INT_SRC2_BIT_YN)
1069 iio_push_event(indio_dev,
1070 IIO_MOD_EVENT_CODE(IIO_ACCEL,
1071 0,
1072 IIO_MOD_Y,
1073 IIO_EV_TYPE_THRESH,
1074 IIO_EV_DIR_FALLING),
1075 data->timestamp);
1076 if (ret & KXCJK1013_REG_INT_SRC2_BIT_YP)
1077 iio_push_event(indio_dev,
1078 IIO_MOD_EVENT_CODE(IIO_ACCEL,
1079 0,
1080 IIO_MOD_Y,
1081 IIO_EV_TYPE_THRESH,
1082 IIO_EV_DIR_RISING),
1083 data->timestamp);
1084
1085 if (ret & KXCJK1013_REG_INT_SRC2_BIT_ZN)
1086 iio_push_event(indio_dev,
1087 IIO_MOD_EVENT_CODE(IIO_ACCEL,
1088 0,
1089 IIO_MOD_Z,
1090 IIO_EV_TYPE_THRESH,
1091 IIO_EV_DIR_FALLING),
1092 data->timestamp);
1093 if (ret & KXCJK1013_REG_INT_SRC2_BIT_ZP)
1094 iio_push_event(indio_dev,
1095 IIO_MOD_EVENT_CODE(IIO_ACCEL,
1096 0,
1097 IIO_MOD_Z,
1098 IIO_EV_TYPE_THRESH,
1099 IIO_EV_DIR_RISING),
1100 data->timestamp);
1101 }
1102
1103ack_intr:
1104 if (data->dready_trigger_on)
1105 return IRQ_HANDLED;
1106
1107 ret = i2c_smbus_read_byte_data(data->client, KXCJK1013_REG_INT_REL);
1108 if (ret < 0)
1109 dev_err(&data->client->dev, "Error reading reg_int_rel\n");
1110
1111 return IRQ_HANDLED;
1112}
1113
1114static irqreturn_t kxcjk1013_data_rdy_trig_poll(int irq, void *private)
1115{
1116 struct iio_dev *indio_dev = private;
1117 struct kxcjk1013_data *data = iio_priv(indio_dev);
1118
1119 data->timestamp = iio_get_time_ns();
1120
1121 if (data->dready_trigger_on)
1122 iio_trigger_poll(data->dready_trig);
1123 else if (data->motion_trigger_on)
1124 iio_trigger_poll(data->motion_trig);
1125
1126 if (data->ev_enable_state)
1127 return IRQ_WAKE_THREAD;
1128 else
1129 return IRQ_HANDLED;
1130}
1131
Daniel Balutac6861372014-03-09 08:33:00 +00001132static const char *kxcjk1013_match_acpi_device(struct device *dev,
Bastien Nocera3bfa74f2014-05-11 22:09:00 +01001133 enum kx_chipset *chipset,
1134 bool *is_smo8500_device)
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +00001135{
1136 const struct acpi_device_id *id;
Daniel Balutac6861372014-03-09 08:33:00 +00001137 id = acpi_match_device(dev->driver->acpi_match_table, dev);
1138 if (!id)
1139 return NULL;
Bastien Nocera3bfa74f2014-05-11 22:09:00 +01001140 if (strcmp(id->id, "SMO8500") == 0)
1141 *is_smo8500_device = true;
Daniel Balutac6861372014-03-09 08:33:00 +00001142 *chipset = (enum kx_chipset)id->driver_data;
1143
1144 return dev_name(dev);
1145}
1146
1147static int kxcjk1013_gpio_probe(struct i2c_client *client,
1148 struct kxcjk1013_data *data)
1149{
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +00001150 struct device *dev;
1151 struct gpio_desc *gpio;
1152 int ret;
1153
1154 if (!client)
1155 return -EINVAL;
Bastien Nocera3bfa74f2014-05-11 22:09:00 +01001156 if (data->is_smo8500_device)
1157 return -ENOTSUPP;
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +00001158
1159 dev = &client->dev;
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +00001160
1161 /* data ready gpio interrupt pin */
1162 gpio = devm_gpiod_get_index(dev, "kxcjk1013_int", 0);
1163 if (IS_ERR(gpio)) {
1164 dev_err(dev, "acpi gpio get index failed\n");
1165 return PTR_ERR(gpio);
1166 }
1167
1168 ret = gpiod_direction_input(gpio);
1169 if (ret)
1170 return ret;
1171
1172 ret = gpiod_to_irq(gpio);
1173
1174 dev_dbg(dev, "GPIO resource, no:%d irq:%d\n", desc_to_gpio(gpio), ret);
1175
1176 return ret;
1177}
1178
1179static int kxcjk1013_probe(struct i2c_client *client,
1180 const struct i2c_device_id *id)
1181{
1182 struct kxcjk1013_data *data;
1183 struct iio_dev *indio_dev;
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +00001184 struct kxcjk_1013_platform_data *pdata;
Daniel Balutac6861372014-03-09 08:33:00 +00001185 const char *name;
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +00001186 int ret;
1187
1188 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
1189 if (!indio_dev)
1190 return -ENOMEM;
1191
1192 data = iio_priv(indio_dev);
1193 i2c_set_clientdata(client, indio_dev);
1194 data->client = client;
1195
1196 pdata = dev_get_platdata(&client->dev);
1197 if (pdata)
1198 data->active_high_intr = pdata->active_high_intr;
1199 else
1200 data->active_high_intr = true; /* default polarity */
1201
Daniel Balutac6861372014-03-09 08:33:00 +00001202 if (id) {
1203 data->chipset = (enum kx_chipset)(id->driver_data);
1204 name = id->name;
1205 } else if (ACPI_HANDLE(&client->dev)) {
1206 name = kxcjk1013_match_acpi_device(&client->dev,
Bastien Nocera3bfa74f2014-05-11 22:09:00 +01001207 &data->chipset,
1208 &data->is_smo8500_device);
Daniel Balutac6861372014-03-09 08:33:00 +00001209 } else
1210 return -ENODEV;
1211
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +00001212 ret = kxcjk1013_chip_init(data);
1213 if (ret < 0)
1214 return ret;
1215
1216 mutex_init(&data->mutex);
1217
1218 indio_dev->dev.parent = &client->dev;
1219 indio_dev->channels = kxcjk1013_channels;
1220 indio_dev->num_channels = ARRAY_SIZE(kxcjk1013_channels);
Daniel Balutac6861372014-03-09 08:33:00 +00001221 indio_dev->name = name;
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +00001222 indio_dev->modes = INDIO_DIRECT_MODE;
1223 indio_dev->info = &kxcjk1013_info;
1224
1225 if (client->irq < 0)
Daniel Balutac6861372014-03-09 08:33:00 +00001226 client->irq = kxcjk1013_gpio_probe(client, data);
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +00001227
1228 if (client->irq >= 0) {
Srinivas Pandruvadab4b491c2014-08-22 20:01:00 +01001229 ret = devm_request_threaded_irq(&client->dev, client->irq,
1230 kxcjk1013_data_rdy_trig_poll,
1231 kxcjk1013_event_handler,
1232 IRQF_TRIGGER_RISING,
1233 KXCJK1013_IRQ_NAME,
1234 indio_dev);
1235 if (ret)
1236 return ret;
1237
1238 data->dready_trig = devm_iio_trigger_alloc(&client->dev,
1239 "%s-dev%d",
1240 indio_dev->name,
1241 indio_dev->id);
1242 if (!data->dready_trig)
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +00001243 return -ENOMEM;
1244
Srinivas Pandruvadab4b491c2014-08-22 20:01:00 +01001245 data->motion_trig = devm_iio_trigger_alloc(&client->dev,
1246 "%s-any-motion-dev%d",
1247 indio_dev->name,
1248 indio_dev->id);
1249 if (!data->motion_trig)
1250 return -ENOMEM;
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +00001251
Srinivas Pandruvadab4b491c2014-08-22 20:01:00 +01001252 data->dready_trig->dev.parent = &client->dev;
1253 data->dready_trig->ops = &kxcjk1013_trigger_ops;
1254 iio_trigger_set_drvdata(data->dready_trig, indio_dev);
1255 indio_dev->trig = data->dready_trig;
Srinivas Pandruvadac1288b82014-07-17 01:42:00 +01001256 iio_trigger_get(indio_dev->trig);
Srinivas Pandruvadab4b491c2014-08-22 20:01:00 +01001257 ret = iio_trigger_register(data->dready_trig);
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +00001258 if (ret)
Srinivas Pandruvadab4b491c2014-08-22 20:01:00 +01001259 return ret;
1260
1261 data->motion_trig->dev.parent = &client->dev;
1262 data->motion_trig->ops = &kxcjk1013_trigger_ops;
1263 iio_trigger_set_drvdata(data->motion_trig, indio_dev);
1264 ret = iio_trigger_register(data->motion_trig);
1265 if (ret) {
1266 data->motion_trig = NULL;
1267 goto err_trigger_unregister;
1268 }
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +00001269
1270 ret = iio_triggered_buffer_setup(indio_dev,
1271 &iio_pollfunc_store_time,
1272 kxcjk1013_trigger_handler,
1273 NULL);
1274 if (ret < 0) {
1275 dev_err(&client->dev,
1276 "iio triggered buffer setup failed\n");
1277 goto err_trigger_unregister;
1278 }
1279 }
1280
Srinivas Pandruvada124e1b1d2014-05-08 22:58:00 +01001281 ret = iio_device_register(indio_dev);
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +00001282 if (ret < 0) {
1283 dev_err(&client->dev, "unable to register iio device\n");
1284 goto err_buffer_cleanup;
1285 }
1286
Srinivas Pandruvada124e1b1d2014-05-08 22:58:00 +01001287 ret = pm_runtime_set_active(&client->dev);
1288 if (ret)
1289 goto err_iio_unregister;
1290
1291 pm_runtime_enable(&client->dev);
1292 pm_runtime_set_autosuspend_delay(&client->dev,
1293 KXCJK1013_SLEEP_DELAY_MS);
1294 pm_runtime_use_autosuspend(&client->dev);
1295
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +00001296 return 0;
1297
Srinivas Pandruvada124e1b1d2014-05-08 22:58:00 +01001298err_iio_unregister:
1299 iio_device_unregister(indio_dev);
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +00001300err_buffer_cleanup:
Srinivas Pandruvadab4b491c2014-08-22 20:01:00 +01001301 if (data->dready_trig)
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +00001302 iio_triggered_buffer_cleanup(indio_dev);
1303err_trigger_unregister:
Srinivas Pandruvadab4b491c2014-08-22 20:01:00 +01001304 if (data->dready_trig)
1305 iio_trigger_unregister(data->dready_trig);
1306 if (data->motion_trig)
1307 iio_trigger_unregister(data->motion_trig);
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +00001308
1309 return ret;
1310}
1311
1312static int kxcjk1013_remove(struct i2c_client *client)
1313{
1314 struct iio_dev *indio_dev = i2c_get_clientdata(client);
1315 struct kxcjk1013_data *data = iio_priv(indio_dev);
1316
Srinivas Pandruvada124e1b1d2014-05-08 22:58:00 +01001317 pm_runtime_disable(&client->dev);
1318 pm_runtime_set_suspended(&client->dev);
1319 pm_runtime_put_noidle(&client->dev);
1320
1321 iio_device_unregister(indio_dev);
1322
Srinivas Pandruvadab4b491c2014-08-22 20:01:00 +01001323 if (data->dready_trig) {
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +00001324 iio_triggered_buffer_cleanup(indio_dev);
Srinivas Pandruvadab4b491c2014-08-22 20:01:00 +01001325 iio_trigger_unregister(data->dready_trig);
1326 iio_trigger_unregister(data->motion_trig);
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +00001327 }
1328
1329 mutex_lock(&data->mutex);
1330 kxcjk1013_set_mode(data, STANDBY);
1331 mutex_unlock(&data->mutex);
1332
1333 return 0;
1334}
1335
1336#ifdef CONFIG_PM_SLEEP
1337static int kxcjk1013_suspend(struct device *dev)
1338{
1339 struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
1340 struct kxcjk1013_data *data = iio_priv(indio_dev);
Srinivas Pandruvada124e1b1d2014-05-08 22:58:00 +01001341 int ret;
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +00001342
1343 mutex_lock(&data->mutex);
Srinivas Pandruvada124e1b1d2014-05-08 22:58:00 +01001344 ret = kxcjk1013_set_mode(data, STANDBY);
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +00001345 mutex_unlock(&data->mutex);
1346
Srinivas Pandruvada124e1b1d2014-05-08 22:58:00 +01001347 return ret;
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +00001348}
1349
1350static int kxcjk1013_resume(struct device *dev)
1351{
1352 struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
1353 struct kxcjk1013_data *data = iio_priv(indio_dev);
Srinivas Pandruvada124e1b1d2014-05-08 22:58:00 +01001354 int ret = 0;
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +00001355
1356 mutex_lock(&data->mutex);
Irina Tirdead3653d02014-12-06 00:18:07 +02001357 ret = kxcjk1013_set_mode(data, OPERATION);
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +00001358 mutex_unlock(&data->mutex);
1359
Srinivas Pandruvada124e1b1d2014-05-08 22:58:00 +01001360 return ret;
1361}
1362#endif
1363
1364#ifdef CONFIG_PM_RUNTIME
1365static int kxcjk1013_runtime_suspend(struct device *dev)
1366{
1367 struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
1368 struct kxcjk1013_data *data = iio_priv(indio_dev);
1369
1370 return kxcjk1013_set_mode(data, STANDBY);
1371}
1372
1373static int kxcjk1013_runtime_resume(struct device *dev)
1374{
1375 struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
1376 struct kxcjk1013_data *data = iio_priv(indio_dev);
1377 int ret;
1378 int sleep_val;
1379
1380 ret = kxcjk1013_set_mode(data, OPERATION);
1381 if (ret < 0)
1382 return ret;
1383
1384 sleep_val = kxcjk1013_get_startup_times(data);
1385 if (sleep_val < 20000)
1386 usleep_range(sleep_val, 20000);
1387 else
1388 msleep_interruptible(sleep_val/1000);
1389
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +00001390 return 0;
1391}
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +00001392#endif
1393
Srinivas Pandruvada124e1b1d2014-05-08 22:58:00 +01001394static const struct dev_pm_ops kxcjk1013_pm_ops = {
1395 SET_SYSTEM_SLEEP_PM_OPS(kxcjk1013_suspend, kxcjk1013_resume)
1396 SET_RUNTIME_PM_OPS(kxcjk1013_runtime_suspend,
1397 kxcjk1013_runtime_resume, NULL)
1398};
1399
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +00001400static const struct acpi_device_id kx_acpi_match[] = {
Daniel Balutac6861372014-03-09 08:33:00 +00001401 {"KXCJ1013", KXCJK1013},
1402 {"KXCJ1008", KXCJ91008},
1403 {"KXTJ1009", KXTJ21009},
Bastien Nocera3bfa74f2014-05-11 22:09:00 +01001404 {"SMO8500", KXCJ91008},
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +00001405 { },
1406};
1407MODULE_DEVICE_TABLE(acpi, kx_acpi_match);
1408
1409static const struct i2c_device_id kxcjk1013_id[] = {
Daniel Balutac6861372014-03-09 08:33:00 +00001410 {"kxcjk1013", KXCJK1013},
1411 {"kxcj91008", KXCJ91008},
1412 {"kxtj21009", KXTJ21009},
Bastien Nocera3bfa74f2014-05-11 22:09:00 +01001413 {"SMO8500", KXCJ91008},
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +00001414 {}
1415};
1416
1417MODULE_DEVICE_TABLE(i2c, kxcjk1013_id);
1418
1419static struct i2c_driver kxcjk1013_driver = {
1420 .driver = {
1421 .name = KXCJK1013_DRV_NAME,
1422 .acpi_match_table = ACPI_PTR(kx_acpi_match),
Srinivas Pandruvada124e1b1d2014-05-08 22:58:00 +01001423 .pm = &kxcjk1013_pm_ops,
Srinivas Pandruvada1a4fbf62014-11-06 23:07:00 +00001424 },
1425 .probe = kxcjk1013_probe,
1426 .remove = kxcjk1013_remove,
1427 .id_table = kxcjk1013_id,
1428};
1429module_i2c_driver(kxcjk1013_driver);
1430
1431MODULE_AUTHOR("Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>");
1432MODULE_LICENSE("GPL v2");
1433MODULE_DESCRIPTION("KXCJK1013 accelerometer driver");