Merge tag 'regmap-v3.16' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie...
[cascardo/linux.git] / drivers / iio / industrialio-buffer.c
index e108f2a..36b1ae9 100644 (file)
@@ -150,7 +150,16 @@ static ssize_t iio_show_fixed_type(struct device *dev,
                type = IIO_BE;
 #endif
        }
-       return sprintf(buf, "%s:%c%d/%d>>%u\n",
+       if (this_attr->c->scan_type.repeat > 1)
+               return sprintf(buf, "%s:%c%d/%dX%d>>%u\n",
+                      iio_endian_prefix[type],
+                      this_attr->c->scan_type.sign,
+                      this_attr->c->scan_type.realbits,
+                      this_attr->c->scan_type.storagebits,
+                      this_attr->c->scan_type.repeat,
+                      this_attr->c->scan_type.shift);
+               else
+                       return sprintf(buf, "%s:%c%d/%d>>%u\n",
                       iio_endian_prefix[type],
                       this_attr->c->scan_type.sign,
                       this_attr->c->scan_type.realbits,
@@ -165,7 +174,8 @@ static ssize_t iio_scan_el_show(struct device *dev,
        int ret;
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
 
-       ret = test_bit(to_iio_dev_attr(attr)->address,
+       /* Ensure ret is 0 or 1. */
+       ret = !!test_bit(to_iio_dev_attr(attr)->address,
                       indio_dev->buffer->scan_mask);
 
        return sprintf(buf, "%d\n", ret);
@@ -474,14 +484,22 @@ static int iio_compute_scan_bytes(struct iio_dev *indio_dev,
        for_each_set_bit(i, mask,
                         indio_dev->masklength) {
                ch = iio_find_channel_from_si(indio_dev, i);
-               length = ch->scan_type.storagebits / 8;
+               if (ch->scan_type.repeat > 1)
+                       length = ch->scan_type.storagebits / 8 *
+                               ch->scan_type.repeat;
+               else
+                       length = ch->scan_type.storagebits / 8;
                bytes = ALIGN(bytes, length);
                bytes += length;
        }
        if (timestamp) {
                ch = iio_find_channel_from_si(indio_dev,
                                              indio_dev->scan_index_timestamp);
-               length = ch->scan_type.storagebits / 8;
+               if (ch->scan_type.repeat > 1)
+                       length = ch->scan_type.storagebits / 8 *
+                               ch->scan_type.repeat;
+               else
+                       length = ch->scan_type.storagebits / 8;
                bytes = ALIGN(bytes, length);
                bytes += length;
        }
@@ -862,7 +880,8 @@ int iio_scan_mask_query(struct iio_dev *indio_dev,
        if (!buffer->scan_mask)
                return 0;
 
-       return test_bit(bit, buffer->scan_mask);
+       /* Ensure return value is 0 or 1. */
+       return !!test_bit(bit, buffer->scan_mask);
 };
 EXPORT_SYMBOL_GPL(iio_scan_mask_query);
 
@@ -957,7 +976,11 @@ static int iio_buffer_update_demux(struct iio_dev *indio_dev,
                                               indio_dev->masklength,
                                               in_ind + 1);
                        ch = iio_find_channel_from_si(indio_dev, in_ind);
-                       length = ch->scan_type.storagebits/8;
+                       if (ch->scan_type.repeat > 1)
+                               length = ch->scan_type.storagebits / 8 *
+                                       ch->scan_type.repeat;
+                       else
+                               length = ch->scan_type.storagebits / 8;
                        /* Make sure we are aligned */
                        in_loc += length;
                        if (in_loc % length)
@@ -969,7 +992,11 @@ static int iio_buffer_update_demux(struct iio_dev *indio_dev,
                        goto error_clear_mux_table;
                }
                ch = iio_find_channel_from_si(indio_dev, in_ind);
-               length = ch->scan_type.storagebits/8;
+               if (ch->scan_type.repeat > 1)
+                       length = ch->scan_type.storagebits / 8 *
+                               ch->scan_type.repeat;
+               else
+                       length = ch->scan_type.storagebits / 8;
                if (out_loc % length)
                        out_loc += length - out_loc % length;
                if (in_loc % length)
@@ -990,7 +1017,11 @@ static int iio_buffer_update_demux(struct iio_dev *indio_dev,
                }
                ch = iio_find_channel_from_si(indio_dev,
                        indio_dev->scan_index_timestamp);
-               length = ch->scan_type.storagebits/8;
+               if (ch->scan_type.repeat > 1)
+                       length = ch->scan_type.storagebits / 8 *
+                               ch->scan_type.repeat;
+               else
+                       length = ch->scan_type.storagebits / 8;
                if (out_loc % length)
                        out_loc += length - out_loc % length;
                if (in_loc % length)