All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Vaittinen, Matti" <Matti.Vaittinen@fi.rohmeurope.com>
To: "andy.shevchenko@gmail.com" <andy.shevchenko@gmail.com>
Cc: "mark.rutland@arm.com" <mark.rutland@arm.com>,
	"milo.kim@ti.com" <milo.kim@ti.com>,
	"andrei.stefanescu@microchip.com"
	<andrei.stefanescu@microchip.com>,
	"rafael@kernel.org" <rafael@kernel.org>,
	"tony@atomide.com" <tony@atomide.com>,
	"linus.walleij@linaro.org" <linus.walleij@linaro.org>,
	"brendanhiggins@google.com" <brendanhiggins@google.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"yamada.masahiro@socionext.com" <yamada.masahiro@socionext.com>,
	"linux-omap@vger.kernel.org" <linux-omap@vger.kernel.org>,
	"vincenzo.frascino@arm.com" <vincenzo.frascino@arm.com>,
	"tglx@linutronix.de" <tglx@linutronix.de>,
	"linux-samsung-soc@vger.kernel.org"
	<linux-samsung-soc@vger.kernel.org>,
	"herbert@gondor.apana.org.au" <herbert@gondor.apana.org.au>,
	"b.zolnierkie@samsung.com" <b.zolnierkie@samsung.com>,
	"krzk@kernel.org" <krzk@kernel.org>,
	"bgolaszewski@baylibre.com" <bgolaszewski@baylibre.com>,
	"wens@csie.org" <wens@csie.org>,
	"agross@kernel.org" <agross@kernel.org>,
	"Laine, Markus" <Markus.Laine@fi.rohmeurope.com>,
	"bp@suse.de" <bp@suse.de>,
	"devicetree@vger.kernel.org" <devicetree@vger.kernel.org>,
	"zaslonko@linux.ibm.com" <zaslonko@linux.ibm.com>,
	"ckeepax@opensource.cirrus.com" <ckeepax@opensource.cirrus.com>,
	"arnd@arndb.de" <arnd@arndb.de>,
	"linux-pm@vger.kernel.org" <linux-pm@vger.kernel.org>,
	"linux-arm-msm@vger.kernel.org" <linux-arm-msm@vger.kernel.org>,
	"rf@opensource.cirrus.com" <rf@opensource.cirrus.com>,
	"broonie@kernel.org" <broonie@kernel.org>,
	"linux-mediatek@lists.infradead.org"
	<linux-mediatek@lists.infradead.org>,
	"sre@kernel.org" <sre@kernel.org>,
	"davidgow@google.com" <davidgow@google.com>,
	"skhan@linuxfoundation.org" <skhan@linuxfoundation.org>,
	"matthias.bgg@gmail.com" <matthias.bgg@gmail.com>,
	"dan.j.williams@intel.com" <dan.j.williams@intel.com>,
	"bjorn.andersson@linaro.org" <bjorn.andersson@linaro.org>,
	"linux-arm-kernel@lists.infradead.org"
	<linux-arm-kernel@lists.infradead.org>,
	"support.opensource@diasemi.com" <support.opensource@diasemi.com>,
	"sbkim73@samsung.com" <sbkim73@samsung.com>,
	"patches@opensource.cirrus.com" <patches@opensource.cirrus.com>,
	"rdunlap@infradead.org" <rdunlap@infradead.org>,
	"lgirdwood@gmail.com" <lgirdwood@gmail.com>,
	"talgi@mellanox.com" <talgi@mellanox.com>,
	"Mutanen,  Mikko" <Mikko.Mutanen@fi.rohmeurope.com>,
	"robh+dt@kernel.org" <robh+dt@kernel.org>,
	"uwe@kleine-koenig.org" <uwe@kleine-koenig.org>,
	"mhiramat@kernel.org" <mhiramat@kernel.org>,
	"gregkh@linuxfoundation.org" <gregkh@linuxfoundation.org>,
	"akpm@linux-foundation.org" <akpm@linux-foundation.org>,
	"olteanv@gmail.com" <olteanv@gmail.com>,
	"davem@davemloft.net" <davem@davemloft.net>,
	"mazziesaccount@gmail.com" <mazziesaccount@gmail.com>
Subject: Re: [SPF Softfail] Re: [PATCH v7 03/10] lib: add linear ranges helpers
Date: Wed, 1 Apr 2020 10:09:46 +0000	[thread overview]
Message-ID: <4e75e0fcc9782220798c90eee5e41788fe277cc1.camel@fi.rohmeurope.com> (raw)
In-Reply-To: <20200331140523.GJ1922688@smile.fi.intel.com>

Hello Andy,

Thanks for the review again. I'll send v8 later this week :) 

On Tue, 2020-03-31 at 17:05 +0300, Andy Shevchenko wrote:
> On Tue, Mar 31, 2020 at 03:23:03PM +0300, Matti Vaittinen wrote:
> > Many devices have control registers which control some measurable
> > property. Often a register contains control field so that change in
> > this field causes linear change in the controlled property. It is
> > not
> > a rare case that user wants to give 'meaningful' control values and
> > driver needs to convert them to register field values. Even more
> > often user wants to 'see' the currently set value - again in
> > meaningful units - and driver needs to convert the values it reads
> > from register to these meaningful units. Examples of this include:
> > 
> > - regulators, voltage/current configurations
> > - power, voltage/current configurations
> > - clk(?) NCOs
> > 
> > and maybe others I can't think of right now.
> > 
> > Provide a linear_range helper which can do conversion from user
> > value
> > to register value 'selector'.
> > 
> > The idea here is stolen from regulator framework and patches
> > refactoring
> > the regulator helpers to use this are following.
> 
> ...
> 
> > +/*
> > + * linear_ranges.c -- helpers to map values in a linear range to
> > range index
> 
> File name inside file can bring an unnecessary churn in the future in
> case we
> would like to rename it (by some reason). So, better to remove.

Agree.

> > + *
> > + * Original idea borrowed from regulator framework
> > + *
> > + * It might be useful if we could support also inversely
> > proportional ranges?
> 
> Looks like remark that should not be here, rather in commit message
> or even in cover letter.

I think this is a good place so that anyone who opens this file will
see what could be done to improve this. No one is looking at the old
commit messages unless they face some problems. And cover letters fade
away even faster - although the cover letter and commit messages may
catch some attention during the patch submissions.

So maybe you would agree with me if I added this also in cover letter
and commit message :)

> 
> > + * Copyright 2020 ROHM Semiconductors
> > + */
> 
> ...
> 
> > +/**
> > + * linear_range_get_value - fetch a value from given range
> > + *
> 
> This blank line is not needed. Can we drop them everywhere?

Yep. We can. I see that is recommended way in Documentation/doc-
guide/kernel-doc.rst. (Although for my eye it looks clearer with the
empty line)

> 
> > + * @r:		pointer to linear range where value is looked
> > from
> > + * @selector:	selector for which the value is searched
> > + * @val:	address where found value is updated
> > + *
> > + * Search given ranges for value which matches given selector.
> > + *
> > + * Return: 0 on success, -EINVAL given selector is not found from
> > any of the
> > + * ranges.
> > + */
> 
> ...
> 
> > +int linear_range_get_selector_low(const struct linear_range *r,
> > +				  unsigned int val, unsigned int
> > *selector,
> > +				  bool *found)
> > +{
> > +	*found = false;
> > +
> > +	if (r->min > val)
> > +		return -EINVAL;
> > +
> > +	if (linear_range_get_max_value(r) >= val)
> > +		*found = true;
> 
> As far as I can see this is a bit different from _high counterpart. 

Yes. Because the logic is different. _low accepts selector for a
closest value which is smaller or equal to given. _high accepts
selector for a closest value which is higher or equal to given. This
mean that both the _high and _low accept also input value which is not
in the range - _low accepts input which is higher than range, _high
accepts input which is lower than the range.

Both functions bail out right away if input is not "acceptable". 

_low if:
+	if (r->min > val)
> > +		return -EINVAL;

_high if:
+	if (linear_range_get_max_value(r) < val)
> > +		return -EINVAL;
> > 

After this check, if the input is within the other end of range, then
we can set found to true.

for _low:
> > +	if (linear_range_get_max_value(r) >= val)
> > +		*found = true;

for _high:
> > +	if (r->min <= val) {
> > +		*found = true;
> > 

And I agree with your later comment - inversing this check for makes
the function cleaner.

> So, if we
> even not found the range we still check r->step. Can we make them
> symmetrical
> (to some extend)?

Yes we can. For _low we can do:

if (linear_range_get_max_value(r) < val) {
	*selector = r->max_sel;
	return 0;
}

if (!r->step)
	*selector = r->max_sel;
else
	*selector = DIV_ROUND_UP(val - r->min, r->step) + r - min_sel;
*found = true;
 
return 0;
 


> 
> > +	if (!r->step)
> 
> Why not positive conditional?

because we really want to test if step is zero. I can write it as
if (r->step == 0) if that is preferred. But we definitely want to chek
if r->step is zero and handle it as exception case. (We want to protect
from division by zero - and in that case all selectors are Ok as range
is constant)


> > +		*selector = r->min_sel;
> > +	else
> > +		*selector = (val - r->min) / r->step + r->min_sel;
> > +	return 0;
> > +}
> 
> ...
> 
> > +int linear_range_get_selector_low_array(const struct linear_range
> > *r,
> > +					int ranges, unsigned int val,
> > +					unsigned int *selector, bool
> > *found)
> > +{
> > +	int i;
> > +	int ret = -EINVAL;
> > +
> > +	for (i = 0; i < ranges; i++) {
> > +		int tmpret;
> > +
> > +		tmpret = linear_range_get_selector_low(&r[i], val,
> > selector,
> > +						       found);
> > +
> > +		if (!tmpret)
> > +			ret = 0;
> > +
> > +		if (*found)
> > +			break;
> > +	}
> > +
> > +	return ret;
> > +}
> 
> Can we refactor this?
> 
> 	int i;
> 	int ret = -EINVAL;
> 
> 	for (i = 0; i < ranges; i++) {
> 		ret = linear_range_get_selector_low(&r[i], val,
> selector, found);
> 		if (*found)
> 			break;
> 	}
> 
> 	return break;
> 
> This will unshadow the error code returned by the loop body.

What is the return break; doing here? I don't understand the syntax.
And we want the logic to be such that we return zero from this function
if _any_ of the calls to linear_range_get_selector_low returned zero.
(Even if further calls would return non-zero value). But we wan't to
keep looking for better (in-range) match if *found is not true.


> Or if ranges is guaranteed to be always positive number, convert this
> to do {} while.

I don't see the benefit :/

> 
> ...
> 
> > +int linear_range_get_selector_high(const struct linear_range *r,
> > +				   unsigned int val, unsigned int
> > *selector,
> > +				   bool *found)
> > +{
> > +	*found = false;
> > +
> > +	if (linear_range_get_max_value(r) < val)
> > +		return -EINVAL;
> > +
> > +	if (r->min <= val) {
> > +		*found = true;
> > +	} else {
> > +		*selector = r->min_sel;
> > +		return 0;
> > +	}
> 
> 	if (r->min > val) {
> 		*selector = r->min_sel;
> 		return 0;
> 	}

I agree. Inversing this condition makes it cleaner.


Best Regards
	Matti
_______________________________________________
Linux-mediatek mailing list
Linux-mediatek@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-mediatek

  reply	other threads:[~2020-04-01 10:10 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-03-31 12:20 [PATCH v7 00/10] Support ROHM BD99954 charger IC Matti Vaittinen
2020-03-31 12:21 ` [PATCH v7 01/10] dt-bindings: battery: add new battery parameters Matti Vaittinen
2020-03-31 12:22 ` [PATCH v7 02/10] dt_bindings: ROHM BD99954 Charger Matti Vaittinen
2020-03-31 12:23 ` [PATCH v7 03/10] lib: add linear ranges helpers Matti Vaittinen
2020-03-31 14:05   ` Andy Shevchenko
2020-04-01 10:09     ` Vaittinen, Matti [this message]
2020-04-01 12:39       ` [SPF Softfail] " Andy Shevchenko
2020-04-01 13:18         ` Vaittinen, Matti
2020-04-01 14:42           ` Andy Shevchenko
2020-04-02  4:03             ` Vaittinen, Matti
2020-03-31 12:23 ` [PATCH v7 04/10] lib/test_linear_ranges: add a test for the 'linear_ranges' Matti Vaittinen
2020-03-31 18:08   ` Brendan Higgins
2020-04-01  8:45     ` Vaittinen, Matti
2020-04-01 18:48       ` Brendan Higgins
2020-04-02 15:39         ` Vaittinen, Matti
2020-03-31 12:24 ` [PATCH v7 05/10] power: supply: bd70528: rename linear_range to avoid collision Matti Vaittinen
2020-03-31 12:24 ` [PATCH v7 00/10] Support ROHM BD99954 charger IC Ard Biesheuvel
2020-03-31 14:02   ` Vaittinen, Matti
2020-03-31 14:21     ` andriy.shevchenko
2020-03-31 12:25 ` [PATCH v7 06/10] regulator: use linear_ranges helper Matti Vaittinen
2020-04-01 10:17   ` Mark Brown
2020-03-31 12:26 ` [PATCH v7 07/10] power: supply: bd70528: use linear ranges Matti Vaittinen
2020-03-31 12:26 ` [PATCH v7 08/10] power: supply: add battery parameters Matti Vaittinen
2020-03-31 12:28 ` [PATCH v7 09/10] power: supply: Support ROHM bd99954 charger Matti Vaittinen
2020-03-31 14:19   ` Andy Shevchenko
2020-04-01  8:08     ` Vaittinen, Matti
2020-03-31 12:29 ` [PATCH v7 10/10] power: supply: Fix Kconfig help text indentiation Matti Vaittinen

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=4e75e0fcc9782220798c90eee5e41788fe277cc1.camel@fi.rohmeurope.com \
    --to=matti.vaittinen@fi.rohmeurope.com \
    --cc=Markus.Laine@fi.rohmeurope.com \
    --cc=Mikko.Mutanen@fi.rohmeurope.com \
    --cc=agross@kernel.org \
    --cc=akpm@linux-foundation.org \
    --cc=andrei.stefanescu@microchip.com \
    --cc=andy.shevchenko@gmail.com \
    --cc=arnd@arndb.de \
    --cc=b.zolnierkie@samsung.com \
    --cc=bgolaszewski@baylibre.com \
    --cc=bjorn.andersson@linaro.org \
    --cc=bp@suse.de \
    --cc=brendanhiggins@google.com \
    --cc=broonie@kernel.org \
    --cc=ckeepax@opensource.cirrus.com \
    --cc=dan.j.williams@intel.com \
    --cc=davem@davemloft.net \
    --cc=davidgow@google.com \
    --cc=devicetree@vger.kernel.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=herbert@gondor.apana.org.au \
    --cc=krzk@kernel.org \
    --cc=lgirdwood@gmail.com \
    --cc=linus.walleij@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mediatek@lists.infradead.org \
    --cc=linux-omap@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=linux-samsung-soc@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=matthias.bgg@gmail.com \
    --cc=mazziesaccount@gmail.com \
    --cc=mhiramat@kernel.org \
    --cc=milo.kim@ti.com \
    --cc=olteanv@gmail.com \
    --cc=patches@opensource.cirrus.com \
    --cc=rafael@kernel.org \
    --cc=rdunlap@infradead.org \
    --cc=rf@opensource.cirrus.com \
    --cc=robh+dt@kernel.org \
    --cc=sbkim73@samsung.com \
    --cc=skhan@linuxfoundation.org \
    --cc=sre@kernel.org \
    --cc=support.opensource@diasemi.com \
    --cc=talgi@mellanox.com \
    --cc=tglx@linutronix.de \
    --cc=tony@atomide.com \
    --cc=uwe@kleine-koenig.org \
    --cc=vincenzo.frascino@arm.com \
    --cc=wens@csie.org \
    --cc=yamada.masahiro@socionext.com \
    --cc=zaslonko@linux.ibm.com \
    /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.