diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/input/keyboard/Kconfig | 19 | ||||
-rw-r--r-- | drivers/input/keyboard/Makefile | 5 | ||||
-rw-r--r-- | drivers/input/keyboard/gpio_keys.c | 147 | ||||
-rw-r--r-- | drivers/input/mouse/pc110pad.c | 2 | ||||
-rw-r--r-- | drivers/input/serio/i8042.c | 7 | ||||
-rw-r--r-- | drivers/input/touchscreen/Kconfig | 9 | ||||
-rw-r--r-- | drivers/input/touchscreen/ads7846.c | 581 | ||||
-rw-r--r-- | drivers/usb/input/hid-ff.c | 1 | ||||
-rw-r--r-- | drivers/usb/input/hid-lgff.c | 1 |
9 files changed, 569 insertions, 203 deletions
diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig index 049f2f544e75..1b81a72e19d9 100644 --- a/drivers/input/keyboard/Kconfig +++ b/drivers/input/keyboard/Kconfig | |||
@@ -135,12 +135,12 @@ config KEYBOARD_STOWAWAY | |||
135 | config KEYBOARD_CORGI | 135 | config KEYBOARD_CORGI |
136 | tristate "Corgi keyboard" | 136 | tristate "Corgi keyboard" |
137 | depends on PXA_SHARPSL | 137 | depends on PXA_SHARPSL |
138 | default y | 138 | default y |
139 | help | 139 | help |
140 | Say Y here to enable the keyboard on the Sharp Zaurus SL-C7xx | 140 | Say Y here to enable the keyboard on the Sharp Zaurus SL-C7xx |
141 | series of PDAs. | 141 | series of PDAs. |
142 | 142 | ||
143 | To compile this driver as a module, choose M here: the | 143 | To compile this driver as a module, choose M here: the |
144 | module will be called corgikbd. | 144 | module will be called corgikbd. |
145 | 145 | ||
146 | config KEYBOARD_SPITZ | 146 | config KEYBOARD_SPITZ |
@@ -214,4 +214,17 @@ config KEYBOARD_AAED2000 | |||
214 | To compile this driver as a module, choose M here: the | 214 | To compile this driver as a module, choose M here: the |
215 | module will be called aaed2000_kbd. | 215 | module will be called aaed2000_kbd. |
216 | 216 | ||
217 | config KEYBOARD_GPIO | ||
218 | tristate "Buttons on CPU GPIOs (PXA)" | ||
219 | depends on ARCH_PXA | ||
220 | help | ||
221 | This driver implements support for buttons connected | ||
222 | directly to GPIO pins of PXA CPUs. | ||
223 | |||
224 | Say Y here if your device has buttons connected | ||
225 | directly to GPIO pins of the CPU. | ||
226 | |||
227 | To compile this driver as a module, choose M here: the | ||
228 | module will be called gpio-keys. | ||
229 | |||
217 | endif | 230 | endif |
diff --git a/drivers/input/keyboard/Makefile b/drivers/input/keyboard/Makefile index 568797907347..586a0fe53be6 100644 --- a/drivers/input/keyboard/Makefile +++ b/drivers/input/keyboard/Makefile | |||
@@ -16,6 +16,7 @@ obj-$(CONFIG_KEYBOARD_CORGI) += corgikbd.o | |||
16 | obj-$(CONFIG_KEYBOARD_SPITZ) += spitzkbd.o | 16 | obj-$(CONFIG_KEYBOARD_SPITZ) += spitzkbd.o |
17 | obj-$(CONFIG_KEYBOARD_HIL) += hil_kbd.o | 17 | obj-$(CONFIG_KEYBOARD_HIL) += hil_kbd.o |
18 | obj-$(CONFIG_KEYBOARD_HIL_OLD) += hilkbd.o | 18 | obj-$(CONFIG_KEYBOARD_HIL_OLD) += hilkbd.o |
19 | obj-$(CONFIG_KEYBOARD_OMAP) += omap-keypad.o | 19 | obj-$(CONFIG_KEYBOARD_OMAP) += omap-keypad.o |
20 | obj-$(CONFIG_KEYBOARD_AAED2000) += aaed2000_kbd.o | 20 | obj-$(CONFIG_KEYBOARD_AAED2000) += aaed2000_kbd.o |
21 | obj-$(CONFIG_KEYBOARD_GPIO) += gpio_keys.o | ||
21 | 22 | ||
diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c new file mode 100644 index 000000000000..3a8f1b427a7f --- /dev/null +++ b/drivers/input/keyboard/gpio_keys.c | |||
@@ -0,0 +1,147 @@ | |||
1 | /* | ||
2 | * Driver for keys on GPIO lines capable of generating interrupts. | ||
3 | * | ||
4 | * Copyright 2005 Phil Blundell | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #include <linux/module.h> | ||
12 | #include <linux/version.h> | ||
13 | |||
14 | #include <linux/init.h> | ||
15 | #include <linux/fs.h> | ||
16 | #include <linux/interrupt.h> | ||
17 | #include <linux/irq.h> | ||
18 | #include <linux/sched.h> | ||
19 | #include <linux/pm.h> | ||
20 | #include <linux/sysctl.h> | ||
21 | #include <linux/proc_fs.h> | ||
22 | #include <linux/delay.h> | ||
23 | #include <linux/platform_device.h> | ||
24 | #include <linux/input.h> | ||
25 | #include <linux/irq.h> | ||
26 | |||
27 | #include <asm/arch/pxa-regs.h> | ||
28 | #include <asm/arch/hardware.h> | ||
29 | |||
30 | #include <asm/hardware/gpio_keys.h> | ||
31 | |||
32 | static irqreturn_t gpio_keys_isr(int irq, void *dev_id) | ||
33 | { | ||
34 | int i; | ||
35 | struct platform_device *pdev = dev_id; | ||
36 | struct gpio_keys_platform_data *pdata = pdev->dev.platform_data; | ||
37 | struct input_dev *input = platform_get_drvdata(pdev); | ||
38 | |||
39 | for (i = 0; i < pdata->nbuttons; i++) { | ||
40 | int gpio = pdata->buttons[i].gpio; | ||
41 | if (irq == IRQ_GPIO(gpio)) { | ||
42 | int state = ((GPLR(gpio) & GPIO_bit(gpio)) ? 1 : 0) ^ (pdata->buttons[i].active_low); | ||
43 | |||
44 | input_report_key(input, pdata->buttons[i].keycode, state); | ||
45 | input_sync(input); | ||
46 | } | ||
47 | } | ||
48 | |||
49 | return IRQ_HANDLED; | ||
50 | } | ||
51 | |||
52 | static int __devinit gpio_keys_probe(struct platform_device *pdev) | ||
53 | { | ||
54 | struct gpio_keys_platform_data *pdata = pdev->dev.platform_data; | ||
55 | struct input_dev *input; | ||
56 | int i, error; | ||
57 | |||
58 | input = input_allocate_device(); | ||
59 | if (!input) | ||
60 | return -ENOMEM; | ||
61 | |||
62 | platform_set_drvdata(pdev, input); | ||
63 | |||
64 | input->evbit[0] = BIT(EV_KEY); | ||
65 | |||
66 | input->name = pdev->name; | ||
67 | input->phys = "gpio-keys/input0"; | ||
68 | input->cdev.dev = &pdev->dev; | ||
69 | input->private = pdata; | ||
70 | |||
71 | input->id.bustype = BUS_HOST; | ||
72 | input->id.vendor = 0x0001; | ||
73 | input->id.product = 0x0001; | ||
74 | input->id.version = 0x0100; | ||
75 | |||
76 | for (i = 0; i < pdata->nbuttons; i++) { | ||
77 | int code = pdata->buttons[i].keycode; | ||
78 | int irq = IRQ_GPIO(pdata->buttons[i].gpio); | ||
79 | |||
80 | set_irq_type(irq, IRQ_TYPE_EDGE_BOTH); | ||
81 | error = request_irq(irq, gpio_keys_isr, SA_SAMPLE_RANDOM, | ||
82 | pdata->buttons[i].desc ? pdata->buttons[i].desc : "gpio_keys", | ||
83 | pdev); | ||
84 | if (error) { | ||
85 | printk(KERN_ERR "gpio-keys: unable to claim irq %d; error %d\n", irq, ret); | ||
86 | goto fail; | ||
87 | } | ||
88 | set_bit(code, input->keybit); | ||
89 | } | ||
90 | |||
91 | error = input_register_device(input); | ||
92 | if (error) { | ||
93 | printk(KERN_ERR "Unable to register gpio-keys input device\n"); | ||
94 | goto fail; | ||
95 | } | ||
96 | |||
97 | return 0; | ||
98 | |||
99 | fail: | ||
100 | for (i = i - 1; i >= 0; i--) | ||
101 | free_irq(IRQ_GPIO(pdata->buttons[i].gpio), pdev); | ||
102 | |||
103 | input_free_device(input); | ||
104 | |||
105 | return error; | ||
106 | } | ||
107 | |||
108 | static int __devexit gpio_keys_remove(struct platform_device *pdev) | ||
109 | { | ||
110 | struct gpio_keys_platform_data *pdata = pdev->dev.platform_data; | ||
111 | struct input_dev *input = platform_get_drvdata(pdev); | ||
112 | int i; | ||
113 | |||
114 | for (i = 0; i < pdata->nbuttons; i++) { | ||
115 | int irq = IRQ_GPIO(pdata->buttons[i].gpio); | ||
116 | free_irq(irq, pdev); | ||
117 | } | ||
118 | |||
119 | input_unregister_device(input); | ||
120 | |||
121 | return 0; | ||
122 | } | ||
123 | |||
124 | struct platform_driver gpio_keys_device_driver = { | ||
125 | .probe = gpio_keys_probe, | ||
126 | .remove = __devexit_p(gpio_keys_remove), | ||
127 | .driver = { | ||
128 | .name = "gpio-keys", | ||
129 | } | ||
130 | }; | ||
131 | |||
132 | static int __init gpio_keys_init(void) | ||
133 | { | ||
134 | return platform_driver_register(&gpio_keys_device_driver); | ||
135 | } | ||
136 | |||
137 | static void __exit gpio_keys_exit(void) | ||
138 | { | ||
139 | platform_driver_unregister(&gpio_keys_device_driver); | ||
140 | } | ||
141 | |||
142 | module_init(gpio_keys_init); | ||
143 | module_exit(gpio_keys_exit); | ||
144 | |||
145 | MODULE_LICENSE("GPL"); | ||
146 | MODULE_AUTHOR("Phil Blundell <pb@handhelds.org>"); | ||
147 | MODULE_DESCRIPTION("Keyboard driver for CPU GPIOs"); | ||
diff --git a/drivers/input/mouse/pc110pad.c b/drivers/input/mouse/pc110pad.c index f155c1fea04e..05d992e514f0 100644 --- a/drivers/input/mouse/pc110pad.c +++ b/drivers/input/mouse/pc110pad.c | |||
@@ -113,7 +113,7 @@ static int __init pc110pad_init(void) | |||
113 | dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, NULL); | 113 | dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, NULL); |
114 | if (dev) { | 114 | if (dev) { |
115 | pci_dev_put(dev); | 115 | pci_dev_put(dev); |
116 | return -ENOENT; | 116 | return -ENODEV; |
117 | } | 117 | } |
118 | 118 | ||
119 | if (!request_region(pc110pad_io, 4, "pc110pad")) { | 119 | if (!request_region(pc110pad_io, 4, "pc110pad")) { |
diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c index debe9445488c..1364c7964db4 100644 --- a/drivers/input/serio/i8042.c +++ b/drivers/input/serio/i8042.c | |||
@@ -371,7 +371,7 @@ static irqreturn_t i8042_interrupt(int irq, void *dev_id) | |||
371 | if (unlikely(i8042_suppress_kbd_ack)) | 371 | if (unlikely(i8042_suppress_kbd_ack)) |
372 | if (port_no == I8042_KBD_PORT_NO && | 372 | if (port_no == I8042_KBD_PORT_NO && |
373 | (data == 0xfa || data == 0xfe)) { | 373 | (data == 0xfa || data == 0xfe)) { |
374 | i8042_suppress_kbd_ack = 0; | 374 | i8042_suppress_kbd_ack--; |
375 | goto out; | 375 | goto out; |
376 | } | 376 | } |
377 | 377 | ||
@@ -838,13 +838,14 @@ static long i8042_panic_blink(long count) | |||
838 | led ^= 0x01 | 0x04; | 838 | led ^= 0x01 | 0x04; |
839 | while (i8042_read_status() & I8042_STR_IBF) | 839 | while (i8042_read_status() & I8042_STR_IBF) |
840 | DELAY; | 840 | DELAY; |
841 | i8042_suppress_kbd_ack = 1; | 841 | dbg("%02x -> i8042 (panic blink)", 0xed); |
842 | i8042_suppress_kbd_ack = 2; | ||
842 | i8042_write_data(0xed); /* set leds */ | 843 | i8042_write_data(0xed); /* set leds */ |
843 | DELAY; | 844 | DELAY; |
844 | while (i8042_read_status() & I8042_STR_IBF) | 845 | while (i8042_read_status() & I8042_STR_IBF) |
845 | DELAY; | 846 | DELAY; |
846 | DELAY; | 847 | DELAY; |
847 | i8042_suppress_kbd_ack = 1; | 848 | dbg("%02x -> i8042 (panic blink)", led); |
848 | i8042_write_data(led); | 849 | i8042_write_data(led); |
849 | DELAY; | 850 | DELAY; |
850 | last_blink = count; | 851 | last_blink = count; |
diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig index 6b46c9bf1d20..971618059a6f 100644 --- a/drivers/input/touchscreen/Kconfig +++ b/drivers/input/touchscreen/Kconfig | |||
@@ -12,13 +12,18 @@ menuconfig INPUT_TOUCHSCREEN | |||
12 | if INPUT_TOUCHSCREEN | 12 | if INPUT_TOUCHSCREEN |
13 | 13 | ||
14 | config TOUCHSCREEN_ADS7846 | 14 | config TOUCHSCREEN_ADS7846 |
15 | tristate "ADS 7846 based touchscreens" | 15 | tristate "ADS 7846/7843 based touchscreens" |
16 | depends on SPI_MASTER | 16 | depends on SPI_MASTER |
17 | depends on HWMON = n || HWMON | ||
17 | help | 18 | help |
18 | Say Y here if you have a touchscreen interface using the | 19 | Say Y here if you have a touchscreen interface using the |
19 | ADS7846 controller, and your board-specific initialization | 20 | ADS7846 or ADS7843 controller, and your board-specific setup |
20 | code includes that in its table of SPI devices. | 21 | code includes that in its table of SPI devices. |
21 | 22 | ||
23 | If HWMON is selected, and the driver is told the reference voltage | ||
24 | on your board, you will also get hwmon interfaces for the voltage | ||
25 | (and on ads7846, temperature) sensors of this chip. | ||
26 | |||
22 | If unsure, say N (but it's safe to say "Y"). | 27 | If unsure, say N (but it's safe to say "Y"). |
23 | 28 | ||
24 | To compile this driver as a module, choose M here: the | 29 | To compile this driver as a module, choose M here: the |
diff --git a/drivers/input/touchscreen/ads7846.c b/drivers/input/touchscreen/ads7846.c index c6164b6f476a..cd251efda410 100644 --- a/drivers/input/touchscreen/ads7846.c +++ b/drivers/input/touchscreen/ads7846.c | |||
@@ -17,8 +17,9 @@ | |||
17 | * it under the terms of the GNU General Public License version 2 as | 17 | * it under the terms of the GNU General Public License version 2 as |
18 | * published by the Free Software Foundation. | 18 | * published by the Free Software Foundation. |
19 | */ | 19 | */ |
20 | #include <linux/device.h> | 20 | #include <linux/hwmon.h> |
21 | #include <linux/init.h> | 21 | #include <linux/init.h> |
22 | #include <linux/err.h> | ||
22 | #include <linux/delay.h> | 23 | #include <linux/delay.h> |
23 | #include <linux/input.h> | 24 | #include <linux/input.h> |
24 | #include <linux/interrupt.h> | 25 | #include <linux/interrupt.h> |
@@ -54,7 +55,8 @@ | |||
54 | * files. | 55 | * files. |
55 | */ | 56 | */ |
56 | 57 | ||
57 | #define TS_POLL_PERIOD msecs_to_jiffies(10) | 58 | #define TS_POLL_DELAY (1 * 1000000) /* ns delay before the first sample */ |
59 | #define TS_POLL_PERIOD (5 * 1000000) /* ns delay between samples */ | ||
58 | 60 | ||
59 | /* this driver doesn't aim at the peak continuous sample rate */ | 61 | /* this driver doesn't aim at the peak continuous sample rate */ |
60 | #define SAMPLE_BITS (8 /*cmd*/ + 16 /*sample*/ + 2 /* before, after */) | 62 | #define SAMPLE_BITS (8 /*cmd*/ + 16 /*sample*/ + 2 /* before, after */) |
@@ -63,12 +65,12 @@ struct ts_event { | |||
63 | /* For portability, we can't read 12 bit values using SPI (which | 65 | /* For portability, we can't read 12 bit values using SPI (which |
64 | * would make the controller deliver them as native byteorder u16 | 66 | * would make the controller deliver them as native byteorder u16 |
65 | * with msbs zeroed). Instead, we read them as two 8-bit values, | 67 | * with msbs zeroed). Instead, we read them as two 8-bit values, |
66 | * which need byteswapping then range adjustment. | 68 | * *** WHICH NEED BYTESWAPPING *** and range adjustment. |
67 | */ | 69 | */ |
68 | __be16 x; | 70 | u16 x; |
69 | __be16 y; | 71 | u16 y; |
70 | __be16 z1, z2; | 72 | u16 z1, z2; |
71 | int ignore; | 73 | int ignore; |
72 | }; | 74 | }; |
73 | 75 | ||
74 | struct ads7846 { | 76 | struct ads7846 { |
@@ -76,7 +78,12 @@ struct ads7846 { | |||
76 | char phys[32]; | 78 | char phys[32]; |
77 | 79 | ||
78 | struct spi_device *spi; | 80 | struct spi_device *spi; |
81 | |||
82 | #if defined(CONFIG_HWMON) || defined(CONFIG_HWMON_MODULE) | ||
79 | struct attribute_group *attr_group; | 83 | struct attribute_group *attr_group; |
84 | struct class_device *hwmon; | ||
85 | #endif | ||
86 | |||
80 | u16 model; | 87 | u16 model; |
81 | u16 vref_delay_usecs; | 88 | u16 vref_delay_usecs; |
82 | u16 x_plate_ohms; | 89 | u16 x_plate_ohms; |
@@ -99,13 +106,16 @@ struct ads7846 { | |||
99 | u16 debounce_rep; | 106 | u16 debounce_rep; |
100 | 107 | ||
101 | spinlock_t lock; | 108 | spinlock_t lock; |
102 | struct timer_list timer; /* P: lock */ | 109 | struct hrtimer timer; |
103 | unsigned pendown:1; /* P: lock */ | 110 | unsigned pendown:1; /* P: lock */ |
104 | unsigned pending:1; /* P: lock */ | 111 | unsigned pending:1; /* P: lock */ |
105 | // FIXME remove "irq_disabled" | 112 | // FIXME remove "irq_disabled" |
106 | unsigned irq_disabled:1; /* P: lock */ | 113 | unsigned irq_disabled:1; /* P: lock */ |
107 | unsigned disabled:1; | 114 | unsigned disabled:1; |
108 | 115 | ||
116 | int (*filter)(void *data, int data_idx, int *val); | ||
117 | void *filter_data; | ||
118 | void (*filter_cleanup)(void *data); | ||
109 | int (*get_pendown_state)(void); | 119 | int (*get_pendown_state)(void); |
110 | }; | 120 | }; |
111 | 121 | ||
@@ -142,15 +152,16 @@ struct ads7846 { | |||
142 | #define MAX_12BIT ((1<<12)-1) | 152 | #define MAX_12BIT ((1<<12)-1) |
143 | 153 | ||
144 | /* leave ADC powered up (disables penirq) between differential samples */ | 154 | /* leave ADC powered up (disables penirq) between differential samples */ |
145 | #define READ_12BIT_DFR(x) (ADS_START | ADS_A2A1A0_d_ ## x \ | 155 | #define READ_12BIT_DFR(x, adc, vref) (ADS_START | ADS_A2A1A0_d_ ## x \ |
146 | | ADS_12_BIT | ADS_DFR) | 156 | | ADS_12_BIT | ADS_DFR | \ |
157 | (adc ? ADS_PD10_ADC_ON : 0) | (vref ? ADS_PD10_REF_ON : 0)) | ||
147 | 158 | ||
148 | #define READ_Y (READ_12BIT_DFR(y) | ADS_PD10_ADC_ON) | 159 | #define READ_Y(vref) (READ_12BIT_DFR(y, 1, vref)) |
149 | #define READ_Z1 (READ_12BIT_DFR(z1) | ADS_PD10_ADC_ON) | 160 | #define READ_Z1(vref) (READ_12BIT_DFR(z1, 1, vref)) |
150 | #define READ_Z2 (READ_12BIT_DFR(z2) | ADS_PD10_ADC_ON) | 161 | #define READ_Z2(vref) (READ_12BIT_DFR(z2, 1, vref)) |
151 | 162 | ||
152 | #define READ_X (READ_12BIT_DFR(x) | ADS_PD10_ADC_ON) | 163 | #define READ_X(vref) (READ_12BIT_DFR(x, 1, vref)) |
153 | #define PWRDOWN (READ_12BIT_DFR(y) | ADS_PD10_PDOWN) /* LAST */ | 164 | #define PWRDOWN (READ_12BIT_DFR(y, 0, 0)) /* LAST */ |
154 | 165 | ||
155 | /* single-ended samples need to first power up reference voltage; | 166 | /* single-ended samples need to first power up reference voltage; |
156 | * we leave both ADC and VREF powered | 167 | * we leave both ADC and VREF powered |
@@ -158,14 +169,19 @@ struct ads7846 { | |||
158 | #define READ_12BIT_SER(x) (ADS_START | ADS_A2A1A0_ ## x \ | 169 | #define READ_12BIT_SER(x) (ADS_START | ADS_A2A1A0_ ## x \ |
159 | | ADS_12_BIT | ADS_SER) | 170 | | ADS_12_BIT | ADS_SER) |
160 | 171 | ||
161 | #define REF_ON (READ_12BIT_DFR(x) | ADS_PD10_ALL_ON) | 172 | #define REF_ON (READ_12BIT_DFR(x, 1, 1)) |
162 | #define REF_OFF (READ_12BIT_DFR(y) | ADS_PD10_PDOWN) | 173 | #define REF_OFF (READ_12BIT_DFR(y, 0, 0)) |
163 | 174 | ||
164 | /*--------------------------------------------------------------------------*/ | 175 | /*--------------------------------------------------------------------------*/ |
165 | 176 | ||
166 | /* | 177 | /* |
167 | * Non-touchscreen sensors only use single-ended conversions. | 178 | * Non-touchscreen sensors only use single-ended conversions. |
179 | * The range is GND..vREF. The ads7843 and ads7835 must use external vREF; | ||
180 | * ads7846 lets that pin be unconnected, to use internal vREF. | ||
168 | */ | 181 | */ |
182 | static unsigned vREF_mV; | ||
183 | module_param(vREF_mV, uint, 0); | ||
184 | MODULE_PARM_DESC(vREF_mV, "external vREF voltage, in milliVolts"); | ||
169 | 185 | ||
170 | struct ser_req { | 186 | struct ser_req { |
171 | u8 ref_on; | 187 | u8 ref_on; |
@@ -193,50 +209,55 @@ static int ads7846_read12_ser(struct device *dev, unsigned command) | |||
193 | struct ser_req *req = kzalloc(sizeof *req, GFP_KERNEL); | 209 | struct ser_req *req = kzalloc(sizeof *req, GFP_KERNEL); |
194 | int status; | 210 | int status; |
195 | int sample; | 211 | int sample; |
196 | int i; | 212 | int use_internal; |
197 | 213 | ||
198 | if (!req) | 214 | if (!req) |
199 | return -ENOMEM; | 215 | return -ENOMEM; |
200 | 216 | ||
201 | spi_message_init(&req->msg); | 217 | spi_message_init(&req->msg); |
202 | 218 | ||
203 | /* activate reference, so it has time to settle; */ | 219 | /* FIXME boards with ads7846 might use external vref instead ... */ |
204 | req->ref_on = REF_ON; | 220 | use_internal = (ts->model == 7846); |
205 | req->xfer[0].tx_buf = &req->ref_on; | 221 | |
206 | req->xfer[0].len = 1; | 222 | /* maybe turn on internal vREF, and let it settle */ |
207 | req->xfer[1].rx_buf = &req->scratch; | 223 | if (use_internal) { |
208 | req->xfer[1].len = 2; | 224 | req->ref_on = REF_ON; |
209 | 225 | req->xfer[0].tx_buf = &req->ref_on; | |
210 | /* | 226 | req->xfer[0].len = 1; |
211 | * for external VREF, 0 usec (and assume it's always on); | 227 | spi_message_add_tail(&req->xfer[0], &req->msg); |
212 | * for 1uF, use 800 usec; | 228 | |
213 | * no cap, 100 usec. | 229 | req->xfer[1].rx_buf = &req->scratch; |
214 | */ | 230 | req->xfer[1].len = 2; |
215 | req->xfer[1].delay_usecs = ts->vref_delay_usecs; | 231 | |
232 | /* for 1uF, settle for 800 usec; no cap, 100 usec. */ | ||
233 | req->xfer[1].delay_usecs = ts->vref_delay_usecs; | ||
234 | spi_message_add_tail(&req->xfer[1], &req->msg); | ||
235 | } | ||
216 | 236 | ||
217 | /* take sample */ | 237 | /* take sample */ |
218 | req->command = (u8) command; | 238 | req->command = (u8) command; |
219 | req->xfer[2].tx_buf = &req->command; | 239 | req->xfer[2].tx_buf = &req->command; |
220 | req->xfer[2].len = 1; | 240 | req->xfer[2].len = 1; |
241 | spi_message_add_tail(&req->xfer[2], &req->msg); | ||
242 | |||
221 | req->xfer[3].rx_buf = &req->sample; | 243 | req->xfer[3].rx_buf = &req->sample; |
222 | req->xfer[3].len = 2; | 244 | req->xfer[3].len = 2; |
245 | spi_message_add_tail(&req->xfer[3], &req->msg); | ||
223 | 246 | ||
224 | /* REVISIT: take a few more samples, and compare ... */ | 247 | /* REVISIT: take a few more samples, and compare ... */ |
225 | 248 | ||
226 | /* turn off reference */ | 249 | /* maybe off internal vREF */ |
227 | req->ref_off = REF_OFF; | 250 | if (use_internal) { |
228 | req->xfer[4].tx_buf = &req->ref_off; | 251 | req->ref_off = REF_OFF; |
229 | req->xfer[4].len = 1; | 252 | req->xfer[4].tx_buf = &req->ref_off; |
230 | req->xfer[5].rx_buf = &req->scratch; | 253 | req->xfer[4].len = 1; |
231 | req->xfer[5].len = 2; | 254 | spi_message_add_tail(&req->xfer[4], &req->msg); |
232 | 255 | ||
233 | CS_CHANGE(req->xfer[5]); | 256 | req->xfer[5].rx_buf = &req->scratch; |
234 | 257 | req->xfer[5].len = 2; | |
235 | /* group all the transfers together, so we can't interfere with | 258 | CS_CHANGE(req->xfer[5]); |
236 | * reading touchscreen state; disable penirq while sampling | 259 | spi_message_add_tail(&req->xfer[5], &req->msg); |
237 | */ | 260 | } |
238 | for (i = 0; i < 6; i++) | ||
239 | spi_message_add_tail(&req->xfer[i], &req->msg); | ||
240 | 261 | ||
241 | ts->irq_disabled = 1; | 262 | ts->irq_disabled = 1; |
242 | disable_irq(spi->irq); | 263 | disable_irq(spi->irq); |
@@ -256,25 +277,173 @@ static int ads7846_read12_ser(struct device *dev, unsigned command) | |||
256 | return status ? status : sample; | 277 | return status ? status : sample; |
257 | } | 278 | } |
258 | 279 | ||
259 | #define SHOW(name) static ssize_t \ | 280 | #if defined(CONFIG_HWMON) || defined(CONFIG_HWMON_MODULE) |
281 | |||
282 | #define SHOW(name, var, adjust) static ssize_t \ | ||
260 | name ## _show(struct device *dev, struct device_attribute *attr, char *buf) \ | 283 | name ## _show(struct device *dev, struct device_attribute *attr, char *buf) \ |
261 | { \ | 284 | { \ |
285 | struct ads7846 *ts = dev_get_drvdata(dev); \ | ||
262 | ssize_t v = ads7846_read12_ser(dev, \ | 286 | ssize_t v = ads7846_read12_ser(dev, \ |
263 | READ_12BIT_SER(name) | ADS_PD10_ALL_ON); \ | 287 | READ_12BIT_SER(var) | ADS_PD10_ALL_ON); \ |
264 | if (v < 0) \ | 288 | if (v < 0) \ |
265 | return v; \ | 289 | return v; \ |
266 | return sprintf(buf, "%u\n", (unsigned) v); \ | 290 | return sprintf(buf, "%u\n", adjust(ts, v)); \ |
267 | } \ | 291 | } \ |
268 | static DEVICE_ATTR(name, S_IRUGO, name ## _show, NULL); | 292 | static DEVICE_ATTR(name, S_IRUGO, name ## _show, NULL); |
269 | 293 | ||
270 | SHOW(temp0) | 294 | |
271 | SHOW(temp1) | 295 | /* Sysfs conventions report temperatures in millidegrees Celcius. |
272 | SHOW(vaux) | 296 | * ADS7846 could use the low-accuracy two-sample scheme, but can't do the high |
273 | SHOW(vbatt) | 297 | * accuracy scheme without calibration data. For now we won't try either; |
298 | * userspace sees raw sensor values, and must scale/calibrate appropriately. | ||
299 | */ | ||
300 | static inline unsigned null_adjust(struct ads7846 *ts, ssize_t v) | ||
301 | { | ||
302 | return v; | ||
303 | } | ||
304 | |||
305 | SHOW(temp0, temp0, null_adjust) /* temp1_input */ | ||
306 | SHOW(temp1, temp1, null_adjust) /* temp2_input */ | ||
307 | |||
308 | |||
309 | /* sysfs conventions report voltages in millivolts. We can convert voltages | ||
310 | * if we know vREF. userspace may need to scale vAUX to match the board's | ||
311 | * external resistors; we assume that vBATT only uses the internal ones. | ||
312 | */ | ||
313 | static inline unsigned vaux_adjust(struct ads7846 *ts, ssize_t v) | ||
314 | { | ||
315 | unsigned retval = v; | ||
316 | |||
317 | /* external resistors may scale vAUX into 0..vREF */ | ||
318 | retval *= vREF_mV; | ||
319 | retval = retval >> 12; | ||
320 | return retval; | ||
321 | } | ||
322 | |||
323 | static inline unsigned vbatt_adjust(struct ads7846 *ts, ssize_t v) | ||
324 | { | ||
325 | unsigned retval = vaux_adjust(ts, v); | ||
326 | |||
327 | /* ads7846 has a resistor ladder to scale this signal down */ | ||
328 | if (ts->model == 7846) | ||
329 | retval *= 4; | ||
330 | return retval; | ||
331 | } | ||
332 | |||
333 | SHOW(in0_input, vaux, vaux_adjust) | ||
334 | SHOW(in1_input, vbatt, vbatt_adjust) | ||
335 | |||
336 | |||
337 | static struct attribute *ads7846_attributes[] = { | ||
338 | &dev_attr_temp0.attr, | ||
339 | &dev_attr_temp1.attr, | ||
340 | &dev_attr_in0_input.attr, | ||
341 | &dev_attr_in1_input.attr, | ||
342 | NULL, | ||
343 | }; | ||
344 | |||
345 | static struct attribute_group ads7846_attr_group = { | ||
346 | .attrs = ads7846_attributes, | ||
347 | }; | ||
348 | |||
349 | static struct attribute *ads7843_attributes[] = { | ||
350 | &dev_attr_in0_input.attr, | ||
351 | &dev_attr_in1_input.attr, | ||
352 | NULL, | ||
353 | }; | ||
354 | |||
355 | static struct attribute_group ads7843_attr_group = { | ||
356 | .attrs = ads7843_attributes, | ||
357 | }; | ||
358 | |||
359 | static struct attribute *ads7845_attributes[] = { | ||
360 | &dev_attr_in0_input.attr, | ||
361 | NULL, | ||
362 | }; | ||
363 | |||
364 | static struct attribute_group ads7845_attr_group = { | ||
365 | .attrs = ads7845_attributes, | ||
366 | }; | ||
367 | |||
368 | static int ads784x_hwmon_register(struct spi_device *spi, struct ads7846 *ts) | ||
369 | { | ||
370 | struct class_device *hwmon; | ||
371 | int err; | ||
372 | |||
373 | /* hwmon sensors need a reference voltage */ | ||
374 | switch (ts->model) { | ||
375 | case 7846: | ||
376 | if (!vREF_mV) { | ||
377 | dev_dbg(&spi->dev, "assuming 2.5V internal vREF\n"); | ||
378 | vREF_mV = 2500; | ||
379 | } | ||
380 | break; | ||
381 | case 7845: | ||
382 | case 7843: | ||
383 | if (!vREF_mV) { | ||
384 | dev_warn(&spi->dev, | ||
385 | "external vREF for ADS%d not specified\n", | ||
386 | ts->model); | ||
387 | return 0; | ||
388 | } | ||
389 | break; | ||
390 | } | ||
391 | |||
392 | /* different chips have different sensor groups */ | ||
393 | switch (ts->model) { | ||
394 | case 7846: | ||
395 | ts->attr_group = &ads7846_attr_group; | ||
396 | break; | ||
397 | case 7845: | ||
398 | ts->attr_group = &ads7845_attr_group; | ||
399 | break; | ||
400 | case 7843: | ||
401 | ts->attr_group = &ads7843_attr_group; | ||
402 | break; | ||
403 | default: | ||
404 | dev_dbg(&spi->dev, "ADS%d not recognized\n", ts->model); | ||
405 | return 0; | ||
406 | } | ||
407 | |||
408 | err = sysfs_create_group(&spi->dev.kobj, ts->attr_group); | ||
409 | if (err) | ||
410 | return err; | ||
411 | |||
412 | hwmon = hwmon_device_register(&spi->dev); | ||
413 | if (IS_ERR(hwmon)) { | ||
414 | sysfs_remove_group(&spi->dev.kobj, ts->attr_group); | ||
415 | return PTR_ERR(hwmon); | ||
416 | } | ||
417 | |||
418 | ts->hwmon = hwmon; | ||
419 | return 0; | ||
420 | } | ||
421 | |||
422 | static void ads784x_hwmon_unregister(struct spi_device *spi, | ||
423 | struct ads7846 *ts) | ||
424 | { | ||
425 | if (ts->hwmon) { | ||
426 | sysfs_remove_group(&spi->dev.kobj, ts->attr_group); | ||
427 | hwmon_device_unregister(ts->hwmon); | ||
428 | } | ||
429 | } | ||
430 | |||
431 | #else | ||
432 | static inline int ads784x_hwmon_register(struct spi_device *spi, | ||
433 | struct ads7846 *ts) | ||
434 | { | ||
435 | return 0; | ||
436 | } | ||
437 | |||
438 | static inline void ads784x_hwmon_unregister(struct spi_device *spi, | ||
439 | struct ads7846 *ts) | ||
440 | { | ||
441 | } | ||
442 | #endif | ||
274 | 443 | ||
275 | static int is_pen_down(struct device *dev) | 444 | static int is_pen_down(struct device *dev) |
276 | { | 445 | { |
277 | struct ads7846 *ts = dev_get_drvdata(dev); | 446 | struct ads7846 *ts = dev_get_drvdata(dev); |
278 | 447 | ||
279 | return ts->pendown; | 448 | return ts->pendown; |
280 | } | 449 | } |
@@ -318,46 +487,14 @@ static ssize_t ads7846_disable_store(struct device *dev, | |||
318 | 487 | ||
319 | static DEVICE_ATTR(disable, 0664, ads7846_disable_show, ads7846_disable_store); | 488 | static DEVICE_ATTR(disable, 0664, ads7846_disable_show, ads7846_disable_store); |
320 | 489 | ||
321 | static struct attribute *ads7846_attributes[] = { | 490 | static struct attribute *ads784x_attributes[] = { |
322 | &dev_attr_temp0.attr, | ||
323 | &dev_attr_temp1.attr, | ||
324 | &dev_attr_vbatt.attr, | ||
325 | &dev_attr_vaux.attr, | ||
326 | &dev_attr_pen_down.attr, | ||
327 | &dev_attr_disable.attr, | ||
328 | NULL, | ||
329 | }; | ||
330 | |||
331 | static struct attribute_group ads7846_attr_group = { | ||
332 | .attrs = ads7846_attributes, | ||
333 | }; | ||
334 | |||
335 | /* | ||
336 | * ads7843/7845 don't have temperature sensors, and | ||
337 | * use the other sensors a bit differently too | ||
338 | */ | ||
339 | |||
340 | static struct attribute *ads7843_attributes[] = { | ||
341 | &dev_attr_vbatt.attr, | ||
342 | &dev_attr_vaux.attr, | ||
343 | &dev_attr_pen_down.attr, | 491 | &dev_attr_pen_down.attr, |
344 | &dev_attr_disable.attr, | 492 | &dev_attr_disable.attr, |
345 | NULL, | 493 | NULL, |
346 | }; | 494 | }; |
347 | 495 | ||
348 | static struct attribute_group ads7843_attr_group = { | 496 | static struct attribute_group ads784x_attr_group = { |
349 | .attrs = ads7843_attributes, | 497 | .attrs = ads784x_attributes, |
350 | }; | ||
351 | |||
352 | static struct attribute *ads7845_attributes[] = { | ||
353 | &dev_attr_vaux.attr, | ||
354 | &dev_attr_pen_down.attr, | ||
355 | &dev_attr_disable.attr, | ||
356 | NULL, | ||
357 | }; | ||
358 | |||
359 | static struct attribute_group ads7845_attr_group = { | ||
360 | .attrs = ads7845_attributes, | ||
361 | }; | 498 | }; |
362 | 499 | ||
363 | /*--------------------------------------------------------------------------*/ | 500 | /*--------------------------------------------------------------------------*/ |
@@ -373,25 +510,22 @@ static struct attribute_group ads7845_attr_group = { | |||
373 | static void ads7846_rx(void *ads) | 510 | static void ads7846_rx(void *ads) |
374 | { | 511 | { |
375 | struct ads7846 *ts = ads; | 512 | struct ads7846 *ts = ads; |
376 | struct input_dev *input_dev = ts->input; | ||
377 | unsigned Rt; | 513 | unsigned Rt; |
378 | unsigned sync = 0; | ||
379 | u16 x, y, z1, z2; | 514 | u16 x, y, z1, z2; |
380 | unsigned long flags; | ||
381 | 515 | ||
382 | /* adjust: on-wire is a must-ignore bit, a BE12 value, then padding; | 516 | /* ads7846_rx_val() did in-place conversion (including byteswap) from |
383 | * built from two 8 bit values written msb-first. | 517 | * on-the-wire format as part of debouncing to get stable readings. |
384 | */ | 518 | */ |
385 | x = (be16_to_cpu(ts->tc.x) >> 3) & 0x0fff; | 519 | x = ts->tc.x; |
386 | y = (be16_to_cpu(ts->tc.y) >> 3) & 0x0fff; | 520 | y = ts->tc.y; |
387 | z1 = (be16_to_cpu(ts->tc.z1) >> 3) & 0x0fff; | 521 | z1 = ts->tc.z1; |
388 | z2 = (be16_to_cpu(ts->tc.z2) >> 3) & 0x0fff; | 522 | z2 = ts->tc.z2; |
389 | 523 | ||
390 | /* range filtering */ | 524 | /* range filtering */ |
391 | if (x == MAX_12BIT) | 525 | if (x == MAX_12BIT) |
392 | x = 0; | 526 | x = 0; |
393 | 527 | ||
394 | if (likely(x && z1 && !device_suspended(&ts->spi->dev))) { | 528 | if (likely(x && z1)) { |
395 | /* compute touch pressure resistance using equation #2 */ | 529 | /* compute touch pressure resistance using equation #2 */ |
396 | Rt = z2; | 530 | Rt = z2; |
397 | Rt -= z1; | 531 | Rt -= z1; |
@@ -403,100 +537,129 @@ static void ads7846_rx(void *ads) | |||
403 | Rt = 0; | 537 | Rt = 0; |
404 | 538 | ||
405 | /* Sample found inconsistent by debouncing or pressure is beyond | 539 | /* Sample found inconsistent by debouncing or pressure is beyond |
406 | * the maximum. Don't report it to user space, repeat at least | 540 | * the maximum. Don't report it to user space, repeat at least |
407 | * once more the measurement */ | 541 | * once more the measurement |
542 | */ | ||
408 | if (ts->tc.ignore || Rt > ts->pressure_max) { | 543 | if (ts->tc.ignore || Rt > ts->pressure_max) { |
409 | mod_timer(&ts->timer, jiffies + TS_POLL_PERIOD); | 544 | #ifdef VERBOSE |
545 | pr_debug("%s: ignored %d pressure %d\n", | ||
546 | ts->spi->dev.bus_id, ts->tc.ignore, Rt); | ||
547 | #endif | ||
548 | hrtimer_start(&ts->timer, ktime_set(0, TS_POLL_PERIOD), | ||
549 | HRTIMER_REL); | ||
410 | return; | 550 | return; |
411 | } | 551 | } |
412 | 552 | ||
413 | /* NOTE: "pendown" is inferred from pressure; we don't rely on | 553 | /* NOTE: We can't rely on the pressure to determine the pen down |
414 | * being able to check nPENIRQ status, or "friendly" trigger modes | 554 | * state, even this controller has a pressure sensor. The pressure |
415 | * (both-edges is much better than just-falling or low-level). | 555 | * value can fluctuate for quite a while after lifting the pen and |
556 | * in some cases may not even settle at the expected value. | ||
416 | * | 557 | * |
417 | * REVISIT: some boards may require reading nPENIRQ; it's | 558 | * The only safe way to check for the pen up condition is in the |
418 | * needed on 7843. and 7845 reads pressure differently... | 559 | * timer by reading the pen signal state (it's a GPIO _and_ IRQ). |
419 | * | ||
420 | * REVISIT: the touchscreen might not be connected; this code | ||
421 | * won't notice that, even if nPENIRQ never fires ... | ||
422 | */ | 560 | */ |
423 | if (!ts->pendown && Rt != 0) { | ||
424 | input_report_key(input_dev, BTN_TOUCH, 1); | ||
425 | sync = 1; | ||
426 | } else if (ts->pendown && Rt == 0) { | ||
427 | input_report_key(input_dev, BTN_TOUCH, 0); | ||
428 | sync = 1; | ||
429 | } | ||
430 | |||
431 | if (Rt) { | 561 | if (Rt) { |
432 | input_report_abs(input_dev, ABS_X, x); | 562 | struct input_dev *input = ts->input; |
433 | input_report_abs(input_dev, ABS_Y, y); | ||
434 | sync = 1; | ||
435 | } | ||
436 | |||
437 | if (sync) { | ||
438 | input_report_abs(input_dev, ABS_PRESSURE, Rt); | ||
439 | input_sync(input_dev); | ||
440 | } | ||
441 | 563 | ||
442 | #ifdef VERBOSE | 564 | if (!ts->pendown) { |
443 | if (Rt || ts->pendown) | 565 | input_report_key(input, BTN_TOUCH, 1); |
444 | pr_debug("%s: %d/%d/%d%s\n", ts->spi->dev.bus_id, | 566 | ts->pendown = 1; |
445 | x, y, Rt, Rt ? "" : " UP"); | 567 | #ifdef VERBOSE |
568 | dev_dbg(&ts->spi->dev, "DOWN\n"); | ||
446 | #endif | 569 | #endif |
570 | } | ||
571 | input_report_abs(input, ABS_X, x); | ||
572 | input_report_abs(input, ABS_Y, y); | ||
573 | input_report_abs(input, ABS_PRESSURE, Rt); | ||
447 | 574 | ||
448 | spin_lock_irqsave(&ts->lock, flags); | 575 | input_sync(input); |
449 | 576 | #ifdef VERBOSE | |
450 | ts->pendown = (Rt != 0); | 577 | dev_dbg(&ts->spi->dev, "%4d/%4d/%4d\n", x, y, Rt); |
451 | mod_timer(&ts->timer, jiffies + TS_POLL_PERIOD); | 578 | #endif |
579 | } | ||
452 | 580 | ||
453 | spin_unlock_irqrestore(&ts->lock, flags); | 581 | hrtimer_start(&ts->timer, ktime_set(0, TS_POLL_PERIOD), HRTIMER_REL); |
454 | } | 582 | } |
455 | 583 | ||
456 | static void ads7846_debounce(void *ads) | 584 | static int ads7846_debounce(void *ads, int data_idx, int *val) |
457 | { | 585 | { |
458 | struct ads7846 *ts = ads; | 586 | struct ads7846 *ts = ads; |
459 | struct spi_message *m; | ||
460 | struct spi_transfer *t; | ||
461 | int val; | ||
462 | int status; | ||
463 | 587 | ||
464 | m = &ts->msg[ts->msg_idx]; | 588 | if (!ts->read_cnt || (abs(ts->last_read - *val) > ts->debounce_tol)) { |
465 | t = list_entry(m->transfers.prev, struct spi_transfer, transfer_list); | 589 | /* Start over collecting consistent readings. */ |
466 | val = (be16_to_cpu(*(__be16 *)t->rx_buf) >> 3) & 0x0fff; | 590 | ts->read_rep = 0; |
467 | if (!ts->read_cnt || (abs(ts->last_read - val) > ts->debounce_tol)) { | ||
468 | /* Repeat it, if this was the first read or the read | 591 | /* Repeat it, if this was the first read or the read |
469 | * wasn't consistent enough. */ | 592 | * wasn't consistent enough. */ |
470 | if (ts->read_cnt < ts->debounce_max) { | 593 | if (ts->read_cnt < ts->debounce_max) { |
471 | ts->last_read = val; | 594 | ts->last_read = *val; |
472 | ts->read_cnt++; | 595 | ts->read_cnt++; |
596 | return ADS7846_FILTER_REPEAT; | ||
473 | } else { | 597 | } else { |
474 | /* Maximum number of debouncing reached and still | 598 | /* Maximum number of debouncing reached and still |
475 | * not enough number of consistent readings. Abort | 599 | * not enough number of consistent readings. Abort |
476 | * the whole sample, repeat it in the next sampling | 600 | * the whole sample, repeat it in the next sampling |
477 | * period. | 601 | * period. |
478 | */ | 602 | */ |
479 | ts->tc.ignore = 1; | ||
480 | ts->read_cnt = 0; | 603 | ts->read_cnt = 0; |
481 | /* Last message will contain ads7846_rx() as the | 604 | return ADS7846_FILTER_IGNORE; |
482 | * completion function. | ||
483 | */ | ||
484 | m = ts->last_msg; | ||
485 | } | 605 | } |
486 | /* Start over collecting consistent readings. */ | ||
487 | ts->read_rep = 0; | ||
488 | } else { | 606 | } else { |
489 | if (++ts->read_rep > ts->debounce_rep) { | 607 | if (++ts->read_rep > ts->debounce_rep) { |
490 | /* Got a good reading for this coordinate, | 608 | /* Got a good reading for this coordinate, |
491 | * go for the next one. */ | 609 | * go for the next one. */ |
492 | ts->tc.ignore = 0; | ||
493 | ts->msg_idx++; | ||
494 | ts->read_cnt = 0; | 610 | ts->read_cnt = 0; |
495 | ts->read_rep = 0; | 611 | ts->read_rep = 0; |
496 | m++; | 612 | return ADS7846_FILTER_OK; |
497 | } else | 613 | } else { |
498 | /* Read more values that are consistent. */ | 614 | /* Read more values that are consistent. */ |
499 | ts->read_cnt++; | 615 | ts->read_cnt++; |
616 | return ADS7846_FILTER_REPEAT; | ||
617 | } | ||
618 | } | ||
619 | } | ||
620 | |||
621 | static int ads7846_no_filter(void *ads, int data_idx, int *val) | ||
622 | { | ||
623 | return ADS7846_FILTER_OK; | ||
624 | } | ||
625 | |||
626 | static void ads7846_rx_val(void *ads) | ||
627 | { | ||
628 | struct ads7846 *ts = ads; | ||
629 | struct spi_message *m; | ||
630 | struct spi_transfer *t; | ||
631 | u16 *rx_val; | ||
632 | int val; | ||
633 | int action; | ||
634 | int status; | ||
635 | |||
636 | m = &ts->msg[ts->msg_idx]; | ||
637 | t = list_entry(m->transfers.prev, struct spi_transfer, transfer_list); | ||
638 | rx_val = t->rx_buf; | ||
639 | |||
640 | /* adjust: on-wire is a must-ignore bit, a BE12 value, then padding; | ||
641 | * built from two 8 bit values written msb-first. | ||
642 | */ | ||
643 | val = be16_to_cpu(*rx_val) >> 3; | ||
644 | |||
645 | action = ts->filter(ts->filter_data, ts->msg_idx, &val); | ||
646 | switch (action) { | ||
647 | case ADS7846_FILTER_REPEAT: | ||
648 | break; | ||
649 | case ADS7846_FILTER_IGNORE: | ||
650 | ts->tc.ignore = 1; | ||
651 | /* Last message will contain ads7846_rx() as the | ||
652 | * completion function. | ||
653 | */ | ||
654 | m = ts->last_msg; | ||
655 | break; | ||
656 | case ADS7846_FILTER_OK: | ||
657 | *rx_val = val; | ||
658 | ts->tc.ignore = 0; | ||
659 | m = &ts->msg[++ts->msg_idx]; | ||
660 | break; | ||
661 | default: | ||
662 | BUG(); | ||
500 | } | 663 | } |
501 | status = spi_async(ts->spi, m); | 664 | status = spi_async(ts->spi, m); |
502 | if (status) | 665 | if (status) |
@@ -504,21 +667,34 @@ static void ads7846_debounce(void *ads) | |||
504 | status); | 667 | status); |
505 | } | 668 | } |
506 | 669 | ||
507 | static void ads7846_timer(unsigned long handle) | 670 | static int ads7846_timer(struct hrtimer *handle) |
508 | { | 671 | { |
509 | struct ads7846 *ts = (void *)handle; | 672 | struct ads7846 *ts = container_of(handle, struct ads7846, timer); |
510 | int status = 0; | 673 | int status = 0; |
511 | 674 | ||
512 | spin_lock_irq(&ts->lock); | 675 | spin_lock_irq(&ts->lock); |
513 | 676 | ||
514 | if (unlikely(ts->msg_idx && !ts->pendown)) { | 677 | if (unlikely(!ts->get_pendown_state() || |
678 | device_suspended(&ts->spi->dev))) { | ||
679 | if (ts->pendown) { | ||
680 | struct input_dev *input = ts->input; | ||
681 | |||
682 | input_report_key(input, BTN_TOUCH, 0); | ||
683 | input_report_abs(input, ABS_PRESSURE, 0); | ||
684 | input_sync(input); | ||
685 | |||
686 | ts->pendown = 0; | ||
687 | #ifdef VERBOSE | ||
688 | dev_dbg(&ts->spi->dev, "UP\n"); | ||
689 | #endif | ||
690 | } | ||
691 | |||
515 | /* measurement cycle ended */ | 692 | /* measurement cycle ended */ |
516 | if (!device_suspended(&ts->spi->dev)) { | 693 | if (!device_suspended(&ts->spi->dev)) { |
517 | ts->irq_disabled = 0; | 694 | ts->irq_disabled = 0; |
518 | enable_irq(ts->spi->irq); | 695 | enable_irq(ts->spi->irq); |
519 | } | 696 | } |
520 | ts->pending = 0; | 697 | ts->pending = 0; |
521 | ts->msg_idx = 0; | ||
522 | } else { | 698 | } else { |
523 | /* pen is still down, continue with the measurement */ | 699 | /* pen is still down, continue with the measurement */ |
524 | ts->msg_idx = 0; | 700 | ts->msg_idx = 0; |
@@ -528,6 +704,7 @@ static void ads7846_timer(unsigned long handle) | |||
528 | } | 704 | } |
529 | 705 | ||
530 | spin_unlock_irq(&ts->lock); | 706 | spin_unlock_irq(&ts->lock); |
707 | return HRTIMER_NORESTART; | ||
531 | } | 708 | } |
532 | 709 | ||
533 | static irqreturn_t ads7846_irq(int irq, void *handle) | 710 | static irqreturn_t ads7846_irq(int irq, void *handle) |
@@ -546,7 +723,8 @@ static irqreturn_t ads7846_irq(int irq, void *handle) | |||
546 | ts->irq_disabled = 1; | 723 | ts->irq_disabled = 1; |
547 | disable_irq(ts->spi->irq); | 724 | disable_irq(ts->spi->irq); |
548 | ts->pending = 1; | 725 | ts->pending = 1; |
549 | mod_timer(&ts->timer, jiffies); | 726 | hrtimer_start(&ts->timer, ktime_set(0, TS_POLL_DELAY), |
727 | HRTIMER_REL); | ||
550 | } | 728 | } |
551 | } | 729 | } |
552 | spin_unlock_irqrestore(&ts->lock, flags); | 730 | spin_unlock_irqrestore(&ts->lock, flags); |
@@ -632,6 +810,7 @@ static int __devinit ads7846_probe(struct spi_device *spi) | |||
632 | struct ads7846_platform_data *pdata = spi->dev.platform_data; | 810 | struct ads7846_platform_data *pdata = spi->dev.platform_data; |
633 | struct spi_message *m; | 811 | struct spi_message *m; |
634 | struct spi_transfer *x; | 812 | struct spi_transfer *x; |
813 | int vref; | ||
635 | int err; | 814 | int err; |
636 | 815 | ||
637 | if (!spi->irq) { | 816 | if (!spi->irq) { |
@@ -665,6 +844,10 @@ static int __devinit ads7846_probe(struct spi_device *spi) | |||
665 | * may not. So we stick to very-portable 8 bit words, both RX and TX. | 844 | * may not. So we stick to very-portable 8 bit words, both RX and TX. |
666 | */ | 845 | */ |
667 | spi->bits_per_word = 8; | 846 | spi->bits_per_word = 8; |
847 | spi->mode = SPI_MODE_1; | ||
848 | err = spi_setup(spi); | ||
849 | if (err < 0) | ||
850 | return err; | ||
668 | 851 | ||
669 | ts = kzalloc(sizeof(struct ads7846), GFP_KERNEL); | 852 | ts = kzalloc(sizeof(struct ads7846), GFP_KERNEL); |
670 | input_dev = input_allocate_device(); | 853 | input_dev = input_allocate_device(); |
@@ -679,8 +862,7 @@ static int __devinit ads7846_probe(struct spi_device *spi) | |||
679 | ts->spi = spi; | 862 | ts->spi = spi; |
680 | ts->input = input_dev; | 863 | ts->input = input_dev; |
681 | 864 | ||
682 | init_timer(&ts->timer); | 865 | hrtimer_init(&ts->timer, CLOCK_MONOTONIC, HRTIMER_REL); |
683 | ts->timer.data = (unsigned long) ts; | ||
684 | ts->timer.function = ads7846_timer; | 866 | ts->timer.function = ads7846_timer; |
685 | 867 | ||
686 | spin_lock_init(&ts->lock); | 868 | spin_lock_init(&ts->lock); |
@@ -689,14 +871,25 @@ static int __devinit ads7846_probe(struct spi_device *spi) | |||
689 | ts->vref_delay_usecs = pdata->vref_delay_usecs ? : 100; | 871 | ts->vref_delay_usecs = pdata->vref_delay_usecs ? : 100; |
690 | ts->x_plate_ohms = pdata->x_plate_ohms ? : 400; | 872 | ts->x_plate_ohms = pdata->x_plate_ohms ? : 400; |
691 | ts->pressure_max = pdata->pressure_max ? : ~0; | 873 | ts->pressure_max = pdata->pressure_max ? : ~0; |
692 | if (pdata->debounce_max) { | 874 | |
875 | if (pdata->filter != NULL) { | ||
876 | if (pdata->filter_init != NULL) { | ||
877 | err = pdata->filter_init(pdata, &ts->filter_data); | ||
878 | if (err < 0) | ||
879 | goto err_free_mem; | ||
880 | } | ||
881 | ts->filter = pdata->filter; | ||
882 | ts->filter_cleanup = pdata->filter_cleanup; | ||
883 | } else if (pdata->debounce_max) { | ||
693 | ts->debounce_max = pdata->debounce_max; | 884 | ts->debounce_max = pdata->debounce_max; |
885 | if (ts->debounce_max < 2) | ||
886 | ts->debounce_max = 2; | ||
694 | ts->debounce_tol = pdata->debounce_tol; | 887 | ts->debounce_tol = pdata->debounce_tol; |
695 | ts->debounce_rep = pdata->debounce_rep; | 888 | ts->debounce_rep = pdata->debounce_rep; |
696 | if (ts->debounce_rep > ts->debounce_max + 1) | 889 | ts->filter = ads7846_debounce; |
697 | ts->debounce_rep = ts->debounce_max - 1; | 890 | ts->filter_data = ts; |
698 | } else | 891 | } else |
699 | ts->debounce_tol = ~0; | 892 | ts->filter = ads7846_no_filter; |
700 | ts->get_pendown_state = pdata->get_pendown_state; | 893 | ts->get_pendown_state = pdata->get_pendown_state; |
701 | 894 | ||
702 | snprintf(ts->phys, sizeof(ts->phys), "%s/input0", spi->dev.bus_id); | 895 | snprintf(ts->phys, sizeof(ts->phys), "%s/input0", spi->dev.bus_id); |
@@ -718,6 +911,8 @@ static int __devinit ads7846_probe(struct spi_device *spi) | |||
718 | input_set_abs_params(input_dev, ABS_PRESSURE, | 911 | input_set_abs_params(input_dev, ABS_PRESSURE, |
719 | pdata->pressure_min, pdata->pressure_max, 0, 0); | 912 | pdata->pressure_min, pdata->pressure_max, 0, 0); |
720 | 913 | ||
914 | vref = pdata->keep_vref_on; | ||
915 | |||
721 | /* set up the transfers to read touchscreen state; this assumes we | 916 | /* set up the transfers to read touchscreen state; this assumes we |
722 | * use formula #2 for pressure, not #3. | 917 | * use formula #2 for pressure, not #3. |
723 | */ | 918 | */ |
@@ -727,7 +922,7 @@ static int __devinit ads7846_probe(struct spi_device *spi) | |||
727 | spi_message_init(m); | 922 | spi_message_init(m); |
728 | 923 | ||
729 | /* y- still on; turn on only y+ (and ADC) */ | 924 | /* y- still on; turn on only y+ (and ADC) */ |
730 | ts->read_y = READ_Y; | 925 | ts->read_y = READ_Y(vref); |
731 | x->tx_buf = &ts->read_y; | 926 | x->tx_buf = &ts->read_y; |
732 | x->len = 1; | 927 | x->len = 1; |
733 | spi_message_add_tail(x, m); | 928 | spi_message_add_tail(x, m); |
@@ -737,7 +932,7 @@ static int __devinit ads7846_probe(struct spi_device *spi) | |||
737 | x->len = 2; | 932 | x->len = 2; |
738 | spi_message_add_tail(x, m); | 933 | spi_message_add_tail(x, m); |
739 | 934 | ||
740 | m->complete = ads7846_debounce; | 935 | m->complete = ads7846_rx_val; |
741 | m->context = ts; | 936 | m->context = ts; |
742 | 937 | ||
743 | m++; | 938 | m++; |
@@ -745,7 +940,7 @@ static int __devinit ads7846_probe(struct spi_device *spi) | |||
745 | 940 | ||
746 | /* turn y- off, x+ on, then leave in lowpower */ | 941 | /* turn y- off, x+ on, then leave in lowpower */ |
747 | x++; | 942 | x++; |
748 | ts->read_x = READ_X; | 943 | ts->read_x = READ_X(vref); |
749 | x->tx_buf = &ts->read_x; | 944 | x->tx_buf = &ts->read_x; |
750 | x->len = 1; | 945 | x->len = 1; |
751 | spi_message_add_tail(x, m); | 946 | spi_message_add_tail(x, m); |
@@ -755,7 +950,7 @@ static int __devinit ads7846_probe(struct spi_device *spi) | |||
755 | x->len = 2; | 950 | x->len = 2; |
756 | spi_message_add_tail(x, m); | 951 | spi_message_add_tail(x, m); |
757 | 952 | ||
758 | m->complete = ads7846_debounce; | 953 | m->complete = ads7846_rx_val; |
759 | m->context = ts; | 954 | m->context = ts; |
760 | 955 | ||
761 | /* turn y+ off, x- on; we'll use formula #2 */ | 956 | /* turn y+ off, x- on; we'll use formula #2 */ |
@@ -764,7 +959,7 @@ static int __devinit ads7846_probe(struct spi_device *spi) | |||
764 | spi_message_init(m); | 959 | spi_message_init(m); |
765 | 960 | ||
766 | x++; | 961 | x++; |
767 | ts->read_z1 = READ_Z1; | 962 | ts->read_z1 = READ_Z1(vref); |
768 | x->tx_buf = &ts->read_z1; | 963 | x->tx_buf = &ts->read_z1; |
769 | x->len = 1; | 964 | x->len = 1; |
770 | spi_message_add_tail(x, m); | 965 | spi_message_add_tail(x, m); |
@@ -774,14 +969,14 @@ static int __devinit ads7846_probe(struct spi_device *spi) | |||
774 | x->len = 2; | 969 | x->len = 2; |
775 | spi_message_add_tail(x, m); | 970 | spi_message_add_tail(x, m); |
776 | 971 | ||
777 | m->complete = ads7846_debounce; | 972 | m->complete = ads7846_rx_val; |
778 | m->context = ts; | 973 | m->context = ts; |
779 | 974 | ||
780 | m++; | 975 | m++; |
781 | spi_message_init(m); | 976 | spi_message_init(m); |
782 | 977 | ||
783 | x++; | 978 | x++; |
784 | ts->read_z2 = READ_Z2; | 979 | ts->read_z2 = READ_Z2(vref); |
785 | x->tx_buf = &ts->read_z2; | 980 | x->tx_buf = &ts->read_z2; |
786 | x->len = 1; | 981 | x->len = 1; |
787 | spi_message_add_tail(x, m); | 982 | spi_message_add_tail(x, m); |
@@ -791,7 +986,7 @@ static int __devinit ads7846_probe(struct spi_device *spi) | |||
791 | x->len = 2; | 986 | x->len = 2; |
792 | spi_message_add_tail(x, m); | 987 | spi_message_add_tail(x, m); |
793 | 988 | ||
794 | m->complete = ads7846_debounce; | 989 | m->complete = ads7846_rx_val; |
795 | m->context = ts; | 990 | m->context = ts; |
796 | } | 991 | } |
797 | 992 | ||
@@ -820,31 +1015,24 @@ static int __devinit ads7846_probe(struct spi_device *spi) | |||
820 | spi->dev.driver->name, ts)) { | 1015 | spi->dev.driver->name, ts)) { |
821 | dev_dbg(&spi->dev, "irq %d busy?\n", spi->irq); | 1016 | dev_dbg(&spi->dev, "irq %d busy?\n", spi->irq); |
822 | err = -EBUSY; | 1017 | err = -EBUSY; |
823 | goto err_free_mem; | 1018 | goto err_cleanup_filter; |
824 | } | 1019 | } |
825 | 1020 | ||
1021 | err = ads784x_hwmon_register(spi, ts); | ||
1022 | if (err) | ||
1023 | goto err_free_irq; | ||
1024 | |||
826 | dev_info(&spi->dev, "touchscreen, irq %d\n", spi->irq); | 1025 | dev_info(&spi->dev, "touchscreen, irq %d\n", spi->irq); |
827 | 1026 | ||
828 | /* take a first sample, leaving nPENIRQ active; avoid | 1027 | /* take a first sample, leaving nPENIRQ active and vREF off; avoid |
829 | * the touchscreen, in case it's not connected. | 1028 | * the touchscreen, in case it's not connected. |
830 | */ | 1029 | */ |
831 | (void) ads7846_read12_ser(&spi->dev, | 1030 | (void) ads7846_read12_ser(&spi->dev, |
832 | READ_12BIT_SER(vaux) | ADS_PD10_ALL_ON); | 1031 | READ_12BIT_SER(vaux) | ADS_PD10_ALL_ON); |
833 | 1032 | ||
834 | switch (ts->model) { | 1033 | err = sysfs_create_group(&spi->dev.kobj, &ads784x_attr_group); |
835 | case 7846: | ||
836 | ts->attr_group = &ads7846_attr_group; | ||
837 | break; | ||
838 | case 7845: | ||
839 | ts->attr_group = &ads7845_attr_group; | ||
840 | break; | ||
841 | default: | ||
842 | ts->attr_group = &ads7843_attr_group; | ||
843 | break; | ||
844 | } | ||
845 | err = sysfs_create_group(&spi->dev.kobj, ts->attr_group); | ||
846 | if (err) | 1034 | if (err) |
847 | goto err_free_irq; | 1035 | goto err_remove_hwmon; |
848 | 1036 | ||
849 | err = input_register_device(input_dev); | 1037 | err = input_register_device(input_dev); |
850 | if (err) | 1038 | if (err) |
@@ -853,9 +1041,14 @@ static int __devinit ads7846_probe(struct spi_device *spi) | |||
853 | return 0; | 1041 | return 0; |
854 | 1042 | ||
855 | err_remove_attr_group: | 1043 | err_remove_attr_group: |
856 | sysfs_remove_group(&spi->dev.kobj, ts->attr_group); | 1044 | sysfs_remove_group(&spi->dev.kobj, &ads784x_attr_group); |
1045 | err_remove_hwmon: | ||
1046 | ads784x_hwmon_unregister(spi, ts); | ||
857 | err_free_irq: | 1047 | err_free_irq: |
858 | free_irq(spi->irq, ts); | 1048 | free_irq(spi->irq, ts); |
1049 | err_cleanup_filter: | ||
1050 | if (ts->filter_cleanup) | ||
1051 | ts->filter_cleanup(ts->filter_data); | ||
859 | err_free_mem: | 1052 | err_free_mem: |
860 | input_free_device(input_dev); | 1053 | input_free_device(input_dev); |
861 | kfree(ts); | 1054 | kfree(ts); |
@@ -866,16 +1059,20 @@ static int __devexit ads7846_remove(struct spi_device *spi) | |||
866 | { | 1059 | { |
867 | struct ads7846 *ts = dev_get_drvdata(&spi->dev); | 1060 | struct ads7846 *ts = dev_get_drvdata(&spi->dev); |
868 | 1061 | ||
1062 | ads784x_hwmon_unregister(spi, ts); | ||
869 | input_unregister_device(ts->input); | 1063 | input_unregister_device(ts->input); |
870 | 1064 | ||
871 | ads7846_suspend(spi, PMSG_SUSPEND); | 1065 | ads7846_suspend(spi, PMSG_SUSPEND); |
872 | 1066 | ||
873 | sysfs_remove_group(&spi->dev.kobj, ts->attr_group); | 1067 | sysfs_remove_group(&spi->dev.kobj, &ads784x_attr_group); |
874 | 1068 | ||
875 | free_irq(ts->spi->irq, ts); | 1069 | free_irq(ts->spi->irq, ts); |
876 | /* suspend left the IRQ disabled */ | 1070 | /* suspend left the IRQ disabled */ |
877 | enable_irq(ts->spi->irq); | 1071 | enable_irq(ts->spi->irq); |
878 | 1072 | ||
1073 | if (ts->filter_cleanup) | ||
1074 | ts->filter_cleanup(ts->filter_data); | ||
1075 | |||
879 | kfree(ts); | 1076 | kfree(ts); |
880 | 1077 | ||
881 | dev_dbg(&spi->dev, "unregistered touchscreen\n"); | 1078 | dev_dbg(&spi->dev, "unregistered touchscreen\n"); |
diff --git a/drivers/usb/input/hid-ff.c b/drivers/usb/input/hid-ff.c index 5d145058a5cb..bc7f8e6f8c97 100644 --- a/drivers/usb/input/hid-ff.c +++ b/drivers/usb/input/hid-ff.c | |||
@@ -57,6 +57,7 @@ static struct hid_ff_initializer inits[] = { | |||
57 | { 0x46d, 0xc283, hid_lgff_init }, /* Logitech Wingman Force 3d */ | 57 | { 0x46d, 0xc283, hid_lgff_init }, /* Logitech Wingman Force 3d */ |
58 | { 0x46d, 0xc295, hid_lgff_init }, /* Logitech MOMO force wheel */ | 58 | { 0x46d, 0xc295, hid_lgff_init }, /* Logitech MOMO force wheel */ |
59 | { 0x46d, 0xc219, hid_lgff_init }, /* Logitech Cordless rumble pad 2 */ | 59 | { 0x46d, 0xc219, hid_lgff_init }, /* Logitech Cordless rumble pad 2 */ |
60 | { 0x46d, 0xca03, hid_lgff_init }, /* Logitech MOMO force wheel */ | ||
60 | #endif | 61 | #endif |
61 | #ifdef CONFIG_PANTHERLORD_FF | 62 | #ifdef CONFIG_PANTHERLORD_FF |
62 | { 0x810, 0x0001, hid_plff_init }, | 63 | { 0x810, 0x0001, hid_plff_init }, |
diff --git a/drivers/usb/input/hid-lgff.c b/drivers/usb/input/hid-lgff.c index 4f4fc3be192e..4df0968f852e 100644 --- a/drivers/usb/input/hid-lgff.c +++ b/drivers/usb/input/hid-lgff.c | |||
@@ -52,6 +52,7 @@ static const struct dev_type devices[] = { | |||
52 | { 0x046d, 0xc211, ff_rumble }, | 52 | { 0x046d, 0xc211, ff_rumble }, |
53 | { 0x046d, 0xc219, ff_rumble }, | 53 | { 0x046d, 0xc219, ff_rumble }, |
54 | { 0x046d, 0xc283, ff_joystick }, | 54 | { 0x046d, 0xc283, ff_joystick }, |
55 | { 0x046d, 0xca03, ff_joystick }, | ||
55 | { 0x0000, 0x0000, ff_joystick } | 56 | { 0x0000, 0x0000, ff_joystick } |
56 | }; | 57 | }; |
57 | 58 | ||