aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input
diff options
context:
space:
mode:
authorRafael J. Wysocki <rjw@sisk.pl>2011-12-22 19:24:25 -0500
committerRafael J. Wysocki <rjw@sisk.pl>2011-12-25 17:39:50 -0500
commit9ee27ffbe303ce18e7336115f1d443e9911eba53 (patch)
tree9ec445eecfeece0ab1ec2e6b6f2ac7478c917373 /drivers/input
parent40a5f8be2f482783de0f1f0fe856660e489734a8 (diff)
PM / input / touchscreen: Make st1232 use device PM QoS constraints
Make the st1232 driver use dev_pm_qos_add_ancestor_request() to add a device PM QoS latency constraint for the controller it depends on, so that the controller won't go into an overly deep low-power state when the touchscreen has to be particularly responsive (e.g. when the user moves his or her finger on it). This change is based on a prototype patch from Guennadi Liakhovetski. Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Diffstat (limited to 'drivers/input')
-rw-r--r--drivers/input/touchscreen/st1232.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/drivers/input/touchscreen/st1232.c b/drivers/input/touchscreen/st1232.c
index 4ab371358b33..8825fe37d433 100644
--- a/drivers/input/touchscreen/st1232.c
+++ b/drivers/input/touchscreen/st1232.c
@@ -23,6 +23,7 @@
23#include <linux/input.h> 23#include <linux/input.h>
24#include <linux/interrupt.h> 24#include <linux/interrupt.h>
25#include <linux/module.h> 25#include <linux/module.h>
26#include <linux/pm_qos.h>
26#include <linux/slab.h> 27#include <linux/slab.h>
27#include <linux/types.h> 28#include <linux/types.h>
28 29
@@ -46,6 +47,7 @@ struct st1232_ts_data {
46 struct i2c_client *client; 47 struct i2c_client *client;
47 struct input_dev *input_dev; 48 struct input_dev *input_dev;
48 struct st1232_ts_finger finger[MAX_FINGERS]; 49 struct st1232_ts_finger finger[MAX_FINGERS];
50 struct dev_pm_qos_request low_latency_req;
49}; 51};
50 52
51static int st1232_ts_read_data(struct st1232_ts_data *ts) 53static int st1232_ts_read_data(struct st1232_ts_data *ts)
@@ -118,8 +120,17 @@ static irqreturn_t st1232_ts_irq_handler(int irq, void *dev_id)
118 } 120 }
119 121
120 /* SYN_MT_REPORT only if no contact */ 122 /* SYN_MT_REPORT only if no contact */
121 if (!count) 123 if (!count) {
122 input_mt_sync(input_dev); 124 input_mt_sync(input_dev);
125 if (ts->low_latency_req.dev) {
126 dev_pm_qos_remove_request(&ts->low_latency_req);
127 ts->low_latency_req.dev = NULL;
128 }
129 } else if (!ts->low_latency_req.dev) {
130 /* First contact, request 100 us latency. */
131 dev_pm_qos_add_ancestor_request(&ts->client->dev,
132 &ts->low_latency_req, 100);
133 }
123 134
124 /* SYN_REPORT */ 135 /* SYN_REPORT */
125 input_sync(input_dev); 136 input_sync(input_dev);