History

Input: eeti_ts: pass gpio value instead of IRQ

The EETI touchscreen asserts its IRQ line as soon as it has data in its internal buffers. The line is automatically deasserted once all data has been read via I2C. Hence, the driver has to monitor the GPIO line and cannot simply rely on the interrupt handler reception. In the current implementation of the driver, irq_to_gpio() is used to determine the GPIO number from the i2c_client's IRQ value. As irq_to_gpio() is not available on all platforms, this patch changes this and makes the driver ignore the passed in IRQ. Instead, a GPIO is added to the platform_data struct and gpio_to_irq is used to derive the IRQ from that GPIO. If this fails, bail out. The driver is only able to work in environments where the touchscreen GPIO can be mapped to an IRQ. Without this patch, building raumfeld_defconfig results in: drivers/input/touchscreen/eeti_ts.c: In function 'eeti_ts_irq_active': drivers/input/touchscreen/eeti_ts.c:65:2: error: implicit declaration of function 'irq_to_gpio' [-Werror=implicit-function-declaration]

Arnd Bergmann committed 14 years ago

Commit 4eef6cb1 parent 59ee93a3 files · +15 −9Browse files

Unified · Split

3 files
  1. arch/arm/mach-pxa/raumfeld.c +1 −1
  2. drivers/input/touchscreen/eeti_ts.c +13 −8
  3. include/linux/input/eeti_ts.h +1 −0
arch/arm/mach-pxa/raumfeld.c+1−1
@@ -953,12 +953,12 @@ static struct i2c_board_info raumfeld_connector_i2c_board_info __initdata = { · 952 unmodified lines
953 953
954static struct eeti_ts_platform_data eeti_ts_pdata = {954static struct eeti_ts_platform_data eeti_ts_pdata = {
955 .irq_active_high = 1,955 .irq_active_high = 1,
956 .irq_gpio = GPIO_TOUCH_IRQ,
956};957};
957 958
958static struct i2c_board_info raumfeld_controller_i2c_board_info __initdata = {959static struct i2c_board_info raumfeld_controller_i2c_board_info __initdata = {
959 .type = "eeti_ts",960 .type = "eeti_ts",
960 .addr = 0x0a,961 .addr = 0x0a,
961 .irq = PXA_GPIO_TO_IRQ(GPIO_TOUCH_IRQ),
962 .platform_data = &eeti_ts_pdata,962 .platform_data = &eeti_ts_pdata,
963};963};
964 964
drivers/input/touchscreen/eeti_ts.c+13−8
@@ -48,7 +48,7 @@ struct eeti_ts_priv { · 47 unmodified lines
48 struct input_dev *input;48 struct input_dev *input;
49 struct work_struct work;49 struct work_struct work;
50 struct mutex mutex;50 struct mutex mutex;
51 int irq, irq_active_high;51 int irq_gpio, irq, irq_active_high;
52};52};
53 53
54#define EETI_TS_BITDEPTH (11)54#define EETI_TS_BITDEPTH (11)
@@ -62,7 +62,7 @@ struct eeti_ts_priv { · 7 unmodified lines
62 62
63static inline int eeti_ts_irq_active(struct eeti_ts_priv *priv)63static inline int eeti_ts_irq_active(struct eeti_ts_priv *priv)
64{64{
65 return gpio_get_value(irq_to_gpio(priv->irq)) == priv->irq_active_high;65 return gpio_get_value(priv->irq_gpio) == priv->irq_active_high;
66}66}
67 67
68static void eeti_ts_read(struct work_struct *work)68static void eeti_ts_read(struct work_struct *work)
@@ -157,7 +157,7 @@ static void eeti_ts_close(struct input_dev *dev) · 88 unmodified lines
157static int __devinit eeti_ts_probe(struct i2c_client *client,157static int __devinit eeti_ts_probe(struct i2c_client *client,
158 const struct i2c_device_id *idp)158 const struct i2c_device_id *idp)
159{159{
160 struct eeti_ts_platform_data *pdata;160 struct eeti_ts_platform_data *pdata = client->dev.platform_data;
161 struct eeti_ts_priv *priv;161 struct eeti_ts_priv *priv;
162 struct input_dev *input;162 struct input_dev *input;
163 unsigned int irq_flags;163 unsigned int irq_flags;
@@ -199,9 +199,12 @@ static int __devinit eeti_ts_probe(struct i2c_client *client, · 35 unmodified lines
199 199
200 priv->client = client;200 priv->client = client;
201 priv->input = input;201 priv->input = input;
202 priv->irq = client->irq;202 priv->irq_gpio = pdata->irq_gpio;
203 priv->irq = gpio_to_irq(pdata->irq_gpio);
203 204
204 pdata = client->dev.platform_data;205 err = gpio_request_one(pdata->irq_gpio, GPIOF_IN, client->name);
206 if (err < 0)
207 goto err1;
205 208
206 if (pdata)209 if (pdata)
207 priv->irq_active_high = pdata->irq_active_high;210 priv->irq_active_high = pdata->irq_active_high;
@@ -215,13 +218,13 @@ static int __devinit eeti_ts_probe(struct i2c_client *client, · 7 unmodified lines
215 218
216 err = input_register_device(input);219 err = input_register_device(input);
217 if (err)220 if (err)
218 goto err1;221 goto err2;
219 222
220 err = request_irq(priv->irq, eeti_ts_isr, irq_flags,223 err = request_irq(priv->irq, eeti_ts_isr, irq_flags,
221 client->name, priv);224 client->name, priv);
222 if (err) {225 if (err) {
223 dev_err(&client->dev, "Unable to request touchscreen IRQ.\n");226 dev_err(&client->dev, "Unable to request touchscreen IRQ.\n");
224 goto err2;227 goto err3;
225 }228 }
226 229
227 /*230 /*
@@ -233,9 +236,11 @@ static int __devinit eeti_ts_probe(struct i2c_client *client, · 5 unmodified lines
233 device_init_wakeup(&client->dev, 0);236 device_init_wakeup(&client->dev, 0);
234 return 0;237 return 0;
235 238
236err2:239err3:
237 input_unregister_device(input);240 input_unregister_device(input);
238 input = NULL; /* so we dont try to free it below */241 input = NULL; /* so we dont try to free it below */
242err2:
243 gpio_free(pdata->irq_gpio);
239err1:244err1:
240 input_free_device(input);245 input_free_device(input);
241 kfree(priv);246 kfree(priv);
include/linux/input/eeti_ts.h+1−0
@@ -2,6 +2,7 @@ · 1 unmodified line
2#define LINUX_INPUT_EETI_TS_H2#define LINUX_INPUT_EETI_TS_H
3 3
4struct eeti_ts_platform_data {4struct eeti_ts_platform_data {
5 int irq_gpio;
5 unsigned int irq_active_high;6 unsigned int irq_active_high;
6};7};
7 8