rescale
int rescale_process_offset(struct rescale *rescale, int scale_type,
tmp = (s64)rescale->offset * scale2;
*val = div_s64(rescale->offset, scale) + schan_off;
tmp = (s64)rescale->offset * (1 << scale2);
tmp = (s64)rescale->offset * 1000000000LL;
tmp = (s64)rescale->offset * 1000000LL;
struct rescale *rescale = iio_priv(indio_dev);
if (rescale->chan_processed)
return iio_read_channel_processed(rescale->source, val);
return iio_read_channel_raw(rescale->source, val);
if (rescale->chan_processed) {
ret = iio_read_channel_scale(rescale->source, val, val2);
return rescale_process_scale(rescale, ret, val, val2);
if (rescale->chan_processed) {
*val = rescale->offset;
if (iio_channel_has_info(rescale->source->channel,
ret = iio_read_channel_offset(rescale->source,
if (iio_channel_has_info(rescale->source->channel,
ret = iio_read_channel_scale(rescale->source, &scale, &scale2);
int rescale_process_scale(struct rescale *rescale, int scale_type,
return rescale_process_offset(rescale, ret, scale, scale2,
return rescale_process_offset(rescale, IIO_VAL_FRACTIONAL, 1, 1,
struct rescale *rescale = iio_priv(indio_dev);
return iio_read_avail_channel_raw(rescale->source,
struct rescale *rescale = iio_priv(indio_dev);
return iio_read_channel_ext_info(rescale->source,
rescale->ext_info[private].name,
struct rescale *rescale = iio_priv(indio_dev);
return iio_write_channel_ext_info(rescale->source,
rescale->ext_info[private].name,
struct rescale *rescale)
struct iio_chan_spec *chan = &rescale->chan;
struct iio_chan_spec const *schan = rescale->source->channel;
chan->ext_info = rescale->ext_info;
chan->type = rescale->cfg->type;
rescale->chan_processed = true;
if (rescale->offset)
!rescale->chan_processed)
struct rescale *rescale)
*val *= rescale->numerator;
if (rescale->denominator == 1)
rescale->numerator = 1000000 / factor;
rescale->denominator = sense / factor;
factor = gcd(rescale->numerator, gain_mult);
rescale->numerator /= factor;
rescale->denominator *= gain_mult / factor;
factor = gcd(rescale->denominator, gain_div);
rescale->numerator *= gain_div / factor;
rescale->denominator /= factor;
*val2 = rescale->denominator;
struct rescale *rescale)
rescale->numerator = 1000000 / factor;
rescale->denominator = shunt / factor;
struct rescale *rescale)
&rescale->denominator);
&rescale->numerator);
factor = gcd(rescale->numerator, rescale->denominator);
rescale->numerator /= factor;
rescale->denominator /= factor;
struct rescale *rescale)
if (!check_mul_overflow(*val, rescale->numerator, &_val) &&
rescale->numerator = 1000000 / factor;
rescale->denominator = tmp / factor;
rescale->offset = -1 * ((r0 * iexc) / 1000);
!check_mul_overflow(*val2, rescale->denominator, &_val2)) {
struct rescale *rescale)
rescale->numerator = 1000000;
rescale->denominator = alpha * sense;
rescale->offset = div_s64((s64)offset * rescale->denominator,
rescale->numerator);
struct rescale *rescale;
tmp = div_s64(tmp, rescale->denominator);
tmp *= rescale->numerator;
sizeof_ext_info *= sizeof(*rescale->ext_info);
sizeof_priv = sizeof(*rescale) + sizeof_ext_info;
rescale = iio_priv(indio_dev);
rescale->cfg = device_get_match_data(dev);
rescale->numerator = 1;
rescale->denominator = 1;
rescale->offset = 0;
ret = rescale->cfg->props(dev, rescale);
if (!rescale->numerator || !rescale->denominator) {
rescale->source = source;
indio_dev->channels = &rescale->chan;
rescale->ext_info = devm_kmemdup(dev,
if (!rescale->ext_info)
for (i = 0; rescale->ext_info[i].name; ++i) {
&rescale->ext_info[i];
ret = rescale_configure_channel(dev, rescale);
tmp = (s64)abs(*val) * abs(rescale->numerator);
*val = div_s64_rem(tmp, abs(rescale->denominator), &rem);
tmp = (s64)rem * mult + (s64)abs(*val2) * abs(rescale->numerator);
tmp = div_s64(tmp, abs(rescale->denominator));
if (neg ^ ((rescale->numerator < 0) ^ (rescale->denominator < 0))) {
struct rescale rescale;
rescale.numerator = t->numerator;
rescale.denominator = t->denominator;
rescale.offset = t->offset;
ret = rescale_process_scale(&rescale, t->schan_scale_type,
struct rescale rescale;
rescale.numerator = t->numerator;
rescale.denominator = t->denominator;
rescale.offset = t->offset;
ret = rescale_process_offset(&rescale, t->schan_scale_type,
atomic_sub(sectors, &c->rescale);
r = atomic_read(&c->rescale);
} while (atomic_cmpxchg(&c->rescale, r, r + next) != r);
atomic_t rescale;
goto rescale;
goto rescale;
rescale:
if (++stats->rescale == rescale_at) {
stats->rescale = 0;
unsigned int rescale;
struct rescale;
int (*props)(struct device *dev, struct rescale *rescale);
int rescale_process_scale(struct rescale *rescale, int scale_type,
int rescale_process_offset(struct rescale *rescale, int scale_type,
{ int const rescale = (maxTableLog-tableLog) - 1; /* tableLog <= maxTableLog */
nextRankVal += wksp->rankStats[w] << (w+rescale);