diff options
author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2012-04-10 03:21:09 -0400 |
---|---|---|
committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2012-04-10 03:42:15 -0400 |
commit | d568778298f58330bcc8cc23845676d1143c8d33 (patch) | |
tree | 962ea1b760596b54a88e0604855c548a23d6bd05 /drivers/input | |
parent | 98a84131926ebafe868c65631b69d4912922211e (diff) |
Input: wacom_i2c - do not use irq_to_gpio
Because irq_to_gpio() is not available on many platforms let's switch
to level-triggered one-shot IRQs that will stay active as long as
there is data to be read.
Tested-by: Tobita Tatsunosuke <tobita.tatsunosuke@wacom.co.jp>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Diffstat (limited to 'drivers/input')
-rw-r--r-- | drivers/input/touchscreen/wacom_i2c.c | 41 |
1 files changed, 4 insertions, 37 deletions
diff --git a/drivers/input/touchscreen/wacom_i2c.c b/drivers/input/touchscreen/wacom_i2c.c index b8ca4a6bc91a..35572575d34a 100644 --- a/drivers/input/touchscreen/wacom_i2c.c +++ b/drivers/input/touchscreen/wacom_i2c.c | |||
@@ -39,7 +39,6 @@ struct wacom_features { | |||
39 | struct wacom_i2c { | 39 | struct wacom_i2c { |
40 | struct i2c_client *client; | 40 | struct i2c_client *client; |
41 | struct input_dev *input; | 41 | struct input_dev *input; |
42 | unsigned int gpio; | ||
43 | u8 data[WACOM_QUERY_SIZE]; | 42 | u8 data[WACOM_QUERY_SIZE]; |
44 | }; | 43 | }; |
45 | 44 | ||
@@ -91,23 +90,6 @@ static int wacom_query_device(struct i2c_client *client, | |||
91 | return 0; | 90 | return 0; |
92 | } | 91 | } |
93 | 92 | ||
94 | static int wacom_i2c_fetch_data(struct wacom_i2c *wac_i2c) | ||
95 | { | ||
96 | int retries = 0; | ||
97 | int ret; | ||
98 | |||
99 | do { | ||
100 | ret = i2c_master_recv(wac_i2c->client, | ||
101 | wac_i2c->data, sizeof(wac_i2c->data)); | ||
102 | } while (gpio_get_value(wac_i2c->gpio) == 0 && | ||
103 | retries++ < WACOM_RETRY_CNT); | ||
104 | |||
105 | if (retries >= WACOM_RETRY_CNT) | ||
106 | ret = -EIO; | ||
107 | |||
108 | return ret < 0 ? ret : 0; | ||
109 | } | ||
110 | |||
111 | static irqreturn_t wacom_i2c_irq(int irq, void *dev_id) | 93 | static irqreturn_t wacom_i2c_irq(int irq, void *dev_id) |
112 | { | 94 | { |
113 | struct wacom_i2c *wac_i2c = dev_id; | 95 | struct wacom_i2c *wac_i2c = dev_id; |
@@ -117,8 +99,9 @@ static irqreturn_t wacom_i2c_irq(int irq, void *dev_id) | |||
117 | unsigned char tsw, f1, f2, ers; | 99 | unsigned char tsw, f1, f2, ers; |
118 | int error; | 100 | int error; |
119 | 101 | ||
120 | error = wacom_i2c_fetch_data(wac_i2c); | 102 | error = i2c_master_recv(wac_i2c->client, |
121 | if (error) | 103 | wac_i2c->data, sizeof(wac_i2c->data)); |
104 | if (error < 0) | ||
122 | goto out; | 105 | goto out; |
123 | 106 | ||
124 | tsw = data[3] & 0x01; | 107 | tsw = data[3] & 0x01; |
@@ -147,12 +130,6 @@ static int wacom_i2c_open(struct input_dev *dev) | |||
147 | { | 130 | { |
148 | struct wacom_i2c *wac_i2c = input_get_drvdata(dev); | 131 | struct wacom_i2c *wac_i2c = input_get_drvdata(dev); |
149 | struct i2c_client *client = wac_i2c->client; | 132 | struct i2c_client *client = wac_i2c->client; |
150 | int error; | ||
151 | |||
152 | /* Clear the device buffer */ | ||
153 | error = wacom_i2c_fetch_data(wac_i2c); | ||
154 | if (error) | ||
155 | return error; | ||
156 | 133 | ||
157 | enable_irq(client->irq); | 134 | enable_irq(client->irq); |
158 | 135 | ||
@@ -173,7 +150,6 @@ static int __devinit wacom_i2c_probe(struct i2c_client *client, | |||
173 | struct wacom_i2c *wac_i2c; | 150 | struct wacom_i2c *wac_i2c; |
174 | struct input_dev *input; | 151 | struct input_dev *input; |
175 | struct wacom_features features; | 152 | struct wacom_features features; |
176 | int gpio; | ||
177 | int error; | 153 | int error; |
178 | 154 | ||
179 | if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { | 155 | if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { |
@@ -181,14 +157,6 @@ static int __devinit wacom_i2c_probe(struct i2c_client *client, | |||
181 | return -EIO; | 157 | return -EIO; |
182 | } | 158 | } |
183 | 159 | ||
184 | gpio = irq_to_gpio(client->irq); | ||
185 | if (gpio < 0) { | ||
186 | error = gpio; | ||
187 | dev_err(&client->dev, | ||
188 | "irq_to_gpio() failed, error: %d\n", error); | ||
189 | return error; | ||
190 | } | ||
191 | |||
192 | error = wacom_query_device(client, &features); | 160 | error = wacom_query_device(client, &features); |
193 | if (error) | 161 | if (error) |
194 | return error; | 162 | return error; |
@@ -202,7 +170,6 @@ static int __devinit wacom_i2c_probe(struct i2c_client *client, | |||
202 | 170 | ||
203 | wac_i2c->client = client; | 171 | wac_i2c->client = client; |
204 | wac_i2c->input = input; | 172 | wac_i2c->input = input; |
205 | wac_i2c->gpio = gpio; | ||
206 | 173 | ||
207 | input->name = "Wacom I2C Digitizer"; | 174 | input->name = "Wacom I2C Digitizer"; |
208 | input->id.bustype = BUS_I2C; | 175 | input->id.bustype = BUS_I2C; |
@@ -228,7 +195,7 @@ static int __devinit wacom_i2c_probe(struct i2c_client *client, | |||
228 | input_set_drvdata(input, wac_i2c); | 195 | input_set_drvdata(input, wac_i2c); |
229 | 196 | ||
230 | error = request_threaded_irq(client->irq, NULL, wacom_i2c_irq, | 197 | error = request_threaded_irq(client->irq, NULL, wacom_i2c_irq, |
231 | IRQF_TRIGGER_FALLING, | 198 | IRQF_TRIGGER_LOW | IRQF_ONESHOT, |
232 | "wacom_i2c", wac_i2c); | 199 | "wacom_i2c", wac_i2c); |
233 | if (error) { | 200 | if (error) { |
234 | dev_err(&client->dev, | 201 | dev_err(&client->dev, |