* [PATCH v2 01/13] staging:iio:ring_sw: Add helper function for initializing simple setups
@ 2011-12-12 10:42 Lars-Peter Clausen
2011-12-12 10:42 ` [PATCH v2 02/13] staging:iio:accel:adis16201: Use new ringbuffer setup helper function Lars-Peter Clausen
` (12 more replies)
0 siblings, 13 replies; 14+ messages in thread
From: Lars-Peter Clausen @ 2011-12-12 10:42 UTC (permalink / raw)
To: Jonathan Cameron
Cc: Michael Hennerich, linux-iio, device-drivers-devel, drivers,
Lars-Peter Clausen
Add a helper function for executing the common tasks which are usually involved
in setting up a simple software ringbuffer. It will allocate the buffer,
allocate the pollfunc and register the buffer.
Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
---
Changes since v1:
Added an optional setup_ops parameter to iio_sw_rb_simple_setup which allows
a driver to provide it's own setup_ops which is sometimes necessary if for
example the device needs to enter a special mode before the conversions
starts and should leave after the conversions are done. This change allows
to convert some more drivers. Infact now almost all users of the ring_sw
buffer use this helper function.
---
drivers/staging/iio/ring_sw.c | 88 +++++++++++++++++++++++++++++++++++++++++
drivers/staging/iio/ring_sw.h | 9 ++++
2 files changed, 97 insertions(+), 0 deletions(-)
diff --git a/drivers/staging/iio/ring_sw.c b/drivers/staging/iio/ring_sw.c
index 98b66a0..9b57ced 100644
--- a/drivers/staging/iio/ring_sw.c
+++ b/drivers/staging/iio/ring_sw.c
@@ -16,6 +16,7 @@
#include <linux/poll.h>
#include "ring_sw.h"
#include "trigger.h"
+#include "trigger_consumer.h"
/**
* struct iio_sw_ring_buffer - software ring buffer
@@ -402,5 +403,92 @@ const struct iio_buffer_access_funcs ring_sw_access_funcs = {
};
EXPORT_SYMBOL(ring_sw_access_funcs);
+static const struct iio_buffer_setup_ops iio_sw_rb_simple_setup_ops = {
+ .preenable = &iio_sw_buffer_preenable,
+ .postenable = &iio_triggered_buffer_postenable,
+ .predisable = &iio_triggered_buffer_predisable,
+};
+
+/**
+ * iio_sw_rb_simple_setup() - Setup simple software ringbuffer and pollfunc
+ * @indio_dev: IIO device structure
+ * @pollfunc_bh: Function which will be used as pollfunc bottom half
+ * @pollfunc_th: Function which will be used as pollfunc top half
+ * @setup_ops: Buffer setup functions to use for this device.
+ * If NULL the default setup functions for triggered
+ * buffers will be used.
+ *
+ * This function combines some common tasks which will normally be performed
+ * when setting up a simple software ringbuffer. It will allocate the ringbuffer
+ * and the pollfunc, as well as register the buffer with IIO core.
+ * Before calling this function the indio_dev structure should already be
+ * completly initzialized but not yet registered.
+ *
+ * To free the resources allocated by this function iio_sw_rb_simple_cleanup
+ * should be called.
+ */
+int iio_sw_rb_simple_setup(struct iio_dev *indio_dev,
+ irqreturn_t (*pollfunc_bh)(int irq, void *p),
+ irqreturn_t (*pollfunc_th)(int irq, void *p),
+ const struct iio_buffer_setup_ops *setup_ops)
+{
+ int ret;
+
+ indio_dev->buffer = iio_sw_rb_allocate(indio_dev);
+ if (!indio_dev->buffer) {
+ ret = -ENOMEM;
+ goto error_ret;
+ }
+
+ indio_dev->pollfunc = iio_alloc_pollfunc(pollfunc_bh,
+ pollfunc_th,
+ IRQF_ONESHOT,
+ indio_dev,
+ "%s_consumer%d",
+ indio_dev->name,
+ indio_dev->id);
+ if (indio_dev->pollfunc == NULL) {
+ ret = -ENOMEM;
+ goto error_deallocate_sw_rb;
+ }
+
+ /* Ring buffer functions - here trigger setup related */
+ if (setup_ops)
+ indio_dev->setup_ops = setup_ops;
+ else
+ indio_dev->setup_ops = &iio_sw_rb_simple_setup_ops;
+
+ /* Flag that polled ring buffering is possible */
+ indio_dev->modes |= INDIO_BUFFER_TRIGGERED;
+
+ ret = iio_buffer_register(indio_dev,
+ indio_dev->channels,
+ indio_dev->num_channels);
+ if (ret)
+ goto error_dealloc_pollfunc;
+
+ return 0;
+
+error_dealloc_pollfunc:
+ iio_dealloc_pollfunc(indio_dev->pollfunc);
+error_deallocate_sw_rb:
+ iio_sw_rb_free(indio_dev->buffer);
+error_ret:
+ return ret;
+}
+EXPORT_SYMBOL(iio_sw_rb_simple_setup);
+
+/**
+ * iio_sw_rb_simple_cleanup() - Free resources allocated by iio_sw_rb_simple_setup
+ * @indio_dev: IIO device structure
+ */
+void iio_sw_rb_simple_cleanup(struct iio_dev *indio_dev)
+{
+ iio_buffer_unregister(indio_dev);
+ iio_dealloc_pollfunc(indio_dev->pollfunc);
+ iio_sw_rb_free(indio_dev->buffer);
+}
+EXPORT_SYMBOL(iio_sw_rb_simple_cleanup);
+
MODULE_DESCRIPTION("Industrialio I/O software ring buffer");
MODULE_LICENSE("GPL");
diff --git a/drivers/staging/iio/ring_sw.h b/drivers/staging/iio/ring_sw.h
index e6a6e2c..3a61fe3 100644
--- a/drivers/staging/iio/ring_sw.h
+++ b/drivers/staging/iio/ring_sw.h
@@ -23,6 +23,8 @@
#ifndef _IIO_RING_SW_H_
#define _IIO_RING_SW_H_
+
+#include <linux/interrupt.h>
#include "buffer.h"
/**
@@ -32,4 +34,11 @@ extern const struct iio_buffer_access_funcs ring_sw_access_funcs;
struct iio_buffer *iio_sw_rb_allocate(struct iio_dev *indio_dev);
void iio_sw_rb_free(struct iio_buffer *ring);
+
+int iio_sw_rb_simple_setup(struct iio_dev *indio_dev,
+ irqreturn_t (*pollfunc_bh)(int irq, void *p),
+ irqreturn_t (*pollfunc_th)(int irq, void *p),
+ const struct iio_buffer_setup_ops *setup_ops);
+void iio_sw_rb_simple_cleanup(struct iio_dev *indio_dev);
+
#endif /* _IIO_RING_SW_H_ */
--
1.7.7.3
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v2 02/13] staging:iio:accel:adis16201: Use new ringbuffer setup helper function
2011-12-12 10:42 [PATCH v2 01/13] staging:iio:ring_sw: Add helper function for initializing simple setups Lars-Peter Clausen
@ 2011-12-12 10:42 ` Lars-Peter Clausen
2011-12-12 10:42 ` [PATCH v2 03/13] staging:iio:adc:ad7192: " Lars-Peter Clausen
` (11 subsequent siblings)
12 siblings, 0 replies; 14+ messages in thread
From: Lars-Peter Clausen @ 2011-12-12 10:42 UTC (permalink / raw)
To: Jonathan Cameron
Cc: Michael Hennerich, linux-iio, device-drivers-devel, drivers,
Lars-Peter Clausen
Use the new ringbuffer setup helper function to allocate and register buffer and
pollfunc.
Also as part of the conversion drop scan_timestamp being enabled by default,
since it is a left over of an earlier cleanup.
Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
---
drivers/staging/iio/accel/adis16201_core.c | 11 --------
drivers/staging/iio/accel/adis16201_ring.c | 39 ++-------------------------
2 files changed, 3 insertions(+), 47 deletions(-)
diff --git a/drivers/staging/iio/accel/adis16201_core.c b/drivers/staging/iio/accel/adis16201_core.c
index ed97da2..29e3c91 100644
--- a/drivers/staging/iio/accel/adis16201_core.c
+++ b/drivers/staging/iio/accel/adis16201_core.c
@@ -491,14 +491,6 @@ static int __devinit adis16201_probe(struct spi_device *spi)
if (ret)
goto error_free_dev;
- ret = iio_buffer_register(indio_dev,
- adis16201_channels,
- ARRAY_SIZE(adis16201_channels));
- if (ret) {
- printk(KERN_ERR "failed to initialize the ring\n");
- goto error_unreg_ring_funcs;
- }
-
if (spi->irq) {
ret = adis16201_probe_trigger(indio_dev);
if (ret)
@@ -518,8 +510,6 @@ static int __devinit adis16201_probe(struct spi_device *spi)
error_remove_trigger:
adis16201_remove_trigger(indio_dev);
error_uninitialize_ring:
- iio_buffer_unregister(indio_dev);
-error_unreg_ring_funcs:
adis16201_unconfigure_ring(indio_dev);
error_free_dev:
iio_free_device(indio_dev);
@@ -533,7 +523,6 @@ static int adis16201_remove(struct spi_device *spi)
iio_device_unregister(indio_dev);
adis16201_remove_trigger(indio_dev);
- iio_buffer_unregister(indio_dev);
adis16201_unconfigure_ring(indio_dev);
iio_free_device(indio_dev);
diff --git a/drivers/staging/iio/accel/adis16201_ring.c b/drivers/staging/iio/accel/adis16201_ring.c
index 97f9e6b..43da221 100644
--- a/drivers/staging/iio/accel/adis16201_ring.c
+++ b/drivers/staging/iio/accel/adis16201_ring.c
@@ -94,44 +94,11 @@ static irqreturn_t adis16201_trigger_handler(int irq, void *p)
void adis16201_unconfigure_ring(struct iio_dev *indio_dev)
{
- iio_dealloc_pollfunc(indio_dev->pollfunc);
- iio_sw_rb_free(indio_dev->buffer);
+ iio_sw_rb_simple_cleanup(indio_dev);
}
-static const struct iio_buffer_setup_ops adis16201_ring_setup_ops = {
- .preenable = &iio_sw_buffer_preenable,
- .postenable = &iio_triggered_buffer_postenable,
- .predisable = &iio_triggered_buffer_predisable,
-};
-
int adis16201_configure_ring(struct iio_dev *indio_dev)
{
- int ret = 0;
- struct iio_buffer *ring;
-
- ring = iio_sw_rb_allocate(indio_dev);
- if (!ring) {
- ret = -ENOMEM;
- return ret;
- }
- indio_dev->buffer = ring;
- ring->scan_timestamp = true;
- indio_dev->setup_ops = &adis16201_ring_setup_ops;
-
- indio_dev->pollfunc = iio_alloc_pollfunc(&iio_pollfunc_store_time,
- &adis16201_trigger_handler,
- IRQF_ONESHOT,
- indio_dev,
- "adis16201_consumer%d",
- indio_dev->id);
- if (indio_dev->pollfunc == NULL) {
- ret = -ENOMEM;
- goto error_iio_sw_rb_free;
- }
-
- indio_dev->modes |= INDIO_BUFFER_TRIGGERED;
- return 0;
-error_iio_sw_rb_free:
- iio_sw_rb_free(indio_dev->buffer);
- return ret;
+ return iio_sw_rb_simple_setup(indio_dev, &iio_pollfunc_store_time,
+ &adis16201_trigger_handler, NULL);
}
--
1.7.7.3
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v2 03/13] staging:iio:adc:ad7192: Use new ringbuffer setup helper function
2011-12-12 10:42 [PATCH v2 01/13] staging:iio:ring_sw: Add helper function for initializing simple setups Lars-Peter Clausen
2011-12-12 10:42 ` [PATCH v2 02/13] staging:iio:accel:adis16201: Use new ringbuffer setup helper function Lars-Peter Clausen
@ 2011-12-12 10:42 ` Lars-Peter Clausen
2011-12-12 10:42 ` [PATCH v2 04/13] staging:iio:adc:ad7298: " Lars-Peter Clausen
` (10 subsequent siblings)
12 siblings, 0 replies; 14+ messages in thread
From: Lars-Peter Clausen @ 2011-12-12 10:42 UTC (permalink / raw)
To: Jonathan Cameron
Cc: Michael Hennerich, linux-iio, device-drivers-devel, drivers,
Lars-Peter Clausen
Use the new ringbuffer setup helper function to allocate and register buffer and
pollfunc.
Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
---
drivers/staging/iio/adc/ad7192.c | 47 ++++---------------------------------
1 files changed, 5 insertions(+), 42 deletions(-)
diff --git a/drivers/staging/iio/adc/ad7192.c b/drivers/staging/iio/adc/ad7192.c
index ab0cd10..39ad143 100644
--- a/drivers/staging/iio/adc/ad7192.c
+++ b/drivers/staging/iio/adc/ad7192.c
@@ -554,41 +554,13 @@ static const struct iio_buffer_setup_ops ad7192_ring_setup_ops = {
static int ad7192_register_ring_funcs_and_init(struct iio_dev *indio_dev)
{
- int ret;
-
- indio_dev->buffer = iio_sw_rb_allocate(indio_dev);
- if (!indio_dev->buffer) {
- ret = -ENOMEM;
- goto error_ret;
- }
- indio_dev->pollfunc = iio_alloc_pollfunc(&iio_pollfunc_store_time,
- &ad7192_trigger_handler,
- IRQF_ONESHOT,
- indio_dev,
- "ad7192_consumer%d",
- indio_dev->id);
- if (indio_dev->pollfunc == NULL) {
- ret = -ENOMEM;
- goto error_deallocate_sw_rb;
- }
-
- /* Ring buffer functions - here trigger setup related */
- indio_dev->setup_ops = &ad7192_ring_setup_ops;
-
- /* Flag that polled ring buffering is possible */
- indio_dev->modes |= INDIO_BUFFER_TRIGGERED;
- return 0;
-
-error_deallocate_sw_rb:
- iio_sw_rb_free(indio_dev->buffer);
-error_ret:
- return ret;
+ return iio_sw_rb_simple_setup(indio_dev, iio_pollfunc_store_time,
+ ad7192_trigger_handler, &ad7192_ring_setup_ops);
}
static void ad7192_ring_cleanup(struct iio_dev *indio_dev)
{
- iio_dealloc_pollfunc(indio_dev->pollfunc);
- iio_sw_rb_free(indio_dev->buffer);
+ iio_sw_rb_simple_cleanup(indio_dev);
}
/**
@@ -1076,23 +1048,15 @@ static int __devinit ad7192_probe(struct spi_device *spi)
if (ret)
goto error_ring_cleanup;
- ret = iio_buffer_register(indio_dev,
- indio_dev->channels,
- indio_dev->num_channels);
- if (ret)
- goto error_remove_trigger;
-
ret = ad7192_setup(st);
if (ret)
- goto error_unreg_ring;
+ goto error_remove_trigger;
ret = iio_device_register(indio_dev);
if (ret < 0)
- goto error_unreg_ring;
+ goto error_remove_trigger;
return 0;
-error_unreg_ring:
- iio_buffer_unregister(indio_dev);
error_remove_trigger:
ad7192_remove_trigger(indio_dev);
error_ring_cleanup:
@@ -1115,7 +1079,6 @@ static int ad7192_remove(struct spi_device *spi)
struct ad7192_state *st = iio_priv(indio_dev);
iio_device_unregister(indio_dev);
- iio_buffer_unregister(indio_dev);
ad7192_remove_trigger(indio_dev);
ad7192_ring_cleanup(indio_dev);
--
1.7.7.3
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v2 04/13] staging:iio:adc:ad7298: Use new ringbuffer setup helper function
2011-12-12 10:42 [PATCH v2 01/13] staging:iio:ring_sw: Add helper function for initializing simple setups Lars-Peter Clausen
2011-12-12 10:42 ` [PATCH v2 02/13] staging:iio:accel:adis16201: Use new ringbuffer setup helper function Lars-Peter Clausen
2011-12-12 10:42 ` [PATCH v2 03/13] staging:iio:adc:ad7192: " Lars-Peter Clausen
@ 2011-12-12 10:42 ` Lars-Peter Clausen
2011-12-12 10:42 ` [PATCH v2 05/13] staging:iio:adc:ad7476: " Lars-Peter Clausen
` (9 subsequent siblings)
12 siblings, 0 replies; 14+ messages in thread
From: Lars-Peter Clausen @ 2011-12-12 10:42 UTC (permalink / raw)
To: Jonathan Cameron
Cc: Michael Hennerich, linux-iio, device-drivers-devel, drivers,
Lars-Peter Clausen
Use the new ringbuffer setup helper function to allocate and register buffer and
pollfunc.
Also as part of the conversion drop scan_timestamp being enabled by default,
since it is a left over of an earlier cleanup.
Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
---
drivers/staging/iio/adc/ad7298.h | 6 ++-
drivers/staging/iio/adc/ad7298_core.c | 11 +----
drivers/staging/iio/adc/ad7298_ring.c | 73 +++++----------------------------
3 files changed, 17 insertions(+), 73 deletions(-)
diff --git a/drivers/staging/iio/adc/ad7298.h b/drivers/staging/iio/adc/ad7298.h
index a0e5dea..18f2787 100644
--- a/drivers/staging/iio/adc/ad7298.h
+++ b/drivers/staging/iio/adc/ad7298.h
@@ -38,7 +38,6 @@ struct ad7298_platform_data {
struct ad7298_state {
struct spi_device *spi;
struct regulator *reg;
- size_t d_size;
u16 int_vref_mv;
unsigned ext_ref;
struct spi_transfer ring_xfer[10];
@@ -56,6 +55,8 @@ struct ad7298_state {
#ifdef CONFIG_IIO_BUFFER
int ad7298_register_ring_funcs_and_init(struct iio_dev *indio_dev);
void ad7298_ring_cleanup(struct iio_dev *indio_dev);
+int ad7298_update_scan_mode(struct iio_dev *indio_dev,
+ const unsigned long *active_scan_mask);
#else /* CONFIG_IIO_BUFFER */
static inline int
@@ -67,5 +68,8 @@ ad7298_register_ring_funcs_and_init(struct iio_dev *indio_dev)
static inline void ad7298_ring_cleanup(struct iio_dev *indio_dev)
{
}
+
+#define ad7298_update_scan_mode NULL
+
#endif /* CONFIG_IIO_BUFFER */
#endif /* IIO_ADC_AD7298_H_ */
diff --git a/drivers/staging/iio/adc/ad7298_core.c b/drivers/staging/iio/adc/ad7298_core.c
index a8341f2..d435a2c 100644
--- a/drivers/staging/iio/adc/ad7298_core.c
+++ b/drivers/staging/iio/adc/ad7298_core.c
@@ -160,6 +160,7 @@ static int ad7298_read_raw(struct iio_dev *indio_dev,
static const struct iio_info ad7298_info = {
.read_raw = &ad7298_read_raw,
+ .update_scan_mode = ad7298_update_scan_mode,
.driver_module = THIS_MODULE,
};
@@ -220,19 +221,12 @@ static int __devinit ad7298_probe(struct spi_device *spi)
if (ret)
goto error_disable_reg;
- ret = iio_buffer_register(indio_dev,
- &ad7298_channels[1], /* skip temp0 */
- ARRAY_SIZE(ad7298_channels) - 1);
- if (ret)
- goto error_cleanup_ring;
ret = iio_device_register(indio_dev);
if (ret)
- goto error_unregister_ring;
+ goto error_cleanup_ring;
return 0;
-error_unregister_ring:
- iio_buffer_unregister(indio_dev);
error_cleanup_ring:
ad7298_ring_cleanup(indio_dev);
error_disable_reg:
@@ -252,7 +246,6 @@ static int __devexit ad7298_remove(struct spi_device *spi)
struct ad7298_state *st = iio_priv(indio_dev);
iio_device_unregister(indio_dev);
- iio_buffer_unregister(indio_dev);
ad7298_ring_cleanup(indio_dev);
if (!IS_ERR(st->reg)) {
regulator_disable(st->reg);
diff --git a/drivers/staging/iio/adc/ad7298_ring.c b/drivers/staging/iio/adc/ad7298_ring.c
index feeb0ee..8a10473 100644
--- a/drivers/staging/iio/adc/ad7298_ring.c
+++ b/drivers/staging/iio/adc/ad7298_ring.c
@@ -19,39 +19,21 @@
#include "ad7298.h"
/**
- * ad7298_ring_preenable() setup the parameters of the ring before enabling
- *
- * The complex nature of the setting of the number of bytes per datum is due
- * to this driver currently ensuring that the timestamp is stored at an 8
- * byte boundary.
+ * ad7298_update_scan_mode() setup the spi transfer buffer for the new scan mask
**/
-static int ad7298_ring_preenable(struct iio_dev *indio_dev)
+int ad7298_update_scan_mode(struct iio_dev *indio_dev,
+ const unsigned long *active_scan_mask)
{
struct ad7298_state *st = iio_priv(indio_dev);
- struct iio_buffer *ring = indio_dev->buffer;
- size_t d_size;
int i, m;
unsigned short command;
- int scan_count = bitmap_weight(indio_dev->active_scan_mask,
+ int scan_count = bitmap_weight(active_scan_mask,
indio_dev->masklength);
- d_size = scan_count * (AD7298_STORAGE_BITS / 8);
-
- if (ring->scan_timestamp) {
- d_size += sizeof(s64);
-
- if (d_size % sizeof(s64))
- d_size += sizeof(s64) - (d_size % sizeof(s64));
- }
-
- if (ring->access->set_bytes_per_datum)
- ring->access->set_bytes_per_datum(ring, d_size);
-
- st->d_size = d_size;
command = AD7298_WRITE | st->ext_ref;
for (i = 0, m = AD7298_CH(0); i < AD7298_MAX_CHAN; i++, m >>= 1)
- if (test_bit(i, indio_dev->active_scan_mask))
+ if (test_bit(i, active_scan_mask))
command |= m;
st->tx_buf[0] = cpu_to_be16(command);
@@ -92,6 +74,7 @@ static irqreturn_t ad7298_trigger_handler(int irq, void *p)
struct iio_dev *indio_dev = pf->indio_dev;
struct ad7298_state *st = iio_priv(indio_dev);
struct iio_buffer *ring = indio_dev->buffer;
+ unsigned int bpd = buffer_get_bytes_per_datum(ring);
s64 time_ns;
__u16 buf[16];
int b_sent, i;
@@ -102,7 +85,7 @@ static irqreturn_t ad7298_trigger_handler(int irq, void *p)
if (ring->scan_timestamp) {
time_ns = iio_get_time_ns();
- memcpy((u8 *)buf + st->d_size - sizeof(s64),
+ memcpy((u8 *)buf + bpd - sizeof(s64),
&time_ns, sizeof(time_ns));
}
@@ -116,49 +99,13 @@ static irqreturn_t ad7298_trigger_handler(int irq, void *p)
return IRQ_HANDLED;
}
-static const struct iio_buffer_setup_ops ad7298_ring_setup_ops = {
- .preenable = &ad7298_ring_preenable,
- .postenable = &iio_triggered_buffer_postenable,
- .predisable = &iio_triggered_buffer_predisable,
-};
-
int ad7298_register_ring_funcs_and_init(struct iio_dev *indio_dev)
{
- int ret;
-
- indio_dev->buffer = iio_sw_rb_allocate(indio_dev);
- if (!indio_dev->buffer) {
- ret = -ENOMEM;
- goto error_ret;
- }
- indio_dev->pollfunc = iio_alloc_pollfunc(NULL,
- &ad7298_trigger_handler,
- IRQF_ONESHOT,
- indio_dev,
- "ad7298_consumer%d",
- indio_dev->id);
-
- if (indio_dev->pollfunc == NULL) {
- ret = -ENOMEM;
- goto error_deallocate_sw_rb;
- }
-
- /* Ring buffer functions - here trigger setup related */
- indio_dev->setup_ops = &ad7298_ring_setup_ops;
- indio_dev->buffer->scan_timestamp = true;
-
- /* Flag that polled ring buffering is possible */
- indio_dev->modes |= INDIO_BUFFER_TRIGGERED;
- return 0;
-
-error_deallocate_sw_rb:
- iio_sw_rb_free(indio_dev->buffer);
-error_ret:
- return ret;
+ return iio_sw_rb_simple_setup(indio_dev, NULL, &ad7298_trigger_handler,
+ NULL);
}
void ad7298_ring_cleanup(struct iio_dev *indio_dev)
{
- iio_dealloc_pollfunc(indio_dev->pollfunc);
- iio_sw_rb_free(indio_dev->buffer);
+ iio_sw_rb_simple_cleanup(indio_dev);
}
--
1.7.7.3
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v2 05/13] staging:iio:adc:ad7476: Use new ringbuffer setup helper function
2011-12-12 10:42 [PATCH v2 01/13] staging:iio:ring_sw: Add helper function for initializing simple setups Lars-Peter Clausen
` (2 preceding siblings ...)
2011-12-12 10:42 ` [PATCH v2 04/13] staging:iio:adc:ad7298: " Lars-Peter Clausen
@ 2011-12-12 10:42 ` Lars-Peter Clausen
2011-12-12 10:42 ` [PATCH v2 06/13] staging:iio:adc:ad7606: " Lars-Peter Clausen
` (8 subsequent siblings)
12 siblings, 0 replies; 14+ messages in thread
From: Lars-Peter Clausen @ 2011-12-12 10:42 UTC (permalink / raw)
To: Jonathan Cameron
Cc: Michael Hennerich, linux-iio, device-drivers-devel, drivers,
Lars-Peter Clausen
Use the new ringbuffer setup helper function to allocate and register buffer and
pollfunc.
Also as part of the conversion drop scan_timestamp being enabled by default,
since it is a left over of an earlier cleanup.
Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
---
drivers/staging/iio/adc/ad7476.h | 1 -
drivers/staging/iio/adc/ad7476_core.c | 9 ----
drivers/staging/iio/adc/ad7476_ring.c | 79 +++------------------------------
3 files changed, 6 insertions(+), 83 deletions(-)
diff --git a/drivers/staging/iio/adc/ad7476.h b/drivers/staging/iio/adc/ad7476.h
index 27f696c..b1dd931 100644
--- a/drivers/staging/iio/adc/ad7476.h
+++ b/drivers/staging/iio/adc/ad7476.h
@@ -27,7 +27,6 @@ struct ad7476_state {
struct spi_device *spi;
const struct ad7476_chip_info *chip_info;
struct regulator *reg;
- size_t d_size;
u16 int_vref_mv;
struct spi_transfer xfer;
struct spi_message msg;
diff --git a/drivers/staging/iio/adc/ad7476_core.c b/drivers/staging/iio/adc/ad7476_core.c
index be02979..15eda34 100644
--- a/drivers/staging/iio/adc/ad7476_core.c
+++ b/drivers/staging/iio/adc/ad7476_core.c
@@ -179,20 +179,12 @@ static int __devinit ad7476_probe(struct spi_device *spi)
if (ret)
goto error_disable_reg;
- ret = iio_buffer_register(indio_dev,
- st->chip_info->channel,
- ARRAY_SIZE(st->chip_info->channel));
- if (ret)
- goto error_cleanup_ring;
-
ret = iio_device_register(indio_dev);
if (ret)
goto error_ring_unregister;
return 0;
error_ring_unregister:
- iio_buffer_unregister(indio_dev);
-error_cleanup_ring:
ad7476_ring_cleanup(indio_dev);
error_disable_reg:
if (!IS_ERR(st->reg))
@@ -212,7 +204,6 @@ static int ad7476_remove(struct spi_device *spi)
struct ad7476_state *st = iio_priv(indio_dev);
iio_device_unregister(indio_dev);
- iio_buffer_unregister(indio_dev);
ad7476_ring_cleanup(indio_dev);
if (!IS_ERR(st->reg)) {
regulator_disable(st->reg);
diff --git a/drivers/staging/iio/adc/ad7476_ring.c b/drivers/staging/iio/adc/ad7476_ring.c
index 35a8576..a451102 100644
--- a/drivers/staging/iio/adc/ad7476_ring.c
+++ b/drivers/staging/iio/adc/ad7476_ring.c
@@ -20,46 +20,17 @@
#include "ad7476.h"
-/**
- * ad7476_ring_preenable() setup the parameters of the ring before enabling
- *
- * The complex nature of the setting of the nuber of bytes per datum is due
- * to this driver currently ensuring that the timestamp is stored at an 8
- * byte boundary.
- **/
-static int ad7476_ring_preenable(struct iio_dev *indio_dev)
-{
- struct ad7476_state *st = iio_priv(indio_dev);
- struct iio_buffer *ring = indio_dev->buffer;
-
- st->d_size = bitmap_weight(indio_dev->active_scan_mask,
- indio_dev->masklength) *
- st->chip_info->channel[0].scan_type.storagebits / 8;
-
- if (ring->scan_timestamp) {
- st->d_size += sizeof(s64);
-
- if (st->d_size % sizeof(s64))
- st->d_size += sizeof(s64) - (st->d_size % sizeof(s64));
- }
-
- if (indio_dev->buffer->access->set_bytes_per_datum)
- indio_dev->buffer->access->
- set_bytes_per_datum(indio_dev->buffer, st->d_size);
-
- return 0;
-}
-
static irqreturn_t ad7476_trigger_handler(int irq, void *p)
{
struct iio_poll_func *pf = p;
struct iio_dev *indio_dev = pf->indio_dev;
struct ad7476_state *st = iio_priv(indio_dev);
+ unsigned int bpd = buffer_get_bytes_per_datum(indio_dev->buffer);
s64 time_ns;
__u8 *rxbuf;
int b_sent;
- rxbuf = kzalloc(st->d_size, GFP_KERNEL);
+ rxbuf = kzalloc(bpd, GFP_KERNEL);
if (rxbuf == NULL)
return -ENOMEM;
@@ -71,7 +42,7 @@ static irqreturn_t ad7476_trigger_handler(int irq, void *p)
time_ns = iio_get_time_ns();
if (indio_dev->buffer->scan_timestamp)
- memcpy(rxbuf + st->d_size - sizeof(s64),
+ memcpy(rxbuf + bpd - sizeof(s64),
&time_ns, sizeof(time_ns));
indio_dev->buffer->access->store_to(indio_dev->buffer, rxbuf, time_ns);
@@ -82,51 +53,13 @@ done:
return IRQ_HANDLED;
}
-static const struct iio_buffer_setup_ops ad7476_ring_setup_ops = {
- .preenable = &ad7476_ring_preenable,
- .postenable = &iio_triggered_buffer_postenable,
- .predisable = &iio_triggered_buffer_predisable,
-};
-
int ad7476_register_ring_funcs_and_init(struct iio_dev *indio_dev)
{
- struct ad7476_state *st = iio_priv(indio_dev);
- int ret = 0;
-
- indio_dev->buffer = iio_sw_rb_allocate(indio_dev);
- if (!indio_dev->buffer) {
- ret = -ENOMEM;
- goto error_ret;
- }
- indio_dev->pollfunc
- = iio_alloc_pollfunc(NULL,
- &ad7476_trigger_handler,
- IRQF_ONESHOT,
- indio_dev,
- "%s_consumer%d",
- spi_get_device_id(st->spi)->name,
- indio_dev->id);
- if (indio_dev->pollfunc == NULL) {
- ret = -ENOMEM;
- goto error_deallocate_sw_rb;
- }
-
- /* Ring buffer functions - here trigger setup related */
- indio_dev->setup_ops = &ad7476_ring_setup_ops;
- indio_dev->buffer->scan_timestamp = true;
-
- /* Flag that polled ring buffering is possible */
- indio_dev->modes |= INDIO_BUFFER_TRIGGERED;
- return 0;
-
-error_deallocate_sw_rb:
- iio_sw_rb_free(indio_dev->buffer);
-error_ret:
- return ret;
+ return iio_sw_rb_simple_setup(indio_dev, NULL, &ad7476_trigger_handler,
+ NULL);
}
void ad7476_ring_cleanup(struct iio_dev *indio_dev)
{
- iio_dealloc_pollfunc(indio_dev->pollfunc);
- iio_sw_rb_free(indio_dev->buffer);
+ iio_sw_rb_simple_cleanup(indio_dev);
}
--
1.7.7.3
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v2 06/13] staging:iio:adc:ad7606: Use new ringbuffer setup helper function
2011-12-12 10:42 [PATCH v2 01/13] staging:iio:ring_sw: Add helper function for initializing simple setups Lars-Peter Clausen
` (3 preceding siblings ...)
2011-12-12 10:42 ` [PATCH v2 05/13] staging:iio:adc:ad7476: " Lars-Peter Clausen
@ 2011-12-12 10:42 ` Lars-Peter Clausen
2011-12-12 10:42 ` [PATCH v2 07/13] staging:iio:adc:ad7793: " Lars-Peter Clausen
` (7 subsequent siblings)
12 siblings, 0 replies; 14+ messages in thread
From: Lars-Peter Clausen @ 2011-12-12 10:42 UTC (permalink / raw)
To: Jonathan Cameron
Cc: Michael Hennerich, linux-iio, device-drivers-devel, drivers,
Lars-Peter Clausen
Use the new ringbuffer setup helper function to allocate and register buffer and
pollfunc.
Also as part of the conversion drop scan_timestamp being enabled by default,
since it is a left over of an earlier cleanup.
Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
---
drivers/staging/iio/adc/ad7606_core.c | 9 --------
drivers/staging/iio/adc/ad7606_ring.c | 37 ++------------------------------
2 files changed, 3 insertions(+), 43 deletions(-)
diff --git a/drivers/staging/iio/adc/ad7606_core.c b/drivers/staging/iio/adc/ad7606_core.c
index da25846..c1c7af62 100644
--- a/drivers/staging/iio/adc/ad7606_core.c
+++ b/drivers/staging/iio/adc/ad7606_core.c
@@ -508,20 +508,12 @@ struct iio_dev *ad7606_probe(struct device *dev, int irq,
if (ret)
goto error_free_irq;
- ret = iio_buffer_register(indio_dev,
- indio_dev->channels,
- indio_dev->num_channels);
- if (ret)
- goto error_cleanup_ring;
ret = iio_device_register(indio_dev);
if (ret)
goto error_unregister_ring;
return indio_dev;
error_unregister_ring:
- iio_buffer_unregister(indio_dev);
-
-error_cleanup_ring:
ad7606_ring_cleanup(indio_dev);
error_free_irq:
@@ -546,7 +538,6 @@ int ad7606_remove(struct iio_dev *indio_dev, int irq)
struct ad7606_state *st = iio_priv(indio_dev);
iio_device_unregister(indio_dev);
- iio_buffer_unregister(indio_dev);
ad7606_ring_cleanup(indio_dev);
free_irq(irq, indio_dev);
diff --git a/drivers/staging/iio/adc/ad7606_ring.c b/drivers/staging/iio/adc/ad7606_ring.c
index 1ef9fbc..aade15f 100644
--- a/drivers/staging/iio/adc/ad7606_ring.c
+++ b/drivers/staging/iio/adc/ad7606_ring.c
@@ -102,45 +102,14 @@ static const struct iio_buffer_setup_ops ad7606_ring_setup_ops = {
int ad7606_register_ring_funcs_and_init(struct iio_dev *indio_dev)
{
struct ad7606_state *st = iio_priv(indio_dev);
- int ret;
-
- indio_dev->buffer = iio_sw_rb_allocate(indio_dev);
- if (!indio_dev->buffer) {
- ret = -ENOMEM;
- goto error_ret;
- }
-
- indio_dev->pollfunc = iio_alloc_pollfunc(&ad7606_trigger_handler_th_bh,
- &ad7606_trigger_handler_th_bh,
- 0,
- indio_dev,
- "%s_consumer%d",
- indio_dev->name,
- indio_dev->id);
- if (indio_dev->pollfunc == NULL) {
- ret = -ENOMEM;
- goto error_deallocate_sw_rb;
- }
-
- /* Ring buffer functions - here trigger setup related */
-
- indio_dev->setup_ops = &ad7606_ring_setup_ops;
- indio_dev->buffer->scan_timestamp = true ;
INIT_WORK(&st->poll_work, &ad7606_poll_bh_to_ring);
- /* Flag that polled ring buffering is possible */
- indio_dev->modes |= INDIO_BUFFER_TRIGGERED;
- return 0;
-
-error_deallocate_sw_rb:
- iio_sw_rb_free(indio_dev->buffer);
-error_ret:
- return ret;
+ return iio_sw_rb_simple_setup(indio_dev, ad7606_trigger_handler_th_bh,
+ ad7606_trigger_handler_th_bh, NULL);
}
void ad7606_ring_cleanup(struct iio_dev *indio_dev)
{
- iio_dealloc_pollfunc(indio_dev->pollfunc);
- iio_sw_rb_free(indio_dev->buffer);
+ iio_sw_rb_simple_cleanup(indio_dev);
}
--
1.7.7.3
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v2 07/13] staging:iio:adc:ad7793: Use new ringbuffer setup helper function
2011-12-12 10:42 [PATCH v2 01/13] staging:iio:ring_sw: Add helper function for initializing simple setups Lars-Peter Clausen
` (4 preceding siblings ...)
2011-12-12 10:42 ` [PATCH v2 06/13] staging:iio:adc:ad7606: " Lars-Peter Clausen
@ 2011-12-12 10:42 ` Lars-Peter Clausen
2011-12-12 10:43 ` [PATCH v2 08/13] staging:iio:adc:ad7887: " Lars-Peter Clausen
` (6 subsequent siblings)
12 siblings, 0 replies; 14+ messages in thread
From: Lars-Peter Clausen @ 2011-12-12 10:42 UTC (permalink / raw)
To: Jonathan Cameron
Cc: Michael Hennerich, linux-iio, device-drivers-devel, drivers,
Lars-Peter Clausen
Use the new ringbuffer setup helper function to allocate and register buffer and
pollfunc.
Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
---
drivers/staging/iio/adc/ad7793.c | 47 ++++---------------------------------
1 files changed, 5 insertions(+), 42 deletions(-)
diff --git a/drivers/staging/iio/adc/ad7793.c b/drivers/staging/iio/adc/ad7793.c
index 637820b..583e774 100644
--- a/drivers/staging/iio/adc/ad7793.c
+++ b/drivers/staging/iio/adc/ad7793.c
@@ -420,41 +420,13 @@ static const struct iio_buffer_setup_ops ad7793_ring_setup_ops = {
static int ad7793_register_ring_funcs_and_init(struct iio_dev *indio_dev)
{
- int ret;
-
- indio_dev->buffer = iio_sw_rb_allocate(indio_dev);
- if (!indio_dev->buffer) {
- ret = -ENOMEM;
- goto error_ret;
- }
- indio_dev->pollfunc = iio_alloc_pollfunc(&iio_pollfunc_store_time,
- &ad7793_trigger_handler,
- IRQF_ONESHOT,
- indio_dev,
- "ad7793_consumer%d",
- indio_dev->id);
- if (indio_dev->pollfunc == NULL) {
- ret = -ENOMEM;
- goto error_deallocate_sw_rb;
- }
-
- /* Ring buffer functions - here trigger setup related */
- indio_dev->setup_ops = &ad7793_ring_setup_ops;
-
- /* Flag that polled ring buffering is possible */
- indio_dev->modes |= INDIO_BUFFER_TRIGGERED;
- return 0;
-
-error_deallocate_sw_rb:
- iio_sw_rb_free(indio_dev->buffer);
-error_ret:
- return ret;
+ return iio_sw_rb_simple_setup(indio_dev, &iio_pollfunc_store_time,
+ &ad7793_trigger_handler, &ad7793_ring_setup_ops);
}
static void ad7793_ring_cleanup(struct iio_dev *indio_dev)
{
- iio_dealloc_pollfunc(indio_dev->pollfunc);
- iio_sw_rb_free(indio_dev->buffer);
+ iio_sw_rb_simple_cleanup(indio_dev);
}
/**
@@ -956,24 +928,16 @@ static int __devinit ad7793_probe(struct spi_device *spi)
if (ret)
goto error_unreg_ring;
- ret = iio_buffer_register(indio_dev,
- indio_dev->channels,
- indio_dev->num_channels);
- if (ret)
- goto error_remove_trigger;
-
ret = ad7793_setup(st);
if (ret)
- goto error_uninitialize_ring;
+ goto error_remove_trigger;
ret = iio_device_register(indio_dev);
if (ret)
- goto error_uninitialize_ring;
+ goto error_remove_trigger;
return 0;
-error_uninitialize_ring:
- iio_buffer_unregister(indio_dev);
error_remove_trigger:
ad7793_remove_trigger(indio_dev);
error_unreg_ring:
@@ -996,7 +960,6 @@ static int ad7793_remove(struct spi_device *spi)
struct ad7793_state *st = iio_priv(indio_dev);
iio_device_unregister(indio_dev);
- iio_buffer_unregister(indio_dev);
ad7793_remove_trigger(indio_dev);
ad7793_ring_cleanup(indio_dev);
--
1.7.7.3
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v2 08/13] staging:iio:adc:ad7887: Use new ringbuffer setup helper function
2011-12-12 10:42 [PATCH v2 01/13] staging:iio:ring_sw: Add helper function for initializing simple setups Lars-Peter Clausen
` (5 preceding siblings ...)
2011-12-12 10:42 ` [PATCH v2 07/13] staging:iio:adc:ad7793: " Lars-Peter Clausen
@ 2011-12-12 10:43 ` Lars-Peter Clausen
2011-12-12 10:43 ` [PATCH v2 09/13] staging:iio:adc:ad799x: " Lars-Peter Clausen
` (5 subsequent siblings)
12 siblings, 0 replies; 14+ messages in thread
From: Lars-Peter Clausen @ 2011-12-12 10:43 UTC (permalink / raw)
To: Jonathan Cameron
Cc: Michael Hennerich, linux-iio, device-drivers-devel, drivers,
Lars-Peter Clausen
Use the new ringbuffer setup helper function to allocate and register buffer and
pollfunc.
Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
---
drivers/staging/iio/adc/ad7887_core.c | 9 ---------
drivers/staging/iio/adc/ad7887_ring.c | 33 +++------------------------------
2 files changed, 3 insertions(+), 39 deletions(-)
diff --git a/drivers/staging/iio/adc/ad7887_core.c b/drivers/staging/iio/adc/ad7887_core.c
index db7e91f..1eb845b 100644
--- a/drivers/staging/iio/adc/ad7887_core.c
+++ b/drivers/staging/iio/adc/ad7887_core.c
@@ -199,20 +199,12 @@ static int __devinit ad7887_probe(struct spi_device *spi)
if (ret)
goto error_disable_reg;
- ret = iio_buffer_register(indio_dev,
- indio_dev->channels,
- indio_dev->num_channels);
- if (ret)
- goto error_cleanup_ring;
-
ret = iio_device_register(indio_dev);
if (ret)
goto error_unregister_ring;
return 0;
error_unregister_ring:
- iio_buffer_unregister(indio_dev);
-error_cleanup_ring:
ad7887_ring_cleanup(indio_dev);
error_disable_reg:
if (!IS_ERR(st->reg))
@@ -231,7 +223,6 @@ static int ad7887_remove(struct spi_device *spi)
struct ad7887_state *st = iio_priv(indio_dev);
iio_device_unregister(indio_dev);
- iio_buffer_unregister(indio_dev);
ad7887_ring_cleanup(indio_dev);
if (!IS_ERR(st->reg)) {
regulator_disable(st->reg);
diff --git a/drivers/staging/iio/adc/ad7887_ring.c b/drivers/staging/iio/adc/ad7887_ring.c
index d180907..0552b3b 100644
--- a/drivers/staging/iio/adc/ad7887_ring.c
+++ b/drivers/staging/iio/adc/ad7887_ring.c
@@ -124,38 +124,11 @@ static const struct iio_buffer_setup_ops ad7887_ring_setup_ops = {
int ad7887_register_ring_funcs_and_init(struct iio_dev *indio_dev)
{
- int ret;
-
- indio_dev->buffer = iio_sw_rb_allocate(indio_dev);
- if (!indio_dev->buffer) {
- ret = -ENOMEM;
- goto error_ret;
- }
- indio_dev->pollfunc = iio_alloc_pollfunc(&iio_pollfunc_store_time,
- &ad7887_trigger_handler,
- IRQF_ONESHOT,
- indio_dev,
- "ad7887_consumer%d",
- indio_dev->id);
- if (indio_dev->pollfunc == NULL) {
- ret = -ENOMEM;
- goto error_deallocate_sw_rb;
- }
- /* Ring buffer functions - here trigger setup related */
- indio_dev->setup_ops = &ad7887_ring_setup_ops;
-
- /* Flag that polled ring buffering is possible */
- indio_dev->modes |= INDIO_BUFFER_TRIGGERED;
- return 0;
-
-error_deallocate_sw_rb:
- iio_sw_rb_free(indio_dev->buffer);
-error_ret:
- return ret;
+ return iio_sw_rb_simple_setup(indio_dev, &iio_pollfunc_store_time,
+ &ad7887_trigger_handler, &ad7887_ring_setup_ops);
}
void ad7887_ring_cleanup(struct iio_dev *indio_dev)
{
- iio_dealloc_pollfunc(indio_dev->pollfunc);
- iio_sw_rb_free(indio_dev->buffer);
+ iio_sw_rb_simple_cleanup(indio_dev);
}
--
1.7.7.3
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v2 09/13] staging:iio:adc:ad799x: Use new ringbuffer setup helper function
2011-12-12 10:42 [PATCH v2 01/13] staging:iio:ring_sw: Add helper function for initializing simple setups Lars-Peter Clausen
` (6 preceding siblings ...)
2011-12-12 10:43 ` [PATCH v2 08/13] staging:iio:adc:ad7887: " Lars-Peter Clausen
@ 2011-12-12 10:43 ` Lars-Peter Clausen
2011-12-12 10:43 ` [PATCH v2 10/13] staging:iio:adc:max1363: " Lars-Peter Clausen
` (4 subsequent siblings)
12 siblings, 0 replies; 14+ messages in thread
From: Lars-Peter Clausen @ 2011-12-12 10:43 UTC (permalink / raw)
To: Jonathan Cameron
Cc: Michael Hennerich, linux-iio, device-drivers-devel, drivers,
Lars-Peter Clausen
Use the new ringbuffer setup helper function to allocate and register buffer and
pollfunc.
Also as part of the conversion drop scan_timestamp being enabled by default,
since it is a left over of an earlier cleanup.
Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
---
drivers/staging/iio/adc/ad799x.h | 3 -
drivers/staging/iio/adc/ad799x_core.c | 25 ++++++----
drivers/staging/iio/adc/ad799x_ring.c | 84 ++------------------------------
3 files changed, 21 insertions(+), 91 deletions(-)
diff --git a/drivers/staging/iio/adc/ad799x.h b/drivers/staging/iio/adc/ad799x.h
index 356f690..3e363c4 100644
--- a/drivers/staging/iio/adc/ad799x.h
+++ b/drivers/staging/iio/adc/ad799x.h
@@ -104,7 +104,6 @@ struct ad799x_chip_info {
struct ad799x_state {
struct i2c_client *client;
const struct ad799x_chip_info *chip_info;
- size_t d_size;
struct iio_trigger *trig;
struct regulator *reg;
u16 int_vref_mv;
@@ -121,8 +120,6 @@ struct ad799x_platform_data {
u16 vref_mv;
};
-int ad7997_8_set_scan_mode(struct ad799x_state *st, unsigned mask);
-
#ifdef CONFIG_AD799X_RING_BUFFER
int ad799x_register_ring_funcs_and_init(struct iio_dev *indio_dev);
void ad799x_ring_cleanup(struct iio_dev *indio_dev);
diff --git a/drivers/staging/iio/adc/ad799x_core.c b/drivers/staging/iio/adc/ad799x_core.c
index 815e6b9..11313d8 100644
--- a/drivers/staging/iio/adc/ad799x_core.c
+++ b/drivers/staging/iio/adc/ad799x_core.c
@@ -99,10 +99,21 @@ static int ad799x_i2c_write8(struct ad799x_state *st, u8 reg, u8 data)
return ret;
}
-int ad7997_8_set_scan_mode(struct ad799x_state *st, unsigned mask)
+static int ad7997_8_update_scan_mode(struct iio_dev *indio_dev,
+ const unsigned long *scan_mask)
{
- return ad799x_i2c_write16(st, AD7998_CONF_REG,
- st->config | (mask << AD799X_CHANNEL_SHIFT));
+ struct ad799x_state *st = iio_priv(indio_dev);
+
+ switch (st->id) {
+ case ad7997:
+ case ad7998:
+ return ad799x_i2c_write16(st, AD7998_CONF_REG,
+ st->config | (*scan_mask << AD799X_CHANNEL_SHIFT));
+ default:
+ break;
+ }
+
+ return 0;
}
static int ad799x_scan_direct(struct ad799x_state *st, unsigned ch)
@@ -442,6 +453,7 @@ static const struct iio_info ad7993_4_7_8_info = {
.read_event_value = &ad799x_read_event_value,
.write_event_value = &ad799x_write_event_value,
.driver_module = THIS_MODULE,
+ .update_scan_mode = ad7997_8_update_scan_mode,
};
#define AD799X_EV_MASK (IIO_EV_BIT(IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING) | \
@@ -849,12 +861,6 @@ static int __devinit ad799x_probe(struct i2c_client *client,
if (ret)
goto error_disable_reg;
- ret = iio_buffer_register(indio_dev,
- indio_dev->channels,
- indio_dev->num_channels);
- if (ret)
- goto error_cleanup_ring;
-
if (client->irq > 0) {
ret = request_threaded_irq(client->irq,
NULL,
@@ -896,7 +902,6 @@ static __devexit int ad799x_remove(struct i2c_client *client)
if (client->irq > 0)
free_irq(client->irq, indio_dev);
- iio_buffer_unregister(indio_dev);
ad799x_ring_cleanup(indio_dev);
if (!IS_ERR(st->reg)) {
regulator_disable(st->reg);
diff --git a/drivers/staging/iio/adc/ad799x_ring.c b/drivers/staging/iio/adc/ad799x_ring.c
index 28e9a41..f19d078 100644
--- a/drivers/staging/iio/adc/ad799x_ring.c
+++ b/drivers/staging/iio/adc/ad799x_ring.c
@@ -24,43 +24,6 @@
#include "ad799x.h"
/**
- * ad799x_ring_preenable() setup the parameters of the ring before enabling
- *
- * The complex nature of the setting of the nuber of bytes per datum is due
- * to this driver currently ensuring that the timestamp is stored at an 8
- * byte boundary.
- **/
-static int ad799x_ring_preenable(struct iio_dev *indio_dev)
-{
- struct iio_buffer *ring = indio_dev->buffer;
- struct ad799x_state *st = iio_priv(indio_dev);
-
- /*
- * Need to figure out the current mode based upon the requested
- * scan mask in iio_dev
- */
-
- if (st->id == ad7997 || st->id == ad7998)
- ad7997_8_set_scan_mode(st, *indio_dev->active_scan_mask);
-
- st->d_size = bitmap_weight(indio_dev->active_scan_mask,
- indio_dev->masklength) * 2;
-
- if (ring->scan_timestamp) {
- st->d_size += sizeof(s64);
-
- if (st->d_size % sizeof(s64))
- st->d_size += sizeof(s64) - (st->d_size % sizeof(s64));
- }
-
- if (indio_dev->buffer->access->set_bytes_per_datum)
- indio_dev->buffer->access->
- set_bytes_per_datum(indio_dev->buffer, st->d_size);
-
- return 0;
-}
-
-/**
* ad799x_trigger_handler() bh of trigger launched polling to ring buffer
*
* Currently there is no option in this driver to disable the saving of
@@ -73,12 +36,13 @@ static irqreturn_t ad799x_trigger_handler(int irq, void *p)
struct iio_dev *indio_dev = pf->indio_dev;
struct ad799x_state *st = iio_priv(indio_dev);
struct iio_buffer *ring = indio_dev->buffer;
+ unsigned int bpd = buffer_get_bytes_per_datum(ring);
s64 time_ns;
__u8 *rxbuf;
int b_sent;
u8 cmd;
- rxbuf = kmalloc(st->d_size, GFP_KERNEL);
+ rxbuf = kmalloc(bpd, GFP_KERNEL);
if (rxbuf == NULL)
goto out;
@@ -112,7 +76,7 @@ static irqreturn_t ad799x_trigger_handler(int irq, void *p)
time_ns = iio_get_time_ns();
if (ring->scan_timestamp)
- memcpy(rxbuf + st->d_size - sizeof(s64),
+ memcpy(rxbuf + bpd - sizeof(s64),
&time_ns, sizeof(time_ns));
ring->access->store_to(indio_dev->buffer, rxbuf, time_ns);
@@ -126,49 +90,13 @@ out:
return IRQ_HANDLED;
}
-static const struct iio_buffer_setup_ops ad799x_buf_setup_ops = {
- .preenable = &ad799x_ring_preenable,
- .postenable = &iio_triggered_buffer_postenable,
- .predisable = &iio_triggered_buffer_predisable,
-};
-
int ad799x_register_ring_funcs_and_init(struct iio_dev *indio_dev)
{
- int ret = 0;
-
- indio_dev->buffer = iio_sw_rb_allocate(indio_dev);
- if (!indio_dev->buffer) {
- ret = -ENOMEM;
- goto error_ret;
- }
- indio_dev->pollfunc = iio_alloc_pollfunc(NULL,
- &ad799x_trigger_handler,
- IRQF_ONESHOT,
- indio_dev,
- "%s_consumer%d",
- indio_dev->name,
- indio_dev->id);
- if (indio_dev->pollfunc == NULL) {
- ret = -ENOMEM;
- goto error_deallocate_sw_rb;
- }
-
- /* Ring buffer functions - here trigger setup related */
- indio_dev->setup_ops = &ad799x_buf_setup_ops;
- indio_dev->buffer->scan_timestamp = true;
-
- /* Flag that polled ring buffering is possible */
- indio_dev->modes |= INDIO_BUFFER_TRIGGERED;
- return 0;
-
-error_deallocate_sw_rb:
- iio_sw_rb_free(indio_dev->buffer);
-error_ret:
- return ret;
+ return iio_sw_rb_simple_setup(indio_dev, NULL, &ad799x_trigger_handler,
+ NULL);
}
void ad799x_ring_cleanup(struct iio_dev *indio_dev)
{
- iio_dealloc_pollfunc(indio_dev->pollfunc);
- iio_sw_rb_free(indio_dev->buffer);
+ iio_sw_rb_simple_cleanup(indio_dev);
}
--
1.7.7.3
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v2 10/13] staging:iio:adc:max1363: Use new ringbuffer setup helper function
2011-12-12 10:42 [PATCH v2 01/13] staging:iio:ring_sw: Add helper function for initializing simple setups Lars-Peter Clausen
` (7 preceding siblings ...)
2011-12-12 10:43 ` [PATCH v2 09/13] staging:iio:adc:ad799x: " Lars-Peter Clausen
@ 2011-12-12 10:43 ` Lars-Peter Clausen
2011-12-12 10:43 ` [PATCH v2 11/13] staging:iio:gyro:adis16260: " Lars-Peter Clausen
` (3 subsequent siblings)
12 siblings, 0 replies; 14+ messages in thread
From: Lars-Peter Clausen @ 2011-12-12 10:43 UTC (permalink / raw)
To: Jonathan Cameron
Cc: Michael Hennerich, linux-iio, device-drivers-devel, drivers,
Lars-Peter Clausen
Use the new ringbuffer setup helper function to allocate and register buffer and
pollfunc.
Acked-by: Jonathan Cameron <jic23@kernel.org>
Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
---
drivers/staging/iio/adc/max1363_core.c | 9 ------
drivers/staging/iio/adc/max1363_ring.c | 43 ++-----------------------------
2 files changed, 3 insertions(+), 49 deletions(-)
diff --git a/drivers/staging/iio/adc/max1363_core.c b/drivers/staging/iio/adc/max1363_core.c
index 1ce89ef..a14329e 100644
--- a/drivers/staging/iio/adc/max1363_core.c
+++ b/drivers/staging/iio/adc/max1363_core.c
@@ -1306,12 +1306,6 @@ static int __devinit max1363_probe(struct i2c_client *client,
if (ret)
goto error_free_available_scan_masks;
- ret = iio_buffer_register(indio_dev,
- st->chip_info->channels,
- st->chip_info->num_channels);
- if (ret)
- goto error_cleanup_ring;
-
if (client->irq) {
ret = request_threaded_irq(st->client->irq,
NULL,
@@ -1332,8 +1326,6 @@ static int __devinit max1363_probe(struct i2c_client *client,
error_free_irq:
free_irq(st->client->irq, indio_dev);
error_uninit_ring:
- iio_buffer_unregister(indio_dev);
-error_cleanup_ring:
max1363_ring_cleanup(indio_dev);
error_free_available_scan_masks:
kfree(indio_dev->available_scan_masks);
@@ -1356,7 +1348,6 @@ static int max1363_remove(struct i2c_client *client)
iio_device_unregister(indio_dev);
if (client->irq)
free_irq(st->client->irq, indio_dev);
- iio_buffer_unregister(indio_dev);
max1363_ring_cleanup(indio_dev);
kfree(indio_dev->available_scan_masks);
if (!IS_ERR(reg)) {
diff --git a/drivers/staging/iio/adc/max1363_ring.c b/drivers/staging/iio/adc/max1363_ring.c
index d0a60a3..e38b923 100644
--- a/drivers/staging/iio/adc/max1363_ring.c
+++ b/drivers/staging/iio/adc/max1363_ring.c
@@ -89,50 +89,13 @@ done:
return IRQ_HANDLED;
}
-static const struct iio_buffer_setup_ops max1363_ring_setup_ops = {
- .postenable = &iio_triggered_buffer_postenable,
- .preenable = &iio_sw_buffer_preenable,
- .predisable = &iio_triggered_buffer_predisable,
-};
-
int max1363_register_ring_funcs_and_init(struct iio_dev *indio_dev)
{
- struct max1363_state *st = iio_priv(indio_dev);
- int ret = 0;
-
- indio_dev->buffer = iio_sw_rb_allocate(indio_dev);
- if (!indio_dev->buffer) {
- ret = -ENOMEM;
- goto error_ret;
- }
- indio_dev->pollfunc = iio_alloc_pollfunc(NULL,
- &max1363_trigger_handler,
- IRQF_ONESHOT,
- indio_dev,
- "%s_consumer%d",
- st->client->name,
- indio_dev->id);
- if (indio_dev->pollfunc == NULL) {
- ret = -ENOMEM;
- goto error_deallocate_sw_rb;
- }
- /* Ring buffer functions - here trigger setup related */
- indio_dev->setup_ops = &max1363_ring_setup_ops;
-
- /* Flag that polled ring buffering is possible */
- indio_dev->modes |= INDIO_BUFFER_TRIGGERED;
-
- return 0;
-
-error_deallocate_sw_rb:
- iio_sw_rb_free(indio_dev->buffer);
-error_ret:
- return ret;
+ return iio_sw_rb_simple_setup(indio_dev, NULL,
+ &max1363_trigger_handler, NULL);
}
void max1363_ring_cleanup(struct iio_dev *indio_dev)
{
- /* ensure that the trigger has been detached */
- iio_dealloc_pollfunc(indio_dev->pollfunc);
- iio_sw_rb_free(indio_dev->buffer);
+ iio_sw_rb_simple_cleanup(indio_dev);
}
--
1.7.7.3
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v2 11/13] staging:iio:gyro:adis16260: Use new ringbuffer setup helper function
2011-12-12 10:42 [PATCH v2 01/13] staging:iio:ring_sw: Add helper function for initializing simple setups Lars-Peter Clausen
` (8 preceding siblings ...)
2011-12-12 10:43 ` [PATCH v2 10/13] staging:iio:adc:max1363: " Lars-Peter Clausen
@ 2011-12-12 10:43 ` Lars-Peter Clausen
2011-12-12 10:43 ` [PATCH v2 12/13] staging:iio:imu:adis16400: " Lars-Peter Clausen
` (2 subsequent siblings)
12 siblings, 0 replies; 14+ messages in thread
From: Lars-Peter Clausen @ 2011-12-12 10:43 UTC (permalink / raw)
To: Jonathan Cameron
Cc: Michael Hennerich, linux-iio, device-drivers-devel, drivers,
Lars-Peter Clausen
Use the new ringbuffer setup helper function to allocate and register buffer and
pollfunc.
Also as part of the conversion drop scan_timestamp being enabled by default,
since it is a left over of an earlier cleanup.
Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
---
drivers/staging/iio/gyro/adis16260_core.c | 10 -------
drivers/staging/iio/gyro/adis16260_ring.c | 40 ++--------------------------
2 files changed, 3 insertions(+), 47 deletions(-)
diff --git a/drivers/staging/iio/gyro/adis16260_core.c b/drivers/staging/iio/gyro/adis16260_core.c
index 871f76b..1e77eae 100644
--- a/drivers/staging/iio/gyro/adis16260_core.c
+++ b/drivers/staging/iio/gyro/adis16260_core.c
@@ -623,13 +623,6 @@ static int __devinit adis16260_probe(struct spi_device *spi)
if (ret)
goto error_free_dev;
- ret = iio_buffer_register(indio_dev,
- indio_dev->channels,
- ARRAY_SIZE(adis16260_channels_x));
- if (ret) {
- printk(KERN_ERR "failed to initialize the ring\n");
- goto error_unreg_ring_funcs;
- }
if (indio_dev->buffer) {
/* Set default scan mode */
iio_scan_mask_set(indio_dev, indio_dev->buffer,
@@ -662,8 +655,6 @@ static int __devinit adis16260_probe(struct spi_device *spi)
error_remove_trigger:
adis16260_remove_trigger(indio_dev);
error_uninitialize_ring:
- iio_buffer_unregister(indio_dev);
-error_unreg_ring_funcs:
adis16260_unconfigure_ring(indio_dev);
error_free_dev:
iio_free_device(indio_dev);
@@ -685,7 +676,6 @@ static int adis16260_remove(struct spi_device *spi)
flush_scheduled_work();
adis16260_remove_trigger(indio_dev);
- iio_buffer_unregister(indio_dev);
adis16260_unconfigure_ring(indio_dev);
iio_free_device(indio_dev);
diff --git a/drivers/staging/iio/gyro/adis16260_ring.c b/drivers/staging/iio/gyro/adis16260_ring.c
index 711f151..68971e9 100644
--- a/drivers/staging/iio/gyro/adis16260_ring.c
+++ b/drivers/staging/iio/gyro/adis16260_ring.c
@@ -94,45 +94,11 @@ static irqreturn_t adis16260_trigger_handler(int irq, void *p)
void adis16260_unconfigure_ring(struct iio_dev *indio_dev)
{
- iio_dealloc_pollfunc(indio_dev->pollfunc);
- iio_sw_rb_free(indio_dev->buffer);
+ iio_sw_rb_simple_cleanup(indio_dev);
}
-static const struct iio_buffer_setup_ops adis16260_ring_setup_ops = {
- .preenable = &iio_sw_buffer_preenable,
- .postenable = &iio_triggered_buffer_postenable,
- .predisable = &iio_triggered_buffer_predisable,
-};
-
int adis16260_configure_ring(struct iio_dev *indio_dev)
{
- int ret = 0;
- struct iio_buffer *ring;
-
- ring = iio_sw_rb_allocate(indio_dev);
- if (!ring) {
- ret = -ENOMEM;
- return ret;
- }
- indio_dev->buffer = ring;
- ring->scan_timestamp = true;
- indio_dev->setup_ops = &adis16260_ring_setup_ops;
-
- indio_dev->pollfunc = iio_alloc_pollfunc(&iio_pollfunc_store_time,
- &adis16260_trigger_handler,
- IRQF_ONESHOT,
- indio_dev,
- "adis16260_consumer%d",
- indio_dev->id);
- if (indio_dev->pollfunc == NULL) {
- ret = -ENOMEM;
- goto error_iio_sw_rb_free;
- }
-
- indio_dev->modes |= INDIO_BUFFER_TRIGGERED;
- return 0;
-
-error_iio_sw_rb_free:
- iio_sw_rb_free(indio_dev->buffer);
- return ret;
+ return iio_sw_rb_simple_setup(indio_dev, &iio_pollfunc_store_time,
+ &adis16260_trigger_handler, NULL);
}
--
1.7.7.3
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v2 12/13] staging:iio:imu:adis16400: Use new ringbuffer setup helper function
2011-12-12 10:42 [PATCH v2 01/13] staging:iio:ring_sw: Add helper function for initializing simple setups Lars-Peter Clausen
` (9 preceding siblings ...)
2011-12-12 10:43 ` [PATCH v2 11/13] staging:iio:gyro:adis16260: " Lars-Peter Clausen
@ 2011-12-12 10:43 ` Lars-Peter Clausen
2011-12-12 10:43 ` [PATCH v2 13/13] staging:iio:meter:ade7758: " Lars-Peter Clausen
2011-12-13 14:55 ` [PATCH v2 01/13] staging:iio:ring_sw: Add helper function for initializing simple setups Lars-Peter Clausen
12 siblings, 0 replies; 14+ messages in thread
From: Lars-Peter Clausen @ 2011-12-12 10:43 UTC (permalink / raw)
To: Jonathan Cameron
Cc: Michael Hennerich, linux-iio, device-drivers-devel, drivers,
Lars-Peter Clausen
Use the new ringbuffer setup helper function to allocate and register buffer and
pollfunc.
Also as part of the conversion drop scan_timestamp being enabled by default,
since it is a left over of an earlier cleanup.
Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
---
drivers/staging/iio/imu/adis16400_core.c | 11 --------
drivers/staging/iio/imu/adis16400_ring.c | 40 ++---------------------------
2 files changed, 3 insertions(+), 48 deletions(-)
diff --git a/drivers/staging/iio/imu/adis16400_core.c b/drivers/staging/iio/imu/adis16400_core.c
index de12f9a..f90ede6 100644
--- a/drivers/staging/iio/imu/adis16400_core.c
+++ b/drivers/staging/iio/imu/adis16400_core.c
@@ -1147,14 +1147,6 @@ static int __devinit adis16400_probe(struct spi_device *spi)
if (ret)
goto error_free_dev;
- ret = iio_buffer_register(indio_dev,
- st->variant->channels,
- st->variant->num_channels);
- if (ret) {
- dev_err(&spi->dev, "failed to initialize the ring\n");
- goto error_unreg_ring_funcs;
- }
-
if (spi->irq) {
ret = adis16400_probe_trigger(indio_dev);
if (ret)
@@ -1175,8 +1167,6 @@ error_remove_trigger:
if (indio_dev->modes & INDIO_BUFFER_TRIGGERED)
adis16400_remove_trigger(indio_dev);
error_uninitialize_ring:
- iio_buffer_unregister(indio_dev);
-error_unreg_ring_funcs:
adis16400_unconfigure_ring(indio_dev);
error_free_dev:
iio_free_device(indio_dev);
@@ -1196,7 +1186,6 @@ static int adis16400_remove(struct spi_device *spi)
goto err_ret;
adis16400_remove_trigger(indio_dev);
- iio_buffer_unregister(indio_dev);
adis16400_unconfigure_ring(indio_dev);
iio_free_device(indio_dev);
diff --git a/drivers/staging/iio/imu/adis16400_ring.c b/drivers/staging/iio/imu/adis16400_ring.c
index 8daa038..2473640 100644
--- a/drivers/staging/iio/imu/adis16400_ring.c
+++ b/drivers/staging/iio/imu/adis16400_ring.c
@@ -166,45 +166,11 @@ err:
void adis16400_unconfigure_ring(struct iio_dev *indio_dev)
{
- iio_dealloc_pollfunc(indio_dev->pollfunc);
- iio_sw_rb_free(indio_dev->buffer);
+ iio_sw_rb_simple_cleanup(indio_dev);
}
-static const struct iio_buffer_setup_ops adis16400_ring_setup_ops = {
- .preenable = &iio_sw_buffer_preenable,
- .postenable = &iio_triggered_buffer_postenable,
- .predisable = &iio_triggered_buffer_predisable,
-};
-
int adis16400_configure_ring(struct iio_dev *indio_dev)
{
- int ret = 0;
- struct iio_buffer *ring;
-
- ring = iio_sw_rb_allocate(indio_dev);
- if (!ring) {
- ret = -ENOMEM;
- return ret;
- }
- indio_dev->buffer = ring;
- ring->scan_timestamp = true;
- indio_dev->setup_ops = &adis16400_ring_setup_ops;
-
- indio_dev->pollfunc = iio_alloc_pollfunc(&iio_pollfunc_store_time,
- &adis16400_trigger_handler,
- IRQF_ONESHOT,
- indio_dev,
- "%s_consumer%d",
- indio_dev->name,
- indio_dev->id);
- if (indio_dev->pollfunc == NULL) {
- ret = -ENOMEM;
- goto error_iio_sw_rb_free;
- }
-
- indio_dev->modes |= INDIO_BUFFER_TRIGGERED;
- return 0;
-error_iio_sw_rb_free:
- iio_sw_rb_free(indio_dev->buffer);
- return ret;
+ return iio_sw_rb_simple_setup(indio_dev, &iio_pollfunc_store_time,
+ &adis16400_trigger_handler, NULL);
}
--
1.7.7.3
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v2 13/13] staging:iio:meter:ade7758: Use new ringbuffer setup helper function
2011-12-12 10:42 [PATCH v2 01/13] staging:iio:ring_sw: Add helper function for initializing simple setups Lars-Peter Clausen
` (10 preceding siblings ...)
2011-12-12 10:43 ` [PATCH v2 12/13] staging:iio:imu:adis16400: " Lars-Peter Clausen
@ 2011-12-12 10:43 ` Lars-Peter Clausen
2011-12-13 14:55 ` [PATCH v2 01/13] staging:iio:ring_sw: Add helper function for initializing simple setups Lars-Peter Clausen
12 siblings, 0 replies; 14+ messages in thread
From: Lars-Peter Clausen @ 2011-12-12 10:43 UTC (permalink / raw)
To: Jonathan Cameron
Cc: Michael Hennerich, linux-iio, device-drivers-devel, drivers,
Lars-Peter Clausen
Use the new ringbuffer setup helper function to allocate and register buffer and
pollfunc.
Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
---
drivers/staging/iio/meter/ade7758.h | 8 ------
drivers/staging/iio/meter/ade7758_core.c | 11 ---------
drivers/staging/iio/meter/ade7758_ring.c | 36 ++++-------------------------
3 files changed, 5 insertions(+), 50 deletions(-)
diff --git a/drivers/staging/iio/meter/ade7758.h b/drivers/staging/iio/meter/ade7758.h
index bdd1b05..2a6c4ad 100644
--- a/drivers/staging/iio/meter/ade7758.h
+++ b/drivers/staging/iio/meter/ade7758.h
@@ -150,7 +150,6 @@ ssize_t ade7758_read_data_from_ring(struct device *dev,
int ade7758_configure_ring(struct iio_dev *indio_dev);
void ade7758_unconfigure_ring(struct iio_dev *indio_dev);
-void ade7758_uninitialize_ring(struct iio_dev *indio_dev);
int ade7758_set_irq(struct device *dev, bool enable);
int ade7758_spi_write_reg_8(struct device *dev,
@@ -175,13 +174,6 @@ static int ade7758_configure_ring(struct iio_dev *indio_dev)
static inline void ade7758_unconfigure_ring(struct iio_dev *indio_dev)
{
}
-static inline int ade7758_initialize_ring(struct iio_ring_buffer *ring)
-{
- return 0;
-}
-static inline void ade7758_uninitialize_ring(struct iio_dev *indio_dev)
-{
-}
#endif /* CONFIG_IIO_BUFFER */
#endif
diff --git a/drivers/staging/iio/meter/ade7758_core.c b/drivers/staging/iio/meter/ade7758_core.c
index 9dc881f..fd1993a 100644
--- a/drivers/staging/iio/meter/ade7758_core.c
+++ b/drivers/staging/iio/meter/ade7758_core.c
@@ -774,14 +774,6 @@ static int __devinit ade7758_probe(struct spi_device *spi)
if (ret)
goto error_free_tx;
- ret = iio_buffer_register(indio_dev,
- &ade7758_channels[0],
- ARRAY_SIZE(ade7758_channels));
- if (ret) {
- dev_err(&spi->dev, "failed to initialize the ring\n");
- goto error_unreg_ring_funcs;
- }
-
/* Get the device into a sane initial state */
ret = ade7758_initial_setup(indio_dev);
if (ret)
@@ -803,8 +795,6 @@ error_remove_trigger:
if (indio_dev->modes & INDIO_BUFFER_TRIGGERED)
ade7758_remove_trigger(indio_dev);
error_uninitialize_ring:
- ade7758_uninitialize_ring(indio_dev);
-error_unreg_ring_funcs:
ade7758_unconfigure_ring(indio_dev);
error_free_tx:
kfree(st->tx);
@@ -828,7 +818,6 @@ static int ade7758_remove(struct spi_device *spi)
goto err_ret;
ade7758_remove_trigger(indio_dev);
- ade7758_uninitialize_ring(indio_dev);
ade7758_unconfigure_ring(indio_dev);
kfree(st->tx);
kfree(st->rx);
diff --git a/drivers/staging/iio/meter/ade7758_ring.c b/drivers/staging/iio/meter/ade7758_ring.c
index c5c522b..808e6f9 100644
--- a/drivers/staging/iio/meter/ade7758_ring.c
+++ b/drivers/staging/iio/meter/ade7758_ring.c
@@ -129,35 +129,18 @@ static const struct iio_buffer_setup_ops ade7758_ring_setup_ops = {
void ade7758_unconfigure_ring(struct iio_dev *indio_dev)
{
- iio_dealloc_pollfunc(indio_dev->pollfunc);
- iio_sw_rb_free(indio_dev->buffer);
+ iio_sw_rb_simple_cleanup(indio_dev);
}
int ade7758_configure_ring(struct iio_dev *indio_dev)
{
struct ade7758_state *st = iio_priv(indio_dev);
- int ret = 0;
+ int ret;
- indio_dev->buffer = iio_sw_rb_allocate(indio_dev);
- if (!indio_dev->buffer) {
- ret = -ENOMEM;
+ ret = iio_sw_rb_simple_setup(indio_dev, &iio_pollfunc_store_time,
+ &ade7758_trigger_handler, &ade7758_ring_setup_ops);
+ if (ret)
return ret;
- }
-
- indio_dev->setup_ops = &ade7758_ring_setup_ops;
-
- indio_dev->pollfunc = iio_alloc_pollfunc(&iio_pollfunc_store_time,
- &ade7758_trigger_handler,
- 0,
- indio_dev,
- "ade7759_consumer%d",
- indio_dev->id);
- if (indio_dev->pollfunc == NULL) {
- ret = -ENOMEM;
- goto error_iio_sw_rb_free;
- }
-
- indio_dev->modes |= INDIO_BUFFER_TRIGGERED;
st->tx_buf[0] = ADE7758_READ_REG(ADE7758_RSTATUS);
st->tx_buf[1] = 0;
@@ -193,13 +176,4 @@ int ade7758_configure_ring(struct iio_dev *indio_dev)
spi_message_add_tail(&st->ring_xfer[3], &st->ring_msg);
return 0;
-
-error_iio_sw_rb_free:
- iio_sw_rb_free(indio_dev->buffer);
- return ret;
-}
-
-void ade7758_uninitialize_ring(struct iio_dev *indio_dev)
-{
- iio_buffer_unregister(indio_dev);
}
--
1.7.7.3
^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH v2 01/13] staging:iio:ring_sw: Add helper function for initializing simple setups
2011-12-12 10:42 [PATCH v2 01/13] staging:iio:ring_sw: Add helper function for initializing simple setups Lars-Peter Clausen
` (11 preceding siblings ...)
2011-12-12 10:43 ` [PATCH v2 13/13] staging:iio:meter:ade7758: " Lars-Peter Clausen
@ 2011-12-13 14:55 ` Lars-Peter Clausen
12 siblings, 0 replies; 14+ messages in thread
From: Lars-Peter Clausen @ 2011-12-13 14:55 UTC (permalink / raw)
To: Lars-Peter Clausen
Cc: Jonathan Cameron, Michael Hennerich, linux-iio,
device-drivers-devel, drivers
On 12/12/2011 11:42 AM, Lars-Peter Clausen wrote:
> Add a helper function for executing the common tasks which are usually involved
> in setting up a simple software ringbuffer. It will allocate the buffer,
> allocate the pollfunc and register the buffer.
>
> Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
>
> ---
> Changes since v1:
> Added an optional setup_ops parameter to iio_sw_rb_simple_setup which allows
> a driver to provide it's own setup_ops which is sometimes necessary if for
> example the device needs to enter a special mode before the conversions
> starts and should leave after the conversions are done. This change allows
> to convert some more drivers. Infact now almost all users of the ring_sw
> buffer use this helper function.
I've reworked this another time, so no need to review/ack this series.
I've renamed iio_sw_rb_simple_setup to iio_triggered_buffer_setup because
that's what it more or less is. I've also added another parameter to pass the
buffer allocate function, so this can also be used with the kfifo buffer
implementation. Will send out the updated patches later.
> ---
> drivers/staging/iio/ring_sw.c | 88 +++++++++++++++++++++++++++++++++++++++++
> drivers/staging/iio/ring_sw.h | 9 ++++
> 2 files changed, 97 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/staging/iio/ring_sw.c b/drivers/staging/iio/ring_sw.c
> index 98b66a0..9b57ced 100644
> --- a/drivers/staging/iio/ring_sw.c
> +++ b/drivers/staging/iio/ring_sw.c
> @@ -16,6 +16,7 @@
> #include <linux/poll.h>
> #include "ring_sw.h"
> #include "trigger.h"
> +#include "trigger_consumer.h"
>
> /**
> * struct iio_sw_ring_buffer - software ring buffer
> @@ -402,5 +403,92 @@ const struct iio_buffer_access_funcs ring_sw_access_funcs = {
> };
> EXPORT_SYMBOL(ring_sw_access_funcs);
>
> +static const struct iio_buffer_setup_ops iio_sw_rb_simple_setup_ops = {
> + .preenable = &iio_sw_buffer_preenable,
> + .postenable = &iio_triggered_buffer_postenable,
> + .predisable = &iio_triggered_buffer_predisable,
> +};
> +
> +/**
> + * iio_sw_rb_simple_setup() - Setup simple software ringbuffer and pollfunc
> + * @indio_dev: IIO device structure
> + * @pollfunc_bh: Function which will be used as pollfunc bottom half
> + * @pollfunc_th: Function which will be used as pollfunc top half
> + * @setup_ops: Buffer setup functions to use for this device.
> + * If NULL the default setup functions for triggered
> + * buffers will be used.
> + *
> + * This function combines some common tasks which will normally be performed
> + * when setting up a simple software ringbuffer. It will allocate the ringbuffer
> + * and the pollfunc, as well as register the buffer with IIO core.
> + * Before calling this function the indio_dev structure should already be
> + * completly initzialized but not yet registered.
> + *
> + * To free the resources allocated by this function iio_sw_rb_simple_cleanup
> + * should be called.
> + */
> +int iio_sw_rb_simple_setup(struct iio_dev *indio_dev,
> + irqreturn_t (*pollfunc_bh)(int irq, void *p),
> + irqreturn_t (*pollfunc_th)(int irq, void *p),
> + const struct iio_buffer_setup_ops *setup_ops)
> +{
> + int ret;
> +
> + indio_dev->buffer = iio_sw_rb_allocate(indio_dev);
> + if (!indio_dev->buffer) {
> + ret = -ENOMEM;
> + goto error_ret;
> + }
> +
> + indio_dev->pollfunc = iio_alloc_pollfunc(pollfunc_bh,
> + pollfunc_th,
> + IRQF_ONESHOT,
> + indio_dev,
> + "%s_consumer%d",
> + indio_dev->name,
> + indio_dev->id);
> + if (indio_dev->pollfunc == NULL) {
> + ret = -ENOMEM;
> + goto error_deallocate_sw_rb;
> + }
> +
> + /* Ring buffer functions - here trigger setup related */
> + if (setup_ops)
> + indio_dev->setup_ops = setup_ops;
> + else
> + indio_dev->setup_ops = &iio_sw_rb_simple_setup_ops;
> +
> + /* Flag that polled ring buffering is possible */
> + indio_dev->modes |= INDIO_BUFFER_TRIGGERED;
> +
> + ret = iio_buffer_register(indio_dev,
> + indio_dev->channels,
> + indio_dev->num_channels);
> + if (ret)
> + goto error_dealloc_pollfunc;
> +
> + return 0;
> +
> +error_dealloc_pollfunc:
> + iio_dealloc_pollfunc(indio_dev->pollfunc);
> +error_deallocate_sw_rb:
> + iio_sw_rb_free(indio_dev->buffer);
> +error_ret:
> + return ret;
> +}
> +EXPORT_SYMBOL(iio_sw_rb_simple_setup);
> +
> +/**
> + * iio_sw_rb_simple_cleanup() - Free resources allocated by iio_sw_rb_simple_setup
> + * @indio_dev: IIO device structure
> + */
> +void iio_sw_rb_simple_cleanup(struct iio_dev *indio_dev)
> +{
> + iio_buffer_unregister(indio_dev);
> + iio_dealloc_pollfunc(indio_dev->pollfunc);
> + iio_sw_rb_free(indio_dev->buffer);
> +}
> +EXPORT_SYMBOL(iio_sw_rb_simple_cleanup);
> +
> MODULE_DESCRIPTION("Industrialio I/O software ring buffer");
> MODULE_LICENSE("GPL");
> diff --git a/drivers/staging/iio/ring_sw.h b/drivers/staging/iio/ring_sw.h
> index e6a6e2c..3a61fe3 100644
> --- a/drivers/staging/iio/ring_sw.h
> +++ b/drivers/staging/iio/ring_sw.h
> @@ -23,6 +23,8 @@
>
> #ifndef _IIO_RING_SW_H_
> #define _IIO_RING_SW_H_
> +
> +#include <linux/interrupt.h>
> #include "buffer.h"
>
> /**
> @@ -32,4 +34,11 @@ extern const struct iio_buffer_access_funcs ring_sw_access_funcs;
>
> struct iio_buffer *iio_sw_rb_allocate(struct iio_dev *indio_dev);
> void iio_sw_rb_free(struct iio_buffer *ring);
> +
> +int iio_sw_rb_simple_setup(struct iio_dev *indio_dev,
> + irqreturn_t (*pollfunc_bh)(int irq, void *p),
> + irqreturn_t (*pollfunc_th)(int irq, void *p),
> + const struct iio_buffer_setup_ops *setup_ops);
> +void iio_sw_rb_simple_cleanup(struct iio_dev *indio_dev);
> +
> #endif /* _IIO_RING_SW_H_ */
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2011-12-13 14:55 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-12-12 10:42 [PATCH v2 01/13] staging:iio:ring_sw: Add helper function for initializing simple setups Lars-Peter Clausen
2011-12-12 10:42 ` [PATCH v2 02/13] staging:iio:accel:adis16201: Use new ringbuffer setup helper function Lars-Peter Clausen
2011-12-12 10:42 ` [PATCH v2 03/13] staging:iio:adc:ad7192: " Lars-Peter Clausen
2011-12-12 10:42 ` [PATCH v2 04/13] staging:iio:adc:ad7298: " Lars-Peter Clausen
2011-12-12 10:42 ` [PATCH v2 05/13] staging:iio:adc:ad7476: " Lars-Peter Clausen
2011-12-12 10:42 ` [PATCH v2 06/13] staging:iio:adc:ad7606: " Lars-Peter Clausen
2011-12-12 10:42 ` [PATCH v2 07/13] staging:iio:adc:ad7793: " Lars-Peter Clausen
2011-12-12 10:43 ` [PATCH v2 08/13] staging:iio:adc:ad7887: " Lars-Peter Clausen
2011-12-12 10:43 ` [PATCH v2 09/13] staging:iio:adc:ad799x: " Lars-Peter Clausen
2011-12-12 10:43 ` [PATCH v2 10/13] staging:iio:adc:max1363: " Lars-Peter Clausen
2011-12-12 10:43 ` [PATCH v2 11/13] staging:iio:gyro:adis16260: " Lars-Peter Clausen
2011-12-12 10:43 ` [PATCH v2 12/13] staging:iio:imu:adis16400: " Lars-Peter Clausen
2011-12-12 10:43 ` [PATCH v2 13/13] staging:iio:meter:ade7758: " Lars-Peter Clausen
2011-12-13 14:55 ` [PATCH v2 01/13] staging:iio:ring_sw: Add helper function for initializing simple setups Lars-Peter Clausen
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).