From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
To: Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
Dmitry Baryshkov <dmitry.baryshkov@linaro.org>,
Jonathan Cameron <Jonathan.Cameron@huawei.com>,
Andreas Kemnade <andreas@kemnade.info>,
linux-arm-msm@vger.kernel.org, linux-iio@vger.kernel.org,
linux-kernel@vger.kernel.org
Cc: Andy Gross <agross@kernel.org>,
Bjorn Andersson <bjorn.andersson@linaro.org>,
Jonathan Cameron <jic23@kernel.org>,
Lars-Peter Clausen <lars@metafoo.de>,
Peter Rosin <peda@axentia.se>
Subject: [PATCH v2 5/5] iio: afe: iio-rescale: Re-use generic struct s32_fract
Date: Mon, 10 Jan 2022 21:31:04 +0200 [thread overview]
Message-ID: <20220110193104.75225-5-andriy.shevchenko@linux.intel.com> (raw)
In-Reply-To: <20220110193104.75225-1-andriy.shevchenko@linux.intel.com>
Instead of custom data type re-use generic struct s32_fract.
No changes intended.
The new member is put to be the first one to avoid additional
pointer arithmetic. Besides that one may switch to use fract
member to perform container_of(), which will be no-op in this
case, to get struct rescale.
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
I found this better in order how code is structurally (re)organized.
I may rebase this on top of ongoing AFE series.
Also reveals possibility to switch to rational best approximation.
But this is another story...
v2: no changes
drivers/iio/afe/iio-rescale.c | 74 +++++++++++++++++------------------
1 file changed, 37 insertions(+), 37 deletions(-)
diff --git a/drivers/iio/afe/iio-rescale.c b/drivers/iio/afe/iio-rescale.c
index 774eb3044edd..0368bca8a485 100644
--- a/drivers/iio/afe/iio-rescale.c
+++ b/drivers/iio/afe/iio-rescale.c
@@ -11,6 +11,7 @@
#include <linux/gcd.h>
#include <linux/iio/consumer.h>
#include <linux/iio/iio.h>
+#include <linux/math.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_device.h>
@@ -21,17 +22,16 @@ struct rescale;
struct rescale_cfg {
enum iio_chan_type type;
- int (*props)(struct device *dev, struct rescale *rescale);
+ int (*props)(struct device *dev, struct s32_fract *fract);
};
struct rescale {
+ struct s32_fract fract;
const struct rescale_cfg *cfg;
struct iio_channel *source;
struct iio_chan_spec chan;
struct iio_chan_spec_ext_info *ext_info;
bool chan_processed;
- s32 numerator;
- s32 denominator;
};
static int rescale_read_raw(struct iio_dev *indio_dev,
@@ -39,6 +39,7 @@ static int rescale_read_raw(struct iio_dev *indio_dev,
int *val, int *val2, long mask)
{
struct rescale *rescale = iio_priv(indio_dev);
+ struct s32_fract *fract = &rescale->fract;
unsigned long long tmp;
int ret;
@@ -67,19 +68,19 @@ static int rescale_read_raw(struct iio_dev *indio_dev,
}
switch (ret) {
case IIO_VAL_FRACTIONAL:
- *val *= rescale->numerator;
- *val2 *= rescale->denominator;
+ *val *= fract->numerator;
+ *val2 *= fract->denominator;
return ret;
case IIO_VAL_INT:
- *val *= rescale->numerator;
- if (rescale->denominator == 1)
+ *val *= fract->numerator;
+ if (fract->denominator == 1)
return ret;
- *val2 = rescale->denominator;
+ *val2 = fract->denominator;
return IIO_VAL_FRACTIONAL;
case IIO_VAL_FRACTIONAL_LOG2:
tmp = *val * 1000000000LL;
- do_div(tmp, rescale->denominator);
- tmp *= rescale->numerator;
+ do_div(tmp, fract->denominator);
+ tmp *= fract->numerator;
do_div(tmp, 1000000000LL);
*val = tmp;
return ret;
@@ -175,7 +176,7 @@ static int rescale_configure_channel(struct device *dev,
}
static int rescale_current_sense_amplifier_props(struct device *dev,
- struct rescale *rescale)
+ struct s32_fract *fract)
{
u32 sense;
u32 gain_mult = 1;
@@ -199,22 +200,22 @@ static int rescale_current_sense_amplifier_props(struct device *dev,
* numerator/denominator from overflowing.
*/
factor = gcd(sense, 1000000);
- rescale->numerator = 1000000 / factor;
- rescale->denominator = sense / factor;
+ fract->numerator = 1000000 / factor;
+ fract->denominator = sense / factor;
- factor = gcd(rescale->numerator, gain_mult);
- rescale->numerator /= factor;
- rescale->denominator *= gain_mult / factor;
+ factor = gcd(fract->numerator, gain_mult);
+ fract->numerator /= factor;
+ fract->denominator *= gain_mult / factor;
- factor = gcd(rescale->denominator, gain_div);
- rescale->numerator *= gain_div / factor;
- rescale->denominator /= factor;
+ factor = gcd(fract->denominator, gain_div);
+ fract->numerator *= gain_div / factor;
+ fract->denominator /= factor;
return 0;
}
static int rescale_current_sense_shunt_props(struct device *dev,
- struct rescale *rescale)
+ struct s32_fract *fract)
{
u32 shunt;
u32 factor;
@@ -228,35 +229,33 @@ static int rescale_current_sense_shunt_props(struct device *dev,
}
factor = gcd(shunt, 1000000);
- rescale->numerator = 1000000 / factor;
- rescale->denominator = shunt / factor;
+ fract->numerator = 1000000 / factor;
+ fract->denominator = shunt / factor;
return 0;
}
static int rescale_voltage_divider_props(struct device *dev,
- struct rescale *rescale)
+ struct s32_fract *fract)
{
int ret;
u32 factor;
- ret = device_property_read_u32(dev, "output-ohms",
- &rescale->denominator);
+ ret = device_property_read_u32(dev, "output-ohms", &fract->denominator);
if (ret) {
dev_err(dev, "failed to read output-ohms: %d\n", ret);
return ret;
}
- ret = device_property_read_u32(dev, "full-ohms",
- &rescale->numerator);
+ ret = device_property_read_u32(dev, "full-ohms", &fract->numerator);
if (ret) {
dev_err(dev, "failed to read full-ohms: %d\n", ret);
return ret;
}
- factor = gcd(rescale->numerator, rescale->denominator);
- rescale->numerator /= factor;
- rescale->denominator /= factor;
+ factor = gcd(fract->numerator, fract->denominator);
+ fract->numerator /= factor;
+ fract->denominator /= factor;
return 0;
}
@@ -299,6 +298,7 @@ static int rescale_probe(struct platform_device *pdev)
struct iio_dev *indio_dev;
struct iio_channel *source;
struct rescale *rescale;
+ struct s32_fract *fract;
int sizeof_ext_info;
int sizeof_priv;
int i;
@@ -322,24 +322,24 @@ static int rescale_probe(struct platform_device *pdev)
return -ENOMEM;
rescale = iio_priv(indio_dev);
-
+ rescale->source = source;
rescale->cfg = of_device_get_match_data(dev);
- rescale->numerator = 1;
- rescale->denominator = 1;
- ret = rescale->cfg->props(dev, rescale);
+ fract = &rescale->fract;
+ fract->numerator = 1;
+ fract->denominator = 1;
+
+ ret = rescale->cfg->props(dev, fract);
if (ret)
return ret;
- if (!rescale->numerator || !rescale->denominator) {
+ if (!fract->numerator || !fract->denominator) {
dev_err(dev, "invalid scaling factor.\n");
return -EINVAL;
}
platform_set_drvdata(pdev, indio_dev);
- rescale->source = source;
-
indio_dev->name = dev_name(dev);
indio_dev->info = &rescale_info;
indio_dev->modes = INDIO_DIRECT_MODE;
--
2.34.1
next prev parent reply other threads:[~2022-01-10 19:31 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-10 19:31 [PATCH v2 1/5] math.h: Introduce data types for fractional numbers Andy Shevchenko
2022-01-10 19:31 ` [PATCH v2 2/5] iio: adc: rn5t618: Re-use generic struct u16_fract Andy Shevchenko
2022-01-10 19:31 ` [PATCH v2 3/5] iio: adc: twl4030-madc: Re-use generic struct s16_fract Andy Shevchenko
2022-01-10 19:31 ` [PATCH v2 4/5] iio: adc: qcom-vadc-common: Re-use generic struct u32_fract Andy Shevchenko
2022-01-10 19:31 ` Andy Shevchenko [this message]
2022-01-15 18:52 ` [PATCH v2 5/5] iio: afe: iio-rescale: Re-use generic struct s32_fract Jonathan Cameron
2022-01-24 15:18 ` Andy Shevchenko
2022-01-24 15:19 ` Andy Shevchenko
2022-01-24 21:28 ` Liam Beguin
2022-01-25 13:17 ` Andy Shevchenko
2022-01-25 14:54 ` Peter Rosin
2022-01-25 18:17 ` Andy Shevchenko
2022-01-26 10:26 ` Peter Rosin
2022-01-26 12:04 ` Andy Shevchenko
2022-01-26 12:35 ` Peter Rosin
2022-01-26 13:01 ` Andy Shevchenko
2022-01-27 11:03 ` Peter Rosin
2022-01-27 12:11 ` Peter Rosin
2022-01-27 15:09 ` Andy Shevchenko
2022-01-27 15:08 ` Andy Shevchenko
2022-01-26 15:54 ` Liam Beguin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220110193104.75225-5-andriy.shevchenko@linux.intel.com \
--to=andriy.shevchenko@linux.intel.com \
--cc=Jonathan.Cameron@huawei.com \
--cc=agross@kernel.org \
--cc=andreas@kemnade.info \
--cc=bjorn.andersson@linaro.org \
--cc=dmitry.baryshkov@linaro.org \
--cc=jic23@kernel.org \
--cc=lars@metafoo.de \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-iio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=peda@axentia.se \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.