diff options
author | Daniel Mack <daniel@caiaq.de> | 2009-08-12 03:50:09 -0400 |
---|---|---|
committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2009-08-12 04:09:50 -0400 |
commit | 25a70e38cd57952b09a013bf070e03705ee4f2ff (patch) | |
tree | c82d3c61ccd60b022dd9df7ded927f4591a85f9e | |
parent | 09113aea553cfaf074fd669cd0465daac4cea6e8 (diff) |
Input: eeti_ts - allow active high irq lines
This adds a struct eeti_ts_platform_data which currently holds only one
value to specify the interrupt polarity.
The driver has a fallback if no platform data is passed in via the
i2c_board_info, so no regression is caused.
Signed-off-by: Daniel Mack <daniel@caiaq.de>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
-rw-r--r-- | drivers/input/touchscreen/eeti_ts.c | 22 | ||||
-rw-r--r-- | include/linux/input/eeti_ts.h | 9 |
2 files changed, 28 insertions, 3 deletions
diff --git a/drivers/input/touchscreen/eeti_ts.c b/drivers/input/touchscreen/eeti_ts.c index 3ab92222a525..9029bd3f34e5 100644 --- a/drivers/input/touchscreen/eeti_ts.c +++ b/drivers/input/touchscreen/eeti_ts.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include <linux/i2c.h> | 32 | #include <linux/i2c.h> |
33 | #include <linux/timer.h> | 33 | #include <linux/timer.h> |
34 | #include <linux/gpio.h> | 34 | #include <linux/gpio.h> |
35 | #include <linux/input/eeti_ts.h> | ||
35 | 36 | ||
36 | static int flip_x; | 37 | static int flip_x; |
37 | module_param(flip_x, bool, 0644); | 38 | module_param(flip_x, bool, 0644); |
@@ -46,7 +47,7 @@ struct eeti_ts_priv { | |||
46 | struct input_dev *input; | 47 | struct input_dev *input; |
47 | struct work_struct work; | 48 | struct work_struct work; |
48 | struct mutex mutex; | 49 | struct mutex mutex; |
49 | int irq; | 50 | int irq, irq_active_high; |
50 | }; | 51 | }; |
51 | 52 | ||
52 | #define EETI_TS_BITDEPTH (11) | 53 | #define EETI_TS_BITDEPTH (11) |
@@ -58,6 +59,11 @@ struct eeti_ts_priv { | |||
58 | #define REPORT_BIT_HAS_PRESSURE (1 << 6) | 59 | #define REPORT_BIT_HAS_PRESSURE (1 << 6) |
59 | #define REPORT_RES_BITS(v) (((v) >> 1) + EETI_TS_BITDEPTH) | 60 | #define REPORT_RES_BITS(v) (((v) >> 1) + EETI_TS_BITDEPTH) |
60 | 61 | ||
62 | static inline int eeti_ts_irq_active(struct eeti_ts_priv *priv) | ||
63 | { | ||
64 | return gpio_get_value(irq_to_gpio(priv->irq)) == priv->irq_active_high; | ||
65 | } | ||
66 | |||
61 | static void eeti_ts_read(struct work_struct *work) | 67 | static void eeti_ts_read(struct work_struct *work) |
62 | { | 68 | { |
63 | char buf[6]; | 69 | char buf[6]; |
@@ -67,7 +73,7 @@ static void eeti_ts_read(struct work_struct *work) | |||
67 | 73 | ||
68 | mutex_lock(&priv->mutex); | 74 | mutex_lock(&priv->mutex); |
69 | 75 | ||
70 | while (!gpio_get_value(irq_to_gpio(priv->irq)) && --to) | 76 | while (eeti_ts_irq_active(priv) && --to) |
71 | i2c_master_recv(priv->client, buf, sizeof(buf)); | 77 | i2c_master_recv(priv->client, buf, sizeof(buf)); |
72 | 78 | ||
73 | if (!to) { | 79 | if (!to) { |
@@ -140,8 +146,10 @@ static void eeti_ts_close(struct input_dev *dev) | |||
140 | static int __devinit eeti_ts_probe(struct i2c_client *client, | 146 | static int __devinit eeti_ts_probe(struct i2c_client *client, |
141 | const struct i2c_device_id *idp) | 147 | const struct i2c_device_id *idp) |
142 | { | 148 | { |
149 | struct eeti_ts_platform_data *pdata; | ||
143 | struct eeti_ts_priv *priv; | 150 | struct eeti_ts_priv *priv; |
144 | struct input_dev *input; | 151 | struct input_dev *input; |
152 | unsigned int irq_flags; | ||
145 | int err = -ENOMEM; | 153 | int err = -ENOMEM; |
146 | 154 | ||
147 | /* In contrast to what's described in the datasheet, there seems | 155 | /* In contrast to what's described in the datasheet, there seems |
@@ -180,6 +188,14 @@ static int __devinit eeti_ts_probe(struct i2c_client *client, | |||
180 | priv->input = input; | 188 | priv->input = input; |
181 | priv->irq = client->irq; | 189 | priv->irq = client->irq; |
182 | 190 | ||
191 | pdata = client->dev.platform_data; | ||
192 | |||
193 | if (pdata) | ||
194 | priv->irq_active_high = pdata->irq_active_high; | ||
195 | |||
196 | irq_flags = priv->irq_active_high ? | ||
197 | IRQF_TRIGGER_RISING : IRQF_TRIGGER_FALLING; | ||
198 | |||
183 | INIT_WORK(&priv->work, eeti_ts_read); | 199 | INIT_WORK(&priv->work, eeti_ts_read); |
184 | i2c_set_clientdata(client, priv); | 200 | i2c_set_clientdata(client, priv); |
185 | input_set_drvdata(input, priv); | 201 | input_set_drvdata(input, priv); |
@@ -188,7 +204,7 @@ static int __devinit eeti_ts_probe(struct i2c_client *client, | |||
188 | if (err) | 204 | if (err) |
189 | goto err1; | 205 | goto err1; |
190 | 206 | ||
191 | err = request_irq(priv->irq, eeti_ts_isr, IRQF_TRIGGER_FALLING, | 207 | err = request_irq(priv->irq, eeti_ts_isr, irq_flags, |
192 | client->name, priv); | 208 | client->name, priv); |
193 | if (err) { | 209 | if (err) { |
194 | dev_err(&client->dev, "Unable to request touchscreen IRQ.\n"); | 210 | dev_err(&client->dev, "Unable to request touchscreen IRQ.\n"); |
diff --git a/include/linux/input/eeti_ts.h b/include/linux/input/eeti_ts.h new file mode 100644 index 000000000000..f875b316249d --- /dev/null +++ b/include/linux/input/eeti_ts.h | |||
@@ -0,0 +1,9 @@ | |||
1 | #ifndef LINUX_INPUT_EETI_TS_H | ||
2 | #define LINUX_INPUT_EETI_TS_H | ||
3 | |||
4 | struct eeti_ts_platform_data { | ||
5 | unsigned int irq_active_high; | ||
6 | }; | ||
7 | |||
8 | #endif /* LINUX_INPUT_EETI_TS_H */ | ||
9 | |||