OSDN Git Service

iio: accel: kxcjk1013: extract report_motion_event() from interrupt handler
authorMichał Mirosław <mirq-linux@rere.qmqm.pl>
Sun, 17 Sep 2017 15:01:02 +0000 (17:01 +0200)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Mon, 9 Oct 2017 19:49:58 +0000 (20:49 +0100)
Extract reporting of motion event direction from interrupt handler,
as it is not supported by KXTF9.

Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/accel/kxcjk-1013.c

index 756f077..b8e09bd 100644 (file)
@@ -1030,6 +1030,72 @@ static const struct iio_trigger_ops kxcjk1013_trigger_ops = {
        .try_reenable = kxcjk1013_trig_try_reen,
 };
 
+static void kxcjk1013_report_motion_event(struct iio_dev *indio_dev)
+{
+       struct kxcjk1013_data *data = iio_priv(indio_dev);
+
+       int ret = i2c_smbus_read_byte_data(data->client,
+                                          KXCJK1013_REG_INT_SRC2);
+       if (ret < 0) {
+               dev_err(&data->client->dev, "Error reading reg_int_src2\n");
+               return;
+       }
+
+       if (ret & KXCJK1013_REG_INT_SRC2_BIT_XN)
+               iio_push_event(indio_dev,
+                              IIO_MOD_EVENT_CODE(IIO_ACCEL,
+                                                 0,
+                                                 IIO_MOD_X,
+                                                 IIO_EV_TYPE_THRESH,
+                                                 IIO_EV_DIR_FALLING),
+                              data->timestamp);
+
+       if (ret & KXCJK1013_REG_INT_SRC2_BIT_XP)
+               iio_push_event(indio_dev,
+                              IIO_MOD_EVENT_CODE(IIO_ACCEL,
+                                                 0,
+                                                 IIO_MOD_X,
+                                                 IIO_EV_TYPE_THRESH,
+                                                 IIO_EV_DIR_RISING),
+                              data->timestamp);
+
+       if (ret & KXCJK1013_REG_INT_SRC2_BIT_YN)
+               iio_push_event(indio_dev,
+                              IIO_MOD_EVENT_CODE(IIO_ACCEL,
+                                                 0,
+                                                 IIO_MOD_Y,
+                                                 IIO_EV_TYPE_THRESH,
+                                                 IIO_EV_DIR_FALLING),
+                              data->timestamp);
+
+       if (ret & KXCJK1013_REG_INT_SRC2_BIT_YP)
+               iio_push_event(indio_dev,
+                              IIO_MOD_EVENT_CODE(IIO_ACCEL,
+                                                 0,
+                                                 IIO_MOD_Y,
+                                                 IIO_EV_TYPE_THRESH,
+                                                 IIO_EV_DIR_RISING),
+                              data->timestamp);
+
+       if (ret & KXCJK1013_REG_INT_SRC2_BIT_ZN)
+               iio_push_event(indio_dev,
+                              IIO_MOD_EVENT_CODE(IIO_ACCEL,
+                                                 0,
+                                                 IIO_MOD_Z,
+                                                 IIO_EV_TYPE_THRESH,
+                                                 IIO_EV_DIR_FALLING),
+                              data->timestamp);
+
+       if (ret & KXCJK1013_REG_INT_SRC2_BIT_ZP)
+               iio_push_event(indio_dev,
+                              IIO_MOD_EVENT_CODE(IIO_ACCEL,
+                                                 0,
+                                                 IIO_MOD_Z,
+                                                 IIO_EV_TYPE_THRESH,
+                                                 IIO_EV_DIR_RISING),
+                              data->timestamp);
+}
+
 static irqreturn_t kxcjk1013_event_handler(int irq, void *private)
 {
        struct iio_dev *indio_dev = private;
@@ -1043,65 +1109,7 @@ static irqreturn_t kxcjk1013_event_handler(int irq, void *private)
        }
 
        if (ret & KXCJK1013_REG_INT_SRC1_BIT_WUFS) {
-               ret = i2c_smbus_read_byte_data(data->client,
-                                              KXCJK1013_REG_INT_SRC2);
-               if (ret < 0) {
-                       dev_err(&data->client->dev,
-                               "Error reading reg_int_src2\n");
-                       goto ack_intr;
-               }
-
-               if (ret & KXCJK1013_REG_INT_SRC2_BIT_XN)
-                       iio_push_event(indio_dev,
-                                      IIO_MOD_EVENT_CODE(IIO_ACCEL,
-                                      0,
-                                      IIO_MOD_X,
-                                      IIO_EV_TYPE_THRESH,
-                                      IIO_EV_DIR_FALLING),
-                                      data->timestamp);
-               if (ret & KXCJK1013_REG_INT_SRC2_BIT_XP)
-                       iio_push_event(indio_dev,
-                                      IIO_MOD_EVENT_CODE(IIO_ACCEL,
-                                      0,
-                                      IIO_MOD_X,
-                                      IIO_EV_TYPE_THRESH,
-                                      IIO_EV_DIR_RISING),
-                                      data->timestamp);
-
-
-               if (ret & KXCJK1013_REG_INT_SRC2_BIT_YN)
-                       iio_push_event(indio_dev,
-                                      IIO_MOD_EVENT_CODE(IIO_ACCEL,
-                                      0,
-                                      IIO_MOD_Y,
-                                      IIO_EV_TYPE_THRESH,
-                                      IIO_EV_DIR_FALLING),
-                                      data->timestamp);
-               if (ret & KXCJK1013_REG_INT_SRC2_BIT_YP)
-                       iio_push_event(indio_dev,
-                                      IIO_MOD_EVENT_CODE(IIO_ACCEL,
-                                      0,
-                                      IIO_MOD_Y,
-                                      IIO_EV_TYPE_THRESH,
-                                      IIO_EV_DIR_RISING),
-                                      data->timestamp);
-
-               if (ret & KXCJK1013_REG_INT_SRC2_BIT_ZN)
-                       iio_push_event(indio_dev,
-                                      IIO_MOD_EVENT_CODE(IIO_ACCEL,
-                                      0,
-                                      IIO_MOD_Z,
-                                      IIO_EV_TYPE_THRESH,
-                                      IIO_EV_DIR_FALLING),
-                                      data->timestamp);
-               if (ret & KXCJK1013_REG_INT_SRC2_BIT_ZP)
-                       iio_push_event(indio_dev,
-                                      IIO_MOD_EVENT_CODE(IIO_ACCEL,
-                                      0,
-                                      IIO_MOD_Z,
-                                      IIO_EV_TYPE_THRESH,
-                                      IIO_EV_DIR_RISING),
-                                      data->timestamp);
+               kxcjk1013_report_motion_event(indio_dev);
        }
 
 ack_intr: