iio: trigger: allow immutable triggers to be assigned
[cascardo/linux.git] / drivers / iio / industrialio-trigger.c
index 7ad82fd..3dde81e 100644 (file)
@@ -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);