Commit aa86f26bd81a46985f1b32e513638d1c36cf3104
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input: Input: ad7877 - keep dma rx buffers in seperate cache lines Input: psmouse - reset all types of mice before reconnecting Input: elantech - use all 3 bytes when checking version Input: iforce - fix Guillemot Jet Leader 3D entry Input: iforce - add Guillemot Jet Leader Force Feedback
Showing 6 changed files Side-by-side Diff
drivers/input/joystick/iforce/iforce-main.c
... | ... | @@ -54,6 +54,9 @@ |
54 | 54 | static signed short abs_joystick[] = |
55 | 55 | { ABS_X, ABS_Y, ABS_THROTTLE, ABS_HAT0X, ABS_HAT0Y, -1 }; |
56 | 56 | |
57 | +static signed short abs_joystick_rudder[] = | |
58 | +{ ABS_X, ABS_Y, ABS_THROTTLE, ABS_RUDDER, ABS_HAT0X, ABS_HAT0Y, -1 }; | |
59 | + | |
57 | 60 | static signed short abs_avb_pegasus[] = |
58 | 61 | { ABS_X, ABS_Y, ABS_THROTTLE, ABS_RUDDER, ABS_HAT0X, ABS_HAT0Y, |
59 | 62 | ABS_HAT1X, ABS_HAT1Y, -1 }; |
60 | 63 | |
... | ... | @@ -76,8 +79,9 @@ |
76 | 79 | { 0x061c, 0xc0a4, "ACT LABS Force RS", btn_wheel, abs_wheel, ff_iforce }, //? |
77 | 80 | { 0x061c, 0xc084, "ACT LABS Force RS", btn_wheel, abs_wheel, ff_iforce }, |
78 | 81 | { 0x06f8, 0x0001, "Guillemot Race Leader Force Feedback", btn_wheel, abs_wheel, ff_iforce }, //? |
82 | + { 0x06f8, 0x0001, "Guillemot Jet Leader Force Feedback", btn_joystick, abs_joystick_rudder, ff_iforce }, | |
79 | 83 | { 0x06f8, 0x0004, "Guillemot Force Feedback Racing Wheel", btn_wheel, abs_wheel, ff_iforce }, //? |
80 | - { 0x06f8, 0x0004, "Gullemot Jet Leader 3D", btn_joystick, abs_joystick, ff_iforce }, //? | |
84 | + { 0x06f8, 0xa302, "Guillemot Jet Leader 3D", btn_joystick, abs_joystick, ff_iforce }, //? | |
81 | 85 | { 0x06d6, 0x29bc, "Trust Force Feedback Race Master", btn_wheel, abs_wheel, ff_iforce }, |
82 | 86 | { 0x0000, 0x0000, "Unknown I-Force Device [%04x:%04x]", btn_joystick, abs_joystick, ff_iforce } |
83 | 87 | }; |
drivers/input/joystick/iforce/iforce-usb.c
... | ... | @@ -212,6 +212,7 @@ |
212 | 212 | { USB_DEVICE(0x061c, 0xc0a4) }, /* ACT LABS Force RS */ |
213 | 213 | { USB_DEVICE(0x061c, 0xc084) }, /* ACT LABS Force RS */ |
214 | 214 | { USB_DEVICE(0x06f8, 0x0001) }, /* Guillemot Race Leader Force Feedback */ |
215 | + { USB_DEVICE(0x06f8, 0x0003) }, /* Guillemot Jet Leader Force Feedback */ | |
215 | 216 | { USB_DEVICE(0x06f8, 0x0004) }, /* Guillemot Force Feedback Racing Wheel */ |
216 | 217 | { USB_DEVICE(0x06f8, 0xa302) }, /* Guillemot Jet Leader 3D */ |
217 | 218 | { } /* Terminating entry */ |
drivers/input/mouse/elantech.c
... | ... | @@ -185,7 +185,7 @@ |
185 | 185 | int fingers; |
186 | 186 | static int old_fingers; |
187 | 187 | |
188 | - if (etd->fw_version_maj == 0x01) { | |
188 | + if (etd->fw_version < 0x020000) { | |
189 | 189 | /* |
190 | 190 | * byte 0: D U p1 p2 1 p3 R L |
191 | 191 | * byte 1: f 0 th tw x9 x8 y9 y8 |
... | ... | @@ -227,7 +227,7 @@ |
227 | 227 | input_report_key(dev, BTN_LEFT, packet[0] & 0x01); |
228 | 228 | input_report_key(dev, BTN_RIGHT, packet[0] & 0x02); |
229 | 229 | |
230 | - if ((etd->fw_version_maj == 0x01) && | |
230 | + if (etd->fw_version < 0x020000 && | |
231 | 231 | (etd->capabilities & ETP_CAP_HAS_ROCKER)) { |
232 | 232 | /* rocker up */ |
233 | 233 | input_report_key(dev, BTN_FORWARD, packet[0] & 0x40); |
... | ... | @@ -321,7 +321,7 @@ |
321 | 321 | unsigned char p1, p2, p3; |
322 | 322 | |
323 | 323 | /* Parity bits are placed differently */ |
324 | - if (etd->fw_version_maj == 0x01) { | |
324 | + if (etd->fw_version < 0x020000) { | |
325 | 325 | /* byte 0: D U p1 p2 1 p3 R L */ |
326 | 326 | p1 = (packet[0] & 0x20) >> 5; |
327 | 327 | p2 = (packet[0] & 0x10) >> 4; |
... | ... | @@ -457,7 +457,7 @@ |
457 | 457 | switch (etd->hw_version) { |
458 | 458 | case 1: |
459 | 459 | /* Rocker button */ |
460 | - if ((etd->fw_version_maj == 0x01) && | |
460 | + if (etd->fw_version < 0x020000 && | |
461 | 461 | (etd->capabilities & ETP_CAP_HAS_ROCKER)) { |
462 | 462 | __set_bit(BTN_FORWARD, dev->keybit); |
463 | 463 | __set_bit(BTN_BACK, dev->keybit); |
464 | 464 | |
465 | 465 | |
... | ... | @@ -686,15 +686,14 @@ |
686 | 686 | pr_err("elantech.c: failed to query firmware version.\n"); |
687 | 687 | goto init_fail; |
688 | 688 | } |
689 | - etd->fw_version_maj = param[0]; | |
690 | - etd->fw_version_min = param[2]; | |
691 | 689 | |
690 | + etd->fw_version = (param[0] << 16) | (param[1] << 8) | param[2]; | |
691 | + | |
692 | 692 | /* |
693 | 693 | * Assume every version greater than this is new EeePC style |
694 | 694 | * hardware with 6 byte packets |
695 | 695 | */ |
696 | - if ((etd->fw_version_maj == 0x02 && etd->fw_version_min >= 0x30) || | |
697 | - etd->fw_version_maj > 0x02) { | |
696 | + if (etd->fw_version >= 0x020030) { | |
698 | 697 | etd->hw_version = 2; |
699 | 698 | /* For now show extra debug information */ |
700 | 699 | etd->debug = 1; |
701 | 700 | |
... | ... | @@ -704,9 +703,10 @@ |
704 | 703 | etd->hw_version = 1; |
705 | 704 | etd->paritycheck = 1; |
706 | 705 | } |
707 | - pr_info("elantech.c: assuming hardware version %d, firmware version %d.%d\n", | |
708 | - etd->hw_version, etd->fw_version_maj, etd->fw_version_min); | |
709 | 706 | |
707 | + pr_info("elantech.c: assuming hardware version %d, firmware version %d.%d.%d\n", | |
708 | + etd->hw_version, param[0], param[1], param[2]); | |
709 | + | |
710 | 710 | if (synaptics_send_cmd(psmouse, ETP_CAPABILITIES_QUERY, param)) { |
711 | 711 | pr_err("elantech.c: failed to query capabilities.\n"); |
712 | 712 | goto init_fail; |
... | ... | @@ -720,8 +720,8 @@ |
720 | 720 | * a touch action starts causing the mouse cursor or scrolled page |
721 | 721 | * to jump. Enable a workaround. |
722 | 722 | */ |
723 | - if (etd->fw_version_maj == 0x02 && etd->fw_version_min == 0x22) { | |
724 | - pr_info("elantech.c: firmware version 2.34 detected, " | |
723 | + if (etd->fw_version == 0x020022) { | |
724 | + pr_info("elantech.c: firmware version 2.0.34 detected, " | |
725 | 725 | "enabling jumpy cursor workaround\n"); |
726 | 726 | etd->jumpy_cursor = 1; |
727 | 727 | } |
drivers/input/mouse/elantech.h
... | ... | @@ -100,11 +100,10 @@ |
100 | 100 | unsigned char reg_26; |
101 | 101 | unsigned char debug; |
102 | 102 | unsigned char capabilities; |
103 | - unsigned char fw_version_maj; | |
104 | - unsigned char fw_version_min; | |
105 | - unsigned char hw_version; | |
106 | 103 | unsigned char paritycheck; |
107 | 104 | unsigned char jumpy_cursor; |
105 | + unsigned char hw_version; | |
106 | + unsigned int fw_version; | |
108 | 107 | unsigned char parity[256]; |
109 | 108 | }; |
110 | 109 |
drivers/input/mouse/psmouse-base.c
... | ... | @@ -1394,6 +1394,7 @@ |
1394 | 1394 | struct psmouse *psmouse = serio_get_drvdata(serio); |
1395 | 1395 | struct psmouse *parent = NULL; |
1396 | 1396 | struct serio_driver *drv = serio->drv; |
1397 | + unsigned char type; | |
1397 | 1398 | int rc = -1; |
1398 | 1399 | |
1399 | 1400 | if (!drv || !psmouse) { |
... | ... | @@ -1413,10 +1414,15 @@ |
1413 | 1414 | if (psmouse->reconnect) { |
1414 | 1415 | if (psmouse->reconnect(psmouse)) |
1415 | 1416 | goto out; |
1416 | - } else if (psmouse_probe(psmouse) < 0 || | |
1417 | - psmouse->type != psmouse_extensions(psmouse, | |
1418 | - psmouse_max_proto, false)) { | |
1419 | - goto out; | |
1417 | + } else { | |
1418 | + psmouse_reset(psmouse); | |
1419 | + | |
1420 | + if (psmouse_probe(psmouse) < 0) | |
1421 | + goto out; | |
1422 | + | |
1423 | + type = psmouse_extensions(psmouse, psmouse_max_proto, false); | |
1424 | + if (psmouse->type != type) | |
1425 | + goto out; | |
1420 | 1426 | } |
1421 | 1427 | |
1422 | 1428 | /* ok, the device type (and capabilities) match the old one, |
drivers/input/touchscreen/ad7877.c
... | ... | @@ -156,9 +156,14 @@ |
156 | 156 | u16 reset; |
157 | 157 | u16 ref_on; |
158 | 158 | u16 command; |
159 | - u16 sample; | |
160 | 159 | struct spi_message msg; |
161 | 160 | struct spi_transfer xfer[6]; |
161 | + | |
162 | + /* | |
163 | + * DMA (thus cache coherency maintenance) requires the | |
164 | + * transfer buffers to live in their own cache lines. | |
165 | + */ | |
166 | + u16 sample ____cacheline_aligned; | |
162 | 167 | }; |
163 | 168 | |
164 | 169 | struct ad7877 { |
... | ... | @@ -182,8 +187,6 @@ |
182 | 187 | u8 averaging; |
183 | 188 | u8 pen_down_acc_interval; |
184 | 189 | |
185 | - u16 conversion_data[AD7877_NR_SENSE]; | |
186 | - | |
187 | 190 | struct spi_transfer xfer[AD7877_NR_SENSE + 2]; |
188 | 191 | struct spi_message msg; |
189 | 192 | |
... | ... | @@ -195,6 +198,12 @@ |
195 | 198 | spinlock_t lock; |
196 | 199 | struct timer_list timer; /* P: lock */ |
197 | 200 | unsigned pending:1; /* P: lock */ |
201 | + | |
202 | + /* | |
203 | + * DMA (thus cache coherency maintenance) requires the | |
204 | + * transfer buffers to live in their own cache lines. | |
205 | + */ | |
206 | + u16 conversion_data[AD7877_NR_SENSE] ____cacheline_aligned; | |
198 | 207 | }; |
199 | 208 | |
200 | 209 | static int gpio3; |