Re: [PATCH] regulator: mt6358: use regmap helper to read fixed LDO calibration
From: Chen-Yu Tsai
Date: Mon Jul 20 2026 - 03:56:53 EST
On Sat, Jul 18, 2026 at 9:06 AM Daniel Golle <daniel@xxxxxxxxxxxxxx> 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@xxxxxxxxxxxxxx>
Reviewed-by: Chen-Yu Tsai <wens@xxxxxxxxxx>
Tested-by: Chen-Yu Tsai <wens@xxxxxxxxxx>
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