diff options
author | Rafael J. Wysocki <rjw@sisk.pl> | 2011-12-22 19:24:25 -0500 |
---|---|---|
committer | Rafael J. Wysocki <rjw@sisk.pl> | 2011-12-25 17:39:50 -0500 |
commit | 9ee27ffbe303ce18e7336115f1d443e9911eba53 (patch) | |
tree | 9ec445eecfeece0ab1ec2e6b6f2ac7478c917373 | |
parent | 40a5f8be2f482783de0f1f0fe856660e489734a8 (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>
-rw-r--r-- | drivers/input/touchscreen/st1232.c | 13 |
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 | ||
51 | static int st1232_ts_read_data(struct st1232_ts_data *ts) | 53 | static 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); |