mfd: stpmic1: Attempt system shutdown twice in case PMIC is confused

commit ffdc5c51f8 upstream.

Attempt to shut down again, in case the first attempt failed.
The STPMIC1 might get confused and the first regmap_update_bits()
returns with -ETIMEDOUT / -110 . If that or similar transient
failure occurs, try to shut down again. If the second attempt
fails, there is some bigger problem, report it to user.

Cc: stable@vger.kernel.org
Fixes: 6e9df38f35 ("mfd: stpmic1: Add PMIC poweroff via sys-off handler")
Signed-off-by: Marek Vasut <marex@nabladev.com>
Link: https://patch.msgid.link/20260122111423.62591-1-marex@nabladev.com
Signed-off-by: Lee Jones <lee@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Marek Vasut
2026-05-07 06:11:39 +02:00
committed by Greg Kroah-Hartman
parent 377f5ad257
commit 3c52d09469
+18 -2
View File
@@ -16,6 +16,8 @@
#include <dt-bindings/mfd/st,stpmic1.h>
#define STPMIC1_MAX_RETRIES 2
#define STPMIC1_MAIN_IRQ 0
static const struct regmap_range stpmic1_readable_ranges[] = {
@@ -121,9 +123,23 @@ static const struct regmap_irq_chip stpmic1_regmap_irq_chip = {
static int stpmic1_power_off(struct sys_off_data *data)
{
struct stpmic1 *ddata = data->cb_data;
int ret;
regmap_update_bits(ddata->regmap, MAIN_CR,
SOFTWARE_SWITCH_OFF, SOFTWARE_SWITCH_OFF);
/*
* Attempt to shut down again, in case the first attempt failed.
* The STPMIC1 might get confused and the first regmap_update_bits()
* returns with -ETIMEDOUT / -110 . If that or similar transient
* failure occurs, try to shut down again. If the second attempt
* fails, there is some bigger problem, report it to user.
*/
for (int retries = 0; retries < STPMIC1_MAX_RETRIES; retries++) {
ret = regmap_update_bits(ddata->regmap, MAIN_CR, SOFTWARE_SWITCH_OFF,
SOFTWARE_SWITCH_OFF);
if (!ret)
return NOTIFY_DONE;
}
dev_err(ddata->dev, "Failed to access PMIC I2C bus (%d)\n", ret);
return NOTIFY_DONE;
}