xref: /openbmc/linux/drivers/iio/industrialio-buffer.c (revision a980e046098b0a40eaff5e4e7fcde6cf035b7c06)
1*a980e046SJonathan Cameron /* The industrial I/O core
2*a980e046SJonathan Cameron  *
3*a980e046SJonathan Cameron  * Copyright (c) 2008 Jonathan Cameron
4*a980e046SJonathan Cameron  *
5*a980e046SJonathan Cameron  * This program is free software; you can redistribute it and/or modify it
6*a980e046SJonathan Cameron  * under the terms of the GNU General Public License version 2 as published by
7*a980e046SJonathan Cameron  * the Free Software Foundation.
8*a980e046SJonathan Cameron  *
9*a980e046SJonathan Cameron  * Handling of buffer allocation / resizing.
10*a980e046SJonathan Cameron  *
11*a980e046SJonathan Cameron  *
12*a980e046SJonathan Cameron  * Things to look at here.
13*a980e046SJonathan Cameron  * - Better memory allocation techniques?
14*a980e046SJonathan Cameron  * - Alternative access techniques?
15*a980e046SJonathan Cameron  */
16*a980e046SJonathan Cameron #include <linux/kernel.h>
17*a980e046SJonathan Cameron #include <linux/export.h>
18*a980e046SJonathan Cameron #include <linux/device.h>
19*a980e046SJonathan Cameron #include <linux/fs.h>
20*a980e046SJonathan Cameron #include <linux/cdev.h>
21*a980e046SJonathan Cameron #include <linux/slab.h>
22*a980e046SJonathan Cameron #include <linux/poll.h>
23*a980e046SJonathan Cameron 
24*a980e046SJonathan Cameron #include <linux/iio/iio.h>
25*a980e046SJonathan Cameron #include "iio_core.h"
26*a980e046SJonathan Cameron #include <linux/iio/sysfs.h>
27*a980e046SJonathan Cameron #include <linux/iio/buffer.h>
28*a980e046SJonathan Cameron 
29*a980e046SJonathan Cameron static const char * const iio_endian_prefix[] = {
30*a980e046SJonathan Cameron 	[IIO_BE] = "be",
31*a980e046SJonathan Cameron 	[IIO_LE] = "le",
32*a980e046SJonathan Cameron };
33*a980e046SJonathan Cameron 
34*a980e046SJonathan Cameron /**
35*a980e046SJonathan Cameron  * iio_buffer_read_first_n_outer() - chrdev read for buffer access
36*a980e046SJonathan Cameron  *
37*a980e046SJonathan Cameron  * This function relies on all buffer implementations having an
38*a980e046SJonathan Cameron  * iio_buffer as their first element.
39*a980e046SJonathan Cameron  **/
40*a980e046SJonathan Cameron ssize_t iio_buffer_read_first_n_outer(struct file *filp, char __user *buf,
41*a980e046SJonathan Cameron 				      size_t n, loff_t *f_ps)
42*a980e046SJonathan Cameron {
43*a980e046SJonathan Cameron 	struct iio_dev *indio_dev = filp->private_data;
44*a980e046SJonathan Cameron 	struct iio_buffer *rb = indio_dev->buffer;
45*a980e046SJonathan Cameron 
46*a980e046SJonathan Cameron 	if (!rb || !rb->access->read_first_n)
47*a980e046SJonathan Cameron 		return -EINVAL;
48*a980e046SJonathan Cameron 	return rb->access->read_first_n(rb, n, buf);
49*a980e046SJonathan Cameron }
50*a980e046SJonathan Cameron 
51*a980e046SJonathan Cameron /**
52*a980e046SJonathan Cameron  * iio_buffer_poll() - poll the buffer to find out if it has data
53*a980e046SJonathan Cameron  */
54*a980e046SJonathan Cameron unsigned int iio_buffer_poll(struct file *filp,
55*a980e046SJonathan Cameron 			     struct poll_table_struct *wait)
56*a980e046SJonathan Cameron {
57*a980e046SJonathan Cameron 	struct iio_dev *indio_dev = filp->private_data;
58*a980e046SJonathan Cameron 	struct iio_buffer *rb = indio_dev->buffer;
59*a980e046SJonathan Cameron 
60*a980e046SJonathan Cameron 	poll_wait(filp, &rb->pollq, wait);
61*a980e046SJonathan Cameron 	if (rb->stufftoread)
62*a980e046SJonathan Cameron 		return POLLIN | POLLRDNORM;
63*a980e046SJonathan Cameron 	/* need a way of knowing if there may be enough data... */
64*a980e046SJonathan Cameron 	return 0;
65*a980e046SJonathan Cameron }
66*a980e046SJonathan Cameron 
67*a980e046SJonathan Cameron void iio_buffer_init(struct iio_buffer *buffer)
68*a980e046SJonathan Cameron {
69*a980e046SJonathan Cameron 	INIT_LIST_HEAD(&buffer->demux_list);
70*a980e046SJonathan Cameron 	init_waitqueue_head(&buffer->pollq);
71*a980e046SJonathan Cameron }
72*a980e046SJonathan Cameron EXPORT_SYMBOL(iio_buffer_init);
73*a980e046SJonathan Cameron 
74*a980e046SJonathan Cameron static ssize_t iio_show_scan_index(struct device *dev,
75*a980e046SJonathan Cameron 				   struct device_attribute *attr,
76*a980e046SJonathan Cameron 				   char *buf)
77*a980e046SJonathan Cameron {
78*a980e046SJonathan Cameron 	return sprintf(buf, "%u\n", to_iio_dev_attr(attr)->c->scan_index);
79*a980e046SJonathan Cameron }
80*a980e046SJonathan Cameron 
81*a980e046SJonathan Cameron static ssize_t iio_show_fixed_type(struct device *dev,
82*a980e046SJonathan Cameron 				   struct device_attribute *attr,
83*a980e046SJonathan Cameron 				   char *buf)
84*a980e046SJonathan Cameron {
85*a980e046SJonathan Cameron 	struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
86*a980e046SJonathan Cameron 	u8 type = this_attr->c->scan_type.endianness;
87*a980e046SJonathan Cameron 
88*a980e046SJonathan Cameron 	if (type == IIO_CPU) {
89*a980e046SJonathan Cameron #ifdef __LITTLE_ENDIAN
90*a980e046SJonathan Cameron 		type = IIO_LE;
91*a980e046SJonathan Cameron #else
92*a980e046SJonathan Cameron 		type = IIO_BE;
93*a980e046SJonathan Cameron #endif
94*a980e046SJonathan Cameron 	}
95*a980e046SJonathan Cameron 	return sprintf(buf, "%s:%c%d/%d>>%u\n",
96*a980e046SJonathan Cameron 		       iio_endian_prefix[type],
97*a980e046SJonathan Cameron 		       this_attr->c->scan_type.sign,
98*a980e046SJonathan Cameron 		       this_attr->c->scan_type.realbits,
99*a980e046SJonathan Cameron 		       this_attr->c->scan_type.storagebits,
100*a980e046SJonathan Cameron 		       this_attr->c->scan_type.shift);
101*a980e046SJonathan Cameron }
102*a980e046SJonathan Cameron 
103*a980e046SJonathan Cameron static ssize_t iio_scan_el_show(struct device *dev,
104*a980e046SJonathan Cameron 				struct device_attribute *attr,
105*a980e046SJonathan Cameron 				char *buf)
106*a980e046SJonathan Cameron {
107*a980e046SJonathan Cameron 	int ret;
108*a980e046SJonathan Cameron 	struct iio_dev *indio_dev = dev_get_drvdata(dev);
109*a980e046SJonathan Cameron 
110*a980e046SJonathan Cameron 	ret = test_bit(to_iio_dev_attr(attr)->address,
111*a980e046SJonathan Cameron 		       indio_dev->buffer->scan_mask);
112*a980e046SJonathan Cameron 
113*a980e046SJonathan Cameron 	return sprintf(buf, "%d\n", ret);
114*a980e046SJonathan Cameron }
115*a980e046SJonathan Cameron 
116*a980e046SJonathan Cameron static int iio_scan_mask_clear(struct iio_buffer *buffer, int bit)
117*a980e046SJonathan Cameron {
118*a980e046SJonathan Cameron 	clear_bit(bit, buffer->scan_mask);
119*a980e046SJonathan Cameron 	return 0;
120*a980e046SJonathan Cameron }
121*a980e046SJonathan Cameron 
122*a980e046SJonathan Cameron static ssize_t iio_scan_el_store(struct device *dev,
123*a980e046SJonathan Cameron 				 struct device_attribute *attr,
124*a980e046SJonathan Cameron 				 const char *buf,
125*a980e046SJonathan Cameron 				 size_t len)
126*a980e046SJonathan Cameron {
127*a980e046SJonathan Cameron 	int ret;
128*a980e046SJonathan Cameron 	bool state;
129*a980e046SJonathan Cameron 	struct iio_dev *indio_dev = dev_get_drvdata(dev);
130*a980e046SJonathan Cameron 	struct iio_buffer *buffer = indio_dev->buffer;
131*a980e046SJonathan Cameron 	struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
132*a980e046SJonathan Cameron 
133*a980e046SJonathan Cameron 	ret = strtobool(buf, &state);
134*a980e046SJonathan Cameron 	if (ret < 0)
135*a980e046SJonathan Cameron 		return ret;
136*a980e046SJonathan Cameron 	mutex_lock(&indio_dev->mlock);
137*a980e046SJonathan Cameron 	if (iio_buffer_enabled(indio_dev)) {
138*a980e046SJonathan Cameron 		ret = -EBUSY;
139*a980e046SJonathan Cameron 		goto error_ret;
140*a980e046SJonathan Cameron 	}
141*a980e046SJonathan Cameron 	ret = iio_scan_mask_query(indio_dev, buffer, this_attr->address);
142*a980e046SJonathan Cameron 	if (ret < 0)
143*a980e046SJonathan Cameron 		goto error_ret;
144*a980e046SJonathan Cameron 	if (!state && ret) {
145*a980e046SJonathan Cameron 		ret = iio_scan_mask_clear(buffer, this_attr->address);
146*a980e046SJonathan Cameron 		if (ret)
147*a980e046SJonathan Cameron 			goto error_ret;
148*a980e046SJonathan Cameron 	} else if (state && !ret) {
149*a980e046SJonathan Cameron 		ret = iio_scan_mask_set(indio_dev, buffer, this_attr->address);
150*a980e046SJonathan Cameron 		if (ret)
151*a980e046SJonathan Cameron 			goto error_ret;
152*a980e046SJonathan Cameron 	}
153*a980e046SJonathan Cameron 
154*a980e046SJonathan Cameron error_ret:
155*a980e046SJonathan Cameron 	mutex_unlock(&indio_dev->mlock);
156*a980e046SJonathan Cameron 
157*a980e046SJonathan Cameron 	return ret < 0 ? ret : len;
158*a980e046SJonathan Cameron 
159*a980e046SJonathan Cameron }
160*a980e046SJonathan Cameron 
161*a980e046SJonathan Cameron static ssize_t iio_scan_el_ts_show(struct device *dev,
162*a980e046SJonathan Cameron 				   struct device_attribute *attr,
163*a980e046SJonathan Cameron 				   char *buf)
164*a980e046SJonathan Cameron {
165*a980e046SJonathan Cameron 	struct iio_dev *indio_dev = dev_get_drvdata(dev);
166*a980e046SJonathan Cameron 	return sprintf(buf, "%d\n", indio_dev->buffer->scan_timestamp);
167*a980e046SJonathan Cameron }
168*a980e046SJonathan Cameron 
169*a980e046SJonathan Cameron static ssize_t iio_scan_el_ts_store(struct device *dev,
170*a980e046SJonathan Cameron 				    struct device_attribute *attr,
171*a980e046SJonathan Cameron 				    const char *buf,
172*a980e046SJonathan Cameron 				    size_t len)
173*a980e046SJonathan Cameron {
174*a980e046SJonathan Cameron 	int ret;
175*a980e046SJonathan Cameron 	struct iio_dev *indio_dev = dev_get_drvdata(dev);
176*a980e046SJonathan Cameron 	bool state;
177*a980e046SJonathan Cameron 
178*a980e046SJonathan Cameron 	ret = strtobool(buf, &state);
179*a980e046SJonathan Cameron 	if (ret < 0)
180*a980e046SJonathan Cameron 		return ret;
181*a980e046SJonathan Cameron 
182*a980e046SJonathan Cameron 	mutex_lock(&indio_dev->mlock);
183*a980e046SJonathan Cameron 	if (iio_buffer_enabled(indio_dev)) {
184*a980e046SJonathan Cameron 		ret = -EBUSY;
185*a980e046SJonathan Cameron 		goto error_ret;
186*a980e046SJonathan Cameron 	}
187*a980e046SJonathan Cameron 	indio_dev->buffer->scan_timestamp = state;
188*a980e046SJonathan Cameron 	indio_dev->scan_timestamp = state;
189*a980e046SJonathan Cameron error_ret:
190*a980e046SJonathan Cameron 	mutex_unlock(&indio_dev->mlock);
191*a980e046SJonathan Cameron 
192*a980e046SJonathan Cameron 	return ret ? ret : len;
193*a980e046SJonathan Cameron }
194*a980e046SJonathan Cameron 
195*a980e046SJonathan Cameron static int iio_buffer_add_channel_sysfs(struct iio_dev *indio_dev,
196*a980e046SJonathan Cameron 					const struct iio_chan_spec *chan)
197*a980e046SJonathan Cameron {
198*a980e046SJonathan Cameron 	int ret, attrcount = 0;
199*a980e046SJonathan Cameron 	struct iio_buffer *buffer = indio_dev->buffer;
200*a980e046SJonathan Cameron 
201*a980e046SJonathan Cameron 	ret = __iio_add_chan_devattr("index",
202*a980e046SJonathan Cameron 				     chan,
203*a980e046SJonathan Cameron 				     &iio_show_scan_index,
204*a980e046SJonathan Cameron 				     NULL,
205*a980e046SJonathan Cameron 				     0,
206*a980e046SJonathan Cameron 				     0,
207*a980e046SJonathan Cameron 				     &indio_dev->dev,
208*a980e046SJonathan Cameron 				     &buffer->scan_el_dev_attr_list);
209*a980e046SJonathan Cameron 	if (ret)
210*a980e046SJonathan Cameron 		goto error_ret;
211*a980e046SJonathan Cameron 	attrcount++;
212*a980e046SJonathan Cameron 	ret = __iio_add_chan_devattr("type",
213*a980e046SJonathan Cameron 				     chan,
214*a980e046SJonathan Cameron 				     &iio_show_fixed_type,
215*a980e046SJonathan Cameron 				     NULL,
216*a980e046SJonathan Cameron 				     0,
217*a980e046SJonathan Cameron 				     0,
218*a980e046SJonathan Cameron 				     &indio_dev->dev,
219*a980e046SJonathan Cameron 				     &buffer->scan_el_dev_attr_list);
220*a980e046SJonathan Cameron 	if (ret)
221*a980e046SJonathan Cameron 		goto error_ret;
222*a980e046SJonathan Cameron 	attrcount++;
223*a980e046SJonathan Cameron 	if (chan->type != IIO_TIMESTAMP)
224*a980e046SJonathan Cameron 		ret = __iio_add_chan_devattr("en",
225*a980e046SJonathan Cameron 					     chan,
226*a980e046SJonathan Cameron 					     &iio_scan_el_show,
227*a980e046SJonathan Cameron 					     &iio_scan_el_store,
228*a980e046SJonathan Cameron 					     chan->scan_index,
229*a980e046SJonathan Cameron 					     0,
230*a980e046SJonathan Cameron 					     &indio_dev->dev,
231*a980e046SJonathan Cameron 					     &buffer->scan_el_dev_attr_list);
232*a980e046SJonathan Cameron 	else
233*a980e046SJonathan Cameron 		ret = __iio_add_chan_devattr("en",
234*a980e046SJonathan Cameron 					     chan,
235*a980e046SJonathan Cameron 					     &iio_scan_el_ts_show,
236*a980e046SJonathan Cameron 					     &iio_scan_el_ts_store,
237*a980e046SJonathan Cameron 					     chan->scan_index,
238*a980e046SJonathan Cameron 					     0,
239*a980e046SJonathan Cameron 					     &indio_dev->dev,
240*a980e046SJonathan Cameron 					     &buffer->scan_el_dev_attr_list);
241*a980e046SJonathan Cameron 	attrcount++;
242*a980e046SJonathan Cameron 	ret = attrcount;
243*a980e046SJonathan Cameron error_ret:
244*a980e046SJonathan Cameron 	return ret;
245*a980e046SJonathan Cameron }
246*a980e046SJonathan Cameron 
247*a980e046SJonathan Cameron static void iio_buffer_remove_and_free_scan_dev_attr(struct iio_dev *indio_dev,
248*a980e046SJonathan Cameron 						     struct iio_dev_attr *p)
249*a980e046SJonathan Cameron {
250*a980e046SJonathan Cameron 	kfree(p->dev_attr.attr.name);
251*a980e046SJonathan Cameron 	kfree(p);
252*a980e046SJonathan Cameron }
253*a980e046SJonathan Cameron 
254*a980e046SJonathan Cameron static void __iio_buffer_attr_cleanup(struct iio_dev *indio_dev)
255*a980e046SJonathan Cameron {
256*a980e046SJonathan Cameron 	struct iio_dev_attr *p, *n;
257*a980e046SJonathan Cameron 	struct iio_buffer *buffer = indio_dev->buffer;
258*a980e046SJonathan Cameron 
259*a980e046SJonathan Cameron 	list_for_each_entry_safe(p, n,
260*a980e046SJonathan Cameron 				 &buffer->scan_el_dev_attr_list, l)
261*a980e046SJonathan Cameron 		iio_buffer_remove_and_free_scan_dev_attr(indio_dev, p);
262*a980e046SJonathan Cameron }
263*a980e046SJonathan Cameron 
264*a980e046SJonathan Cameron static const char * const iio_scan_elements_group_name = "scan_elements";
265*a980e046SJonathan Cameron 
266*a980e046SJonathan Cameron int iio_buffer_register(struct iio_dev *indio_dev,
267*a980e046SJonathan Cameron 			const struct iio_chan_spec *channels,
268*a980e046SJonathan Cameron 			int num_channels)
269*a980e046SJonathan Cameron {
270*a980e046SJonathan Cameron 	struct iio_dev_attr *p;
271*a980e046SJonathan Cameron 	struct attribute **attr;
272*a980e046SJonathan Cameron 	struct iio_buffer *buffer = indio_dev->buffer;
273*a980e046SJonathan Cameron 	int ret, i, attrn, attrcount, attrcount_orig = 0;
274*a980e046SJonathan Cameron 
275*a980e046SJonathan Cameron 	if (buffer->attrs)
276*a980e046SJonathan Cameron 		indio_dev->groups[indio_dev->groupcounter++] = buffer->attrs;
277*a980e046SJonathan Cameron 
278*a980e046SJonathan Cameron 	if (buffer->scan_el_attrs != NULL) {
279*a980e046SJonathan Cameron 		attr = buffer->scan_el_attrs->attrs;
280*a980e046SJonathan Cameron 		while (*attr++ != NULL)
281*a980e046SJonathan Cameron 			attrcount_orig++;
282*a980e046SJonathan Cameron 	}
283*a980e046SJonathan Cameron 	attrcount = attrcount_orig;
284*a980e046SJonathan Cameron 	INIT_LIST_HEAD(&buffer->scan_el_dev_attr_list);
285*a980e046SJonathan Cameron 	if (channels) {
286*a980e046SJonathan Cameron 		/* new magic */
287*a980e046SJonathan Cameron 		for (i = 0; i < num_channels; i++) {
288*a980e046SJonathan Cameron 			/* Establish necessary mask length */
289*a980e046SJonathan Cameron 			if (channels[i].scan_index >
290*a980e046SJonathan Cameron 			    (int)indio_dev->masklength - 1)
291*a980e046SJonathan Cameron 				indio_dev->masklength
292*a980e046SJonathan Cameron 					= indio_dev->channels[i].scan_index + 1;
293*a980e046SJonathan Cameron 
294*a980e046SJonathan Cameron 			ret = iio_buffer_add_channel_sysfs(indio_dev,
295*a980e046SJonathan Cameron 							 &channels[i]);
296*a980e046SJonathan Cameron 			if (ret < 0)
297*a980e046SJonathan Cameron 				goto error_cleanup_dynamic;
298*a980e046SJonathan Cameron 			attrcount += ret;
299*a980e046SJonathan Cameron 			if (channels[i].type == IIO_TIMESTAMP)
300*a980e046SJonathan Cameron 				indio_dev->scan_index_timestamp =
301*a980e046SJonathan Cameron 					channels[i].scan_index;
302*a980e046SJonathan Cameron 		}
303*a980e046SJonathan Cameron 		if (indio_dev->masklength && buffer->scan_mask == NULL) {
304*a980e046SJonathan Cameron 			buffer->scan_mask = kcalloc(BITS_TO_LONGS(indio_dev->masklength),
305*a980e046SJonathan Cameron 						    sizeof(*buffer->scan_mask),
306*a980e046SJonathan Cameron 						    GFP_KERNEL);
307*a980e046SJonathan Cameron 			if (buffer->scan_mask == NULL) {
308*a980e046SJonathan Cameron 				ret = -ENOMEM;
309*a980e046SJonathan Cameron 				goto error_cleanup_dynamic;
310*a980e046SJonathan Cameron 			}
311*a980e046SJonathan Cameron 		}
312*a980e046SJonathan Cameron 	}
313*a980e046SJonathan Cameron 
314*a980e046SJonathan Cameron 	buffer->scan_el_group.name = iio_scan_elements_group_name;
315*a980e046SJonathan Cameron 
316*a980e046SJonathan Cameron 	buffer->scan_el_group.attrs = kcalloc(attrcount + 1,
317*a980e046SJonathan Cameron 					      sizeof(buffer->scan_el_group.attrs[0]),
318*a980e046SJonathan Cameron 					      GFP_KERNEL);
319*a980e046SJonathan Cameron 	if (buffer->scan_el_group.attrs == NULL) {
320*a980e046SJonathan Cameron 		ret = -ENOMEM;
321*a980e046SJonathan Cameron 		goto error_free_scan_mask;
322*a980e046SJonathan Cameron 	}
323*a980e046SJonathan Cameron 	if (buffer->scan_el_attrs)
324*a980e046SJonathan Cameron 		memcpy(buffer->scan_el_group.attrs, buffer->scan_el_attrs,
325*a980e046SJonathan Cameron 		       sizeof(buffer->scan_el_group.attrs[0])*attrcount_orig);
326*a980e046SJonathan Cameron 	attrn = attrcount_orig;
327*a980e046SJonathan Cameron 
328*a980e046SJonathan Cameron 	list_for_each_entry(p, &buffer->scan_el_dev_attr_list, l)
329*a980e046SJonathan Cameron 		buffer->scan_el_group.attrs[attrn++] = &p->dev_attr.attr;
330*a980e046SJonathan Cameron 	indio_dev->groups[indio_dev->groupcounter++] = &buffer->scan_el_group;
331*a980e046SJonathan Cameron 
332*a980e046SJonathan Cameron 	return 0;
333*a980e046SJonathan Cameron 
334*a980e046SJonathan Cameron error_free_scan_mask:
335*a980e046SJonathan Cameron 	kfree(buffer->scan_mask);
336*a980e046SJonathan Cameron error_cleanup_dynamic:
337*a980e046SJonathan Cameron 	__iio_buffer_attr_cleanup(indio_dev);
338*a980e046SJonathan Cameron 
339*a980e046SJonathan Cameron 	return ret;
340*a980e046SJonathan Cameron }
341*a980e046SJonathan Cameron EXPORT_SYMBOL(iio_buffer_register);
342*a980e046SJonathan Cameron 
343*a980e046SJonathan Cameron void iio_buffer_unregister(struct iio_dev *indio_dev)
344*a980e046SJonathan Cameron {
345*a980e046SJonathan Cameron 	kfree(indio_dev->buffer->scan_mask);
346*a980e046SJonathan Cameron 	kfree(indio_dev->buffer->scan_el_group.attrs);
347*a980e046SJonathan Cameron 	__iio_buffer_attr_cleanup(indio_dev);
348*a980e046SJonathan Cameron }
349*a980e046SJonathan Cameron EXPORT_SYMBOL(iio_buffer_unregister);
350*a980e046SJonathan Cameron 
351*a980e046SJonathan Cameron ssize_t iio_buffer_read_length(struct device *dev,
352*a980e046SJonathan Cameron 			       struct device_attribute *attr,
353*a980e046SJonathan Cameron 			       char *buf)
354*a980e046SJonathan Cameron {
355*a980e046SJonathan Cameron 	struct iio_dev *indio_dev = dev_get_drvdata(dev);
356*a980e046SJonathan Cameron 	struct iio_buffer *buffer = indio_dev->buffer;
357*a980e046SJonathan Cameron 
358*a980e046SJonathan Cameron 	if (buffer->access->get_length)
359*a980e046SJonathan Cameron 		return sprintf(buf, "%d\n",
360*a980e046SJonathan Cameron 			       buffer->access->get_length(buffer));
361*a980e046SJonathan Cameron 
362*a980e046SJonathan Cameron 	return 0;
363*a980e046SJonathan Cameron }
364*a980e046SJonathan Cameron EXPORT_SYMBOL(iio_buffer_read_length);
365*a980e046SJonathan Cameron 
366*a980e046SJonathan Cameron ssize_t iio_buffer_write_length(struct device *dev,
367*a980e046SJonathan Cameron 				struct device_attribute *attr,
368*a980e046SJonathan Cameron 				const char *buf,
369*a980e046SJonathan Cameron 				size_t len)
370*a980e046SJonathan Cameron {
371*a980e046SJonathan Cameron 	int ret;
372*a980e046SJonathan Cameron 	ulong val;
373*a980e046SJonathan Cameron 	struct iio_dev *indio_dev = dev_get_drvdata(dev);
374*a980e046SJonathan Cameron 	struct iio_buffer *buffer = indio_dev->buffer;
375*a980e046SJonathan Cameron 
376*a980e046SJonathan Cameron 	ret = strict_strtoul(buf, 10, &val);
377*a980e046SJonathan Cameron 	if (ret)
378*a980e046SJonathan Cameron 		return ret;
379*a980e046SJonathan Cameron 
380*a980e046SJonathan Cameron 	if (buffer->access->get_length)
381*a980e046SJonathan Cameron 		if (val == buffer->access->get_length(buffer))
382*a980e046SJonathan Cameron 			return len;
383*a980e046SJonathan Cameron 
384*a980e046SJonathan Cameron 	mutex_lock(&indio_dev->mlock);
385*a980e046SJonathan Cameron 	if (iio_buffer_enabled(indio_dev)) {
386*a980e046SJonathan Cameron 		ret = -EBUSY;
387*a980e046SJonathan Cameron 	} else {
388*a980e046SJonathan Cameron 		if (buffer->access->set_length)
389*a980e046SJonathan Cameron 			buffer->access->set_length(buffer, val);
390*a980e046SJonathan Cameron 		ret = 0;
391*a980e046SJonathan Cameron 	}
392*a980e046SJonathan Cameron 	mutex_unlock(&indio_dev->mlock);
393*a980e046SJonathan Cameron 
394*a980e046SJonathan Cameron 	return ret ? ret : len;
395*a980e046SJonathan Cameron }
396*a980e046SJonathan Cameron EXPORT_SYMBOL(iio_buffer_write_length);
397*a980e046SJonathan Cameron 
398*a980e046SJonathan Cameron ssize_t iio_buffer_store_enable(struct device *dev,
399*a980e046SJonathan Cameron 				struct device_attribute *attr,
400*a980e046SJonathan Cameron 				const char *buf,
401*a980e046SJonathan Cameron 				size_t len)
402*a980e046SJonathan Cameron {
403*a980e046SJonathan Cameron 	int ret;
404*a980e046SJonathan Cameron 	bool requested_state, current_state;
405*a980e046SJonathan Cameron 	int previous_mode;
406*a980e046SJonathan Cameron 	struct iio_dev *indio_dev = dev_get_drvdata(dev);
407*a980e046SJonathan Cameron 	struct iio_buffer *buffer = indio_dev->buffer;
408*a980e046SJonathan Cameron 
409*a980e046SJonathan Cameron 	mutex_lock(&indio_dev->mlock);
410*a980e046SJonathan Cameron 	previous_mode = indio_dev->currentmode;
411*a980e046SJonathan Cameron 	requested_state = !(buf[0] == '0');
412*a980e046SJonathan Cameron 	current_state = iio_buffer_enabled(indio_dev);
413*a980e046SJonathan Cameron 	if (current_state == requested_state) {
414*a980e046SJonathan Cameron 		printk(KERN_INFO "iio-buffer, current state requested again\n");
415*a980e046SJonathan Cameron 		goto done;
416*a980e046SJonathan Cameron 	}
417*a980e046SJonathan Cameron 	if (requested_state) {
418*a980e046SJonathan Cameron 		if (indio_dev->setup_ops->preenable) {
419*a980e046SJonathan Cameron 			ret = indio_dev->setup_ops->preenable(indio_dev);
420*a980e046SJonathan Cameron 			if (ret) {
421*a980e046SJonathan Cameron 				printk(KERN_ERR
422*a980e046SJonathan Cameron 				       "Buffer not started:"
423*a980e046SJonathan Cameron 				       "buffer preenable failed\n");
424*a980e046SJonathan Cameron 				goto error_ret;
425*a980e046SJonathan Cameron 			}
426*a980e046SJonathan Cameron 		}
427*a980e046SJonathan Cameron 		if (buffer->access->request_update) {
428*a980e046SJonathan Cameron 			ret = buffer->access->request_update(buffer);
429*a980e046SJonathan Cameron 			if (ret) {
430*a980e046SJonathan Cameron 				printk(KERN_INFO
431*a980e046SJonathan Cameron 				       "Buffer not started:"
432*a980e046SJonathan Cameron 				       "buffer parameter update failed\n");
433*a980e046SJonathan Cameron 				goto error_ret;
434*a980e046SJonathan Cameron 			}
435*a980e046SJonathan Cameron 		}
436*a980e046SJonathan Cameron 		/* Definitely possible for devices to support both of these.*/
437*a980e046SJonathan Cameron 		if (indio_dev->modes & INDIO_BUFFER_TRIGGERED) {
438*a980e046SJonathan Cameron 			if (!indio_dev->trig) {
439*a980e046SJonathan Cameron 				printk(KERN_INFO
440*a980e046SJonathan Cameron 				       "Buffer not started: no trigger\n");
441*a980e046SJonathan Cameron 				ret = -EINVAL;
442*a980e046SJonathan Cameron 				goto error_ret;
443*a980e046SJonathan Cameron 			}
444*a980e046SJonathan Cameron 			indio_dev->currentmode = INDIO_BUFFER_TRIGGERED;
445*a980e046SJonathan Cameron 		} else if (indio_dev->modes & INDIO_BUFFER_HARDWARE)
446*a980e046SJonathan Cameron 			indio_dev->currentmode = INDIO_BUFFER_HARDWARE;
447*a980e046SJonathan Cameron 		else { /* should never be reached */
448*a980e046SJonathan Cameron 			ret = -EINVAL;
449*a980e046SJonathan Cameron 			goto error_ret;
450*a980e046SJonathan Cameron 		}
451*a980e046SJonathan Cameron 
452*a980e046SJonathan Cameron 		if (indio_dev->setup_ops->postenable) {
453*a980e046SJonathan Cameron 			ret = indio_dev->setup_ops->postenable(indio_dev);
454*a980e046SJonathan Cameron 			if (ret) {
455*a980e046SJonathan Cameron 				printk(KERN_INFO
456*a980e046SJonathan Cameron 				       "Buffer not started:"
457*a980e046SJonathan Cameron 				       "postenable failed\n");
458*a980e046SJonathan Cameron 				indio_dev->currentmode = previous_mode;
459*a980e046SJonathan Cameron 				if (indio_dev->setup_ops->postdisable)
460*a980e046SJonathan Cameron 					indio_dev->setup_ops->
461*a980e046SJonathan Cameron 						postdisable(indio_dev);
462*a980e046SJonathan Cameron 				goto error_ret;
463*a980e046SJonathan Cameron 			}
464*a980e046SJonathan Cameron 		}
465*a980e046SJonathan Cameron 	} else {
466*a980e046SJonathan Cameron 		if (indio_dev->setup_ops->predisable) {
467*a980e046SJonathan Cameron 			ret = indio_dev->setup_ops->predisable(indio_dev);
468*a980e046SJonathan Cameron 			if (ret)
469*a980e046SJonathan Cameron 				goto error_ret;
470*a980e046SJonathan Cameron 		}
471*a980e046SJonathan Cameron 		indio_dev->currentmode = INDIO_DIRECT_MODE;
472*a980e046SJonathan Cameron 		if (indio_dev->setup_ops->postdisable) {
473*a980e046SJonathan Cameron 			ret = indio_dev->setup_ops->postdisable(indio_dev);
474*a980e046SJonathan Cameron 			if (ret)
475*a980e046SJonathan Cameron 				goto error_ret;
476*a980e046SJonathan Cameron 		}
477*a980e046SJonathan Cameron 	}
478*a980e046SJonathan Cameron done:
479*a980e046SJonathan Cameron 	mutex_unlock(&indio_dev->mlock);
480*a980e046SJonathan Cameron 	return len;
481*a980e046SJonathan Cameron 
482*a980e046SJonathan Cameron error_ret:
483*a980e046SJonathan Cameron 	mutex_unlock(&indio_dev->mlock);
484*a980e046SJonathan Cameron 	return ret;
485*a980e046SJonathan Cameron }
486*a980e046SJonathan Cameron EXPORT_SYMBOL(iio_buffer_store_enable);
487*a980e046SJonathan Cameron 
488*a980e046SJonathan Cameron ssize_t iio_buffer_show_enable(struct device *dev,
489*a980e046SJonathan Cameron 			       struct device_attribute *attr,
490*a980e046SJonathan Cameron 			       char *buf)
491*a980e046SJonathan Cameron {
492*a980e046SJonathan Cameron 	struct iio_dev *indio_dev = dev_get_drvdata(dev);
493*a980e046SJonathan Cameron 	return sprintf(buf, "%d\n", iio_buffer_enabled(indio_dev));
494*a980e046SJonathan Cameron }
495*a980e046SJonathan Cameron EXPORT_SYMBOL(iio_buffer_show_enable);
496*a980e046SJonathan Cameron 
497*a980e046SJonathan Cameron /* note NULL used as error indicator as it doesn't make sense. */
498*a980e046SJonathan Cameron static const unsigned long *iio_scan_mask_match(const unsigned long *av_masks,
499*a980e046SJonathan Cameron 					  unsigned int masklength,
500*a980e046SJonathan Cameron 					  const unsigned long *mask)
501*a980e046SJonathan Cameron {
502*a980e046SJonathan Cameron 	if (bitmap_empty(mask, masklength))
503*a980e046SJonathan Cameron 		return NULL;
504*a980e046SJonathan Cameron 	while (*av_masks) {
505*a980e046SJonathan Cameron 		if (bitmap_subset(mask, av_masks, masklength))
506*a980e046SJonathan Cameron 			return av_masks;
507*a980e046SJonathan Cameron 		av_masks += BITS_TO_LONGS(masklength);
508*a980e046SJonathan Cameron 	}
509*a980e046SJonathan Cameron 	return NULL;
510*a980e046SJonathan Cameron }
511*a980e046SJonathan Cameron 
512*a980e046SJonathan Cameron static int iio_compute_scan_bytes(struct iio_dev *indio_dev, const long *mask,
513*a980e046SJonathan Cameron 				  bool timestamp)
514*a980e046SJonathan Cameron {
515*a980e046SJonathan Cameron 	const struct iio_chan_spec *ch;
516*a980e046SJonathan Cameron 	unsigned bytes = 0;
517*a980e046SJonathan Cameron 	int length, i;
518*a980e046SJonathan Cameron 
519*a980e046SJonathan Cameron 	/* How much space will the demuxed element take? */
520*a980e046SJonathan Cameron 	for_each_set_bit(i, mask,
521*a980e046SJonathan Cameron 			 indio_dev->masklength) {
522*a980e046SJonathan Cameron 		ch = iio_find_channel_from_si(indio_dev, i);
523*a980e046SJonathan Cameron 		length = ch->scan_type.storagebits / 8;
524*a980e046SJonathan Cameron 		bytes = ALIGN(bytes, length);
525*a980e046SJonathan Cameron 		bytes += length;
526*a980e046SJonathan Cameron 	}
527*a980e046SJonathan Cameron 	if (timestamp) {
528*a980e046SJonathan Cameron 		ch = iio_find_channel_from_si(indio_dev,
529*a980e046SJonathan Cameron 					      indio_dev->scan_index_timestamp);
530*a980e046SJonathan Cameron 		length = ch->scan_type.storagebits / 8;
531*a980e046SJonathan Cameron 		bytes = ALIGN(bytes, length);
532*a980e046SJonathan Cameron 		bytes += length;
533*a980e046SJonathan Cameron 	}
534*a980e046SJonathan Cameron 	return bytes;
535*a980e046SJonathan Cameron }
536*a980e046SJonathan Cameron 
537*a980e046SJonathan Cameron int iio_sw_buffer_preenable(struct iio_dev *indio_dev)
538*a980e046SJonathan Cameron {
539*a980e046SJonathan Cameron 	struct iio_buffer *buffer = indio_dev->buffer;
540*a980e046SJonathan Cameron 	dev_dbg(&indio_dev->dev, "%s\n", __func__);
541*a980e046SJonathan Cameron 
542*a980e046SJonathan Cameron 	/* How much space will the demuxed element take? */
543*a980e046SJonathan Cameron 	indio_dev->scan_bytes =
544*a980e046SJonathan Cameron 		iio_compute_scan_bytes(indio_dev, buffer->scan_mask,
545*a980e046SJonathan Cameron 				       buffer->scan_timestamp);
546*a980e046SJonathan Cameron 	buffer->access->set_bytes_per_datum(buffer, indio_dev->scan_bytes);
547*a980e046SJonathan Cameron 
548*a980e046SJonathan Cameron 	/* What scan mask do we actually have ?*/
549*a980e046SJonathan Cameron 	if (indio_dev->available_scan_masks)
550*a980e046SJonathan Cameron 		indio_dev->active_scan_mask =
551*a980e046SJonathan Cameron 			iio_scan_mask_match(indio_dev->available_scan_masks,
552*a980e046SJonathan Cameron 					    indio_dev->masklength,
553*a980e046SJonathan Cameron 					    buffer->scan_mask);
554*a980e046SJonathan Cameron 	else
555*a980e046SJonathan Cameron 		indio_dev->active_scan_mask = buffer->scan_mask;
556*a980e046SJonathan Cameron 	iio_update_demux(indio_dev);
557*a980e046SJonathan Cameron 
558*a980e046SJonathan Cameron 	if (indio_dev->info->update_scan_mode)
559*a980e046SJonathan Cameron 		return indio_dev->info
560*a980e046SJonathan Cameron 			->update_scan_mode(indio_dev,
561*a980e046SJonathan Cameron 					   indio_dev->active_scan_mask);
562*a980e046SJonathan Cameron 	return 0;
563*a980e046SJonathan Cameron }
564*a980e046SJonathan Cameron EXPORT_SYMBOL(iio_sw_buffer_preenable);
565*a980e046SJonathan Cameron 
566*a980e046SJonathan Cameron /**
567*a980e046SJonathan Cameron  * iio_scan_mask_set() - set particular bit in the scan mask
568*a980e046SJonathan Cameron  * @buffer: the buffer whose scan mask we are interested in
569*a980e046SJonathan Cameron  * @bit: the bit to be set.
570*a980e046SJonathan Cameron  **/
571*a980e046SJonathan Cameron int iio_scan_mask_set(struct iio_dev *indio_dev,
572*a980e046SJonathan Cameron 		      struct iio_buffer *buffer, int bit)
573*a980e046SJonathan Cameron {
574*a980e046SJonathan Cameron 	const unsigned long *mask;
575*a980e046SJonathan Cameron 	unsigned long *trialmask;
576*a980e046SJonathan Cameron 
577*a980e046SJonathan Cameron 	trialmask = kmalloc(sizeof(*trialmask)*
578*a980e046SJonathan Cameron 			    BITS_TO_LONGS(indio_dev->masklength),
579*a980e046SJonathan Cameron 			    GFP_KERNEL);
580*a980e046SJonathan Cameron 
581*a980e046SJonathan Cameron 	if (trialmask == NULL)
582*a980e046SJonathan Cameron 		return -ENOMEM;
583*a980e046SJonathan Cameron 	if (!indio_dev->masklength) {
584*a980e046SJonathan Cameron 		WARN_ON("trying to set scanmask prior to registering buffer\n");
585*a980e046SJonathan Cameron 		kfree(trialmask);
586*a980e046SJonathan Cameron 		return -EINVAL;
587*a980e046SJonathan Cameron 	}
588*a980e046SJonathan Cameron 	bitmap_copy(trialmask, buffer->scan_mask, indio_dev->masklength);
589*a980e046SJonathan Cameron 	set_bit(bit, trialmask);
590*a980e046SJonathan Cameron 
591*a980e046SJonathan Cameron 	if (indio_dev->available_scan_masks) {
592*a980e046SJonathan Cameron 		mask = iio_scan_mask_match(indio_dev->available_scan_masks,
593*a980e046SJonathan Cameron 					   indio_dev->masklength,
594*a980e046SJonathan Cameron 					   trialmask);
595*a980e046SJonathan Cameron 		if (!mask) {
596*a980e046SJonathan Cameron 			kfree(trialmask);
597*a980e046SJonathan Cameron 			return -EINVAL;
598*a980e046SJonathan Cameron 		}
599*a980e046SJonathan Cameron 	}
600*a980e046SJonathan Cameron 	bitmap_copy(buffer->scan_mask, trialmask, indio_dev->masklength);
601*a980e046SJonathan Cameron 
602*a980e046SJonathan Cameron 	kfree(trialmask);
603*a980e046SJonathan Cameron 
604*a980e046SJonathan Cameron 	return 0;
605*a980e046SJonathan Cameron };
606*a980e046SJonathan Cameron EXPORT_SYMBOL_GPL(iio_scan_mask_set);
607*a980e046SJonathan Cameron 
608*a980e046SJonathan Cameron int iio_scan_mask_query(struct iio_dev *indio_dev,
609*a980e046SJonathan Cameron 			struct iio_buffer *buffer, int bit)
610*a980e046SJonathan Cameron {
611*a980e046SJonathan Cameron 	if (bit > indio_dev->masklength)
612*a980e046SJonathan Cameron 		return -EINVAL;
613*a980e046SJonathan Cameron 
614*a980e046SJonathan Cameron 	if (!buffer->scan_mask)
615*a980e046SJonathan Cameron 		return 0;
616*a980e046SJonathan Cameron 
617*a980e046SJonathan Cameron 	return test_bit(bit, buffer->scan_mask);
618*a980e046SJonathan Cameron };
619*a980e046SJonathan Cameron EXPORT_SYMBOL_GPL(iio_scan_mask_query);
620*a980e046SJonathan Cameron 
621*a980e046SJonathan Cameron /**
622*a980e046SJonathan Cameron  * struct iio_demux_table() - table describing demux memcpy ops
623*a980e046SJonathan Cameron  * @from:	index to copy from
624*a980e046SJonathan Cameron  * @to:	index to copy to
625*a980e046SJonathan Cameron  * @length:	how many bytes to copy
626*a980e046SJonathan Cameron  * @l:		list head used for management
627*a980e046SJonathan Cameron  */
628*a980e046SJonathan Cameron struct iio_demux_table {
629*a980e046SJonathan Cameron 	unsigned from;
630*a980e046SJonathan Cameron 	unsigned to;
631*a980e046SJonathan Cameron 	unsigned length;
632*a980e046SJonathan Cameron 	struct list_head l;
633*a980e046SJonathan Cameron };
634*a980e046SJonathan Cameron 
635*a980e046SJonathan Cameron static unsigned char *iio_demux(struct iio_buffer *buffer,
636*a980e046SJonathan Cameron 				 unsigned char *datain)
637*a980e046SJonathan Cameron {
638*a980e046SJonathan Cameron 	struct iio_demux_table *t;
639*a980e046SJonathan Cameron 
640*a980e046SJonathan Cameron 	if (list_empty(&buffer->demux_list))
641*a980e046SJonathan Cameron 		return datain;
642*a980e046SJonathan Cameron 	list_for_each_entry(t, &buffer->demux_list, l)
643*a980e046SJonathan Cameron 		memcpy(buffer->demux_bounce + t->to,
644*a980e046SJonathan Cameron 		       datain + t->from, t->length);
645*a980e046SJonathan Cameron 
646*a980e046SJonathan Cameron 	return buffer->demux_bounce;
647*a980e046SJonathan Cameron }
648*a980e046SJonathan Cameron 
649*a980e046SJonathan Cameron int iio_push_to_buffer(struct iio_buffer *buffer, unsigned char *data,
650*a980e046SJonathan Cameron 		       s64 timestamp)
651*a980e046SJonathan Cameron {
652*a980e046SJonathan Cameron 	unsigned char *dataout = iio_demux(buffer, data);
653*a980e046SJonathan Cameron 
654*a980e046SJonathan Cameron 	return buffer->access->store_to(buffer, dataout, timestamp);
655*a980e046SJonathan Cameron }
656*a980e046SJonathan Cameron EXPORT_SYMBOL_GPL(iio_push_to_buffer);
657*a980e046SJonathan Cameron 
658*a980e046SJonathan Cameron static void iio_buffer_demux_free(struct iio_buffer *buffer)
659*a980e046SJonathan Cameron {
660*a980e046SJonathan Cameron 	struct iio_demux_table *p, *q;
661*a980e046SJonathan Cameron 	list_for_each_entry_safe(p, q, &buffer->demux_list, l) {
662*a980e046SJonathan Cameron 		list_del(&p->l);
663*a980e046SJonathan Cameron 		kfree(p);
664*a980e046SJonathan Cameron 	}
665*a980e046SJonathan Cameron }
666*a980e046SJonathan Cameron 
667*a980e046SJonathan Cameron int iio_update_demux(struct iio_dev *indio_dev)
668*a980e046SJonathan Cameron {
669*a980e046SJonathan Cameron 	const struct iio_chan_spec *ch;
670*a980e046SJonathan Cameron 	struct iio_buffer *buffer = indio_dev->buffer;
671*a980e046SJonathan Cameron 	int ret, in_ind = -1, out_ind, length;
672*a980e046SJonathan Cameron 	unsigned in_loc = 0, out_loc = 0;
673*a980e046SJonathan Cameron 	struct iio_demux_table *p;
674*a980e046SJonathan Cameron 
675*a980e046SJonathan Cameron 	/* Clear out any old demux */
676*a980e046SJonathan Cameron 	iio_buffer_demux_free(buffer);
677*a980e046SJonathan Cameron 	kfree(buffer->demux_bounce);
678*a980e046SJonathan Cameron 	buffer->demux_bounce = NULL;
679*a980e046SJonathan Cameron 
680*a980e046SJonathan Cameron 	/* First work out which scan mode we will actually have */
681*a980e046SJonathan Cameron 	if (bitmap_equal(indio_dev->active_scan_mask,
682*a980e046SJonathan Cameron 			 buffer->scan_mask,
683*a980e046SJonathan Cameron 			 indio_dev->masklength))
684*a980e046SJonathan Cameron 		return 0;
685*a980e046SJonathan Cameron 
686*a980e046SJonathan Cameron 	/* Now we have the two masks, work from least sig and build up sizes */
687*a980e046SJonathan Cameron 	for_each_set_bit(out_ind,
688*a980e046SJonathan Cameron 			 indio_dev->active_scan_mask,
689*a980e046SJonathan Cameron 			 indio_dev->masklength) {
690*a980e046SJonathan Cameron 		in_ind = find_next_bit(indio_dev->active_scan_mask,
691*a980e046SJonathan Cameron 				       indio_dev->masklength,
692*a980e046SJonathan Cameron 				       in_ind + 1);
693*a980e046SJonathan Cameron 		while (in_ind != out_ind) {
694*a980e046SJonathan Cameron 			in_ind = find_next_bit(indio_dev->active_scan_mask,
695*a980e046SJonathan Cameron 					       indio_dev->masklength,
696*a980e046SJonathan Cameron 					       in_ind + 1);
697*a980e046SJonathan Cameron 			ch = iio_find_channel_from_si(indio_dev, in_ind);
698*a980e046SJonathan Cameron 			length = ch->scan_type.storagebits/8;
699*a980e046SJonathan Cameron 			/* Make sure we are aligned */
700*a980e046SJonathan Cameron 			in_loc += length;
701*a980e046SJonathan Cameron 			if (in_loc % length)
702*a980e046SJonathan Cameron 				in_loc += length - in_loc % length;
703*a980e046SJonathan Cameron 		}
704*a980e046SJonathan Cameron 		p = kmalloc(sizeof(*p), GFP_KERNEL);
705*a980e046SJonathan Cameron 		if (p == NULL) {
706*a980e046SJonathan Cameron 			ret = -ENOMEM;
707*a980e046SJonathan Cameron 			goto error_clear_mux_table;
708*a980e046SJonathan Cameron 		}
709*a980e046SJonathan Cameron 		ch = iio_find_channel_from_si(indio_dev, in_ind);
710*a980e046SJonathan Cameron 		length = ch->scan_type.storagebits/8;
711*a980e046SJonathan Cameron 		if (out_loc % length)
712*a980e046SJonathan Cameron 			out_loc += length - out_loc % length;
713*a980e046SJonathan Cameron 		if (in_loc % length)
714*a980e046SJonathan Cameron 			in_loc += length - in_loc % length;
715*a980e046SJonathan Cameron 		p->from = in_loc;
716*a980e046SJonathan Cameron 		p->to = out_loc;
717*a980e046SJonathan Cameron 		p->length = length;
718*a980e046SJonathan Cameron 		list_add_tail(&p->l, &buffer->demux_list);
719*a980e046SJonathan Cameron 		out_loc += length;
720*a980e046SJonathan Cameron 		in_loc += length;
721*a980e046SJonathan Cameron 	}
722*a980e046SJonathan Cameron 	/* Relies on scan_timestamp being last */
723*a980e046SJonathan Cameron 	if (buffer->scan_timestamp) {
724*a980e046SJonathan Cameron 		p = kmalloc(sizeof(*p), GFP_KERNEL);
725*a980e046SJonathan Cameron 		if (p == NULL) {
726*a980e046SJonathan Cameron 			ret = -ENOMEM;
727*a980e046SJonathan Cameron 			goto error_clear_mux_table;
728*a980e046SJonathan Cameron 		}
729*a980e046SJonathan Cameron 		ch = iio_find_channel_from_si(indio_dev,
730*a980e046SJonathan Cameron 			indio_dev->scan_index_timestamp);
731*a980e046SJonathan Cameron 		length = ch->scan_type.storagebits/8;
732*a980e046SJonathan Cameron 		if (out_loc % length)
733*a980e046SJonathan Cameron 			out_loc += length - out_loc % length;
734*a980e046SJonathan Cameron 		if (in_loc % length)
735*a980e046SJonathan Cameron 			in_loc += length - in_loc % length;
736*a980e046SJonathan Cameron 		p->from = in_loc;
737*a980e046SJonathan Cameron 		p->to = out_loc;
738*a980e046SJonathan Cameron 		p->length = length;
739*a980e046SJonathan Cameron 		list_add_tail(&p->l, &buffer->demux_list);
740*a980e046SJonathan Cameron 		out_loc += length;
741*a980e046SJonathan Cameron 		in_loc += length;
742*a980e046SJonathan Cameron 	}
743*a980e046SJonathan Cameron 	buffer->demux_bounce = kzalloc(out_loc, GFP_KERNEL);
744*a980e046SJonathan Cameron 	if (buffer->demux_bounce == NULL) {
745*a980e046SJonathan Cameron 		ret = -ENOMEM;
746*a980e046SJonathan Cameron 		goto error_clear_mux_table;
747*a980e046SJonathan Cameron 	}
748*a980e046SJonathan Cameron 	return 0;
749*a980e046SJonathan Cameron 
750*a980e046SJonathan Cameron error_clear_mux_table:
751*a980e046SJonathan Cameron 	iio_buffer_demux_free(buffer);
752*a980e046SJonathan Cameron 
753*a980e046SJonathan Cameron 	return ret;
754*a980e046SJonathan Cameron }
755*a980e046SJonathan Cameron EXPORT_SYMBOL_GPL(iio_update_demux);
756