Re: [PATCH] regulator: mt6358: use regmap helper to read fixed LDO calibration

Chen-Yu Tsai <[email protected]>
Newsgroups org.infradead.lists.linux-mediatek,org.infradead.lists.linux-arm-kernel,org.kernel.vger.linux-kernel
Message-ID <CAGXv+5GpGfA+hBADn69eNEetP_zR+Xmt3fMhyapK3SsaEa=DFQ@mail.gmail.com>
On Sat, Jul 18, 2026 at 9:06 AM Daniel Golle <[email protected]> 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 <[email protected]>

Reviewed-by: Chen-Yu Tsai <[email protected]>
Tested-by: Chen-Yu Tsai <[email protected]>

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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.