Merge tag 'iio-for-v4.2a' of git://git.kernel.org/pub/scm/linux/kernel/git/jic23...
[cascardo/linux.git] / drivers / iio / accel / kxcjk-1013.c
index 51da369..0d9bd35 100644 (file)
@@ -875,15 +875,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 +938,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 +953,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,8 +1156,10 @@ 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);
@@ -1163,6 +1174,7 @@ static int kxcjk1013_gpio_probe(struct i2c_client *client,
 
        if (!client)
                return -EINVAL;
+
        if (data->is_smo8500_device)
                return -ENOTSUPP;
 
@@ -1276,16 +1288,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);
@@ -1418,6 +1429,7 @@ static const struct dev_pm_ops kxcjk1013_pm_ops = {
 static const struct acpi_device_id kx_acpi_match[] = {
        {"KXCJ1013", KXCJK1013},
        {"KXCJ1008", KXCJ91008},
+       {"KXCJ9000", KXCJ91008},
        {"KXTJ1009", KXTJ21009},
        {"SMO8500",  KXCJ91008},
        { },