Skip to content

Commit

Permalink
Input: pixcir_i2c_ts - implement wakeup from suspend
Browse files Browse the repository at this point in the history
Improve the suspend and resume handlers to allow the device
to wakeup the system from suspend.

Signed-off-by: Roger Quadros <rogerq@ti.com>
Acked-by: Mugunthan V N <mugunthanvnm@ti.com>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
  • Loading branch information
Roger Quadros authored and dtor committed May 19, 2014
1 parent 0dfc8d4 commit 7cdcb8d
Showing 1 changed file with 43 additions and 4 deletions.
47 changes: 43 additions & 4 deletions drivers/input/touchscreen/pixcir_i2c_ts.c
Original file line number Diff line number Diff line change
Expand Up @@ -264,21 +264,59 @@ static void pixcir_input_close(struct input_dev *dev)
static int pixcir_i2c_ts_suspend(struct device *dev)
{
struct i2c_client *client = to_i2c_client(dev);
struct pixcir_i2c_ts_data *ts = i2c_get_clientdata(client);
struct input_dev *input = ts->input;
int ret = 0;

mutex_lock(&input->mutex);

if (device_may_wakeup(&client->dev)) {
if (!input->users) {
ret = pixcir_start(ts);
if (ret) {
dev_err(dev, "Failed to start\n");
goto unlock;
}
}

if (device_may_wakeup(&client->dev))
enable_irq_wake(client->irq);
} else if (input->users) {
ret = pixcir_stop(ts);
}

return 0;
unlock:
mutex_unlock(&input->mutex);

return ret;
}

static int pixcir_i2c_ts_resume(struct device *dev)
{
struct i2c_client *client = to_i2c_client(dev);
struct pixcir_i2c_ts_data *ts = i2c_get_clientdata(client);
struct input_dev *input = ts->input;
int ret = 0;

mutex_lock(&input->mutex);

if (device_may_wakeup(&client->dev))
if (device_may_wakeup(&client->dev)) {
disable_irq_wake(client->irq);

return 0;
if (!input->users) {
ret = pixcir_stop(ts);
if (ret) {
dev_err(dev, "Failed to stop\n");
goto unlock;
}
}
} else if (input->users) {
ret = pixcir_start(ts);
}

unlock:
mutex_unlock(&input->mutex);

return ret;
}
#endif

Expand Down Expand Up @@ -366,6 +404,7 @@ static int pixcir_i2c_ts_probe(struct i2c_client *client,
if (error)
return error;

i2c_set_clientdata(client, tsdata);
device_init_wakeup(&client->dev, 1);

return 0;
Expand Down

0 comments on commit 7cdcb8d

Please sign in to comment.