@@ -30,6 +30,7 @@
#include <linux/mfd/tps6586x.h>
#define TPS6586X_SUPPLYENE 0x14
+#define SOFT_RST_BIT BIT(0)
#define EXITSLREQ_BIT BIT(1)
#define SLEEP_MODE_BIT BIT(3)
@@ -470,6 +471,19 @@ static int tps6586x_power_off_handler(struct sys_off_data *data)
return tps6586x_set_bits(tps6586x_dev, TPS6586X_SUPPLYENE, SLEEP_MODE_BIT);
}
+static int tps6586x_restart_handler(struct sys_off_data *data)
+{
+ struct device *tps6586x_dev = data->cb_data;
+ int ret;
+
+ /* bring pmic into HARD REBOOT state. this takes at least 10ms. */
+ ret = tps6586x_set_bits(tps6586x_dev, TPS6586X_SUPPLYENE, SOFT_RST_BIT);
+ mdelay(15);
+
+ dev_err(tps6586x_dev, "restart failed: timeout\n");
+ return ret;
+}
+
static void tps6586x_print_version(struct i2c_client *client, int version)
{
const char *name;
@@ -570,6 +584,13 @@ static int tps6586x_i2c_probe(struct i2c_client *client)
dev_err(&client->dev, "register power off handler failed: %d\n", ret);
goto err_add_devs;
}
+
+ ret = devm_register_restart_handler(&client->dev, &tps6586x_restart_handler,
+ &client->dev);
+ if (ret) {
+ dev_err(&client->dev, "register restart handler failed: %d\n", ret);
+ goto err_add_devs;
+ }
}
return 0;