Skip to content

Commit 510f276

Browse files
benjamin-bara-skidatalag-linaro
authored andcommitted
mfd: tps6586x: Register restart handler
There are a couple of boards which use a tps6586x as "ti,system-power-controller", e.g. the tegra20-tamonten.dtsi. For these, the only registered restart handler is the warm reboot via tegra's PMC. As the bootloader of the tegra20 requires the VDE, it must be ensured that VDE is enabled (which is the case after a cold reboot). For the "normal reboot", this is basically the case since 8f0c714. However, this workaround is not executed in case of an emergency restart. In case of an emergency restart, the system now simply hangs in the bootloader, as VDE is not enabled (because it is not used). The TPS658629-Q1 provides a SOFT RST bit in the SUPPLYENE reg to request a (cold) reboot, which takes at least 20ms (as the data sheet states). This avoids the hang-up. Tested on a TPS658640. Reviewed-by: Dmitry Osipenko <dmitry.osipenko@collabora.com> Signed-off-by: Benjamin Bara <benjamin.bara@skidata.com> Link: https://lore.kernel.org/r/20230327-tegra-pmic-reboot-v7-5-18699d5dcd76@skidata.com Signed-off-by: Lee Jones <lee@kernel.org>
1 parent 8bd141b commit 510f276

1 file changed

Lines changed: 21 additions & 0 deletions

File tree

drivers/mfd/tps6586x.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#include <linux/mfd/tps6586x.h>
3131

3232
#define TPS6586X_SUPPLYENE 0x14
33+
#define SOFT_RST_BIT BIT(0)
3334
#define EXITSLREQ_BIT BIT(1)
3435
#define SLEEP_MODE_BIT BIT(3)
3536

@@ -475,6 +476,19 @@ static int tps6586x_power_off_handler(struct sys_off_data *data)
475476
return notifier_from_errno(-ETIME);
476477
}
477478

479+
static int tps6586x_restart_handler(struct sys_off_data *data)
480+
{
481+
int ret;
482+
483+
/* Put the PMIC into hard reboot state. This takes at least 20ms. */
484+
ret = tps6586x_set_bits(data->dev, TPS6586X_SUPPLYENE, SOFT_RST_BIT);
485+
if (ret)
486+
return notifier_from_errno(ret);
487+
488+
mdelay(50);
489+
return notifier_from_errno(-ETIME);
490+
}
491+
478492
static void tps6586x_print_version(struct i2c_client *client, int version)
479493
{
480494
const char *name;
@@ -575,6 +589,13 @@ static int tps6586x_i2c_probe(struct i2c_client *client)
575589
dev_err(&client->dev, "register power off handler failed: %d\n", ret);
576590
goto err_add_devs;
577591
}
592+
593+
ret = devm_register_restart_handler(&client->dev, &tps6586x_restart_handler,
594+
NULL);
595+
if (ret) {
596+
dev_err(&client->dev, "register restart handler failed: %d\n", ret);
597+
goto err_add_devs;
598+
}
578599
}
579600

580601
return 0;

0 commit comments

Comments
 (0)