lkml.org 
[lkml]   [2022]   [Aug]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFT PATCH v2 1/2] regulator: core: Require regulator drivers to check uV for get_optimum_mode()
    Date
    The get_optimum_mode() for regulator drivers is passed the input
    voltage and output voltage as well as the current. This is because, in
    theory, the optimum mode can depend on all three things.

    It turns out that for all regulator drivers in mainline only the
    current is looked at when implementing get_optimum_mode(). None of the
    drivers take the input or output voltage into account. Despite the
    fact that none of the drivers take the input or output voltage into
    account, though, the regulator framework will error out before calling
    into get_optimum_mode() if it doesn't know the input or output
    voltage.

    The above behavior turned out to be a probelm for some boards when we
    landed commit efb0cb50c427 ("regulator: qcom-rpmh: Implement
    get_optimum_mode(), not set_load()"). Before that change we'd have no
    problems running drms_uA_update() for RPMH regulators even if a
    regulator's input or output voltage was unknown. After that change
    drms_uA_update() started to fail. This is because typically boards
    using RPMH regulators don't model the input supplies of RPMH
    regulators. Input supplies for RPMH regulators nearly always come from
    the output of other RPMH regulators (or always-on regulators) and RPMH
    firmware is initialized with this knowledge and handles enabling (and
    adjusting the voltage of) input supplies. While we could model the
    parent/child relationship of the regulators in Linux, many boards
    don't bother since it adds extra overhead.

    Let's change the regulator core to make things work again. Now if we
    fail to get the input or output voltage we'll still call into
    get_optimum_mode() and we'll just pass error codes in for input_uV
    and/or output_uV parameters.

    Since no existing regulator drivers even look at input_uV and
    output_uV we don't need to add this error handling anywhere right
    now. We'll add some comments in the core so that it's obvious that (if
    regulator drivers care) it's up to them to add the checks.

    Reported-by: Andrew Halaney <ahalaney@redhat.com>
    Fixes: efb0cb50c427 ("regulator: qcom-rpmh: Implement get_optimum_mode(), not set_load()")
    Signed-off-by: Douglas Anderson <dianders@chromium.org>
    ---

    (no changes since v1)

    drivers/regulator/core.c | 22 ++++++++++++++--------
    1 file changed, 14 insertions(+), 8 deletions(-)

    diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
    index 5b5da14976c2..0bc4b9b0a885 100644
    --- a/drivers/regulator/core.c
    +++ b/drivers/regulator/core.c
    @@ -979,10 +979,13 @@ static int drms_uA_update(struct regulator_dev *rdev)
    } else {
    /* get output voltage */
    output_uV = regulator_get_voltage_rdev(rdev);
    - if (output_uV <= 0) {
    - rdev_err(rdev, "invalid output voltage found\n");
    - return -EINVAL;
    - }
    +
    + /*
    + * Don't return an error; if regulator driver cares about
    + * output_uV then it's up to the driver to validate.
    + */
    + if (output_uV <= 0)
    + rdev_dbg(rdev, "invalid output voltage found\n");

    /* get input voltage */
    input_uV = 0;
    @@ -990,10 +993,13 @@ static int drms_uA_update(struct regulator_dev *rdev)
    input_uV = regulator_get_voltage(rdev->supply);
    if (input_uV <= 0)
    input_uV = rdev->constraints->input_uV;
    - if (input_uV <= 0) {
    - rdev_err(rdev, "invalid input voltage found\n");
    - return -EINVAL;
    - }
    +
    + /*
    + * Don't return an error; if regulator driver cares about
    + * input_uV then it's up to the driver to validate.
    + */
    + if (input_uV <= 0)
    + rdev_dbg(rdev, "invalid input voltage found\n");

    /* now get the optimum mode for our new total regulator load */
    mode = rdev->desc->ops->get_optimum_mode(rdev, input_uV,
    --
    2.37.2.672.g94769d06f0-goog
    \
     
     \ /
      Last update: 2022-08-24 23:24    [W:3.256 / U:0.080 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site