* [PATCH] regulator: mt6358: use regmap helper to read fixed LDO calibration
@ 2026-07-18 1:05 Daniel Golle
2026-07-20 7:56 ` Chen-Yu Tsai
0 siblings, 1 reply; 2+ messages in thread
From: Daniel Golle @ 2026-07-18 1:05 UTC (permalink / raw)
To: Liam Girdwood, Mark Brown, Matthias Brugger,
AngeloGioacchino Del Regno, Chen-Yu Tsai, Lee Jones, linux-kernel,
linux-arm-kernel, linux-mediatek
The "fixed" LDOs with output voltage calibration use
mt6358_get_buck_voltage_sel as their get_voltage_sel op, but the
MT6358_REG_FIXED and MT6366_REG_FIXED entries do not populate
da_vsel_reg/da_vsel_mask. The op therefore reads register 0x0 with a
zero mask and shifts the result by ffs(0) - 1 = -1, which is undefined
behaviour and gets flagged by UBSAN on every boot on MT6366 boards:
UBSAN: shift-out-of-bounds in drivers/regulator/mt6358-regulator.c:384:38
shift exponent -1 is negative
Call trace:
mt6358_get_buck_voltage_sel+0xc8/0x120
regulator_get_voltage_rdev+0x70/0x170
set_machine_constraints+0x504/0xc38
regulator_register+0x324/0xc68
Besides the undefined shift, the returned selector is always 0, so the
actual calibration offset programmed in <reg>_ANA_CON0 is never
reported.
The descriptor already carries the correct vsel_reg/vsel_mask (the
ANA_CON0 calibration field), matching the regulator_set_voltage_sel_regmap
op already in use. Read the selector back through
regulator_get_voltage_sel_regmap instead.
Fixes: cf08fa74c716 ("regulator: mt6358: Add output voltage fine tuning to fixed regulators")
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
---
drivers/regulator/mt6358-regulator.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/regulator/mt6358-regulator.c b/drivers/regulator/mt6358-regulator.c
index f2bb3c1523ca..d6a0ec406b07 100644
--- a/drivers/regulator/mt6358-regulator.c
+++ b/drivers/regulator/mt6358-regulator.c
@@ -492,7 +492,7 @@ static const struct regulator_ops mt6358_volt_fixed_ops = {
.list_voltage = regulator_list_voltage_linear,
.map_voltage = regulator_map_voltage_linear,
.set_voltage_sel = regulator_set_voltage_sel_regmap,
- .get_voltage_sel = mt6358_get_buck_voltage_sel,
+ .get_voltage_sel = regulator_get_voltage_sel_regmap,
.set_voltage_time_sel = regulator_set_voltage_time_sel,
.enable = regulator_enable_regmap,
.disable = regulator_disable_regmap,
--
2.55.0
^ permalink raw reply related [flat|nested] 2+ messages in thread* Re: [PATCH] regulator: mt6358: use regmap helper to read fixed LDO calibration
2026-07-18 1:05 [PATCH] regulator: mt6358: use regmap helper to read fixed LDO calibration Daniel Golle
@ 2026-07-20 7:56 ` Chen-Yu Tsai
0 siblings, 0 replies; 2+ messages in thread
From: Chen-Yu Tsai @ 2026-07-20 7:56 UTC (permalink / raw)
To: Daniel Golle
Cc: Liam Girdwood, Mark Brown, Matthias Brugger,
AngeloGioacchino Del Regno, Lee Jones, linux-kernel,
linux-arm-kernel, linux-mediatek
On Sat, Jul 18, 2026 at 9:06 AM Daniel Golle <daniel@makrotopia.org> wrote:
>
> The "fixed" LDOs with output voltage calibration use
> mt6358_get_buck_voltage_sel as their get_voltage_sel op, but the
> MT6358_REG_FIXED and MT6366_REG_FIXED entries do not populate
> da_vsel_reg/da_vsel_mask. The op therefore reads register 0x0 with a
> zero mask and shifts the result by ffs(0) - 1 = -1, which is undefined
> behaviour and gets flagged by UBSAN on every boot on MT6366 boards:
>
> UBSAN: shift-out-of-bounds in drivers/regulator/mt6358-regulator.c:384:38
> shift exponent -1 is negative
> Call trace:
> mt6358_get_buck_voltage_sel+0xc8/0x120
> regulator_get_voltage_rdev+0x70/0x170
> set_machine_constraints+0x504/0xc38
> regulator_register+0x324/0xc68
>
> Besides the undefined shift, the returned selector is always 0, so the
> actual calibration offset programmed in <reg>_ANA_CON0 is never
> reported.
>
> The descriptor already carries the correct vsel_reg/vsel_mask (the
> ANA_CON0 calibration field), matching the regulator_set_voltage_sel_regmap
> op already in use. Read the selector back through
> regulator_get_voltage_sel_regmap instead.
>
> Fixes: cf08fa74c716 ("regulator: mt6358: Add output voltage fine tuning to fixed regulators")
> Signed-off-by: Daniel Golle <daniel@makrotopia.org>
Reviewed-by: Chen-Yu Tsai <wens@kernel.org>
Tested-by: Chen-Yu Tsai <wens@kernel.org>
I guess I wasn't looking hard enough when I did the original patch.
I can confirm that after this patch, the fixed LDOs like vxo22 on
Juniper reads out as 2.24V instead of 2.2V (and then gets corrected
down to 2.2V by the kernel).
> ---
> drivers/regulator/mt6358-regulator.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/regulator/mt6358-regulator.c b/drivers/regulator/mt6358-regulator.c
> index f2bb3c1523ca..d6a0ec406b07 100644
> --- a/drivers/regulator/mt6358-regulator.c
> +++ b/drivers/regulator/mt6358-regulator.c
> @@ -492,7 +492,7 @@ static const struct regulator_ops mt6358_volt_fixed_ops = {
> .list_voltage = regulator_list_voltage_linear,
> .map_voltage = regulator_map_voltage_linear,
> .set_voltage_sel = regulator_set_voltage_sel_regmap,
> - .get_voltage_sel = mt6358_get_buck_voltage_sel,
> + .get_voltage_sel = regulator_get_voltage_sel_regmap,
> .set_voltage_time_sel = regulator_set_voltage_time_sel,
> .enable = regulator_enable_regmap,
> .disable = regulator_disable_regmap,
> --
> 2.55.0
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-07-20 7:56 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-18 1:05 [PATCH] regulator: mt6358: use regmap helper to read fixed LDO calibration Daniel Golle
2026-07-20 7:56 ` Chen-Yu Tsai
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox