summaryrefslogtreecommitdiffstats
path: root/drivers/input
diff options
context:
space:
mode:
authorDmitry Torokhov <dmitry.torokhov@gmail.com>2019-08-09 02:41:12 +0200
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2019-09-02 18:07:37 +0200
commit18aa4d6b67483b4dac08a537f6c4fc943eea5386 (patch)
treee40cdca7bb2c933f5f0757b6931e187693f84d89 /drivers/input
parentInput: bu21013_ts - use interrupt from I2C client (diff)
downloadlinux-18aa4d6b67483b4dac08a537f6c4fc943eea5386.tar.xz
linux-18aa4d6b67483b4dac08a537f6c4fc943eea5386.zip
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: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Diffstat (limited to 'drivers/input')
-rw-r--r--drivers/input/touchscreen/bu21013_ts.c48
1 files changed, 24 insertions, 24 deletions
diff --git a/drivers/input/touchscreen/bu21013_ts.c b/drivers/input/touchscreen/bu21013_ts.c
index 77ef0275c447..e617847ece65 100644
--- a/drivers/input/touchscreen/bu21013_ts.c
+++ b/drivers/input/touchscreen/bu21013_ts.c
@@ -547,44 +547,44 @@ 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
- disable_irq(client->irq);
+ mb();
+ disable_irq(client->irq);
- regulator_disable(ts->regulator);
+ if (!device_may_wakeup(&client->dev))
+ regulator_disable(ts->regulator);
return 0;
}
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
- enable_irq(client->irq);
+ mb();
+ enable_irq(client->irq);
return 0;
}