diff options
Diffstat (limited to 'drivers/staging/iio/industrialio-trigger.c')
-rw-r--r-- | drivers/staging/iio/industrialio-trigger.c | 51 |
1 files changed, 39 insertions, 12 deletions
diff --git a/drivers/staging/iio/industrialio-trigger.c b/drivers/staging/iio/industrialio-trigger.c index 5682e61600f6..57dd9232cf0d 100644 --- a/drivers/staging/iio/industrialio-trigger.c +++ b/drivers/staging/iio/industrialio-trigger.c @@ -31,7 +31,6 @@ * Any other suggestions? */ - static DEFINE_IDR(iio_trigger_idr); static DEFINE_SPINLOCK(iio_trigger_idr_lock); @@ -173,7 +172,7 @@ struct iio_trigger *iio_trigger_find_by_name(const char *name, size_t len) } EXPORT_SYMBOL(iio_trigger_find_by_name); -void iio_trigger_poll(struct iio_trigger *trig) +void iio_trigger_poll(struct iio_trigger *trig, s64 time) { struct iio_poll_func *pf_cursor; @@ -185,7 +184,8 @@ void iio_trigger_poll(struct iio_trigger *trig) } list_for_each_entry(pf_cursor, &trig->pollfunc_list, list) { if (pf_cursor->poll_func_main) { - pf_cursor->poll_func_main(pf_cursor->private_data); + pf_cursor->poll_func_main(pf_cursor->private_data, + time); trig->use_count++; } } @@ -198,8 +198,7 @@ void iio_trigger_notify_done(struct iio_trigger *trig) if (trig->use_count == 0 && trig->try_reenable) if (trig->try_reenable(trig)) { /* Missed and interrupt so launch new poll now */ - trig->timestamp = 0; - iio_trigger_poll(trig); + iio_trigger_poll(trig, 0); } } EXPORT_SYMBOL(iio_trigger_notify_done); @@ -284,7 +283,7 @@ error_ret: EXPORT_SYMBOL(iio_trigger_dettach_poll_func); /** - * iio_trigger_read_currrent() trigger consumer sysfs query which trigger + * iio_trigger_read_currrent() - trigger consumer sysfs query which trigger * * For trigger consumers the current_trigger interface allows the trigger * used by the device to be queried. @@ -296,10 +295,9 @@ static ssize_t iio_trigger_read_current(struct device *dev, struct iio_dev *dev_info = dev_get_drvdata(dev); int len = 0; if (dev_info->trig) - len = snprintf(buf, - IIO_TRIGGER_NAME_LENGTH, - "%s\n", - dev_info->trig->name); + len = sprintf(buf, + "%s\n", + dev_info->trig->name); return len; } @@ -324,8 +322,6 @@ static ssize_t iio_trigger_write_current(struct device *dev, } mutex_unlock(&dev_info->mlock); - len = len < IIO_TRIGGER_NAME_LENGTH ? len : IIO_TRIGGER_NAME_LENGTH; - dev_info->trig = iio_trigger_find_by_name(buf, len); if (oldtrig && dev_info->trig != oldtrig) iio_put_trigger(oldtrig); @@ -402,3 +398,34 @@ int iio_device_unregister_trigger_consumer(struct iio_dev *dev_info) } EXPORT_SYMBOL(iio_device_unregister_trigger_consumer); +int iio_alloc_pollfunc(struct iio_dev *indio_dev, + void (*immediate)(struct iio_dev *indio_dev), + void (*main)(struct iio_dev *private_data, s64 time)) +{ + indio_dev->pollfunc = kzalloc(sizeof(*indio_dev->pollfunc), GFP_KERNEL); + if (indio_dev->pollfunc == NULL) + return -ENOMEM; + indio_dev->pollfunc->poll_func_immediate = immediate; + indio_dev->pollfunc->poll_func_main = main; + indio_dev->pollfunc->private_data = indio_dev; + return 0; +} +EXPORT_SYMBOL(iio_alloc_pollfunc); + +int iio_triggered_ring_postenable(struct iio_dev *indio_dev) +{ + return indio_dev->trig + ? iio_trigger_attach_poll_func(indio_dev->trig, + indio_dev->pollfunc) + : 0; +} +EXPORT_SYMBOL(iio_triggered_ring_postenable); + +int iio_triggered_ring_predisable(struct iio_dev *indio_dev) +{ + return indio_dev->trig + ? iio_trigger_dettach_poll_func(indio_dev->trig, + indio_dev->pollfunc) + : 0; +} +EXPORT_SYMBOL(iio_triggered_ring_predisable); |