On Fri, Apr 3, 2015 at 3:03 PM, Vlad Dogaru <vlad.dogaru@xxxxxxxxx> wrote: > In its present state, the driver mandates that its buffer only be > triggered by one of the device's own triggers (data ready or any > motion). This is not always desirable, for example because the > interrupt pins may not be wired in. > > Patch the driver to be able to accept using an external trigger, such as > one based on hrtimer. When using such a trigger, we need to ensure that > the device is powered on when the buffer is started. We do that by > setting setup_ops for the buffer. > > Signed-off-by: Vlad Dogaru <vlad.dogaru@xxxxxxxxx> Reviewed-by: Daniel Baluta <daniel.baluta@xxxxxxxxx> > --- > > I used the hrtimer-based trigger patches that Daniel sent earlier this week to > test these changes. > > drivers/iio/accel/kxcjk-1013.c | 38 +++++++++++++++++++++++--------------- > 1 file changed, 23 insertions(+), 15 deletions(-) > > diff --git a/drivers/iio/accel/kxcjk-1013.c b/drivers/iio/accel/kxcjk-1013.c > index a98b5d2..7ae1bdb 100644 > --- a/drivers/iio/accel/kxcjk-1013.c > +++ b/drivers/iio/accel/kxcjk-1013.c > @@ -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, > }; > > @@ -1276,16 +1285,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); > -- > 1.9.1 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-iio" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-iio" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html