|
@@ -87,20 +87,21 @@ static const u8 read_all_tx_array[] = {
|
|
|
**/
|
|
|
static int lis3l02dq_read_all(struct iio_dev *indio_dev, u8 *rx_array)
|
|
|
{
|
|
|
- struct iio_buffer *buffer = indio_dev->buffer;
|
|
|
struct lis3l02dq_state *st = iio_priv(indio_dev);
|
|
|
struct spi_transfer *xfers;
|
|
|
struct spi_message msg;
|
|
|
int ret, i, j = 0;
|
|
|
|
|
|
- xfers = kcalloc((buffer->scan_count) * 2, sizeof(*xfers), GFP_KERNEL);
|
|
|
+ xfers = kcalloc(bitmap_weight(indio_dev->active_scan_mask,
|
|
|
+ indio_dev->masklength) * 2,
|
|
|
+ sizeof(*xfers), GFP_KERNEL);
|
|
|
if (!xfers)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
mutex_lock(&st->buf_lock);
|
|
|
|
|
|
for (i = 0; i < ARRAY_SIZE(read_all_tx_array)/4; i++)
|
|
|
- if (test_bit(i, buffer->scan_mask)) {
|
|
|
+ if (test_bit(i, indio_dev->active_scan_mask)) {
|
|
|
/* lower byte */
|
|
|
xfers[j].tx_buf = st->tx + 2*j;
|
|
|
st->tx[2*j] = read_all_tx_array[i*4];
|
|
@@ -128,7 +129,8 @@ static int lis3l02dq_read_all(struct iio_dev *indio_dev, u8 *rx_array)
|
|
|
* values in alternate bytes
|
|
|
*/
|
|
|
spi_message_init(&msg);
|
|
|
- for (j = 0; j < buffer->scan_count * 2; j++)
|
|
|
+ for (j = 0; j < bitmap_weight(indio_dev->active_scan_mask,
|
|
|
+ indio_dev->masklength) * 2; j++)
|
|
|
spi_message_add_tail(&xfers[j], &msg);
|
|
|
|
|
|
ret = spi_sync(st->us, &msg);
|
|
@@ -144,14 +146,16 @@ static int lis3l02dq_get_buffer_element(struct iio_dev *indio_dev,
|
|
|
int ret, i;
|
|
|
u8 *rx_array ;
|
|
|
s16 *data = (s16 *)buf;
|
|
|
+ int scan_count = bitmap_weight(indio_dev->active_scan_mask,
|
|
|
+ indio_dev->masklength);
|
|
|
|
|
|
- rx_array = kzalloc(4 * (indio_dev->buffer->scan_count), GFP_KERNEL);
|
|
|
+ rx_array = kzalloc(4 * scan_count, GFP_KERNEL);
|
|
|
if (rx_array == NULL)
|
|
|
return -ENOMEM;
|
|
|
ret = lis3l02dq_read_all(indio_dev, rx_array);
|
|
|
if (ret < 0)
|
|
|
return ret;
|
|
|
- for (i = 0; i < indio_dev->buffer->scan_count; i++)
|
|
|
+ for (i = 0; i < scan_count; i++)
|
|
|
data[i] = combine_8_to_16(rx_array[i*4+1],
|
|
|
rx_array[i*4+3]);
|
|
|
kfree(rx_array);
|
|
@@ -174,7 +178,7 @@ static irqreturn_t lis3l02dq_trigger_handler(int irq, void *p)
|
|
|
return -ENOMEM;
|
|
|
}
|
|
|
|
|
|
- if (buffer->scan_count)
|
|
|
+ if (!bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength))
|
|
|
len = lis3l02dq_get_buffer_element(indio_dev, data);
|
|
|
|
|
|
/* Guaranteed to be aligned with 8 byte boundary */
|
|
@@ -362,17 +366,17 @@ static int lis3l02dq_buffer_postenable(struct iio_dev *indio_dev)
|
|
|
if (ret)
|
|
|
goto error_ret;
|
|
|
|
|
|
- if (iio_scan_mask_query(indio_dev->buffer, 0)) {
|
|
|
+ if (test_bit(0, indio_dev->active_scan_mask)) {
|
|
|
t |= LIS3L02DQ_REG_CTRL_1_AXES_X_ENABLE;
|
|
|
oneenabled = true;
|
|
|
} else
|
|
|
t &= ~LIS3L02DQ_REG_CTRL_1_AXES_X_ENABLE;
|
|
|
- if (iio_scan_mask_query(indio_dev->buffer, 1)) {
|
|
|
+ if (test_bit(1, indio_dev->active_scan_mask)) {
|
|
|
t |= LIS3L02DQ_REG_CTRL_1_AXES_Y_ENABLE;
|
|
|
oneenabled = true;
|
|
|
} else
|
|
|
t &= ~LIS3L02DQ_REG_CTRL_1_AXES_Y_ENABLE;
|
|
|
- if (iio_scan_mask_query(indio_dev->buffer, 2)) {
|
|
|
+ if (test_bit(2, indio_dev->active_scan_mask)) {
|
|
|
t |= LIS3L02DQ_REG_CTRL_1_AXES_Z_ENABLE;
|
|
|
oneenabled = true;
|
|
|
} else
|