iio: magn: bmc150: decouple buffer and trigger
authorVlad Dogaru <vlad.dogaru@intel.com>
Fri, 12 Jun 2015 08:31:38 +0000 (11:31 +0300)
committerJonathan Cameron <jic23@kernel.org>
Sun, 21 Jun 2015 13:56:48 +0000 (14:56 +0100)
Signed-off-by: Vlad Dogaru <vlad.dogaru@intel.com>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
drivers/iio/magnetometer/bmc150_magn.c

index d4c1788699911e934fc3c1baffa3de8928ac26a6..a0e64f19f4c467714c13bfb6549727b7b8b64789 100644 (file)
@@ -588,17 +588,6 @@ static int bmc150_magn_write_raw(struct iio_dev *indio_dev,
        }
 }
 
-static int bmc150_magn_validate_trigger(struct iio_dev *indio_dev,
-                                       struct iio_trigger *trig)
-{
-       struct bmc150_magn_data *data = iio_priv(indio_dev);
-
-       if (data->dready_trig != trig)
-               return -EINVAL;
-
-       return 0;
-}
-
 static ssize_t bmc150_magn_show_samp_freq_avail(struct device *dev,
                                                struct device_attribute *attr,
                                                char *buf)
@@ -659,7 +648,6 @@ static const struct iio_info bmc150_magn_info = {
        .attrs = &bmc150_magn_attrs_group,
        .read_raw = bmc150_magn_read_raw,
        .write_raw = bmc150_magn_write_raw,
-       .validate_trigger = bmc150_magn_validate_trigger,
        .driver_module = THIS_MODULE,
 };
 
@@ -682,7 +670,7 @@ static irqreturn_t bmc150_magn_trigger_handler(int irq, void *p)
                                           pf->timestamp);
 
 err:
-       iio_trigger_notify_done(data->dready_trig);
+       iio_trigger_notify_done(indio_dev->trig);
 
        return IRQ_HANDLED;
 }
@@ -827,6 +815,27 @@ static const struct iio_trigger_ops bmc150_magn_trigger_ops = {
        .owner = THIS_MODULE,
 };
 
+static int bmc150_magn_buffer_preenable(struct iio_dev *indio_dev)
+{
+       struct bmc150_magn_data *data = iio_priv(indio_dev);
+
+       return bmc150_magn_set_power_state(data, true);
+}
+
+static int bmc150_magn_buffer_postdisable(struct iio_dev *indio_dev)
+{
+       struct bmc150_magn_data *data = iio_priv(indio_dev);
+
+       return bmc150_magn_set_power_state(data, false);
+}
+
+static const struct iio_buffer_setup_ops bmc150_magn_buffer_setup_ops = {
+       .preenable = bmc150_magn_buffer_preenable,
+       .postenable = iio_triggered_buffer_postenable,
+       .predisable = iio_triggered_buffer_predisable,
+       .postdisable = bmc150_magn_buffer_postdisable,
+};
+
 static int bmc150_magn_gpio_probe(struct i2c_client *client)
 {
        struct device *dev;
@@ -932,16 +941,6 @@ static int bmc150_magn_probe(struct i2c_client *client,
                        goto err_poweroff;
                }
 
-               ret = iio_triggered_buffer_setup(indio_dev,
-                                                &iio_pollfunc_store_time,
-                                                bmc150_magn_trigger_handler,
-                                                NULL);
-               if (ret < 0) {
-                       dev_err(&client->dev,
-                               "iio triggered buffer setup failed\n");
-                       goto err_trigger_unregister;
-               }
-
                ret = request_threaded_irq(client->irq,
                                           iio_trigger_generic_data_rdy_poll,
                                           NULL,
@@ -951,14 +950,24 @@ static int bmc150_magn_probe(struct i2c_client *client,
                if (ret < 0) {
                        dev_err(&client->dev, "request irq %d failed\n",
                                client->irq);
-                       goto err_buffer_cleanup;
+                       goto err_trigger_unregister;
                }
        }
 
+       ret = iio_triggered_buffer_setup(indio_dev,
+                                        iio_pollfunc_store_time,
+                                        bmc150_magn_trigger_handler,
+                                        &bmc150_magn_buffer_setup_ops);
+       if (ret < 0) {
+               dev_err(&client->dev,
+                       "iio triggered buffer setup failed\n");
+               goto err_free_irq;
+       }
+
        ret = iio_device_register(indio_dev);
        if (ret < 0) {
                dev_err(&client->dev, "unable to register iio device\n");
-               goto err_free_irq;
+               goto err_buffer_cleanup;
        }
 
        ret = pm_runtime_set_active(&client->dev);
@@ -976,12 +985,11 @@ static int bmc150_magn_probe(struct i2c_client *client,
 
 err_iio_unregister:
        iio_device_unregister(indio_dev);
+err_buffer_cleanup:
+       iio_triggered_buffer_cleanup(indio_dev);
 err_free_irq:
        if (client->irq > 0)
                free_irq(client->irq, data->dready_trig);
-err_buffer_cleanup:
-       if (data->dready_trig)
-               iio_triggered_buffer_cleanup(indio_dev);
 err_trigger_unregister:
        if (data->dready_trig)
                iio_trigger_unregister(data->dready_trig);
@@ -1000,14 +1008,13 @@ static int bmc150_magn_remove(struct i2c_client *client)
        pm_runtime_put_noidle(&client->dev);
 
        iio_device_unregister(indio_dev);
+       iio_triggered_buffer_cleanup(indio_dev);
 
        if (client->irq > 0)
                free_irq(data->client->irq, data->dready_trig);
 
-       if (data->dready_trig) {
-               iio_triggered_buffer_cleanup(indio_dev);
+       if (data->dready_trig)
                iio_trigger_unregister(data->dready_trig);
-       }
 
        mutex_lock(&data->mutex);
        bmc150_magn_set_power_mode(data, BMC150_MAGN_POWER_MODE_SUSPEND, true);
This page took 0.026329 seconds and 5 git commands to generate.