2 * kr3dh.c - ST Microelectronics three-axes accelerometer
4 * Copyright (C) 2010 Samsung Electronics
5 * Donggeun Kim <dg77.kim@samsung.com>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
12 #include <linux/module.h>
13 #include <linux/init.h>
14 #include <linux/interrupt.h>
15 #include <linux/platform_device.h>
16 #include <linux/workqueue.h>
17 #include <linux/mutex.h>
18 #include <linux/err.h>
19 #include <linux/i2c.h>
20 #include <linux/delay.h>
21 #include <linux/gpio.h>
22 #include <linux/input.h>
23 #include <linux/slab.h>
24 #include <linux/pm_runtime.h>
25 #include <linux/kr3dh.h>
27 #define KR3DH_AUTO_INCREASE 0x80
28 #define KR3DH_WHO_AM_I 0x0f
29 #define KR3DH_CTRL_REG1 0x20
30 #define KR3DH_CTRL_REG2 0x21
31 #define KR3DH_CTRL_REG3 0x22
32 #define KR3DH_CTRL_REG4 0x23
33 #define KR3DH_CTRL_REG5 0x24
34 #define KR3DH_HP_FILTER_RESET 0x25
35 #define KR3DH_REFERENCE 0x26
36 #define KR3DH_STATUS_REG 0x27
37 #define KR3DH_OUT_X_L 0x28
38 #define KR3DH_OUT_X_H 0x29
39 #define KR3DH_OUT_Y_L 0x2a
40 #define KR3DH_OUT_Y_H 0x2b
41 #define KR3DH_OUT_Z_L 0x2c
42 #define KR3DH_OUT_Z_H 0x2d
43 #define KR3DH_INT1_CFG_REG 0x30
44 #define KR3DH_INT1_SRC_REG 0x31
45 #define KR3DH_INT1_THS 0x32
46 #define KR3DH_INT1_DURATION 0x33
47 #define KR3DH_INT2_CFG_REG 0x34
48 #define KR3DH_INT2_SRC_REG 0x35
49 #define KR3DH_INT2_THS 0x36
50 #define KR3DH_INT2_DURATION 0x37
51 #define KR3DH_MULTI_OUT_X_L (KR3DH_AUTO_INCREASE | KR3DH_OUT_X_L)
53 #define KR3DH_PM_SHIFT 5
54 #define KR3DH_PM_MASK ((0x7) << KR3DH_PM_SHIFT)
55 #define KR3DH_DATA_RATE_SHIFT 3
56 #define KR3DH_DATA_RATE_MASK ((0x3) << KR3DH_DATA_RATE_SHIFT)
57 #define KR3DH_ZEN_SHIFT 2
58 #define KR3DH_ZEN_MASK ((0x1) << KR3DH_ZEN_SHIFT)
59 #define KR3DH_YEN_SHIFT 1
60 #define KR3DH_YEN_MASK ((0x1) << KR3DH_YEN_SHIFT)
61 #define KR3DH_XEN_SHIFT 0
62 #define KR3DH_XEN_MASK ((0x1) << KR3DH_XEN_SHIFT)
64 #define KR3DH_BOOT_SHIFT 7
65 #define KR3DH_BOOT_MASK ((0x1) << KR3DH_BOOT_SHIFT)
66 #define KR3DH_HPM_SHIFT 5
67 #define KR3DH_HPM_MASK ((0x3) << KR3DH_HPM_SHIFT)
68 #define KR3DH_FDS_SHIFT 4
69 #define KR3DH_FDS_MASK ((0x1) << KR3DH_FDS_SHIFT)
70 #define KR3DH_HPEN2_SHIFT 3
71 #define KR3DH_HPEN2_MASK ((0x1) << KR3DH_HPEN2_SHIFT)
72 #define KR3DH_HPEN1_SHIFT 2
73 #define KR3DH_HPEN1_MASK ((0x1) << KR3DH_HPEN1_SHIFT)
74 #define KR3DH_HPCF_SHIFT 0
75 #define KR3DH_HPCF_MASK ((0x3) << KR3DH_HPCF_SHIFT)
77 #define KR3DH_INT_ACTIVE_SHIFT 7
78 #define KR3DH_INT_ACTIVE_MASK ((0x1) << KR3DH_INT_ACTIVE_SHIFT)
79 #define KR3DH_INT_PPOD_SHIFT 6
80 #define KR3DH_INT_PPOD_MASK ((0x1) << KR3DH_INT_PPOD_SHIFT)
81 #define KR3DH_LIR2_SHIFT 5
82 #define KR3DH_LIR2_MASK ((0x1) << KR3DH_LIR2_SHIFT)
83 #define KR3DH_INT2_CFG_SHIFT 3
84 #define KR3DH_INT2_CFG_MASK ((0x3) << KR3DH_INT2_CFG_SHIFT)
85 #define KR3DH_LIR1_SHIFT 2
86 #define KR3DH_LIR1_MASK ((0x1) << KR3DH_LIR1_SHIFT)
87 #define KR3DH_INT1_CFG_SHIFT 0
88 #define KR3DH_INT1_CFG_MASK ((0x3) << KR3DH_INT1_CFG_SHIFT)
90 #define KR3DH_BDU_SHIFT 7
91 #define KR3DH_BDU_MASK ((0x1) << KR3DH_BDU_SHIFT)
92 #define KR3DH_BLE_SHIFT 6
93 #define KR3DH_BLE_MASK ((0x1) << KR3DH_BLE_SHIFT)
94 #define KR3DH_FS_SHIFT 4
95 #define KR3DH_FS_MASK ((0x3) << KR3DH_FS_SHIFT)
96 #define KR3DH_ST_SIGN_SHIFT 3
97 #define KR3DH_ST_SIGN_MASK ((0x1) << KR3DH_ST_SIGN_SHIFT)
98 #define KR3DH_ST_SHIFT 1
99 #define KR3DH_ST_MASK ((0x3) << KR3DH_ST_SHIFT)
100 #define KR3DH_SIM_SHIFT 0
101 #define KR3DH_SIM_MASK ((0x1) << KR3DH_SIM_SHIFT)
103 #define KR3DH_TURNON_SHIFT 0
104 #define KR3DH_TURNON_MASK ((0x3) << KR3DH_BOOT_SHIFT)
106 #define KR3DH_ZYXOR_SHIFT 7
107 #define KR3DH_ZYXOR_MASK ((0x1) << KR3DH_ZYXOR_SHIFT)
108 #define KR3DH_ZOR_SHIFT 6
109 #define KR3DH_ZOR_MASK ((0x1) << KR3DH_ZOR_SHIFT)
110 #define KR3DH_YOR_SHIFT 5
111 #define KR3DH_YOR_MASK ((0x1) << KR3DH_YOR_SHIFT)
112 #define KR3DH_XOR_SHIFT 4
113 #define KR3DH_XOR_MASK ((0x1) << KR3DH_XOR_SHIFT)
114 #define KR3DH_ZYXDA_SHIFT 3
115 #define KR3DH_ZYXDA_MASK ((0x1) << KR3DH_ZYXDA_SHIFT)
116 #define KR3DH_ZDA_SHIFT 2
117 #define KR3DH_ZDA_MASK ((0x1) << KR3DH_ZDA_SHIFT)
118 #define KR3DH_YDA_SHIFT 1
119 #define KR3DH_YDA_MASK ((0x1) << KR3DH_YDA_SHIFT)
120 #define KR3DH_XDA_SHIFT 0
121 #define KR3DH_XDA_MASK ((0x1) << KR3DH_XDA_SHIFT)
123 #define KR3DH_AOR_SHIFT 7
124 #define KR3DH_AOR_MASK ((0x1) << KR3DH_AOR_SHIFT)
125 #define KR3DH_6D_SHIFT 6
126 #define KR3DH_6D_MASK ((0x1) << KR3DH_6D_SHIFT)
127 #define KR3DH_ZHIE_SHIFT 5
128 #define KR3DH_ZHIE_MASK ((0x1) << KR3DH_ZHIE_SHIFT)
129 #define KR3DH_ZLIE_SHIFT 4
130 #define KR3DH_ZLIE_MASK ((0x1) << KR3DH_ZLIE_SHIFT)
131 #define KR3DH_YHIE_SHIFT 3
132 #define KR3DH_YHIE_MASK ((0x1) << KR3DH_YHIE_SHIFT)
133 #define KR3DH_YLIE_SHIFT 2
134 #define KR3DH_YLIE_MASK ((0x1) << KR3DH_YLIE_SHIFT)
135 #define KR3DH_XHIE_SHIFT 1
136 #define KR3DH_XHIE_MASK ((0x1) << KR3DH_XHIE_SHIFT)
137 #define KR3DH_XLIE_SHIFT 0
138 #define KR3DH_XLIE_MASK ((0x1) << KR3DH_XLIE_SHIFT)
140 #define KR3DH_IA_SHIFT 6
141 #define KR3DH_IA_MASK ((0x1) << KR3DH_IA_SHIFT)
142 #define KR3DH_ZH_SHIFT 5
143 #define KR3DH_ZH_MASK ((0x1) << KR3DH_ZH_SHIFT)
144 #define KR3DH_ZL_SHIFT 4
145 #define KR3DH_ZL_MASK ((0x1) << KR3DH_ZL_SHIFT)
146 #define KR3DH_YH_SHIFT 3
147 #define KR3DH_YH_MASK ((0x1) << KR3DH_YH_SHIFT)
148 #define KR3DH_YL_SHIFT 2
149 #define KR3DH_YL_MASK ((0x1) << KR3DH_YL_SHIFT)
150 #define KR3DH_XH_SHIFT 1
151 #define KR3DH_XH_MASK ((0x1) << KR3DH_XH_SHIFT)
152 #define KR3DH_XL_SHIFT 0
153 #define KR3DH_XL_MASK ((0x1) << KR3DH_XL_SHIFT)
155 #define KR3DH_INT_THS_MASK 0x7f
156 #define KR3DH_INT_DURATION_MASK 0x7f
158 #define KR3DH_DEV_ID 0x32
159 #define K3DH_DEV_ID 0x33
161 #define KR3DH_OUT_MIN_VALUE (-32768)
162 #define KR3DH_OUT_MAX_VALUE (32767)
168 struct i2c_client *client;
170 struct input_dev *idev;
171 struct work_struct work1;
172 struct work_struct work2;
174 struct kr3dh_platform_data *pdata;
198 u8 block_data_update;
207 u8 int1_z_high_enable;
208 u8 int1_z_low_enable;
209 u8 int1_y_high_enable;
210 u8 int1_y_low_enable;
211 u8 int1_x_high_enable;
212 u8 int1_x_low_enable;
217 u8 int2_z_high_enable;
218 u8 int2_z_low_enable;
219 u8 int2_y_high_enable;
220 u8 int2_y_low_enable;
221 u8 int2_x_high_enable;
222 u8 int2_x_low_enable;
225 u8 resume_power_mode;
228 static int kr3dh_write_reg(struct i2c_client *client, u8 reg,
229 u8 *value, u8 length)
234 ret = i2c_smbus_write_byte_data(client, reg, *value);
236 ret = i2c_smbus_write_i2c_block_data(client, reg,
239 dev_err(&client->dev, "%s: reg 0x%x, err %d\n",
245 static int kr3dh_read_reg(struct i2c_client *client, u8 reg)
249 ret = i2c_smbus_read_byte_data(client, reg);
251 dev_err(&client->dev, "%s: reg 0x%x, err %d\n",
257 static void kr3dh_set_power_mode(struct kr3dh_chip *chip, u8 val)
261 temp = (val << KR3DH_PM_SHIFT) & KR3DH_PM_MASK;
262 value = temp | chip->data_rate | chip->zen |
263 chip->yen | chip->xen;
265 mutex_lock(&chip->lock);
266 chip->power_mode = temp;
267 kr3dh_write_reg(chip->client, KR3DH_CTRL_REG1, &value, 1);
268 mutex_unlock(&chip->lock);
271 static u8 kr3dh_get_power_mode(struct kr3dh_chip *chip)
273 return (chip->power_mode >> KR3DH_PM_SHIFT);
276 static void kr3dh_set_zen(struct kr3dh_chip *chip, u8 val)
280 temp = (val << KR3DH_ZEN_SHIFT) & KR3DH_ZEN_MASK;
281 value = temp | chip->power_mode | chip->data_rate |
282 chip->yen | chip->xen;
283 mutex_lock(&chip->lock);
285 kr3dh_write_reg(chip->client, KR3DH_CTRL_REG1, &value, 1);
286 mutex_unlock(&chip->lock);
289 static u8 kr3dh_get_zen(struct kr3dh_chip *chip)
291 return (chip->zen >> KR3DH_ZEN_SHIFT);
294 static void kr3dh_set_yen(struct kr3dh_chip *chip, u8 val)
298 temp = (val << KR3DH_YEN_SHIFT) & KR3DH_YEN_MASK;
299 value = temp | chip->power_mode | chip->data_rate |
300 chip->zen | chip->xen;
301 mutex_lock(&chip->lock);
303 kr3dh_write_reg(chip->client, KR3DH_CTRL_REG1, &value, 1);
304 mutex_unlock(&chip->lock);
307 static u8 kr3dh_get_yen(struct kr3dh_chip *chip)
309 return (chip->yen >> KR3DH_YEN_SHIFT);
312 static void kr3dh_set_xen(struct kr3dh_chip *chip, u8 val)
316 temp = (val << KR3DH_XEN_SHIFT) & KR3DH_XEN_MASK;
317 value = temp | chip->power_mode | chip->data_rate |
318 chip->zen | chip->yen;
319 mutex_lock(&chip->lock);
321 kr3dh_write_reg(chip->client, KR3DH_CTRL_REG1, &value, 1);
322 mutex_unlock(&chip->lock);
325 static u8 kr3dh_get_xen(struct kr3dh_chip *chip)
327 return (chip->xen >> KR3DH_XEN_SHIFT);
330 static void kr3dh_set_reboot(struct kr3dh_chip *chip, u8 val)
334 temp = (val << KR3DH_BOOT_SHIFT) & KR3DH_BOOT_MASK;
335 value = temp | chip->hpmode | chip->filter_sel | chip->hp_enable_2 |
336 chip->hp_enable_1 | chip->hpcf;
337 mutex_lock(&chip->lock);
339 kr3dh_write_reg(chip->client, KR3DH_CTRL_REG2, &value, 1);
340 mutex_unlock(&chip->lock);
343 static u8 kr3dh_get_reboot(struct kr3dh_chip *chip)
345 return (chip->reboot >> KR3DH_BOOT_SHIFT);
348 static void kr3dh_set_int1_6d_enable(struct kr3dh_chip *chip, u8 val)
352 temp = (val << KR3DH_6D_SHIFT) & KR3DH_6D_MASK;
353 value = temp | chip->int1_combination | chip->int1_z_high_enable |
354 chip->int1_z_low_enable | chip->int1_y_high_enable |
355 chip->int1_y_low_enable | chip->int1_x_high_enable |
356 chip->int1_x_low_enable;
357 mutex_lock(&chip->lock);
358 chip->int1_6d_enable = temp;
359 kr3dh_write_reg(chip->client, KR3DH_INT1_CFG_REG, &value, 1);
360 mutex_unlock(&chip->lock);
363 static u8 kr3dh_get_int1_6d_enable(struct kr3dh_chip *chip)
365 return (chip->int1_z_high_enable >> KR3DH_6D_SHIFT);
368 static void kr3dh_set_int1_z_high_enable(struct kr3dh_chip *chip, u8 val)
372 temp = (val << KR3DH_ZHIE_SHIFT) & KR3DH_ZHIE_MASK;
373 value = temp | chip->int1_combination | chip->int1_6d_enable |
374 chip->int1_z_low_enable | chip->int1_y_high_enable |
375 chip->int1_y_low_enable | chip->int1_x_high_enable |
376 chip->int1_x_low_enable;
377 mutex_lock(&chip->lock);
378 chip->int1_z_high_enable = temp;
379 kr3dh_write_reg(chip->client, KR3DH_INT1_CFG_REG, &value, 1);
380 mutex_unlock(&chip->lock);
383 static u8 kr3dh_get_int1_z_high_enable(struct kr3dh_chip *chip)
385 return (chip->int1_z_high_enable >> KR3DH_ZHIE_SHIFT);
388 static void kr3dh_set_int1_z_low_enable(struct kr3dh_chip *chip, u8 val)
392 temp = (val << KR3DH_ZLIE_SHIFT) & KR3DH_ZLIE_MASK;
393 value = temp | chip->int1_combination | chip->int1_6d_enable |
394 chip->int1_z_high_enable | chip->int1_y_high_enable |
395 chip->int1_y_low_enable | chip->int1_x_high_enable |
396 chip->int1_x_low_enable;
397 mutex_lock(&chip->lock);
398 chip->int1_z_low_enable = temp;
399 kr3dh_write_reg(chip->client, KR3DH_INT1_CFG_REG, &value, 1);
400 mutex_unlock(&chip->lock);
403 static u8 kr3dh_get_int1_z_low_enable(struct kr3dh_chip *chip)
405 return (chip->int1_z_low_enable >> KR3DH_ZLIE_SHIFT);
408 static void kr3dh_set_int1_y_high_enable(struct kr3dh_chip *chip, u8 val)
412 temp = (val << KR3DH_YHIE_SHIFT) & KR3DH_YHIE_MASK;
413 value = temp | chip->int1_combination | chip->int1_6d_enable |
414 chip->int1_z_high_enable | chip->int1_z_low_enable |
415 chip->int1_y_low_enable | chip->int1_x_high_enable |
416 chip->int1_x_low_enable;
417 mutex_lock(&chip->lock);
418 chip->int1_y_high_enable = temp;
419 kr3dh_write_reg(chip->client, KR3DH_INT1_CFG_REG, &value, 1);
420 mutex_unlock(&chip->lock);
423 static u8 kr3dh_get_int1_y_high_enable(struct kr3dh_chip *chip)
425 return (chip->int1_y_high_enable >> KR3DH_YHIE_SHIFT);
428 static void kr3dh_set_int1_y_low_enable(struct kr3dh_chip *chip, u8 val)
432 temp = (val << KR3DH_YLIE_SHIFT) & KR3DH_YLIE_MASK;
433 value = temp | chip->int1_combination | chip->int1_6d_enable |
434 chip->int1_z_high_enable | chip->int1_z_low_enable |
435 chip->int1_y_high_enable | chip->int1_x_high_enable |
436 chip->int1_x_low_enable;
437 mutex_lock(&chip->lock);
438 chip->int1_y_low_enable = temp;
439 kr3dh_write_reg(chip->client, KR3DH_INT1_CFG_REG, &value, 1);
440 mutex_unlock(&chip->lock);
443 static u8 kr3dh_get_int1_y_low_enable(struct kr3dh_chip *chip)
445 return (chip->int1_y_low_enable >> KR3DH_YLIE_SHIFT);
448 static void kr3dh_set_int1_x_high_enable(struct kr3dh_chip *chip, u8 val)
452 temp = (val << KR3DH_XHIE_SHIFT) & KR3DH_XHIE_MASK;
453 value = temp | chip->int1_combination | chip->int1_6d_enable |
454 chip->int1_z_high_enable | chip->int1_z_low_enable |
455 chip->int1_y_high_enable | chip->int1_y_low_enable |
456 chip->int1_x_low_enable;
457 mutex_lock(&chip->lock);
458 chip->int1_x_high_enable = temp;
459 kr3dh_write_reg(chip->client, KR3DH_INT1_CFG_REG, &value, 1);
460 mutex_unlock(&chip->lock);
463 static u8 kr3dh_get_int1_x_high_enable(struct kr3dh_chip *chip)
465 return (chip->int1_x_high_enable >> KR3DH_XHIE_SHIFT);
468 static void kr3dh_set_int1_x_low_enable(struct kr3dh_chip *chip, u8 val)
472 temp = (val << KR3DH_XLIE_SHIFT) & KR3DH_XLIE_MASK;
473 value = temp | chip->int1_combination | chip->int1_6d_enable |
474 chip->int1_z_high_enable | chip->int1_z_low_enable |
475 chip->int1_y_high_enable | chip->int1_y_low_enable |
476 chip->int1_x_high_enable;
477 mutex_lock(&chip->lock);
478 chip->int1_x_low_enable = temp;
479 kr3dh_write_reg(chip->client, KR3DH_INT1_CFG_REG, &value, 1);
480 mutex_unlock(&chip->lock);
483 static u8 kr3dh_get_int1_x_low_enable(struct kr3dh_chip *chip)
485 return (chip->int1_x_low_enable >> KR3DH_XLIE_SHIFT);
488 static void kr3dh_set_int1_threshold(struct kr3dh_chip *chip, u8 val)
492 mutex_lock(&chip->lock);
493 chip->int1_threshold = val & KR3DH_INT_THS_MASK;
494 kr3dh_write_reg(chip->client, KR3DH_INT1_THS, &value, 1);
495 mutex_unlock(&chip->lock);
498 static u8 kr3dh_get_int1_threshold(struct kr3dh_chip *chip)
500 return chip->int1_threshold;
503 static void kr3dh_set_int1_duration(struct kr3dh_chip *chip, u8 val)
507 mutex_lock(&chip->lock);
508 chip->int1_duration = val & KR3DH_INT_DURATION_MASK;
509 kr3dh_write_reg(chip->client, KR3DH_INT1_DURATION, &value, 1);
510 mutex_unlock(&chip->lock);
513 static u8 kr3dh_get_int1_duration(struct kr3dh_chip *chip)
515 return chip->int1_duration;
518 static void kr3dh_set_int2_6d_enable(struct kr3dh_chip *chip, u8 val)
522 temp = (val << KR3DH_6D_SHIFT) & KR3DH_6D_MASK;
523 value = temp | chip->int2_combination | chip->int2_z_high_enable |
524 chip->int2_z_low_enable | chip->int2_y_high_enable |
525 chip->int2_y_low_enable | chip->int2_x_high_enable |
526 chip->int2_x_low_enable;
527 mutex_lock(&chip->lock);
528 chip->int2_6d_enable = temp;
529 kr3dh_write_reg(chip->client, KR3DH_INT2_CFG_REG, &value, 1);
530 mutex_unlock(&chip->lock);
533 static u8 kr3dh_get_int2_6d_enable(struct kr3dh_chip *chip)
535 return (chip->int2_6d_enable >> KR3DH_6D_SHIFT);
538 static void kr3dh_set_int2_z_high_enable(struct kr3dh_chip *chip, u8 val)
542 temp = (val << KR3DH_ZHIE_SHIFT) & KR3DH_ZHIE_MASK;
543 value = temp | chip->int2_combination | chip->int2_6d_enable |
544 chip->int2_z_low_enable | chip->int2_y_high_enable |
545 chip->int2_y_low_enable | chip->int2_x_high_enable |
546 chip->int2_x_low_enable;
547 mutex_lock(&chip->lock);
548 chip->int2_z_high_enable = temp;
549 kr3dh_write_reg(chip->client, KR3DH_INT2_CFG_REG, &value, 1);
550 mutex_unlock(&chip->lock);
553 static u8 kr3dh_get_int2_z_high_enable(struct kr3dh_chip *chip)
555 return (chip->int2_z_high_enable >> KR3DH_ZHIE_SHIFT);
558 static void kr3dh_set_int2_z_low_enable(struct kr3dh_chip *chip, u8 val)
562 temp = (val << KR3DH_ZLIE_SHIFT) & KR3DH_ZLIE_MASK;
563 value = temp | chip->int2_combination | chip->int2_6d_enable |
564 chip->int2_z_high_enable | chip->int2_y_high_enable |
565 chip->int2_y_low_enable | chip->int2_x_high_enable |
566 chip->int2_x_low_enable;
567 mutex_lock(&chip->lock);
568 chip->int2_z_low_enable = temp;
569 kr3dh_write_reg(chip->client, KR3DH_INT2_CFG_REG, &value, 1);
570 mutex_unlock(&chip->lock);
573 static u8 kr3dh_get_int2_z_low_enable(struct kr3dh_chip *chip)
575 return (chip->int2_z_low_enable >> KR3DH_ZLIE_SHIFT);
578 static void kr3dh_set_int2_y_high_enable(struct kr3dh_chip *chip, u8 val)
582 temp = (val << KR3DH_YHIE_SHIFT) & KR3DH_YHIE_MASK;
583 value = temp | chip->int2_combination | chip->int2_6d_enable |
584 chip->int2_z_high_enable | chip->int2_z_low_enable |
585 chip->int2_y_low_enable | chip->int2_x_high_enable |
586 chip->int2_x_low_enable;
587 mutex_lock(&chip->lock);
588 chip->int2_y_high_enable = temp;
589 kr3dh_write_reg(chip->client, KR3DH_INT2_CFG_REG, &value, 1);
590 mutex_unlock(&chip->lock);
593 static u8 kr3dh_get_int2_y_high_enable(struct kr3dh_chip *chip)
595 return (chip->int2_y_high_enable >> KR3DH_YHIE_SHIFT);
598 static void kr3dh_set_int2_y_low_enable(struct kr3dh_chip *chip, u8 val)
602 temp = (val << KR3DH_YLIE_SHIFT) & KR3DH_YLIE_MASK;
603 value = temp | chip->int2_combination | chip->int2_6d_enable |
604 chip->int2_z_high_enable | chip->int2_z_low_enable |
605 chip->int2_y_high_enable | chip->int2_x_high_enable |
606 chip->int2_x_low_enable;
607 mutex_lock(&chip->lock);
608 chip->int2_y_low_enable = temp;
609 kr3dh_write_reg(chip->client, KR3DH_INT2_CFG_REG, &value, 1);
610 mutex_unlock(&chip->lock);
613 static u8 kr3dh_get_int2_y_low_enable(struct kr3dh_chip *chip)
615 return (chip->int2_y_low_enable >> KR3DH_YLIE_SHIFT);
618 static void kr3dh_set_int2_x_high_enable(struct kr3dh_chip *chip, u8 val)
622 temp = (val << KR3DH_XHIE_SHIFT) & KR3DH_XHIE_MASK;
623 value = temp | chip->int2_combination | chip->int2_6d_enable |
624 chip->int2_z_high_enable | chip->int2_z_low_enable |
625 chip->int2_y_high_enable | chip->int2_y_low_enable |
626 chip->int2_x_low_enable;
627 mutex_lock(&chip->lock);
628 chip->int2_x_high_enable = temp;
629 kr3dh_write_reg(chip->client, KR3DH_INT2_CFG_REG, &value, 1);
630 mutex_unlock(&chip->lock);
633 static u8 kr3dh_get_int2_x_high_enable(struct kr3dh_chip *chip)
635 return (chip->int2_x_high_enable >> KR3DH_XHIE_SHIFT);
638 static void kr3dh_set_int2_x_low_enable(struct kr3dh_chip *chip, u8 val)
642 temp = (val << KR3DH_XLIE_SHIFT) & KR3DH_XLIE_MASK;
643 value = temp | chip->int2_combination | chip->int2_6d_enable |
644 chip->int2_z_high_enable | chip->int2_z_low_enable |
645 chip->int2_y_high_enable | chip->int2_y_low_enable |
646 chip->int2_x_high_enable;
647 mutex_lock(&chip->lock);
648 chip->int2_x_low_enable = temp;
649 kr3dh_write_reg(chip->client, KR3DH_INT2_CFG_REG, &value, 1);
650 mutex_unlock(&chip->lock);
653 static u8 kr3dh_get_int2_x_low_enable(struct kr3dh_chip *chip)
655 return (chip->int2_x_low_enable >> KR3DH_XLIE_SHIFT);
658 static void kr3dh_set_int2_threshold(struct kr3dh_chip *chip, u8 val)
662 mutex_lock(&chip->lock);
663 chip->int2_threshold = val & KR3DH_INT_THS_MASK;
664 kr3dh_write_reg(chip->client, KR3DH_INT2_THS, &value, 1);
665 mutex_unlock(&chip->lock);
668 static u8 kr3dh_get_int2_threshold(struct kr3dh_chip *chip)
670 return chip->int2_threshold;
673 static void kr3dh_set_int2_duration(struct kr3dh_chip *chip, u8 val)
677 mutex_lock(&chip->lock);
678 chip->int2_duration = val & KR3DH_INT_DURATION_MASK;
679 kr3dh_write_reg(chip->client, KR3DH_INT2_DURATION, &value, 1);
680 mutex_unlock(&chip->lock);
683 static u8 kr3dh_get_int2_duration(struct kr3dh_chip *chip)
685 return chip->int2_duration;
688 static void kr3dh_get_xyz(struct kr3dh_chip *chip)
694 mutex_lock(&chip->lock);
696 ret = i2c_smbus_read_i2c_block_data(chip->client,
697 KR3DH_MULTI_OUT_X_L, 6, xyz_values);
701 temp = ((xyz_values[1] << BITS_PER_BYTE) | xyz_values[0]);
702 chip->x = chip->pdata->negate_x ? -(temp >> 4) : temp >> 4;
703 temp = ((xyz_values[3] << BITS_PER_BYTE) | xyz_values[2]);
704 chip->y = chip->pdata->negate_y ? -(temp >> 4) : temp >> 4;
705 temp = ((xyz_values[5] << BITS_PER_BYTE) | xyz_values[4]);
706 chip->z = chip->pdata->negate_z ? -(temp >> 4) : temp >> 4;
708 if (chip->pdata->change_xy) {
714 mutex_unlock(&chip->lock);
717 static void kr3dh_work1(struct work_struct *work)
719 struct kr3dh_chip *chip = container_of(work,
720 struct kr3dh_chip, work1);
723 int1_src = kr3dh_read_reg(chip->client, KR3DH_INT1_SRC_REG);
725 ((chip->int1_cfg & KR3DH_INT1_CFG_MASK) == KR3DH_DATA_READY)) {
727 mutex_lock(&chip->lock);
728 input_report_abs(chip->idev, ABS_MISC, 1);
729 input_report_abs(chip->idev, ABS_MISC, int1_src);
730 input_report_abs(chip->idev, ABS_X, chip->x);
731 input_report_abs(chip->idev, ABS_Y, chip->y);
732 input_report_abs(chip->idev, ABS_Z, chip->z);
733 input_sync(chip->idev);
734 mutex_unlock(&chip->lock);
737 enable_irq(chip->client->irq);
740 static void kr3dh_work2(struct work_struct *work)
742 struct kr3dh_chip *chip = container_of(work,
743 struct kr3dh_chip, work2);
746 int2_src = kr3dh_read_reg(chip->client, KR3DH_INT2_SRC_REG);
748 ((chip->int2_cfg & KR3DH_INT2_CFG_MASK) == KR3DH_DATA_READY)) {
750 mutex_lock(&chip->lock);
751 input_report_abs(chip->idev, ABS_MISC, 2);
752 input_report_abs(chip->idev, ABS_MISC, int2_src);
753 input_report_abs(chip->idev, ABS_X, chip->x);
754 input_report_abs(chip->idev, ABS_Y, chip->y);
755 input_report_abs(chip->idev, ABS_Z, chip->z);
756 input_sync(chip->idev);
757 mutex_unlock(&chip->lock);
760 enable_irq(chip->irq2);
763 static irqreturn_t kr3dh_irq1(int irq, void *data)
765 struct kr3dh_chip *chip = data;
767 if (!work_pending(&chip->work1)) {
768 disable_irq_nosync(irq);
769 schedule_work(&chip->work1);
771 dev_err(&chip->client->dev, "work pending\n");
777 static irqreturn_t kr3dh_irq2(int irq, void *data)
779 struct kr3dh_chip *chip = data;
781 if (!work_pending(&chip->work2)) {
782 disable_irq_nosync(irq);
783 schedule_work(&chip->work2);
785 dev_err(&chip->client->dev, "work pending\n");
791 static ssize_t kr3dh_show_xyz(struct device *dev,
792 struct device_attribute *attr, char *buf)
794 struct kr3dh_chip *chip = dev_get_drvdata(dev);
796 return sprintf(buf, "%d %d %d\n", chip->x, chip->y, chip->z);
798 static DEVICE_ATTR(xyz, S_IRUGO, kr3dh_show_xyz, NULL);
800 static ssize_t kr3dh_show_reg_state(struct device *dev,
801 struct device_attribute *attr, char *buf)
803 struct kr3dh_chip *chip = dev_get_drvdata(dev);
804 u8 ctrl_reg[5], int1_reg[4];
807 ret = i2c_smbus_read_i2c_block_data(chip->client,
808 (KR3DH_CTRL_REG1 | KR3DH_AUTO_INCREASE), 5, ctrl_reg);
811 dev_err(&chip->client->dev, "%s: reg 0x%x, err %d\n",
812 __func__, KR3DH_CTRL_REG1, ret);
816 ret = i2c_smbus_read_i2c_block_data(chip->client,
817 (KR3DH_INT1_CFG_REG | KR3DH_AUTO_INCREASE), 4, int1_reg);
820 dev_err(&chip->client->dev, "%s: reg 0x%x, err %d\n",
821 __func__, KR3DH_INT1_CFG_REG, ret);
825 ret = i2c_smbus_read_byte_data(chip->client, KR3DH_STATUS_REG);
827 dev_err(&chip->client->dev, "%s: reg 0x%x, err %d\n",
828 __func__, KR3DH_STATUS_REG, ret);
832 return sprintf(buf, "ctrl1:0x%x ctrl2:0x%x ctrl3:0x%x\n"
833 "ctrl4:0x%x ctrl5:0x%x\n"
834 "int1_cfg:0x%x int1_src:0x%x int1_ths:0x%x\n"
835 "int1_dur:0x%x status_reg:0x%x\n",
836 ctrl_reg[0], ctrl_reg[1], ctrl_reg[2],
837 ctrl_reg[3], ctrl_reg[4],
838 int1_reg[0], int1_reg[1], int1_reg[2],
841 static DEVICE_ATTR(reg_state, S_IRUGO, kr3dh_show_reg_state, NULL);
843 #define KR3DH_INPUT(name) \
844 static ssize_t kr3dh_store_##name(struct device *dev, \
845 struct device_attribute *attr, const char *buf, size_t count) \
847 struct kr3dh_chip *chip = dev_get_drvdata(dev); \
853 ret = strict_strtoul(buf, 10, &val); \
855 dev_err(dev, "fail: conversion %s 5o number\n", buf); \
858 kr3dh_set_##name(chip, (u8) val); \
861 static ssize_t kr3dh_show_##name(struct device *dev, \
862 struct device_attribute *attr, char *buf) \
864 struct kr3dh_chip *chip = dev_get_drvdata(dev); \
865 u16 ret = kr3dh_get_##name(chip); \
866 return sprintf(buf, "%d\n", ret); \
868 static DEVICE_ATTR(name, S_IRUGO | S_IWUSR, \
869 kr3dh_show_##name, kr3dh_store_##name);
871 KR3DH_INPUT(power_mode);
876 KR3DH_INPUT(int1_6d_enable);
877 KR3DH_INPUT(int1_z_high_enable);
878 KR3DH_INPUT(int1_z_low_enable);
879 KR3DH_INPUT(int1_y_high_enable);
880 KR3DH_INPUT(int1_y_low_enable);
881 KR3DH_INPUT(int1_x_high_enable);
882 KR3DH_INPUT(int1_x_low_enable);
883 KR3DH_INPUT(int1_threshold);
884 KR3DH_INPUT(int1_duration);
885 KR3DH_INPUT(int2_6d_enable);
886 KR3DH_INPUT(int2_z_high_enable);
887 KR3DH_INPUT(int2_z_low_enable);
888 KR3DH_INPUT(int2_y_high_enable);
889 KR3DH_INPUT(int2_y_low_enable);
890 KR3DH_INPUT(int2_x_high_enable);
891 KR3DH_INPUT(int2_x_low_enable);
892 KR3DH_INPUT(int2_threshold);
893 KR3DH_INPUT(int2_duration);
895 static struct attribute *kr3dh_attributes[] = {
896 &dev_attr_power_mode.attr,
900 &dev_attr_reboot.attr,
901 &dev_attr_int1_6d_enable.attr,
902 &dev_attr_int1_z_high_enable.attr,
903 &dev_attr_int1_z_low_enable.attr,
904 &dev_attr_int1_y_high_enable.attr,
905 &dev_attr_int1_y_low_enable.attr,
906 &dev_attr_int1_x_high_enable.attr,
907 &dev_attr_int1_x_low_enable.attr,
908 &dev_attr_int1_threshold.attr,
909 &dev_attr_int1_duration.attr,
910 &dev_attr_int2_6d_enable.attr,
911 &dev_attr_int2_z_high_enable.attr,
912 &dev_attr_int2_z_low_enable.attr,
913 &dev_attr_int2_y_high_enable.attr,
914 &dev_attr_int2_y_low_enable.attr,
915 &dev_attr_int2_x_high_enable.attr,
916 &dev_attr_int2_x_low_enable.attr,
917 &dev_attr_int2_threshold.attr,
918 &dev_attr_int2_duration.attr,
920 &dev_attr_reg_state.attr,
924 static const struct attribute_group kr3dh_group = {
925 .attrs = kr3dh_attributes,
928 static void kr3dh_unregister_input_device(struct kr3dh_chip *chip)
930 struct i2c_client *client = chip->client;
933 free_irq(client->irq, chip);
935 free_irq(chip->irq2, chip);
937 input_unregister_device(chip->idev);
941 static int kr3dh_register_input_device(struct kr3dh_chip *chip)
943 struct i2c_client *client = chip->client;
944 struct input_dev *idev;
947 idev = chip->idev = input_allocate_device();
949 dev_err(&client->dev, "allocating input device failed\n");
954 idev->name = "KR3DH accelerometer";
955 idev->id.bustype = BUS_I2C;
956 idev->dev.parent = &client->dev;
957 idev->evbit[0] = BIT_MASK(EV_ABS);
959 input_set_abs_params(idev, ABS_MISC, 0, 255, 0, 0);
960 input_set_abs_params(idev, ABS_X, KR3DH_OUT_MIN_VALUE,
961 KR3DH_OUT_MAX_VALUE, 0, 0);
962 input_set_abs_params(idev, ABS_Y, KR3DH_OUT_MIN_VALUE,
963 KR3DH_OUT_MAX_VALUE, 0, 0);
964 input_set_abs_params(idev, ABS_Z, KR3DH_OUT_MIN_VALUE,
965 KR3DH_OUT_MAX_VALUE, 0, 0);
967 input_set_drvdata(idev, chip);
969 ret = input_register_device(idev);
971 dev_err(&client->dev, "registering input device failed\n");
975 if (client->irq > 0) {
976 unsigned long irq_flag = IRQF_DISABLED;
978 irq_flag |= IRQF_TRIGGER_RISING;
979 ret = request_irq(client->irq, kr3dh_irq1, irq_flag,
980 "KR3DH accelerometer int1", chip);
982 dev_err(&client->dev, "can't get IRQ %d, ret %d\n",
988 if (chip->irq2 > 0) {
989 unsigned long irq_flag = IRQF_DISABLED;
991 irq_flag |= IRQF_TRIGGER_RISING;
992 ret = request_irq(chip->irq2, kr3dh_irq2, irq_flag,
993 "KR3DH accelerometer int2", chip);
995 dev_err(&client->dev, "can't get IRQ %d, ret %d\n",
1004 if (client->irq > 0)
1005 free_irq(client->irq, chip);
1007 input_unregister_device(idev);
1009 input_free_device(idev);
1014 static void kr3dh_initialize_chip(struct kr3dh_chip *chip)
1019 value = chip->power_mode | chip->data_rate | chip->zen | chip->yen |
1021 kr3dh_write_reg(chip->client, KR3DH_CTRL_REG1, &value, 1);
1024 value = chip->reboot | chip->hpmode | chip->filter_sel |
1025 chip->hp_enable_2 | chip->hp_enable_1 | chip->hpcf;
1026 kr3dh_write_reg(chip->client, KR3DH_CTRL_REG2, &value, 1);
1029 value = chip->int_hl_active | chip->int_pp_od | chip->int2_latch |
1030 chip->int2_cfg | chip->int1_latch | chip->int1_cfg;
1031 kr3dh_write_reg(chip->client, KR3DH_CTRL_REG3, &value, 1);
1034 value = chip->block_data_update | chip->endian | chip->fullscale |
1035 chip->selftest_sign | chip->selftest | chip->spi_mode;
1036 kr3dh_write_reg(chip->client, KR3DH_CTRL_REG4, &value, 1);
1039 kr3dh_write_reg(chip->client, KR3DH_INT1_THS,
1040 &chip->int1_threshold, 1);
1042 /* INT1_DURATION_REG */
1043 kr3dh_write_reg(chip->client, KR3DH_INT1_DURATION,
1044 &chip->int1_duration, 1);
1047 kr3dh_write_reg(chip->client, KR3DH_INT2_THS,
1048 &chip->int2_threshold, 1);
1050 /* INT2_DURATION_REG */
1051 kr3dh_write_reg(chip->client, KR3DH_INT2_DURATION,
1052 &chip->int2_duration, 1);
1055 value = chip->int1_combination | chip->int1_6d_enable |
1056 chip->int1_z_high_enable | chip->int1_z_low_enable |
1057 chip->int1_y_high_enable | chip->int1_y_low_enable |
1058 chip->int1_x_high_enable | chip->int1_x_low_enable;
1059 kr3dh_write_reg(chip->client, KR3DH_INT1_CFG_REG, &value, 1);
1062 value = chip->int2_combination | chip->int2_6d_enable |
1063 chip->int2_z_high_enable | chip->int2_z_low_enable |
1064 chip->int2_y_high_enable | chip->int2_y_low_enable |
1065 chip->int2_x_high_enable | chip->int2_x_low_enable;
1066 kr3dh_write_reg(chip->client, KR3DH_INT2_CFG_REG, &value, 1);
1069 kr3dh_write_reg(chip->client, KR3DH_CTRL_REG5, &chip->turn_on_mode, 1);
1073 static void kr3dh_format_chip_data(struct kr3dh_chip *chip,
1074 struct kr3dh_platform_data *pdata)
1076 chip->irq2 = pdata->irq2;
1079 chip->power_mode = (pdata->power_mode << KR3DH_PM_SHIFT) &
1081 chip->resume_power_mode = chip->power_mode;
1082 chip->data_rate = (pdata->data_rate << KR3DH_DATA_RATE_SHIFT) &
1083 KR3DH_DATA_RATE_MASK;
1084 chip->zen = (pdata->zen << KR3DH_ZEN_SHIFT) & KR3DH_ZEN_MASK;
1085 chip->yen = (pdata->yen << KR3DH_YEN_SHIFT) & KR3DH_YEN_MASK;
1086 chip->xen = (pdata->xen << KR3DH_XEN_SHIFT) & KR3DH_XEN_MASK;
1089 chip->reboot = (pdata->reboot << KR3DH_BOOT_SHIFT) & KR3DH_BOOT_MASK;
1090 chip->hpmode = (pdata->hpmode << KR3DH_HPM_SHIFT) & KR3DH_HPM_MASK;
1091 chip->filter_sel = (pdata->filter_sel << KR3DH_FDS_SHIFT) &
1093 chip->hp_enable_2 = (pdata->hp_enable_2 << KR3DH_HPEN2_SHIFT) &
1095 chip->hp_enable_1 = (pdata->hp_enable_1 << KR3DH_HPEN1_SHIFT) &
1097 chip->hpcf = (pdata->hpcf << KR3DH_HPCF_SHIFT) & KR3DH_HPCF_MASK;
1100 chip->int_hl_active = (pdata->int_hl_active << KR3DH_INT_ACTIVE_SHIFT) &
1101 KR3DH_INT_ACTIVE_MASK;
1102 chip->int_pp_od = (pdata->int_pp_od << KR3DH_INT_PPOD_SHIFT) &
1103 KR3DH_INT_PPOD_MASK;
1104 chip->int2_latch = (pdata->int2_latch << KR3DH_LIR2_SHIFT) &
1106 chip->int2_cfg = (pdata->int2_cfg << KR3DH_INT2_CFG_SHIFT) &
1107 KR3DH_INT2_CFG_MASK;
1108 chip->int1_latch = (pdata->int1_latch << KR3DH_LIR1_SHIFT) &
1110 chip->int1_cfg = (pdata->int1_cfg << KR3DH_INT1_CFG_SHIFT) &
1111 KR3DH_INT1_CFG_MASK;
1114 chip->block_data_update = (pdata->block_data_update << KR3DH_BDU_SHIFT) &
1116 chip->endian = (pdata->endian << KR3DH_BLE_SHIFT) & KR3DH_BLE_MASK;
1117 chip->fullscale = (pdata->fullscale << KR3DH_FS_SHIFT) & KR3DH_FS_MASK;
1118 chip->selftest_sign = (pdata->selftest_sign << KR3DH_ST_SIGN_SHIFT) &
1120 chip->selftest = (pdata->selftest << KR3DH_ST_SHIFT) & KR3DH_ST_MASK;
1121 chip->spi_mode = (pdata->spi_mode << KR3DH_SIM_SHIFT) & KR3DH_SIM_MASK;
1124 chip->turn_on_mode = pdata->turn_on_mode & KR3DH_TURNON_MASK;
1127 chip->int1_combination = (pdata->int1_combination << KR3DH_AOR_SHIFT) &
1129 chip->int1_6d_enable = (pdata->int1_6d_enable << KR3DH_6D_SHIFT) &
1131 chip->int1_z_high_enable = (pdata->int1_z_high_enable <<
1132 KR3DH_ZHIE_SHIFT) & KR3DH_ZHIE_MASK;
1133 chip->int1_z_low_enable = (pdata->int1_z_low_enable <<
1134 KR3DH_ZLIE_SHIFT) & KR3DH_ZLIE_MASK;
1135 chip->int1_y_high_enable = (pdata->int1_y_high_enable <<
1136 KR3DH_YHIE_SHIFT) & KR3DH_YHIE_MASK;
1137 chip->int1_y_low_enable = (pdata->int1_y_low_enable <<
1138 KR3DH_YLIE_SHIFT) & KR3DH_YLIE_MASK;
1139 chip->int1_x_high_enable = (pdata->int1_x_high_enable <<
1140 KR3DH_XHIE_SHIFT) & KR3DH_XHIE_MASK;
1141 chip->int1_x_low_enable = (pdata->int1_x_low_enable <<
1142 KR3DH_XLIE_SHIFT) & KR3DH_XLIE_MASK;
1145 chip->int1_threshold = pdata->int1_threshold & KR3DH_INT_THS_MASK;
1147 /* INT1_DURATION_REG */
1148 chip->int1_duration = pdata->int1_duration & KR3DH_INT_DURATION_MASK;
1151 chip->int2_combination = (pdata->int2_combination << KR3DH_AOR_SHIFT) &
1153 chip->int2_6d_enable = (pdata->int2_6d_enable << KR3DH_6D_SHIFT) &
1155 chip->int2_z_high_enable = (pdata->int2_z_high_enable <<
1156 KR3DH_ZHIE_SHIFT) & KR3DH_ZHIE_MASK;
1157 chip->int2_z_low_enable = (pdata->int2_z_low_enable <<
1158 KR3DH_ZLIE_SHIFT) & KR3DH_ZLIE_MASK;
1159 chip->int2_y_high_enable = (pdata->int2_y_high_enable <<
1160 KR3DH_YHIE_SHIFT) & KR3DH_YHIE_MASK;
1161 chip->int2_y_low_enable = (pdata->int2_y_low_enable <<
1162 KR3DH_YLIE_SHIFT) & KR3DH_YLIE_MASK;
1163 chip->int2_x_high_enable = (pdata->int2_x_high_enable <<
1164 KR3DH_XHIE_SHIFT) & KR3DH_XHIE_MASK;
1165 chip->int2_x_low_enable = (pdata->int2_x_low_enable <<
1166 KR3DH_XLIE_SHIFT) & KR3DH_XLIE_MASK;
1169 chip->int2_threshold = pdata->int2_threshold & KR3DH_INT_THS_MASK;
1171 /* INT2_DURATION_REG */
1172 chip->int2_duration = pdata->int2_duration & KR3DH_INT_DURATION_MASK;
1175 static int __devinit kr3dh_probe(struct i2c_client *client,
1176 const struct i2c_device_id *id)
1178 struct kr3dh_chip *chip;
1179 struct kr3dh_platform_data *pdata;
1183 chip = kzalloc(sizeof(struct kr3dh_chip), GFP_KERNEL);
1187 pdata = client->dev.platform_data;
1188 chip->pdata = pdata;
1190 /* Detect device id */
1191 value = kr3dh_read_reg(client, KR3DH_WHO_AM_I);
1192 if ((value != KR3DH_DEV_ID) && (value != K3DH_DEV_ID)) {
1193 dev_err(&client->dev, "failed to detect device id\n");
1194 goto error_devid_detect;
1197 chip->client = client;
1199 i2c_set_clientdata(client, chip);
1200 INIT_WORK(&chip->work1, kr3dh_work1);
1201 INIT_WORK(&chip->work2, kr3dh_work2);
1202 mutex_init(&chip->lock);
1204 ret = sysfs_create_group(&client->dev.kobj, &kr3dh_group);
1206 dev_err(&client->dev,
1207 "creating attribute group failed\n");
1212 kr3dh_format_chip_data(chip, pdata);
1214 ret = kr3dh_register_input_device(chip);
1216 dev_err(&client->dev, "registering input device failed\n");
1220 kr3dh_initialize_chip(chip);
1222 pm_runtime_set_active(&client->dev);
1224 dev_info(&client->dev, "%s registered\n", id->name);
1229 sysfs_remove_group(&client->dev.kobj, &kr3dh_group);
1236 static int __devexit kr3dh_remove(struct i2c_client *client)
1238 struct kr3dh_chip *chip = i2c_get_clientdata(client);
1240 disable_irq_nosync(client->irq);
1241 disable_irq_nosync(chip->irq2);
1242 cancel_work_sync(&chip->work1);
1243 cancel_work_sync(&chip->work2);
1245 kr3dh_unregister_input_device(chip);
1246 sysfs_remove_group(&client->dev.kobj, &kr3dh_group);
1253 static int kr3dh_suspend(struct device *dev)
1255 struct i2c_client *client = to_i2c_client(dev);
1256 struct kr3dh_chip *chip = i2c_get_clientdata(client);
1258 disable_irq_nosync(client->irq);
1259 disable_irq_nosync(chip->irq2);
1260 cancel_work_sync(&chip->work1);
1261 cancel_work_sync(&chip->work2);
1263 chip->resume_power_mode = chip->power_mode;
1264 kr3dh_set_power_mode(chip, KR3DH_POWER_DOWN << KR3DH_PM_SHIFT);
1269 static int kr3dh_resume(struct device *dev)
1271 struct i2c_client *client = to_i2c_client(dev);
1272 struct kr3dh_chip *chip = i2c_get_clientdata(client);
1274 kr3dh_set_power_mode(chip, chip->resume_power_mode >> KR3DH_PM_SHIFT);
1276 enable_irq(client->irq);
1277 enable_irq(chip->irq2);
1282 static int kr3dh_freeze(struct device *dev)
1284 struct i2c_client *client = to_i2c_client(dev);
1285 struct kr3dh_chip *chip = i2c_get_clientdata(client);
1287 disable_irq_nosync(client->irq);
1288 disable_irq_nosync(chip->irq2);
1289 cancel_work_sync(&chip->work1);
1290 cancel_work_sync(&chip->work2);
1295 static int kr3dh_restore(struct device *dev)
1297 struct i2c_client *client = to_i2c_client(dev);
1298 struct kr3dh_chip *chip = i2c_get_clientdata(client);
1300 kr3dh_initialize_chip(chip);
1302 enable_irq(client->irq);
1303 enable_irq(chip->irq2);
1309 static struct dev_pm_ops kr3dh_dev_pm_ops = {
1310 .suspend = kr3dh_suspend,
1311 .resume = kr3dh_resume,
1312 .freeze = kr3dh_freeze,
1313 .restore = kr3dh_restore,
1316 #define KR3DH_DEV_PM_OPS (&kr3dh_dev_pm_ops)
1318 #define KR3DH_DEV_PM_OPS NULL
1321 static const struct i2c_device_id kr3dh_id[] = {
1325 MODULE_DEVICE_TABLE(i2c, kr3dh_id);
1327 static struct i2c_driver kr3dh_i2c_driver = {
1330 .pm = KR3DH_DEV_PM_OPS,
1332 .probe = kr3dh_probe,
1333 .remove = __exit_p(kr3dh_remove),
1334 .id_table = kr3dh_id,
1337 static int __init kr3dh_init(void)
1339 return i2c_add_driver(&kr3dh_i2c_driver);
1341 module_init(kr3dh_init);
1343 static void __exit kr3dh_exit(void)
1345 i2c_del_driver(&kr3dh_i2c_driver);
1347 module_exit(kr3dh_exit);
1349 MODULE_AUTHOR("Donggeun Kim <dg77.kim@samsung.com>");
1350 MODULE_DESCRIPTION("KR3DH accelerometer driver");
1351 MODULE_LICENSE("GPL");