iio: trigger: allow immutable triggers to be assigned
PATCH 1/1 iio: trigger: allow immutable triggers to be assigned
There are times when a trigger consumer shouldn't be allowed to change triggers after intialization.
This is useful with use of callback buffers pushing ADC data back to the trigger providers iio device.
Signed-off-by Matt Ranostay <[email protected]>
--- drivers/iio/industrialio-trigger.c | 20 ++++++++++++++++++++ include/linux/iio/iio.h | 2 ++ include/linux/iio/trigger.h | 9 +++++++++ 3 files changed, 31 insertions(+)
drivers/iio/industrialio-trigger.c +20 -0
@@ -119,6 +119,22 @@ void iio_trigger_unregister(struct iio_trigger *trig_info) }EXPORT_SYMBOL (iio_trigger_unregister); +int iio_trigger_set_immutable (struct iio_dev *dst,struct iio_trigger *trig) +{ +if (!dst || !trig) +return -EINVAL ; + +mutex_lock (&dst->mlock); +WARN_ON (!!dst->trig_readonly); + + dst->trig =iio_trigger_get (trig); + dst->trig_readonly =1 ; +mutex_unlock (&dst->mlock); + +return 0 ; +} +EXPORT_SYMBOL (iio_trigger_set_immutable); +/* Search for trigger by name, assuming iio_trigger_list_lock held */ static struct iio_trigger *__iio_trigger_find_by_name (const char *name) {
@@ -384,6 +400,10 @@ static ssize_t iio_trigger_write_current(struct device *dev,mutex_unlock (&indio_dev->mlock);return -EBUSY ; } +if (indio_dev->trig_readonly) { +mutex_unlock (&indio_dev->mlock); +return -EPERM ; + }mutex_unlock (&indio_dev->mlock); trig =iio_trigger_find_by_name (buf, len);
include/linux/iio/iio.h +2 -0
@@ -483,6 +483,7 @@ struct iio_buffer_setup_ops {* @scan_timestamp: [INTERN] set if any buffers have requested timestamp * @scan_index_timestamp:[INTERN] cache of the index to the timestamp * @trig: [INTERN] current device trigger (buffer modes) +* @trig_readonly [INTERN] mark the current trigger immutable * @pollfunc: [DRIVER] function run on trigger being received * @pollfunc_event: [DRIVER] function run on events trigger being received * @channels: [DRIVER] channel specification structure table
@@ -523,6 +524,7 @@ struct iio_dev {bool scan_timestamp;unsigned scan_index_timestamp;struct iio_trigger *trig; +int trig_readonly;struct iio_poll_func *pollfunc;struct iio_poll_func *pollfunc_event;
include/linux/iio/trigger.h +9 -0
@@ -132,6 +132,15 @@ int iio_trigger_register(struct iio_trigger *trig_info);void iio_trigger_unregister (struct iio_trigger *trig_info);/** +* iio_trigger_set_immutable() - set an immutable trigger on destination +* +* @dst - destination device for trigger +* @trig - trigger to assign to destination +* +**/ +int iio_trigger_set_immutable (struct iio_dev *dst,struct iio_trigger *trig); + +/** * iio_trigger_poll() - called on a trigger occurring * @trig: trigger which occurred *
Signature · 1 line
2.7.4