diff options
| author | Roger Quadros <rogerq@ti.com> | 2014-05-19 01:49:20 -0400 |
|---|---|---|
| committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2014-05-19 02:25:57 -0400 |
| commit | 7cdcb8d104e6f0ec5d253d29e4849cdb2cf03aed (patch) | |
| tree | f01aa0053843adc022f7569c1d44d42ff65b629b | |
| parent | 0dfc8d41bfa091a61354eea73199a5af0eaae9c0 (diff) | |
Input: pixcir_i2c_ts - implement wakeup from suspend
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>
| -rw-r--r-- | drivers/input/touchscreen/pixcir_i2c_ts.c | 47 |
1 files changed, 43 insertions, 4 deletions
diff --git a/drivers/input/touchscreen/pixcir_i2c_ts.c b/drivers/input/touchscreen/pixcir_i2c_ts.c index f2c0ae18e24a..19c6c0fdc94b 100644 --- a/drivers/input/touchscreen/pixcir_i2c_ts.c +++ b/drivers/input/touchscreen/pixcir_i2c_ts.c | |||
| @@ -264,21 +264,59 @@ static void pixcir_input_close(struct input_dev *dev) | |||
| 264 | static int pixcir_i2c_ts_suspend(struct device *dev) | 264 | static int pixcir_i2c_ts_suspend(struct device *dev) |
| 265 | { | 265 | { |
| 266 | struct i2c_client *client = to_i2c_client(dev); | 266 | struct i2c_client *client = to_i2c_client(dev); |
| 267 | struct pixcir_i2c_ts_data *ts = i2c_get_clientdata(client); | ||
| 268 | struct input_dev *input = ts->input; | ||
| 269 | int ret = 0; | ||
| 270 | |||
| 271 | mutex_lock(&input->mutex); | ||
| 272 | |||
| 273 | if (device_may_wakeup(&client->dev)) { | ||
| 274 | if (!input->users) { | ||
| 275 | ret = pixcir_start(ts); | ||
| 276 | if (ret) { | ||
| 277 | dev_err(dev, "Failed to start\n"); | ||
| 278 | goto unlock; | ||
| 279 | } | ||
| 280 | } | ||
| 267 | 281 | ||
| 268 | if (device_may_wakeup(&client->dev)) | ||
| 269 | enable_irq_wake(client->irq); | 282 | enable_irq_wake(client->irq); |
| 283 | } else if (input->users) { | ||
| 284 | ret = pixcir_stop(ts); | ||
| 285 | } | ||
| 270 | 286 | ||
| 271 | return 0; | 287 | unlock: |
| 288 | mutex_unlock(&input->mutex); | ||
| 289 | |||
| 290 | return ret; | ||
| 272 | } | 291 | } |
| 273 | 292 | ||
| 274 | static int pixcir_i2c_ts_resume(struct device *dev) | 293 | static int pixcir_i2c_ts_resume(struct device *dev) |
| 275 | { | 294 | { |
| 276 | struct i2c_client *client = to_i2c_client(dev); | 295 | struct i2c_client *client = to_i2c_client(dev); |
| 296 | struct pixcir_i2c_ts_data *ts = i2c_get_clientdata(client); | ||
| 297 | struct input_dev *input = ts->input; | ||
| 298 | int ret = 0; | ||
| 299 | |||
| 300 | mutex_lock(&input->mutex); | ||
| 277 | 301 | ||
| 278 | if (device_may_wakeup(&client->dev)) | 302 | if (device_may_wakeup(&client->dev)) { |
| 279 | disable_irq_wake(client->irq); | 303 | disable_irq_wake(client->irq); |
| 280 | 304 | ||
| 281 | return 0; | 305 | if (!input->users) { |
| 306 | ret = pixcir_stop(ts); | ||
| 307 | if (ret) { | ||
| 308 | dev_err(dev, "Failed to stop\n"); | ||
| 309 | goto unlock; | ||
| 310 | } | ||
| 311 | } | ||
| 312 | } else if (input->users) { | ||
| 313 | ret = pixcir_start(ts); | ||
| 314 | } | ||
| 315 | |||
| 316 | unlock: | ||
| 317 | mutex_unlock(&input->mutex); | ||
| 318 | |||
| 319 | return ret; | ||
| 282 | } | 320 | } |
| 283 | #endif | 321 | #endif |
| 284 | 322 | ||
| @@ -366,6 +404,7 @@ static int pixcir_i2c_ts_probe(struct i2c_client *client, | |||
| 366 | if (error) | 404 | if (error) |
| 367 | return error; | 405 | return error; |
| 368 | 406 | ||
| 407 | i2c_set_clientdata(client, tsdata); | ||
| 369 | device_init_wakeup(&client->dev, 1); | 408 | device_init_wakeup(&client->dev, 1); |
| 370 | 409 | ||
| 371 | return 0; | 410 | return 0; |
