Lines Matching defs:rescale

3  * IIO rescale driver
18 #include <linux/iio/afe/rescale.h>
22 int rescale_process_scale(struct rescale *rescale, int scale_type,
33 *val *= rescale->numerator;
34 if (rescale->denominator == 1)
36 *val2 = rescale->denominator;
44 if (!check_mul_overflow(*val, rescale->numerator, &_val) &&
45 !check_mul_overflow(*val2, rescale->denominator, &_val2)) {
53 tmp = div_s64(tmp, rescale->denominator);
54 tmp *= rescale->numerator;
86 tmp = (s64)abs(*val) * abs(rescale->numerator);
87 *val = div_s64_rem(tmp, abs(rescale->denominator), &rem);
89 tmp = (s64)rem * mult + (s64)abs(*val2) * abs(rescale->numerator);
90 tmp = div_s64(tmp, abs(rescale->denominator));
98 if (neg ^ ((rescale->numerator < 0) ^ (rescale->denominator < 0))) {
112 int rescale_process_offset(struct rescale *rescale, int scale_type,
120 tmp = (s64)rescale->offset * scale2;
124 *val = div_s64(rescale->offset, scale) + schan_off;
127 tmp = (s64)rescale->offset * (1 << scale2);
131 tmp = (s64)rescale->offset * 1000000000LL;
136 tmp = (s64)rescale->offset * 1000000LL;
150 struct rescale *rescale = iio_priv(indio_dev);
157 if (rescale->chan_processed)
163 return iio_read_channel_processed(rescale->source, val);
165 return iio_read_channel_raw(rescale->source, val);
168 if (rescale->chan_processed) {
176 ret = iio_read_channel_scale(rescale->source, val, val2);
178 return rescale_process_scale(rescale, ret, val, val2);
204 if (rescale->chan_processed) {
205 *val = rescale->offset;
209 if (iio_channel_has_info(rescale->source->channel,
211 ret = iio_read_channel_offset(rescale->source,
217 if (iio_channel_has_info(rescale->source->channel,
219 ret = iio_read_channel_scale(rescale->source, &scale, &scale2);
220 return rescale_process_offset(rescale, ret, scale, scale2,
228 return rescale_process_offset(rescale, IIO_VAL_FRACTIONAL, 1, 1,
240 struct rescale *rescale = iio_priv(indio_dev);
245 return iio_read_avail_channel_raw(rescale->source,
262 struct rescale *rescale = iio_priv(indio_dev);
264 return iio_read_channel_ext_info(rescale->source,
265 rescale->ext_info[private].name,
274 struct rescale *rescale = iio_priv(indio_dev);
276 return iio_write_channel_ext_info(rescale->source,
277 rescale->ext_info[private].name,
282 struct rescale *rescale)
284 struct iio_chan_spec *chan = &rescale->chan;
285 struct iio_chan_spec const *schan = rescale->source->channel;
289 chan->ext_info = rescale->ext_info;
290 chan->type = rescale->cfg->type;
298 rescale->chan_processed = true;
307 if (rescale->offset)
316 !rescale->chan_processed)
323 struct rescale *rescale)
347 rescale->numerator = 1000000 / factor;
348 rescale->denominator = sense / factor;
350 factor = gcd(rescale->numerator, gain_mult);
351 rescale->numerator /= factor;
352 rescale->denominator *= gain_mult / factor;
354 factor = gcd(rescale->denominator, gain_div);
355 rescale->numerator *= gain_div / factor;
356 rescale->denominator /= factor;
362 struct rescale *rescale)
376 rescale->numerator = 1000000 / factor;
377 rescale->denominator = shunt / factor;
383 struct rescale *rescale)
389 &rescale->denominator);
396 &rescale->numerator);
402 factor = gcd(rescale->numerator, rescale->denominator);
403 rescale->numerator /= factor;
404 rescale->denominator /= factor;
410 struct rescale *rescale)
442 rescale->numerator = 1000000 / factor;
443 rescale->denominator = tmp / factor;
445 rescale->offset = -1 * ((r0 * iexc) / 1000);
451 struct rescale *rescale)
466 rescale->numerator = 1000000;
467 rescale->denominator = alpha * sense;
469 rescale->offset = div_s64((s64)offset * rescale->denominator,
470 rescale->numerator);
526 struct rescale *rescale;
540 sizeof_ext_info *= sizeof(*rescale->ext_info);
543 sizeof_priv = sizeof(*rescale) + sizeof_ext_info;
549 rescale = iio_priv(indio_dev);
551 rescale->cfg = device_get_match_data(dev);
552 rescale->numerator = 1;
553 rescale->denominator = 1;
554 rescale->offset = 0;
556 ret = rescale->cfg->props(dev, rescale);
560 if (!rescale->numerator || !rescale->denominator) {
567 rescale->source = source;
572 indio_dev->channels = &rescale->chan;
575 rescale->ext_info = devm_kmemdup(dev,
578 if (!rescale->ext_info)
581 for (i = 0; rescale->ext_info[i].name; ++i) {
583 &rescale->ext_info[i];
593 ret = rescale_configure_channel(dev, rescale);
603 .name = "iio-rescale",
609 MODULE_DESCRIPTION("IIO rescale driver");