Commit 18aa4d6b authored by Dmitry Torokhov's avatar Dmitry Torokhov

Input: bu21013_ts - fix suspend when wake source

If the touchscreen is configured as wakeup source we should not be cutting
off power to it.

Also, now that the driver relies on I2C client to supply IRQ, we do not
need to explicitly enable and disable IRQ for wakeup: if device is created
as wakeup source, I2C core will mark interrupt as wakeup one.
Tested-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
parent db3e34d4
......@@ -547,15 +547,14 @@ static int bu21013_remove(struct i2c_client *client)
static int __maybe_unused bu21013_suspend(struct device *dev)
{
struct bu21013_ts *ts = dev_get_drvdata(dev);
struct i2c_client *client = ts->client;
struct i2c_client *client = to_i2c_client(dev);
struct bu21013_ts *ts = i2c_get_clientdata(client);
ts->touch_stopped = true;
if (device_may_wakeup(&client->dev))
enable_irq_wake(client->irq);
else
mb();
disable_irq(client->irq);
if (!device_may_wakeup(&client->dev))
regulator_disable(ts->regulator);
return 0;
......@@ -563,27 +562,28 @@ static int __maybe_unused bu21013_suspend(struct device *dev)
static int __maybe_unused bu21013_resume(struct device *dev)
{
struct bu21013_ts *ts = dev_get_drvdata(dev);
struct i2c_client *client = ts->client;
int retval;
struct i2c_client *client = to_i2c_client(dev);
struct bu21013_ts *ts = i2c_get_clientdata(client);
int error;
retval = regulator_enable(ts->regulator);
if (retval < 0) {
dev_err(&client->dev, "bu21013 regulator enable failed\n");
return retval;
if (!device_may_wakeup(&client->dev)) {
error = regulator_enable(ts->regulator);
if (error) {
dev_err(&client->dev,
"failed to re-enable regulator when resuming\n");
return error;
}
retval = bu21013_init_chip(ts);
if (retval < 0) {
dev_err(&client->dev, "bu21013 controller config failed\n");
return retval;
error = bu21013_init_chip(ts);
if (error) {
dev_err(&client->dev,
"failed to reinitialize chip when resuming\n");
return error;
}
}
ts->touch_stopped = false;
if (device_may_wakeup(&client->dev))
disable_irq_wake(client->irq);
else
mb();
enable_irq(client->irq);
return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment