diff options
-rw-r--r-- | Documentation/input/elantech.txt | 81 | ||||
-rw-r--r-- | Documentation/kernel-parameters.txt | 2 | ||||
-rw-r--r-- | drivers/input/joystick/xpad.c | 18 | ||||
-rw-r--r-- | drivers/input/keyboard/opencores-kbd.c | 2 | ||||
-rw-r--r-- | drivers/input/keyboard/stmpe-keypad.c | 2 | ||||
-rw-r--r-- | drivers/input/misc/ims-pcu.c | 2 | ||||
-rw-r--r-- | drivers/input/misc/max77693-haptic.c | 7 | ||||
-rw-r--r-- | drivers/input/misc/soc_button_array.c | 2 | ||||
-rw-r--r-- | drivers/input/misc/twl4030-pwrbutton.c | 1 | ||||
-rw-r--r-- | drivers/input/misc/xen-kbdfront.c | 4 | ||||
-rw-r--r-- | drivers/input/mouse/alps.c | 32 | ||||
-rw-r--r-- | drivers/input/mouse/elantech.c | 64 | ||||
-rw-r--r-- | drivers/input/mouse/psmouse-base.c | 7 | ||||
-rw-r--r-- | drivers/input/mouse/synaptics.c | 9 | ||||
-rw-r--r-- | drivers/input/mouse/vsxxxaa.c | 2 | ||||
-rw-r--r-- | drivers/input/serio/altera_ps2.c | 4 | ||||
-rw-r--r-- | drivers/input/serio/i8042-x86ia64io.h | 297 | ||||
-rw-r--r-- | drivers/input/serio/i8042.c | 2 | ||||
-rw-r--r-- | drivers/input/touchscreen/wm97xx-core.c | 4 |
19 files changed, 484 insertions, 58 deletions
diff --git a/Documentation/input/elantech.txt b/Documentation/input/elantech.txt index e1ae127ed099..1ec0db7879d3 100644 --- a/Documentation/input/elantech.txt +++ b/Documentation/input/elantech.txt | |||
@@ -38,22 +38,38 @@ Contents | |||
38 | 7.2.1 Status packet | 38 | 7.2.1 Status packet |
39 | 7.2.2 Head packet | 39 | 7.2.2 Head packet |
40 | 7.2.3 Motion packet | 40 | 7.2.3 Motion packet |
41 | 8. Trackpoint (for Hardware version 3 and 4) | ||
42 | 8.1 Registers | ||
43 | 8.2 Native relative mode 6 byte packet format | ||
44 | 8.2.1 Status Packet | ||
41 | 45 | ||
42 | 46 | ||
43 | 47 | ||
44 | 1. Introduction | 48 | 1. Introduction |
45 | ~~~~~~~~~~~~ | 49 | ~~~~~~~~~~~~ |
46 | 50 | ||
47 | Currently the Linux Elantech touchpad driver is aware of two different | 51 | Currently the Linux Elantech touchpad driver is aware of four different |
48 | hardware versions unimaginatively called version 1 and version 2. Version 1 | 52 | hardware versions unimaginatively called version 1,version 2, version 3 |
49 | is found in "older" laptops and uses 4 bytes per packet. Version 2 seems to | 53 | and version 4. Version 1 is found in "older" laptops and uses 4 bytes per |
50 | be introduced with the EeePC and uses 6 bytes per packet, and provides | 54 | packet. Version 2 seems to be introduced with the EeePC and uses 6 bytes |
51 | additional features such as position of two fingers, and width of the touch. | 55 | per packet, and provides additional features such as position of two fingers, |
56 | and width of the touch. Hardware version 3 uses 6 bytes per packet (and | ||
57 | for 2 fingers the concatenation of two 6 bytes packets) and allows tracking | ||
58 | of up to 3 fingers. Hardware version 4 uses 6 bytes per packet, and can | ||
59 | combine a status packet with multiple head or motion packets. Hardware version | ||
60 | 4 allows tracking up to 5 fingers. | ||
61 | |||
62 | Some Hardware version 3 and version 4 also have a trackpoint which uses a | ||
63 | separate packet format. It is also 6 bytes per packet. | ||
52 | 64 | ||
53 | The driver tries to support both hardware versions and should be compatible | 65 | The driver tries to support both hardware versions and should be compatible |
54 | with the Xorg Synaptics touchpad driver and its graphical configuration | 66 | with the Xorg Synaptics touchpad driver and its graphical configuration |
55 | utilities. | 67 | utilities. |
56 | 68 | ||
69 | Note that a mouse button is also associated with either the touchpad or the | ||
70 | trackpoint when a trackpoint is available. Disabling the Touchpad in xorg | ||
71 | (TouchPadOff=0) will also disable the buttons associated with the touchpad. | ||
72 | |||
57 | Additionally the operation of the touchpad can be altered by adjusting the | 73 | Additionally the operation of the touchpad can be altered by adjusting the |
58 | contents of some of its internal registers. These registers are represented | 74 | contents of some of its internal registers. These registers are represented |
59 | by the driver as sysfs entries under /sys/bus/serio/drivers/psmouse/serio? | 75 | by the driver as sysfs entries under /sys/bus/serio/drivers/psmouse/serio? |
@@ -78,7 +94,7 @@ completeness sake. | |||
78 | 2. Extra knobs | 94 | 2. Extra knobs |
79 | ~~~~~~~~~~~ | 95 | ~~~~~~~~~~~ |
80 | 96 | ||
81 | Currently the Linux Elantech touchpad driver provides two extra knobs under | 97 | Currently the Linux Elantech touchpad driver provides three extra knobs under |
82 | /sys/bus/serio/drivers/psmouse/serio? for the user. | 98 | /sys/bus/serio/drivers/psmouse/serio? for the user. |
83 | 99 | ||
84 | * debug | 100 | * debug |
@@ -112,6 +128,20 @@ Currently the Linux Elantech touchpad driver provides two extra knobs under | |||
112 | data consistency checking can be done. For now checking is disabled by | 128 | data consistency checking can be done. For now checking is disabled by |
113 | default. Currently even turning it on will do nothing. | 129 | default. Currently even turning it on will do nothing. |
114 | 130 | ||
131 | * crc_enabled | ||
132 | |||
133 | Sets crc_enabled to 0/1. The name "crc_enabled" is the official name of | ||
134 | this integrity check, even though it is not an actual cyclic redundancy | ||
135 | check. | ||
136 | |||
137 | Depending on the state of crc_enabled, certain basic data integrity | ||
138 | verification is done by the driver on hardware version 3 and 4. The | ||
139 | driver will reject any packet that appears corrupted. Using this knob, | ||
140 | The state of crc_enabled can be altered with this knob. | ||
141 | |||
142 | Reading the crc_enabled value will show the active value. Echoing | ||
143 | "0" or "1" to this file will set the state to "0" or "1". | ||
144 | |||
115 | ///////////////////////////////////////////////////////////////////////////// | 145 | ///////////////////////////////////////////////////////////////////////////// |
116 | 146 | ||
117 | 3. Differentiating hardware versions | 147 | 3. Differentiating hardware versions |
@@ -746,3 +776,42 @@ byte 5: | |||
746 | 776 | ||
747 | byte 0 ~ 2 for one finger | 777 | byte 0 ~ 2 for one finger |
748 | byte 3 ~ 5 for another | 778 | byte 3 ~ 5 for another |
779 | |||
780 | |||
781 | 8. Trackpoint (for Hardware version 3 and 4) | ||
782 | ========================================= | ||
783 | 8.1 Registers | ||
784 | ~~~~~~~~~ | ||
785 | No special registers have been identified. | ||
786 | |||
787 | 8.2 Native relative mode 6 byte packet format | ||
788 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
789 | 8.2.1 Status Packet | ||
790 | ~~~~~~~~~~~~~ | ||
791 | |||
792 | byte 0: | ||
793 | bit 7 6 5 4 3 2 1 0 | ||
794 | 0 0 sx sy 0 M R L | ||
795 | byte 1: | ||
796 | bit 7 6 5 4 3 2 1 0 | ||
797 | ~sx 0 0 0 0 0 0 0 | ||
798 | byte 2: | ||
799 | bit 7 6 5 4 3 2 1 0 | ||
800 | ~sy 0 0 0 0 0 0 0 | ||
801 | byte 3: | ||
802 | bit 7 6 5 4 3 2 1 0 | ||
803 | 0 0 ~sy ~sx 0 1 1 0 | ||
804 | byte 4: | ||
805 | bit 7 6 5 4 3 2 1 0 | ||
806 | x7 x6 x5 x4 x3 x2 x1 x0 | ||
807 | byte 5: | ||
808 | bit 7 6 5 4 3 2 1 0 | ||
809 | y7 y6 y5 y4 y3 y2 y1 y0 | ||
810 | |||
811 | |||
812 | x and y are written in two's complement spread | ||
813 | over 9 bits with sx/sy the relative top bit and | ||
814 | x7..x0 and y7..y0 the lower bits. | ||
815 | ~sx is the inverse of sx, ~sy is the inverse of sy. | ||
816 | The sign of y is opposite to what the input driver | ||
817 | expects for a relative movement | ||
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index 6b1054387023..10d51c2f10d7 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
@@ -1237,7 +1237,7 @@ bytes respectively. Such letter suffixes can also be entirely omitted. | |||
1237 | i8042.noloop [HW] Disable the AUX Loopback command while probing | 1237 | i8042.noloop [HW] Disable the AUX Loopback command while probing |
1238 | for the AUX port | 1238 | for the AUX port |
1239 | i8042.nomux [HW] Don't check presence of an active multiplexing | 1239 | i8042.nomux [HW] Don't check presence of an active multiplexing |
1240 | controller. Default: true. | 1240 | controller |
1241 | i8042.nopnp [HW] Don't use ACPIPnP / PnPBIOS to discover KBD/AUX | 1241 | i8042.nopnp [HW] Don't use ACPIPnP / PnPBIOS to discover KBD/AUX |
1242 | controllers | 1242 | controllers |
1243 | i8042.notimeout [HW] Ignore timeout condition signalled by controller | 1243 | i8042.notimeout [HW] Ignore timeout condition signalled by controller |
diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c index 36281eeabb19..3aa2f3f3da5b 100644 --- a/drivers/input/joystick/xpad.c +++ b/drivers/input/joystick/xpad.c | |||
@@ -209,6 +209,7 @@ static const struct xpad_device { | |||
209 | { 0x24c6, 0x5501, "Hori Real Arcade Pro VX-SA", 0, XTYPE_XBOX360 }, | 209 | { 0x24c6, 0x5501, "Hori Real Arcade Pro VX-SA", 0, XTYPE_XBOX360 }, |
210 | { 0x24c6, 0x5506, "Hori SOULCALIBUR V Stick", 0, XTYPE_XBOX360 }, | 210 | { 0x24c6, 0x5506, "Hori SOULCALIBUR V Stick", 0, XTYPE_XBOX360 }, |
211 | { 0x24c6, 0x5b02, "Thrustmaster, Inc. GPX Controller", 0, XTYPE_XBOX360 }, | 211 | { 0x24c6, 0x5b02, "Thrustmaster, Inc. GPX Controller", 0, XTYPE_XBOX360 }, |
212 | { 0x24c6, 0x5b03, "Thrustmaster Ferrari 458 Racing Wheel", 0, XTYPE_XBOX360 }, | ||
212 | { 0xffff, 0xffff, "Chinese-made Xbox Controller", 0, XTYPE_XBOX }, | 213 | { 0xffff, 0xffff, "Chinese-made Xbox Controller", 0, XTYPE_XBOX }, |
213 | { 0x0000, 0x0000, "Generic X-Box pad", 0, XTYPE_UNKNOWN } | 214 | { 0x0000, 0x0000, "Generic X-Box pad", 0, XTYPE_UNKNOWN } |
214 | }; | 215 | }; |
@@ -292,6 +293,7 @@ static const signed short xpad_abs_triggers[] = { | |||
292 | 293 | ||
293 | static struct usb_device_id xpad_table[] = { | 294 | static struct usb_device_id xpad_table[] = { |
294 | { USB_INTERFACE_INFO('X', 'B', 0) }, /* X-Box USB-IF not approved class */ | 295 | { USB_INTERFACE_INFO('X', 'B', 0) }, /* X-Box USB-IF not approved class */ |
296 | XPAD_XBOX360_VENDOR(0x044f), /* Thrustmaster X-Box 360 controllers */ | ||
295 | XPAD_XBOX360_VENDOR(0x045e), /* Microsoft X-Box 360 controllers */ | 297 | XPAD_XBOX360_VENDOR(0x045e), /* Microsoft X-Box 360 controllers */ |
296 | XPAD_XBOXONE_VENDOR(0x045e), /* Microsoft X-Box One controllers */ | 298 | XPAD_XBOXONE_VENDOR(0x045e), /* Microsoft X-Box One controllers */ |
297 | XPAD_XBOX360_VENDOR(0x046d), /* Logitech X-Box 360 style controllers */ | 299 | XPAD_XBOX360_VENDOR(0x046d), /* Logitech X-Box 360 style controllers */ |
@@ -1177,9 +1179,19 @@ static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id | |||
1177 | } | 1179 | } |
1178 | 1180 | ||
1179 | ep_irq_in = &intf->cur_altsetting->endpoint[1].desc; | 1181 | ep_irq_in = &intf->cur_altsetting->endpoint[1].desc; |
1180 | usb_fill_bulk_urb(xpad->bulk_out, udev, | 1182 | if (usb_endpoint_is_bulk_out(ep_irq_in)) { |
1181 | usb_sndbulkpipe(udev, ep_irq_in->bEndpointAddress), | 1183 | usb_fill_bulk_urb(xpad->bulk_out, udev, |
1182 | xpad->bdata, XPAD_PKT_LEN, xpad_bulk_out, xpad); | 1184 | usb_sndbulkpipe(udev, |
1185 | ep_irq_in->bEndpointAddress), | ||
1186 | xpad->bdata, XPAD_PKT_LEN, | ||
1187 | xpad_bulk_out, xpad); | ||
1188 | } else { | ||
1189 | usb_fill_int_urb(xpad->bulk_out, udev, | ||
1190 | usb_sndintpipe(udev, | ||
1191 | ep_irq_in->bEndpointAddress), | ||
1192 | xpad->bdata, XPAD_PKT_LEN, | ||
1193 | xpad_bulk_out, xpad, 0); | ||
1194 | } | ||
1183 | 1195 | ||
1184 | /* | 1196 | /* |
1185 | * Submit the int URB immediately rather than waiting for open | 1197 | * Submit the int URB immediately rather than waiting for open |
diff --git a/drivers/input/keyboard/opencores-kbd.c b/drivers/input/keyboard/opencores-kbd.c index 62abe2c16670..f8502bb29176 100644 --- a/drivers/input/keyboard/opencores-kbd.c +++ b/drivers/input/keyboard/opencores-kbd.c | |||
@@ -70,7 +70,7 @@ static int opencores_kbd_probe(struct platform_device *pdev) | |||
70 | 70 | ||
71 | opencores_kbd->addr = devm_ioremap_resource(&pdev->dev, res); | 71 | opencores_kbd->addr = devm_ioremap_resource(&pdev->dev, res); |
72 | if (IS_ERR(opencores_kbd->addr)) | 72 | if (IS_ERR(opencores_kbd->addr)) |
73 | error = PTR_ERR(opencores_kbd->addr); | 73 | return PTR_ERR(opencores_kbd->addr); |
74 | 74 | ||
75 | input->name = pdev->name; | 75 | input->name = pdev->name; |
76 | input->phys = "opencores-kbd/input0"; | 76 | input->phys = "opencores-kbd/input0"; |
diff --git a/drivers/input/keyboard/stmpe-keypad.c b/drivers/input/keyboard/stmpe-keypad.c index c6727dda68f2..ef5e67fb567e 100644 --- a/drivers/input/keyboard/stmpe-keypad.c +++ b/drivers/input/keyboard/stmpe-keypad.c | |||
@@ -86,7 +86,7 @@ static const struct stmpe_keypad_variant stmpe_keypad_variants[] = { | |||
86 | .max_cols = 8, | 86 | .max_cols = 8, |
87 | .max_rows = 12, | 87 | .max_rows = 12, |
88 | .col_gpios = 0x0000ff, /* GPIO 0 - 7*/ | 88 | .col_gpios = 0x0000ff, /* GPIO 0 - 7*/ |
89 | .row_gpios = 0x1fef00, /* GPIO 8-14, 16-20 */ | 89 | .row_gpios = 0x1f7f00, /* GPIO 8-14, 16-20 */ |
90 | }, | 90 | }, |
91 | [STMPE2403] = { | 91 | [STMPE2403] = { |
92 | .auto_increment = true, | 92 | .auto_increment = true, |
diff --git a/drivers/input/misc/ims-pcu.c b/drivers/input/misc/ims-pcu.c index 69caee906ecd..ac1fa5f44580 100644 --- a/drivers/input/misc/ims-pcu.c +++ b/drivers/input/misc/ims-pcu.c | |||
@@ -1381,7 +1381,7 @@ static ssize_t ims_pcu_ofn_reg_addr_store(struct device *dev, | |||
1381 | pcu->ofn_reg_addr = value; | 1381 | pcu->ofn_reg_addr = value; |
1382 | mutex_unlock(&pcu->cmd_mutex); | 1382 | mutex_unlock(&pcu->cmd_mutex); |
1383 | 1383 | ||
1384 | return error ?: count; | 1384 | return count; |
1385 | } | 1385 | } |
1386 | 1386 | ||
1387 | static DEVICE_ATTR(reg_addr, S_IRUGO | S_IWUSR, | 1387 | static DEVICE_ATTR(reg_addr, S_IRUGO | S_IWUSR, |
diff --git a/drivers/input/misc/max77693-haptic.c b/drivers/input/misc/max77693-haptic.c index 0ee3e8b45e8b..157a1f50c015 100644 --- a/drivers/input/misc/max77693-haptic.c +++ b/drivers/input/misc/max77693-haptic.c | |||
@@ -152,7 +152,7 @@ static void max77693_haptic_disable(struct max77693_haptic *haptic) | |||
152 | { | 152 | { |
153 | int error; | 153 | int error; |
154 | 154 | ||
155 | if (haptic->enabled) | 155 | if (!haptic->enabled) |
156 | return; | 156 | return; |
157 | 157 | ||
158 | error = max77693_haptic_configure(haptic, false); | 158 | error = max77693_haptic_configure(haptic, false); |
@@ -194,7 +194,7 @@ static int max77693_haptic_play_effect(struct input_dev *dev, void *data, | |||
194 | struct ff_effect *effect) | 194 | struct ff_effect *effect) |
195 | { | 195 | { |
196 | struct max77693_haptic *haptic = input_get_drvdata(dev); | 196 | struct max77693_haptic *haptic = input_get_drvdata(dev); |
197 | uint64_t period_mag_multi; | 197 | u64 period_mag_multi; |
198 | 198 | ||
199 | haptic->magnitude = effect->u.rumble.strong_magnitude; | 199 | haptic->magnitude = effect->u.rumble.strong_magnitude; |
200 | if (!haptic->magnitude) | 200 | if (!haptic->magnitude) |
@@ -205,8 +205,7 @@ static int max77693_haptic_play_effect(struct input_dev *dev, void *data, | |||
205 | * The formula to convert magnitude to pwm_duty as follows: | 205 | * The formula to convert magnitude to pwm_duty as follows: |
206 | * - pwm_duty = (magnitude * pwm_period) / MAX_MAGNITUDE(0xFFFF) | 206 | * - pwm_duty = (magnitude * pwm_period) / MAX_MAGNITUDE(0xFFFF) |
207 | */ | 207 | */ |
208 | period_mag_multi = (int64_t)(haptic->pwm_dev->period * | 208 | period_mag_multi = (u64)haptic->pwm_dev->period * haptic->magnitude; |
209 | haptic->magnitude); | ||
210 | haptic->pwm_duty = (unsigned int)(period_mag_multi >> | 209 | haptic->pwm_duty = (unsigned int)(period_mag_multi >> |
211 | MAX_MAGNITUDE_SHIFT); | 210 | MAX_MAGNITUDE_SHIFT); |
212 | 211 | ||
diff --git a/drivers/input/misc/soc_button_array.c b/drivers/input/misc/soc_button_array.c index 735604753568..e097f1ab427f 100644 --- a/drivers/input/misc/soc_button_array.c +++ b/drivers/input/misc/soc_button_array.c | |||
@@ -55,7 +55,7 @@ static int soc_button_lookup_gpio(struct device *dev, int acpi_index) | |||
55 | struct gpio_desc *desc; | 55 | struct gpio_desc *desc; |
56 | int gpio; | 56 | int gpio; |
57 | 57 | ||
58 | desc = gpiod_get_index(dev, KBUILD_MODNAME, acpi_index); | 58 | desc = gpiod_get_index(dev, KBUILD_MODNAME, acpi_index, GPIOD_ASIS); |
59 | if (IS_ERR(desc)) | 59 | if (IS_ERR(desc)) |
60 | return PTR_ERR(desc); | 60 | return PTR_ERR(desc); |
61 | 61 | ||
diff --git a/drivers/input/misc/twl4030-pwrbutton.c b/drivers/input/misc/twl4030-pwrbutton.c index fb3b63b2f85c..8400a1a34d87 100644 --- a/drivers/input/misc/twl4030-pwrbutton.c +++ b/drivers/input/misc/twl4030-pwrbutton.c | |||
@@ -85,6 +85,7 @@ static int twl4030_pwrbutton_probe(struct platform_device *pdev) | |||
85 | } | 85 | } |
86 | 86 | ||
87 | platform_set_drvdata(pdev, pwr); | 87 | platform_set_drvdata(pdev, pwr); |
88 | device_init_wakeup(&pdev->dev, true); | ||
88 | 89 | ||
89 | return 0; | 90 | return 0; |
90 | } | 91 | } |
diff --git a/drivers/input/misc/xen-kbdfront.c b/drivers/input/misc/xen-kbdfront.c index fbfdc10573be..e2ecfc6e633d 100644 --- a/drivers/input/misc/xen-kbdfront.c +++ b/drivers/input/misc/xen-kbdfront.c | |||
@@ -285,7 +285,7 @@ static int xenkbd_connect_backend(struct xenbus_device *dev, | |||
285 | error_evtchan: | 285 | error_evtchan: |
286 | xenbus_free_evtchn(dev, evtchn); | 286 | xenbus_free_evtchn(dev, evtchn); |
287 | error_grant: | 287 | error_grant: |
288 | gnttab_end_foreign_access_ref(info->gref, 0); | 288 | gnttab_end_foreign_access(info->gref, 0, 0UL); |
289 | info->gref = -1; | 289 | info->gref = -1; |
290 | return ret; | 290 | return ret; |
291 | } | 291 | } |
@@ -296,7 +296,7 @@ static void xenkbd_disconnect_backend(struct xenkbd_info *info) | |||
296 | unbind_from_irqhandler(info->irq, info); | 296 | unbind_from_irqhandler(info->irq, info); |
297 | info->irq = -1; | 297 | info->irq = -1; |
298 | if (info->gref >= 0) | 298 | if (info->gref >= 0) |
299 | gnttab_end_foreign_access_ref(info->gref, 0); | 299 | gnttab_end_foreign_access(info->gref, 0, 0UL); |
300 | info->gref = -1; | 300 | info->gref = -1; |
301 | } | 301 | } |
302 | 302 | ||
diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c index 35a49bf57227..d125a019383f 100644 --- a/drivers/input/mouse/alps.c +++ b/drivers/input/mouse/alps.c | |||
@@ -835,8 +835,8 @@ static void alps_process_packet_v4(struct psmouse *psmouse) | |||
835 | f->fingers = alps_process_bitmap(priv, f); | 835 | f->fingers = alps_process_bitmap(priv, f); |
836 | } | 836 | } |
837 | 837 | ||
838 | f->left = packet[4] & 0x01; | 838 | f->left = !!(packet[4] & 0x01); |
839 | f->right = packet[4] & 0x02; | 839 | f->right = !!(packet[4] & 0x02); |
840 | 840 | ||
841 | f->st.x = ((packet[1] & 0x7f) << 4) | ((packet[3] & 0x30) >> 2) | | 841 | f->st.x = ((packet[1] & 0x7f) << 4) | ((packet[3] & 0x30) >> 2) | |
842 | ((packet[0] & 0x30) >> 4); | 842 | ((packet[0] & 0x30) >> 4); |
@@ -1156,7 +1156,13 @@ static psmouse_ret_t alps_process_byte(struct psmouse *psmouse) | |||
1156 | { | 1156 | { |
1157 | struct alps_data *priv = psmouse->private; | 1157 | struct alps_data *priv = psmouse->private; |
1158 | 1158 | ||
1159 | if ((psmouse->packet[0] & 0xc8) == 0x08) { /* PS/2 packet */ | 1159 | /* |
1160 | * Check if we are dealing with a bare PS/2 packet, presumably from | ||
1161 | * a device connected to the external PS/2 port. Because bare PS/2 | ||
1162 | * protocol does not have enough constant bits to self-synchronize | ||
1163 | * properly we only do this if the device is fully synchronized. | ||
1164 | */ | ||
1165 | if (!psmouse->out_of_sync_cnt && (psmouse->packet[0] & 0xc8) == 0x08) { | ||
1160 | if (psmouse->pktcnt == 3) { | 1166 | if (psmouse->pktcnt == 3) { |
1161 | alps_report_bare_ps2_packet(psmouse, psmouse->packet, | 1167 | alps_report_bare_ps2_packet(psmouse, psmouse->packet, |
1162 | true); | 1168 | true); |
@@ -1180,12 +1186,27 @@ static psmouse_ret_t alps_process_byte(struct psmouse *psmouse) | |||
1180 | } | 1186 | } |
1181 | 1187 | ||
1182 | /* Bytes 2 - pktsize should have 0 in the highest bit */ | 1188 | /* Bytes 2 - pktsize should have 0 in the highest bit */ |
1183 | if ((priv->proto_version < ALPS_PROTO_V5) && | 1189 | if (priv->proto_version < ALPS_PROTO_V5 && |
1184 | psmouse->pktcnt >= 2 && psmouse->pktcnt <= psmouse->pktsize && | 1190 | psmouse->pktcnt >= 2 && psmouse->pktcnt <= psmouse->pktsize && |
1185 | (psmouse->packet[psmouse->pktcnt - 1] & 0x80)) { | 1191 | (psmouse->packet[psmouse->pktcnt - 1] & 0x80)) { |
1186 | psmouse_dbg(psmouse, "refusing packet[%i] = %x\n", | 1192 | psmouse_dbg(psmouse, "refusing packet[%i] = %x\n", |
1187 | psmouse->pktcnt - 1, | 1193 | psmouse->pktcnt - 1, |
1188 | psmouse->packet[psmouse->pktcnt - 1]); | 1194 | psmouse->packet[psmouse->pktcnt - 1]); |
1195 | |||
1196 | if (priv->proto_version == ALPS_PROTO_V3 && | ||
1197 | psmouse->pktcnt == psmouse->pktsize) { | ||
1198 | /* | ||
1199 | * Some Dell boxes, such as Latitude E6440 or E7440 | ||
1200 | * with closed lid, quite often smash last byte of | ||
1201 | * otherwise valid packet with 0xff. Given that the | ||
1202 | * next packet is very likely to be valid let's | ||
1203 | * report PSMOUSE_FULL_PACKET but not process data, | ||
1204 | * rather than reporting PSMOUSE_BAD_DATA and | ||
1205 | * filling the logs. | ||
1206 | */ | ||
1207 | return PSMOUSE_FULL_PACKET; | ||
1208 | } | ||
1209 | |||
1189 | return PSMOUSE_BAD_DATA; | 1210 | return PSMOUSE_BAD_DATA; |
1190 | } | 1211 | } |
1191 | 1212 | ||
@@ -2389,6 +2410,9 @@ int alps_init(struct psmouse *psmouse) | |||
2389 | /* We are having trouble resyncing ALPS touchpads so disable it for now */ | 2410 | /* We are having trouble resyncing ALPS touchpads so disable it for now */ |
2390 | psmouse->resync_time = 0; | 2411 | psmouse->resync_time = 0; |
2391 | 2412 | ||
2413 | /* Allow 2 invalid packets without resetting device */ | ||
2414 | psmouse->resetafter = psmouse->pktsize * 2; | ||
2415 | |||
2392 | return 0; | 2416 | return 0; |
2393 | 2417 | ||
2394 | init_fail: | 2418 | init_fail: |
diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c index 06fc6e76ffbe..f2b978026407 100644 --- a/drivers/input/mouse/elantech.c +++ b/drivers/input/mouse/elantech.c | |||
@@ -428,14 +428,6 @@ static void elantech_report_trackpoint(struct psmouse *psmouse, | |||
428 | int x, y; | 428 | int x, y; |
429 | u32 t; | 429 | u32 t; |
430 | 430 | ||
431 | if (dev_WARN_ONCE(&psmouse->ps2dev.serio->dev, | ||
432 | !tp_dev, | ||
433 | psmouse_fmt("Unexpected trackpoint message\n"))) { | ||
434 | if (etd->debug == 1) | ||
435 | elantech_packet_dump(psmouse); | ||
436 | return; | ||
437 | } | ||
438 | |||
439 | t = get_unaligned_le32(&packet[0]); | 431 | t = get_unaligned_le32(&packet[0]); |
440 | 432 | ||
441 | switch (t & ~7U) { | 433 | switch (t & ~7U) { |
@@ -563,6 +555,7 @@ static void elantech_input_sync_v4(struct psmouse *psmouse) | |||
563 | } else { | 555 | } else { |
564 | input_report_key(dev, BTN_LEFT, packet[0] & 0x01); | 556 | input_report_key(dev, BTN_LEFT, packet[0] & 0x01); |
565 | input_report_key(dev, BTN_RIGHT, packet[0] & 0x02); | 557 | input_report_key(dev, BTN_RIGHT, packet[0] & 0x02); |
558 | input_report_key(dev, BTN_MIDDLE, packet[0] & 0x04); | ||
566 | } | 559 | } |
567 | 560 | ||
568 | input_mt_report_pointer_emulation(dev, true); | 561 | input_mt_report_pointer_emulation(dev, true); |
@@ -792,6 +785,9 @@ static int elantech_packet_check_v4(struct psmouse *psmouse) | |||
792 | unsigned char packet_type = packet[3] & 0x03; | 785 | unsigned char packet_type = packet[3] & 0x03; |
793 | bool sanity_check; | 786 | bool sanity_check; |
794 | 787 | ||
788 | if (etd->tp_dev && (packet[3] & 0x0f) == 0x06) | ||
789 | return PACKET_TRACKPOINT; | ||
790 | |||
795 | /* | 791 | /* |
796 | * Sanity check based on the constant bits of a packet. | 792 | * Sanity check based on the constant bits of a packet. |
797 | * The constant bits change depending on the value of | 793 | * The constant bits change depending on the value of |
@@ -877,10 +873,19 @@ static psmouse_ret_t elantech_process_byte(struct psmouse *psmouse) | |||
877 | 873 | ||
878 | case 4: | 874 | case 4: |
879 | packet_type = elantech_packet_check_v4(psmouse); | 875 | packet_type = elantech_packet_check_v4(psmouse); |
880 | if (packet_type == PACKET_UNKNOWN) | 876 | switch (packet_type) { |
877 | case PACKET_UNKNOWN: | ||
881 | return PSMOUSE_BAD_DATA; | 878 | return PSMOUSE_BAD_DATA; |
882 | 879 | ||
883 | elantech_report_absolute_v4(psmouse, packet_type); | 880 | case PACKET_TRACKPOINT: |
881 | elantech_report_trackpoint(psmouse, packet_type); | ||
882 | break; | ||
883 | |||
884 | default: | ||
885 | elantech_report_absolute_v4(psmouse, packet_type); | ||
886 | break; | ||
887 | } | ||
888 | |||
884 | break; | 889 | break; |
885 | } | 890 | } |
886 | 891 | ||
@@ -1120,6 +1125,22 @@ static void elantech_set_buttonpad_prop(struct psmouse *psmouse) | |||
1120 | } | 1125 | } |
1121 | 1126 | ||
1122 | /* | 1127 | /* |
1128 | * Some hw_version 4 models do have a middle button | ||
1129 | */ | ||
1130 | static const struct dmi_system_id elantech_dmi_has_middle_button[] = { | ||
1131 | #if defined(CONFIG_DMI) && defined(CONFIG_X86) | ||
1132 | { | ||
1133 | /* Fujitsu H730 has a middle button */ | ||
1134 | .matches = { | ||
1135 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | ||
1136 | DMI_MATCH(DMI_PRODUCT_NAME, "CELSIUS H730"), | ||
1137 | }, | ||
1138 | }, | ||
1139 | #endif | ||
1140 | { } | ||
1141 | }; | ||
1142 | |||
1143 | /* | ||
1123 | * Set the appropriate event bits for the input subsystem | 1144 | * Set the appropriate event bits for the input subsystem |
1124 | */ | 1145 | */ |
1125 | static int elantech_set_input_params(struct psmouse *psmouse) | 1146 | static int elantech_set_input_params(struct psmouse *psmouse) |
@@ -1138,6 +1159,8 @@ static int elantech_set_input_params(struct psmouse *psmouse) | |||
1138 | __clear_bit(EV_REL, dev->evbit); | 1159 | __clear_bit(EV_REL, dev->evbit); |
1139 | 1160 | ||
1140 | __set_bit(BTN_LEFT, dev->keybit); | 1161 | __set_bit(BTN_LEFT, dev->keybit); |
1162 | if (dmi_check_system(elantech_dmi_has_middle_button)) | ||
1163 | __set_bit(BTN_MIDDLE, dev->keybit); | ||
1141 | __set_bit(BTN_RIGHT, dev->keybit); | 1164 | __set_bit(BTN_RIGHT, dev->keybit); |
1142 | 1165 | ||
1143 | __set_bit(BTN_TOUCH, dev->keybit); | 1166 | __set_bit(BTN_TOUCH, dev->keybit); |
@@ -1299,6 +1322,7 @@ ELANTECH_INT_ATTR(reg_25, 0x25); | |||
1299 | ELANTECH_INT_ATTR(reg_26, 0x26); | 1322 | ELANTECH_INT_ATTR(reg_26, 0x26); |
1300 | ELANTECH_INT_ATTR(debug, 0); | 1323 | ELANTECH_INT_ATTR(debug, 0); |
1301 | ELANTECH_INT_ATTR(paritycheck, 0); | 1324 | ELANTECH_INT_ATTR(paritycheck, 0); |
1325 | ELANTECH_INT_ATTR(crc_enabled, 0); | ||
1302 | 1326 | ||
1303 | static struct attribute *elantech_attrs[] = { | 1327 | static struct attribute *elantech_attrs[] = { |
1304 | &psmouse_attr_reg_07.dattr.attr, | 1328 | &psmouse_attr_reg_07.dattr.attr, |
@@ -1313,6 +1337,7 @@ static struct attribute *elantech_attrs[] = { | |||
1313 | &psmouse_attr_reg_26.dattr.attr, | 1337 | &psmouse_attr_reg_26.dattr.attr, |
1314 | &psmouse_attr_debug.dattr.attr, | 1338 | &psmouse_attr_debug.dattr.attr, |
1315 | &psmouse_attr_paritycheck.dattr.attr, | 1339 | &psmouse_attr_paritycheck.dattr.attr, |
1340 | &psmouse_attr_crc_enabled.dattr.attr, | ||
1316 | NULL | 1341 | NULL |
1317 | }; | 1342 | }; |
1318 | 1343 | ||
@@ -1439,6 +1464,22 @@ static int elantech_reconnect(struct psmouse *psmouse) | |||
1439 | } | 1464 | } |
1440 | 1465 | ||
1441 | /* | 1466 | /* |
1467 | * Some hw_version 4 models do not work with crc_disabled | ||
1468 | */ | ||
1469 | static const struct dmi_system_id elantech_dmi_force_crc_enabled[] = { | ||
1470 | #if defined(CONFIG_DMI) && defined(CONFIG_X86) | ||
1471 | { | ||
1472 | /* Fujitsu H730 does not work with crc_enabled == 0 */ | ||
1473 | .matches = { | ||
1474 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | ||
1475 | DMI_MATCH(DMI_PRODUCT_NAME, "CELSIUS H730"), | ||
1476 | }, | ||
1477 | }, | ||
1478 | #endif | ||
1479 | { } | ||
1480 | }; | ||
1481 | |||
1482 | /* | ||
1442 | * Some hw_version 3 models go into error state when we try to set | 1483 | * Some hw_version 3 models go into error state when we try to set |
1443 | * bit 3 and/or bit 1 of r10. | 1484 | * bit 3 and/or bit 1 of r10. |
1444 | */ | 1485 | */ |
@@ -1513,7 +1554,8 @@ static int elantech_set_properties(struct elantech_data *etd) | |||
1513 | * The signatures of v3 and v4 packets change depending on the | 1554 | * The signatures of v3 and v4 packets change depending on the |
1514 | * value of this hardware flag. | 1555 | * value of this hardware flag. |
1515 | */ | 1556 | */ |
1516 | etd->crc_enabled = ((etd->fw_version & 0x4000) == 0x4000); | 1557 | etd->crc_enabled = (etd->fw_version & 0x4000) == 0x4000 || |
1558 | dmi_check_system(elantech_dmi_force_crc_enabled); | ||
1517 | 1559 | ||
1518 | /* Enable real hardware resolution on hw_version 3 ? */ | 1560 | /* Enable real hardware resolution on hw_version 3 ? */ |
1519 | etd->set_hw_resolution = !dmi_check_system(no_hw_res_dmi_table); | 1561 | etd->set_hw_resolution = !dmi_check_system(no_hw_res_dmi_table); |
diff --git a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c index 26994f6a2b2a..95a3a6e2faf6 100644 --- a/drivers/input/mouse/psmouse-base.c +++ b/drivers/input/mouse/psmouse-base.c | |||
@@ -1536,16 +1536,9 @@ static int psmouse_reconnect(struct serio *serio) | |||
1536 | { | 1536 | { |
1537 | struct psmouse *psmouse = serio_get_drvdata(serio); | 1537 | struct psmouse *psmouse = serio_get_drvdata(serio); |
1538 | struct psmouse *parent = NULL; | 1538 | struct psmouse *parent = NULL; |
1539 | struct serio_driver *drv = serio->drv; | ||
1540 | unsigned char type; | 1539 | unsigned char type; |
1541 | int rc = -1; | 1540 | int rc = -1; |
1542 | 1541 | ||
1543 | if (!drv || !psmouse) { | ||
1544 | psmouse_dbg(psmouse, | ||
1545 | "reconnect request, but serio is disconnected, ignoring...\n"); | ||
1546 | return -1; | ||
1547 | } | ||
1548 | |||
1549 | mutex_lock(&psmouse_mutex); | 1542 | mutex_lock(&psmouse_mutex); |
1550 | 1543 | ||
1551 | if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) { | 1544 | if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) { |
diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c index 9031a0a28ea4..f9472920d986 100644 --- a/drivers/input/mouse/synaptics.c +++ b/drivers/input/mouse/synaptics.c | |||
@@ -135,14 +135,18 @@ static const struct min_max_quirk min_max_pnpid_table[] = { | |||
135 | 1232, 5710, 1156, 4696 | 135 | 1232, 5710, 1156, 4696 |
136 | }, | 136 | }, |
137 | { | 137 | { |
138 | (const char * const []){"LEN0034", "LEN0036", "LEN2002", | 138 | (const char * const []){"LEN0034", "LEN0036", "LEN0039", |
139 | "LEN2004", NULL}, | 139 | "LEN2002", "LEN2004", NULL}, |
140 | 1024, 5112, 2024, 4832 | 140 | 1024, 5112, 2024, 4832 |
141 | }, | 141 | }, |
142 | { | 142 | { |
143 | (const char * const []){"LEN2001", NULL}, | 143 | (const char * const []){"LEN2001", NULL}, |
144 | 1024, 5022, 2508, 4832 | 144 | 1024, 5022, 2508, 4832 |
145 | }, | 145 | }, |
146 | { | ||
147 | (const char * const []){"LEN2006", NULL}, | ||
148 | 1264, 5675, 1171, 4688 | ||
149 | }, | ||
146 | { } | 150 | { } |
147 | }; | 151 | }; |
148 | 152 | ||
@@ -163,6 +167,7 @@ static const char * const topbuttonpad_pnp_ids[] = { | |||
163 | "LEN0036", /* T440 */ | 167 | "LEN0036", /* T440 */ |
164 | "LEN0037", | 168 | "LEN0037", |
165 | "LEN0038", | 169 | "LEN0038", |
170 | "LEN0039", /* T440s */ | ||
166 | "LEN0041", | 171 | "LEN0041", |
167 | "LEN0042", /* Yoga */ | 172 | "LEN0042", /* Yoga */ |
168 | "LEN0045", | 173 | "LEN0045", |
diff --git a/drivers/input/mouse/vsxxxaa.c b/drivers/input/mouse/vsxxxaa.c index 38298232124f..abd494411e69 100644 --- a/drivers/input/mouse/vsxxxaa.c +++ b/drivers/input/mouse/vsxxxaa.c | |||
@@ -128,7 +128,7 @@ static void vsxxxaa_drop_bytes(struct vsxxxaa *mouse, int num) | |||
128 | if (num >= mouse->count) { | 128 | if (num >= mouse->count) { |
129 | mouse->count = 0; | 129 | mouse->count = 0; |
130 | } else { | 130 | } else { |
131 | memmove(mouse->buf, mouse->buf + num - 1, BUFLEN - num); | 131 | memmove(mouse->buf, mouse->buf + num, BUFLEN - num); |
132 | mouse->count -= num; | 132 | mouse->count -= num; |
133 | } | 133 | } |
134 | } | 134 | } |
diff --git a/drivers/input/serio/altera_ps2.c b/drivers/input/serio/altera_ps2.c index b74fc2fef869..f50325a03d4a 100644 --- a/drivers/input/serio/altera_ps2.c +++ b/drivers/input/serio/altera_ps2.c | |||
@@ -35,7 +35,7 @@ static irqreturn_t altera_ps2_rxint(int irq, void *dev_id) | |||
35 | { | 35 | { |
36 | struct ps2if *ps2if = dev_id; | 36 | struct ps2if *ps2if = dev_id; |
37 | unsigned int status; | 37 | unsigned int status; |
38 | int handled = IRQ_NONE; | 38 | irqreturn_t handled = IRQ_NONE; |
39 | 39 | ||
40 | while ((status = readl(ps2if->base)) & 0xffff0000) { | 40 | while ((status = readl(ps2if->base)) & 0xffff0000) { |
41 | serio_interrupt(ps2if->io, status & 0xff, 0); | 41 | serio_interrupt(ps2if->io, status & 0xff, 0); |
@@ -72,7 +72,7 @@ static void altera_ps2_close(struct serio *io) | |||
72 | { | 72 | { |
73 | struct ps2if *ps2if = io->port_data; | 73 | struct ps2if *ps2if = io->port_data; |
74 | 74 | ||
75 | writel(0, ps2if->base); /* disable rx irq */ | 75 | writel(0, ps2if->base + 4); /* disable rx irq */ |
76 | } | 76 | } |
77 | 77 | ||
78 | /* | 78 | /* |
diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h index a26366a263a5..c66d1b53843e 100644 --- a/drivers/input/serio/i8042-x86ia64io.h +++ b/drivers/input/serio/i8042-x86ia64io.h | |||
@@ -207,17 +207,282 @@ static const struct dmi_system_id __initconst i8042_dmi_noloop_table[] = { | |||
207 | }; | 207 | }; |
208 | 208 | ||
209 | /* | 209 | /* |
210 | * Some laptops do implement active multiplexing mode correctly; | 210 | * Some Fujitsu notebooks are having trouble with touchpads if |
211 | * unfortunately they are in minority. | 211 | * active multiplexing mode is activated. Luckily they don't have |
212 | * external PS/2 ports so we can safely disable it. | ||
213 | * ... apparently some Toshibas don't like MUX mode either and | ||
214 | * die horrible death on reboot. | ||
212 | */ | 215 | */ |
213 | static const struct dmi_system_id __initconst i8042_dmi_mux_table[] = { | 216 | static const struct dmi_system_id __initconst i8042_dmi_nomux_table[] = { |
217 | { | ||
218 | /* Fujitsu Lifebook P7010/P7010D */ | ||
219 | .matches = { | ||
220 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | ||
221 | DMI_MATCH(DMI_PRODUCT_NAME, "P7010"), | ||
222 | }, | ||
223 | }, | ||
224 | { | ||
225 | /* Fujitsu Lifebook P7010 */ | ||
226 | .matches = { | ||
227 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), | ||
228 | DMI_MATCH(DMI_PRODUCT_NAME, "0000000000"), | ||
229 | }, | ||
230 | }, | ||
231 | { | ||
232 | /* Fujitsu Lifebook P5020D */ | ||
233 | .matches = { | ||
234 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | ||
235 | DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook P Series"), | ||
236 | }, | ||
237 | }, | ||
238 | { | ||
239 | /* Fujitsu Lifebook S2000 */ | ||
240 | .matches = { | ||
241 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | ||
242 | DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook S Series"), | ||
243 | }, | ||
244 | }, | ||
245 | { | ||
246 | /* Fujitsu Lifebook S6230 */ | ||
247 | .matches = { | ||
248 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | ||
249 | DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook S6230"), | ||
250 | }, | ||
251 | }, | ||
252 | { | ||
253 | /* Fujitsu T70H */ | ||
254 | .matches = { | ||
255 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | ||
256 | DMI_MATCH(DMI_PRODUCT_NAME, "FMVLT70H"), | ||
257 | }, | ||
258 | }, | ||
259 | { | ||
260 | /* Fujitsu-Siemens Lifebook T3010 */ | ||
261 | .matches = { | ||
262 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), | ||
263 | DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK T3010"), | ||
264 | }, | ||
265 | }, | ||
266 | { | ||
267 | /* Fujitsu-Siemens Lifebook E4010 */ | ||
268 | .matches = { | ||
269 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), | ||
270 | DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK E4010"), | ||
271 | }, | ||
272 | }, | ||
273 | { | ||
274 | /* Fujitsu-Siemens Amilo Pro 2010 */ | ||
275 | .matches = { | ||
276 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), | ||
277 | DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pro V2010"), | ||
278 | }, | ||
279 | }, | ||
280 | { | ||
281 | /* Fujitsu-Siemens Amilo Pro 2030 */ | ||
282 | .matches = { | ||
283 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), | ||
284 | DMI_MATCH(DMI_PRODUCT_NAME, "AMILO PRO V2030"), | ||
285 | }, | ||
286 | }, | ||
287 | { | ||
288 | /* | ||
289 | * No data is coming from the touchscreen unless KBC | ||
290 | * is in legacy mode. | ||
291 | */ | ||
292 | /* Panasonic CF-29 */ | ||
293 | .matches = { | ||
294 | DMI_MATCH(DMI_SYS_VENDOR, "Matsushita"), | ||
295 | DMI_MATCH(DMI_PRODUCT_NAME, "CF-29"), | ||
296 | }, | ||
297 | }, | ||
298 | { | ||
299 | /* | ||
300 | * HP Pavilion DV4017EA - | ||
301 | * errors on MUX ports are reported without raising AUXDATA | ||
302 | * causing "spurious NAK" messages. | ||
303 | */ | ||
304 | .matches = { | ||
305 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
306 | DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion dv4000 (EA032EA#ABF)"), | ||
307 | }, | ||
308 | }, | ||
309 | { | ||
310 | /* | ||
311 | * HP Pavilion ZT1000 - | ||
312 | * like DV4017EA does not raise AUXERR for errors on MUX ports. | ||
313 | */ | ||
314 | .matches = { | ||
315 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
316 | DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion Notebook PC"), | ||
317 | DMI_MATCH(DMI_PRODUCT_VERSION, "HP Pavilion Notebook ZT1000"), | ||
318 | }, | ||
319 | }, | ||
320 | { | ||
321 | /* | ||
322 | * HP Pavilion DV4270ca - | ||
323 | * like DV4017EA does not raise AUXERR for errors on MUX ports. | ||
324 | */ | ||
325 | .matches = { | ||
326 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
327 | DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion dv4000 (EH476UA#ABL)"), | ||
328 | }, | ||
329 | }, | ||
330 | { | ||
331 | .matches = { | ||
332 | DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), | ||
333 | DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P10"), | ||
334 | }, | ||
335 | }, | ||
336 | { | ||
337 | .matches = { | ||
338 | DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), | ||
339 | DMI_MATCH(DMI_PRODUCT_NAME, "EQUIUM A110"), | ||
340 | }, | ||
341 | }, | ||
342 | { | ||
343 | .matches = { | ||
344 | DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), | ||
345 | DMI_MATCH(DMI_PRODUCT_NAME, "SATELLITE C850D"), | ||
346 | }, | ||
347 | }, | ||
348 | { | ||
349 | .matches = { | ||
350 | DMI_MATCH(DMI_SYS_VENDOR, "ALIENWARE"), | ||
351 | DMI_MATCH(DMI_PRODUCT_NAME, "Sentia"), | ||
352 | }, | ||
353 | }, | ||
354 | { | ||
355 | /* Sharp Actius MM20 */ | ||
356 | .matches = { | ||
357 | DMI_MATCH(DMI_SYS_VENDOR, "SHARP"), | ||
358 | DMI_MATCH(DMI_PRODUCT_NAME, "PC-MM20 Series"), | ||
359 | }, | ||
360 | }, | ||
361 | { | ||
362 | /* Sony Vaio FS-115b */ | ||
363 | .matches = { | ||
364 | DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), | ||
365 | DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FS115B"), | ||
366 | }, | ||
367 | }, | ||
368 | { | ||
369 | /* | ||
370 | * Sony Vaio FZ-240E - | ||
371 | * reset and GET ID commands issued via KBD port are | ||
372 | * sometimes being delivered to AUX3. | ||
373 | */ | ||
374 | .matches = { | ||
375 | DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), | ||
376 | DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FZ240E"), | ||
377 | }, | ||
378 | }, | ||
214 | { | 379 | { |
215 | /* | 380 | /* |
216 | * Panasonic CF-18 needs to be in MUX mode since the | 381 | * Most (all?) VAIOs do not have external PS/2 ports nor |
217 | * touchscreen is on serio3 and it also has touchpad. | 382 | * they implement active multiplexing properly, and |
383 | * MUX discovery usually messes up keyboard/touchpad. | ||
218 | */ | 384 | */ |
219 | .matches = { | 385 | .matches = { |
220 | DMI_MATCH(DMI_PRODUCT_NAME, "CF-18"), | 386 | DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), |
387 | DMI_MATCH(DMI_BOARD_NAME, "VAIO"), | ||
388 | }, | ||
389 | }, | ||
390 | { | ||
391 | /* Amoi M636/A737 */ | ||
392 | .matches = { | ||
393 | DMI_MATCH(DMI_SYS_VENDOR, "Amoi Electronics CO.,LTD."), | ||
394 | DMI_MATCH(DMI_PRODUCT_NAME, "M636/A737 platform"), | ||
395 | }, | ||
396 | }, | ||
397 | { | ||
398 | /* Lenovo 3000 n100 */ | ||
399 | .matches = { | ||
400 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
401 | DMI_MATCH(DMI_PRODUCT_NAME, "076804U"), | ||
402 | }, | ||
403 | }, | ||
404 | { | ||
405 | .matches = { | ||
406 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
407 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 1360"), | ||
408 | }, | ||
409 | }, | ||
410 | { | ||
411 | /* Acer Aspire 5710 */ | ||
412 | .matches = { | ||
413 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
414 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5710"), | ||
415 | }, | ||
416 | }, | ||
417 | { | ||
418 | /* Gericom Bellagio */ | ||
419 | .matches = { | ||
420 | DMI_MATCH(DMI_SYS_VENDOR, "Gericom"), | ||
421 | DMI_MATCH(DMI_PRODUCT_NAME, "N34AS6"), | ||
422 | }, | ||
423 | }, | ||
424 | { | ||
425 | /* IBM 2656 */ | ||
426 | .matches = { | ||
427 | DMI_MATCH(DMI_SYS_VENDOR, "IBM"), | ||
428 | DMI_MATCH(DMI_PRODUCT_NAME, "2656"), | ||
429 | }, | ||
430 | }, | ||
431 | { | ||
432 | /* Dell XPS M1530 */ | ||
433 | .matches = { | ||
434 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
435 | DMI_MATCH(DMI_PRODUCT_NAME, "XPS M1530"), | ||
436 | }, | ||
437 | }, | ||
438 | { | ||
439 | /* Compal HEL80I */ | ||
440 | .matches = { | ||
441 | DMI_MATCH(DMI_SYS_VENDOR, "COMPAL"), | ||
442 | DMI_MATCH(DMI_PRODUCT_NAME, "HEL80I"), | ||
443 | }, | ||
444 | }, | ||
445 | { | ||
446 | /* Dell Vostro 1510 */ | ||
447 | .matches = { | ||
448 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
449 | DMI_MATCH(DMI_PRODUCT_NAME, "Vostro1510"), | ||
450 | }, | ||
451 | }, | ||
452 | { | ||
453 | /* Acer Aspire 5536 */ | ||
454 | .matches = { | ||
455 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
456 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5536"), | ||
457 | DMI_MATCH(DMI_PRODUCT_VERSION, "0100"), | ||
458 | }, | ||
459 | }, | ||
460 | { | ||
461 | /* Dell Vostro V13 */ | ||
462 | .matches = { | ||
463 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
464 | DMI_MATCH(DMI_PRODUCT_NAME, "Vostro V13"), | ||
465 | }, | ||
466 | }, | ||
467 | { | ||
468 | /* Newer HP Pavilion dv4 models */ | ||
469 | .matches = { | ||
470 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
471 | DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv4 Notebook PC"), | ||
472 | }, | ||
473 | }, | ||
474 | { | ||
475 | /* Asus X450LCP */ | ||
476 | .matches = { | ||
477 | DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), | ||
478 | DMI_MATCH(DMI_PRODUCT_NAME, "X450LCP"), | ||
479 | }, | ||
480 | }, | ||
481 | { | ||
482 | /* Avatar AVIU-145A6 */ | ||
483 | .matches = { | ||
484 | DMI_MATCH(DMI_SYS_VENDOR, "Intel"), | ||
485 | DMI_MATCH(DMI_PRODUCT_NAME, "IC4I"), | ||
221 | }, | 486 | }, |
222 | }, | 487 | }, |
223 | { } | 488 | { } |
@@ -374,6 +639,22 @@ static const struct dmi_system_id __initconst i8042_dmi_notimeout_table[] = { | |||
374 | }, | 639 | }, |
375 | }, | 640 | }, |
376 | { | 641 | { |
642 | /* Fujitsu A544 laptop */ | ||
643 | /* https://bugzilla.redhat.com/show_bug.cgi?id=1111138 */ | ||
644 | .matches = { | ||
645 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | ||
646 | DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK A544"), | ||
647 | }, | ||
648 | }, | ||
649 | { | ||
650 | /* Fujitsu AH544 laptop */ | ||
651 | /* https://bugzilla.kernel.org/show_bug.cgi?id=69731 */ | ||
652 | .matches = { | ||
653 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), | ||
654 | DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK AH544"), | ||
655 | }, | ||
656 | }, | ||
657 | { | ||
377 | /* Fujitsu U574 laptop */ | 658 | /* Fujitsu U574 laptop */ |
378 | /* https://bugzilla.kernel.org/show_bug.cgi?id=69731 */ | 659 | /* https://bugzilla.kernel.org/show_bug.cgi?id=69731 */ |
379 | .matches = { | 660 | .matches = { |
@@ -750,8 +1031,8 @@ static int __init i8042_platform_init(void) | |||
750 | if (dmi_check_system(i8042_dmi_noloop_table)) | 1031 | if (dmi_check_system(i8042_dmi_noloop_table)) |
751 | i8042_noloop = true; | 1032 | i8042_noloop = true; |
752 | 1033 | ||
753 | if (dmi_check_system(i8042_dmi_mux_table)) | 1034 | if (dmi_check_system(i8042_dmi_nomux_table)) |
754 | i8042_nomux = false; | 1035 | i8042_nomux = true; |
755 | 1036 | ||
756 | if (dmi_check_system(i8042_dmi_notimeout_table)) | 1037 | if (dmi_check_system(i8042_dmi_notimeout_table)) |
757 | i8042_notimeout = true; | 1038 | i8042_notimeout = true; |
diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c index 9a97c2b10926..f5a98af3b325 100644 --- a/drivers/input/serio/i8042.c +++ b/drivers/input/serio/i8042.c | |||
@@ -39,7 +39,7 @@ static bool i8042_noaux; | |||
39 | module_param_named(noaux, i8042_noaux, bool, 0); | 39 | module_param_named(noaux, i8042_noaux, bool, 0); |
40 | MODULE_PARM_DESC(noaux, "Do not probe or use AUX (mouse) port."); | 40 | MODULE_PARM_DESC(noaux, "Do not probe or use AUX (mouse) port."); |
41 | 41 | ||
42 | static bool i8042_nomux = true; | 42 | static bool i8042_nomux; |
43 | module_param_named(nomux, i8042_nomux, bool, 0); | 43 | module_param_named(nomux, i8042_nomux, bool, 0); |
44 | MODULE_PARM_DESC(nomux, "Do not check whether an active multiplexing controller is present."); | 44 | MODULE_PARM_DESC(nomux, "Do not check whether an active multiplexing controller is present."); |
45 | 45 | ||
diff --git a/drivers/input/touchscreen/wm97xx-core.c b/drivers/input/touchscreen/wm97xx-core.c index d0ef91fc87d1..b1ae77995968 100644 --- a/drivers/input/touchscreen/wm97xx-core.c +++ b/drivers/input/touchscreen/wm97xx-core.c | |||
@@ -70,11 +70,11 @@ | |||
70 | * Documentation/input/input-programming.txt for more details. | 70 | * Documentation/input/input-programming.txt for more details. |
71 | */ | 71 | */ |
72 | 72 | ||
73 | static int abs_x[3] = {350, 3900, 5}; | 73 | static int abs_x[3] = {150, 4000, 5}; |
74 | module_param_array(abs_x, int, NULL, 0); | 74 | module_param_array(abs_x, int, NULL, 0); |
75 | MODULE_PARM_DESC(abs_x, "Touchscreen absolute X min, max, fuzz"); | 75 | MODULE_PARM_DESC(abs_x, "Touchscreen absolute X min, max, fuzz"); |
76 | 76 | ||
77 | static int abs_y[3] = {320, 3750, 40}; | 77 | static int abs_y[3] = {200, 4000, 40}; |
78 | module_param_array(abs_y, int, NULL, 0); | 78 | module_param_array(abs_y, int, NULL, 0); |
79 | MODULE_PARM_DESC(abs_y, "Touchscreen absolute Y min, max, fuzz"); | 79 | MODULE_PARM_DESC(abs_y, "Touchscreen absolute Y min, max, fuzz"); |
80 | 80 | ||