* [PATCH 01/16] staging:iio:buffer drop bpe field.
2011-11-27 13:33 [PATCH 00/16] staging:iio: buffer cleanup series Jonathan Cameron
@ 2011-11-27 13:33 ` Jonathan Cameron
2011-11-27 13:33 ` [PATCH 02/16] staging:iio: remove userspace access to bytes per datum Jonathan Cameron
` (12 subsequent siblings)
13 siblings, 0 replies; 20+ messages in thread
From: Jonathan Cameron @ 2011-11-27 13:33 UTC (permalink / raw)
To: linux-iio; +Cc: lars, Michael.Hennerich, manuel.stahl, Jonathan Cameron
From: Jonathan Cameron <jic23@cam.ac.uk>
Has no remaining users.
Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
---
drivers/staging/iio/accel/adis16201_ring.c | 1 -
drivers/staging/iio/accel/adis16203_ring.c | 1 -
drivers/staging/iio/accel/adis16204_ring.c | 1 -
drivers/staging/iio/accel/adis16209_ring.c | 1 -
drivers/staging/iio/accel/adis16240_ring.c | 1 -
drivers/staging/iio/accel/lis3l02dq_ring.c | 1 -
drivers/staging/iio/accel/sca3000_ring.c | 2 --
drivers/staging/iio/adc/ad7606_ring.c | 2 --
drivers/staging/iio/buffer.h | 2 --
drivers/staging/iio/gyro/adis16260_ring.c | 1 -
drivers/staging/iio/iio_simple_dummy_buffer.c | 2 --
drivers/staging/iio/imu/adis16400_ring.c | 1 -
12 files changed, 0 insertions(+), 16 deletions(-)
diff --git a/drivers/staging/iio/accel/adis16201_ring.c b/drivers/staging/iio/accel/adis16201_ring.c
index 0016ed3..184c9dd 100644
--- a/drivers/staging/iio/accel/adis16201_ring.c
+++ b/drivers/staging/iio/accel/adis16201_ring.c
@@ -116,7 +116,6 @@ int adis16201_configure_ring(struct iio_dev *indio_dev)
}
indio_dev->buffer = ring;
/* Effectively select the ring buffer implementation */
- ring->bpe = 2;
ring->scan_timestamp = true;
ring->access = &ring_sw_access_funcs;
ring->setup_ops = &adis16201_ring_setup_ops;
diff --git a/drivers/staging/iio/accel/adis16203_ring.c b/drivers/staging/iio/accel/adis16203_ring.c
index 1fdfe6f..da170c8 100644
--- a/drivers/staging/iio/accel/adis16203_ring.c
+++ b/drivers/staging/iio/accel/adis16203_ring.c
@@ -118,7 +118,6 @@ int adis16203_configure_ring(struct iio_dev *indio_dev)
}
indio_dev->buffer = ring;
/* Effectively select the ring buffer implementation */
- ring->bpe = 2;
ring->scan_timestamp = true;
ring->access = &ring_sw_access_funcs;
ring->setup_ops = &adis16203_ring_setup_ops;
diff --git a/drivers/staging/iio/accel/adis16204_ring.c b/drivers/staging/iio/accel/adis16204_ring.c
index 6fd3d8f..1094564 100644
--- a/drivers/staging/iio/accel/adis16204_ring.c
+++ b/drivers/staging/iio/accel/adis16204_ring.c
@@ -114,7 +114,6 @@ int adis16204_configure_ring(struct iio_dev *indio_dev)
indio_dev->buffer = ring;
/* Effectively select the ring buffer implementation */
ring->access = &ring_sw_access_funcs;
- ring->bpe = 2;
ring->scan_timestamp = true;
ring->setup_ops = &adis16204_ring_setup_ops;
ring->owner = THIS_MODULE;
diff --git a/drivers/staging/iio/accel/adis16209_ring.c b/drivers/staging/iio/accel/adis16209_ring.c
index d17e39d..e9158ed 100644
--- a/drivers/staging/iio/accel/adis16209_ring.c
+++ b/drivers/staging/iio/accel/adis16209_ring.c
@@ -114,7 +114,6 @@ int adis16209_configure_ring(struct iio_dev *indio_dev)
indio_dev->buffer = ring;
/* Effectively select the ring buffer implementation */
ring->access = &ring_sw_access_funcs;
- ring->bpe = 2;
ring->scan_timestamp = true;
ring->setup_ops = &adis16209_ring_setup_ops;
ring->owner = THIS_MODULE;
diff --git a/drivers/staging/iio/accel/adis16240_ring.c b/drivers/staging/iio/accel/adis16240_ring.c
index b907ca3..5b02e5a 100644
--- a/drivers/staging/iio/accel/adis16240_ring.c
+++ b/drivers/staging/iio/accel/adis16240_ring.c
@@ -111,7 +111,6 @@ int adis16240_configure_ring(struct iio_dev *indio_dev)
indio_dev->buffer = ring;
/* Effectively select the ring buffer implementation */
ring->access = &ring_sw_access_funcs;
- ring->bpe = 2;
ring->scan_timestamp = true;
ring->setup_ops = &adis16240_ring_setup_ops;
ring->owner = THIS_MODULE;
diff --git a/drivers/staging/iio/accel/lis3l02dq_ring.c b/drivers/staging/iio/accel/lis3l02dq_ring.c
index 89527af..e400c04 100644
--- a/drivers/staging/iio/accel/lis3l02dq_ring.c
+++ b/drivers/staging/iio/accel/lis3l02dq_ring.c
@@ -437,7 +437,6 @@ int lis3l02dq_configure_buffer(struct iio_dev *indio_dev)
indio_dev->buffer = buffer;
/* Effectively select the buffer implementation */
indio_dev->buffer->access = &lis3l02dq_access_funcs;
- buffer->bpe = 2;
buffer->scan_timestamp = true;
buffer->setup_ops = &lis3l02dq_buffer_setup_ops;
diff --git a/drivers/staging/iio/accel/sca3000_ring.c b/drivers/staging/iio/accel/sca3000_ring.c
index 685ded8..4e1d938 100644
--- a/drivers/staging/iio/accel/sca3000_ring.c
+++ b/drivers/staging/iio/accel/sca3000_ring.c
@@ -146,7 +146,6 @@ static int sca3000_ring_get_bytes_per_datum(struct iio_buffer *r)
}
static IIO_BUFFER_ENABLE_ATTR;
-static IIO_BUFFER_BYTES_PER_DATUM_ATTR;
static IIO_BUFFER_LENGTH_ATTR;
/**
@@ -243,7 +242,6 @@ static IIO_DEVICE_ATTR(in_accel_scale,
*/
static struct attribute *sca3000_ring_attributes[] = {
&dev_attr_length.attr,
- &dev_attr_bytes_per_datum.attr,
&dev_attr_enable.attr,
&iio_dev_attr_50_percent.dev_attr.attr,
&iio_dev_attr_75_percent.dev_attr.attr,
diff --git a/drivers/staging/iio/adc/ad7606_ring.c b/drivers/staging/iio/adc/ad7606_ring.c
index af6780a..203c914 100644
--- a/drivers/staging/iio/adc/ad7606_ring.c
+++ b/drivers/staging/iio/adc/ad7606_ring.c
@@ -136,8 +136,6 @@ int ad7606_register_ring_funcs_and_init(struct iio_dev *indio_dev)
/* Effectively select the ring buffer implementation */
indio_dev->buffer->access = &ring_sw_access_funcs;
- indio_dev->buffer->bpe =
- st->chip_info->channels[0].scan_type.storagebits / 8;
indio_dev->pollfunc = iio_alloc_pollfunc(&ad7606_trigger_handler_th_bh,
&ad7606_trigger_handler_th_bh,
0,
diff --git a/drivers/staging/iio/buffer.h b/drivers/staging/iio/buffer.h
index 5282441..97d59d9 100644
--- a/drivers/staging/iio/buffer.h
+++ b/drivers/staging/iio/buffer.h
@@ -86,7 +86,6 @@ struct iio_buffer_setup_ops {
* @owner: module that owns the buffer (for ref counting)
* @length: [DEVICE] number of datums in buffer
* @bytes_per_datum: [DEVICE] size of individual datum including timestamp
- * @bpe: [DEVICE] size of individual channel value
* @scan_el_attrs: [DRIVER] control of scan elements if that scan mode
* control method is used
* @scan_count: [INTERN] the number of elements in the current scan mode
@@ -103,7 +102,6 @@ struct iio_buffer {
struct module *owner;
int length;
int bytes_per_datum;
- int bpe;
struct attribute_group *scan_el_attrs;
int scan_count;
long *scan_mask;
diff --git a/drivers/staging/iio/gyro/adis16260_ring.c b/drivers/staging/iio/gyro/adis16260_ring.c
index 52a9e78..c8d22f5 100644
--- a/drivers/staging/iio/gyro/adis16260_ring.c
+++ b/drivers/staging/iio/gyro/adis16260_ring.c
@@ -116,7 +116,6 @@ int adis16260_configure_ring(struct iio_dev *indio_dev)
indio_dev->buffer = ring;
/* Effectively select the ring buffer implementation */
ring->access = &ring_sw_access_funcs;
- ring->bpe = 2;
ring->scan_timestamp = true;
ring->setup_ops = &adis16260_ring_setup_ops;
ring->owner = THIS_MODULE;
diff --git a/drivers/staging/iio/iio_simple_dummy_buffer.c b/drivers/staging/iio/iio_simple_dummy_buffer.c
index edad0e7..1f1c273 100644
--- a/drivers/staging/iio/iio_simple_dummy_buffer.c
+++ b/drivers/staging/iio/iio_simple_dummy_buffer.c
@@ -142,8 +142,6 @@ int iio_simple_dummy_configure_buffer(struct iio_dev *indio_dev)
/* Tell the core how to access the buffer */
buffer->access = &kfifo_access_funcs;
- /* Number of bytes per element */
- buffer->bpe = 2;
/* Enable timestamps by default */
buffer->scan_timestamp = true;
diff --git a/drivers/staging/iio/imu/adis16400_ring.c b/drivers/staging/iio/imu/adis16400_ring.c
index fd886bf..cee61aa 100644
--- a/drivers/staging/iio/imu/adis16400_ring.c
+++ b/drivers/staging/iio/imu/adis16400_ring.c
@@ -186,7 +186,6 @@ int adis16400_configure_ring(struct iio_dev *indio_dev)
indio_dev->buffer = ring;
/* Effectively select the ring buffer implementation */
ring->access = &ring_sw_access_funcs;
- ring->bpe = 2;
ring->scan_timestamp = true;
ring->setup_ops = &adis16400_ring_setup_ops;
ring->owner = THIS_MODULE;
--
1.7.7.3
^ permalink raw reply related [flat|nested] 20+ messages in thread* [PATCH 02/16] staging:iio: remove userspace access to bytes per datum.
2011-11-27 13:33 [PATCH 00/16] staging:iio: buffer cleanup series Jonathan Cameron
2011-11-27 13:33 ` [PATCH 01/16] staging:iio:buffer drop bpe field Jonathan Cameron
@ 2011-11-27 13:33 ` Jonathan Cameron
2011-11-27 13:33 ` [PATCH 03/16] staging:iio:buffer move setup ops from buffer instance to iio_dev Jonathan Cameron
` (11 subsequent siblings)
13 siblings, 0 replies; 20+ messages in thread
From: Jonathan Cameron @ 2011-11-27 13:33 UTC (permalink / raw)
To: linux-iio; +Cc: lars, Michael.Hennerich, manuel.stahl, Jonathan Cameron
From: Jonathan Cameron <jic23@cam.ac.uk>
There are no known reasons why userspace should want this value.
It can be established from the buffer description anyway.
Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
---
drivers/staging/iio/buffer.h | 9 ---------
drivers/staging/iio/industrialio-buffer.c | 15 ---------------
drivers/staging/iio/kfifo_buf.c | 2 --
drivers/staging/iio/ring_sw.c | 2 --
4 files changed, 0 insertions(+), 28 deletions(-)
diff --git a/drivers/staging/iio/buffer.h b/drivers/staging/iio/buffer.h
index 97d59d9..9171735 100644
--- a/drivers/staging/iio/buffer.h
+++ b/drivers/staging/iio/buffer.h
@@ -193,12 +193,6 @@ ssize_t iio_buffer_write_length(struct device *dev,
const char *buf,
size_t len);
/**
- * iio_buffer_read_bytes_per_datum() - attr for number of bytes in whole datum
- **/
-ssize_t iio_buffer_read_bytes_per_datum(struct device *dev,
- struct device_attribute *attr,
- char *buf);
-/**
* iio_buffer_store_enable() - attr to turn the buffer on
**/
ssize_t iio_buffer_store_enable(struct device *dev,
@@ -214,9 +208,6 @@ ssize_t iio_buffer_show_enable(struct device *dev,
#define IIO_BUFFER_LENGTH_ATTR DEVICE_ATTR(length, S_IRUGO | S_IWUSR, \
iio_buffer_read_length, \
iio_buffer_write_length)
-#define IIO_BUFFER_BYTES_PER_DATUM_ATTR \
- DEVICE_ATTR(bytes_per_datum, S_IRUGO | S_IWUSR, \
- iio_buffer_read_bytes_per_datum, NULL)
#define IIO_BUFFER_ENABLE_ATTR DEVICE_ATTR(enable, S_IRUGO | S_IWUSR, \
iio_buffer_show_enable, \
diff --git a/drivers/staging/iio/industrialio-buffer.c b/drivers/staging/iio/industrialio-buffer.c
index 352f9f1..4af7f94 100644
--- a/drivers/staging/iio/industrialio-buffer.c
+++ b/drivers/staging/iio/industrialio-buffer.c
@@ -410,21 +410,6 @@ ssize_t iio_buffer_write_length(struct device *dev,
}
EXPORT_SYMBOL(iio_buffer_write_length);
-ssize_t iio_buffer_read_bytes_per_datum(struct device *dev,
- struct device_attribute *attr,
- char *buf)
-{
- struct iio_dev *indio_dev = dev_get_drvdata(dev);
- struct iio_buffer *buffer = indio_dev->buffer;
-
- if (buffer->access->get_bytes_per_datum)
- return sprintf(buf, "%d\n",
- buffer->access->get_bytes_per_datum(buffer));
-
- return 0;
-}
-EXPORT_SYMBOL(iio_buffer_read_bytes_per_datum);
-
ssize_t iio_buffer_store_enable(struct device *dev,
struct device_attribute *attr,
const char *buf,
diff --git a/drivers/staging/iio/kfifo_buf.c b/drivers/staging/iio/kfifo_buf.c
index fd98a0e..fb3b7ae 100644
--- a/drivers/staging/iio/kfifo_buf.c
+++ b/drivers/staging/iio/kfifo_buf.c
@@ -75,12 +75,10 @@ static inline void __iio_init_kfifo(struct iio_kfifo *kf)
}
static IIO_BUFFER_ENABLE_ATTR;
-static IIO_BUFFER_BYTES_PER_DATUM_ATTR;
static IIO_BUFFER_LENGTH_ATTR;
static struct attribute *iio_kfifo_attributes[] = {
&dev_attr_length.attr,
- &dev_attr_bytes_per_datum.attr,
&dev_attr_enable.attr,
NULL,
};
diff --git a/drivers/staging/iio/ring_sw.c b/drivers/staging/iio/ring_sw.c
index 66a34ad..98fe819 100644
--- a/drivers/staging/iio/ring_sw.c
+++ b/drivers/staging/iio/ring_sw.c
@@ -393,13 +393,11 @@ static int iio_mark_update_needed_sw_rb(struct iio_buffer *r)
}
static IIO_BUFFER_ENABLE_ATTR;
-static IIO_BUFFER_BYTES_PER_DATUM_ATTR;
static IIO_BUFFER_LENGTH_ATTR;
/* Standard set of ring buffer attributes */
static struct attribute *iio_ring_attributes[] = {
&dev_attr_length.attr,
- &dev_attr_bytes_per_datum.attr,
&dev_attr_enable.attr,
NULL,
};
--
1.7.7.3
^ permalink raw reply related [flat|nested] 20+ messages in thread* [PATCH 03/16] staging:iio:buffer move setup ops from buffer instance to iio_dev
2011-11-27 13:33 [PATCH 00/16] staging:iio: buffer cleanup series Jonathan Cameron
2011-11-27 13:33 ` [PATCH 01/16] staging:iio:buffer drop bpe field Jonathan Cameron
2011-11-27 13:33 ` [PATCH 02/16] staging:iio: remove userspace access to bytes per datum Jonathan Cameron
@ 2011-11-27 13:33 ` Jonathan Cameron
2011-11-27 13:33 ` [PATCH 04/16] staging:iio: scrap scan_count and ensure all drivers use active_scan_mask Jonathan Cameron
` (10 subsequent siblings)
13 siblings, 0 replies; 20+ messages in thread
From: Jonathan Cameron @ 2011-11-27 13:33 UTC (permalink / raw)
To: linux-iio; +Cc: lars, Michael.Hennerich, manuel.stahl, Jonathan Cameron
From: Jonathan Cameron <jic23@cam.ac.uk>
These callbacks should not be buffer instance specific.
Hence move them out of the buffer.
Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
---
drivers/staging/iio/accel/adis16201_ring.c | 2 +-
drivers/staging/iio/accel/adis16203_ring.c | 2 +-
drivers/staging/iio/accel/adis16204_ring.c | 2 +-
drivers/staging/iio/accel/adis16209_ring.c | 2 +-
drivers/staging/iio/accel/adis16240_ring.c | 2 +-
drivers/staging/iio/accel/lis3l02dq_ring.c | 2 +-
drivers/staging/iio/accel/sca3000_ring.c | 2 +-
drivers/staging/iio/adc/ad7192.c | 2 +-
drivers/staging/iio/adc/ad7298_ring.c | 2 +-
drivers/staging/iio/adc/ad7476_ring.c | 2 +-
drivers/staging/iio/adc/ad7606_ring.c | 2 +-
drivers/staging/iio/adc/ad7793.c | 2 +-
drivers/staging/iio/adc/ad7887_ring.c | 2 +-
drivers/staging/iio/adc/ad799x_ring.c | 2 +-
drivers/staging/iio/adc/max1363_ring.c | 2 +-
drivers/staging/iio/buffer.h | 16 ----------------
drivers/staging/iio/gyro/adis16260_ring.c | 2 +-
drivers/staging/iio/iio.h | 16 ++++++++++++++++
drivers/staging/iio/iio_simple_dummy_buffer.c | 2 +-
drivers/staging/iio/impedance-analyzer/ad5933.c | 2 +-
drivers/staging/iio/imu/adis16400_ring.c | 2 +-
drivers/staging/iio/industrialio-buffer.c | 20 ++++++++++----------
drivers/staging/iio/meter/ade7758_ring.c | 2 +-
23 files changed, 46 insertions(+), 46 deletions(-)
diff --git a/drivers/staging/iio/accel/adis16201_ring.c b/drivers/staging/iio/accel/adis16201_ring.c
index 184c9dd..936e8cb 100644
--- a/drivers/staging/iio/accel/adis16201_ring.c
+++ b/drivers/staging/iio/accel/adis16201_ring.c
@@ -118,7 +118,7 @@ int adis16201_configure_ring(struct iio_dev *indio_dev)
/* Effectively select the ring buffer implementation */
ring->scan_timestamp = true;
ring->access = &ring_sw_access_funcs;
- ring->setup_ops = &adis16201_ring_setup_ops;
+ indio_dev->setup_ops = &adis16201_ring_setup_ops;
ring->owner = THIS_MODULE;
indio_dev->pollfunc = iio_alloc_pollfunc(&iio_pollfunc_store_time,
diff --git a/drivers/staging/iio/accel/adis16203_ring.c b/drivers/staging/iio/accel/adis16203_ring.c
index da170c8..d41a50b 100644
--- a/drivers/staging/iio/accel/adis16203_ring.c
+++ b/drivers/staging/iio/accel/adis16203_ring.c
@@ -120,7 +120,7 @@ int adis16203_configure_ring(struct iio_dev *indio_dev)
/* Effectively select the ring buffer implementation */
ring->scan_timestamp = true;
ring->access = &ring_sw_access_funcs;
- ring->setup_ops = &adis16203_ring_setup_ops;
+ indio_dev->setup_ops = &adis16203_ring_setup_ops;
ring->owner = THIS_MODULE;
indio_dev->pollfunc = iio_alloc_pollfunc(&iio_pollfunc_store_time,
diff --git a/drivers/staging/iio/accel/adis16204_ring.c b/drivers/staging/iio/accel/adis16204_ring.c
index 1094564..d05d311 100644
--- a/drivers/staging/iio/accel/adis16204_ring.c
+++ b/drivers/staging/iio/accel/adis16204_ring.c
@@ -115,7 +115,7 @@ int adis16204_configure_ring(struct iio_dev *indio_dev)
/* Effectively select the ring buffer implementation */
ring->access = &ring_sw_access_funcs;
ring->scan_timestamp = true;
- ring->setup_ops = &adis16204_ring_setup_ops;
+ indio_dev->setup_ops = &adis16204_ring_setup_ops;
ring->owner = THIS_MODULE;
indio_dev->pollfunc = iio_alloc_pollfunc(&iio_pollfunc_store_time,
diff --git a/drivers/staging/iio/accel/adis16209_ring.c b/drivers/staging/iio/accel/adis16209_ring.c
index e9158ed..da9946a 100644
--- a/drivers/staging/iio/accel/adis16209_ring.c
+++ b/drivers/staging/iio/accel/adis16209_ring.c
@@ -115,7 +115,7 @@ int adis16209_configure_ring(struct iio_dev *indio_dev)
/* Effectively select the ring buffer implementation */
ring->access = &ring_sw_access_funcs;
ring->scan_timestamp = true;
- ring->setup_ops = &adis16209_ring_setup_ops;
+ indio_dev->setup_ops = &adis16209_ring_setup_ops;
ring->owner = THIS_MODULE;
indio_dev->pollfunc = iio_alloc_pollfunc(&iio_pollfunc_store_time,
diff --git a/drivers/staging/iio/accel/adis16240_ring.c b/drivers/staging/iio/accel/adis16240_ring.c
index 5b02e5a..aa215b9 100644
--- a/drivers/staging/iio/accel/adis16240_ring.c
+++ b/drivers/staging/iio/accel/adis16240_ring.c
@@ -112,7 +112,7 @@ int adis16240_configure_ring(struct iio_dev *indio_dev)
/* Effectively select the ring buffer implementation */
ring->access = &ring_sw_access_funcs;
ring->scan_timestamp = true;
- ring->setup_ops = &adis16240_ring_setup_ops;
+ indio_dev->setup_ops = &adis16240_ring_setup_ops;
ring->owner = THIS_MODULE;
indio_dev->pollfunc = iio_alloc_pollfunc(&iio_pollfunc_store_time,
diff --git a/drivers/staging/iio/accel/lis3l02dq_ring.c b/drivers/staging/iio/accel/lis3l02dq_ring.c
index e400c04..1d36050 100644
--- a/drivers/staging/iio/accel/lis3l02dq_ring.c
+++ b/drivers/staging/iio/accel/lis3l02dq_ring.c
@@ -439,7 +439,7 @@ int lis3l02dq_configure_buffer(struct iio_dev *indio_dev)
indio_dev->buffer->access = &lis3l02dq_access_funcs;
buffer->scan_timestamp = true;
- buffer->setup_ops = &lis3l02dq_buffer_setup_ops;
+ indio_dev->setup_ops = &lis3l02dq_buffer_setup_ops;
buffer->owner = THIS_MODULE;
/* Functions are NULL as we set handler below */
diff --git a/drivers/staging/iio/accel/sca3000_ring.c b/drivers/staging/iio/accel/sca3000_ring.c
index 4e1d938..6a27a95 100644
--- a/drivers/staging/iio/accel/sca3000_ring.c
+++ b/drivers/staging/iio/accel/sca3000_ring.c
@@ -348,7 +348,7 @@ static const struct iio_buffer_setup_ops sca3000_ring_setup_ops = {
void sca3000_register_ring_funcs(struct iio_dev *indio_dev)
{
- indio_dev->buffer->setup_ops = &sca3000_ring_setup_ops;
+ indio_dev->setup_ops = &sca3000_ring_setup_ops;
}
/**
diff --git a/drivers/staging/iio/adc/ad7192.c b/drivers/staging/iio/adc/ad7192.c
index f48a0d4..ad6cef5 100644
--- a/drivers/staging/iio/adc/ad7192.c
+++ b/drivers/staging/iio/adc/ad7192.c
@@ -592,7 +592,7 @@ static int ad7192_register_ring_funcs_and_init(struct iio_dev *indio_dev)
}
/* Ring buffer functions - here trigger setup related */
- indio_dev->buffer->setup_ops = &ad7192_ring_setup_ops;
+ indio_dev->setup_ops = &ad7192_ring_setup_ops;
/* Flag that polled ring buffering is possible */
indio_dev->modes |= INDIO_BUFFER_TRIGGERED;
diff --git a/drivers/staging/iio/adc/ad7298_ring.c b/drivers/staging/iio/adc/ad7298_ring.c
index 192328e..611e212 100644
--- a/drivers/staging/iio/adc/ad7298_ring.c
+++ b/drivers/staging/iio/adc/ad7298_ring.c
@@ -174,7 +174,7 @@ int ad7298_register_ring_funcs_and_init(struct iio_dev *indio_dev)
}
/* Ring buffer functions - here trigger setup related */
- indio_dev->buffer->setup_ops = &ad7298_ring_setup_ops;
+ indio_dev->setup_ops = &ad7298_ring_setup_ops;
indio_dev->buffer->scan_timestamp = true;
/* Flag that polled ring buffering is possible */
diff --git a/drivers/staging/iio/adc/ad7476_ring.c b/drivers/staging/iio/adc/ad7476_ring.c
index 0961887..2dad7f8 100644
--- a/drivers/staging/iio/adc/ad7476_ring.c
+++ b/drivers/staging/iio/adc/ad7476_ring.c
@@ -137,7 +137,7 @@ int ad7476_register_ring_funcs_and_init(struct iio_dev *indio_dev)
}
/* Ring buffer functions - here trigger setup related */
- indio_dev->buffer->setup_ops = &ad7476_ring_setup_ops;
+ indio_dev->setup_ops = &ad7476_ring_setup_ops;
indio_dev->buffer->scan_timestamp = true;
/* Flag that polled ring buffering is possible */
diff --git a/drivers/staging/iio/adc/ad7606_ring.c b/drivers/staging/iio/adc/ad7606_ring.c
index 203c914..f682af6 100644
--- a/drivers/staging/iio/adc/ad7606_ring.c
+++ b/drivers/staging/iio/adc/ad7606_ring.c
@@ -150,7 +150,7 @@ int ad7606_register_ring_funcs_and_init(struct iio_dev *indio_dev)
/* Ring buffer functions - here trigger setup related */
- indio_dev->buffer->setup_ops = &ad7606_ring_setup_ops;
+ indio_dev->setup_ops = &ad7606_ring_setup_ops;
indio_dev->buffer->scan_timestamp = true ;
INIT_WORK(&st->poll_work, &ad7606_poll_bh_to_ring);
diff --git a/drivers/staging/iio/adc/ad7793.c b/drivers/staging/iio/adc/ad7793.c
index 362cc31..8a0729c 100644
--- a/drivers/staging/iio/adc/ad7793.c
+++ b/drivers/staging/iio/adc/ad7793.c
@@ -459,7 +459,7 @@ static int ad7793_register_ring_funcs_and_init(struct iio_dev *indio_dev)
}
/* Ring buffer functions - here trigger setup related */
- indio_dev->buffer->setup_ops = &ad7793_ring_setup_ops;
+ indio_dev->setup_ops = &ad7793_ring_setup_ops;
/* Flag that polled ring buffering is possible */
indio_dev->modes |= INDIO_BUFFER_TRIGGERED;
diff --git a/drivers/staging/iio/adc/ad7887_ring.c b/drivers/staging/iio/adc/ad7887_ring.c
index fbe21b5..fee338c 100644
--- a/drivers/staging/iio/adc/ad7887_ring.c
+++ b/drivers/staging/iio/adc/ad7887_ring.c
@@ -176,7 +176,7 @@ int ad7887_register_ring_funcs_and_init(struct iio_dev *indio_dev)
goto error_deallocate_sw_rb;
}
/* Ring buffer functions - here trigger setup related */
- indio_dev->buffer->setup_ops = &ad7887_ring_setup_ops;
+ indio_dev->setup_ops = &ad7887_ring_setup_ops;
/* Flag that polled ring buffering is possible */
indio_dev->modes |= INDIO_BUFFER_TRIGGERED;
diff --git a/drivers/staging/iio/adc/ad799x_ring.c b/drivers/staging/iio/adc/ad799x_ring.c
index b215a1f..50c1216 100644
--- a/drivers/staging/iio/adc/ad799x_ring.c
+++ b/drivers/staging/iio/adc/ad799x_ring.c
@@ -183,7 +183,7 @@ int ad799x_register_ring_funcs_and_init(struct iio_dev *indio_dev)
}
/* Ring buffer functions - here trigger setup related */
- indio_dev->buffer->setup_ops = &ad799x_buf_setup_ops;
+ indio_dev->setup_ops = &ad799x_buf_setup_ops;
indio_dev->buffer->scan_timestamp = true;
/* Flag that polled ring buffering is possible */
diff --git a/drivers/staging/iio/adc/max1363_ring.c b/drivers/staging/iio/adc/max1363_ring.c
index 19977a6..3a38a26 100644
--- a/drivers/staging/iio/adc/max1363_ring.c
+++ b/drivers/staging/iio/adc/max1363_ring.c
@@ -155,7 +155,7 @@ int max1363_register_ring_funcs_and_init(struct iio_dev *indio_dev)
/* Effectively select the ring buffer implementation */
indio_dev->buffer->access = &ring_sw_access_funcs;
/* Ring buffer functions - here trigger setup related */
- indio_dev->buffer->setup_ops = &max1363_ring_setup_ops;
+ indio_dev->setup_ops = &max1363_ring_setup_ops;
/* Flag that polled ring buffering is possible */
indio_dev->modes |= INDIO_BUFFER_TRIGGERED;
diff --git a/drivers/staging/iio/buffer.h b/drivers/staging/iio/buffer.h
index 9171735..58c7571 100644
--- a/drivers/staging/iio/buffer.h
+++ b/drivers/staging/iio/buffer.h
@@ -66,21 +66,6 @@ struct iio_buffer_access_funcs {
};
/**
- * struct iio_buffer_setup_ops - buffer setup related callbacks
- * @preenable: [DRIVER] function to run prior to marking buffer enabled
- * @postenable: [DRIVER] function to run after marking buffer enabled
- * @predisable: [DRIVER] function to run prior to marking buffer
- * disabled
- * @postdisable: [DRIVER] function to run after marking buffer disabled
- */
-struct iio_buffer_setup_ops {
- int (*preenable)(struct iio_dev *);
- int (*postenable)(struct iio_dev *);
- int (*predisable)(struct iio_dev *);
- int (*postdisable)(struct iio_dev *);
-};
-
-/**
* struct iio_buffer - general buffer structure
* @indio_dev: industrial I/O device structure
* @owner: module that owns the buffer (for ref counting)
@@ -108,7 +93,6 @@ struct iio_buffer {
bool scan_timestamp;
unsigned scan_index_timestamp;
const struct iio_buffer_access_funcs *access;
- const struct iio_buffer_setup_ops *setup_ops;
struct list_head scan_el_dev_attr_list;
struct attribute_group scan_el_group;
wait_queue_head_t pollq;
diff --git a/drivers/staging/iio/gyro/adis16260_ring.c b/drivers/staging/iio/gyro/adis16260_ring.c
index c8d22f5..446d78f 100644
--- a/drivers/staging/iio/gyro/adis16260_ring.c
+++ b/drivers/staging/iio/gyro/adis16260_ring.c
@@ -117,7 +117,7 @@ int adis16260_configure_ring(struct iio_dev *indio_dev)
/* Effectively select the ring buffer implementation */
ring->access = &ring_sw_access_funcs;
ring->scan_timestamp = true;
- ring->setup_ops = &adis16260_ring_setup_ops;
+ indio_dev->setup_ops = &adis16260_ring_setup_ops;
ring->owner = THIS_MODULE;
indio_dev->pollfunc = iio_alloc_pollfunc(&iio_pollfunc_store_time,
diff --git a/drivers/staging/iio/iio.h b/drivers/staging/iio/iio.h
index e30d33d..bd29412 100644
--- a/drivers/staging/iio/iio.h
+++ b/drivers/staging/iio/iio.h
@@ -270,6 +270,21 @@ struct iio_info {
};
/**
+ * struct iio_buffer_setup_ops - buffer setup related callbacks
+ * @preenable: [DRIVER] function to run prior to marking buffer enabled
+ * @postenable: [DRIVER] function to run after marking buffer enabled
+ * @predisable: [DRIVER] function to run prior to marking buffer
+ * disabled
+ * @postdisable: [DRIVER] function to run after marking buffer disabled
+ */
+struct iio_buffer_setup_ops {
+ int (*preenable)(struct iio_dev *);
+ int (*postenable)(struct iio_dev *);
+ int (*predisable)(struct iio_dev *);
+ int (*postdisable)(struct iio_dev *);
+};
+
+/**
* struct iio_dev - industrial I/O device
* @id: [INTERN] used to identify device internally
* @modes: [DRIVER] operating modes supported by device
@@ -322,6 +337,7 @@ struct iio_dev {
struct attribute_group chan_attr_group;
const char *name;
const struct iio_info *info;
+ const struct iio_buffer_setup_ops *setup_ops;
struct cdev chrdev;
#define IIO_MAX_GROUPS 6
const struct attribute_group *groups[IIO_MAX_GROUPS + 1];
diff --git a/drivers/staging/iio/iio_simple_dummy_buffer.c b/drivers/staging/iio/iio_simple_dummy_buffer.c
index 1f1c273..ce098be 100644
--- a/drivers/staging/iio/iio_simple_dummy_buffer.c
+++ b/drivers/staging/iio/iio_simple_dummy_buffer.c
@@ -149,7 +149,7 @@ int iio_simple_dummy_configure_buffer(struct iio_dev *indio_dev)
* Tell the core what device type specific functions should
* be run on either side of buffer capture enable / disable.
*/
- buffer->setup_ops = &iio_simple_dummy_buffer_setup_ops;
+ indio_dev->setup_ops = &iio_simple_dummy_buffer_setup_ops;
buffer->owner = THIS_MODULE;
/*
diff --git a/drivers/staging/iio/impedance-analyzer/ad5933.c b/drivers/staging/iio/impedance-analyzer/ad5933.c
index 966f768..b059b78 100644
--- a/drivers/staging/iio/impedance-analyzer/ad5933.c
+++ b/drivers/staging/iio/impedance-analyzer/ad5933.c
@@ -611,7 +611,7 @@ static int ad5933_register_ring_funcs_and_init(struct iio_dev *indio_dev)
indio_dev->buffer->access = &ring_sw_access_funcs;
/* Ring buffer functions - here trigger setup related */
- indio_dev->buffer->setup_ops = &ad5933_ring_setup_ops;
+ indio_dev->setup_ops = &ad5933_ring_setup_ops;
indio_dev->modes |= INDIO_BUFFER_HARDWARE;
diff --git a/drivers/staging/iio/imu/adis16400_ring.c b/drivers/staging/iio/imu/adis16400_ring.c
index cee61aa..e8aaa84 100644
--- a/drivers/staging/iio/imu/adis16400_ring.c
+++ b/drivers/staging/iio/imu/adis16400_ring.c
@@ -187,7 +187,7 @@ int adis16400_configure_ring(struct iio_dev *indio_dev)
/* Effectively select the ring buffer implementation */
ring->access = &ring_sw_access_funcs;
ring->scan_timestamp = true;
- ring->setup_ops = &adis16400_ring_setup_ops;
+ indio_dev->setup_ops = &adis16400_ring_setup_ops;
ring->owner = THIS_MODULE;
indio_dev->pollfunc = iio_alloc_pollfunc(&iio_pollfunc_store_time,
diff --git a/drivers/staging/iio/industrialio-buffer.c b/drivers/staging/iio/industrialio-buffer.c
index 4af7f94..c1c97e1 100644
--- a/drivers/staging/iio/industrialio-buffer.c
+++ b/drivers/staging/iio/industrialio-buffer.c
@@ -430,8 +430,8 @@ ssize_t iio_buffer_store_enable(struct device *dev,
goto done;
}
if (requested_state) {
- if (buffer->setup_ops->preenable) {
- ret = buffer->setup_ops->preenable(indio_dev);
+ if (indio_dev->setup_ops->preenable) {
+ ret = indio_dev->setup_ops->preenable(indio_dev);
if (ret) {
printk(KERN_ERR
"Buffer not started:"
@@ -468,8 +468,8 @@ ssize_t iio_buffer_store_enable(struct device *dev,
goto error_ret;
}
- if (buffer->setup_ops->postenable) {
- ret = buffer->setup_ops->postenable(indio_dev);
+ if (indio_dev->setup_ops->postenable) {
+ ret = indio_dev->setup_ops->postenable(indio_dev);
if (ret) {
printk(KERN_INFO
"Buffer not started:"
@@ -477,23 +477,23 @@ ssize_t iio_buffer_store_enable(struct device *dev,
if (buffer->access->unmark_in_use)
buffer->access->unmark_in_use(buffer);
indio_dev->currentmode = previous_mode;
- if (buffer->setup_ops->postdisable)
- buffer->setup_ops->
+ if (indio_dev->setup_ops->postdisable)
+ indio_dev->setup_ops->
postdisable(indio_dev);
goto error_ret;
}
}
} else {
- if (buffer->setup_ops->predisable) {
- ret = buffer->setup_ops->predisable(indio_dev);
+ if (indio_dev->setup_ops->predisable) {
+ ret = indio_dev->setup_ops->predisable(indio_dev);
if (ret)
goto error_ret;
}
if (buffer->access->unmark_in_use)
buffer->access->unmark_in_use(buffer);
indio_dev->currentmode = INDIO_DIRECT_MODE;
- if (buffer->setup_ops->postdisable) {
- ret = buffer->setup_ops->postdisable(indio_dev);
+ if (indio_dev->setup_ops->postdisable) {
+ ret = indio_dev->setup_ops->postdisable(indio_dev);
if (ret)
goto error_ret;
}
diff --git a/drivers/staging/iio/meter/ade7758_ring.c b/drivers/staging/iio/meter/ade7758_ring.c
index 00fa2ac..464713a 100644
--- a/drivers/staging/iio/meter/ade7758_ring.c
+++ b/drivers/staging/iio/meter/ade7758_ring.c
@@ -145,7 +145,7 @@ int ade7758_configure_ring(struct iio_dev *indio_dev)
/* Effectively select the ring buffer implementation */
indio_dev->buffer->access = &ring_sw_access_funcs;
- indio_dev->buffer->setup_ops = &ade7758_ring_setup_ops;
+ indio_dev->setup_ops = &ade7758_ring_setup_ops;
indio_dev->buffer->owner = THIS_MODULE;
indio_dev->pollfunc = iio_alloc_pollfunc(&iio_pollfunc_store_time,
--
1.7.7.3
^ permalink raw reply related [flat|nested] 20+ messages in thread* [PATCH 04/16] staging:iio: scrap scan_count and ensure all drivers use active_scan_mask
2011-11-27 13:33 [PATCH 00/16] staging:iio: buffer cleanup series Jonathan Cameron
` (2 preceding siblings ...)
2011-11-27 13:33 ` [PATCH 03/16] staging:iio:buffer move setup ops from buffer instance to iio_dev Jonathan Cameron
@ 2011-11-27 13:33 ` Jonathan Cameron
2011-11-28 9:45 ` Lars-Peter Clausen
2011-11-27 13:33 ` [PATCH 05/16] staging:iio:buffer remove unused owner field from struct iio_buffer Jonathan Cameron
` (9 subsequent siblings)
13 siblings, 1 reply; 20+ messages in thread
From: Jonathan Cameron @ 2011-11-27 13:33 UTC (permalink / raw)
To: linux-iio; +Cc: lars, Michael.Hennerich, manuel.stahl, Jonathan Cameron
From: Jonathan Cameron <jic23@cam.ac.uk>
Obviously drivers should only use this for pushing to buffers.
They need buffer->scan_mask for pulling from them post demux.
Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
---
drivers/staging/iio/accel/adis16201_ring.c | 10 +++++-----
drivers/staging/iio/accel/adis16203_ring.c | 10 +++++-----
drivers/staging/iio/accel/adis16204_ring.c | 10 +++++-----
drivers/staging/iio/accel/adis16209_ring.c | 5 +++--
drivers/staging/iio/accel/adis16240_ring.c | 5 +++--
drivers/staging/iio/accel/lis3l02dq_ring.c | 23 +++++++++++++----------
drivers/staging/iio/adc/ad7192.c | 10 ++++++----
drivers/staging/iio/adc/ad7298_ring.c | 12 +++++++-----
drivers/staging/iio/adc/ad7476_ring.c | 3 ++-
drivers/staging/iio/adc/ad7793.c | 11 ++++++-----
drivers/staging/iio/adc/ad7887_ring.c | 8 +++++---
drivers/staging/iio/adc/ad799x_ring.c | 13 ++++++++-----
drivers/staging/iio/buffer.h | 2 --
drivers/staging/iio/gyro/adis16260_ring.c | 5 +++--
drivers/staging/iio/iio_simple_dummy_buffer.c | 7 +++++--
drivers/staging/iio/impedance-analyzer/ad5933.c | 14 ++++++++------
drivers/staging/iio/imu/adis16400_ring.c | 19 +++++++++++--------
drivers/staging/iio/industrialio-buffer.c | 2 --
drivers/staging/iio/meter/ade7758_ring.c | 7 ++++---
19 files changed, 99 insertions(+), 77 deletions(-)
diff --git a/drivers/staging/iio/accel/adis16201_ring.c b/drivers/staging/iio/accel/adis16201_ring.c
index 936e8cb..68d4b38 100644
--- a/drivers/staging/iio/accel/adis16201_ring.c
+++ b/drivers/staging/iio/accel/adis16201_ring.c
@@ -74,11 +74,11 @@ static irqreturn_t adis16201_trigger_handler(int irq, void *p)
return -ENOMEM;
}
- if (ring->scan_count)
- if (adis16201_read_ring_data(indio_dev, st->rx) >= 0)
- for (; i < ring->scan_count; i++)
- data[i] = be16_to_cpup(
- (__be16 *)&(st->rx[i*2]));
+ if (!bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength)
+ && adis16201_read_ring_data(indio_dev, st->rx) >= 0)
+ for (; i < bitmap_weight(indio_dev->active_scan_mask,
+ indio_dev->masklength); i++)
+ data[i] = be16_to_cpup((__be16 *)&(st->rx[i*2]));
/* Guaranteed to be aligned with 8 byte boundary */
if (ring->scan_timestamp)
diff --git a/drivers/staging/iio/accel/adis16203_ring.c b/drivers/staging/iio/accel/adis16203_ring.c
index d41a50b..0f9d18a 100644
--- a/drivers/staging/iio/accel/adis16203_ring.c
+++ b/drivers/staging/iio/accel/adis16203_ring.c
@@ -74,11 +74,11 @@ static irqreturn_t adis16203_trigger_handler(int irq, void *p)
return -ENOMEM;
}
- if (ring->scan_count)
- if (adis16203_read_ring_data(&indio_dev->dev, st->rx) >= 0)
- for (; i < ring->scan_count; i++)
- data[i] = be16_to_cpup(
- (__be16 *)&(st->rx[i*2]));
+ if (!bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength) &&
+ adis16203_read_ring_data(&indio_dev->dev, st->rx) >= 0)
+ for (; i < bitmap_weight(indio_dev->active_scan_mask,
+ indio_dev->masklength); i++)
+ data[i] = be16_to_cpup((__be16 *)&(st->rx[i*2]));
/* Guaranteed to be aligned with 8 byte boundary */
if (ring->scan_timestamp)
diff --git a/drivers/staging/iio/accel/adis16204_ring.c b/drivers/staging/iio/accel/adis16204_ring.c
index d05d311..8010c1d 100644
--- a/drivers/staging/iio/accel/adis16204_ring.c
+++ b/drivers/staging/iio/accel/adis16204_ring.c
@@ -71,11 +71,11 @@ static irqreturn_t adis16204_trigger_handler(int irq, void *p)
return -ENOMEM;
}
- if (ring->scan_count)
- if (adis16204_read_ring_data(&indio_dev->dev, st->rx) >= 0)
- for (; i < ring->scan_count; i++)
- data[i] = be16_to_cpup(
- (__be16 *)&(st->rx[i*2]));
+ if (!bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength) &&
+ adis16204_read_ring_data(&indio_dev->dev, st->rx) >= 0)
+ for (; i < bitmap_weight(indio_dev->active_scan_mask,
+ indio_dev->masklength); i++)
+ data[i] = be16_to_cpup((__be16 *)&(st->rx[i*2]));
/* Guaranteed to be aligned with 8 byte boundary */
if (ring->scan_timestamp)
diff --git a/drivers/staging/iio/accel/adis16209_ring.c b/drivers/staging/iio/accel/adis16209_ring.c
index da9946a..8629fea 100644
--- a/drivers/staging/iio/accel/adis16209_ring.c
+++ b/drivers/staging/iio/accel/adis16209_ring.c
@@ -72,9 +72,10 @@ static irqreturn_t adis16209_trigger_handler(int irq, void *p)
return -ENOMEM;
}
- if (ring->scan_count &&
+ if (!bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength) &&
adis16209_read_ring_data(&indio_dev->dev, st->rx) >= 0)
- for (; i < ring->scan_count; i++)
+ for (; i < bitmap_weight(indio_dev->active_scan_mask,
+ indio_dev->masklength); i++)
data[i] = be16_to_cpup((__be16 *)&(st->rx[i*2]));
/* Guaranteed to be aligned with 8 byte boundary */
diff --git a/drivers/staging/iio/accel/adis16240_ring.c b/drivers/staging/iio/accel/adis16240_ring.c
index aa215b9..9a3dba2 100644
--- a/drivers/staging/iio/accel/adis16240_ring.c
+++ b/drivers/staging/iio/accel/adis16240_ring.c
@@ -69,9 +69,10 @@ static irqreturn_t adis16240_trigger_handler(int irq, void *p)
return -ENOMEM;
}
- if (ring->scan_count &&
+ if (!bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength) &&
adis16240_read_ring_data(&indio_dev->dev, st->rx) >= 0)
- for (; i < ring->scan_count; i++)
+ for (; i < bitmap_weight(indio_dev->active_scan_mask,
+ indio_dev->masklength); i++)
data[i] = be16_to_cpup((__be16 *)&(st->rx[i*2]));
/* Guaranteed to be aligned with 8 byte boundary */
diff --git a/drivers/staging/iio/accel/lis3l02dq_ring.c b/drivers/staging/iio/accel/lis3l02dq_ring.c
index 1d36050..4d40505 100644
--- a/drivers/staging/iio/accel/lis3l02dq_ring.c
+++ b/drivers/staging/iio/accel/lis3l02dq_ring.c
@@ -87,13 +87,13 @@ 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 = kzalloc((buffer->scan_count) * 2
+ xfers = kzalloc(bitmap_weight(indio_dev->active_scan_mask,
+ indio_dev->masklength) * 2
* sizeof(*xfers), GFP_KERNEL);
if (!xfers)
return -ENOMEM;
@@ -101,7 +101,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 (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];
@@ -129,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);
@@ -145,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);
@@ -175,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 */
@@ -363,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
diff --git a/drivers/staging/iio/adc/ad7192.c b/drivers/staging/iio/adc/ad7192.c
index ad6cef5..1b6ecc8 100644
--- a/drivers/staging/iio/adc/ad7192.c
+++ b/drivers/staging/iio/adc/ad7192.c
@@ -479,12 +479,14 @@ static int ad7192_ring_preenable(struct iio_dev *indio_dev)
size_t d_size;
unsigned channel;
- if (!ring->scan_count)
+ if (bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength))
return -EINVAL;
- channel = find_first_bit(ring->scan_mask, indio_dev->masklength);
+ channel = find_first_bit(indio_dev->active_scan_mask,
+ indio_dev->masklength);
- d_size = ring->scan_count *
+ d_size = bitmap_weight(indio_dev->active_scan_mask,
+ indio_dev->masklength) *
indio_dev->channels[0].scan_type.storagebits / 8;
if (ring->scan_timestamp) {
@@ -544,7 +546,7 @@ static irqreturn_t ad7192_trigger_handler(int irq, void *p)
s64 dat64[2];
s32 *dat32 = (s32 *)dat64;
- if (ring->scan_count)
+ if (!bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength))
__ad7192_read_reg(st, 1, 1, AD7192_REG_DATA,
dat32,
indio_dev->channels[0].scan_type.realbits/8);
diff --git a/drivers/staging/iio/adc/ad7298_ring.c b/drivers/staging/iio/adc/ad7298_ring.c
index 611e212..5695eb2 100644
--- a/drivers/staging/iio/adc/ad7298_ring.c
+++ b/drivers/staging/iio/adc/ad7298_ring.c
@@ -61,8 +61,9 @@ static int ad7298_ring_preenable(struct iio_dev *indio_dev)
size_t d_size;
int i, m;
unsigned short command;
-
- d_size = ring->scan_count * (AD7298_STORAGE_BITS / 8);
+ int scan_count = bitmap_weight(indio_dev->active_scan_mask,
+ indio_dev->masklength);
+ d_size = scan_count * (AD7298_STORAGE_BITS / 8);
if (ring->scan_timestamp) {
d_size += sizeof(s64);
@@ -79,7 +80,7 @@ static int ad7298_ring_preenable(struct iio_dev *indio_dev)
command = AD7298_WRITE | st->ext_ref;
for (i = 0, m = AD7298_CH(0); i < AD7298_MAX_CHAN; i++, m >>= 1)
- if (test_bit(i, ring->scan_mask))
+ if (test_bit(i, indio_dev->active_scan_mask))
command |= m;
st->tx_buf[0] = cpu_to_be16(command);
@@ -96,7 +97,7 @@ static int ad7298_ring_preenable(struct iio_dev *indio_dev)
spi_message_add_tail(&st->ring_xfer[0], &st->ring_msg);
spi_message_add_tail(&st->ring_xfer[1], &st->ring_msg);
- for (i = 0; i < ring->scan_count; i++) {
+ for (i = 0; i < scan_count; i++) {
st->ring_xfer[i + 2].rx_buf = &st->rx_buf[i];
st->ring_xfer[i + 2].len = 2;
st->ring_xfer[i + 2].cs_change = 1;
@@ -134,7 +135,8 @@ static irqreturn_t ad7298_trigger_handler(int irq, void *p)
&time_ns, sizeof(time_ns));
}
- for (i = 0; i < ring->scan_count; i++)
+ for (i = 0; i < bitmap_weight(indio_dev->active_scan_mask,
+ indio_dev->masklength); i++)
buf[i] = be16_to_cpu(st->rx_buf[i]);
indio_dev->buffer->access->store_to(ring, (u8 *)buf, time_ns);
diff --git a/drivers/staging/iio/adc/ad7476_ring.c b/drivers/staging/iio/adc/ad7476_ring.c
index 2dad7f8..ff0656a 100644
--- a/drivers/staging/iio/adc/ad7476_ring.c
+++ b/drivers/staging/iio/adc/ad7476_ring.c
@@ -56,7 +56,8 @@ 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 = ring->scan_count *
+ 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) {
diff --git a/drivers/staging/iio/adc/ad7793.c b/drivers/staging/iio/adc/ad7793.c
index 8a0729c..432f60e 100644
--- a/drivers/staging/iio/adc/ad7793.c
+++ b/drivers/staging/iio/adc/ad7793.c
@@ -342,14 +342,15 @@ static int ad7793_ring_preenable(struct iio_dev *indio_dev)
size_t d_size;
unsigned channel;
- if (!ring->scan_count)
+ if (bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength))
return -EINVAL;
- channel = find_first_bit(ring->scan_mask,
+ channel = find_first_bit(indio_dev->active_scan_mask,
indio_dev->masklength);
- d_size = ring->scan_count *
- indio_dev->channels[0].scan_type.storagebits / 8;
+ d_size = bitmap_weight(indio_dev->active_scan_mask,
+ indio_dev->masklength) *
+ indio_dev->channels[0].scan_type.storagebits / 8;
if (ring->scan_timestamp) {
d_size += sizeof(s64);
@@ -411,7 +412,7 @@ static irqreturn_t ad7793_trigger_handler(int irq, void *p)
s64 dat64[2];
s32 *dat32 = (s32 *)dat64;
- if (ring->scan_count)
+ if (!bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength))
__ad7793_read_reg(st, 1, 1, AD7793_REG_DATA,
dat32,
indio_dev->channels[0].scan_type.realbits/8);
diff --git a/drivers/staging/iio/adc/ad7887_ring.c b/drivers/staging/iio/adc/ad7887_ring.c
index fee338c..f53a663 100644
--- a/drivers/staging/iio/adc/ad7887_ring.c
+++ b/drivers/staging/iio/adc/ad7887_ring.c
@@ -65,7 +65,8 @@ static int ad7887_ring_preenable(struct iio_dev *indio_dev)
struct ad7887_state *st = iio_priv(indio_dev);
struct iio_buffer *ring = indio_dev->buffer;
- st->d_size = ring->scan_count *
+ 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) {
@@ -80,7 +81,7 @@ static int ad7887_ring_preenable(struct iio_dev *indio_dev)
set_bytes_per_datum(indio_dev->buffer, st->d_size);
/* We know this is a single long so can 'cheat' */
- switch (*ring->scan_mask) {
+ switch (*indio_dev->active_scan_mask) {
case (1 << 0):
st->ring_msg = &st->msg[AD7887_CH0];
break;
@@ -121,7 +122,8 @@ static irqreturn_t ad7887_trigger_handler(int irq, void *p)
__u8 *buf;
int b_sent;
- unsigned int bytes = ring->scan_count *
+ unsigned int bytes = bitmap_weight(indio_dev->active_scan_mask,
+ indio_dev->masklength) *
st->chip_info->channel[0].scan_type.storagebits / 8;
buf = kzalloc(st->d_size, GFP_KERNEL);
diff --git a/drivers/staging/iio/adc/ad799x_ring.c b/drivers/staging/iio/adc/ad799x_ring.c
index 50c1216..5841c3c 100644
--- a/drivers/staging/iio/adc/ad799x_ring.c
+++ b/drivers/staging/iio/adc/ad799x_ring.c
@@ -71,9 +71,10 @@ static int ad799x_ring_preenable(struct iio_dev *indio_dev)
*/
if (st->id == ad7997 || st->id == ad7998)
- ad7997_8_set_scan_mode(st, *ring->scan_mask);
+ ad7997_8_set_scan_mode(st, *indio_dev->active_scan_mask);
- st->d_size = ring->scan_count * 2;
+ st->d_size = bitmap_weight(indio_dev->active_scan_mask,
+ indio_dev->masklength) * 2;
if (ring->scan_timestamp) {
st->d_size += sizeof(s64);
@@ -115,12 +116,13 @@ static irqreturn_t ad799x_trigger_handler(int irq, void *p)
case ad7991:
case ad7995:
case ad7999:
- cmd = st->config | (*ring->scan_mask << AD799X_CHANNEL_SHIFT);
+ cmd = st->config |
+ (*indio_dev->active_scan_mask << AD799X_CHANNEL_SHIFT);
break;
case ad7992:
case ad7993:
case ad7994:
- cmd = (*ring->scan_mask << AD799X_CHANNEL_SHIFT) |
+ cmd = (*indio_dev->active_scan_mask << AD799X_CHANNEL_SHIFT) |
AD7998_CONV_RES_REG;
break;
case ad7997:
@@ -132,7 +134,8 @@ static irqreturn_t ad799x_trigger_handler(int irq, void *p)
}
b_sent = i2c_smbus_read_i2c_block_data(st->client,
- cmd, ring->scan_count * 2, rxbuf);
+ cmd, bitmap_weight(indio_dev->active_scan_mask,
+ indio_dev->masklength) * 2, rxbuf);
if (b_sent < 0)
goto done;
diff --git a/drivers/staging/iio/buffer.h b/drivers/staging/iio/buffer.h
index 58c7571..7fc0894 100644
--- a/drivers/staging/iio/buffer.h
+++ b/drivers/staging/iio/buffer.h
@@ -73,7 +73,6 @@ struct iio_buffer_access_funcs {
* @bytes_per_datum: [DEVICE] size of individual datum including timestamp
* @scan_el_attrs: [DRIVER] control of scan elements if that scan mode
* control method is used
- * @scan_count: [INTERN] the number of elements in the current scan mode
* @scan_mask: [INTERN] bitmask used in masking scan mode elements
* @scan_timestamp: [INTERN] does the scan mode include a timestamp
* @access: [DRIVER] buffer access functions associated with the
@@ -88,7 +87,6 @@ struct iio_buffer {
int length;
int bytes_per_datum;
struct attribute_group *scan_el_attrs;
- int scan_count;
long *scan_mask;
bool scan_timestamp;
unsigned scan_index_timestamp;
diff --git a/drivers/staging/iio/gyro/adis16260_ring.c b/drivers/staging/iio/gyro/adis16260_ring.c
index 446d78f..88e96af 100644
--- a/drivers/staging/iio/gyro/adis16260_ring.c
+++ b/drivers/staging/iio/gyro/adis16260_ring.c
@@ -74,9 +74,10 @@ static irqreturn_t adis16260_trigger_handler(int irq, void *p)
return -ENOMEM;
}
- if (ring->scan_count &&
+ if (!bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength) &&
adis16260_read_ring_data(&indio_dev->dev, st->rx) >= 0)
- for (; i < ring->scan_count; i++)
+ for (; i < bitmap_weight(indio_dev->active_scan_mask,
+ indio_dev->masklength); i++)
data[i] = be16_to_cpup((__be16 *)&(st->rx[i*2]));
/* Guaranteed to be aligned with 8 byte boundary */
diff --git a/drivers/staging/iio/iio_simple_dummy_buffer.c b/drivers/staging/iio/iio_simple_dummy_buffer.c
index ce098be..59e3186 100644
--- a/drivers/staging/iio/iio_simple_dummy_buffer.c
+++ b/drivers/staging/iio/iio_simple_dummy_buffer.c
@@ -57,7 +57,7 @@ static irqreturn_t iio_simple_dummy_trigger_h(int irq, void *p)
if (data == NULL)
return -ENOMEM;
- if (buffer->scan_count) {
+ if (!bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength)) {
/*
* Three common options here:
* hardware scans: certain combinations of channels make
@@ -75,7 +75,10 @@ static irqreturn_t iio_simple_dummy_trigger_h(int irq, void *p)
* in the constant table fakedata.
*/
int i, j;
- for (i = 0, j = 0; i < buffer->scan_count; i++) {
+ for (i = 0, j = 0;
+ i < bitmap_weight(indio_dev->active_scan_mask,
+ indio_dev->masklength);
+ i++) {
j = find_next_bit(buffer->scan_mask,
indio_dev->masklength, j + 1);
/* random access read form the 'device' */
diff --git a/drivers/staging/iio/impedance-analyzer/ad5933.c b/drivers/staging/iio/impedance-analyzer/ad5933.c
index b059b78..23241c4 100644
--- a/drivers/staging/iio/impedance-analyzer/ad5933.c
+++ b/drivers/staging/iio/impedance-analyzer/ad5933.c
@@ -537,14 +537,14 @@ static const struct iio_info ad5933_info = {
static int ad5933_ring_preenable(struct iio_dev *indio_dev)
{
struct ad5933_state *st = iio_priv(indio_dev);
- struct iio_buffer *ring = indio_dev->buffer;
size_t d_size;
int ret;
- if (!ring->scan_count)
+ if (bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength))
return -EINVAL;
- d_size = ring->scan_count *
+ d_size = bitmap_weight(indio_dev->active_scan_mask,
+ indio_dev->masklength) *
ad5933_channels[1].scan_type.storagebits / 8;
if (indio_dev->buffer->access->set_bytes_per_datum)
@@ -640,12 +640,14 @@ static void ad5933_work(struct work_struct *work)
ad5933_i2c_read(st->client, AD5933_REG_STATUS, 1, &status);
if (status & AD5933_STAT_DATA_VALID) {
+ int scan_count = bitmap_weight(indio_dev->active_scan_mask,
+ indio_dev->masklength);
ad5933_i2c_read(st->client,
- test_bit(1, ring->scan_mask) ?
+ test_bit(1, indio_dev->active_scan_mask) ?
AD5933_REG_REAL_DATA : AD5933_REG_IMAG_DATA,
- ring->scan_count * 2, (u8 *)buf);
+ scan_count * 2, (u8 *)buf);
- if (ring->scan_count == 2) {
+ if (scan_count == 2) {
buf[0] = be16_to_cpu(buf[0]);
buf[1] = be16_to_cpu(buf[1]);
} else {
diff --git a/drivers/staging/iio/imu/adis16400_ring.c b/drivers/staging/iio/imu/adis16400_ring.c
index e8aaa84..249d11f 100644
--- a/drivers/staging/iio/imu/adis16400_ring.c
+++ b/drivers/staging/iio/imu/adis16400_ring.c
@@ -79,14 +79,16 @@ static int adis16350_spi_read_all(struct device *dev, u8 *rx)
struct spi_message msg;
int i, j = 0, ret;
struct spi_transfer *xfers;
+ int scan_count = bitmap_weight(indio_dev->active_scan_mask,
+ indio_dev->masklength);
- xfers = kzalloc(sizeof(*xfers)*indio_dev->buffer->scan_count + 1,
+ xfers = kzalloc(sizeof(*xfers)*(scan_count + 1),
GFP_KERNEL);
if (xfers == NULL)
return -ENOMEM;
for (i = 0; i < ARRAY_SIZE(read_all_tx_array); i++)
- if (test_bit(i, indio_dev->buffer->scan_mask)) {
+ if (test_bit(i, indio_dev->active_scan_mask)) {
xfers[j].tx_buf = &read_all_tx_array[i];
xfers[j].bits_per_word = 16;
xfers[j].len = 2;
@@ -97,7 +99,7 @@ static int adis16350_spi_read_all(struct device *dev, u8 *rx)
xfers[j].len = 2;
spi_message_init(&msg);
- for (j = 0; j < indio_dev->buffer->scan_count + 1; j++)
+ for (j = 0; j < scan_count + 1; j++)
spi_message_add_tail(&xfers[j], &msg);
ret = spi_sync(st->us, &msg);
@@ -119,26 +121,27 @@ static irqreturn_t adis16400_trigger_handler(int irq, void *p)
s16 *data;
size_t datasize = ring->access->get_bytes_per_datum(ring);
/* Asumption that long is enough for maximum channels */
- unsigned long mask = *ring->scan_mask;
-
+ unsigned long mask = *indio_dev->active_scan_mask;
+ int scan_count = bitmap_weight(indio_dev->active_scan_mask,
+ indio_dev->masklength);
data = kmalloc(datasize , GFP_KERNEL);
if (data == NULL) {
dev_err(&st->us->dev, "memory alloc failed in ring bh");
return -ENOMEM;
}
- if (ring->scan_count) {
+ if (scan_count) {
if (st->variant->flags & ADIS16400_NO_BURST) {
ret = adis16350_spi_read_all(&indio_dev->dev, st->rx);
if (ret < 0)
goto err;
- for (; i < ring->scan_count; i++)
+ for (; i < scan_count; i++)
data[i] = *(s16 *)(st->rx + i*2);
} else {
ret = adis16400_spi_read_burst(&indio_dev->dev, st->rx);
if (ret < 0)
goto err;
- for (; i < indio_dev->buffer->scan_count; i++) {
+ for (; i < scan_count; i++) {
j = __ffs(mask);
mask &= ~(1 << j);
data[i] = be16_to_cpup(
diff --git a/drivers/staging/iio/industrialio-buffer.c b/drivers/staging/iio/industrialio-buffer.c
index c1c97e1..79f1543 100644
--- a/drivers/staging/iio/industrialio-buffer.c
+++ b/drivers/staging/iio/industrialio-buffer.c
@@ -138,7 +138,6 @@ static ssize_t iio_scan_el_show(struct device *dev,
static int iio_scan_mask_clear(struct iio_buffer *buffer, int bit)
{
clear_bit(bit, buffer->scan_mask);
- buffer->scan_count--;
return 0;
}
@@ -613,7 +612,6 @@ int iio_scan_mask_set(struct iio_buffer *buffer, int bit)
}
}
bitmap_copy(buffer->scan_mask, trialmask, indio_dev->masklength);
- buffer->scan_count++;
kfree(trialmask);
diff --git a/drivers/staging/iio/meter/ade7758_ring.c b/drivers/staging/iio/meter/ade7758_ring.c
index 464713a..028470c 100644
--- a/drivers/staging/iio/meter/ade7758_ring.c
+++ b/drivers/staging/iio/meter/ade7758_ring.c
@@ -67,7 +67,7 @@ static irqreturn_t ade7758_trigger_handler(int irq, void *p)
s64 dat64[2];
u32 *dat32 = (u32 *)dat64;
- if (ring->scan_count)
+ if (!bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength))
if (ade7758_spi_read_burst(&indio_dev->dev) >= 0)
*dat32 = get_unaligned_be32(&st->rx_buf[5]) & 0xFFFFFF;
@@ -96,10 +96,11 @@ static int ade7758_ring_preenable(struct iio_dev *indio_dev)
size_t d_size;
unsigned channel;
- if (!ring->scan_count)
+ if (!bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength))
return -EINVAL;
- channel = find_first_bit(ring->scan_mask, indio_dev->masklength);
+ channel = find_first_bit(indio_dev->active_scan_mask,
+ indio_dev->masklength);
d_size = st->ade7758_ring_channels[channel].scan_type.storagebits / 8;
--
1.7.7.3
^ permalink raw reply related [flat|nested] 20+ messages in thread* Re: [PATCH 04/16] staging:iio: scrap scan_count and ensure all drivers use active_scan_mask
2011-11-27 13:33 ` [PATCH 04/16] staging:iio: scrap scan_count and ensure all drivers use active_scan_mask Jonathan Cameron
@ 2011-11-28 9:45 ` Lars-Peter Clausen
2011-11-28 16:15 ` Lars-Peter Clausen
0 siblings, 1 reply; 20+ messages in thread
From: Lars-Peter Clausen @ 2011-11-28 9:45 UTC (permalink / raw)
To: Jonathan Cameron
Cc: linux-iio, Michael.Hennerich, manuel.stahl, Jonathan Cameron
On 11/27/2011 02:33 PM, Jonathan Cameron wrote:
> From: Jonathan Cameron <jic23@cam.ac.uk>
>
> Obviously drivers should only use this for pushing to buffers.
> They need buffer->scan_mask for pulling from them post demux.
>
> Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
> ---
> drivers/staging/iio/accel/adis16201_ring.c | 10 +++++-----
> drivers/staging/iio/accel/adis16203_ring.c | 10 +++++-----
> drivers/staging/iio/accel/adis16204_ring.c | 10 +++++-----
> drivers/staging/iio/accel/adis16209_ring.c | 5 +++--
> drivers/staging/iio/accel/adis16240_ring.c | 5 +++--
> drivers/staging/iio/accel/lis3l02dq_ring.c | 23 +++++++++++++----------
> drivers/staging/iio/adc/ad7192.c | 10 ++++++----
> drivers/staging/iio/adc/ad7298_ring.c | 12 +++++++-----
> drivers/staging/iio/adc/ad7476_ring.c | 3 ++-
> drivers/staging/iio/adc/ad7793.c | 11 ++++++-----
> drivers/staging/iio/adc/ad7887_ring.c | 8 +++++---
> drivers/staging/iio/adc/ad799x_ring.c | 13 ++++++++-----
> drivers/staging/iio/buffer.h | 2 --
> drivers/staging/iio/gyro/adis16260_ring.c | 5 +++--
> drivers/staging/iio/iio_simple_dummy_buffer.c | 7 +++++--
> drivers/staging/iio/impedance-analyzer/ad5933.c | 14 ++++++++------
> drivers/staging/iio/imu/adis16400_ring.c | 19 +++++++++++--------
> drivers/staging/iio/industrialio-buffer.c | 2 --
> drivers/staging/iio/meter/ade7758_ring.c | 7 ++++---
> 19 files changed, 99 insertions(+), 77 deletions(-)
>
> diff --git a/drivers/staging/iio/accel/adis16201_ring.c b/drivers/staging/iio/accel/adis16201_ring.c
> index 936e8cb..68d4b38 100644
> --- a/drivers/staging/iio/accel/adis16201_ring.c
> +++ b/drivers/staging/iio/accel/adis16201_ring.c
> @@ -74,11 +74,11 @@ static irqreturn_t adis16201_trigger_handler(int irq, void *p)
> return -ENOMEM;
> }
>
> - if (ring->scan_count)
> - if (adis16201_read_ring_data(indio_dev, st->rx) >= 0)
> - for (; i < ring->scan_count; i++)
> - data[i] = be16_to_cpup(
> - (__be16 *)&(st->rx[i*2]));
> + if (!bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength)
> + && adis16201_read_ring_data(indio_dev, st->rx) >= 0)
> + for (; i < bitmap_weight(indio_dev->active_scan_mask,
> + indio_dev->masklength); i++)
> + data[i] = be16_to_cpup((__be16 *)&(st->rx[i*2]));
>
Does it really make sense to recompute bitmap_weight for each transfer?
Can't we update scan_count once, when we update the scan_mask?
> /* Guaranteed to be aligned with 8 byte boundary */
> if (ring->scan_timestamp)
> diff --git a/drivers/staging/iio/accel/adis16203_ring.c b/drivers/staging/iio/accel/adis16203_ring.c
> index d41a50b..0f9d18a 100644
> --- a/drivers/staging/iio/accel/adis16203_ring.c
> +++ b/drivers/staging/iio/accel/adis16203_ring.c
> @@ -74,11 +74,11 @@ static irqreturn_t adis16203_trigger_handler(int irq, void *p)
> return -ENOMEM;
> }
>
> - if (ring->scan_count)
> - if (adis16203_read_ring_data(&indio_dev->dev, st->rx) >= 0)
> - for (; i < ring->scan_count; i++)
> - data[i] = be16_to_cpup(
> - (__be16 *)&(st->rx[i*2]));
> + if (!bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength) &&
> + adis16203_read_ring_data(&indio_dev->dev, st->rx) >= 0)
> + for (; i < bitmap_weight(indio_dev->active_scan_mask,
> + indio_dev->masklength); i++)
> + data[i] = be16_to_cpup((__be16 *)&(st->rx[i*2]));
>
> /* Guaranteed to be aligned with 8 byte boundary */
> if (ring->scan_timestamp)
> diff --git a/drivers/staging/iio/accel/adis16204_ring.c b/drivers/staging/iio/accel/adis16204_ring.c
> index d05d311..8010c1d 100644
> --- a/drivers/staging/iio/accel/adis16204_ring.c
> +++ b/drivers/staging/iio/accel/adis16204_ring.c
> @@ -71,11 +71,11 @@ static irqreturn_t adis16204_trigger_handler(int irq, void *p)
> return -ENOMEM;
> }
>
> - if (ring->scan_count)
> - if (adis16204_read_ring_data(&indio_dev->dev, st->rx) >= 0)
> - for (; i < ring->scan_count; i++)
> - data[i] = be16_to_cpup(
> - (__be16 *)&(st->rx[i*2]));
> + if (!bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength) &&
> + adis16204_read_ring_data(&indio_dev->dev, st->rx) >= 0)
> + for (; i < bitmap_weight(indio_dev->active_scan_mask,
> + indio_dev->masklength); i++)
> + data[i] = be16_to_cpup((__be16 *)&(st->rx[i*2]));
>
> /* Guaranteed to be aligned with 8 byte boundary */
> if (ring->scan_timestamp)
> diff --git a/drivers/staging/iio/accel/adis16209_ring.c b/drivers/staging/iio/accel/adis16209_ring.c
> index da9946a..8629fea 100644
> --- a/drivers/staging/iio/accel/adis16209_ring.c
> +++ b/drivers/staging/iio/accel/adis16209_ring.c
> @@ -72,9 +72,10 @@ static irqreturn_t adis16209_trigger_handler(int irq, void *p)
> return -ENOMEM;
> }
>
> - if (ring->scan_count &&
> + if (!bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength) &&
> adis16209_read_ring_data(&indio_dev->dev, st->rx) >= 0)
> - for (; i < ring->scan_count; i++)
> + for (; i < bitmap_weight(indio_dev->active_scan_mask,
> + indio_dev->masklength); i++)
> data[i] = be16_to_cpup((__be16 *)&(st->rx[i*2]));
>
> /* Guaranteed to be aligned with 8 byte boundary */
> diff --git a/drivers/staging/iio/accel/adis16240_ring.c b/drivers/staging/iio/accel/adis16240_ring.c
> index aa215b9..9a3dba2 100644
> --- a/drivers/staging/iio/accel/adis16240_ring.c
> +++ b/drivers/staging/iio/accel/adis16240_ring.c
> @@ -69,9 +69,10 @@ static irqreturn_t adis16240_trigger_handler(int irq, void *p)
> return -ENOMEM;
> }
>
> - if (ring->scan_count &&
> + if (!bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength) &&
> adis16240_read_ring_data(&indio_dev->dev, st->rx) >= 0)
> - for (; i < ring->scan_count; i++)
> + for (; i < bitmap_weight(indio_dev->active_scan_mask,
> + indio_dev->masklength); i++)
> data[i] = be16_to_cpup((__be16 *)&(st->rx[i*2]));
>
> /* Guaranteed to be aligned with 8 byte boundary */
> diff --git a/drivers/staging/iio/accel/lis3l02dq_ring.c b/drivers/staging/iio/accel/lis3l02dq_ring.c
> index 1d36050..4d40505 100644
> --- a/drivers/staging/iio/accel/lis3l02dq_ring.c
> +++ b/drivers/staging/iio/accel/lis3l02dq_ring.c
> @@ -87,13 +87,13 @@ 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 = kzalloc((buffer->scan_count) * 2
> + xfers = kzalloc(bitmap_weight(indio_dev->active_scan_mask,
> + indio_dev->masklength) * 2
> * sizeof(*xfers), GFP_KERNEL);
> if (!xfers)
> return -ENOMEM;
> @@ -101,7 +101,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 (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];
> @@ -129,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);
> @@ -145,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);
> @@ -175,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 */
> @@ -363,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
> diff --git a/drivers/staging/iio/adc/ad7192.c b/drivers/staging/iio/adc/ad7192.c
> index ad6cef5..1b6ecc8 100644
> --- a/drivers/staging/iio/adc/ad7192.c
> +++ b/drivers/staging/iio/adc/ad7192.c
> @@ -479,12 +479,14 @@ static int ad7192_ring_preenable(struct iio_dev *indio_dev)
> size_t d_size;
> unsigned channel;
>
> - if (!ring->scan_count)
> + if (bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength))
> return -EINVAL;
>
> - channel = find_first_bit(ring->scan_mask, indio_dev->masklength);
> + channel = find_first_bit(indio_dev->active_scan_mask,
> + indio_dev->masklength);
>
> - d_size = ring->scan_count *
> + d_size = bitmap_weight(indio_dev->active_scan_mask,
> + indio_dev->masklength) *
> indio_dev->channels[0].scan_type.storagebits / 8;
>
> if (ring->scan_timestamp) {
> @@ -544,7 +546,7 @@ static irqreturn_t ad7192_trigger_handler(int irq, void *p)
> s64 dat64[2];
> s32 *dat32 = (s32 *)dat64;
>
> - if (ring->scan_count)
> + if (!bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength))
> __ad7192_read_reg(st, 1, 1, AD7192_REG_DATA,
> dat32,
> indio_dev->channels[0].scan_type.realbits/8);
> diff --git a/drivers/staging/iio/adc/ad7298_ring.c b/drivers/staging/iio/adc/ad7298_ring.c
> index 611e212..5695eb2 100644
> --- a/drivers/staging/iio/adc/ad7298_ring.c
> +++ b/drivers/staging/iio/adc/ad7298_ring.c
> @@ -61,8 +61,9 @@ static int ad7298_ring_preenable(struct iio_dev *indio_dev)
> size_t d_size;
> int i, m;
> unsigned short command;
> -
> - d_size = ring->scan_count * (AD7298_STORAGE_BITS / 8);
> + int scan_count = bitmap_weight(indio_dev->active_scan_mask,
> + indio_dev->masklength);
> + d_size = scan_count * (AD7298_STORAGE_BITS / 8);
>
> if (ring->scan_timestamp) {
> d_size += sizeof(s64);
> @@ -79,7 +80,7 @@ static int ad7298_ring_preenable(struct iio_dev *indio_dev)
> command = AD7298_WRITE | st->ext_ref;
>
> for (i = 0, m = AD7298_CH(0); i < AD7298_MAX_CHAN; i++, m >>= 1)
> - if (test_bit(i, ring->scan_mask))
> + if (test_bit(i, indio_dev->active_scan_mask))
> command |= m;
>
> st->tx_buf[0] = cpu_to_be16(command);
> @@ -96,7 +97,7 @@ static int ad7298_ring_preenable(struct iio_dev *indio_dev)
> spi_message_add_tail(&st->ring_xfer[0], &st->ring_msg);
> spi_message_add_tail(&st->ring_xfer[1], &st->ring_msg);
>
> - for (i = 0; i < ring->scan_count; i++) {
> + for (i = 0; i < scan_count; i++) {
> st->ring_xfer[i + 2].rx_buf = &st->rx_buf[i];
> st->ring_xfer[i + 2].len = 2;
> st->ring_xfer[i + 2].cs_change = 1;
> @@ -134,7 +135,8 @@ static irqreturn_t ad7298_trigger_handler(int irq, void *p)
> &time_ns, sizeof(time_ns));
> }
>
> - for (i = 0; i < ring->scan_count; i++)
> + for (i = 0; i < bitmap_weight(indio_dev->active_scan_mask,
> + indio_dev->masklength); i++)
> buf[i] = be16_to_cpu(st->rx_buf[i]);
>
> indio_dev->buffer->access->store_to(ring, (u8 *)buf, time_ns);
> diff --git a/drivers/staging/iio/adc/ad7476_ring.c b/drivers/staging/iio/adc/ad7476_ring.c
> index 2dad7f8..ff0656a 100644
> --- a/drivers/staging/iio/adc/ad7476_ring.c
> +++ b/drivers/staging/iio/adc/ad7476_ring.c
> @@ -56,7 +56,8 @@ 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 = ring->scan_count *
> + 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) {
> diff --git a/drivers/staging/iio/adc/ad7793.c b/drivers/staging/iio/adc/ad7793.c
> index 8a0729c..432f60e 100644
> --- a/drivers/staging/iio/adc/ad7793.c
> +++ b/drivers/staging/iio/adc/ad7793.c
> @@ -342,14 +342,15 @@ static int ad7793_ring_preenable(struct iio_dev *indio_dev)
> size_t d_size;
> unsigned channel;
>
> - if (!ring->scan_count)
> + if (bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength))
> return -EINVAL;
>
> - channel = find_first_bit(ring->scan_mask,
> + channel = find_first_bit(indio_dev->active_scan_mask,
> indio_dev->masklength);
>
> - d_size = ring->scan_count *
> - indio_dev->channels[0].scan_type.storagebits / 8;
> + d_size = bitmap_weight(indio_dev->active_scan_mask,
> + indio_dev->masklength) *
> + indio_dev->channels[0].scan_type.storagebits / 8;
>
> if (ring->scan_timestamp) {
> d_size += sizeof(s64);
> @@ -411,7 +412,7 @@ static irqreturn_t ad7793_trigger_handler(int irq, void *p)
> s64 dat64[2];
> s32 *dat32 = (s32 *)dat64;
>
> - if (ring->scan_count)
> + if (!bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength))
> __ad7793_read_reg(st, 1, 1, AD7793_REG_DATA,
> dat32,
> indio_dev->channels[0].scan_type.realbits/8);
> diff --git a/drivers/staging/iio/adc/ad7887_ring.c b/drivers/staging/iio/adc/ad7887_ring.c
> index fee338c..f53a663 100644
> --- a/drivers/staging/iio/adc/ad7887_ring.c
> +++ b/drivers/staging/iio/adc/ad7887_ring.c
> @@ -65,7 +65,8 @@ static int ad7887_ring_preenable(struct iio_dev *indio_dev)
> struct ad7887_state *st = iio_priv(indio_dev);
> struct iio_buffer *ring = indio_dev->buffer;
>
> - st->d_size = ring->scan_count *
> + 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) {
> @@ -80,7 +81,7 @@ static int ad7887_ring_preenable(struct iio_dev *indio_dev)
> set_bytes_per_datum(indio_dev->buffer, st->d_size);
>
> /* We know this is a single long so can 'cheat' */
> - switch (*ring->scan_mask) {
> + switch (*indio_dev->active_scan_mask) {
> case (1 << 0):
> st->ring_msg = &st->msg[AD7887_CH0];
> break;
> @@ -121,7 +122,8 @@ static irqreturn_t ad7887_trigger_handler(int irq, void *p)
> __u8 *buf;
> int b_sent;
>
> - unsigned int bytes = ring->scan_count *
> + unsigned int bytes = bitmap_weight(indio_dev->active_scan_mask,
> + indio_dev->masklength) *
> st->chip_info->channel[0].scan_type.storagebits / 8;
>
> buf = kzalloc(st->d_size, GFP_KERNEL);
> diff --git a/drivers/staging/iio/adc/ad799x_ring.c b/drivers/staging/iio/adc/ad799x_ring.c
> index 50c1216..5841c3c 100644
> --- a/drivers/staging/iio/adc/ad799x_ring.c
> +++ b/drivers/staging/iio/adc/ad799x_ring.c
> @@ -71,9 +71,10 @@ static int ad799x_ring_preenable(struct iio_dev *indio_dev)
> */
>
> if (st->id == ad7997 || st->id == ad7998)
> - ad7997_8_set_scan_mode(st, *ring->scan_mask);
> + ad7997_8_set_scan_mode(st, *indio_dev->active_scan_mask);
>
> - st->d_size = ring->scan_count * 2;
> + st->d_size = bitmap_weight(indio_dev->active_scan_mask,
> + indio_dev->masklength) * 2;
>
> if (ring->scan_timestamp) {
> st->d_size += sizeof(s64);
> @@ -115,12 +116,13 @@ static irqreturn_t ad799x_trigger_handler(int irq, void *p)
> case ad7991:
> case ad7995:
> case ad7999:
> - cmd = st->config | (*ring->scan_mask << AD799X_CHANNEL_SHIFT);
> + cmd = st->config |
> + (*indio_dev->active_scan_mask << AD799X_CHANNEL_SHIFT);
> break;
> case ad7992:
> case ad7993:
> case ad7994:
> - cmd = (*ring->scan_mask << AD799X_CHANNEL_SHIFT) |
> + cmd = (*indio_dev->active_scan_mask << AD799X_CHANNEL_SHIFT) |
> AD7998_CONV_RES_REG;
> break;
> case ad7997:
> @@ -132,7 +134,8 @@ static irqreturn_t ad799x_trigger_handler(int irq, void *p)
> }
>
> b_sent = i2c_smbus_read_i2c_block_data(st->client,
> - cmd, ring->scan_count * 2, rxbuf);
> + cmd, bitmap_weight(indio_dev->active_scan_mask,
> + indio_dev->masklength) * 2, rxbuf);
> if (b_sent < 0)
> goto done;
>
> diff --git a/drivers/staging/iio/buffer.h b/drivers/staging/iio/buffer.h
> index 58c7571..7fc0894 100644
> --- a/drivers/staging/iio/buffer.h
> +++ b/drivers/staging/iio/buffer.h
> @@ -73,7 +73,6 @@ struct iio_buffer_access_funcs {
> * @bytes_per_datum: [DEVICE] size of individual datum including timestamp
> * @scan_el_attrs: [DRIVER] control of scan elements if that scan mode
> * control method is used
> - * @scan_count: [INTERN] the number of elements in the current scan mode
> * @scan_mask: [INTERN] bitmask used in masking scan mode elements
> * @scan_timestamp: [INTERN] does the scan mode include a timestamp
> * @access: [DRIVER] buffer access functions associated with the
> @@ -88,7 +87,6 @@ struct iio_buffer {
> int length;
> int bytes_per_datum;
> struct attribute_group *scan_el_attrs;
> - int scan_count;
> long *scan_mask;
> bool scan_timestamp;
> unsigned scan_index_timestamp;
> diff --git a/drivers/staging/iio/gyro/adis16260_ring.c b/drivers/staging/iio/gyro/adis16260_ring.c
> index 446d78f..88e96af 100644
> --- a/drivers/staging/iio/gyro/adis16260_ring.c
> +++ b/drivers/staging/iio/gyro/adis16260_ring.c
> @@ -74,9 +74,10 @@ static irqreturn_t adis16260_trigger_handler(int irq, void *p)
> return -ENOMEM;
> }
>
> - if (ring->scan_count &&
> + if (!bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength) &&
> adis16260_read_ring_data(&indio_dev->dev, st->rx) >= 0)
> - for (; i < ring->scan_count; i++)
> + for (; i < bitmap_weight(indio_dev->active_scan_mask,
> + indio_dev->masklength); i++)
> data[i] = be16_to_cpup((__be16 *)&(st->rx[i*2]));
>
> /* Guaranteed to be aligned with 8 byte boundary */
> diff --git a/drivers/staging/iio/iio_simple_dummy_buffer.c b/drivers/staging/iio/iio_simple_dummy_buffer.c
> index ce098be..59e3186 100644
> --- a/drivers/staging/iio/iio_simple_dummy_buffer.c
> +++ b/drivers/staging/iio/iio_simple_dummy_buffer.c
> @@ -57,7 +57,7 @@ static irqreturn_t iio_simple_dummy_trigger_h(int irq, void *p)
> if (data == NULL)
> return -ENOMEM;
>
> - if (buffer->scan_count) {
> + if (!bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength)) {
> /*
> * Three common options here:
> * hardware scans: certain combinations of channels make
> @@ -75,7 +75,10 @@ static irqreturn_t iio_simple_dummy_trigger_h(int irq, void *p)
> * in the constant table fakedata.
> */
> int i, j;
> - for (i = 0, j = 0; i < buffer->scan_count; i++) {
> + for (i = 0, j = 0;
> + i < bitmap_weight(indio_dev->active_scan_mask,
> + indio_dev->masklength);
> + i++) {
> j = find_next_bit(buffer->scan_mask,
> indio_dev->masklength, j + 1);
> /* random access read form the 'device' */
> diff --git a/drivers/staging/iio/impedance-analyzer/ad5933.c b/drivers/staging/iio/impedance-analyzer/ad5933.c
> index b059b78..23241c4 100644
> --- a/drivers/staging/iio/impedance-analyzer/ad5933.c
> +++ b/drivers/staging/iio/impedance-analyzer/ad5933.c
> @@ -537,14 +537,14 @@ static const struct iio_info ad5933_info = {
> static int ad5933_ring_preenable(struct iio_dev *indio_dev)
> {
> struct ad5933_state *st = iio_priv(indio_dev);
> - struct iio_buffer *ring = indio_dev->buffer;
> size_t d_size;
> int ret;
>
> - if (!ring->scan_count)
> + if (bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength))
> return -EINVAL;
>
> - d_size = ring->scan_count *
> + d_size = bitmap_weight(indio_dev->active_scan_mask,
> + indio_dev->masklength) *
> ad5933_channels[1].scan_type.storagebits / 8;
>
> if (indio_dev->buffer->access->set_bytes_per_datum)
> @@ -640,12 +640,14 @@ static void ad5933_work(struct work_struct *work)
> ad5933_i2c_read(st->client, AD5933_REG_STATUS, 1, &status);
>
> if (status & AD5933_STAT_DATA_VALID) {
> + int scan_count = bitmap_weight(indio_dev->active_scan_mask,
> + indio_dev->masklength);
> ad5933_i2c_read(st->client,
> - test_bit(1, ring->scan_mask) ?
> + test_bit(1, indio_dev->active_scan_mask) ?
> AD5933_REG_REAL_DATA : AD5933_REG_IMAG_DATA,
> - ring->scan_count * 2, (u8 *)buf);
> + scan_count * 2, (u8 *)buf);
>
> - if (ring->scan_count == 2) {
> + if (scan_count == 2) {
> buf[0] = be16_to_cpu(buf[0]);
> buf[1] = be16_to_cpu(buf[1]);
> } else {
> diff --git a/drivers/staging/iio/imu/adis16400_ring.c b/drivers/staging/iio/imu/adis16400_ring.c
> index e8aaa84..249d11f 100644
> --- a/drivers/staging/iio/imu/adis16400_ring.c
> +++ b/drivers/staging/iio/imu/adis16400_ring.c
> @@ -79,14 +79,16 @@ static int adis16350_spi_read_all(struct device *dev, u8 *rx)
> struct spi_message msg;
> int i, j = 0, ret;
> struct spi_transfer *xfers;
> + int scan_count = bitmap_weight(indio_dev->active_scan_mask,
> + indio_dev->masklength);
>
> - xfers = kzalloc(sizeof(*xfers)*indio_dev->buffer->scan_count + 1,
> + xfers = kzalloc(sizeof(*xfers)*(scan_count + 1),
> GFP_KERNEL);
> if (xfers == NULL)
> return -ENOMEM;
>
> for (i = 0; i < ARRAY_SIZE(read_all_tx_array); i++)
> - if (test_bit(i, indio_dev->buffer->scan_mask)) {
> + if (test_bit(i, indio_dev->active_scan_mask)) {
> xfers[j].tx_buf = &read_all_tx_array[i];
> xfers[j].bits_per_word = 16;
> xfers[j].len = 2;
> @@ -97,7 +99,7 @@ static int adis16350_spi_read_all(struct device *dev, u8 *rx)
> xfers[j].len = 2;
>
> spi_message_init(&msg);
> - for (j = 0; j < indio_dev->buffer->scan_count + 1; j++)
> + for (j = 0; j < scan_count + 1; j++)
> spi_message_add_tail(&xfers[j], &msg);
>
> ret = spi_sync(st->us, &msg);
> @@ -119,26 +121,27 @@ static irqreturn_t adis16400_trigger_handler(int irq, void *p)
> s16 *data;
> size_t datasize = ring->access->get_bytes_per_datum(ring);
> /* Asumption that long is enough for maximum channels */
> - unsigned long mask = *ring->scan_mask;
> -
> + unsigned long mask = *indio_dev->active_scan_mask;
> + int scan_count = bitmap_weight(indio_dev->active_scan_mask,
> + indio_dev->masklength);
> data = kmalloc(datasize , GFP_KERNEL);
> if (data == NULL) {
> dev_err(&st->us->dev, "memory alloc failed in ring bh");
> return -ENOMEM;
> }
>
> - if (ring->scan_count) {
> + if (scan_count) {
> if (st->variant->flags & ADIS16400_NO_BURST) {
> ret = adis16350_spi_read_all(&indio_dev->dev, st->rx);
> if (ret < 0)
> goto err;
> - for (; i < ring->scan_count; i++)
> + for (; i < scan_count; i++)
> data[i] = *(s16 *)(st->rx + i*2);
> } else {
> ret = adis16400_spi_read_burst(&indio_dev->dev, st->rx);
> if (ret < 0)
> goto err;
> - for (; i < indio_dev->buffer->scan_count; i++) {
> + for (; i < scan_count; i++) {
> j = __ffs(mask);
> mask &= ~(1 << j);
> data[i] = be16_to_cpup(
> diff --git a/drivers/staging/iio/industrialio-buffer.c b/drivers/staging/iio/industrialio-buffer.c
> index c1c97e1..79f1543 100644
> --- a/drivers/staging/iio/industrialio-buffer.c
> +++ b/drivers/staging/iio/industrialio-buffer.c
> @@ -138,7 +138,6 @@ static ssize_t iio_scan_el_show(struct device *dev,
> static int iio_scan_mask_clear(struct iio_buffer *buffer, int bit)
> {
> clear_bit(bit, buffer->scan_mask);
> - buffer->scan_count--;
> return 0;
> }
>
> @@ -613,7 +612,6 @@ int iio_scan_mask_set(struct iio_buffer *buffer, int bit)
> }
> }
> bitmap_copy(buffer->scan_mask, trialmask, indio_dev->masklength);
> - buffer->scan_count++;
>
> kfree(trialmask);
>
> diff --git a/drivers/staging/iio/meter/ade7758_ring.c b/drivers/staging/iio/meter/ade7758_ring.c
> index 464713a..028470c 100644
> --- a/drivers/staging/iio/meter/ade7758_ring.c
> +++ b/drivers/staging/iio/meter/ade7758_ring.c
> @@ -67,7 +67,7 @@ static irqreturn_t ade7758_trigger_handler(int irq, void *p)
> s64 dat64[2];
> u32 *dat32 = (u32 *)dat64;
>
> - if (ring->scan_count)
> + if (!bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength))
> if (ade7758_spi_read_burst(&indio_dev->dev) >= 0)
> *dat32 = get_unaligned_be32(&st->rx_buf[5]) & 0xFFFFFF;
>
> @@ -96,10 +96,11 @@ static int ade7758_ring_preenable(struct iio_dev *indio_dev)
> size_t d_size;
> unsigned channel;
>
> - if (!ring->scan_count)
> + if (!bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength))
> return -EINVAL;
>
> - channel = find_first_bit(ring->scan_mask, indio_dev->masklength);
> + channel = find_first_bit(indio_dev->active_scan_mask,
> + indio_dev->masklength);
>
> d_size = st->ade7758_ring_channels[channel].scan_type.storagebits / 8;
>
^ permalink raw reply [flat|nested] 20+ messages in thread* Re: [PATCH 04/16] staging:iio: scrap scan_count and ensure all drivers use active_scan_mask
2011-11-28 9:45 ` Lars-Peter Clausen
@ 2011-11-28 16:15 ` Lars-Peter Clausen
2011-11-28 21:02 ` Jonathan Cameron
0 siblings, 1 reply; 20+ messages in thread
From: Lars-Peter Clausen @ 2011-11-28 16:15 UTC (permalink / raw)
To: Jonathan Cameron
Cc: linux-iio, Michael.Hennerich, manuel.stahl, Jonathan Cameron
On 11/28/2011 10:45 AM, Lars-Peter Clausen wrote:
> On 11/27/2011 02:33 PM, Jonathan Cameron wrote:
>> From: Jonathan Cameron <jic23@cam.ac.uk>
>>
>> Obviously drivers should only use this for pushing to buffers.
>> They need buffer->scan_mask for pulling from them post demux.
>>
>> Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
>> ---
>> drivers/staging/iio/accel/adis16201_ring.c | 10 +++++-----
>> drivers/staging/iio/accel/adis16203_ring.c | 10 +++++-----
>> drivers/staging/iio/accel/adis16204_ring.c | 10 +++++-----
>> drivers/staging/iio/accel/adis16209_ring.c | 5 +++--
>> drivers/staging/iio/accel/adis16240_ring.c | 5 +++--
>> drivers/staging/iio/accel/lis3l02dq_ring.c | 23 +++++++++++++----------
>> drivers/staging/iio/adc/ad7192.c | 10 ++++++----
>> drivers/staging/iio/adc/ad7298_ring.c | 12 +++++++-----
>> drivers/staging/iio/adc/ad7476_ring.c | 3 ++-
>> drivers/staging/iio/adc/ad7793.c | 11 ++++++-----
>> drivers/staging/iio/adc/ad7887_ring.c | 8 +++++---
>> drivers/staging/iio/adc/ad799x_ring.c | 13 ++++++++-----
>> drivers/staging/iio/buffer.h | 2 --
>> drivers/staging/iio/gyro/adis16260_ring.c | 5 +++--
>> drivers/staging/iio/iio_simple_dummy_buffer.c | 7 +++++--
>> drivers/staging/iio/impedance-analyzer/ad5933.c | 14 ++++++++------
>> drivers/staging/iio/imu/adis16400_ring.c | 19 +++++++++++--------
>> drivers/staging/iio/industrialio-buffer.c | 2 --
>> drivers/staging/iio/meter/ade7758_ring.c | 7 ++++---
>> 19 files changed, 99 insertions(+), 77 deletions(-)
>>
>> diff --git a/drivers/staging/iio/accel/adis16201_ring.c b/drivers/staging/iio/accel/adis16201_ring.c
>> index 936e8cb..68d4b38 100644
>> --- a/drivers/staging/iio/accel/adis16201_ring.c
>> +++ b/drivers/staging/iio/accel/adis16201_ring.c
>> @@ -74,11 +74,11 @@ static irqreturn_t adis16201_trigger_handler(int irq, void *p)
>> return -ENOMEM;
>> }
>>
>> - if (ring->scan_count)
>> - if (adis16201_read_ring_data(indio_dev, st->rx) >= 0)
>> - for (; i < ring->scan_count; i++)
>> - data[i] = be16_to_cpup(
>> - (__be16 *)&(st->rx[i*2]));
>> + if (!bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength)
>> + && adis16201_read_ring_data(indio_dev, st->rx) >= 0)
>> + for (; i < bitmap_weight(indio_dev->active_scan_mask,
>> + indio_dev->masklength); i++)
>> + data[i] = be16_to_cpup((__be16 *)&(st->rx[i*2]));
>>
>
> Does it really make sense to recompute bitmap_weight for each transfer?
> Can't we update scan_count once, when we update the scan_mask?
Also: for chips where we can only read all values at once, should we set
available_scan_masks to ~0 and just let the demuxer handle everything else?
- Lars
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 04/16] staging:iio: scrap scan_count and ensure all drivers use active_scan_mask
2011-11-28 16:15 ` Lars-Peter Clausen
@ 2011-11-28 21:02 ` Jonathan Cameron
2011-11-28 21:19 ` Lars-Peter Clausen
0 siblings, 1 reply; 20+ messages in thread
From: Jonathan Cameron @ 2011-11-28 21:02 UTC (permalink / raw)
To: Lars-Peter Clausen
Cc: linux-iio, Michael.Hennerich, manuel.stahl, Jonathan Cameron
On 11/28/2011 04:15 PM, Lars-Peter Clausen wrote:
> On 11/28/2011 10:45 AM, Lars-Peter Clausen wrote:
>> On 11/27/2011 02:33 PM, Jonathan Cameron wrote:
>>> From: Jonathan Cameron <jic23@cam.ac.uk>
>>>
>>> Obviously drivers should only use this for pushing to buffers.
>>> They need buffer->scan_mask for pulling from them post demux.
>>>
>>> Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
>>> ---
>>> drivers/staging/iio/accel/adis16201_ring.c | 10 +++++-----
>>> drivers/staging/iio/accel/adis16203_ring.c | 10 +++++-----
>>> drivers/staging/iio/accel/adis16204_ring.c | 10 +++++-----
>>> drivers/staging/iio/accel/adis16209_ring.c | 5 +++--
>>> drivers/staging/iio/accel/adis16240_ring.c | 5 +++--
>>> drivers/staging/iio/accel/lis3l02dq_ring.c | 23 +++++++++++++----------
>>> drivers/staging/iio/adc/ad7192.c | 10 ++++++----
>>> drivers/staging/iio/adc/ad7298_ring.c | 12 +++++++-----
>>> drivers/staging/iio/adc/ad7476_ring.c | 3 ++-
>>> drivers/staging/iio/adc/ad7793.c | 11 ++++++-----
>>> drivers/staging/iio/adc/ad7887_ring.c | 8 +++++---
>>> drivers/staging/iio/adc/ad799x_ring.c | 13 ++++++++-----
>>> drivers/staging/iio/buffer.h | 2 --
>>> drivers/staging/iio/gyro/adis16260_ring.c | 5 +++--
>>> drivers/staging/iio/iio_simple_dummy_buffer.c | 7 +++++--
>>> drivers/staging/iio/impedance-analyzer/ad5933.c | 14 ++++++++------
>>> drivers/staging/iio/imu/adis16400_ring.c | 19 +++++++++++--------
>>> drivers/staging/iio/industrialio-buffer.c | 2 --
>>> drivers/staging/iio/meter/ade7758_ring.c | 7 ++++---
>>> 19 files changed, 99 insertions(+), 77 deletions(-)
>>>
>>> diff --git a/drivers/staging/iio/accel/adis16201_ring.c b/drivers/staging/iio/accel/adis16201_ring.c
>>> index 936e8cb..68d4b38 100644
>>> --- a/drivers/staging/iio/accel/adis16201_ring.c
>>> +++ b/drivers/staging/iio/accel/adis16201_ring.c
>>> @@ -74,11 +74,11 @@ static irqreturn_t adis16201_trigger_handler(int irq, void *p)
>>> return -ENOMEM;
>>> }
>>>
>>> - if (ring->scan_count)
>>> - if (adis16201_read_ring_data(indio_dev, st->rx) >= 0)
>>> - for (; i < ring->scan_count; i++)
>>> - data[i] = be16_to_cpup(
>>> - (__be16 *)&(st->rx[i*2]));
>>> + if (!bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength)
>>> + && adis16201_read_ring_data(indio_dev, st->rx) >= 0)
>>> + for (; i < bitmap_weight(indio_dev->active_scan_mask,
>>> + indio_dev->masklength); i++)
>>> + data[i] = be16_to_cpup((__be16 *)&(st->rx[i*2]));
>>>
>>
>> Does it really make sense to recompute bitmap_weight for each transfer?
>> Can't we update scan_count once, when we update the scan_mask?
I partly got rid of scan mask to make the more 'interesting' route with
the active scan mask stuff easier to adapt (information is now in only
one place.).
I'd not be against caching this somewhere if it is convenient for the
driver (such as in the update_scan_mode callback). I'm not however
convinced it should be in the core code. Mostly the transfers that rely
on this should probably be setup in the preenable functions etc
rather than buffers being allocated in this fast path. This particular
approach is based on some of my early drivers. I much prefer Michaels
drivers where the whole transfer sequence is setup and only changed when
the channels being captured change. The only other common use case is a
fudge to get the timestamp in the right place.
It kind of feels there ought to be a better way of handing software
timestamps. Perhaps your timestamp source stuff that mentioned in
the ZIO thread.
This particular example is a bad one as it shouldn't be there at all
given we no longer do endian conversion but rather describe the buffer.
Don't suppose you fancy writing the patch that gets rid of these endian
conversions? If not I'll get to it, but may not be that soon.
>
> Also: for chips where we can only read all values at once, should we set
> available_scan_masks to ~0 and just let the demuxer handle everything else?
No. For consistency (and ability to use some of the standard functions)
the available scan masks should list the actual combination that is
available. Assuming I've understood you correctly and you don't just
mean for the channels that exist?
>
> - Lars
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-iio" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 04/16] staging:iio: scrap scan_count and ensure all drivers use active_scan_mask
2011-11-28 21:02 ` Jonathan Cameron
@ 2011-11-28 21:19 ` Lars-Peter Clausen
2011-11-28 21:31 ` Jonathan Cameron
0 siblings, 1 reply; 20+ messages in thread
From: Lars-Peter Clausen @ 2011-11-28 21:19 UTC (permalink / raw)
To: Jonathan Cameron
Cc: linux-iio, Michael.Hennerich, manuel.stahl, Jonathan Cameron
On 11/28/2011 10:02 PM, Jonathan Cameron wrote:
> On 11/28/2011 04:15 PM, Lars-Peter Clausen wrote:
>> On 11/28/2011 10:45 AM, Lars-Peter Clausen wrote:
>>> On 11/27/2011 02:33 PM, Jonathan Cameron wrote:
>>>> From: Jonathan Cameron <jic23@cam.ac.uk>
>>>>
>>>> Obviously drivers should only use this for pushing to buffers.
>>>> They need buffer->scan_mask for pulling from them post demux.
>>>>
>>>> Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
>>>> ---
>>>> drivers/staging/iio/accel/adis16201_ring.c | 10 +++++-----
>>>> drivers/staging/iio/accel/adis16203_ring.c | 10 +++++-----
>>>> drivers/staging/iio/accel/adis16204_ring.c | 10 +++++-----
>>>> drivers/staging/iio/accel/adis16209_ring.c | 5 +++--
>>>> drivers/staging/iio/accel/adis16240_ring.c | 5 +++--
>>>> drivers/staging/iio/accel/lis3l02dq_ring.c | 23 +++++++++++++----------
>>>> drivers/staging/iio/adc/ad7192.c | 10 ++++++----
>>>> drivers/staging/iio/adc/ad7298_ring.c | 12 +++++++-----
>>>> drivers/staging/iio/adc/ad7476_ring.c | 3 ++-
>>>> drivers/staging/iio/adc/ad7793.c | 11 ++++++-----
>>>> drivers/staging/iio/adc/ad7887_ring.c | 8 +++++---
>>>> drivers/staging/iio/adc/ad799x_ring.c | 13 ++++++++-----
>>>> drivers/staging/iio/buffer.h | 2 --
>>>> drivers/staging/iio/gyro/adis16260_ring.c | 5 +++--
>>>> drivers/staging/iio/iio_simple_dummy_buffer.c | 7 +++++--
>>>> drivers/staging/iio/impedance-analyzer/ad5933.c | 14 ++++++++------
>>>> drivers/staging/iio/imu/adis16400_ring.c | 19 +++++++++++--------
>>>> drivers/staging/iio/industrialio-buffer.c | 2 --
>>>> drivers/staging/iio/meter/ade7758_ring.c | 7 ++++---
>>>> 19 files changed, 99 insertions(+), 77 deletions(-)
>>>>
>>>> diff --git a/drivers/staging/iio/accel/adis16201_ring.c b/drivers/staging/iio/accel/adis16201_ring.c
>>>> index 936e8cb..68d4b38 100644
>>>> --- a/drivers/staging/iio/accel/adis16201_ring.c
>>>> +++ b/drivers/staging/iio/accel/adis16201_ring.c
>>>> @@ -74,11 +74,11 @@ static irqreturn_t adis16201_trigger_handler(int irq, void *p)
>>>> return -ENOMEM;
>>>> }
>>>>
>>>> - if (ring->scan_count)
>>>> - if (adis16201_read_ring_data(indio_dev, st->rx) >= 0)
>>>> - for (; i < ring->scan_count; i++)
>>>> - data[i] = be16_to_cpup(
>>>> - (__be16 *)&(st->rx[i*2]));
>>>> + if (!bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength)
>>>> + && adis16201_read_ring_data(indio_dev, st->rx) >= 0)
>>>> + for (; i < bitmap_weight(indio_dev->active_scan_mask,
>>>> + indio_dev->masklength); i++)
>>>> + data[i] = be16_to_cpup((__be16 *)&(st->rx[i*2]));
>>>>
>>>
>>> Does it really make sense to recompute bitmap_weight for each transfer?
>>> Can't we update scan_count once, when we update the scan_mask?
> I partly got rid of scan mask to make the more 'interesting' route with
> the active scan mask stuff easier to adapt (information is now in only
> one place.).
> I'd not be against caching this somewhere if it is convenient for the
> driver (such as in the update_scan_mode callback). I'm not however
> convinced it should be in the core code. Mostly the transfers that rely
> on this should probably be setup in the preenable functions etc
> rather than buffers being allocated in this fast path. This particular
> approach is based on some of my early drivers. I much prefer Michaels
> drivers where the whole transfer sequence is setup and only changed when
> the channels being captured change. The only other common use case is a
> fudge to get the timestamp in the right place.
> It kind of feels there ought to be a better way of handing software
> timestamps. Perhaps your timestamp source stuff that mentioned in
> the ZIO thread.
>
> This particular example is a bad one as it shouldn't be there at all
> given we no longer do endian conversion but rather describe the buffer.
>
> Don't suppose you fancy writing the patch that gets rid of these endian
> conversions? If not I'll get to it, but may not be that soon.
I'll try to have a look at it tomorrow.
>> Also: for chips where we can only read all values at once, should we set
>> available_scan_masks to ~0 and just let the demuxer handle everything else?
> No. For consistency (and ability to use some of the standard functions)
> the available scan masks should list the actual combination that is
> available. Assuming I've understood you correctly and you don't just
> mean for the channels that exist?
>>
What I meant was, if for example a device has 4 channels and we can only read
all 4 channels together and not selectively only a subset, available_scan_masks
should contain one item set to 0xf. This would allow us to just pass the buffer
we read from the device up to the next level and let the demuxer take care of
splitting it up instead of manually do the demuxing, like it is done now.
E.g. the adis16201_trigger_handler would basically boil down to:
ring->access->store_to(ring, st->rx, pf->timestamp);
On the other hand the adis16201 seems to support reading a subset of registers,
but it's just not implemented.
- Lars
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 04/16] staging:iio: scrap scan_count and ensure all drivers use active_scan_mask
2011-11-28 21:19 ` Lars-Peter Clausen
@ 2011-11-28 21:31 ` Jonathan Cameron
0 siblings, 0 replies; 20+ messages in thread
From: Jonathan Cameron @ 2011-11-28 21:31 UTC (permalink / raw)
To: Lars-Peter Clausen
Cc: linux-iio, Michael.Hennerich, manuel.stahl, Jonathan Cameron
On 11/28/2011 09:19 PM, Lars-Peter Clausen wrote:
> On 11/28/2011 10:02 PM, Jonathan Cameron wrote:
>> On 11/28/2011 04:15 PM, Lars-Peter Clausen wrote:
>>> On 11/28/2011 10:45 AM, Lars-Peter Clausen wrote:
>>>> On 11/27/2011 02:33 PM, Jonathan Cameron wrote:
>>>>> From: Jonathan Cameron <jic23@cam.ac.uk>
>>>>>
>>>>> Obviously drivers should only use this for pushing to buffers.
>>>>> They need buffer->scan_mask for pulling from them post demux.
>>>>>
>>>>> Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
>>>>> ---
>>>>> drivers/staging/iio/accel/adis16201_ring.c | 10 +++++-----
>>>>> drivers/staging/iio/accel/adis16203_ring.c | 10 +++++-----
>>>>> drivers/staging/iio/accel/adis16204_ring.c | 10 +++++-----
>>>>> drivers/staging/iio/accel/adis16209_ring.c | 5 +++--
>>>>> drivers/staging/iio/accel/adis16240_ring.c | 5 +++--
>>>>> drivers/staging/iio/accel/lis3l02dq_ring.c | 23 +++++++++++++----------
>>>>> drivers/staging/iio/adc/ad7192.c | 10 ++++++----
>>>>> drivers/staging/iio/adc/ad7298_ring.c | 12 +++++++-----
>>>>> drivers/staging/iio/adc/ad7476_ring.c | 3 ++-
>>>>> drivers/staging/iio/adc/ad7793.c | 11 ++++++-----
>>>>> drivers/staging/iio/adc/ad7887_ring.c | 8 +++++---
>>>>> drivers/staging/iio/adc/ad799x_ring.c | 13 ++++++++-----
>>>>> drivers/staging/iio/buffer.h | 2 --
>>>>> drivers/staging/iio/gyro/adis16260_ring.c | 5 +++--
>>>>> drivers/staging/iio/iio_simple_dummy_buffer.c | 7 +++++--
>>>>> drivers/staging/iio/impedance-analyzer/ad5933.c | 14 ++++++++------
>>>>> drivers/staging/iio/imu/adis16400_ring.c | 19 +++++++++++--------
>>>>> drivers/staging/iio/industrialio-buffer.c | 2 --
>>>>> drivers/staging/iio/meter/ade7758_ring.c | 7 ++++---
>>>>> 19 files changed, 99 insertions(+), 77 deletions(-)
>>>>>
>>>>> diff --git a/drivers/staging/iio/accel/adis16201_ring.c b/drivers/staging/iio/accel/adis16201_ring.c
>>>>> index 936e8cb..68d4b38 100644
>>>>> --- a/drivers/staging/iio/accel/adis16201_ring.c
>>>>> +++ b/drivers/staging/iio/accel/adis16201_ring.c
>>>>> @@ -74,11 +74,11 @@ static irqreturn_t adis16201_trigger_handler(int irq, void *p)
>>>>> return -ENOMEM;
>>>>> }
>>>>>
>>>>> - if (ring->scan_count)
>>>>> - if (adis16201_read_ring_data(indio_dev, st->rx) >= 0)
>>>>> - for (; i < ring->scan_count; i++)
>>>>> - data[i] = be16_to_cpup(
>>>>> - (__be16 *)&(st->rx[i*2]));
>>>>> + if (!bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength)
>>>>> + && adis16201_read_ring_data(indio_dev, st->rx) >= 0)
>>>>> + for (; i < bitmap_weight(indio_dev->active_scan_mask,
>>>>> + indio_dev->masklength); i++)
>>>>> + data[i] = be16_to_cpup((__be16 *)&(st->rx[i*2]));
>>>>>
>>>>
>>>> Does it really make sense to recompute bitmap_weight for each transfer?
>>>> Can't we update scan_count once, when we update the scan_mask?
>> I partly got rid of scan mask to make the more 'interesting' route with
>> the active scan mask stuff easier to adapt (information is now in only
>> one place.).
>> I'd not be against caching this somewhere if it is convenient for the
>> driver (such as in the update_scan_mode callback). I'm not however
>> convinced it should be in the core code. Mostly the transfers that rely
>> on this should probably be setup in the preenable functions etc
>> rather than buffers being allocated in this fast path. This particular
>> approach is based on some of my early drivers. I much prefer Michaels
>> drivers where the whole transfer sequence is setup and only changed when
>> the channels being captured change. The only other common use case is a
>> fudge to get the timestamp in the right place.
>> It kind of feels there ought to be a better way of handing software
>> timestamps. Perhaps your timestamp source stuff that mentioned in
>> the ZIO thread.
>>
>> This particular example is a bad one as it shouldn't be there at all
>> given we no longer do endian conversion but rather describe the buffer.
>>
>> Don't suppose you fancy writing the patch that gets rid of these endian
>> conversions? If not I'll get to it, but may not be that soon.
>
> I'll try to have a look at it tomorrow.
>
>>> Also: for chips where we can only read all values at once, should we set
>>> available_scan_masks to ~0 and just let the demuxer handle everything else?
>> No. For consistency (and ability to use some of the standard functions)
>> the available scan masks should list the actual combination that is
>> available. Assuming I've understood you correctly and you don't just
>> mean for the channels that exist?
>>>
>
> What I meant was, if for example a device has 4 channels and we can only read
> all 4 channels together and not selectively only a subset, available_scan_masks
> should contain one item set to 0xf. This would allow us to just pass the buffer
> we read from the device up to the next level and let the demuxer take care of
> splitting it up instead of manually do the demuxing, like it is done now.
Agreed. I just only implemented the demux usage for the max1363 so far.
Definitely the intention that things like this will be covered.
>
> E.g. the adis16201_trigger_handler would basically boil down to:
> ring->access->store_to(ring, st->rx, pf->timestamp);
>
> On the other hand the adis16201 seems to support reading a subset of registers,
> but it's just not implemented.
IIRC it's to do with the fact that burst mode reading of everything is
faster for more than a couple of registers... Hence no one bothered.
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH 05/16] staging:iio:buffer remove unused owner field from struct iio_buffer
2011-11-27 13:33 [PATCH 00/16] staging:iio: buffer cleanup series Jonathan Cameron
` (3 preceding siblings ...)
2011-11-27 13:33 ` [PATCH 04/16] staging:iio: scrap scan_count and ensure all drivers use active_scan_mask Jonathan Cameron
@ 2011-11-27 13:33 ` Jonathan Cameron
2011-11-27 13:33 ` [PATCH 06/16] staging:iio:accel:lis3l02dq scrap reading from buffer for sysfs access Jonathan Cameron
` (8 subsequent siblings)
13 siblings, 0 replies; 20+ messages in thread
From: Jonathan Cameron @ 2011-11-27 13:33 UTC (permalink / raw)
To: linux-iio; +Cc: lars, Michael.Hennerich, manuel.stahl, Jonathan Cameron
Legacy of having multiple chrdevs that never got cleaned up.
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
---
drivers/staging/iio/accel/adis16201_ring.c | 1 -
drivers/staging/iio/accel/adis16203_ring.c | 1 -
drivers/staging/iio/accel/adis16204_ring.c | 1 -
drivers/staging/iio/accel/adis16209_ring.c | 1 -
drivers/staging/iio/accel/adis16240_ring.c | 1 -
drivers/staging/iio/accel/lis3l02dq_ring.c | 1 -
drivers/staging/iio/buffer.h | 2 --
drivers/staging/iio/gyro/adis16260_ring.c | 1 -
drivers/staging/iio/iio_simple_dummy_buffer.c | 1 -
drivers/staging/iio/imu/adis16400_ring.c | 1 -
drivers/staging/iio/meter/ade7758_ring.c | 1 -
11 files changed, 0 insertions(+), 12 deletions(-)
diff --git a/drivers/staging/iio/accel/adis16201_ring.c b/drivers/staging/iio/accel/adis16201_ring.c
index 68d4b38..26c610f 100644
--- a/drivers/staging/iio/accel/adis16201_ring.c
+++ b/drivers/staging/iio/accel/adis16201_ring.c
@@ -119,7 +119,6 @@ int adis16201_configure_ring(struct iio_dev *indio_dev)
ring->scan_timestamp = true;
ring->access = &ring_sw_access_funcs;
indio_dev->setup_ops = &adis16201_ring_setup_ops;
- ring->owner = THIS_MODULE;
indio_dev->pollfunc = iio_alloc_pollfunc(&iio_pollfunc_store_time,
&adis16201_trigger_handler,
diff --git a/drivers/staging/iio/accel/adis16203_ring.c b/drivers/staging/iio/accel/adis16203_ring.c
index 0f9d18a..064640d 100644
--- a/drivers/staging/iio/accel/adis16203_ring.c
+++ b/drivers/staging/iio/accel/adis16203_ring.c
@@ -121,7 +121,6 @@ int adis16203_configure_ring(struct iio_dev *indio_dev)
ring->scan_timestamp = true;
ring->access = &ring_sw_access_funcs;
indio_dev->setup_ops = &adis16203_ring_setup_ops;
- ring->owner = THIS_MODULE;
indio_dev->pollfunc = iio_alloc_pollfunc(&iio_pollfunc_store_time,
&adis16203_trigger_handler,
diff --git a/drivers/staging/iio/accel/adis16204_ring.c b/drivers/staging/iio/accel/adis16204_ring.c
index 8010c1d..4081179 100644
--- a/drivers/staging/iio/accel/adis16204_ring.c
+++ b/drivers/staging/iio/accel/adis16204_ring.c
@@ -116,7 +116,6 @@ int adis16204_configure_ring(struct iio_dev *indio_dev)
ring->access = &ring_sw_access_funcs;
ring->scan_timestamp = true;
indio_dev->setup_ops = &adis16204_ring_setup_ops;
- ring->owner = THIS_MODULE;
indio_dev->pollfunc = iio_alloc_pollfunc(&iio_pollfunc_store_time,
&adis16204_trigger_handler,
diff --git a/drivers/staging/iio/accel/adis16209_ring.c b/drivers/staging/iio/accel/adis16209_ring.c
index 8629fea..2a6fd334 100644
--- a/drivers/staging/iio/accel/adis16209_ring.c
+++ b/drivers/staging/iio/accel/adis16209_ring.c
@@ -117,7 +117,6 @@ int adis16209_configure_ring(struct iio_dev *indio_dev)
ring->access = &ring_sw_access_funcs;
ring->scan_timestamp = true;
indio_dev->setup_ops = &adis16209_ring_setup_ops;
- ring->owner = THIS_MODULE;
indio_dev->pollfunc = iio_alloc_pollfunc(&iio_pollfunc_store_time,
&adis16209_trigger_handler,
diff --git a/drivers/staging/iio/accel/adis16240_ring.c b/drivers/staging/iio/accel/adis16240_ring.c
index 9a3dba2..e23622d 100644
--- a/drivers/staging/iio/accel/adis16240_ring.c
+++ b/drivers/staging/iio/accel/adis16240_ring.c
@@ -114,7 +114,6 @@ int adis16240_configure_ring(struct iio_dev *indio_dev)
ring->access = &ring_sw_access_funcs;
ring->scan_timestamp = true;
indio_dev->setup_ops = &adis16240_ring_setup_ops;
- ring->owner = THIS_MODULE;
indio_dev->pollfunc = iio_alloc_pollfunc(&iio_pollfunc_store_time,
&adis16240_trigger_handler,
diff --git a/drivers/staging/iio/accel/lis3l02dq_ring.c b/drivers/staging/iio/accel/lis3l02dq_ring.c
index 4d40505..978cd4d 100644
--- a/drivers/staging/iio/accel/lis3l02dq_ring.c
+++ b/drivers/staging/iio/accel/lis3l02dq_ring.c
@@ -443,7 +443,6 @@ int lis3l02dq_configure_buffer(struct iio_dev *indio_dev)
buffer->scan_timestamp = true;
indio_dev->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,
diff --git a/drivers/staging/iio/buffer.h b/drivers/staging/iio/buffer.h
index 7fc0894..98e9efa 100644
--- a/drivers/staging/iio/buffer.h
+++ b/drivers/staging/iio/buffer.h
@@ -68,7 +68,6 @@ struct iio_buffer_access_funcs {
/**
* struct iio_buffer - general buffer structure
* @indio_dev: industrial I/O device structure
- * @owner: module that owns the buffer (for ref counting)
* @length: [DEVICE] number of datums in buffer
* @bytes_per_datum: [DEVICE] size of individual datum including timestamp
* @scan_el_attrs: [DRIVER] control of scan elements if that scan mode
@@ -83,7 +82,6 @@ struct iio_buffer_access_funcs {
**/
struct iio_buffer {
struct iio_dev *indio_dev;
- struct module *owner;
int length;
int bytes_per_datum;
struct attribute_group *scan_el_attrs;
diff --git a/drivers/staging/iio/gyro/adis16260_ring.c b/drivers/staging/iio/gyro/adis16260_ring.c
index 88e96af..699a615 100644
--- a/drivers/staging/iio/gyro/adis16260_ring.c
+++ b/drivers/staging/iio/gyro/adis16260_ring.c
@@ -119,7 +119,6 @@ int adis16260_configure_ring(struct iio_dev *indio_dev)
ring->access = &ring_sw_access_funcs;
ring->scan_timestamp = true;
indio_dev->setup_ops = &adis16260_ring_setup_ops;
- ring->owner = THIS_MODULE;
indio_dev->pollfunc = iio_alloc_pollfunc(&iio_pollfunc_store_time,
&adis16260_trigger_handler,
diff --git a/drivers/staging/iio/iio_simple_dummy_buffer.c b/drivers/staging/iio/iio_simple_dummy_buffer.c
index 59e3186..d6a1c0e 100644
--- a/drivers/staging/iio/iio_simple_dummy_buffer.c
+++ b/drivers/staging/iio/iio_simple_dummy_buffer.c
@@ -153,7 +153,6 @@ int iio_simple_dummy_configure_buffer(struct iio_dev *indio_dev)
* be run on either side of buffer capture enable / disable.
*/
indio_dev->setup_ops = &iio_simple_dummy_buffer_setup_ops;
- buffer->owner = THIS_MODULE;
/*
* Configure a polling function.
diff --git a/drivers/staging/iio/imu/adis16400_ring.c b/drivers/staging/iio/imu/adis16400_ring.c
index 249d11f..ac22de5 100644
--- a/drivers/staging/iio/imu/adis16400_ring.c
+++ b/drivers/staging/iio/imu/adis16400_ring.c
@@ -191,7 +191,6 @@ int adis16400_configure_ring(struct iio_dev *indio_dev)
ring->access = &ring_sw_access_funcs;
ring->scan_timestamp = true;
indio_dev->setup_ops = &adis16400_ring_setup_ops;
- ring->owner = THIS_MODULE;
indio_dev->pollfunc = iio_alloc_pollfunc(&iio_pollfunc_store_time,
&adis16400_trigger_handler,
diff --git a/drivers/staging/iio/meter/ade7758_ring.c b/drivers/staging/iio/meter/ade7758_ring.c
index 028470c..f29f2b2 100644
--- a/drivers/staging/iio/meter/ade7758_ring.c
+++ b/drivers/staging/iio/meter/ade7758_ring.c
@@ -147,7 +147,6 @@ int ade7758_configure_ring(struct iio_dev *indio_dev)
/* Effectively select the ring buffer implementation */
indio_dev->buffer->access = &ring_sw_access_funcs;
indio_dev->setup_ops = &ade7758_ring_setup_ops;
- indio_dev->buffer->owner = THIS_MODULE;
indio_dev->pollfunc = iio_alloc_pollfunc(&iio_pollfunc_store_time,
&ade7758_trigger_handler,
--
1.7.7.3
^ permalink raw reply related [flat|nested] 20+ messages in thread* [PATCH 06/16] staging:iio:accel:lis3l02dq scrap reading from buffer for sysfs access.
2011-11-27 13:33 [PATCH 00/16] staging:iio: buffer cleanup series Jonathan Cameron
` (4 preceding siblings ...)
2011-11-27 13:33 ` [PATCH 05/16] staging:iio:buffer remove unused owner field from struct iio_buffer Jonathan Cameron
@ 2011-11-27 13:33 ` Jonathan Cameron
2011-11-27 13:33 ` [PATCH 10/16] staging:iio:adc:ad7606 remove buffer access to data from sysfs read Jonathan Cameron
` (7 subsequent siblings)
13 siblings, 0 replies; 20+ messages in thread
From: Jonathan Cameron @ 2011-11-27 13:33 UTC (permalink / raw)
To: linux-iio; +Cc: lars, Michael.Hennerich, manuel.stahl, Jonathan Cameron
No obvious usecase and complicates in kernel interface work.
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
---
drivers/staging/iio/accel/lis3l02dq.h | 12 ----------
drivers/staging/iio/accel/lis3l02dq_core.c | 9 ++-----
drivers/staging/iio/accel/lis3l02dq_ring.c | 32 ----------------------------
3 files changed, 3 insertions(+), 50 deletions(-)
diff --git a/drivers/staging/iio/accel/lis3l02dq.h b/drivers/staging/iio/accel/lis3l02dq.h
index 7237a9a..2db383f 100644
--- a/drivers/staging/iio/accel/lis3l02dq.h
+++ b/drivers/staging/iio/accel/lis3l02dq.h
@@ -181,11 +181,6 @@ int lis3l02dq_disable_all_events(struct iio_dev *indio_dev);
void lis3l02dq_remove_trigger(struct iio_dev *indio_dev);
int lis3l02dq_probe_trigger(struct iio_dev *indio_dev);
-ssize_t lis3l02dq_read_accel_from_buffer(struct iio_buffer *buffer,
- int index,
- int *val);
-
-
int lis3l02dq_configure_buffer(struct iio_dev *indio_dev);
void lis3l02dq_unconfigure_buffer(struct iio_dev *indio_dev);
@@ -212,13 +207,6 @@ static inline int lis3l02dq_probe_trigger(struct iio_dev *indio_dev)
{
return 0;
}
-static inline ssize_t
-lis3l02dq_read_accel_from_buffer(struct iio_buffer *buffer,
- int index,
- int *val)
-{
- return 0;
-}
static int lis3l02dq_configure_buffer(struct iio_dev *indio_dev)
{
diff --git a/drivers/staging/iio/accel/lis3l02dq_core.c b/drivers/staging/iio/accel/lis3l02dq_core.c
index 4dbe4c7..8a3d26b 100644
--- a/drivers/staging/iio/accel/lis3l02dq_core.c
+++ b/drivers/staging/iio/accel/lis3l02dq_core.c
@@ -260,12 +260,9 @@ static int lis3l02dq_read_raw(struct iio_dev *indio_dev,
case 0:
/* Take the iio_dev status lock */
mutex_lock(&indio_dev->mlock);
- if (indio_dev->currentmode == INDIO_BUFFER_TRIGGERED)
- ret = lis3l02dq_read_accel_from_buffer(indio_dev->
- buffer,
- chan->scan_index,
- val);
- else {
+ if (indio_dev->currentmode == INDIO_BUFFER_TRIGGERED) {
+ ret = -EBUSY;
+ } else {
reg = lis3l02dq_axis_map
[LIS3L02DQ_ACCEL][chan->address];
ret = lis3l02dq_read_reg_s16(indio_dev, reg, val);
diff --git a/drivers/staging/iio/accel/lis3l02dq_ring.c b/drivers/staging/iio/accel/lis3l02dq_ring.c
index 978cd4d..c81d0e2 100644
--- a/drivers/staging/iio/accel/lis3l02dq_ring.c
+++ b/drivers/staging/iio/accel/lis3l02dq_ring.c
@@ -38,38 +38,6 @@ irqreturn_t lis3l02dq_data_rdy_trig_poll(int irq, void *private)
return IRQ_WAKE_THREAD;
}
-/**
- * lis3l02dq_read_accel_from_buffer() individual acceleration read from buffer
- **/
-ssize_t lis3l02dq_read_accel_from_buffer(struct iio_buffer *buffer,
- int index,
- int *val)
-{
- int ret;
- s16 *data;
-
- if (!iio_scan_mask_query(buffer, index))
- return -EINVAL;
-
- if (!buffer->access->read_last)
- return -EBUSY;
-
- data = kmalloc(buffer->access->get_bytes_per_datum(buffer),
- GFP_KERNEL);
- if (data == NULL)
- return -ENOMEM;
-
- ret = buffer->access->read_last(buffer, (u8 *)data);
- if (ret)
- goto error_free_data;
- *val = data[bitmap_weight(buffer->scan_mask, index)];
-error_free_data:
-
- kfree(data);
-
- return ret;
-}
-
static const u8 read_all_tx_array[] = {
LIS3L02DQ_READ_REG(LIS3L02DQ_REG_OUT_X_L_ADDR), 0,
LIS3L02DQ_READ_REG(LIS3L02DQ_REG_OUT_X_H_ADDR), 0,
--
1.7.7.3
^ permalink raw reply related [flat|nested] 20+ messages in thread* [PATCH 10/16] staging:iio:adc:ad7606 remove buffer access to data from sysfs read.
2011-11-27 13:33 [PATCH 00/16] staging:iio: buffer cleanup series Jonathan Cameron
` (5 preceding siblings ...)
2011-11-27 13:33 ` [PATCH 06/16] staging:iio:accel:lis3l02dq scrap reading from buffer for sysfs access Jonathan Cameron
@ 2011-11-27 13:33 ` Jonathan Cameron
2011-11-27 13:33 ` [PATCH 11/16] staging:iio:adc:ad7993 stop reading from buffer for sysfs raw read Jonathan Cameron
` (6 subsequent siblings)
13 siblings, 0 replies; 20+ messages in thread
From: Jonathan Cameron @ 2011-11-27 13:33 UTC (permalink / raw)
To: linux-iio; +Cc: lars, Michael.Hennerich, manuel.stahl, Jonathan Cameron
No known use case and complicates in kernel interface work.
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
---
drivers/staging/iio/adc/ad7606.h | 1 -
drivers/staging/iio/adc/ad7606_core.c | 2 +-
drivers/staging/iio/adc/ad7606_ring.c | 24 ------------------------
3 files changed, 1 insertions(+), 26 deletions(-)
diff --git a/drivers/staging/iio/adc/ad7606.h b/drivers/staging/iio/adc/ad7606.h
index 35018c3..10f5989 100644
--- a/drivers/staging/iio/adc/ad7606.h
+++ b/drivers/staging/iio/adc/ad7606.h
@@ -99,7 +99,6 @@ enum ad7606_supported_device_ids {
ID_AD7606_4
};
-int ad7606_scan_from_ring(struct iio_dev *indio_dev, unsigned ch);
int ad7606_register_ring_funcs_and_init(struct iio_dev *indio_dev);
void ad7606_ring_cleanup(struct iio_dev *indio_dev);
#endif /* IIO_ADC_AD7606_H_ */
diff --git a/drivers/staging/iio/adc/ad7606_core.c b/drivers/staging/iio/adc/ad7606_core.c
index a8596b8..da25846 100644
--- a/drivers/staging/iio/adc/ad7606_core.c
+++ b/drivers/staging/iio/adc/ad7606_core.c
@@ -91,7 +91,7 @@ static int ad7606_read_raw(struct iio_dev *indio_dev,
case 0:
mutex_lock(&indio_dev->mlock);
if (iio_buffer_enabled(indio_dev))
- ret = ad7606_scan_from_ring(indio_dev, chan->address);
+ ret = -EBUSY;
else
ret = ad7606_scan_direct(indio_dev, chan->address);
mutex_unlock(&indio_dev->mlock);
diff --git a/drivers/staging/iio/adc/ad7606_ring.c b/drivers/staging/iio/adc/ad7606_ring.c
index f682af6..e8f94a1 100644
--- a/drivers/staging/iio/adc/ad7606_ring.c
+++ b/drivers/staging/iio/adc/ad7606_ring.c
@@ -18,30 +18,6 @@
#include "ad7606.h"
-int ad7606_scan_from_ring(struct iio_dev *indio_dev, unsigned ch)
-{
- struct iio_buffer *ring = indio_dev->buffer;
- int ret;
- u16 *ring_data;
-
- ring_data = kmalloc(ring->access->get_bytes_per_datum(ring),
- GFP_KERNEL);
- if (ring_data == NULL) {
- ret = -ENOMEM;
- goto error_ret;
- }
- ret = ring->access->read_last(ring, (u8 *) ring_data);
- if (ret)
- goto error_free_ring_data;
-
- ret = ring_data[ch];
-
-error_free_ring_data:
- kfree(ring_data);
-error_ret:
- return ret;
-}
-
/**
* ad7606_trigger_handler_th() th/bh of trigger launched polling to ring buffer
*
--
1.7.7.3
^ permalink raw reply related [flat|nested] 20+ messages in thread* [PATCH 11/16] staging:iio:adc:ad7993 stop reading from buffer for sysfs raw read.
2011-11-27 13:33 [PATCH 00/16] staging:iio: buffer cleanup series Jonathan Cameron
` (6 preceding siblings ...)
2011-11-27 13:33 ` [PATCH 10/16] staging:iio:adc:ad7606 remove buffer access to data from sysfs read Jonathan Cameron
@ 2011-11-27 13:33 ` Jonathan Cameron
2011-11-27 13:33 ` [PATCH 12/16] staging:iio:adc:ad7887 stop reading from buffer for sysfs access Jonathan Cameron
` (5 subsequent siblings)
13 siblings, 0 replies; 20+ messages in thread
From: Jonathan Cameron @ 2011-11-27 13:33 UTC (permalink / raw)
To: linux-iio; +Cc: lars, Michael.Hennerich, manuel.stahl, Jonathan Cameron
No known usecase and makes in kernel interface work more complex.
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
---
drivers/staging/iio/adc/ad7793.c | 22 +---------------------
1 files changed, 1 insertions(+), 21 deletions(-)
diff --git a/drivers/staging/iio/adc/ad7793.c b/drivers/staging/iio/adc/ad7793.c
index 432f60e..f2f1081 100644
--- a/drivers/staging/iio/adc/ad7793.c
+++ b/drivers/staging/iio/adc/ad7793.c
@@ -316,25 +316,6 @@ out:
return ret;
}
-static int ad7793_scan_from_ring(struct ad7793_state *st, unsigned ch, int *val)
-{
- struct iio_buffer *ring = iio_priv_to_dev(st)->buffer;
- int ret;
- s64 dat64[2];
- u32 *dat32 = (u32 *)dat64;
-
- if (!(test_bit(ch, ring->scan_mask)))
- return -EBUSY;
-
- ret = ring->access->read_last(ring, (u8 *) &dat64);
- if (ret)
- return ret;
-
- *val = *dat32;
-
- return 0;
-}
-
static int ad7793_ring_preenable(struct iio_dev *indio_dev)
{
struct ad7793_state *st = iio_priv(indio_dev);
@@ -650,8 +631,7 @@ static int ad7793_read_raw(struct iio_dev *indio_dev,
case 0:
mutex_lock(&indio_dev->mlock);
if (iio_buffer_enabled(indio_dev))
- ret = ad7793_scan_from_ring(st,
- chan->scan_index, &smpl);
+ ret = -EBUSY;
else
ret = ad7793_read(st, chan->address,
chan->scan_type.realbits / 8, &smpl);
--
1.7.7.3
^ permalink raw reply related [flat|nested] 20+ messages in thread* [PATCH 12/16] staging:iio:adc:ad7887 stop reading from buffer for sysfs access.
2011-11-27 13:33 [PATCH 00/16] staging:iio: buffer cleanup series Jonathan Cameron
` (7 preceding siblings ...)
2011-11-27 13:33 ` [PATCH 11/16] staging:iio:adc:ad7993 stop reading from buffer for sysfs raw read Jonathan Cameron
@ 2011-11-27 13:33 ` Jonathan Cameron
2011-11-27 13:33 ` [PATCH 13/16] staging:iio:adc:ad799x stop reading from buffer for sysfs accesses Jonathan Cameron
` (4 subsequent siblings)
13 siblings, 0 replies; 20+ messages in thread
From: Jonathan Cameron @ 2011-11-27 13:33 UTC (permalink / raw)
To: linux-iio; +Cc: lars, Michael.Hennerich, manuel.stahl, Jonathan Cameron
No known use case and complicates in kernel interface work.
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
---
drivers/staging/iio/adc/ad7887.h | 5 ----
drivers/staging/iio/adc/ad7887_core.c | 2 +-
drivers/staging/iio/adc/ad7887_ring.c | 34 ---------------------------------
3 files changed, 1 insertions(+), 40 deletions(-)
diff --git a/drivers/staging/iio/adc/ad7887.h b/drivers/staging/iio/adc/ad7887.h
index 3452d18..bc53b65 100644
--- a/drivers/staging/iio/adc/ad7887.h
+++ b/drivers/staging/iio/adc/ad7887.h
@@ -83,14 +83,9 @@ enum ad7887_supported_device_ids {
};
#ifdef CONFIG_IIO_BUFFER
-int ad7887_scan_from_ring(struct ad7887_state *st, int channum);
int ad7887_register_ring_funcs_and_init(struct iio_dev *indio_dev);
void ad7887_ring_cleanup(struct iio_dev *indio_dev);
#else /* CONFIG_IIO_BUFFER */
-static inline int ad7887_scan_from_ring(struct ad7887_state *st, int channum)
-{
- return 0;
-}
static inline int
ad7887_register_ring_funcs_and_init(struct iio_dev *indio_dev)
diff --git a/drivers/staging/iio/adc/ad7887_core.c b/drivers/staging/iio/adc/ad7887_core.c
index 8f48659..ffed20e 100644
--- a/drivers/staging/iio/adc/ad7887_core.c
+++ b/drivers/staging/iio/adc/ad7887_core.c
@@ -45,7 +45,7 @@ static int ad7887_read_raw(struct iio_dev *indio_dev,
case 0:
mutex_lock(&indio_dev->mlock);
if (iio_buffer_enabled(indio_dev))
- ret = ad7887_scan_from_ring(st, 1 << chan->address);
+ ret = -EBUSY;
else
ret = ad7887_scan_direct(st, chan->address);
mutex_unlock(&indio_dev->mlock);
diff --git a/drivers/staging/iio/adc/ad7887_ring.c b/drivers/staging/iio/adc/ad7887_ring.c
index f53a663..85076cd 100644
--- a/drivers/staging/iio/adc/ad7887_ring.c
+++ b/drivers/staging/iio/adc/ad7887_ring.c
@@ -19,40 +19,6 @@
#include "ad7887.h"
-int ad7887_scan_from_ring(struct ad7887_state *st, int channum)
-{
- struct iio_buffer *ring = iio_priv_to_dev(st)->buffer;
- int count = 0, ret;
- u16 *ring_data;
-
- if (!(test_bit(channum, ring->scan_mask))) {
- ret = -EBUSY;
- goto error_ret;
- }
-
- ring_data = kmalloc(ring->access->get_bytes_per_datum(ring),
- GFP_KERNEL);
- if (ring_data == NULL) {
- ret = -ENOMEM;
- goto error_ret;
- }
- ret = ring->access->read_last(ring, (u8 *) ring_data);
- if (ret)
- goto error_free_ring_data;
-
- /* for single channel scan the result is stored with zero offset */
- if ((test_bit(1, ring->scan_mask) || test_bit(0, ring->scan_mask)) &&
- (channum == 1))
- count = 1;
-
- ret = be16_to_cpu(ring_data[count]);
-
-error_free_ring_data:
- kfree(ring_data);
-error_ret:
- return ret;
-}
-
/**
* ad7887_ring_preenable() setup the parameters of the ring before enabling
*
--
1.7.7.3
^ permalink raw reply related [flat|nested] 20+ messages in thread* [PATCH 13/16] staging:iio:adc:ad799x stop reading from buffer for sysfs accesses
2011-11-27 13:33 [PATCH 00/16] staging:iio: buffer cleanup series Jonathan Cameron
` (8 preceding siblings ...)
2011-11-27 13:33 ` [PATCH 12/16] staging:iio:adc:ad7887 stop reading from buffer for sysfs access Jonathan Cameron
@ 2011-11-27 13:33 ` Jonathan Cameron
2011-11-27 13:33 ` [PATCH 14/16] staging:iio:adc:max1363 stop reading from buffer for sysfs access Jonathan Cameron
` (3 subsequent siblings)
13 siblings, 0 replies; 20+ messages in thread
From: Jonathan Cameron @ 2011-11-27 13:33 UTC (permalink / raw)
To: linux-iio; +Cc: lars, Michael.Hennerich, manuel.stahl, Jonathan Cameron
No known use case and makes in kernel interface work more complex.
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
---
drivers/staging/iio/adc/ad799x.h | 6 ------
drivers/staging/iio/adc/ad799x_core.c | 3 +--
drivers/staging/iio/adc/ad799x_ring.c | 30 ------------------------------
3 files changed, 1 insertions(+), 38 deletions(-)
diff --git a/drivers/staging/iio/adc/ad799x.h b/drivers/staging/iio/adc/ad799x.h
index eda01d5..356f690 100644
--- a/drivers/staging/iio/adc/ad799x.h
+++ b/drivers/staging/iio/adc/ad799x.h
@@ -124,15 +124,9 @@ struct ad799x_platform_data {
int ad7997_8_set_scan_mode(struct ad799x_state *st, unsigned mask);
#ifdef CONFIG_AD799X_RING_BUFFER
-int ad799x_single_channel_from_ring(struct iio_dev *indio_dev, int channum);
int ad799x_register_ring_funcs_and_init(struct iio_dev *indio_dev);
void ad799x_ring_cleanup(struct iio_dev *indio_dev);
#else /* CONFIG_AD799X_RING_BUFFER */
-int ad799x_single_channel_from_ring(struct iio_dev *indio_dev, int channum)
-{
- return -EINVAL;
-}
-
static inline int
ad799x_register_ring_funcs_and_init(struct iio_dev *indio_dev)
diff --git a/drivers/staging/iio/adc/ad799x_core.c b/drivers/staging/iio/adc/ad799x_core.c
index 5bedb19..815e6b9 100644
--- a/drivers/staging/iio/adc/ad799x_core.c
+++ b/drivers/staging/iio/adc/ad799x_core.c
@@ -151,8 +151,7 @@ static int ad799x_read_raw(struct iio_dev *indio_dev,
case 0:
mutex_lock(&indio_dev->mlock);
if (iio_buffer_enabled(indio_dev))
- ret = ad799x_single_channel_from_ring(indio_dev,
- chan->scan_index);
+ ret = -EBUSY;
else
ret = ad799x_scan_direct(st, chan->scan_index);
mutex_unlock(&indio_dev->mlock);
diff --git a/drivers/staging/iio/adc/ad799x_ring.c b/drivers/staging/iio/adc/ad799x_ring.c
index 5841c3c..5dded9e 100644
--- a/drivers/staging/iio/adc/ad799x_ring.c
+++ b/drivers/staging/iio/adc/ad799x_ring.c
@@ -23,36 +23,6 @@
#include "ad799x.h"
-int ad799x_single_channel_from_ring(struct iio_dev *indio_dev, int channum)
-{
- struct iio_buffer *ring = indio_dev->buffer;
- int count = 0, ret;
- u16 *ring_data;
-
- if (!(test_bit(channum, ring->scan_mask))) {
- ret = -EBUSY;
- goto error_ret;
- }
-
- ring_data = kmalloc(ring->access->get_bytes_per_datum(ring),
- GFP_KERNEL);
- if (ring_data == NULL) {
- ret = -ENOMEM;
- goto error_ret;
- }
- ret = ring->access->read_last(ring, (u8 *) ring_data);
- if (ret)
- goto error_free_ring_data;
- /* Need a count of channels prior to this one */
- count = bitmap_weight(ring->scan_mask, channum);
- ret = be16_to_cpu(ring_data[count]);
-
-error_free_ring_data:
- kfree(ring_data);
-error_ret:
- return ret;
-}
-
/**
* ad799x_ring_preenable() setup the parameters of the ring before enabling
*
--
1.7.7.3
^ permalink raw reply related [flat|nested] 20+ messages in thread* [PATCH 14/16] staging:iio:adc:max1363 stop reading from buffer for sysfs access
2011-11-27 13:33 [PATCH 00/16] staging:iio: buffer cleanup series Jonathan Cameron
` (9 preceding siblings ...)
2011-11-27 13:33 ` [PATCH 13/16] staging:iio:adc:ad799x stop reading from buffer for sysfs accesses Jonathan Cameron
@ 2011-11-27 13:33 ` Jonathan Cameron
2011-11-27 13:33 ` [PATCH 15/16] staging:iio:ring_sw don't provide read last function Jonathan Cameron
` (2 subsequent siblings)
13 siblings, 0 replies; 20+ messages in thread
From: Jonathan Cameron @ 2011-11-27 13:33 UTC (permalink / raw)
To: linux-iio; +Cc: lars, Michael.Hennerich, manuel.stahl, Jonathan Cameron
No known use case and makes in kernel interface work more complex.
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
---
drivers/staging/iio/adc/max1363.h | 7 ----
drivers/staging/iio/adc/max1363_core.c | 51 +++++++++++++------------------
drivers/staging/iio/adc/max1363_ring.c | 36 ----------------------
3 files changed, 21 insertions(+), 73 deletions(-)
diff --git a/drivers/staging/iio/adc/max1363.h b/drivers/staging/iio/adc/max1363.h
index fb52783..2cd0112 100644
--- a/drivers/staging/iio/adc/max1363.h
+++ b/drivers/staging/iio/adc/max1363.h
@@ -154,8 +154,6 @@ int max1363_set_scan_mode(struct max1363_state *st);
#ifdef CONFIG_MAX1363_RING_BUFFER
int max1363_update_scan_mode(struct iio_dev *indio_dev,
const unsigned long *scan_mask);
-int max1363_single_channel_from_ring(const long *mask,
- struct max1363_state *st);
int max1363_register_ring_funcs_and_init(struct iio_dev *indio_dev);
void max1363_ring_cleanup(struct iio_dev *indio_dev);
@@ -166,11 +164,6 @@ int max1363_update_scan_mode(struct iio_dev *indio_dev,
return 0;
}
-int max1363_single_channel_from_ring(long mask, struct max1363_state *st)
-{
- return -EINVAL;
-}
-
static inline int
max1363_register_ring_funcs_and_init(struct iio_dev *indio_dev)
{
diff --git a/drivers/staging/iio/adc/max1363_core.c b/drivers/staging/iio/adc/max1363_core.c
index 0b97123..1ce89ef 100644
--- a/drivers/staging/iio/adc/max1363_core.c
+++ b/drivers/staging/iio/adc/max1363_core.c
@@ -191,7 +191,6 @@ static int max1363_read_single_chan(struct iio_dev *indio_dev,
int ret = 0;
s32 data;
char rxbuf[2];
- const unsigned long *mask;
struct max1363_state *st = iio_priv(indio_dev);
struct i2c_client *client = st->client;
@@ -200,46 +199,38 @@ static int max1363_read_single_chan(struct iio_dev *indio_dev,
* If monitor mode is enabled, the method for reading a single
* channel will have to be rather different and has not yet
* been implemented.
+ *
+ * Also, cannot read directly if buffered capture enabled.
*/
- if (st->monitor_on) {
+ if (st->monitor_on || iio_buffer_enabled(indio_dev)) {
ret = -EBUSY;
goto error_ret;
}
- /* If ring buffer capture is occurring, query the buffer */
- if (iio_buffer_enabled(indio_dev)) {
- mask = max1363_mode_table[chan->address].modemask;
- data = max1363_single_channel_from_ring(mask, st);
+ /* Check to see if current scan mode is correct */
+ if (st->current_mode != &max1363_mode_table[chan->address]) {
+ /* Update scan mode if needed */
+ st->current_mode = &max1363_mode_table[chan->address];
+ ret = max1363_set_scan_mode(st);
+ if (ret < 0)
+ goto error_ret;
+ }
+ if (st->chip_info->bits != 8) {
+ /* Get reading */
+ data = i2c_master_recv(client, rxbuf, 2);
if (data < 0) {
ret = data;
goto error_ret;
}
+ data = (s32)(rxbuf[1]) | ((s32)(rxbuf[0] & 0x0F)) << 8;
} else {
- /* Check to see if current scan mode is correct */
- if (st->current_mode != &max1363_mode_table[chan->address]) {
- /* Update scan mode if needed */
- st->current_mode = &max1363_mode_table[chan->address];
- ret = max1363_set_scan_mode(st);
- if (ret < 0)
- goto error_ret;
- }
- if (st->chip_info->bits != 8) {
- /* Get reading */
- data = i2c_master_recv(client, rxbuf, 2);
- if (data < 0) {
- ret = data;
- goto error_ret;
- }
- data = (s32)(rxbuf[1]) | ((s32)(rxbuf[0] & 0x0F)) << 8;
- } else {
- /* Get reading */
- data = i2c_master_recv(client, rxbuf, 1);
- if (data < 0) {
- ret = data;
- goto error_ret;
- }
- data = rxbuf[0];
+ /* Get reading */
+ data = i2c_master_recv(client, rxbuf, 1);
+ if (data < 0) {
+ ret = data;
+ goto error_ret;
}
+ data = rxbuf[0];
}
*val = data;
error_ret:
diff --git a/drivers/staging/iio/adc/max1363_ring.c b/drivers/staging/iio/adc/max1363_ring.c
index 3a38a26..f730b3f 100644
--- a/drivers/staging/iio/adc/max1363_ring.c
+++ b/drivers/staging/iio/adc/max1363_ring.c
@@ -21,42 +21,6 @@
#include "max1363.h"
-int max1363_single_channel_from_ring(const long *mask, struct max1363_state *st)
-{
- struct iio_buffer *ring = iio_priv_to_dev(st)->buffer;
- int count = 0, ret, index;
- u8 *ring_data;
- index = find_first_bit(mask, MAX1363_MAX_CHANNELS);
-
- if (!(test_bit(index, st->current_mode->modemask))) {
- ret = -EBUSY;
- goto error_ret;
- }
-
- ring_data = kmalloc(ring->access->get_bytes_per_datum(ring),
- GFP_KERNEL);
- if (ring_data == NULL) {
- ret = -ENOMEM;
- goto error_ret;
- }
- ret = ring->access->read_last(ring, ring_data);
- if (ret)
- goto error_free_ring_data;
- /* Need a count of channels prior to this one */
-
- count = bitmap_weight(mask, index - 1);
- if (st->chip_info->bits != 8)
- ret = ((int)(ring_data[count*2 + 0] & 0x0F) << 8)
- + (int)(ring_data[count*2 + 1]);
- else
- ret = ring_data[count];
-
-error_free_ring_data:
- kfree(ring_data);
-error_ret:
- return ret;
-}
-
int max1363_update_scan_mode(struct iio_dev *indio_dev,
const unsigned long *scan_mask)
{
--
1.7.7.3
^ permalink raw reply related [flat|nested] 20+ messages in thread* [PATCH 15/16] staging:iio:ring_sw don't provide read last function.
2011-11-27 13:33 [PATCH 00/16] staging:iio: buffer cleanup series Jonathan Cameron
` (10 preceding siblings ...)
2011-11-27 13:33 ` [PATCH 14/16] staging:iio:adc:max1363 stop reading from buffer for sysfs access Jonathan Cameron
@ 2011-11-27 13:33 ` Jonathan Cameron
2011-11-27 13:33 ` [PATCH 16/16] staging:iio:buffer stop allowing for read_last callback Jonathan Cameron
2011-12-04 21:44 ` [PATCH 00/16] staging:iio: buffer cleanup series Lars-Peter Clausen
13 siblings, 0 replies; 20+ messages in thread
From: Jonathan Cameron @ 2011-11-27 13:33 UTC (permalink / raw)
To: linux-iio; +Cc: lars, Michael.Hennerich, manuel.stahl, Jonathan Cameron
No longer needed as we don't have drivers providing sysfs access
to buffered data.
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
---
drivers/staging/iio/ring_sw.c | 33 ---------------------------------
1 files changed, 0 insertions(+), 33 deletions(-)
diff --git a/drivers/staging/iio/ring_sw.c b/drivers/staging/iio/ring_sw.c
index 98fe819..37d26e6 100644
--- a/drivers/staging/iio/ring_sw.c
+++ b/drivers/staging/iio/ring_sw.c
@@ -23,7 +23,6 @@
* @data: the ring buffer memory
* @read_p: read pointer (oldest available)
* @write_p: write pointer
- * @last_written_p: read pointer (newest available)
* @half_p: half buffer length behind write_p (event generation)
* @use_count: reference count to prevent resizing when in use
* @update_needed: flag to indicated change in size requested
@@ -37,7 +36,6 @@ struct iio_sw_ring_buffer {
unsigned char *data;
unsigned char *read_p;
unsigned char *write_p;
- unsigned char *last_written_p;
/* used to act as a point at which to signal an event */
unsigned char *half_p;
int use_count;
@@ -56,7 +54,6 @@ static inline int __iio_allocate_sw_ring_buffer(struct iio_sw_ring_buffer *ring,
ring->data = kmalloc(length*ring->buf.bytes_per_datum, GFP_ATOMIC);
ring->read_p = NULL;
ring->write_p = NULL;
- ring->last_written_p = NULL;
ring->half_p = NULL;
return ring->data ? 0 : -ENOMEM;
}
@@ -115,7 +112,6 @@ static int iio_store_to_sw_ring(struct iio_sw_ring_buffer *ring,
* Always valid as either points to latest or second latest value.
* Before this runs it is null and read attempts fail with -EAGAIN.
*/
- ring->last_written_p = ring->write_p;
barrier();
/* temp_ptr used to ensure we never have an invalid pointer
* it may be slightly lagging, but never invalid
@@ -305,34 +301,6 @@ static int iio_store_to_sw_rb(struct iio_buffer *r,
return iio_store_to_sw_ring(ring, data, timestamp);
}
-static int iio_read_last_from_sw_ring(struct iio_sw_ring_buffer *ring,
- unsigned char *data)
-{
- unsigned char *last_written_p_copy;
-
- iio_mark_sw_rb_in_use(&ring->buf);
-again:
- barrier();
- last_written_p_copy = ring->last_written_p;
- barrier(); /*unnessecary? */
- /* Check there is anything here */
- if (last_written_p_copy == NULL)
- return -EAGAIN;
- memcpy(data, last_written_p_copy, ring->buf.bytes_per_datum);
-
- if (unlikely(ring->last_written_p != last_written_p_copy))
- goto again;
-
- iio_unmark_sw_rb_in_use(&ring->buf);
- return 0;
-}
-
-static int iio_read_last_from_sw_rb(struct iio_buffer *r,
- unsigned char *data)
-{
- return iio_read_last_from_sw_ring(iio_to_sw_ring(r), data);
-}
-
static int iio_request_update_sw_rb(struct iio_buffer *r)
{
int ret = 0;
@@ -435,7 +403,6 @@ const struct iio_buffer_access_funcs ring_sw_access_funcs = {
.mark_in_use = &iio_mark_sw_rb_in_use,
.unmark_in_use = &iio_unmark_sw_rb_in_use,
.store_to = &iio_store_to_sw_rb,
- .read_last = &iio_read_last_from_sw_rb,
.read_first_n = &iio_read_first_n_sw_rb,
.mark_param_change = &iio_mark_update_needed_sw_rb,
.request_update = &iio_request_update_sw_rb,
--
1.7.7.3
^ permalink raw reply related [flat|nested] 20+ messages in thread* [PATCH 16/16] staging:iio:buffer stop allowing for read_last callback.
2011-11-27 13:33 [PATCH 00/16] staging:iio: buffer cleanup series Jonathan Cameron
` (11 preceding siblings ...)
2011-11-27 13:33 ` [PATCH 15/16] staging:iio:ring_sw don't provide read last function Jonathan Cameron
@ 2011-11-27 13:33 ` Jonathan Cameron
2011-12-04 21:44 ` [PATCH 00/16] staging:iio: buffer cleanup series Lars-Peter Clausen
13 siblings, 0 replies; 20+ messages in thread
From: Jonathan Cameron @ 2011-11-27 13:33 UTC (permalink / raw)
To: linux-iio; +Cc: lars, Michael.Hennerich, manuel.stahl, Jonathan Cameron
No longer needed now we don't allow sysfs acccess to buffer data.
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
---
drivers/staging/iio/buffer.h | 2 --
1 files changed, 0 insertions(+), 2 deletions(-)
diff --git a/drivers/staging/iio/buffer.h b/drivers/staging/iio/buffer.h
index 98e9efa..7272333 100644
--- a/drivers/staging/iio/buffer.h
+++ b/drivers/staging/iio/buffer.h
@@ -21,7 +21,6 @@ struct iio_buffer;
* @mark_in_use: reference counting, typically to prevent module removal
* @unmark_in_use: reduce reference count when no longer using buffer
* @store_to: actually store stuff to the buffer
- * @read_last: get the last element stored
* @read_first_n: try to get a specified number of elements (must exist)
* @mark_param_change: notify buffer that some relevant parameter has changed
* Often this means the underlying storage may need to
@@ -48,7 +47,6 @@ struct iio_buffer_access_funcs {
void (*unmark_in_use)(struct iio_buffer *buffer);
int (*store_to)(struct iio_buffer *buffer, u8 *data, s64 timestamp);
- int (*read_last)(struct iio_buffer *buffer, u8 *data);
int (*read_first_n)(struct iio_buffer *buffer,
size_t n,
char __user *buf);
--
1.7.7.3
^ permalink raw reply related [flat|nested] 20+ messages in thread* Re: [PATCH 00/16] staging:iio: buffer cleanup series.
2011-11-27 13:33 [PATCH 00/16] staging:iio: buffer cleanup series Jonathan Cameron
` (12 preceding siblings ...)
2011-11-27 13:33 ` [PATCH 16/16] staging:iio:buffer stop allowing for read_last callback Jonathan Cameron
@ 2011-12-04 21:44 ` Lars-Peter Clausen
13 siblings, 0 replies; 20+ messages in thread
From: Lars-Peter Clausen @ 2011-12-04 21:44 UTC (permalink / raw)
To: Jonathan Cameron; +Cc: linux-iio, Michael.Hennerich, manuel.stahl
On 11/27/2011 02:33 PM, Jonathan Cameron wrote:
> A fairly straight forward set of cleanups of the buffer code.
> Recent discussion concluded that having access to channels being
> captured to a buffer by sysfs was an unnecessary complexity so that
> ist dropped. The other patches get rid of some infrastructure and
> move the setup ops from a buffer instance to the device (as they will
> be relevant to all buffers when we allow more than one)
>
> Anyhow, if people could verify I haven't messed any of this up, that
> would be great!
>
> Jonathan
Except for "scrap scan_count" patch this is all straight forward and obvious,
and as discussed moving the setup of the transfers from the irq handler to the
update_scan_mode callback seem to be the right thing to do. Also we don't want
to do endian conversion in the driver itself, so the bitmap_weight call in the
interrupt handler should be hopefully gone anyway soon.
So, all: Acked-by: Lars-Peter Clausen <lars@metafoo.de>
>
> Jonathan Cameron (16):
> staging:iio:buffer drop bpe field.
> staging:iio: remove userspace access to bytes per datum.
> staging:iio:buffer move setup ops from buffer instance to iio_dev
> staging:iio: scrap scan_count and ensure all drivers use
> active_scan_mask
> staging:iio:buffer remove unused owner field from struct iio_buffer
> staging:iio:accel:lis3l02dq scrap reading from buffer for sysfs
> access.
> staging:iio:adc:ad7192 scrap read from buffer for sysfs access.
> staging:iio:adc:ad7476 scrap read from buffer for sysfs access.
> staging:iio:adc:ad7606 remove buffer access for sysfs interfaces.
> staging:iio:adc:ad7606 remove buffer access to data from sysfs read.
> staging:iio:adc:ad7993 stop reading from buffer for sysfs raw read.
> staging:iio:adc:ad7887 stop reading from buffer for sysfs access.
> staging:iio:adc:ad799x stop reading from buffer for sysfs accesses
> staging:iio:adc:max1363 stop reading from buffer for sysfs access
> staging:iio:ring_sw don't provide read last function.
> staging:iio:buffer stop allowing for read_last callback.
>
> drivers/staging/iio/accel/adis16201_ring.c | 14 ++---
> drivers/staging/iio/accel/adis16203_ring.c | 14 ++---
> drivers/staging/iio/accel/adis16204_ring.c | 14 ++---
> drivers/staging/iio/accel/adis16209_ring.c | 9 ++--
> drivers/staging/iio/accel/adis16240_ring.c | 9 ++--
> drivers/staging/iio/accel/lis3l02dq.h | 12 -----
> drivers/staging/iio/accel/lis3l02dq_core.c | 9 +--
> drivers/staging/iio/accel/lis3l02dq_ring.c | 59 +++++-----------------
> drivers/staging/iio/accel/sca3000_ring.c | 4 +-
> drivers/staging/iio/adc/ad7192.c | 34 +++----------
> drivers/staging/iio/adc/ad7298.h | 5 --
> drivers/staging/iio/adc/ad7298_core.c | 8 +--
> drivers/staging/iio/adc/ad7298_ring.c | 43 +++-------------
> drivers/staging/iio/adc/ad7476.h | 5 --
> drivers/staging/iio/adc/ad7476_core.c | 2 +-
> drivers/staging/iio/adc/ad7476_ring.c | 29 +----------
> drivers/staging/iio/adc/ad7606.h | 1 -
> drivers/staging/iio/adc/ad7606_core.c | 2 +-
> drivers/staging/iio/adc/ad7606_ring.c | 28 +----------
> drivers/staging/iio/adc/ad7793.c | 35 +++----------
> drivers/staging/iio/adc/ad7887.h | 5 --
> drivers/staging/iio/adc/ad7887_core.c | 2 +-
> drivers/staging/iio/adc/ad7887_ring.c | 44 ++---------------
> drivers/staging/iio/adc/ad799x.h | 6 --
> drivers/staging/iio/adc/ad799x_core.c | 3 +-
> drivers/staging/iio/adc/ad799x_ring.c | 45 ++++--------------
> drivers/staging/iio/adc/max1363.h | 7 ---
> drivers/staging/iio/adc/max1363_core.c | 51 ++++++++------------
> drivers/staging/iio/adc/max1363_ring.c | 38 +--------------
> drivers/staging/iio/buffer.h | 33 -------------
> drivers/staging/iio/gyro/adis16260_ring.c | 9 ++--
> drivers/staging/iio/iio.h | 16 ++++++
> drivers/staging/iio/iio_simple_dummy_buffer.c | 12 ++--
> drivers/staging/iio/impedance-analyzer/ad5933.c | 16 ++++---
> drivers/staging/iio/imu/adis16400_ring.c | 23 +++++----
> drivers/staging/iio/industrialio-buffer.c | 37 ++++----------
> drivers/staging/iio/kfifo_buf.c | 2 -
> drivers/staging/iio/meter/ade7758_ring.c | 10 ++--
> drivers/staging/iio/ring_sw.c | 35 -------------
> 39 files changed, 177 insertions(+), 553 deletions(-)
>
^ permalink raw reply [flat|nested] 20+ messages in thread