linux-iio.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH V3 0/7] Add scan demux unit and use it in max1363
@ 2011-12-05 21:37 Jonathan Cameron
  2011-12-05 21:37 ` [PATCH 1/7] staging:iio:find iio channel from scan index util function Jonathan Cameron
                   ` (6 more replies)
  0 siblings, 7 replies; 12+ messages in thread
From: Jonathan Cameron @ 2011-12-05 21:37 UTC (permalink / raw)
  To: linux-iio, greg; +Cc: lars, Jonathan Cameron

Hi Greg,

The v3 here is just to indicate a tiny change suggested by
Lars-Peter from the version that has been out for review on
linux-iio. (Using ALIGN instead of hand rolling in one case
in patch 4).  Anyhow, not worth putting out for another review
as Lars-Peter has tested and acked without it anyway.

Technically Lars-Peter only acked patches 4 and 5 but they
are the important ones (the others being trivial or tied
up with the max1363 driver which is one of mine..)

This set introduces the an optional demultiplexer into the
path of data form devices to buffers.  It is a necessary step
on the path to in kernel push interfaces (trigger driven ones).
Also rather useful on it's own as shown by the max1363 patches
and some uses Lars-Peter has made of it in another series.

Anyhow fair bit more to come so time to send these on to you!

Thanks,

Jonathan

v2 text:
Hi All,

New version of this series.  Two changes as per Lars-Peter's
suggestions.  ALIGN macro usage in patch 4 and one of the two
for each bit set suggestions.  The second is subtly different
as it is finding bits after a certain point rather than from
the start.

As explained in patch 5 discussion, I personally feel that
the demux should occur prior to the buffer and avoiding the
extra copy should be done by allowing buffers to provide
callbacks for reserving (plus getting access to) space and
notifying that they are done filling it.   Either way, now
is not the time to do this change. Too much else going on!

v1 text:
The last patch technically is a simple bug fix, but included here as
it came up during testing of this series.

The 'interesting' bits are the rewrite of iio_sw_buffer_preenable. I'd like
people with drivers currently using that function to test and see what
I have broken.  We should also be able to drop a number of cases in specific
drivers in favour of this version.

The demux unit is designed to offer a straight path with little or no
overhead if the client (here still the IIO buffer) needs all the data and to
only get in the way when a subset of the active scan mask is requested.

I may well have messed this up so please please test this set.


Jonathan Cameron (7):
  staging:iio:find iio channel from scan index util function
  staging:iio:buffer add a cache of the timestamp scan index.
  staging:iio: add hook to allow core to perform scan related config.
  staging:iio: make iio_sw_buffer_preenable much more general.
  staging:iio: add demux optionally to path from device to buffer
  staging:iio:adc:max1363 use new demuxing support.
  staging:iio:adc:max1363 correctly set channels as big endian.

 drivers/staging/iio/adc/max1363.h         |   11 ++-
 drivers/staging/iio/adc/max1363_core.c    |   18 ++-
 drivers/staging/iio/adc/max1363_ring.c    |   51 ++-----
 drivers/staging/iio/buffer.h              |   16 ++
 drivers/staging/iio/iio.h                 |   13 ++-
 drivers/staging/iio/industrialio-buffer.c |  212 +++++++++++++++++++++++++----
 drivers/staging/iio/industrialio-core.c   |   11 ++
 7 files changed, 259 insertions(+), 73 deletions(-)

-- 
1.7.7.4

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH 1/7] staging:iio:find iio channel from scan index util function
  2011-12-05 21:37 [PATCH V3 0/7] Add scan demux unit and use it in max1363 Jonathan Cameron
@ 2011-12-05 21:37 ` Jonathan Cameron
  2011-12-05 21:37 ` [PATCH 2/7] staging:iio:buffer add a cache of the timestamp scan index Jonathan Cameron
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 12+ messages in thread
From: Jonathan Cameron @ 2011-12-05 21:37 UTC (permalink / raw)
  To: linux-iio, greg; +Cc: lars, Jonathan Cameron

From: Jonathan Cameron <jic23@cam.ac.uk>

Useful for getting to the channel based on scan mask alone.

Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
---
 drivers/staging/iio/iio.h               |    8 ++++++++
 drivers/staging/iio/industrialio-core.c |   11 +++++++++++
 2 files changed, 19 insertions(+), 0 deletions(-)

diff --git a/drivers/staging/iio/iio.h b/drivers/staging/iio/iio.h
index 4aed915..95d6318 100644
--- a/drivers/staging/iio/iio.h
+++ b/drivers/staging/iio/iio.h
@@ -323,6 +323,14 @@ struct iio_dev {
 };
 
 /**
+ * iio_find_channel_from_si() - get channel from its scan index
+ * @indio_dev:		device
+ * @si:			scan index to match
+ */
+const struct iio_chan_spec
+*iio_find_channel_from_si(struct iio_dev *indio_dev, int si);
+
+/**
  * iio_device_register() - register a device with the IIO subsystem
  * @indio_dev:		Device structure filled by the device driver
  **/
diff --git a/drivers/staging/iio/industrialio-core.c b/drivers/staging/iio/industrialio-core.c
index d8cd9e3..dbd1ce1 100644
--- a/drivers/staging/iio/industrialio-core.c
+++ b/drivers/staging/iio/industrialio-core.c
@@ -89,6 +89,17 @@ static const char * const iio_chan_info_postfix[] = {
 	= "filter_low_pass_3db_frequency",
 };
 
+const struct iio_chan_spec
+*iio_find_channel_from_si(struct iio_dev *indio_dev, int si)
+{
+	int i;
+
+	for (i = 0; i < indio_dev->num_channels; i++)
+		if (indio_dev->channels[i].scan_index == si)
+			return &indio_dev->channels[i];
+	return NULL;
+}
+
 /**
  * struct iio_detected_event_list - list element for events that have occurred
  * @list:		linked list header
-- 
1.7.7.4

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 2/7] staging:iio:buffer add a cache of the timestamp scan index.
  2011-12-05 21:37 [PATCH V3 0/7] Add scan demux unit and use it in max1363 Jonathan Cameron
  2011-12-05 21:37 ` [PATCH 1/7] staging:iio:find iio channel from scan index util function Jonathan Cameron
@ 2011-12-05 21:37 ` Jonathan Cameron
  2011-12-05 21:37 ` [PATCH 3/7] staging:iio: add hook to allow core to perform scan related config Jonathan Cameron
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 12+ messages in thread
From: Jonathan Cameron @ 2011-12-05 21:37 UTC (permalink / raw)
  To: linux-iio, greg; +Cc: lars, Jonathan Cameron

From: Jonathan Cameron <jic23@cam.ac.uk>

Basically avoids looking it up lots of times.

Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
---
 drivers/staging/iio/buffer.h              |    1 +
 drivers/staging/iio/industrialio-buffer.c |    3 +++
 2 files changed, 4 insertions(+), 0 deletions(-)

diff --git a/drivers/staging/iio/buffer.h b/drivers/staging/iio/buffer.h
index 9de581e..4b8f619 100644
--- a/drivers/staging/iio/buffer.h
+++ b/drivers/staging/iio/buffer.h
@@ -106,6 +106,7 @@ struct iio_buffer {
 	int					scan_count;
 	long					*scan_mask;
 	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;
diff --git a/drivers/staging/iio/industrialio-buffer.c b/drivers/staging/iio/industrialio-buffer.c
index 8c55980..b2cf3e3 100644
--- a/drivers/staging/iio/industrialio-buffer.c
+++ b/drivers/staging/iio/industrialio-buffer.c
@@ -313,6 +313,9 @@ int iio_buffer_register(struct iio_dev *indio_dev,
 			if (ret < 0)
 				goto error_cleanup_dynamic;
 			attrcount += ret;
+			if (channels[i].type == IIO_TIMESTAMP)
+				buffer->scan_index_timestamp =
+					channels[i].scan_index;
 		}
 		if (indio_dev->masklength && buffer->scan_mask == NULL) {
 			buffer->scan_mask = kcalloc(BITS_TO_LONGS(indio_dev->masklength),
-- 
1.7.7.4

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 3/7] staging:iio: add hook to allow core to perform scan related config.
  2011-12-05 21:37 [PATCH V3 0/7] Add scan demux unit and use it in max1363 Jonathan Cameron
  2011-12-05 21:37 ` [PATCH 1/7] staging:iio:find iio channel from scan index util function Jonathan Cameron
  2011-12-05 21:37 ` [PATCH 2/7] staging:iio:buffer add a cache of the timestamp scan index Jonathan Cameron
@ 2011-12-05 21:37 ` Jonathan Cameron
  2011-12-05 21:37 ` [PATCH 4/7] staging:iio: make iio_sw_buffer_preenable much more general Jonathan Cameron
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 12+ messages in thread
From: Jonathan Cameron @ 2011-12-05 21:37 UTC (permalink / raw)
  To: linux-iio, greg; +Cc: lars, Jonathan Cameron

Signed-off-by: Jonathan Cameron <jic23@kernel.org>
---
 drivers/staging/iio/iio.h |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/drivers/staging/iio/iio.h b/drivers/staging/iio/iio.h
index 95d6318..4fb8f2f 100644
--- a/drivers/staging/iio/iio.h
+++ b/drivers/staging/iio/iio.h
@@ -262,7 +262,8 @@ struct iio_info {
 				 int val);
 	int (*validate_trigger)(struct iio_dev *indio_dev,
 				struct iio_trigger *trig);
-
+	int (*update_scan_mode)(struct iio_dev *indio_dev,
+				const unsigned long *scan_mask);
 };
 
 /**
-- 
1.7.7.4

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 4/7] staging:iio: make iio_sw_buffer_preenable much more general.
  2011-12-05 21:37 [PATCH V3 0/7] Add scan demux unit and use it in max1363 Jonathan Cameron
                   ` (2 preceding siblings ...)
  2011-12-05 21:37 ` [PATCH 3/7] staging:iio: add hook to allow core to perform scan related config Jonathan Cameron
@ 2011-12-05 21:37 ` Jonathan Cameron
  2011-12-05 21:37 ` [PATCH 5/7] staging:iio: add demux optionally to path from device to buffer Jonathan Cameron
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 12+ messages in thread
From: Jonathan Cameron @ 2011-12-05 21:37 UTC (permalink / raw)
  To: linux-iio, greg; +Cc: lars, Jonathan Cameron

Also introduces active_scan_mask storage to tell the core what is
really being currently captured from the device (different from
what is desired as often has bonus channels).

Signed-off-by: Jonathan Cameron <jic23@kernel.org>
Acked-by: Lars-Peter Clausen <lars@metafoo.de>
Tested-by: Lars-Peter Clausen <lars@metafoo.de>
---
 drivers/staging/iio/iio.h                 |    2 +
 drivers/staging/iio/industrialio-buffer.c |   63 +++++++++++++++++------------
 2 files changed, 39 insertions(+), 26 deletions(-)

diff --git a/drivers/staging/iio/iio.h b/drivers/staging/iio/iio.h
index 4fb8f2f..c225542 100644
--- a/drivers/staging/iio/iio.h
+++ b/drivers/staging/iio/iio.h
@@ -280,6 +280,7 @@ struct iio_info {
  * @available_scan_masks: [DRIVER] optional array of allowed bitmasks
  * @masklength:		[INTERN] the length of the mask established from
  *			channels
+ * @active_scan_mask:	[INTERN] union of all scan masks requested by buffers
  * @trig:		[INTERN] current device trigger (buffer modes)
  * @pollfunc:		[DRIVER] function run on trigger being received
  * @channels:		[DRIVER] channel specification structure table
@@ -307,6 +308,7 @@ struct iio_dev {
 
 	unsigned long			*available_scan_masks;
 	unsigned			masklength;
+	unsigned long			*active_scan_mask;
 	struct iio_trigger		*trig;
 	struct iio_poll_func		*pollfunc;
 
diff --git a/drivers/staging/iio/industrialio-buffer.c b/drivers/staging/iio/industrialio-buffer.c
index b2cf3e3..e088a5c 100644
--- a/drivers/staging/iio/industrialio-buffer.c
+++ b/drivers/staging/iio/industrialio-buffer.c
@@ -531,32 +531,6 @@ ssize_t iio_buffer_show_enable(struct device *dev,
 }
 EXPORT_SYMBOL(iio_buffer_show_enable);
 
-int iio_sw_buffer_preenable(struct iio_dev *indio_dev)
-{
-	struct iio_buffer *buffer = indio_dev->buffer;
-	size_t size;
-	dev_dbg(&indio_dev->dev, "%s\n", __func__);
-	/* Check if there are any scan elements enabled, if not fail*/
-	if (!(buffer->scan_count || buffer->scan_timestamp))
-		return -EINVAL;
-	if (buffer->scan_timestamp)
-		if (buffer->scan_count)
-			/* Timestamp (aligned to s64) and data */
-			size = (((buffer->scan_count * buffer->bpe)
-					+ sizeof(s64) - 1)
-				& ~(sizeof(s64) - 1))
-				+ sizeof(s64);
-		else /* Timestamp only  */
-			size = sizeof(s64);
-	else /* Data only */
-		size = buffer->scan_count * buffer->bpe;
-	buffer->access->set_bytes_per_datum(buffer, size);
-
-	return 0;
-}
-EXPORT_SYMBOL(iio_sw_buffer_preenable);
-
-
 /* note NULL used as error indicator as it doesn't make sense. */
 static unsigned long *iio_scan_mask_match(unsigned long *av_masks,
 					  unsigned int masklength,
@@ -572,6 +546,43 @@ static unsigned long *iio_scan_mask_match(unsigned long *av_masks,
 	return NULL;
 }
 
+int iio_sw_buffer_preenable(struct iio_dev *indio_dev)
+{
+	struct iio_buffer *buffer = indio_dev->buffer;
+	const struct iio_chan_spec *ch;
+	unsigned bytes = 0;
+	int length, i;
+	dev_dbg(&indio_dev->dev, "%s\n", __func__);
+
+	/* How much space will the demuxed element take? */
+	for_each_set_bit(i, buffer->scan_mask,
+			 indio_dev->masklength) {
+		ch = iio_find_channel_from_si(indio_dev, i);
+		length = ch->scan_type.storagebits/8;
+		bytes = ALIGN(bytes, length);
+		bytes += length;
+	}
+	if (buffer->scan_timestamp) {
+		ch = iio_find_channel_from_si(indio_dev,
+					      buffer->scan_index_timestamp);
+		length = ch->scan_type.storagebits/8;
+		bytes = ALIGN(bytes, length);
+		bytes += length;
+	}
+	buffer->access->set_bytes_per_datum(buffer, bytes);
+
+	/* What scan mask do we actually have ?*/
+	if (indio_dev->available_scan_masks)
+		indio_dev->active_scan_mask =
+			iio_scan_mask_match(indio_dev->available_scan_masks,
+					    indio_dev->masklength,
+					    buffer->scan_mask);
+	else
+		indio_dev->active_scan_mask = buffer->scan_mask;
+	return 0;
+}
+EXPORT_SYMBOL(iio_sw_buffer_preenable);
+
 /**
  * iio_scan_mask_set() - set particular bit in the scan mask
  * @buffer: the buffer whose scan mask we are interested in
-- 
1.7.7.4

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 5/7] staging:iio: add demux optionally to path from device to buffer
  2011-12-05 21:37 [PATCH V3 0/7] Add scan demux unit and use it in max1363 Jonathan Cameron
                   ` (3 preceding siblings ...)
  2011-12-05 21:37 ` [PATCH 4/7] staging:iio: make iio_sw_buffer_preenable much more general Jonathan Cameron
@ 2011-12-05 21:37 ` Jonathan Cameron
  2011-12-05 21:37 ` [PATCH 7/7] staging:iio:adc:max1363 correctly set channels as big endian Jonathan Cameron
  2011-12-06 15:39 ` [PATCH V3 0/7] Add scan demux unit and use it in max1363 Maxime Ripard
  6 siblings, 0 replies; 12+ messages in thread
From: Jonathan Cameron @ 2011-12-05 21:37 UTC (permalink / raw)
  To: linux-iio, greg; +Cc: lars, Jonathan Cameron

From: Jonathan Cameron <jic23@cam.ac.uk>

This gives you only what you ask for which is handy
for some devices with weird scan combinations.

Routes all data flow through a core utility function.
That and this demuxing support will be needed to do
demuxing to multiple destinations in kernel.

Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
Acked-by: Lars-Peter Clausen <lars@metafoo.de>
Tested-by: Lars-Peter Clausen <lars@metafoo.de>
---
 drivers/staging/iio/buffer.h              |   15 +++
 drivers/staging/iio/industrialio-buffer.c |  146 ++++++++++++++++++++++++++++-
 2 files changed, 157 insertions(+), 4 deletions(-)

diff --git a/drivers/staging/iio/buffer.h b/drivers/staging/iio/buffer.h
index 4b8f619..5282441 100644
--- a/drivers/staging/iio/buffer.h
+++ b/drivers/staging/iio/buffer.h
@@ -95,6 +95,8 @@ struct iio_buffer_setup_ops {
  * @access:		[DRIVER] buffer access functions associated with the
  *			implementation.
  * @flags:		[INTERN] file ops related flags including busy flag.
+ * @demux_list:		[INTERN] list of operations required to demux the scan.
+ * @demux_bounce:	[INTERN] buffer for doing gather from incoming scan.
  **/
 struct iio_buffer {
 	struct iio_dev				*indio_dev;
@@ -115,6 +117,8 @@ struct iio_buffer {
 	bool					stufftoread;
 	unsigned long				flags;
 	const struct attribute_group *attrs;
+	struct list_head			demux_list;
+	unsigned char				*demux_bounce;
 };
 
 /**
@@ -153,6 +157,17 @@ int iio_scan_mask_set(struct iio_buffer *buffer, int bit);
 	container_of(d, struct iio_buffer, dev)
 
 /**
+ * iio_push_to_buffer() - push to a registered buffer.
+ * @buffer:		IIO buffer structure for device
+ * @scan:		Full scan.
+ * @timestamp:
+ */
+int iio_push_to_buffer(struct iio_buffer *buffer, unsigned char *data,
+		       s64 timestamp);
+
+int iio_update_demux(struct iio_dev *indio_dev);
+
+/**
  * iio_buffer_register() - register the buffer with IIO core
  * @indio_dev: device with the buffer to be registered
  **/
diff --git a/drivers/staging/iio/industrialio-buffer.c b/drivers/staging/iio/industrialio-buffer.c
index e088a5c..ff14f12 100644
--- a/drivers/staging/iio/industrialio-buffer.c
+++ b/drivers/staging/iio/industrialio-buffer.c
@@ -87,6 +87,7 @@ void iio_chrdev_buffer_release(struct iio_dev *indio_dev)
 
 void iio_buffer_init(struct iio_buffer *buffer, struct iio_dev *indio_dev)
 {
+	INIT_LIST_HEAD(&buffer->demux_list);
 	buffer->indio_dev = indio_dev;
 	init_waitqueue_head(&buffer->pollq);
 }
@@ -128,10 +129,9 @@ static ssize_t iio_scan_el_show(struct device *dev,
 	int ret;
 	struct iio_dev *indio_dev = dev_get_drvdata(dev);
 
-	ret = iio_scan_mask_query(indio_dev->buffer,
-				  to_iio_dev_attr(attr)->address);
-	if (ret < 0)
-		return ret;
+	ret = test_bit(to_iio_dev_attr(attr)->address,
+		       indio_dev->buffer->scan_mask);
+
 	return sprintf(buf, "%d\n", ret);
 }
 
@@ -579,6 +579,12 @@ int iio_sw_buffer_preenable(struct iio_dev *indio_dev)
 					    buffer->scan_mask);
 	else
 		indio_dev->active_scan_mask = buffer->scan_mask;
+	iio_update_demux(indio_dev);
+
+	if (indio_dev->info->update_scan_mode)
+		return indio_dev->info
+			->update_scan_mode(indio_dev,
+					   indio_dev->active_scan_mask);
 	return 0;
 }
 EXPORT_SYMBOL(iio_sw_buffer_preenable);
@@ -648,3 +654,135 @@ int iio_scan_mask_query(struct iio_buffer *buffer, int bit)
 	return test_bit(bit, mask);
 };
 EXPORT_SYMBOL_GPL(iio_scan_mask_query);
+
+/**
+ * struct iio_demux_table() - table describing demux memcpy ops
+ * @from:	index to copy from
+ * @to:	index to copy to
+ * @length:	how many bytes to copy
+ * @l:		list head used for management
+ */
+struct iio_demux_table {
+	unsigned from;
+	unsigned to;
+	unsigned length;
+	struct list_head l;
+};
+
+static unsigned char *iio_demux(struct iio_buffer *buffer,
+				 unsigned char *datain)
+{
+	struct iio_demux_table *t;
+
+	if (list_empty(&buffer->demux_list))
+		return datain;
+	list_for_each_entry(t, &buffer->demux_list, l)
+		memcpy(buffer->demux_bounce + t->to,
+		       datain + t->from, t->length);
+
+	return buffer->demux_bounce;
+}
+
+int iio_push_to_buffer(struct iio_buffer *buffer, unsigned char *data,
+		       s64 timestamp)
+{
+	unsigned char *dataout = iio_demux(buffer, data);
+
+	return buffer->access->store_to(buffer, dataout, timestamp);
+}
+EXPORT_SYMBOL_GPL(iio_push_to_buffer);
+
+int iio_update_demux(struct iio_dev *indio_dev)
+{
+	const struct iio_chan_spec *ch;
+	struct iio_buffer *buffer = indio_dev->buffer;
+	int ret, in_ind = -1, out_ind, length;
+	unsigned in_loc = 0, out_loc = 0;
+	struct iio_demux_table *p, *q;
+
+	/* Clear out any old demux */
+	list_for_each_entry_safe(p, q, &buffer->demux_list, l) {
+		list_del(&p->l);
+		kfree(p);
+	}
+	kfree(buffer->demux_bounce);
+	buffer->demux_bounce = NULL;
+
+	/* First work out which scan mode we will actually have */
+	if (bitmap_equal(indio_dev->active_scan_mask,
+			 buffer->scan_mask,
+			 indio_dev->masklength))
+		return 0;
+
+	/* Now we have the two masks, work from least sig and build up sizes */
+	for_each_set_bit(out_ind,
+			 indio_dev->active_scan_mask,
+			 indio_dev->masklength) {
+		in_ind = find_next_bit(indio_dev->active_scan_mask,
+				       indio_dev->masklength,
+				       in_ind + 1);
+		while (in_ind != out_ind) {
+			in_ind = find_next_bit(indio_dev->active_scan_mask,
+					       indio_dev->masklength,
+					       in_ind + 1);
+			ch = iio_find_channel_from_si(indio_dev, in_ind);
+			length = ch->scan_type.storagebits/8;
+			/* Make sure we are aligned */
+			in_loc += length;
+			if (in_loc % length)
+				in_loc += length - in_loc % length;
+		}
+		p = kmalloc(sizeof(*p), GFP_KERNEL);
+		if (p == NULL) {
+			ret = -ENOMEM;
+			goto error_clear_mux_table;
+		}
+		ch = iio_find_channel_from_si(indio_dev, in_ind);
+		length = ch->scan_type.storagebits/8;
+		if (out_loc % length)
+			out_loc += length - out_loc % length;
+		if (in_loc % length)
+			in_loc += length - in_loc % length;
+		p->from = in_loc;
+		p->to = out_loc;
+		p->length = length;
+		list_add_tail(&p->l, &buffer->demux_list);
+		out_loc += length;
+		in_loc += length;
+	}
+	/* Relies on scan_timestamp being last */
+	if (buffer->scan_timestamp) {
+		p = kmalloc(sizeof(*p), GFP_KERNEL);
+		if (p == NULL) {
+			ret = -ENOMEM;
+			goto error_clear_mux_table;
+		}
+		ch = iio_find_channel_from_si(indio_dev,
+			buffer->scan_index_timestamp);
+		length = ch->scan_type.storagebits/8;
+		if (out_loc % length)
+			out_loc += length - out_loc % length;
+		if (in_loc % length)
+			in_loc += length - in_loc % length;
+		p->from = in_loc;
+		p->to = out_loc;
+		p->length = length;
+		list_add_tail(&p->l, &buffer->demux_list);
+		out_loc += length;
+		in_loc += length;
+	}
+	buffer->demux_bounce = kzalloc(out_loc, GFP_KERNEL);
+	if (buffer->demux_bounce == NULL) {
+		ret = -ENOMEM;
+		goto error_clear_mux_table;
+	}
+	return 0;
+
+error_clear_mux_table:
+	list_for_each_entry_safe(p, q, &buffer->demux_list, l) {
+		list_del(&p->l);
+		kfree(p);
+	}
+	return ret;
+}
+EXPORT_SYMBOL_GPL(iio_update_demux);
-- 
1.7.7.4

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 7/7] staging:iio:adc:max1363 correctly set channels as big endian.
  2011-12-05 21:37 [PATCH V3 0/7] Add scan demux unit and use it in max1363 Jonathan Cameron
                   ` (4 preceding siblings ...)
  2011-12-05 21:37 ` [PATCH 5/7] staging:iio: add demux optionally to path from device to buffer Jonathan Cameron
@ 2011-12-05 21:37 ` Jonathan Cameron
  2011-12-06 15:39 ` [PATCH V3 0/7] Add scan demux unit and use it in max1363 Maxime Ripard
  6 siblings, 0 replies; 12+ messages in thread
From: Jonathan Cameron @ 2011-12-05 21:37 UTC (permalink / raw)
  To: linux-iio, greg; +Cc: lars, Jonathan Cameron

From: Jonathan Cameron <jic23@cam.ac.uk>

Also, the differential channels should always have been signed.

Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
---
 drivers/staging/iio/adc/max1363_core.c |   14 ++++++++++++--
 1 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/drivers/staging/iio/adc/max1363_core.c b/drivers/staging/iio/adc/max1363_core.c
index 7e078fc..9febd1b 100644
--- a/drivers/staging/iio/adc/max1363_core.c
+++ b/drivers/staging/iio/adc/max1363_core.c
@@ -298,7 +298,12 @@ static const enum max1363_modes max1363_mode_list[] = {
 		.channel = num,						\
 		.address = addr,					\
 		.info_mask = MAX1363_INFO_MASK,				\
-		.scan_type = IIO_ST('u', bits, (bits > 8) ? 16 : 8, 0), \
+		.scan_type = {						\
+			.sign = 'u',					\
+			.realbits = bits,				\
+			.storagebits = (bits > 8) ? 16 : 8,		\
+			.endianness = IIO_BE,				\
+		},							\
 		.scan_index = si,					\
 		.event_mask = evmask,					\
 	}
@@ -313,7 +318,12 @@ static const enum max1363_modes max1363_mode_list[] = {
 		.channel2 = num2,					\
 		.address = addr,					\
 		.info_mask = MAX1363_INFO_MASK,				\
-		.scan_type = IIO_ST('u', bits, (bits > 8) ? 16 : 8, 0), \
+		.scan_type = {						\
+			.sign = 's',					\
+			.realbits = bits,				\
+			.storagebits = (bits > 8) ? 16 : 8,		\
+			.endianness = IIO_BE,				\
+		},							\
 		.scan_index = si,					\
 		.event_mask = evmask,					\
 	}
-- 
1.7.7.4

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH V3 0/7] Add scan demux unit and use it in max1363
  2011-12-05 21:37 [PATCH V3 0/7] Add scan demux unit and use it in max1363 Jonathan Cameron
                   ` (5 preceding siblings ...)
  2011-12-05 21:37 ` [PATCH 7/7] staging:iio:adc:max1363 correctly set channels as big endian Jonathan Cameron
@ 2011-12-06 15:39 ` Maxime Ripard
  2011-12-06 15:51   ` Lars-Peter Clausen
  6 siblings, 1 reply; 12+ messages in thread
From: Maxime Ripard @ 2011-12-06 15:39 UTC (permalink / raw)
  To: Jonathan Cameron; +Cc: linux-iio

Hi Jonathan,

I can't seem to find a proper way to apply this patchset. On what
patchset is it based ?

I'm still here with what seems to be a rather old version of your tree
(3413ec), but it is still the head of your git tree on kernel.org.

Thanks,
Maxime

On 05/12/2011 22:37, Jonathan Cameron wrote:
> Hi Greg,
> 
> The v3 here is just to indicate a tiny change suggested by
> Lars-Peter from the version that has been out for review on
> linux-iio. (Using ALIGN instead of hand rolling in one case
> in patch 4).  Anyhow, not worth putting out for another review
> as Lars-Peter has tested and acked without it anyway.
> 
> Technically Lars-Peter only acked patches 4 and 5 but they
> are the important ones (the others being trivial or tied
> up with the max1363 driver which is one of mine..)
> 
> This set introduces the an optional demultiplexer into the
> path of data form devices to buffers.  It is a necessary step
> on the path to in kernel push interfaces (trigger driven ones).
> Also rather useful on it's own as shown by the max1363 patches
> and some uses Lars-Peter has made of it in another series.
> 
> Anyhow fair bit more to come so time to send these on to you!
> 
> Thanks,
> 
> Jonathan
> 
> v2 text:
> Hi All,
> 
> New version of this series.  Two changes as per Lars-Peter's
> suggestions.  ALIGN macro usage in patch 4 and one of the two
> for each bit set suggestions.  The second is subtly different
> as it is finding bits after a certain point rather than from
> the start.
> 
> As explained in patch 5 discussion, I personally feel that
> the demux should occur prior to the buffer and avoiding the
> extra copy should be done by allowing buffers to provide
> callbacks for reserving (plus getting access to) space and
> notifying that they are done filling it.   Either way, now
> is not the time to do this change. Too much else going on!
> 
> v1 text:
> The last patch technically is a simple bug fix, but included here as
> it came up during testing of this series.
> 
> The 'interesting' bits are the rewrite of iio_sw_buffer_preenable. I'd like
> people with drivers currently using that function to test and see what
> I have broken.  We should also be able to drop a number of cases in specific
> drivers in favour of this version.
> 
> The demux unit is designed to offer a straight path with little or no
> overhead if the client (here still the IIO buffer) needs all the data and to
> only get in the way when a subset of the active scan mask is requested.
> 
> I may well have messed this up so please please test this set.
> 
> 
> Jonathan Cameron (7):
>   staging:iio:find iio channel from scan index util function
>   staging:iio:buffer add a cache of the timestamp scan index.
>   staging:iio: add hook to allow core to perform scan related config.
>   staging:iio: make iio_sw_buffer_preenable much more general.
>   staging:iio: add demux optionally to path from device to buffer
>   staging:iio:adc:max1363 use new demuxing support.
>   staging:iio:adc:max1363 correctly set channels as big endian.
> 
>  drivers/staging/iio/adc/max1363.h         |   11 ++-
>  drivers/staging/iio/adc/max1363_core.c    |   18 ++-
>  drivers/staging/iio/adc/max1363_ring.c    |   51 ++-----
>  drivers/staging/iio/buffer.h              |   16 ++
>  drivers/staging/iio/iio.h                 |   13 ++-
>  drivers/staging/iio/industrialio-buffer.c |  212 +++++++++++++++++++++++++----
>  drivers/staging/iio/industrialio-core.c   |   11 ++
>  7 files changed, 259 insertions(+), 73 deletions(-)
> 


-- 
Maxime Ripard, Free Electrons
Kernel, drivers, real-time and embedded Linux
development, consulting, training and support.
http://free-electrons.com

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH V3 0/7] Add scan demux unit and use it in max1363
  2011-12-06 15:39 ` [PATCH V3 0/7] Add scan demux unit and use it in max1363 Maxime Ripard
@ 2011-12-06 15:51   ` Lars-Peter Clausen
  2011-12-06 17:05     ` Jonathan Cameron
  0 siblings, 1 reply; 12+ messages in thread
From: Lars-Peter Clausen @ 2011-12-06 15:51 UTC (permalink / raw)
  To: Maxime Ripard; +Cc: Jonathan Cameron, linux-iio

On 12/06/2011 04:39 PM, Maxime Ripard wrote:
> Hi Jonathan,
> 
> I can't seem to find a proper way to apply this patchset. On what
> patchset is it based ?
> 
> I'm still here with what seems to be a rather old version of your tree
> (3413ec), but it is still the head of your git tree on kernel.org.
> 
> Thanks,
> Maxime

It should apply to staging/staging-next

> 
> On 05/12/2011 22:37, Jonathan Cameron wrote:
>> Hi Greg,
>>
>> The v3 here is just to indicate a tiny change suggested by
>> Lars-Peter from the version that has been out for review on
>> linux-iio. (Using ALIGN instead of hand rolling in one case
>> in patch 4).  Anyhow, not worth putting out for another review
>> as Lars-Peter has tested and acked without it anyway.
>>
>> Technically Lars-Peter only acked patches 4 and 5 but they
>> are the important ones (the others being trivial or tied
>> up with the max1363 driver which is one of mine..)
>>
>> This set introduces the an optional demultiplexer into the
>> path of data form devices to buffers.  It is a necessary step
>> on the path to in kernel push interfaces (trigger driven ones).
>> Also rather useful on it's own as shown by the max1363 patches
>> and some uses Lars-Peter has made of it in another series.
>>
>> Anyhow fair bit more to come so time to send these on to you!
>>
>> Thanks,
>>
>> Jonathan
>>
>> v2 text:
>> Hi All,
>>
>> New version of this series.  Two changes as per Lars-Peter's
>> suggestions.  ALIGN macro usage in patch 4 and one of the two
>> for each bit set suggestions.  The second is subtly different
>> as it is finding bits after a certain point rather than from
>> the start.
>>
>> As explained in patch 5 discussion, I personally feel that
>> the demux should occur prior to the buffer and avoiding the
>> extra copy should be done by allowing buffers to provide
>> callbacks for reserving (plus getting access to) space and
>> notifying that they are done filling it.   Either way, now
>> is not the time to do this change. Too much else going on!
>>
>> v1 text:
>> The last patch technically is a simple bug fix, but included here as
>> it came up during testing of this series.
>>
>> The 'interesting' bits are the rewrite of iio_sw_buffer_preenable. I'd like
>> people with drivers currently using that function to test and see what
>> I have broken.  We should also be able to drop a number of cases in specific
>> drivers in favour of this version.
>>
>> The demux unit is designed to offer a straight path with little or no
>> overhead if the client (here still the IIO buffer) needs all the data and to
>> only get in the way when a subset of the active scan mask is requested.
>>
>> I may well have messed this up so please please test this set.
>>
>>
>> Jonathan Cameron (7):
>>   staging:iio:find iio channel from scan index util function
>>   staging:iio:buffer add a cache of the timestamp scan index.
>>   staging:iio: add hook to allow core to perform scan related config.
>>   staging:iio: make iio_sw_buffer_preenable much more general.
>>   staging:iio: add demux optionally to path from device to buffer
>>   staging:iio:adc:max1363 use new demuxing support.
>>   staging:iio:adc:max1363 correctly set channels as big endian.
>>
>>  drivers/staging/iio/adc/max1363.h         |   11 ++-
>>  drivers/staging/iio/adc/max1363_core.c    |   18 ++-
>>  drivers/staging/iio/adc/max1363_ring.c    |   51 ++-----
>>  drivers/staging/iio/buffer.h              |   16 ++
>>  drivers/staging/iio/iio.h                 |   13 ++-
>>  drivers/staging/iio/industrialio-buffer.c |  212 +++++++++++++++++++++++++----
>>  drivers/staging/iio/industrialio-core.c   |   11 ++
>>  7 files changed, 259 insertions(+), 73 deletions(-)
>>
> 
> 


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH V3 0/7] Add scan demux unit and use it in max1363
  2011-12-06 15:51   ` Lars-Peter Clausen
@ 2011-12-06 17:05     ` Jonathan Cameron
  2011-12-06 20:06       ` Jonathan Cameron
  0 siblings, 1 reply; 12+ messages in thread
From: Jonathan Cameron @ 2011-12-06 17:05 UTC (permalink / raw)
  To: Lars-Peter Clausen, Maxime Ripard; +Cc: Jonathan Cameron, linux-iio



Lars-Peter Clausen <lars@metafoo.de> wrote:

>On 12/06/2011 04:39 PM, Maxime Ripard wrote:
>> Hi Jonathan,
>> 
>> I can't seem to find a proper way to apply this patchset. On what
>> patchset is it based ?
>> 
>> I'm still here with what seems to be a rather old version of your
>tree
>> (3413ec), but it is still the head of your git tree on kernel.org.
>> 
>> Thanks,
>> Maxime
>
>It should apply to staging/staging-next
Sorry. This is all queued up locally. I just forgot to push last night! LarsPeter is also correct as my master branch is just staging-next plus stuff that has gone to Greg.
>
>> 
>> On 05/12/2011 22:37, Jonathan Cameron wrote:
>>> Hi Greg,
>>>
>>> The v3 here is just to indicate a tiny change suggested by
>>> Lars-Peter from the version that has been out for review on
>>> linux-iio. (Using ALIGN instead of hand rolling in one case
>>> in patch 4).  Anyhow, not worth putting out for another review
>>> as Lars-Peter has tested and acked without it anyway.
>>>
>>> Technically Lars-Peter only acked patches 4 and 5 but they
>>> are the important ones (the others being trivial or tied
>>> up with the max1363 driver which is one of mine..)
>>>
>>> This set introduces the an optional demultiplexer into the
>>> path of data form devices to buffers.  It is a necessary step
>>> on the path to in kernel push interfaces (trigger driven ones).
>>> Also rather useful on it's own as shown by the max1363 patches
>>> and some uses Lars-Peter has made of it in another series.
>>>
>>> Anyhow fair bit more to come so time to send these on to you!
>>>
>>> Thanks,
>>>
>>> Jonathan
>>>
>>> v2 text:
>>> Hi All,
>>>
>>> New version of this series.  Two changes as per Lars-Peter's
>>> suggestions.  ALIGN macro usage in patch 4 and one of the two
>>> for each bit set suggestions.  The second is subtly different
>>> as it is finding bits after a certain point rather than from
>>> the start.
>>>
>>> As explained in patch 5 discussion, I personally feel that
>>> the demux should occur prior to the buffer and avoiding the
>>> extra copy should be done by allowing buffers to provide
>>> callbacks for reserving (plus getting access to) space and
>>> notifying that they are done filling it.   Either way, now
>>> is not the time to do this change. Too much else going on!
>>>
>>> v1 text:
>>> The last patch technically is a simple bug fix, but included here as
>>> it came up during testing of this series.
>>>
>>> The 'interesting' bits are the rewrite of iio_sw_buffer_preenable.
>I'd like
>>> people with drivers currently using that function to test and see
>what
>>> I have broken.  We should also be able to drop a number of cases in
>specific
>>> drivers in favour of this version.
>>>
>>> The demux unit is designed to offer a straight path with little or
>no
>>> overhead if the client (here still the IIO buffer) needs all the
>data and to
>>> only get in the way when a subset of the active scan mask is
>requested.
>>>
>>> I may well have messed this up so please please test this set.
>>>
>>>
>>> Jonathan Cameron (7):
>>>   staging:iio:find iio channel from scan index util function
>>>   staging:iio:buffer add a cache of the timestamp scan index.
>>>   staging:iio: add hook to allow core to perform scan related
>config.
>>>   staging:iio: make iio_sw_buffer_preenable much more general.
>>>   staging:iio: add demux optionally to path from device to buffer
>>>   staging:iio:adc:max1363 use new demuxing support.
>>>   staging:iio:adc:max1363 correctly set channels as big endian.
>>>
>>>  drivers/staging/iio/adc/max1363.h         |   11 ++-
>>>  drivers/staging/iio/adc/max1363_core.c    |   18 ++-
>>>  drivers/staging/iio/adc/max1363_ring.c    |   51 ++-----
>>>  drivers/staging/iio/buffer.h              |   16 ++
>>>  drivers/staging/iio/iio.h                 |   13 ++-
>>>  drivers/staging/iio/industrialio-buffer.c |  212
>+++++++++++++++++++++++++----
>>>  drivers/staging/iio/industrialio-core.c   |   11 ++
>>>  7 files changed, 259 insertions(+), 73 deletions(-)
>>>
>> 
>> 
>
>--
>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

-- 
Sent from my Android phone 
with K-9 Mail. Please excuse my brevity.

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH V3 0/7] Add scan demux unit and use it in max1363
  2011-12-06 17:05     ` Jonathan Cameron
@ 2011-12-06 20:06       ` Jonathan Cameron
  2011-12-07 10:39         ` Maxime Ripard
  0 siblings, 1 reply; 12+ messages in thread
From: Jonathan Cameron @ 2011-12-06 20:06 UTC (permalink / raw)
  To: Jonathan Cameron; +Cc: Lars-Peter Clausen, Maxime Ripard, linux-iio

On 12/06/2011 05:05 PM, Jonathan Cameron wrote:
> 
> 
> Lars-Peter Clausen <lars@metafoo.de> wrote:
> 
>> On 12/06/2011 04:39 PM, Maxime Ripard wrote:
>>> Hi Jonathan,
>>>
>>> I can't seem to find a proper way to apply this patchset. On what
>>> patchset is it based ?
>>>
>>> I'm still here with what seems to be a rather old version of your
>> tree
>>> (3413ec), but it is still the head of your git tree on kernel.org.
>>>
>>> Thanks,
>>> Maxime
>>
>> It should apply to staging/staging-next
> Sorry. This is all queued up locally. I just forgot to push last night! LarsPeter is also correct as my master branch is just staging-next plus stuff that has gone to Greg.
I have just pushed the master branch to kernel.org.

I have also pushed inkern-staging but the two extra patches in there
need a fair bit more cleaning up.  However, if anyone with a need for
an inkernel push interface (e.g. input client for iio device) wants
to test what is there, I'd certainly welcome any feedback.

Jonathan

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH V3 0/7] Add scan demux unit and use it in max1363
  2011-12-06 20:06       ` Jonathan Cameron
@ 2011-12-07 10:39         ` Maxime Ripard
  0 siblings, 0 replies; 12+ messages in thread
From: Maxime Ripard @ 2011-12-07 10:39 UTC (permalink / raw)
  To: Jonathan Cameron; +Cc: Jonathan Cameron, Lars-Peter Clausen, linux-iio

On 06/12/2011 21:06, Jonathan Cameron wrote:
> On 12/06/2011 05:05 PM, Jonathan Cameron wrote:
>>
>>
>> Lars-Peter Clausen <lars@metafoo.de> wrote:
>>
>>> On 12/06/2011 04:39 PM, Maxime Ripard wrote:
>>>> Hi Jonathan,
>>>>
>>>> I can't seem to find a proper way to apply this patchset. On what
>>>> patchset is it based ?
>>>>
>>>> I'm still here with what seems to be a rather old version of your
>>> tree
>>>> (3413ec), but it is still the head of your git tree on kernel.org.
>>>>
>>>> Thanks,
>>>> Maxime
>>>
>>> It should apply to staging/staging-next
>> Sorry. This is all queued up locally. I just forgot to push last night! LarsPeter is also correct as my master branch is just staging-next plus stuff that has gone to Greg.
> I have just pushed the master branch to kernel.org.

Great, thanks ! :)

Maxime

-- 
Maxime Ripard, Free Electrons
Kernel, drivers, real-time and embedded Linux
development, consulting, training and support.
http://free-electrons.com

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2011-12-07 10:39 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-12-05 21:37 [PATCH V3 0/7] Add scan demux unit and use it in max1363 Jonathan Cameron
2011-12-05 21:37 ` [PATCH 1/7] staging:iio:find iio channel from scan index util function Jonathan Cameron
2011-12-05 21:37 ` [PATCH 2/7] staging:iio:buffer add a cache of the timestamp scan index Jonathan Cameron
2011-12-05 21:37 ` [PATCH 3/7] staging:iio: add hook to allow core to perform scan related config Jonathan Cameron
2011-12-05 21:37 ` [PATCH 4/7] staging:iio: make iio_sw_buffer_preenable much more general Jonathan Cameron
2011-12-05 21:37 ` [PATCH 5/7] staging:iio: add demux optionally to path from device to buffer Jonathan Cameron
2011-12-05 21:37 ` [PATCH 7/7] staging:iio:adc:max1363 correctly set channels as big endian Jonathan Cameron
2011-12-06 15:39 ` [PATCH V3 0/7] Add scan demux unit and use it in max1363 Maxime Ripard
2011-12-06 15:51   ` Lars-Peter Clausen
2011-12-06 17:05     ` Jonathan Cameron
2011-12-06 20:06       ` Jonathan Cameron
2011-12-07 10:39         ` Maxime Ripard

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).