Input: pixcir_i2c_ts - implement wakeup from suspend
authorRoger Quadros <rogerq@ti.com>
Mon, 19 May 2014 05:49:20 +0000 (22:49 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Mon, 19 May 2014 06:25:57 +0000 (23:25 -0700)
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>
drivers/input/touchscreen/pixcir_i2c_ts.c

index f2c0ae1..19c6c0f 100644 (file)
@@ -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
 
@@ -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;