forked from mirrors/linux
		
	iio: Introduce a new fractional value type
Currently IIO uses a decimal fixed point representations for real type numbers. This patch introduces a new representation for rational type numbers. The number will be expressed by specifying a numerator and denominator. For converting a raw value to a processed value multiply it by the numerator and divide it by the denominator. The reasoning for introducing this new type is that for a lot of devices the scale can be represented easily by a fractional number, but it is not possible to represent it as fixed point number without rounding. E.g. for a simple DAC the scale is often the reference voltage divided by the number of possible values (Usually 2**n_bits - 1). Each driver currently implements the conversion of this fraction to a fixed point number on its own. Also when it comes to the in-kernel interface this allows to directly use the fractional factors to convert a raw value to a processed value. This should on one hand require less instructions and on the other hand increase the precision. Signed-off-by: Lars-Peter Clausen <lars@metafoo.de> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
This commit is contained in:
		
							parent
							
								
									ca7d1b32d2
								
							
						
					
					
						commit
						7985e7c100
					
				
					 2 changed files with 7 additions and 0 deletions
				
			
		| 
						 | 
					@ -366,6 +366,7 @@ static ssize_t iio_read_channel_info(struct device *dev,
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct iio_dev *indio_dev = dev_to_iio_dev(dev);
 | 
						struct iio_dev *indio_dev = dev_to_iio_dev(dev);
 | 
				
			||||||
	struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
 | 
						struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
 | 
				
			||||||
 | 
						unsigned long long tmp;
 | 
				
			||||||
	int val, val2;
 | 
						int val, val2;
 | 
				
			||||||
	bool scale_db = false;
 | 
						bool scale_db = false;
 | 
				
			||||||
	int ret = indio_dev->info->read_raw(indio_dev, this_attr->c,
 | 
						int ret = indio_dev->info->read_raw(indio_dev, this_attr->c,
 | 
				
			||||||
| 
						 | 
					@ -391,6 +392,11 @@ static ssize_t iio_read_channel_info(struct device *dev,
 | 
				
			||||||
			return sprintf(buf, "-%d.%09u\n", val, -val2);
 | 
								return sprintf(buf, "-%d.%09u\n", val, -val2);
 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
			return sprintf(buf, "%d.%09u\n", val, val2);
 | 
								return sprintf(buf, "%d.%09u\n", val, val2);
 | 
				
			||||||
 | 
						case IIO_VAL_FRACTIONAL:
 | 
				
			||||||
 | 
							tmp = div_s64((s64)val * 1000000000LL, val2);
 | 
				
			||||||
 | 
							val2 = do_div(tmp, 1000000000LL);
 | 
				
			||||||
 | 
							val = tmp;
 | 
				
			||||||
 | 
							return sprintf(buf, "%d.%09u\n", val, val2);
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -57,5 +57,6 @@ enum iio_modifier {
 | 
				
			||||||
#define IIO_VAL_INT_PLUS_MICRO 2
 | 
					#define IIO_VAL_INT_PLUS_MICRO 2
 | 
				
			||||||
#define IIO_VAL_INT_PLUS_NANO 3
 | 
					#define IIO_VAL_INT_PLUS_NANO 3
 | 
				
			||||||
#define IIO_VAL_INT_PLUS_MICRO_DB 4
 | 
					#define IIO_VAL_INT_PLUS_MICRO_DB 4
 | 
				
			||||||
 | 
					#define IIO_VAL_FRACTIONAL 10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* _IIO_TYPES_H_ */
 | 
					#endif /* _IIO_TYPES_H_ */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue