Re: [PATCH v3] regulator: dt-bindings: qcom,rpmh: Indicate regulator-allow-set-load dependencies

From: Andrew Halaney
Date: Thu Sep 08 2022 - 10:53:44 EST


Gah, ignore all the below. I drafted something up, went to something
else, reviewed and sent to realize this was addressed already by others.

Thanks,
Andrew

On Thu, Sep 08, 2022 at 09:50:38AM -0500, Andrew Halaney wrote:
> On Thu, Sep 08, 2022 at 12:25:25PM +0200, Krzysztof Kozlowski wrote:
> > On 07/09/2022 22:49, Andrew Halaney wrote:
> > > For RPMH regulators it doesn't make sense to indicate
> > > regulator-allow-set-load without saying what modes you can switch to,
> > > so be sure to indicate a dependency on regulator-allowed-modes.
> > >
> > > In general this is true for any regulators that are setting modes
> > > instead of setting a load directly, for example RPMH regulators. A
> > > counter example would be RPM based regulators, which set a load
> > > change directly instead of a mode change. In the RPM case
> > > regulator-allow-set-load alone is sufficient to describe the regulator
> > > (the regulator can change its output current, here's the new load),
> > > but in the RPMH case what valid operating modes exist must also be
> > > stated to properly describe the regulator (the new load is this, what
> > > is the optimum mode for this regulator with that load, let's change to
> > > that mode now).
> > >
> > > With this in place devicetree validation can catch issues like this:
> > >
> > > /mnt/extrassd/git/linux-next/arch/arm64/boot/dts/qcom/sm8350-hdk.dtb: pm8350-rpmh-regulators: ldo5: 'regulator-allowed-modes' is a dependency of 'regulator-allow-set-load'
> > > From schema: /mnt/extrassd/git/linux-next/Documentation/devicetree/bindings/regulator/qcom,rpmh-regulator.yaml
> > >
> > > Where the RPMH regulator hardware is described as being settable, but
> > > there are no modes described to set it to!
> > >
> > > Suggested-by: Johan Hovold <johan+kernel@xxxxxxxxxx>
> > > Reviewed-by: Johan Hovold <johan+kernel@xxxxxxxxxx>
> > > Reviewed-by: Douglas Anderson <dianders@xxxxxxxxxxxx>
> > > Signed-off-by: Andrew Halaney <ahalaney@xxxxxxxxxx>
> > > ---
> > >
> > > v2: https://lore.kernel.org/linux-arm-msm/20220906201959.69920-1-ahalaney@xxxxxxxxxx/
> > > Changes since v2:
> > > - Updated commit message to explain how this is a property of the
> > > hardware, and why it only applies to certain regulators like RPMH
> > > (Johan + Krzysztof recommendation)
> > > - Added Johan + Douglas' R-B tags
> >
> > You posted before we finished discussion so let me paste it here:
> >
> > The bindings don't express it, but the regulator core explicitly asks
> > for set_mode with set_load callbacks in drms_uA_update(), which depends
> > on REGULATOR_CHANGE_DRMS (toggled with regulator-allow-set-load).
>
> If I follow correctly it isn't asking for both, just either set_mode()
> or set_load():
>
> https://elixir.bootlin.com/linux/v6.0-rc4/source/drivers/regulator/core.c#L961
> copy pasta below
> /*
> * first check to see if we can set modes at all, otherwise just
> * tell the consumer everything is OK.
> */
> if (!regulator_ops_is_valid(rdev, REGULATOR_CHANGE_DRMS)) {
> rdev_dbg(rdev, "DRMS operation not allowed\n");
> return 0;
> }
>
> if (!rdev->desc->ops->get_optimum_mode &&
> !rdev->desc->ops->set_load)
> return 0;
>
> if (!rdev->desc->ops->set_mode &&
> !rdev->desc->ops->set_load)
> return -EINVAL;
>
> I'm interpreting the if statements as:
>
> 1. Can the core set the load (as you highlighted REGULATOR_CHANGE_DRMS is
> toggled by regulator-allow-set-load) for this hardware at all?
>
> 2. Are we able to determine the best mode to switch to, or can we
> just set the load directly? If neither of those the core can't do
> much
>
> 3. Can we set the mode we determined was
> optimum with get_optimum_mode()? If the hardware is settable, and
> the core can determine a new mode but there's no mode set_mode()
> to actually switch that's an error unless we can just call
> set_load() directly with our new current requirement
>
> That's a long winded way of saying I don't think the core asks for
> set_mode && set_load callbacks to be implemented (which is how I
> interpreted your message above).
>
> >
> > drms_uA_update() later calls regulator_mode_constrain() which checks if
> > mode changing is allowed (REGULATOR_CHANGE_MODE).
>
> If set_load() is implemented this is not checked and the load is set
> directly before returning from drms_uA_update().
> https://elixir.bootlin.com/linux/v6.0-rc4/source/drivers/regulator/core.c#L973
>
> >
> > Therefore based on current implementation and meaning of
> > set-load/allowed-modes properties, I would say that this applies to all
> > regulators. I don't think that RPMh is special here.
> >
>
> The above comments are why I don't think it applies to *all* regulators.
> It does apply to any "mode based" regulator hardware though (which I
> attempted to capture in the last paragraph in the commit message), but
> unfortunately I do not know of a way to do the below pseudo check at a
> regulator-wide binding level:
>
> if regulator-allow-set-load && !set_load() && set_mode() && !regulator-allowed-modes:
> complain_about_invalid_devicetree()
>
> Basically, the bindings don't really indicate the ops hardware supports
> so I can't think of a good way to key check the set_mode() and
> !set_load() bits to catch this at a wider level, so I opted to just
> attack the dt-binding at a hardware specific level since I can make
> assumptions about what operations the hardware supports at that level.
>
> So, with this approach I do only plug the hole up for RPMh users, other
> set_mode() users are still at risk. Other than duplicating this to those
> users I can't really think of a generic way to tackle this at the
> regulator.yaml level since I don't see a good way to grab the ops
> supported.
>
> We could maybe add extra bindings to indicate what ops are
> supported, i.e. regulator-set-load and regulator-set-mode, and then have
> (hopefully this is possible in the dt-bindings) some if statements like:
>
> if (regulator-allow-set-load) {
> if (regulator-set-load)
> return 0;
> else if (regulator-set-mode && !regulator-allowed-modes)
> return -EINVAL;
> else
> return -EINVAL;
> }
>
> But I'm not really sure how I feel about making each dt-binding specify
> what ops their hardware supports.
>
> Regardless I think the current patch helps out RPMh users.. but I'm open
> to extending it if we can come up with a good way to do it!
>
> Thanks,
> Andrew
>
> > Best regards,
> > Krzysztof
> >