2021-06-19 20:37:12

by Axel Lin

[permalink] [raw]
Subject: [PATCH] regulator: hi6421v600: Fix setting idle mode

commit db27f8294cd7 changed eco_mode << (ffs(sreg->eco_mode_mask) - 1)
to sreg->eco_mode_mask << (ffs(sreg->eco_mode_mask) - 1) which is wrong.
Fix it by simply set val = sreg->eco_mode_mask.

In additional, sreg->eco_mode_mask can be 0 (LDO3, LDO33, LDO34).
Return -EINVAL if idle mode is not supported when sreg->eco_mode_mask is 0.

While at it, also use unsigned int for reg_val/val which is the expected
type for regmap_read and regmap_update_bits.

Fixes: db27f8294cd7 ("staging: regulator: hi6421v600-regulator: use shorter names for OF properties")
Signed-off-by: Axel Lin <[email protected]>
---
drivers/regulator/hi6421v600-regulator.c | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/drivers/regulator/hi6421v600-regulator.c b/drivers/regulator/hi6421v600-regulator.c
index b5a19938fd3a..9a68ef251de6 100644
--- a/drivers/regulator/hi6421v600-regulator.c
+++ b/drivers/regulator/hi6421v600-regulator.c
@@ -117,7 +117,7 @@ static int hi6421_spmi_regulator_enable(struct regulator_dev *rdev)
static unsigned int hi6421_spmi_regulator_get_mode(struct regulator_dev *rdev)
{
struct hi6421_spmi_reg_info *sreg = rdev_get_drvdata(rdev);
- u32 reg_val;
+ unsigned int reg_val;

regmap_read(rdev->regmap, rdev->desc->enable_reg, &reg_val);

@@ -131,14 +131,17 @@ static int hi6421_spmi_regulator_set_mode(struct regulator_dev *rdev,
unsigned int mode)
{
struct hi6421_spmi_reg_info *sreg = rdev_get_drvdata(rdev);
- u32 val;
+ unsigned int val;

switch (mode) {
case REGULATOR_MODE_NORMAL:
val = 0;
break;
case REGULATOR_MODE_IDLE:
- val = sreg->eco_mode_mask << (ffs(sreg->eco_mode_mask) - 1);
+ if (!sreg->eco_mode_mask)
+ return -EINVAL;
+
+ val = sreg->eco_mode_mask;
break;
default:
return -EINVAL;
--
2.25.1


2021-06-21 18:47:54

by Mark Brown

[permalink] [raw]
Subject: Re: [PATCH] regulator: hi6421v600: Fix setting idle mode

On Sat, 19 Jun 2021 20:34:23 +0800, Axel Lin wrote:
> commit db27f8294cd7 changed eco_mode << (ffs(sreg->eco_mode_mask) - 1)
> to sreg->eco_mode_mask << (ffs(sreg->eco_mode_mask) - 1) which is wrong.
> Fix it by simply set val = sreg->eco_mode_mask.
>
> In additional, sreg->eco_mode_mask can be 0 (LDO3, LDO33, LDO34).
> Return -EINVAL if idle mode is not supported when sreg->eco_mode_mask is 0.
>
> [...]

Applied to

https://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator.git for-next

Thanks!

[1/1] regulator: hi6421v600: Fix setting idle mode
commit: 57c045bc727001c43b6a65adb0418aa7b3e6dbd0

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark