staging:iio: make iio_sw_buffer_preenable much more general.
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> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
		
							parent
							
								
									4d5f8d3db5
								
							
						
					
					
						commit
						959d2952d1
					
				| @ -280,6 +280,7 @@ struct iio_info { | |||||||
|  * @available_scan_masks: [DRIVER] optional array of allowed bitmasks |  * @available_scan_masks: [DRIVER] optional array of allowed bitmasks | ||||||
|  * @masklength:		[INTERN] the length of the mask established from |  * @masklength:		[INTERN] the length of the mask established from | ||||||
|  *			channels |  *			channels | ||||||
|  |  * @active_scan_mask:	[INTERN] union of all scan masks requested by buffers | ||||||
|  * @trig:		[INTERN] current device trigger (buffer modes) |  * @trig:		[INTERN] current device trigger (buffer modes) | ||||||
|  * @pollfunc:		[DRIVER] function run on trigger being received |  * @pollfunc:		[DRIVER] function run on trigger being received | ||||||
|  * @channels:		[DRIVER] channel specification structure table |  * @channels:		[DRIVER] channel specification structure table | ||||||
| @ -307,6 +308,7 @@ struct iio_dev { | |||||||
| 
 | 
 | ||||||
| 	unsigned long			*available_scan_masks; | 	unsigned long			*available_scan_masks; | ||||||
| 	unsigned			masklength; | 	unsigned			masklength; | ||||||
|  | 	unsigned long			*active_scan_mask; | ||||||
| 	struct iio_trigger		*trig; | 	struct iio_trigger		*trig; | ||||||
| 	struct iio_poll_func		*pollfunc; | 	struct iio_poll_func		*pollfunc; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -531,32 +531,6 @@ ssize_t iio_buffer_show_enable(struct device *dev, | |||||||
| } | } | ||||||
| EXPORT_SYMBOL(iio_buffer_show_enable); | 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. */ | /* note NULL used as error indicator as it doesn't make sense. */ | ||||||
| static unsigned long *iio_scan_mask_match(unsigned long *av_masks, | static unsigned long *iio_scan_mask_match(unsigned long *av_masks, | ||||||
| 					  unsigned int masklength, | 					  unsigned int masklength, | ||||||
| @ -572,6 +546,43 @@ static unsigned long *iio_scan_mask_match(unsigned long *av_masks, | |||||||
| 	return NULL; | 	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 |  * iio_scan_mask_set() - set particular bit in the scan mask | ||||||
|  * @buffer: the buffer whose scan mask we are interested in |  * @buffer: the buffer whose scan mask we are interested in | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user