|
@@ -558,20 +558,33 @@ static int __maybe_unused silead_ts_suspend(struct device *dev)
|
|
|
static int __maybe_unused silead_ts_resume(struct device *dev)
|
|
|
{
|
|
|
struct i2c_client *client = to_i2c_client(dev);
|
|
|
+ bool second_try = false;
|
|
|
int error, status;
|
|
|
|
|
|
silead_ts_set_power(client, SILEAD_POWER_ON);
|
|
|
|
|
|
+ retry:
|
|
|
error = silead_ts_reset(client);
|
|
|
if (error)
|
|
|
return error;
|
|
|
|
|
|
+ if (second_try) {
|
|
|
+ error = silead_ts_load_fw(client);
|
|
|
+ if (error)
|
|
|
+ return error;
|
|
|
+ }
|
|
|
+
|
|
|
error = silead_ts_startup(client);
|
|
|
if (error)
|
|
|
return error;
|
|
|
|
|
|
status = silead_ts_get_status(client);
|
|
|
if (status != SILEAD_STATUS_OK) {
|
|
|
+ if (!second_try) {
|
|
|
+ second_try = true;
|
|
|
+ dev_dbg(dev, "Reloading firmware after unsuccessful resume\n");
|
|
|
+ goto retry;
|
|
|
+ }
|
|
|
dev_err(dev, "Resume error, status: 0x%02x\n", status);
|
|
|
return -ENODEV;
|
|
|
}
|