This adds wakeup capability to the I2C bus, and prevents regulator shutdown when activated. Signed-off-by: Loic Poulain <loic.poulain@xxxxxxxxxx> --- drivers/input/rmi4/rmi_i2c.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/drivers/input/rmi4/rmi_i2c.c b/drivers/input/rmi4/rmi_i2c.c index 50305fc..dc70ea0 100644 --- a/drivers/input/rmi4/rmi_i2c.c +++ b/drivers/input/rmi4/rmi_i2c.c @@ -273,6 +273,8 @@ static int rmi_i2c_probe(struct i2c_client *client, dev_info(&client->dev, "registering I2C-connected sensor\n"); + device_init_wakeup(&client->dev, true); + error = rmi_register_transport_device(&rmi_i2c->xport); if (error) { dev_err(&client->dev, "failed to register sensor: %d\n", error); @@ -299,8 +301,10 @@ static int rmi_i2c_suspend(struct device *dev) if (ret) dev_warn(dev, "Failed to resume device: %d\n", ret); - regulator_bulk_disable(ARRAY_SIZE(rmi_i2c->supplies), - rmi_i2c->supplies); + if (!device_may_wakeup(dev)) { + regulator_bulk_disable(ARRAY_SIZE(rmi_i2c->supplies), + rmi_i2c->supplies); + } return ret; } @@ -311,12 +315,14 @@ static int rmi_i2c_resume(struct device *dev) struct rmi_i2c_xport *rmi_i2c = i2c_get_clientdata(client); int ret; - ret = regulator_bulk_enable(ARRAY_SIZE(rmi_i2c->supplies), - rmi_i2c->supplies); - if (ret) - return ret; + if (!device_may_wakeup(dev)) { + ret = regulator_bulk_enable(ARRAY_SIZE(rmi_i2c->supplies), + rmi_i2c->supplies); + if (ret) + return ret; - msleep(rmi_i2c->startup_delay); + msleep(rmi_i2c->startup_delay); + } ret = rmi_driver_resume(rmi_i2c->xport.rmi_dev, true); if (ret) -- 2.7.4