diff options
Diffstat (limited to 'drivers/staging/iio/accel/lis3l02dq_ring.c')
-rw-r--r-- | drivers/staging/iio/accel/lis3l02dq_ring.c | 124 |
1 files changed, 60 insertions, 64 deletions
diff --git a/drivers/staging/iio/accel/lis3l02dq_ring.c b/drivers/staging/iio/accel/lis3l02dq_ring.c index 8d5c8ac7db5..5c542dd0461 100644 --- a/drivers/staging/iio/accel/lis3l02dq_ring.c +++ b/drivers/staging/iio/accel/lis3l02dq_ring.c @@ -1,19 +1,15 @@ #include <linux/interrupt.h> -#include <linux/irq.h> #include <linux/gpio.h> #include <linux/mutex.h> -#include <linux/device.h> #include <linux/kernel.h> #include <linux/spi/spi.h> -#include <linux/sysfs.h> #include <linux/slab.h> #include "../iio.h" -#include "../sysfs.h" #include "../ring_sw.h" #include "../kfifo_buf.h" -#include "accel.h" #include "../trigger.h" +#include "../trigger_consumer.h" #include "lis3l02dq.h" /** @@ -42,31 +38,32 @@ irqreturn_t lis3l02dq_data_rdy_trig_poll(int irq, void *private) } /** - * lis3l02dq_read_accel_from_ring() individual acceleration read from ring + * lis3l02dq_read_accel_from_buffer() individual acceleration read from buffer **/ -ssize_t lis3l02dq_read_accel_from_ring(struct iio_ring_buffer *ring, - int index, - int *val) +ssize_t lis3l02dq_read_accel_from_buffer(struct iio_buffer *buffer, + int index, + int *val) { int ret; s16 *data; - if (!iio_scan_mask_query(ring, index)) + if (!iio_scan_mask_query(buffer, index)) return -EINVAL; - if (!ring->access->read_last) + if (!buffer->access->read_last) return -EBUSY; - data = kmalloc(ring->access->get_bytes_per_datum(ring), + data = kmalloc(buffer->access->get_bytes_per_datum(buffer), GFP_KERNEL); if (data == NULL) return -ENOMEM; - ret = ring->access->read_last(ring, (u8 *)data); + ret = buffer->access->read_last(buffer, (u8 *)data); if (ret) goto error_free_data; - *val = data[bitmap_weight(&ring->scan_mask, index)]; + *val = data[bitmap_weight(buffer->scan_mask, index)]; error_free_data: + kfree(data); return ret; @@ -89,13 +86,13 @@ static const u8 read_all_tx_array[] = { **/ static int lis3l02dq_read_all(struct iio_dev *indio_dev, u8 *rx_array) { - struct iio_ring_buffer *ring = indio_dev->ring; + 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 = kzalloc((ring->scan_count) * 2 + xfers = kzalloc((buffer->scan_count) * 2 * sizeof(*xfers), GFP_KERNEL); if (!xfers) return -ENOMEM; @@ -103,7 +100,7 @@ static int lis3l02dq_read_all(struct iio_dev *indio_dev, u8 *rx_array) mutex_lock(&st->buf_lock); for (i = 0; i < ARRAY_SIZE(read_all_tx_array)/4; i++) - if (ring->scan_mask & (1 << i)) { + if (test_bit(i, buffer->scan_mask)) { /* lower byte */ xfers[j].tx_buf = st->tx + 2*j; st->tx[2*j] = read_all_tx_array[i*4]; @@ -131,7 +128,7 @@ 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 < ring->scan_count * 2; j++) + for (j = 0; j < buffer->scan_count * 2; j++) spi_message_add_tail(&xfers[j], &msg); ret = spi_sync(st->us, &msg); @@ -141,20 +138,20 @@ static int lis3l02dq_read_all(struct iio_dev *indio_dev, u8 *rx_array) return ret; } -static int lis3l02dq_get_ring_element(struct iio_dev *indio_dev, +static int lis3l02dq_get_buffer_element(struct iio_dev *indio_dev, u8 *buf) { int ret, i; u8 *rx_array ; s16 *data = (s16 *)buf; - rx_array = kzalloc(4 * (indio_dev->ring->scan_count), GFP_KERNEL); + rx_array = kzalloc(4 * (indio_dev->buffer->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->ring->scan_count; i++) + for (i = 0; i < indio_dev->buffer->scan_count; i++) data[i] = combine_8_to_16(rx_array[i*4+1], rx_array[i*4+3]); kfree(rx_array); @@ -165,27 +162,27 @@ static int lis3l02dq_get_ring_element(struct iio_dev *indio_dev, static irqreturn_t lis3l02dq_trigger_handler(int irq, void *p) { struct iio_poll_func *pf = p; - struct iio_dev *indio_dev = pf->private_data; - struct iio_ring_buffer *ring = indio_dev->ring; + struct iio_dev *indio_dev = pf->indio_dev; + struct iio_buffer *buffer = indio_dev->buffer; int len = 0; - size_t datasize = ring->access->get_bytes_per_datum(ring); + size_t datasize = buffer->access->get_bytes_per_datum(buffer); char *data = kmalloc(datasize, GFP_KERNEL); if (data == NULL) { dev_err(indio_dev->dev.parent, - "memory alloc failed in ring bh"); + "memory alloc failed in buffer bh"); return -ENOMEM; } - if (ring->scan_count) - len = lis3l02dq_get_ring_element(indio_dev, data); + if (buffer->scan_count) + len = lis3l02dq_get_buffer_element(indio_dev, data); /* Guaranteed to be aligned with 8 byte boundary */ - if (ring->scan_timestamp) + if (buffer->scan_timestamp) *(s64 *)(((phys_addr_t)data + len + sizeof(s64) - 1) & ~(sizeof(s64) - 1)) = pf->timestamp; - ring->access->store_to(ring, (u8 *)data, pf->timestamp); + buffer->access->store_to(buffer, (u8 *)data, pf->timestamp); iio_trigger_notify_done(indio_dev->trig); kfree(data); @@ -258,7 +255,7 @@ error_ret: * * If disabling the interrupt also does a final read to ensure it is clear. * This is only important in some cases where the scan enable elements are - * switched before the ring is reenabled. + * switched before the buffer is reenabled. **/ static int lis3l02dq_data_rdy_trigger_set_state(struct iio_trigger *trig, bool state) @@ -306,6 +303,12 @@ static int lis3l02dq_trig_try_reen(struct iio_trigger *trig) return 0; } +static const struct iio_trigger_ops lis3l02dq_trigger_ops = { + .owner = THIS_MODULE, + .set_trigger_state = &lis3l02dq_data_rdy_trigger_set_state, + .try_reenable = &lis3l02dq_trig_try_reen, +}; + int lis3l02dq_probe_trigger(struct iio_dev *indio_dev) { int ret; @@ -318,10 +321,8 @@ int lis3l02dq_probe_trigger(struct iio_dev *indio_dev) } st->trig->dev.parent = &st->us->dev; - st->trig->owner = THIS_MODULE; + st->trig->ops = &lis3l02dq_trigger_ops; st->trig->private_data = indio_dev; - st->trig->set_trigger_state = &lis3l02dq_data_rdy_trigger_set_state; - st->trig->try_reenable = &lis3l02dq_trig_try_reen; ret = iio_trigger_register(st->trig); if (ret) goto error_free_trig; @@ -342,13 +343,13 @@ void lis3l02dq_remove_trigger(struct iio_dev *indio_dev) iio_free_trigger(st->trig); } -void lis3l02dq_unconfigure_ring(struct iio_dev *indio_dev) +void lis3l02dq_unconfigure_buffer(struct iio_dev *indio_dev) { iio_dealloc_pollfunc(indio_dev->pollfunc); - lis3l02dq_free_buf(indio_dev->ring); + lis3l02dq_free_buf(indio_dev->buffer); } -static int lis3l02dq_ring_postenable(struct iio_dev *indio_dev) +static int lis3l02dq_buffer_postenable(struct iio_dev *indio_dev) { /* Disable unwanted channels otherwise the interrupt will not clear */ u8 t; @@ -361,17 +362,17 @@ static int lis3l02dq_ring_postenable(struct iio_dev *indio_dev) if (ret) goto error_ret; - if (iio_scan_mask_query(indio_dev->ring, 0)) { + if (iio_scan_mask_query(indio_dev->buffer, 0)) { 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->ring, 1)) { + if (iio_scan_mask_query(indio_dev->buffer, 1)) { 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->ring, 2)) { + if (iio_scan_mask_query(indio_dev->buffer, 2)) { t |= LIS3L02DQ_REG_CTRL_1_AXES_Z_ENABLE; oneenabled = true; } else @@ -385,18 +386,18 @@ static int lis3l02dq_ring_postenable(struct iio_dev *indio_dev) if (ret) goto error_ret; - return iio_triggered_ring_postenable(indio_dev); + return iio_triggered_buffer_postenable(indio_dev); error_ret: return ret; } /* Turn all channels on again */ -static int lis3l02dq_ring_predisable(struct iio_dev *indio_dev) +static int lis3l02dq_buffer_predisable(struct iio_dev *indio_dev) { u8 t; int ret; - ret = iio_triggered_ring_predisable(indio_dev); + ret = iio_triggered_buffer_predisable(indio_dev); if (ret) goto error_ret; @@ -417,34 +418,29 @@ error_ret: return ret; } -static const struct iio_ring_setup_ops lis3l02dq_ring_setup_ops = { - .preenable = &iio_sw_ring_preenable, - .postenable = &lis3l02dq_ring_postenable, - .predisable = &lis3l02dq_ring_predisable, +static const struct iio_buffer_setup_ops lis3l02dq_buffer_setup_ops = { + .preenable = &iio_sw_buffer_preenable, + .postenable = &lis3l02dq_buffer_postenable, + .predisable = &lis3l02dq_buffer_predisable, }; -int lis3l02dq_configure_ring(struct iio_dev *indio_dev) +int lis3l02dq_configure_buffer(struct iio_dev *indio_dev) { int ret; - struct iio_ring_buffer *ring; + struct iio_buffer *buffer; - ring = lis3l02dq_alloc_buf(indio_dev); - if (!ring) + buffer = lis3l02dq_alloc_buf(indio_dev); + if (!buffer) return -ENOMEM; - indio_dev->ring = ring; - /* Effectively select the ring buffer implementation */ - indio_dev->ring->access = &lis3l02dq_access_funcs; - ring->bpe = 2; - - ring->scan_timestamp = true; - ring->setup_ops = &lis3l02dq_ring_setup_ops; - ring->owner = THIS_MODULE; + indio_dev->buffer = buffer; + /* Effectively select the buffer implementation */ + indio_dev->buffer->access = &lis3l02dq_access_funcs; + buffer->bpe = 2; - /* Set default scan mode */ - iio_scan_mask_set(ring, 0); - iio_scan_mask_set(ring, 1); - iio_scan_mask_set(ring, 2); + buffer->scan_timestamp = true; + buffer->setup_ops = &lis3l02dq_buffer_setup_ops; + buffer->owner = THIS_MODULE; /* Functions are NULL as we set handler below */ indio_dev->pollfunc = iio_alloc_pollfunc(&iio_pollfunc_store_time, @@ -459,10 +455,10 @@ int lis3l02dq_configure_ring(struct iio_dev *indio_dev) goto error_iio_sw_rb_free; } - indio_dev->modes |= INDIO_RING_TRIGGERED; + indio_dev->modes |= INDIO_BUFFER_TRIGGERED; return 0; error_iio_sw_rb_free: - lis3l02dq_free_buf(indio_dev->ring); + lis3l02dq_free_buf(indio_dev->buffer); return ret; } |