|
|
@@ -716,6 +716,110 @@ int iio_read_channel_scale(struct iio_channel *chan, int *val, int *val2)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(iio_read_channel_scale);
|
|
|
|
|
|
+static int iio_channel_read_avail(struct iio_channel *chan,
|
|
|
+ const int **vals, int *type, int *length,
|
|
|
+ enum iio_chan_info_enum info)
|
|
|
+{
|
|
|
+ if (!iio_channel_has_available(chan->channel, info))
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ return chan->indio_dev->info->read_avail(chan->indio_dev, chan->channel,
|
|
|
+ vals, type, length, info);
|
|
|
+}
|
|
|
+
|
|
|
+int iio_read_avail_channel_raw(struct iio_channel *chan,
|
|
|
+ const int **vals, int *length)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+ int type;
|
|
|
+
|
|
|
+ mutex_lock(&chan->indio_dev->info_exist_lock);
|
|
|
+ if (!chan->indio_dev->info) {
|
|
|
+ ret = -ENODEV;
|
|
|
+ goto err_unlock;
|
|
|
+ }
|
|
|
+
|
|
|
+ ret = iio_channel_read_avail(chan,
|
|
|
+ vals, &type, length, IIO_CHAN_INFO_RAW);
|
|
|
+err_unlock:
|
|
|
+ mutex_unlock(&chan->indio_dev->info_exist_lock);
|
|
|
+
|
|
|
+ if (ret >= 0 && type != IIO_VAL_INT) {
|
|
|
+ /* raw values are assumed to be IIO_VAL_INT */
|
|
|
+ ret = -EINVAL;
|
|
|
+ goto err_unlock;
|
|
|
+ }
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(iio_read_avail_channel_raw);
|
|
|
+
|
|
|
+static int iio_channel_read_max(struct iio_channel *chan,
|
|
|
+ int *val, int *val2, int *type,
|
|
|
+ enum iio_chan_info_enum info)
|
|
|
+{
|
|
|
+ int unused;
|
|
|
+ const int *vals;
|
|
|
+ int length;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ if (!val2)
|
|
|
+ val2 = &unused;
|
|
|
+
|
|
|
+ ret = iio_channel_read_avail(chan, &vals, type, &length, info);
|
|
|
+ switch (ret) {
|
|
|
+ case IIO_AVAIL_RANGE:
|
|
|
+ switch (*type) {
|
|
|
+ case IIO_VAL_INT:
|
|
|
+ *val = vals[2];
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ *val = vals[4];
|
|
|
+ *val2 = vals[5];
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ case IIO_AVAIL_LIST:
|
|
|
+ if (length <= 0)
|
|
|
+ return -EINVAL;
|
|
|
+ switch (*type) {
|
|
|
+ case IIO_VAL_INT:
|
|
|
+ *val = vals[--length];
|
|
|
+ while (length) {
|
|
|
+ if (vals[--length] > *val)
|
|
|
+ *val = vals[length];
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ /* FIXME: learn about max for other iio values */
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ default:
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+int iio_read_max_channel_raw(struct iio_channel *chan, int *val)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+ int type;
|
|
|
+
|
|
|
+ mutex_lock(&chan->indio_dev->info_exist_lock);
|
|
|
+ if (!chan->indio_dev->info) {
|
|
|
+ ret = -ENODEV;
|
|
|
+ goto err_unlock;
|
|
|
+ }
|
|
|
+
|
|
|
+ ret = iio_channel_read_max(chan, val, NULL, &type, IIO_CHAN_INFO_RAW);
|
|
|
+err_unlock:
|
|
|
+ mutex_unlock(&chan->indio_dev->info_exist_lock);
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(iio_read_max_channel_raw);
|
|
|
+
|
|
|
int iio_get_channel_type(struct iio_channel *chan, enum iio_chan_type *type)
|
|
|
{
|
|
|
int ret = 0;
|