On 10/16/2012 05:29 PM, Lars-Peter Clausen wrote: > For ADCs or DACs the denominator for fractional types often is a power of two. > In this case we can use a shift operation instead of the rather expensive 64 bit > division. This patch adds a new fractional type which expects the denominator to > be specified as the log2 of the actual denominator. E.g. for ADCs and DACs this > will usually be the number of significant bits. Only slight issue with this is that continual addition of these will eventually make for a mess. Having said that, this one is sensible and as you say common. > > Signed-off-by: Lars-Peter Clausen <lars@xxxxxxxxxx> Added to togreg branch of iio.git > --- > drivers/iio/industrialio-core.c | 5 +++++ > drivers/iio/inkern.c | 3 +++ > include/linux/iio/types.h | 1 + > 3 files changed, 9 insertions(+) > > diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-core.c > index 6eb24db..37650a7 100644 > --- a/drivers/iio/industrialio-core.c > +++ b/drivers/iio/industrialio-core.c > @@ -397,6 +397,11 @@ static ssize_t iio_read_channel_info(struct device *dev, > val2 = do_div(tmp, 1000000000LL); > val = tmp; > return sprintf(buf, "%d.%09u\n", val, val2); > + case IIO_VAL_FRACTIONAL_LOG2: > + tmp = (s64)val * 1000000000LL >> val2; > + val2 = do_div(tmp, 1000000000LL); > + val = tmp; > + return sprintf(buf, "%d.%09u\n", val, val2); > default: > return 0; > } > diff --git a/drivers/iio/inkern.c b/drivers/iio/inkern.c > index f2b78d4..2ee4450 100644 > --- a/drivers/iio/inkern.c > +++ b/drivers/iio/inkern.c > @@ -314,6 +314,9 @@ static int iio_convert_raw_to_processed_unlocked(struct iio_channel *chan, > *processed = div_s64(raw64 * (s64)scale_val * scale, > scale_val2); > break; > + case IIO_VAL_FRACTIONAL_LOG2: > + *processed = (raw64 * (s64)scale_val * scale) >> scale_val2; > + break; > default: > return -EINVAL; > } > diff --git a/include/linux/iio/types.h b/include/linux/iio/types.h > index 5c647ec..87b196a 100644 > --- a/include/linux/iio/types.h > +++ b/include/linux/iio/types.h > @@ -58,5 +58,6 @@ enum iio_modifier { > #define IIO_VAL_INT_PLUS_NANO 3 > #define IIO_VAL_INT_PLUS_MICRO_DB 4 > #define IIO_VAL_FRACTIONAL 10 > +#define IIO_VAL_FRACTIONAL_LOG2 11 > > #endif /* _IIO_TYPES_H_ */ > -- To unsubscribe from this list: send the line "unsubscribe linux-iio" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html