All of lore.kernel.org
 help / color / mirror / Atom feed
From: Lee Jones <lee.jones@linaro.org>
To: Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>
Cc: mazziesaccount@gmail.com, Liam Girdwood <lgirdwood@gmail.com>,
	Mark Brown <broonie@kernel.org>,
	linux-power@fi.rohmeurope.com, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] regulator: bd718x7, bd71828, Fix dvs voltage levels
Date: Fri, 15 Jan 2021 13:47:09 +0000	[thread overview]
Message-ID: <20210115134709.GM3975472@dell> (raw)
In-Reply-To: <20210115131040.GA633776@localhost.localdomain>

On Fri, 15 Jan 2021, Matti Vaittinen wrote:

> The ROHM BD718x7 and BD71828 drivers support setting HW state
> specific voltages from device-tree. This is used also by various
> in-tree DTS files.
> 
> These drivers do incorrectly try to compose bit-map using enum
> values. By a chance this works for first two valid levels having
> values 1 and 2 - but setting values for the rest of the levels
> do indicate capbility of setting values for first levels as
> well. Luckily the regulators which support settin values for
> SUSPEND/LPSR do usually also support setting values for RUN
> and IDLE too - thus this has not been such a fatal issue.
> 
> Fix this by defining the old enum values as bits and using
> new enum in parsing code. This allows keeping existing IC
> specific drivers intact and only adding the defines and
> slightly changing the rohm-regulator.c
> 
> Fixes: 21b72156ede8b ("regulator: bd718x7: Split driver to common and bd718x7 specific parts")
> Signed-off-by: Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>
> ---
>  drivers/regulator/rohm-regulator.c |  8 ++++----
>  include/linux/mfd/rohm-generic.h   | 22 ++++++++++++++++------
>  2 files changed, 20 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/regulator/rohm-regulator.c b/drivers/regulator/rohm-regulator.c
> index 399002383b28..96caae7dbef4 100644
> --- a/drivers/regulator/rohm-regulator.c
> +++ b/drivers/regulator/rohm-regulator.c
> @@ -55,25 +55,25 @@ int rohm_regulator_set_dvs_levels(const struct rohm_dvs_config *dvs,
>  	for (i = 0; i < ROHM_DVS_LEVEL_MAX && !ret; i++) {
>  		if (dvs->level_map & (1 << i)) {
>  			switch (i + 1) {
> -			case ROHM_DVS_LEVEL_RUN:
> +			case _ROHM_DVS_LEVEL_RUN:
>  				prop = "rohm,dvs-run-voltage";
>  				reg = dvs->run_reg;
>  				mask = dvs->run_mask;
>  				omask = dvs->run_on_mask;
>  				break;
> -			case ROHM_DVS_LEVEL_IDLE:
> +			case _ROHM_DVS_LEVEL_IDLE:
>  				prop = "rohm,dvs-idle-voltage";
>  				reg = dvs->idle_reg;
>  				mask = dvs->idle_mask;
>  				omask = dvs->idle_on_mask;
>  				break;
> -			case ROHM_DVS_LEVEL_SUSPEND:
> +			case _ROHM_DVS_LEVEL_SUSPEND:
>  				prop = "rohm,dvs-suspend-voltage";
>  				reg = dvs->suspend_reg;
>  				mask = dvs->suspend_mask;
>  				omask = dvs->suspend_on_mask;
>  				break;
> -			case ROHM_DVS_LEVEL_LPSR:
> +			case _ROHM_DVS_LEVEL_LPSR:
>  				prop = "rohm,dvs-lpsr-voltage";
>  				reg = dvs->lpsr_reg;
>  				mask = dvs->lpsr_mask;
> diff --git a/include/linux/mfd/rohm-generic.h b/include/linux/mfd/rohm-generic.h
> index 4283b5b33e04..a557988831d7 100644
> --- a/include/linux/mfd/rohm-generic.h
> +++ b/include/linux/mfd/rohm-generic.h
> @@ -20,15 +20,25 @@ struct rohm_regmap_dev {
>  	struct regmap *regmap;
>  };
>  
> +/*
> + * Do not use these in IC specific driver - the bit map should be created using
> + * defines without the underscore. These should be used only in rohm-regulator.c
> + */
>  enum {
> -	ROHM_DVS_LEVEL_UNKNOWN,
> -	ROHM_DVS_LEVEL_RUN,
> -	ROHM_DVS_LEVEL_IDLE,
> -	ROHM_DVS_LEVEL_SUSPEND,
> -	ROHM_DVS_LEVEL_LPSR,
> -	ROHM_DVS_LEVEL_MAX = ROHM_DVS_LEVEL_LPSR,
> +	_ROHM_DVS_LEVEL_UNKNOWN,
> +	_ROHM_DVS_LEVEL_RUN,
> +	_ROHM_DVS_LEVEL_IDLE,
> +	_ROHM_DVS_LEVEL_SUSPEND,
> +	_ROHM_DVS_LEVEL_LPSR,
> +	ROHM_DVS_LEVEL_MAX = _ROHM_DVS_LEVEL_LPSR,

I don't understand how this is still not broken.

I think you either need to change the for() loop that consumes this to
use "<=" or push the MAX enum to the last line (on its own).

The latter would be my personal preference.

>  };
>  
> +#define ROHM_DVS_LEVEL_UNKNOWN	(1 << _ROHM_DVS_LEVEL_UNKNOWN)
> +#define ROHM_DVS_LEVEL_RUN	(1 << _ROHM_DVS_LEVEL_RUN)
> +#define ROHM_DVS_LEVEL_IDLE	(1 << _ROHM_DVS_LEVEL_IDLE)
> +#define ROHM_DVS_LEVEL_SUSPEND	(1 << _ROHM_DVS_LEVEL_SUSPEND)
> +#define ROHM_DVS_LEVEL_LPSR	(1 << _ROHM_DVS_LEVEL_LPSR)
> +
>  /**
>   * struct rohm_dvs_config - dynamic voltage scaling register descriptions
>   *
> 
> base-commit: 7c53f6b671f4aba70ff15e1b05148b10d58c2837

-- 
Lee Jones [李琼斯]
Senior Technical Lead - Developer Services
Linaro.org │ Open source software for Arm SoCs
Follow Linaro: Facebook | Twitter | Blog

  reply	other threads:[~2021-01-15 13:48 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-01-15 13:10 [PATCH] regulator: bd718x7, bd71828, Fix dvs voltage levels Matti Vaittinen
2021-01-15 13:47 ` Lee Jones [this message]
2021-01-15 14:10   ` Vaittinen, Matti
  -- strict thread matches above, loose matches on Subject: below --
2021-01-15 14:33 Matti Vaittinen
2021-01-15 14:41 ` Lee Jones
2021-01-15 14:48   ` Vaittinen, Matti

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=20210115134709.GM3975472@dell \
    --to=lee.jones@linaro.org \
    --cc=broonie@kernel.org \
    --cc=lgirdwood@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-power@fi.rohmeurope.com \
    --cc=matti.vaittinen@fi.rohmeurope.com \
    --cc=mazziesaccount@gmail.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.