These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / iio / accel / kxcjk-1013.c
index 5b7a860..18c1b06 100644 (file)
@@ -658,10 +658,8 @@ static int kxcjk1013_set_scale(struct kxcjk1013_data *data, int val)
        int ret, i;
        enum kxcjk1013_mode store_mode;
 
-
        for (i = 0; i < ARRAY_SIZE(KXCJK1013_scale_table); ++i) {
                if (KXCJK1013_scale_table[i].scale == val) {
-
                        ret = kxcjk1013_get_mode(data, &store_mode);
                        if (ret < 0)
                                return ret;
@@ -820,7 +818,6 @@ static int kxcjk1013_read_event_config(struct iio_dev *indio_dev,
                                          enum iio_event_type type,
                                          enum iio_event_direction dir)
 {
-
        struct kxcjk1013_data *data = iio_priv(indio_dev);
 
        return data->ev_enable_state;
@@ -875,15 +872,18 @@ static int kxcjk1013_write_event_config(struct iio_dev *indio_dev,
        return 0;
 }
 
-static int kxcjk1013_validate_trigger(struct iio_dev *indio_dev,
-                                     struct iio_trigger *trig)
+static int kxcjk1013_buffer_preenable(struct iio_dev *indio_dev)
 {
        struct kxcjk1013_data *data = iio_priv(indio_dev);
 
-       if (data->dready_trig != trig && data->motion_trig != trig)
-               return -EINVAL;
+       return kxcjk1013_set_power_state(data, true);
+}
 
-       return 0;
+static int kxcjk1013_buffer_postdisable(struct iio_dev *indio_dev)
+{
+       struct kxcjk1013_data *data = iio_priv(indio_dev);
+
+       return kxcjk1013_set_power_state(data, false);
 }
 
 static IIO_CONST_ATTR_SAMP_FREQ_AVAIL(
@@ -935,6 +935,13 @@ static const struct iio_chan_spec kxcjk1013_channels[] = {
        IIO_CHAN_SOFT_TIMESTAMP(3),
 };
 
+static const struct iio_buffer_setup_ops kxcjk1013_buffer_setup_ops = {
+       .preenable              = kxcjk1013_buffer_preenable,
+       .postenable             = iio_triggered_buffer_postenable,
+       .postdisable            = kxcjk1013_buffer_postdisable,
+       .predisable             = iio_triggered_buffer_predisable,
+};
+
 static const struct iio_info kxcjk1013_info = {
        .attrs                  = &kxcjk1013_attrs_group,
        .read_raw               = kxcjk1013_read_raw,
@@ -943,7 +950,6 @@ static const struct iio_info kxcjk1013_info = {
        .write_event_value      = kxcjk1013_write_event,
        .write_event_config     = kxcjk1013_write_event_config,
        .read_event_config      = kxcjk1013_read_event_config,
-       .validate_trigger       = kxcjk1013_validate_trigger,
        .driver_module          = THIS_MODULE,
 };
 
@@ -1147,41 +1153,15 @@ static const char *kxcjk1013_match_acpi_device(struct device *dev,
        id = acpi_match_device(dev->driver->acpi_match_table, dev);
        if (!id)
                return NULL;
+
        if (strcmp(id->id, "SMO8500") == 0)
                *is_smo8500_device = true;
+
        *chipset = (enum kx_chipset)id->driver_data;
 
        return dev_name(dev);
 }
 
-static int kxcjk1013_gpio_probe(struct i2c_client *client,
-                               struct kxcjk1013_data *data)
-{
-       struct device *dev;
-       struct gpio_desc *gpio;
-       int ret;
-
-       if (!client)
-               return -EINVAL;
-       if (data->is_smo8500_device)
-               return -ENOTSUPP;
-
-       dev = &client->dev;
-
-       /* data ready gpio interrupt pin */
-       gpio = devm_gpiod_get_index(dev, "kxcjk1013_int", 0, GPIOD_IN);
-       if (IS_ERR(gpio)) {
-               dev_err(dev, "acpi gpio get index failed\n");
-               return PTR_ERR(gpio);
-       }
-
-       ret = gpiod_to_irq(gpio);
-
-       dev_dbg(dev, "GPIO resource, no:%d irq:%d\n", desc_to_gpio(gpio), ret);
-
-       return ret;
-}
-
 static int kxcjk1013_probe(struct i2c_client *client,
                           const struct i2c_device_id *id)
 {
@@ -1228,10 +1208,7 @@ static int kxcjk1013_probe(struct i2c_client *client,
        indio_dev->modes = INDIO_DIRECT_MODE;
        indio_dev->info = &kxcjk1013_info;
 
-       if (client->irq < 0)
-               client->irq = kxcjk1013_gpio_probe(client, data);
-
-       if (client->irq >= 0) {
+       if (client->irq > 0 && !data->is_smo8500_device) {
                ret = devm_request_threaded_irq(&client->dev, client->irq,
                                                kxcjk1013_data_rdy_trig_poll,
                                                kxcjk1013_event_handler,
@@ -1276,16 +1253,15 @@ static int kxcjk1013_probe(struct i2c_client *client,
                        data->motion_trig = NULL;
                        goto err_trigger_unregister;
                }
+       }
 
-               ret = iio_triggered_buffer_setup(indio_dev,
-                                               &iio_pollfunc_store_time,
-                                               kxcjk1013_trigger_handler,
-                                               NULL);
-               if (ret < 0) {
-                       dev_err(&client->dev,
-                                       "iio triggered buffer setup failed\n");
-                       goto err_trigger_unregister;
-               }
+       ret = iio_triggered_buffer_setup(indio_dev,
+                                        &iio_pollfunc_store_time,
+                                        kxcjk1013_trigger_handler,
+                                        &kxcjk1013_buffer_setup_ops);
+       if (ret < 0) {
+               dev_err(&client->dev, "iio triggered buffer setup failed\n");
+               goto err_trigger_unregister;
        }
 
        ret = iio_device_register(indio_dev);