lkml.org 
[lkml]   [2022]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.16 0842/1039] mfd: tps65910: Set PWR_OFF bit during driver probe
    Date
    From: Dmitry Osipenko <digetx@gmail.com>

    commit 7620ad0bdfac1efff4a1228cd36ae62a9d8206b0 upstream.

    The PWR_OFF bit needs to be set in order to power off properly, without
    hanging PMIC. This bit needs to be set early in order to allow thermal
    protection of NVIDIA Terga SoCs to power off hardware properly, otherwise
    a battery re-plug may be needed on some devices to recover after the hang.

    Cc: <stable@vger.kernel.org>
    Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
    Tested-by: Svyatoslav Ryhel <clamor95@gmail.com> # ASUS TF201
    Signed-off-by: Lee Jones <lee.jones@linaro.org>
    Link: https://lore.kernel.org/r/20211124190104.23554-1-digetx@gmail.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/mfd/tps65910.c | 22 +++++++++++++---------
    1 file changed, 13 insertions(+), 9 deletions(-)

    --- a/drivers/mfd/tps65910.c
    +++ b/drivers/mfd/tps65910.c
    @@ -436,15 +436,6 @@ static void tps65910_power_off(void)

    tps65910 = dev_get_drvdata(&tps65910_i2c_client->dev);

    - /*
    - * The PWR_OFF bit needs to be set separately, before transitioning
    - * to the OFF state. It enables the "sequential" power-off mode on
    - * TPS65911, it's a NO-OP on TPS65910.
    - */
    - if (regmap_set_bits(tps65910->regmap, TPS65910_DEVCTRL,
    - DEVCTRL_PWR_OFF_MASK) < 0)
    - return;
    -
    regmap_update_bits(tps65910->regmap, TPS65910_DEVCTRL,
    DEVCTRL_DEV_OFF_MASK | DEVCTRL_DEV_ON_MASK,
    DEVCTRL_DEV_OFF_MASK);
    @@ -504,6 +495,19 @@ static int tps65910_i2c_probe(struct i2c
    tps65910_sleepinit(tps65910, pmic_plat_data);

    if (pmic_plat_data->pm_off && !pm_power_off) {
    + /*
    + * The PWR_OFF bit needs to be set separately, before
    + * transitioning to the OFF state. It enables the "sequential"
    + * power-off mode on TPS65911, it's a NO-OP on TPS65910.
    + */
    + ret = regmap_set_bits(tps65910->regmap, TPS65910_DEVCTRL,
    + DEVCTRL_PWR_OFF_MASK);
    + if (ret) {
    + dev_err(&i2c->dev, "failed to set power-off mode: %d\n",
    + ret);
    + return ret;
    + }
    +
    tps65910_i2c_client = i2c;
    pm_power_off = tps65910_power_off;
    }

    \
     
     \ /
      Last update: 2022-09-17 16:14    [W:4.023 / U:0.596 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site