upload tizen1.0 source
[kernel/linux-2.6.36.git] / drivers / input / misc / kr3dh.c
1 /*
2  *  kr3dh.c - ST Microelectronics three-axes accelerometer
3  *
4  *  Copyright (C) 2010 Samsung Electronics
5  *  Donggeun Kim <dg77.kim@samsung.com>
6  *
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.
10  */
11
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>
26
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)
52
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)
63
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)
76
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)
89
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)
102
103 #define KR3DH_TURNON_SHIFT      0
104 #define KR3DH_TURNON_MASK       ((0x3) << KR3DH_BOOT_SHIFT)
105
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)
122
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)
139
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)
154
155 #define KR3DH_INT_THS_MASK      0x7f
156 #define KR3DH_INT_DURATION_MASK 0x7f
157
158 #define KR3DH_DEV_ID            0x32
159 #define K3DH_DEV_ID             0x33
160
161 #define KR3DH_OUT_MIN_VALUE     (-32768)
162 #define KR3DH_OUT_MAX_VALUE     (32767)
163
164 #define KR3DH_ON                1
165 #define KR3DH_OFF               0
166
167 struct kr3dh_chip {
168         struct i2c_client               *client;
169         struct device                   *dev;
170         struct input_dev                *idev;
171         struct work_struct              work1;
172         struct work_struct              work2;
173         struct mutex                    lock;
174         struct kr3dh_platform_data      *pdata;
175
176         s16 x;
177         s16 y;
178         s16 z;
179
180         int irq2;
181         u8 power_mode;
182         u8 data_rate;
183         u8 zen;
184         u8 yen;
185         u8 xen;
186         u8 reboot;
187         u8 hpmode;
188         u8 filter_sel;
189         u8 hp_enable_1;
190         u8 hp_enable_2;
191         u8 hpcf;
192         u8 int_hl_active;
193         u8 int_pp_od;
194         u8 int2_latch;
195         u8 int2_cfg;
196         u8 int1_latch;
197         u8 int1_cfg;
198         u8 block_data_update;
199         u8 endian;
200         u8 fullscale;
201         u8 selftest_sign;
202         u8 selftest;
203         u8 spi_mode;
204         u8 turn_on_mode;
205         u8 int1_combination;
206         u8 int1_6d_enable;
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;
213         u8 int1_threshold;
214         u8 int1_duration;
215         u8 int2_combination;
216         u8 int2_6d_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;
223         u8 int2_threshold;
224         u8 int2_duration;
225         u8 resume_power_mode;
226 };
227
228 static int kr3dh_write_reg(struct i2c_client *client, u8 reg,
229                         u8 *value, u8 length)
230 {
231         int ret;
232
233         if (length == 1)
234                 ret = i2c_smbus_write_byte_data(client, reg, *value);
235         else
236                 ret = i2c_smbus_write_i2c_block_data(client, reg,
237                                                 length, value);
238         if (ret < 0)
239                 dev_err(&client->dev, "%s: reg 0x%x, err %d\n",
240                         __func__, reg, ret);
241
242         return ret;
243 }
244
245 static int kr3dh_read_reg(struct i2c_client *client, u8 reg)
246 {
247         int ret;
248
249         ret = i2c_smbus_read_byte_data(client, reg);
250         if (ret < 0)
251                 dev_err(&client->dev, "%s: reg 0x%x, err %d\n",
252                         __func__, reg, ret);
253
254         return ret;
255 }
256
257 static void kr3dh_set_power_mode(struct kr3dh_chip *chip, u8 val)
258 {
259         u8 value, temp;
260
261         temp = (val << KR3DH_PM_SHIFT) & KR3DH_PM_MASK;
262         value = temp | chip->data_rate | chip->zen |
263                 chip->yen | chip->xen;
264
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);
269 }
270
271 static u8 kr3dh_get_power_mode(struct kr3dh_chip *chip)
272 {
273         return (chip->power_mode >> KR3DH_PM_SHIFT);
274 }
275
276 static void kr3dh_set_zen(struct kr3dh_chip *chip, u8 val)
277 {
278         u8 value, temp;
279
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);
284         chip->zen = temp;
285         kr3dh_write_reg(chip->client, KR3DH_CTRL_REG1, &value, 1);
286         mutex_unlock(&chip->lock);
287 }
288
289 static u8 kr3dh_get_zen(struct kr3dh_chip *chip)
290 {
291         return (chip->zen >> KR3DH_ZEN_SHIFT);
292 }
293
294 static void kr3dh_set_yen(struct kr3dh_chip *chip, u8 val)
295 {
296         u8 value, temp;
297
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);
302         chip->yen = temp;
303         kr3dh_write_reg(chip->client, KR3DH_CTRL_REG1, &value, 1);
304         mutex_unlock(&chip->lock);
305 }
306
307 static u8 kr3dh_get_yen(struct kr3dh_chip *chip)
308 {
309         return (chip->yen >> KR3DH_YEN_SHIFT);
310 }
311
312 static void kr3dh_set_xen(struct kr3dh_chip *chip, u8 val)
313 {
314         u8 value, temp;
315
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);
320         chip->xen = temp;
321         kr3dh_write_reg(chip->client, KR3DH_CTRL_REG1, &value, 1);
322         mutex_unlock(&chip->lock);
323 }
324
325 static u8 kr3dh_get_xen(struct kr3dh_chip *chip)
326 {
327         return (chip->xen >> KR3DH_XEN_SHIFT);
328 }
329
330 static void kr3dh_set_reboot(struct kr3dh_chip *chip, u8 val)
331 {
332         u8 value, temp;
333
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);
338         chip->reboot = temp;
339         kr3dh_write_reg(chip->client, KR3DH_CTRL_REG2, &value, 1);
340         mutex_unlock(&chip->lock);
341 }
342
343 static u8 kr3dh_get_reboot(struct kr3dh_chip *chip)
344 {
345         return (chip->reboot >> KR3DH_BOOT_SHIFT);
346 }
347
348 static void kr3dh_set_int1_6d_enable(struct kr3dh_chip *chip, u8 val)
349 {
350         u8 value, temp;
351
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);
361 }
362
363 static u8 kr3dh_get_int1_6d_enable(struct kr3dh_chip *chip)
364 {
365         return (chip->int1_z_high_enable >> KR3DH_6D_SHIFT);
366 }
367
368 static void kr3dh_set_int1_z_high_enable(struct kr3dh_chip *chip, u8 val)
369 {
370         u8 value, temp;
371
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);
381 }
382
383 static u8 kr3dh_get_int1_z_high_enable(struct kr3dh_chip *chip)
384 {
385         return (chip->int1_z_high_enable >> KR3DH_ZHIE_SHIFT);
386 }
387
388 static void kr3dh_set_int1_z_low_enable(struct kr3dh_chip *chip, u8 val)
389 {
390         u8 value, temp;
391
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);
401 }
402
403 static u8 kr3dh_get_int1_z_low_enable(struct kr3dh_chip *chip)
404 {
405         return (chip->int1_z_low_enable >> KR3DH_ZLIE_SHIFT);
406 }
407
408 static void kr3dh_set_int1_y_high_enable(struct kr3dh_chip *chip, u8 val)
409 {
410         u8 value, temp;
411
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);
421 }
422
423 static u8 kr3dh_get_int1_y_high_enable(struct kr3dh_chip *chip)
424 {
425         return (chip->int1_y_high_enable >> KR3DH_YHIE_SHIFT);
426 }
427
428 static void kr3dh_set_int1_y_low_enable(struct kr3dh_chip *chip, u8 val)
429 {
430         u8 value, temp;
431
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);
441 }
442
443 static u8 kr3dh_get_int1_y_low_enable(struct kr3dh_chip *chip)
444 {
445         return (chip->int1_y_low_enable >> KR3DH_YLIE_SHIFT);
446 }
447
448 static void kr3dh_set_int1_x_high_enable(struct kr3dh_chip *chip, u8 val)
449 {
450         u8 value, temp;
451
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);
461 }
462
463 static u8 kr3dh_get_int1_x_high_enable(struct kr3dh_chip *chip)
464 {
465         return (chip->int1_x_high_enable >> KR3DH_XHIE_SHIFT);
466 }
467
468 static void kr3dh_set_int1_x_low_enable(struct kr3dh_chip *chip, u8 val)
469 {
470         u8 value, temp;
471
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);
481 }
482
483 static u8 kr3dh_get_int1_x_low_enable(struct kr3dh_chip *chip)
484 {
485         return (chip->int1_x_low_enable >> KR3DH_XLIE_SHIFT);
486 }
487
488 static void kr3dh_set_int1_threshold(struct kr3dh_chip *chip, u8 val)
489 {
490         u8 value = val;
491
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);
496 }
497
498 static u8 kr3dh_get_int1_threshold(struct kr3dh_chip *chip)
499 {
500         return chip->int1_threshold;
501 }
502
503 static void kr3dh_set_int1_duration(struct kr3dh_chip *chip, u8 val)
504 {
505         u8 value = val;
506
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);
511 }
512
513 static u8 kr3dh_get_int1_duration(struct kr3dh_chip *chip)
514 {
515         return chip->int1_duration;
516 }
517
518 static void kr3dh_set_int2_6d_enable(struct kr3dh_chip *chip, u8 val)
519 {
520         u8 value, temp;
521
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);
531 }
532
533 static u8 kr3dh_get_int2_6d_enable(struct kr3dh_chip *chip)
534 {
535         return (chip->int2_6d_enable >> KR3DH_6D_SHIFT);
536 }
537
538 static void kr3dh_set_int2_z_high_enable(struct kr3dh_chip *chip, u8 val)
539 {
540         u8 value, temp;
541
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);
551 }
552
553 static u8 kr3dh_get_int2_z_high_enable(struct kr3dh_chip *chip)
554 {
555         return (chip->int2_z_high_enable >> KR3DH_ZHIE_SHIFT);
556 }
557
558 static void kr3dh_set_int2_z_low_enable(struct kr3dh_chip *chip, u8 val)
559 {
560         u8 value, temp;
561
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);
571 }
572
573 static u8 kr3dh_get_int2_z_low_enable(struct kr3dh_chip *chip)
574 {
575         return (chip->int2_z_low_enable >> KR3DH_ZLIE_SHIFT);
576 }
577
578 static void kr3dh_set_int2_y_high_enable(struct kr3dh_chip *chip, u8 val)
579 {
580         u8 value, temp;
581
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);
591 }
592
593 static u8 kr3dh_get_int2_y_high_enable(struct kr3dh_chip *chip)
594 {
595         return (chip->int2_y_high_enable >> KR3DH_YHIE_SHIFT);
596 }
597
598 static void kr3dh_set_int2_y_low_enable(struct kr3dh_chip *chip, u8 val)
599 {
600         u8 value, temp;
601
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);
611 }
612
613 static u8 kr3dh_get_int2_y_low_enable(struct kr3dh_chip *chip)
614 {
615         return (chip->int2_y_low_enable >> KR3DH_YLIE_SHIFT);
616 }
617
618 static void kr3dh_set_int2_x_high_enable(struct kr3dh_chip *chip, u8 val)
619 {
620         u8 value, temp;
621
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);
631 }
632
633 static u8 kr3dh_get_int2_x_high_enable(struct kr3dh_chip *chip)
634 {
635         return (chip->int2_x_high_enable >> KR3DH_XHIE_SHIFT);
636 }
637
638 static void kr3dh_set_int2_x_low_enable(struct kr3dh_chip *chip, u8 val)
639 {
640         u8 value, temp;
641
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);
651 }
652
653 static u8 kr3dh_get_int2_x_low_enable(struct kr3dh_chip *chip)
654 {
655         return (chip->int2_x_low_enable >> KR3DH_XLIE_SHIFT);
656 }
657
658 static void kr3dh_set_int2_threshold(struct kr3dh_chip *chip, u8 val)
659 {
660         u8 value = val;
661
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);
666 }
667
668 static u8 kr3dh_get_int2_threshold(struct kr3dh_chip *chip)
669 {
670         return chip->int2_threshold;
671 }
672
673 static void kr3dh_set_int2_duration(struct kr3dh_chip *chip, u8 val)
674 {
675         u8 value = val;
676
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);
681 }
682
683 static u8 kr3dh_get_int2_duration(struct kr3dh_chip *chip)
684 {
685         return chip->int2_duration;
686 }
687
688 static void kr3dh_get_xyz(struct kr3dh_chip *chip)
689 {
690         u8 xyz_values[6];
691         s16 temp;
692         int ret;
693
694         mutex_lock(&chip->lock);
695
696         ret = i2c_smbus_read_i2c_block_data(chip->client,
697                 KR3DH_MULTI_OUT_X_L, 6, xyz_values);
698         if (ret < 0)
699                 goto out;
700
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;
707
708         if (chip->pdata->change_xy) {
709                 temp = chip->x;
710                 chip->x = chip->y;
711                 chip->y = temp;
712         }
713 out:
714         mutex_unlock(&chip->lock);
715 }
716
717 static void kr3dh_work1(struct work_struct *work)
718 {
719         struct kr3dh_chip *chip = container_of(work,
720                         struct kr3dh_chip, work1);
721         u8 int1_src = 0;
722
723         int1_src = kr3dh_read_reg(chip->client, KR3DH_INT1_SRC_REG);
724         if (int1_src ||
725            ((chip->int1_cfg & KR3DH_INT1_CFG_MASK) == KR3DH_DATA_READY)) {
726                 kr3dh_get_xyz(chip);
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);
735         }
736
737         enable_irq(chip->client->irq);
738 }
739
740 static void kr3dh_work2(struct work_struct *work)
741 {
742         struct kr3dh_chip *chip = container_of(work,
743                         struct kr3dh_chip, work2);
744         u8 int2_src = 0;
745
746         int2_src = kr3dh_read_reg(chip->client, KR3DH_INT2_SRC_REG);
747         if (int2_src ||
748            ((chip->int2_cfg & KR3DH_INT2_CFG_MASK) == KR3DH_DATA_READY)) {
749                 kr3dh_get_xyz(chip);
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);
758         }
759
760         enable_irq(chip->irq2);
761 }
762
763 static irqreturn_t kr3dh_irq1(int irq, void *data)
764 {
765         struct kr3dh_chip *chip = data;
766
767         if (!work_pending(&chip->work1)) {
768                 disable_irq_nosync(irq);
769                 schedule_work(&chip->work1);
770         } else {
771                 dev_err(&chip->client->dev, "work pending\n");
772         }
773
774         return IRQ_HANDLED;
775 }
776
777 static irqreturn_t kr3dh_irq2(int irq, void *data)
778 {
779         struct kr3dh_chip *chip = data;
780
781         if (!work_pending(&chip->work2)) {
782                 disable_irq_nosync(irq);
783                 schedule_work(&chip->work2);
784         } else {
785                 dev_err(&chip->client->dev, "work pending\n");
786         }
787
788         return IRQ_HANDLED;
789 }
790
791 static ssize_t kr3dh_show_xyz(struct device *dev,
792                 struct device_attribute *attr, char *buf)
793 {
794         struct kr3dh_chip *chip = dev_get_drvdata(dev);
795         kr3dh_get_xyz(chip);
796         return sprintf(buf, "%d %d %d\n", chip->x, chip->y, chip->z);
797 }
798 static DEVICE_ATTR(xyz, S_IRUGO, kr3dh_show_xyz, NULL);
799
800 static ssize_t kr3dh_show_reg_state(struct device *dev,
801                 struct device_attribute *attr, char *buf)
802 {
803         struct kr3dh_chip *chip = dev_get_drvdata(dev);
804         u8 ctrl_reg[5], int1_reg[4];
805         int ret;
806
807         ret = i2c_smbus_read_i2c_block_data(chip->client,
808                 (KR3DH_CTRL_REG1 | KR3DH_AUTO_INCREASE), 5, ctrl_reg);
809
810         if (ret < 0) {
811                 dev_err(&chip->client->dev, "%s: reg 0x%x, err %d\n",
812                         __func__, KR3DH_CTRL_REG1, ret);
813                 return ret;
814         }
815
816         ret = i2c_smbus_read_i2c_block_data(chip->client,
817                 (KR3DH_INT1_CFG_REG | KR3DH_AUTO_INCREASE), 4, int1_reg);
818
819         if (ret < 0) {
820                 dev_err(&chip->client->dev, "%s: reg 0x%x, err %d\n",
821                         __func__, KR3DH_INT1_CFG_REG, ret);
822                 return ret;
823         }
824
825         ret = i2c_smbus_read_byte_data(chip->client, KR3DH_STATUS_REG);
826         if (ret < 0) {
827                 dev_err(&chip->client->dev, "%s: reg 0x%x, err %d\n",
828                         __func__, KR3DH_STATUS_REG, ret);
829                 return ret;
830         }
831
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],
839                                                 int1_reg[3], ret);
840 }
841 static DEVICE_ATTR(reg_state, S_IRUGO, kr3dh_show_reg_state, NULL);
842
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)   \
846 {                                                                       \
847         struct kr3dh_chip *chip = dev_get_drvdata(dev);                 \
848         unsigned long val;                                              \
849         int ret;                                                        \
850                                                                         \
851         if (!count)                                                     \
852                 return -EINVAL;                                         \
853         ret = strict_strtoul(buf, 10, &val);                            \
854         if (ret) {                                                      \
855                 dev_err(dev, "fail: conversion %s 5o number\n", buf);   \
856                 return count;                                           \
857         }                                                               \
858         kr3dh_set_##name(chip, (u8) val);                               \
859         return count;                                                   \
860 }                                                                       \
861 static ssize_t kr3dh_show_##name(struct device *dev,                    \
862                 struct device_attribute *attr, char *buf)               \
863 {                                                                       \
864         struct kr3dh_chip *chip = dev_get_drvdata(dev);                 \
865         u16 ret = kr3dh_get_##name(chip);                               \
866         return sprintf(buf, "%d\n", ret);                               \
867 }                                                                       \
868 static DEVICE_ATTR(name, S_IRUGO | S_IWUSR,                             \
869                 kr3dh_show_##name, kr3dh_store_##name);
870
871 KR3DH_INPUT(power_mode);
872 KR3DH_INPUT(zen);
873 KR3DH_INPUT(yen);
874 KR3DH_INPUT(xen);
875 KR3DH_INPUT(reboot);
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);
894
895 static struct attribute *kr3dh_attributes[] = {
896         &dev_attr_power_mode.attr,
897         &dev_attr_zen.attr,
898         &dev_attr_yen.attr,
899         &dev_attr_xen.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,
919         &dev_attr_xyz.attr,
920         &dev_attr_reg_state.attr,
921         NULL
922 };
923
924 static const struct attribute_group kr3dh_group = {
925         .attrs = kr3dh_attributes,
926 };
927
928 static void kr3dh_unregister_input_device(struct kr3dh_chip *chip)
929 {
930         struct i2c_client *client = chip->client;
931
932         if (client->irq > 0)
933                 free_irq(client->irq, chip);
934         if (chip->irq2 > 0)
935                 free_irq(chip->irq2, chip);
936
937         input_unregister_device(chip->idev);
938         chip->idev = NULL;
939 }
940
941 static int kr3dh_register_input_device(struct kr3dh_chip *chip)
942 {
943         struct i2c_client *client = chip->client;
944         struct input_dev *idev;
945         int ret;
946
947         idev = chip->idev = input_allocate_device();
948         if (!idev) {
949                 dev_err(&client->dev, "allocating input device failed\n");
950                 ret = -ENOMEM;
951                 goto error_alloc;
952         }
953
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);
958
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);
966
967         input_set_drvdata(idev, chip);
968
969         ret = input_register_device(idev);
970         if (ret) {
971                 dev_err(&client->dev, "registering input device failed\n");
972                 goto error_reg;
973         }
974
975         if (client->irq > 0) {
976                 unsigned long irq_flag = IRQF_DISABLED;
977
978                 irq_flag |= IRQF_TRIGGER_RISING;
979                 ret = request_irq(client->irq, kr3dh_irq1, irq_flag,
980                                 "KR3DH accelerometer int1", chip);
981                 if (ret) {
982                         dev_err(&client->dev, "can't get IRQ %d, ret %d\n",
983                                         client->irq, ret);
984                         goto error_irq1;
985                 }
986         }
987
988         if (chip->irq2 > 0) {
989                 unsigned long irq_flag = IRQF_DISABLED;
990
991                 irq_flag |= IRQF_TRIGGER_RISING;
992                 ret = request_irq(chip->irq2, kr3dh_irq2, irq_flag,
993                                 "KR3DH accelerometer int2", chip);
994                 if (ret) {
995                         dev_err(&client->dev, "can't get IRQ %d, ret %d\n",
996                                         chip->irq2, ret);
997                         goto error_irq2;
998                 }
999         }
1000
1001         return 0;
1002
1003 error_irq2:
1004         if (client->irq > 0)
1005                 free_irq(client->irq, chip);
1006 error_irq1:
1007         input_unregister_device(idev);
1008 error_reg:
1009         input_free_device(idev);
1010 error_alloc:
1011         return ret;
1012 }
1013
1014 static void kr3dh_initialize_chip(struct kr3dh_chip *chip)
1015 {
1016         u8 value;
1017
1018         /* CTRL_REG1 */
1019         value = chip->power_mode | chip->data_rate | chip->zen | chip->yen |
1020                 chip->xen;
1021         kr3dh_write_reg(chip->client, KR3DH_CTRL_REG1, &value, 1);
1022
1023         /* CTRL_REG2 */
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);
1027
1028         /* CTRL_REG3 */
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);
1032
1033         /* CTRL_REG4 */
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);
1037
1038         /* INT1_THS_REG */
1039         kr3dh_write_reg(chip->client, KR3DH_INT1_THS,
1040                         &chip->int1_threshold, 1);
1041
1042         /* INT1_DURATION_REG */
1043         kr3dh_write_reg(chip->client, KR3DH_INT1_DURATION,
1044                         &chip->int1_duration, 1);
1045
1046         /* INT2_THS_REG */
1047         kr3dh_write_reg(chip->client, KR3DH_INT2_THS,
1048                         &chip->int2_threshold, 1);
1049
1050         /* INT2_DURATION_REG */
1051         kr3dh_write_reg(chip->client, KR3DH_INT2_DURATION,
1052                         &chip->int2_duration, 1);
1053
1054         /* INT1_CFG_REG */
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);
1060
1061         /* INT2_CFG_REG */
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);
1067
1068         /* CTRL_REG5 */
1069         kr3dh_write_reg(chip->client, KR3DH_CTRL_REG5, &chip->turn_on_mode, 1);
1070
1071 }
1072
1073 static void kr3dh_format_chip_data(struct kr3dh_chip *chip,
1074                         struct kr3dh_platform_data *pdata)
1075 {
1076         chip->irq2 = pdata->irq2;
1077
1078         /* CTRL_REG1 */
1079         chip->power_mode = (pdata->power_mode << KR3DH_PM_SHIFT) &
1080                            KR3DH_PM_MASK;
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;
1087
1088         /* CTRL_REG2 */
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) &
1092                            KR3DH_FDS_MASK;
1093         chip->hp_enable_2 = (pdata->hp_enable_2 << KR3DH_HPEN2_SHIFT) &
1094                             KR3DH_HPEN2_MASK;
1095         chip->hp_enable_1 = (pdata->hp_enable_1 << KR3DH_HPEN1_SHIFT) &
1096                             KR3DH_HPEN1_MASK;
1097         chip->hpcf = (pdata->hpcf << KR3DH_HPCF_SHIFT) & KR3DH_HPCF_MASK;
1098
1099         /* CTRL_REG3 */
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) &
1105                            KR3DH_LIR2_MASK;
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) &
1109                            KR3DH_LIR1_MASK;
1110         chip->int1_cfg = (pdata->int1_cfg << KR3DH_INT1_CFG_SHIFT) &
1111                          KR3DH_INT1_CFG_MASK;
1112
1113         /* CTRL_REG4 */
1114         chip->block_data_update = (pdata->block_data_update << KR3DH_BDU_SHIFT) &
1115                                   KR3DH_BDU_MASK;
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) &
1119                               KR3DH_ST_SIGN_MASK;
1120         chip->selftest = (pdata->selftest << KR3DH_ST_SHIFT) & KR3DH_ST_MASK;
1121         chip->spi_mode = (pdata->spi_mode << KR3DH_SIM_SHIFT) & KR3DH_SIM_MASK;
1122
1123         /* CTRL_REG5 */
1124         chip->turn_on_mode = pdata->turn_on_mode & KR3DH_TURNON_MASK;
1125
1126         /* INT1_CFG_REG */
1127         chip->int1_combination = (pdata->int1_combination << KR3DH_AOR_SHIFT) &
1128                                  KR3DH_AOR_MASK;
1129         chip->int1_6d_enable = (pdata->int1_6d_enable << KR3DH_6D_SHIFT) &
1130                                 KR3DH_6D_MASK;
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;
1143
1144         /* INT1_THS_REG */
1145         chip->int1_threshold = pdata->int1_threshold & KR3DH_INT_THS_MASK;
1146
1147         /* INT1_DURATION_REG */
1148         chip->int1_duration = pdata->int1_duration & KR3DH_INT_DURATION_MASK;
1149
1150         /* INT2_CFG_REG */
1151         chip->int2_combination = (pdata->int2_combination << KR3DH_AOR_SHIFT) &
1152                                  KR3DH_AOR_MASK;
1153         chip->int2_6d_enable = (pdata->int2_6d_enable << KR3DH_6D_SHIFT) &
1154                                 KR3DH_6D_MASK;
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;
1167
1168         /* INT2_THS_REG */
1169         chip->int2_threshold = pdata->int2_threshold & KR3DH_INT_THS_MASK;
1170
1171         /* INT2_DURATION_REG */
1172         chip->int2_duration = pdata->int2_duration & KR3DH_INT_DURATION_MASK;
1173 }
1174
1175 static int __devinit kr3dh_probe(struct i2c_client *client,
1176                           const struct i2c_device_id *id)
1177 {
1178         struct kr3dh_chip *chip;
1179         struct kr3dh_platform_data *pdata;
1180         u8 value;
1181         int ret = -1;
1182
1183         chip = kzalloc(sizeof(struct kr3dh_chip), GFP_KERNEL);
1184         if (!chip)
1185                 return -ENOMEM;
1186
1187         pdata = client->dev.platform_data;
1188         chip->pdata = pdata;
1189
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;
1195         }
1196
1197         chip->client = client;
1198
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);
1203
1204         ret = sysfs_create_group(&client->dev.kobj, &kr3dh_group);
1205         if (ret) {
1206                 dev_err(&client->dev,
1207                                 "creating attribute group failed\n");
1208                 goto error_sysfs;
1209         }
1210
1211         if (pdata)
1212                 kr3dh_format_chip_data(chip, pdata);
1213
1214         ret = kr3dh_register_input_device(chip);
1215         if (ret) {
1216                 dev_err(&client->dev, "registering input device failed\n");
1217                 goto error_input;
1218         }
1219
1220         kr3dh_initialize_chip(chip);
1221
1222         pm_runtime_set_active(&client->dev);
1223
1224         dev_info(&client->dev, "%s registered\n", id->name);
1225
1226         return 0;
1227
1228 error_input:
1229         sysfs_remove_group(&client->dev.kobj, &kr3dh_group);
1230 error_devid_detect:
1231 error_sysfs:
1232         kfree(chip);
1233         return ret;
1234 }
1235
1236 static int __devexit kr3dh_remove(struct i2c_client *client)
1237 {
1238         struct kr3dh_chip *chip = i2c_get_clientdata(client);
1239
1240         disable_irq_nosync(client->irq);
1241         disable_irq_nosync(chip->irq2);
1242         cancel_work_sync(&chip->work1);
1243         cancel_work_sync(&chip->work2);
1244
1245         kr3dh_unregister_input_device(chip);
1246         sysfs_remove_group(&client->dev.kobj, &kr3dh_group);
1247         kfree(chip);
1248
1249         return 0;
1250 }
1251
1252 #ifdef CONFIG_PM
1253 static int kr3dh_suspend(struct device *dev)
1254 {
1255         struct i2c_client *client = to_i2c_client(dev);
1256         struct kr3dh_chip *chip = i2c_get_clientdata(client);
1257
1258         disable_irq_nosync(client->irq);
1259         disable_irq_nosync(chip->irq2);
1260         cancel_work_sync(&chip->work1);
1261         cancel_work_sync(&chip->work2);
1262
1263         chip->resume_power_mode = chip->power_mode;
1264         kr3dh_set_power_mode(chip, KR3DH_POWER_DOWN << KR3DH_PM_SHIFT);
1265
1266         return 0;
1267 }
1268
1269 static int kr3dh_resume(struct device *dev)
1270 {
1271         struct i2c_client *client = to_i2c_client(dev);
1272         struct kr3dh_chip *chip = i2c_get_clientdata(client);
1273
1274         kr3dh_set_power_mode(chip, chip->resume_power_mode >> KR3DH_PM_SHIFT);
1275
1276         enable_irq(client->irq);
1277         enable_irq(chip->irq2);
1278
1279         return 0;
1280 }
1281
1282 static int kr3dh_freeze(struct device *dev)
1283 {
1284         struct i2c_client *client = to_i2c_client(dev);
1285         struct kr3dh_chip *chip = i2c_get_clientdata(client);
1286
1287         disable_irq_nosync(client->irq);
1288         disable_irq_nosync(chip->irq2);
1289         cancel_work_sync(&chip->work1);
1290         cancel_work_sync(&chip->work2);
1291
1292         return 0;
1293 }
1294
1295 static int kr3dh_restore(struct device *dev)
1296 {
1297         struct i2c_client *client = to_i2c_client(dev);
1298         struct kr3dh_chip *chip = i2c_get_clientdata(client);
1299
1300         kr3dh_initialize_chip(chip);
1301
1302         enable_irq(client->irq);
1303         enable_irq(chip->irq2);
1304
1305         return 0;
1306 }
1307
1308
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,
1314 };
1315
1316 #define KR3DH_DEV_PM_OPS        (&kr3dh_dev_pm_ops)
1317 #else
1318 #define KR3DH_DEV_PM_OPS        NULL
1319 #endif
1320
1321 static const struct i2c_device_id kr3dh_id[] = {
1322         { "KR3DH", 0 },
1323         { }
1324 };
1325 MODULE_DEVICE_TABLE(i2c, kr3dh_id);
1326
1327 static struct i2c_driver kr3dh_i2c_driver = {
1328         .driver = {
1329                 .name   = "KR3DH",
1330                 .pm     = KR3DH_DEV_PM_OPS,
1331         },
1332         .probe          = kr3dh_probe,
1333         .remove         = __exit_p(kr3dh_remove),
1334         .id_table       = kr3dh_id,
1335 };
1336
1337 static int __init kr3dh_init(void)
1338 {
1339         return i2c_add_driver(&kr3dh_i2c_driver);
1340 }
1341 module_init(kr3dh_init);
1342
1343 static void __exit kr3dh_exit(void)
1344 {
1345         i2c_del_driver(&kr3dh_i2c_driver);
1346 }
1347 module_exit(kr3dh_exit);
1348
1349 MODULE_AUTHOR("Donggeun Kim <dg77.kim@samsung.com>");
1350 MODULE_DESCRIPTION("KR3DH accelerometer driver");
1351 MODULE_LICENSE("GPL");