|
@@ -24,67 +24,30 @@
|
|
|
|
|
|
int st_sensors_get_buffer_element(struct iio_dev *indio_dev, u8 *buf)
|
|
int st_sensors_get_buffer_element(struct iio_dev *indio_dev, u8 *buf)
|
|
{
|
|
{
|
|
- u8 addr[3]; /* no ST sensor has more than 3 channels */
|
|
|
|
- int i, n = 0, len;
|
|
|
|
|
|
+ int i, len;
|
|
|
|
+ int total = 0;
|
|
struct st_sensor_data *sdata = iio_priv(indio_dev);
|
|
struct st_sensor_data *sdata = iio_priv(indio_dev);
|
|
unsigned int num_data_channels = sdata->num_data_channels;
|
|
unsigned int num_data_channels = sdata->num_data_channels;
|
|
- unsigned int byte_for_channel =
|
|
|
|
- indio_dev->channels[0].scan_type.storagebits >> 3;
|
|
|
|
|
|
|
|
for (i = 0; i < num_data_channels; i++) {
|
|
for (i = 0; i < num_data_channels; i++) {
|
|
|
|
+ unsigned int bytes_to_read;
|
|
|
|
+
|
|
if (test_bit(i, indio_dev->active_scan_mask)) {
|
|
if (test_bit(i, indio_dev->active_scan_mask)) {
|
|
- addr[n] = indio_dev->channels[i].address;
|
|
|
|
- n++;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- switch (n) {
|
|
|
|
- case 1:
|
|
|
|
- len = sdata->tf->read_multiple_byte(&sdata->tb, sdata->dev,
|
|
|
|
- addr[0], byte_for_channel, buf, sdata->multiread_bit);
|
|
|
|
- break;
|
|
|
|
- case 2:
|
|
|
|
- if ((addr[1] - addr[0]) == byte_for_channel) {
|
|
|
|
|
|
+ bytes_to_read = indio_dev->channels[i].scan_type.storagebits >> 3;
|
|
len = sdata->tf->read_multiple_byte(&sdata->tb,
|
|
len = sdata->tf->read_multiple_byte(&sdata->tb,
|
|
- sdata->dev, addr[0], byte_for_channel * n,
|
|
|
|
- buf, sdata->multiread_bit);
|
|
|
|
- } else {
|
|
|
|
- u8 *rx_array;
|
|
|
|
- rx_array = kmalloc(byte_for_channel * num_data_channels,
|
|
|
|
- GFP_KERNEL);
|
|
|
|
- if (!rx_array)
|
|
|
|
- return -ENOMEM;
|
|
|
|
|
|
+ sdata->dev, indio_dev->channels[i].address,
|
|
|
|
+ bytes_to_read,
|
|
|
|
+ buf + total, sdata->multiread_bit);
|
|
|
|
|
|
- len = sdata->tf->read_multiple_byte(&sdata->tb,
|
|
|
|
- sdata->dev, addr[0],
|
|
|
|
- byte_for_channel * num_data_channels,
|
|
|
|
- rx_array, sdata->multiread_bit);
|
|
|
|
- if (len < 0) {
|
|
|
|
- kfree(rx_array);
|
|
|
|
- return len;
|
|
|
|
- }
|
|
|
|
|
|
+ if (len < bytes_to_read)
|
|
|
|
+ return -EIO;
|
|
|
|
|
|
- for (i = 0; i < n * byte_for_channel; i++) {
|
|
|
|
- if (i < n)
|
|
|
|
- buf[i] = rx_array[i];
|
|
|
|
- else
|
|
|
|
- buf[i] = rx_array[n + i];
|
|
|
|
- }
|
|
|
|
- kfree(rx_array);
|
|
|
|
- len = byte_for_channel * n;
|
|
|
|
|
|
+ /* Advance the buffer pointer */
|
|
|
|
+ total += len;
|
|
}
|
|
}
|
|
- break;
|
|
|
|
- case 3:
|
|
|
|
- len = sdata->tf->read_multiple_byte(&sdata->tb, sdata->dev,
|
|
|
|
- addr[0], byte_for_channel * num_data_channels,
|
|
|
|
- buf, sdata->multiread_bit);
|
|
|
|
- break;
|
|
|
|
- default:
|
|
|
|
- return -EINVAL;
|
|
|
|
}
|
|
}
|
|
- if (len != byte_for_channel * n)
|
|
|
|
- return -EIO;
|
|
|
|
|
|
|
|
- return len;
|
|
|
|
|
|
+ return total;
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(st_sensors_get_buffer_element);
|
|
EXPORT_SYMBOL(st_sensors_get_buffer_element);
|
|
|
|
|