mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-06 13:16:22 +00:00
iio: trigger: allow immutable triggers to be assigned
There are times when an assigned trigger to a device shouldn't ever change after intialization. Examples of this being used is when an provider device has a trigger that is assigned to an ADC, which uses it populate data into a callback buffer. Signed-off-by: Matt Ranostay <matt@ranostay.consulting> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
This commit is contained in:
parent
a5c8b11a36
commit
c8cdf70890
@ -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 *indio_dev, struct iio_trigger *trig)
|
||||
{
|
||||
if (!indio_dev || !trig)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&indio_dev->mlock);
|
||||
WARN_ON(indio_dev->trig_readonly);
|
||||
|
||||
indio_dev->trig = iio_trigger_get(trig);
|
||||
indio_dev->trig_readonly = true;
|
||||
mutex_unlock(&indio_dev->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);
|
||||
|
@ -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;
|
||||
bool trig_readonly;
|
||||
struct iio_poll_func *pollfunc;
|
||||
struct iio_poll_func *pollfunc_event;
|
||||
|
||||
|
@ -131,6 +131,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
|
||||
*
|
||||
* @indio_dev - IIO device structure containing the device
|
||||
* @trig - trigger to assign to device
|
||||
*
|
||||
**/
|
||||
int iio_trigger_set_immutable(struct iio_dev *indio_dev, struct iio_trigger *trig);
|
||||
|
||||
/**
|
||||
* iio_trigger_poll() - called on a trigger occurring
|
||||
* @trig: trigger which occurred
|
||||
|
Loading…
Reference in New Issue
Block a user