iio: mma8452: Add highpass filter configuration.
[platform/kernel/linux-starfive.git] / drivers / iio / accel / mma8452.c
1 /*
2  * mma8452.c - Support for Freescale MMA8452Q 3-axis 12-bit accelerometer
3  *
4  * Copyright 2014 Peter Meerwald <pmeerw@pmeerw.net>
5  *
6  * This file is subject to the terms and conditions of version 2 of
7  * the GNU General Public License.  See the file COPYING in the main
8  * directory of this archive for more details.
9  *
10  * 7-bit I2C slave address 0x1c/0x1d (pin selectable)
11  *
12  * TODO: orientation / freefall events, autosleep
13  */
14
15 #include <linux/module.h>
16 #include <linux/i2c.h>
17 #include <linux/iio/iio.h>
18 #include <linux/iio/sysfs.h>
19 #include <linux/iio/trigger_consumer.h>
20 #include <linux/iio/buffer.h>
21 #include <linux/iio/triggered_buffer.h>
22 #include <linux/iio/events.h>
23 #include <linux/delay.h>
24
25 #define MMA8452_STATUS 0x00
26 #define MMA8452_OUT_X 0x01 /* MSB first, 12-bit  */
27 #define MMA8452_OUT_Y 0x03
28 #define MMA8452_OUT_Z 0x05
29 #define MMA8452_INT_SRC 0x0c
30 #define MMA8452_WHO_AM_I 0x0d
31 #define MMA8452_DATA_CFG 0x0e
32 #define MMA8452_HP_FILTER_CUTOFF 0x0f
33 #define MMA8452_HP_FILTER_CUTOFF_SEL_MASK       (BIT(0) | BIT(1))
34 #define MMA8452_TRANSIENT_CFG 0x1d
35 #define MMA8452_TRANSIENT_CFG_ELE               BIT(4)
36 #define MMA8452_TRANSIENT_CFG_CHAN(chan)        BIT(chan + 1)
37 #define MMA8452_TRANSIENT_CFG_HPF_BYP           BIT(0)
38 #define MMA8452_TRANSIENT_SRC 0x1e
39 #define MMA8452_TRANSIENT_SRC_XTRANSE           BIT(1)
40 #define MMA8452_TRANSIENT_SRC_YTRANSE           BIT(3)
41 #define MMA8452_TRANSIENT_SRC_ZTRANSE           BIT(5)
42 #define MMA8452_TRANSIENT_THS 0x1f
43 #define MMA8452_TRANSIENT_THS_MASK      0x7f
44 #define MMA8452_TRANSIENT_COUNT 0x20
45 #define MMA8452_OFF_X 0x2f
46 #define MMA8452_OFF_Y 0x30
47 #define MMA8452_OFF_Z 0x31
48 #define MMA8452_CTRL_REG1 0x2a
49 #define MMA8452_CTRL_REG2 0x2b
50 #define MMA8452_CTRL_REG2_RST           BIT(6)
51 #define MMA8452_CTRL_REG4 0x2d
52 #define MMA8452_CTRL_REG5 0x2e
53
54 #define MMA8452_MAX_REG 0x31
55
56 #define MMA8452_STATUS_DRDY (BIT(2) | BIT(1) | BIT(0))
57
58 #define MMA8452_CTRL_DR_MASK (BIT(5) | BIT(4) | BIT(3))
59 #define MMA8452_CTRL_DR_SHIFT 3
60 #define MMA8452_CTRL_DR_DEFAULT 0x4 /* 50 Hz sample frequency */
61 #define MMA8452_CTRL_ACTIVE BIT(0)
62
63 #define MMA8452_DATA_CFG_FS_MASK (BIT(1) | BIT(0))
64 #define MMA8452_DATA_CFG_FS_2G 0
65 #define MMA8452_DATA_CFG_FS_4G 1
66 #define MMA8452_DATA_CFG_FS_8G 2
67 #define MMA8452_DATA_CFG_HPF_MASK BIT(4)
68
69 #define MMA8452_INT_TRANS       BIT(5)
70
71 #define MMA8452_DEVICE_ID 0x2a
72
73 struct mma8452_data {
74         struct i2c_client *client;
75         struct mutex lock;
76         u8 ctrl_reg1;
77         u8 data_cfg;
78 };
79
80 static int mma8452_drdy(struct mma8452_data *data)
81 {
82         int tries = 150;
83
84         while (tries-- > 0) {
85                 int ret = i2c_smbus_read_byte_data(data->client,
86                         MMA8452_STATUS);
87                 if (ret < 0)
88                         return ret;
89                 if ((ret & MMA8452_STATUS_DRDY) == MMA8452_STATUS_DRDY)
90                         return 0;
91                 msleep(20);
92         }
93
94         dev_err(&data->client->dev, "data not ready\n");
95         return -EIO;
96 }
97
98 static int mma8452_read(struct mma8452_data *data, __be16 buf[3])
99 {
100         int ret = mma8452_drdy(data);
101         if (ret < 0)
102                 return ret;
103         return i2c_smbus_read_i2c_block_data(data->client,
104                 MMA8452_OUT_X, 3 * sizeof(__be16), (u8 *) buf);
105 }
106
107 static ssize_t mma8452_show_int_plus_micros(char *buf,
108         const int (*vals)[2], int n)
109 {
110         size_t len = 0;
111
112         while (n-- > 0)
113                 len += scnprintf(buf + len, PAGE_SIZE - len,
114                         "%d.%06d ", vals[n][0], vals[n][1]);
115
116         /* replace trailing space by newline */
117         buf[len - 1] = '\n';
118
119         return len;
120 }
121
122 static int mma8452_get_int_plus_micros_index(const int (*vals)[2], int n,
123                                         int val, int val2)
124 {
125         while (n-- > 0)
126                 if (val == vals[n][0] && val2 == vals[n][1])
127                         return n;
128
129         return -EINVAL;
130 }
131
132 static int mma8452_get_odr_index(struct mma8452_data *data)
133 {
134         return (data->ctrl_reg1 & MMA8452_CTRL_DR_MASK) >>
135                         MMA8452_CTRL_DR_SHIFT;
136 }
137
138 static const int mma8452_samp_freq[8][2] = {
139         {800, 0}, {400, 0}, {200, 0}, {100, 0}, {50, 0}, {12, 500000},
140         {6, 250000}, {1, 560000}
141 };
142
143 /*
144  * Hardware has fullscale of -2G, -4G, -8G corresponding to raw value -2048
145  * The userspace interface uses m/s^2 and we declare micro units
146  * So scale factor is given by:
147  *      g * N * 1000000 / 2048 for N = 2, 4, 8 and g=9.80665
148  */
149 static const int mma8452_scales[3][2] = {
150         {0, 9577}, {0, 19154}, {0, 38307}
151 };
152
153 /* Datasheet table 35  (step time vs sample frequency) */
154 static const int mma8452_transient_time_step_us[8] = {
155         1250,
156         2500,
157         5000,
158         10000,
159         20000,
160         20000,
161         20000,
162         20000
163 };
164
165 /* Datasheet table 18 (normal mode) */
166 static const int mma8452_hp_filter_cutoff[8][4][2] = {
167         { {16, 0}, {8, 0}, {4, 0}, {2, 0} },            /* 800 Hz sample */
168         { {16, 0}, {8, 0}, {4, 0}, {2, 0} },            /* 400 Hz sample */
169         { {8, 0}, {4, 0}, {2, 0}, {1, 0} },             /* 200 Hz sample */
170         { {4, 0}, {2, 0}, {1, 0}, {0, 500000} },        /* 100 Hz sample */
171         { {2, 0}, {1, 0}, {0, 500000}, {0, 250000} },   /* 50 Hz sample */
172         { {2, 0}, {1, 0}, {0, 500000}, {0, 250000} },   /* 12.5 Hz sample */
173         { {2, 0}, {1, 0}, {0, 500000}, {0, 250000} },   /* 6.25 Hz sample */
174         { {2, 0}, {1, 0}, {0, 500000}, {0, 250000} }    /* 1.56 Hz sample */
175 };
176
177 static ssize_t mma8452_show_samp_freq_avail(struct device *dev,
178                                 struct device_attribute *attr, char *buf)
179 {
180         return mma8452_show_int_plus_micros(buf, mma8452_samp_freq,
181                 ARRAY_SIZE(mma8452_samp_freq));
182 }
183
184 static ssize_t mma8452_show_scale_avail(struct device *dev,
185                                 struct device_attribute *attr, char *buf)
186 {
187         return mma8452_show_int_plus_micros(buf, mma8452_scales,
188                 ARRAY_SIZE(mma8452_scales));
189 }
190
191 static ssize_t mma8452_show_hp_cutoff_avail(struct device *dev,
192                                             struct device_attribute *attr,
193                                             char *buf)
194 {
195         struct iio_dev *indio_dev = dev_to_iio_dev(dev);
196         struct mma8452_data *data = iio_priv(indio_dev);
197         int i = mma8452_get_odr_index(data);
198
199         return mma8452_show_int_plus_micros(buf, mma8452_hp_filter_cutoff[i],
200                 ARRAY_SIZE(mma8452_hp_filter_cutoff[0]));
201 }
202
203 static IIO_DEV_ATTR_SAMP_FREQ_AVAIL(mma8452_show_samp_freq_avail);
204 static IIO_DEVICE_ATTR(in_accel_scale_available, S_IRUGO,
205         mma8452_show_scale_avail, NULL, 0);
206 static IIO_DEVICE_ATTR(in_accel_filter_high_pass_3db_frequency_available,
207                         S_IRUGO, mma8452_show_hp_cutoff_avail, NULL, 0);
208
209 static int mma8452_get_samp_freq_index(struct mma8452_data *data,
210         int val, int val2)
211 {
212         return mma8452_get_int_plus_micros_index(mma8452_samp_freq,
213                 ARRAY_SIZE(mma8452_samp_freq), val, val2);
214 }
215
216 static int mma8452_get_scale_index(struct mma8452_data *data,
217         int val, int val2)
218 {
219         return mma8452_get_int_plus_micros_index(mma8452_scales,
220                 ARRAY_SIZE(mma8452_scales), val, val2);
221 }
222
223 static int mma8452_get_hp_filter_index(struct mma8452_data *data,
224                                        int val, int val2)
225 {
226         int i = mma8452_get_odr_index(data);
227
228         return mma8452_get_int_plus_micros_index(mma8452_hp_filter_cutoff[i],
229                 ARRAY_SIZE(mma8452_scales[0]), val, val2);
230 }
231
232 static int mma8452_read_hp_filter(struct mma8452_data *data, int *hz, int *uHz)
233 {
234         int i, ret;
235
236         ret = i2c_smbus_read_byte_data(data->client, MMA8452_HP_FILTER_CUTOFF);
237         if (ret < 0)
238                 return ret;
239
240         i = mma8452_get_odr_index(data);
241         ret &= MMA8452_HP_FILTER_CUTOFF_SEL_MASK;
242         *hz = mma8452_hp_filter_cutoff[i][ret][0];
243         *uHz = mma8452_hp_filter_cutoff[i][ret][1];
244
245         return 0;
246 }
247
248 static int mma8452_read_raw(struct iio_dev *indio_dev,
249                             struct iio_chan_spec const *chan,
250                             int *val, int *val2, long mask)
251 {
252         struct mma8452_data *data = iio_priv(indio_dev);
253         __be16 buffer[3];
254         int i, ret;
255
256         switch (mask) {
257         case IIO_CHAN_INFO_RAW:
258                 if (iio_buffer_enabled(indio_dev))
259                         return -EBUSY;
260
261                 mutex_lock(&data->lock);
262                 ret = mma8452_read(data, buffer);
263                 mutex_unlock(&data->lock);
264                 if (ret < 0)
265                         return ret;
266                 *val = sign_extend32(
267                         be16_to_cpu(buffer[chan->scan_index]) >> 4, 11);
268                 return IIO_VAL_INT;
269         case IIO_CHAN_INFO_SCALE:
270                 i = data->data_cfg & MMA8452_DATA_CFG_FS_MASK;
271                 *val = mma8452_scales[i][0];
272                 *val2 = mma8452_scales[i][1];
273                 return IIO_VAL_INT_PLUS_MICRO;
274         case IIO_CHAN_INFO_SAMP_FREQ:
275                 i = mma8452_get_odr_index(data);
276                 *val = mma8452_samp_freq[i][0];
277                 *val2 = mma8452_samp_freq[i][1];
278                 return IIO_VAL_INT_PLUS_MICRO;
279         case IIO_CHAN_INFO_CALIBBIAS:
280                 ret = i2c_smbus_read_byte_data(data->client, MMA8452_OFF_X +
281                         chan->scan_index);
282                 if (ret < 0)
283                         return ret;
284                 *val = sign_extend32(ret, 7);
285                 return IIO_VAL_INT;
286         case IIO_CHAN_INFO_HIGH_PASS_FILTER_3DB_FREQUENCY:
287                 if (data->data_cfg & MMA8452_DATA_CFG_HPF_MASK) {
288                         ret = mma8452_read_hp_filter(data, val, val2);
289                         if (ret < 0)
290                                 return ret;
291                 } else {
292                         *val = 0;
293                         *val2 = 0;
294                 }
295                 return IIO_VAL_INT_PLUS_MICRO;
296         }
297         return -EINVAL;
298 }
299
300 static int mma8452_standby(struct mma8452_data *data)
301 {
302         return i2c_smbus_write_byte_data(data->client, MMA8452_CTRL_REG1,
303                 data->ctrl_reg1 & ~MMA8452_CTRL_ACTIVE);
304 }
305
306 static int mma8452_active(struct mma8452_data *data)
307 {
308         return i2c_smbus_write_byte_data(data->client, MMA8452_CTRL_REG1,
309                 data->ctrl_reg1);
310 }
311
312 static int mma8452_change_config(struct mma8452_data *data, u8 reg, u8 val)
313 {
314         int ret;
315
316         mutex_lock(&data->lock);
317
318         /* config can only be changed when in standby */
319         ret = mma8452_standby(data);
320         if (ret < 0)
321                 goto fail;
322
323         ret = i2c_smbus_write_byte_data(data->client, reg, val);
324         if (ret < 0)
325                 goto fail;
326
327         ret = mma8452_active(data);
328         if (ret < 0)
329                 goto fail;
330
331         ret = 0;
332 fail:
333         mutex_unlock(&data->lock);
334         return ret;
335 }
336
337 static int mma8452_set_hp_filter_frequency(struct mma8452_data *data,
338                                            int val, int val2)
339 {
340         int i, reg;
341
342         i = mma8452_get_hp_filter_index(data, val, val2);
343         if (i < 0)
344                 return -EINVAL;
345
346         reg = i2c_smbus_read_byte_data(data->client,
347                                        MMA8452_HP_FILTER_CUTOFF);
348         if (reg < 0)
349                 return reg;
350         reg &= ~MMA8452_HP_FILTER_CUTOFF_SEL_MASK;
351         reg |= i;
352
353         return mma8452_change_config(data, MMA8452_HP_FILTER_CUTOFF, reg);
354 }
355
356 static int mma8452_write_raw(struct iio_dev *indio_dev,
357                              struct iio_chan_spec const *chan,
358                              int val, int val2, long mask)
359 {
360         struct mma8452_data *data = iio_priv(indio_dev);
361         int i, ret;
362
363         if (iio_buffer_enabled(indio_dev))
364                 return -EBUSY;
365
366         switch (mask) {
367         case IIO_CHAN_INFO_SAMP_FREQ:
368                 i = mma8452_get_samp_freq_index(data, val, val2);
369                 if (i < 0)
370                         return -EINVAL;
371
372                 data->ctrl_reg1 &= ~MMA8452_CTRL_DR_MASK;
373                 data->ctrl_reg1 |= i << MMA8452_CTRL_DR_SHIFT;
374                 return mma8452_change_config(data, MMA8452_CTRL_REG1,
375                         data->ctrl_reg1);
376         case IIO_CHAN_INFO_SCALE:
377                 i = mma8452_get_scale_index(data, val, val2);
378                 if (i < 0)
379                         return -EINVAL;
380                 data->data_cfg &= ~MMA8452_DATA_CFG_FS_MASK;
381                 data->data_cfg |= i;
382                 return mma8452_change_config(data, MMA8452_DATA_CFG,
383                         data->data_cfg);
384         case IIO_CHAN_INFO_CALIBBIAS:
385                 if (val < -128 || val > 127)
386                         return -EINVAL;
387                 return mma8452_change_config(data, MMA8452_OFF_X +
388                         chan->scan_index, val);
389
390         case IIO_CHAN_INFO_HIGH_PASS_FILTER_3DB_FREQUENCY:
391                 if (val == 0 && val2 == 0) {
392                         data->data_cfg &= ~MMA8452_DATA_CFG_HPF_MASK;
393                 } else {
394                         data->data_cfg |= MMA8452_DATA_CFG_HPF_MASK;
395                         ret = mma8452_set_hp_filter_frequency(data, val, val2);
396                         if (ret < 0)
397                                 return ret;
398                 }
399                 return mma8452_change_config(data, MMA8452_DATA_CFG,
400                                                 data->data_cfg);
401
402         default:
403                 return -EINVAL;
404         }
405 }
406
407 static int mma8452_read_thresh(struct iio_dev *indio_dev,
408                                const struct iio_chan_spec *chan,
409                                enum iio_event_type type,
410                                enum iio_event_direction dir,
411                                enum iio_event_info info,
412                                int *val, int *val2)
413 {
414         struct mma8452_data *data = iio_priv(indio_dev);
415         int ret, us;
416
417         switch (info) {
418         case IIO_EV_INFO_VALUE:
419                 ret = i2c_smbus_read_byte_data(data->client,
420                                                MMA8452_TRANSIENT_THS);
421                 if (ret < 0)
422                         return ret;
423
424                 *val = ret & MMA8452_TRANSIENT_THS_MASK;
425                 return IIO_VAL_INT;
426
427         case IIO_EV_INFO_PERIOD:
428                 ret = i2c_smbus_read_byte_data(data->client,
429                                                MMA8452_TRANSIENT_COUNT);
430                 if (ret < 0)
431                         return ret;
432
433                 us = ret * mma8452_transient_time_step_us[
434                                 mma8452_get_odr_index(data)];
435                 *val = us / USEC_PER_SEC;
436                 *val2 = us % USEC_PER_SEC;
437                 return IIO_VAL_INT_PLUS_MICRO;
438
439         case IIO_EV_INFO_HIGH_PASS_FILTER_3DB:
440                 ret = i2c_smbus_read_byte_data(data->client,
441                                                MMA8452_TRANSIENT_CFG);
442                 if (ret < 0)
443                         return ret;
444
445                 if (ret & MMA8452_TRANSIENT_CFG_HPF_BYP) {
446                         *val = 0;
447                         *val2 = 0;
448                 } else {
449                         ret = mma8452_read_hp_filter(data, val, val2);
450                         if (ret < 0)
451                                 return ret;
452                 }
453                 return IIO_VAL_INT_PLUS_MICRO;
454
455         default:
456                 return -EINVAL;
457         }
458 }
459
460 static int mma8452_write_thresh(struct iio_dev *indio_dev,
461                                 const struct iio_chan_spec *chan,
462                                 enum iio_event_type type,
463                                 enum iio_event_direction dir,
464                                 enum iio_event_info info,
465                                 int val, int val2)
466 {
467         struct mma8452_data *data = iio_priv(indio_dev);
468         int ret, reg, steps;
469
470         switch (info) {
471         case IIO_EV_INFO_VALUE:
472                 return mma8452_change_config(data, MMA8452_TRANSIENT_THS,
473                                              val & MMA8452_TRANSIENT_THS_MASK);
474
475         case IIO_EV_INFO_PERIOD:
476                 steps = (val * USEC_PER_SEC + val2) /
477                                 mma8452_transient_time_step_us[
478                                         mma8452_get_odr_index(data)];
479
480                 if (steps > 0xff)
481                         return -EINVAL;
482
483                 return mma8452_change_config(data, MMA8452_TRANSIENT_COUNT,
484                                              steps);
485         case IIO_EV_INFO_HIGH_PASS_FILTER_3DB:
486                 reg = i2c_smbus_read_byte_data(data->client,
487                                                MMA8452_TRANSIENT_CFG);
488                 if (reg < 0)
489                         return reg;
490
491                 if (val == 0 && val2 == 0) {
492                         reg |= MMA8452_TRANSIENT_CFG_HPF_BYP;
493                 } else {
494                         reg &= ~MMA8452_TRANSIENT_CFG_HPF_BYP;
495                         ret = mma8452_set_hp_filter_frequency(data, val, val2);
496                         if (ret < 0)
497                                 return ret;
498                 }
499                 return mma8452_change_config(data, MMA8452_TRANSIENT_CFG, reg);
500
501         default:
502                 return -EINVAL;
503         }
504 }
505
506 static int mma8452_read_event_config(struct iio_dev *indio_dev,
507                                      const struct iio_chan_spec *chan,
508                                      enum iio_event_type type,
509                                      enum iio_event_direction dir)
510 {
511         struct mma8452_data *data = iio_priv(indio_dev);
512         int ret;
513
514         ret = i2c_smbus_read_byte_data(data->client, MMA8452_TRANSIENT_CFG);
515         if (ret < 0)
516                 return ret;
517
518         return ret & MMA8452_TRANSIENT_CFG_CHAN(chan->scan_index) ? 1 : 0;
519 }
520
521 static int mma8452_write_event_config(struct iio_dev *indio_dev,
522                                       const struct iio_chan_spec *chan,
523                                       enum iio_event_type type,
524                                       enum iio_event_direction dir,
525                                       int state)
526 {
527         struct mma8452_data *data = iio_priv(indio_dev);
528         int val;
529
530         val = i2c_smbus_read_byte_data(data->client, MMA8452_TRANSIENT_CFG);
531         if (val < 0)
532                 return val;
533
534         if (state)
535                 val |= MMA8452_TRANSIENT_CFG_CHAN(chan->scan_index);
536         else
537                 val &= ~MMA8452_TRANSIENT_CFG_CHAN(chan->scan_index);
538
539         val |= MMA8452_TRANSIENT_CFG_ELE;
540
541         return mma8452_change_config(data, MMA8452_TRANSIENT_CFG, val);
542 }
543
544 static void mma8452_transient_interrupt(struct iio_dev *indio_dev)
545 {
546         struct mma8452_data *data = iio_priv(indio_dev);
547         s64 ts = iio_get_time_ns();
548         int src;
549
550         src = i2c_smbus_read_byte_data(data->client, MMA8452_TRANSIENT_SRC);
551         if (src < 0)
552                 return;
553
554         if (src & MMA8452_TRANSIENT_SRC_XTRANSE)
555                 iio_push_event(indio_dev,
556                                IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_X,
557                                                   IIO_EV_TYPE_THRESH,
558                                                   IIO_EV_DIR_RISING),
559                                ts);
560
561         if (src & MMA8452_TRANSIENT_SRC_YTRANSE)
562                 iio_push_event(indio_dev,
563                                IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_Y,
564                                                   IIO_EV_TYPE_THRESH,
565                                                   IIO_EV_DIR_RISING),
566                                ts);
567
568         if (src & MMA8452_TRANSIENT_SRC_ZTRANSE)
569                 iio_push_event(indio_dev,
570                                IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_Z,
571                                                   IIO_EV_TYPE_THRESH,
572                                                   IIO_EV_DIR_RISING),
573                                ts);
574 }
575
576 static irqreturn_t mma8452_interrupt(int irq, void *p)
577 {
578         struct iio_dev *indio_dev = p;
579         struct mma8452_data *data = iio_priv(indio_dev);
580         int src;
581
582         src = i2c_smbus_read_byte_data(data->client, MMA8452_INT_SRC);
583         if (src < 0)
584                 return IRQ_NONE;
585
586         if (src & MMA8452_INT_TRANS) {
587                 mma8452_transient_interrupt(indio_dev);
588                 return IRQ_HANDLED;
589         }
590
591         return IRQ_NONE;
592 }
593
594 static irqreturn_t mma8452_trigger_handler(int irq, void *p)
595 {
596         struct iio_poll_func *pf = p;
597         struct iio_dev *indio_dev = pf->indio_dev;
598         struct mma8452_data *data = iio_priv(indio_dev);
599         u8 buffer[16]; /* 3 16-bit channels + padding + ts */
600         int ret;
601
602         ret = mma8452_read(data, (__be16 *) buffer);
603         if (ret < 0)
604                 goto done;
605
606         iio_push_to_buffers_with_timestamp(indio_dev, buffer,
607                 iio_get_time_ns());
608
609 done:
610         iio_trigger_notify_done(indio_dev->trig);
611         return IRQ_HANDLED;
612 }
613
614 static int mma8452_reg_access_dbg(struct iio_dev *indio_dev,
615                                   unsigned reg, unsigned writeval,
616                                   unsigned *readval)
617 {
618         int ret;
619         struct mma8452_data *data = iio_priv(indio_dev);
620
621         if (reg > MMA8452_MAX_REG)
622                 return -EINVAL;
623
624         if (!readval)
625                 return mma8452_change_config(data, reg, writeval);
626
627         ret = i2c_smbus_read_byte_data(data->client, reg);
628         if (ret < 0)
629                 return ret;
630
631         *readval = ret;
632
633         return 0;
634 }
635
636 static const struct iio_event_spec mma8452_transient_event[] = {
637         {
638                 .type = IIO_EV_TYPE_THRESH,
639                 .dir = IIO_EV_DIR_RISING,
640                 .mask_separate = BIT(IIO_EV_INFO_ENABLE),
641                 .mask_shared_by_type = BIT(IIO_EV_INFO_VALUE) |
642                                         BIT(IIO_EV_INFO_PERIOD) |
643                                         BIT(IIO_EV_INFO_HIGH_PASS_FILTER_3DB)
644         },
645 };
646
647 /*
648  * Threshold is configured in fixed 8G/127 steps regardless of
649  * currently selected scale for measurement.
650  */
651 static IIO_CONST_ATTR_NAMED(accel_transient_scale, in_accel_scale, "0.617742");
652
653 static struct attribute *mma8452_event_attributes[] = {
654         &iio_const_attr_accel_transient_scale.dev_attr.attr,
655         NULL,
656 };
657
658 static struct attribute_group mma8452_event_attribute_group = {
659         .attrs = mma8452_event_attributes,
660         .name = "events",
661 };
662
663 #define MMA8452_CHANNEL(axis, idx) { \
664         .type = IIO_ACCEL, \
665         .modified = 1, \
666         .channel2 = IIO_MOD_##axis, \
667         .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
668                 BIT(IIO_CHAN_INFO_CALIBBIAS), \
669         .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SAMP_FREQ) | \
670                 BIT(IIO_CHAN_INFO_SCALE) | \
671                 BIT(IIO_CHAN_INFO_HIGH_PASS_FILTER_3DB_FREQUENCY), \
672         .scan_index = idx, \
673         .scan_type = { \
674                 .sign = 's', \
675                 .realbits = 12, \
676                 .storagebits = 16, \
677                 .shift = 4, \
678                 .endianness = IIO_BE, \
679         }, \
680         .event_spec = mma8452_transient_event, \
681         .num_event_specs = ARRAY_SIZE(mma8452_transient_event), \
682 }
683
684 static const struct iio_chan_spec mma8452_channels[] = {
685         MMA8452_CHANNEL(X, 0),
686         MMA8452_CHANNEL(Y, 1),
687         MMA8452_CHANNEL(Z, 2),
688         IIO_CHAN_SOFT_TIMESTAMP(3),
689 };
690
691 static struct attribute *mma8452_attributes[] = {
692         &iio_dev_attr_sampling_frequency_available.dev_attr.attr,
693         &iio_dev_attr_in_accel_scale_available.dev_attr.attr,
694         &iio_dev_attr_in_accel_filter_high_pass_3db_frequency_available.dev_attr.attr,
695         NULL
696 };
697
698 static const struct attribute_group mma8452_group = {
699         .attrs = mma8452_attributes,
700 };
701
702 static const struct iio_info mma8452_info = {
703         .attrs = &mma8452_group,
704         .read_raw = &mma8452_read_raw,
705         .write_raw = &mma8452_write_raw,
706         .event_attrs = &mma8452_event_attribute_group,
707         .read_event_value = &mma8452_read_thresh,
708         .write_event_value = &mma8452_write_thresh,
709         .read_event_config = &mma8452_read_event_config,
710         .write_event_config = &mma8452_write_event_config,
711         .debugfs_reg_access = &mma8452_reg_access_dbg,
712         .driver_module = THIS_MODULE,
713 };
714
715 static const unsigned long mma8452_scan_masks[] = {0x7, 0};
716
717 static int mma8452_reset(struct i2c_client *client)
718 {
719         int i;
720         int ret;
721
722         ret = i2c_smbus_write_byte_data(client, MMA8452_CTRL_REG2,
723                                         MMA8452_CTRL_REG2_RST);
724         if (ret < 0)
725                 return ret;
726
727         for (i = 0; i < 10; i++) {
728                 usleep_range(100, 200);
729                 ret = i2c_smbus_read_byte_data(client, MMA8452_CTRL_REG2);
730                 if (ret == -EIO)
731                         continue; /* I2C comm reset */
732                 if (ret < 0)
733                         return ret;
734                 if (!(ret & MMA8452_CTRL_REG2_RST))
735                         return 0;
736         }
737
738         return -ETIMEDOUT;
739 }
740
741 static int mma8452_probe(struct i2c_client *client,
742                          const struct i2c_device_id *id)
743 {
744         struct mma8452_data *data;
745         struct iio_dev *indio_dev;
746         int ret;
747
748         ret = i2c_smbus_read_byte_data(client, MMA8452_WHO_AM_I);
749         if (ret < 0)
750                 return ret;
751         if (ret != MMA8452_DEVICE_ID)
752                 return -ENODEV;
753
754         indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
755         if (!indio_dev)
756                 return -ENOMEM;
757
758         data = iio_priv(indio_dev);
759         data->client = client;
760         mutex_init(&data->lock);
761
762         i2c_set_clientdata(client, indio_dev);
763         indio_dev->info = &mma8452_info;
764         indio_dev->name = id->name;
765         indio_dev->dev.parent = &client->dev;
766         indio_dev->modes = INDIO_DIRECT_MODE;
767         indio_dev->channels = mma8452_channels;
768         indio_dev->num_channels = ARRAY_SIZE(mma8452_channels);
769         indio_dev->available_scan_masks = mma8452_scan_masks;
770
771         ret = mma8452_reset(client);
772         if (ret < 0)
773                 return ret;
774
775         data->data_cfg = MMA8452_DATA_CFG_FS_2G;
776         ret = i2c_smbus_write_byte_data(client, MMA8452_DATA_CFG,
777                 data->data_cfg);
778         if (ret < 0)
779                 return ret;
780
781         /*
782          * By default set transient threshold to max to avoid events if
783          * enabling without configuring threshold.
784          */
785         ret = i2c_smbus_write_byte_data(client, MMA8452_TRANSIENT_THS,
786                                         MMA8452_TRANSIENT_THS_MASK);
787         if (ret < 0)
788                 return ret;
789
790         if (client->irq) {
791                 /*
792                  * Although we enable the transient interrupt source once and
793                  * for all here the transient event detection itself is not
794                  * enabled until userspace asks for it by
795                  * mma8452_write_event_config()
796                  */
797                 int supported_interrupts = MMA8452_INT_TRANS;
798
799                 /* Assume wired to INT1 pin */
800                 ret = i2c_smbus_write_byte_data(client,
801                                                 MMA8452_CTRL_REG5,
802                                                 supported_interrupts);
803                 if (ret < 0)
804                         return ret;
805
806                 ret = i2c_smbus_write_byte_data(client,
807                                                 MMA8452_CTRL_REG4,
808                                                 supported_interrupts);
809                 if (ret < 0)
810                         return ret;
811         }
812
813         data->ctrl_reg1 = MMA8452_CTRL_ACTIVE |
814                 (MMA8452_CTRL_DR_DEFAULT << MMA8452_CTRL_DR_SHIFT);
815         ret = i2c_smbus_write_byte_data(client, MMA8452_CTRL_REG1,
816                                         data->ctrl_reg1);
817         if (ret < 0)
818                 return ret;
819
820         ret = iio_triggered_buffer_setup(indio_dev, NULL,
821                 mma8452_trigger_handler, NULL);
822         if (ret < 0)
823                 return ret;
824
825         if (client->irq) {
826                 ret = devm_request_threaded_irq(&client->dev,
827                                                 client->irq,
828                                                 NULL, mma8452_interrupt,
829                                                 IRQF_TRIGGER_LOW | IRQF_ONESHOT,
830                                                 client->name, indio_dev);
831                 if (ret)
832                         goto buffer_cleanup;
833         }
834
835         ret = iio_device_register(indio_dev);
836         if (ret < 0)
837                 goto buffer_cleanup;
838
839         return 0;
840
841 buffer_cleanup:
842         iio_triggered_buffer_cleanup(indio_dev);
843         return ret;
844 }
845
846 static int mma8452_remove(struct i2c_client *client)
847 {
848         struct iio_dev *indio_dev = i2c_get_clientdata(client);
849
850         iio_device_unregister(indio_dev);
851         iio_triggered_buffer_cleanup(indio_dev);
852         mma8452_standby(iio_priv(indio_dev));
853
854         return 0;
855 }
856
857 #ifdef CONFIG_PM_SLEEP
858 static int mma8452_suspend(struct device *dev)
859 {
860         return mma8452_standby(iio_priv(i2c_get_clientdata(
861                 to_i2c_client(dev))));
862 }
863
864 static int mma8452_resume(struct device *dev)
865 {
866         return mma8452_active(iio_priv(i2c_get_clientdata(
867                 to_i2c_client(dev))));
868 }
869
870 static SIMPLE_DEV_PM_OPS(mma8452_pm_ops, mma8452_suspend, mma8452_resume);
871 #define MMA8452_PM_OPS (&mma8452_pm_ops)
872 #else
873 #define MMA8452_PM_OPS NULL
874 #endif
875
876 static const struct i2c_device_id mma8452_id[] = {
877         { "mma8452", 0 },
878         { }
879 };
880 MODULE_DEVICE_TABLE(i2c, mma8452_id);
881
882 static const struct of_device_id mma8452_dt_ids[] = {
883         { .compatible = "fsl,mma8452" },
884         { }
885 };
886
887 static struct i2c_driver mma8452_driver = {
888         .driver = {
889                 .name   = "mma8452",
890                 .of_match_table = of_match_ptr(mma8452_dt_ids),
891                 .pm     = MMA8452_PM_OPS,
892         },
893         .probe = mma8452_probe,
894         .remove = mma8452_remove,
895         .id_table = mma8452_id,
896 };
897 module_i2c_driver(mma8452_driver);
898
899 MODULE_AUTHOR("Peter Meerwald <pmeerw@pmeerw.net>");
900 MODULE_DESCRIPTION("Freescale MMA8452 accelerometer driver");
901 MODULE_LICENSE("GPL");