On 09/04/15 14:36, Vlad Dogaru wrote: > On Thu, Apr 09, 2015 at 02:21:03PM +0100, Jonathan Cameron wrote: >> On 06/04/15 08:24, Daniel Baluta wrote: >>> 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> >> Applied to the togreg branch of iio.git. Initially pushed out as testing >> for the autobuilders to play with it. >> >> Thanks, >> >> Jonathan >>> >>>> --- >>>> >>>> I used the hrtimer-based trigger patches that Daniel sent earlier this week to >>>> test these changes. >> Feel free to add a tested-by to that patch then if you haven't already! > > I'm reluctant to do that since Daniel has posted a v3 for the hrtimer > patchset and I've been using the v2 ones. Sure, the core functionality > is the same, but the userspace interface differs. fair enough! > >>>> >>>> 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;Reviewed-by: Daniel Baluta <daniel.baluta@xxxxxxxxx> >>>> } >>>> + } >>>> >>>> - 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 >>> >> -- 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