Merge master.kernel.org:/pub/scm/linux/kernel/git/dtor/input

+552 -89
+38
drivers/input/mouse/alps.c
··· 348 return 0; 349 } 350 351 static int alps_reconnect(struct psmouse *psmouse) 352 { 353 struct alps_data *priv = psmouse->private; ··· 485 input_register_device(priv->dev2); 486 487 psmouse->protocol_handler = alps_process_byte; 488 psmouse->disconnect = alps_disconnect; 489 psmouse->reconnect = alps_reconnect; 490 psmouse->pktsize = 6; 491 492 return 0; 493
··· 348 return 0; 349 } 350 351 + /* 352 + * alps_poll() - poll the touchpad for current motion packet. 353 + * Used in resync. 354 + */ 355 + static int alps_poll(struct psmouse *psmouse) 356 + { 357 + struct alps_data *priv = psmouse->private; 358 + unsigned char buf[6]; 359 + int poll_failed; 360 + 361 + if (priv->i->flags & ALPS_PASS) 362 + alps_passthrough_mode(psmouse, 1); 363 + 364 + poll_failed = ps2_command(&psmouse->ps2dev, buf, 365 + PSMOUSE_CMD_POLL | (psmouse->pktsize << 8)) < 0; 366 + 367 + if (priv->i->flags & ALPS_PASS) 368 + alps_passthrough_mode(psmouse, 0); 369 + 370 + if (poll_failed || (buf[0] & priv->i->mask0) != priv->i->byte0) 371 + return -1; 372 + 373 + if ((psmouse->badbyte & 0xc8) == 0x08) { 374 + /* 375 + * Poll the track stick ... 376 + */ 377 + if (ps2_command(&psmouse->ps2dev, buf, PSMOUSE_CMD_POLL | (3 << 8))) 378 + return -1; 379 + } 380 + 381 + memcpy(psmouse->packet, buf, sizeof(buf)); 382 + return 0; 383 + } 384 + 385 static int alps_reconnect(struct psmouse *psmouse) 386 { 387 struct alps_data *priv = psmouse->private; ··· 451 input_register_device(priv->dev2); 452 453 psmouse->protocol_handler = alps_process_byte; 454 + psmouse->poll = alps_poll; 455 psmouse->disconnect = alps_disconnect; 456 psmouse->reconnect = alps_reconnect; 457 psmouse->pktsize = 6; 458 + 459 + /* We are having trouble resyncing ALPS touchpads so disable it for now */ 460 + psmouse->resync_time = 0; 461 462 return 0; 463
+1 -1
drivers/input/mouse/logips2pp.c
··· 117 if (psmouse_sliced_command(psmouse, command)) 118 return -1; 119 120 - if (ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_POLL)) 121 return -1; 122 123 return 0;
··· 117 if (psmouse_sliced_command(psmouse, command)) 118 return -1; 119 120 + if (ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_POLL | 0x0300)) 121 return -1; 122 123 return 0;
+253 -65
drivers/input/mouse/psmouse-base.c
··· 54 module_param_named(smartscroll, psmouse_smartscroll, bool, 0644); 55 MODULE_PARM_DESC(smartscroll, "Logitech Smartscroll autorepeat, 1 = enabled (default), 0 = disabled."); 56 57 - static unsigned int psmouse_resetafter; 58 module_param_named(resetafter, psmouse_resetafter, uint, 0644); 59 MODULE_PARM_DESC(resetafter, "Reset device after so many bad packets (0 = never)."); 60 61 PSMOUSE_DEFINE_ATTR(protocol, S_IWUSR | S_IRUGO, 62 NULL, ··· 74 PSMOUSE_DEFINE_ATTR(resetafter, S_IWUSR | S_IRUGO, 75 (void *) offsetof(struct psmouse, resetafter), 76 psmouse_show_int_attr, psmouse_set_int_attr); 77 78 static struct attribute *psmouse_attributes[] = { 79 &psmouse_attr_protocol.dattr.attr, 80 &psmouse_attr_rate.dattr.attr, 81 &psmouse_attr_resolution.dattr.attr, 82 &psmouse_attr_resetafter.dattr.attr, 83 NULL 84 }; 85 ··· 105 * is taken in "slow" paths it is not worth it. 106 */ 107 static DECLARE_MUTEX(psmouse_sem); 108 109 struct psmouse_protocol { 110 enum psmouse_type type; ··· 188 } 189 190 /* 191 - * psmouse_interrupt() handles incoming characters, either gathering them into 192 - * packets or passing them to the command routine as command output. 193 */ 194 195 static irqreturn_t psmouse_interrupt(struct serio *serio, 196 unsigned char data, unsigned int flags, struct pt_regs *regs) 197 { 198 struct psmouse *psmouse = serio_get_drvdata(serio); 199 - psmouse_ret_t rc; 200 201 if (psmouse->state == PSMOUSE_IGNORE) 202 goto out; ··· 282 if (ps2_handle_response(&psmouse->ps2dev, data)) 283 goto out; 284 285 - if (psmouse->state == PSMOUSE_INITIALIZING) 286 goto out; 287 288 if (psmouse->state == PSMOUSE_ACTIVATED && 289 psmouse->pktcnt && time_after(jiffies, psmouse->last + HZ/2)) { 290 - printk(KERN_WARNING "psmouse.c: %s at %s lost synchronization, throwing %d bytes away.\n", 291 psmouse->name, psmouse->phys, psmouse->pktcnt); 292 - psmouse->pktcnt = 0; 293 } 294 295 - psmouse->last = jiffies; 296 psmouse->packet[psmouse->pktcnt++] = data; 297 - 298 - if (psmouse->packet[0] == PSMOUSE_RET_BAT) { 299 if (psmouse->pktcnt == 1) 300 goto out; 301 302 - if (psmouse->pktcnt == 2) { 303 - if (psmouse->packet[1] == PSMOUSE_RET_ID) { 304 - psmouse->state = PSMOUSE_IGNORE; 305 - serio_reconnect(serio); 306 - goto out; 307 - } 308 - if (psmouse->type == PSMOUSE_SYNAPTICS) { 309 - /* neither 0xAA nor 0x00 are valid first bytes 310 - * for a packet in absolute mode 311 - */ 312 - psmouse->pktcnt = 0; 313 - goto out; 314 - } 315 } 316 } 317 318 - rc = psmouse->protocol_handler(psmouse, regs); 319 - 320 - switch (rc) { 321 - case PSMOUSE_BAD_DATA: 322 - printk(KERN_WARNING "psmouse.c: %s at %s lost sync at byte %d\n", 323 - psmouse->name, psmouse->phys, psmouse->pktcnt); 324 - psmouse->pktcnt = 0; 325 - 326 - if (++psmouse->out_of_sync == psmouse->resetafter) { 327 - psmouse->state = PSMOUSE_IGNORE; 328 - printk(KERN_NOTICE "psmouse.c: issuing reconnect request\n"); 329 - serio_reconnect(psmouse->ps2dev.serio); 330 - } 331 - break; 332 - 333 - case PSMOUSE_FULL_PACKET: 334 - psmouse->pktcnt = 0; 335 - if (psmouse->out_of_sync) { 336 - psmouse->out_of_sync = 0; 337 - printk(KERN_NOTICE "psmouse.c: %s at %s - driver resynched.\n", 338 - psmouse->name, psmouse->phys); 339 - } 340 - break; 341 - 342 - case PSMOUSE_GOOD_DATA: 343 - break; 344 } 345 - out: 346 return IRQ_HANDLED; 347 } 348 ··· 817 } 818 819 /* 820 - * psmouse_set_state() sets new psmouse state and resets all flags and 821 - * counters while holding serio lock so fighting with interrupt handler 822 - * is not a concern. 823 - */ 824 - 825 - static void psmouse_set_state(struct psmouse *psmouse, enum psmouse_state new_state) 826 - { 827 - serio_pause_rx(psmouse->ps2dev.serio); 828 - psmouse->state = new_state; 829 - psmouse->pktcnt = psmouse->out_of_sync = 0; 830 - psmouse->ps2dev.flags = 0; 831 - serio_continue_rx(psmouse->ps2dev.serio); 832 - } 833 - 834 - /* 835 * psmouse_activate() enables the mouse so that we get motion reports from it. 836 */ 837 ··· 844 psmouse_set_state(psmouse, PSMOUSE_CMD_MODE); 845 } 846 847 848 /* 849 * psmouse_cleanup() resets the mouse into power-on state. ··· 976 down(&psmouse_sem); 977 978 psmouse_set_state(psmouse, PSMOUSE_CMD_MODE); 979 980 if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) { 981 parent = serio_get_drvdata(serio->parent); ··· 1019 1020 psmouse->set_rate = psmouse_set_rate; 1021 psmouse->set_resolution = psmouse_set_resolution; 1022 psmouse->protocol_handler = psmouse_process_byte; 1023 psmouse->pktsize = 3; 1024 ··· 1034 } 1035 else 1036 psmouse->type = psmouse_extensions(psmouse, psmouse_max_proto, 1); 1037 1038 sprintf(psmouse->devname, "%s %s %s", 1039 psmouse_protocol_by_type(psmouse->type)->name, psmouse->vendor, psmouse->name); ··· 1092 goto out; 1093 1094 ps2_init(&psmouse->ps2dev, serio); 1095 psmouse->dev = input_dev; 1096 sprintf(psmouse->phys, "%s/input0", serio->phys); 1097 ··· 1113 psmouse->rate = psmouse_rate; 1114 psmouse->resolution = psmouse_resolution; 1115 psmouse->resetafter = psmouse_resetafter; 1116 psmouse->smartscroll = psmouse_smartscroll; 1117 1118 psmouse_switch_protocol(psmouse, NULL); ··· 1458 1459 static int __init psmouse_init(void) 1460 { 1461 serio_register_driver(&psmouse_drv); 1462 return 0; 1463 } 1464 1465 static void __exit psmouse_exit(void) 1466 { 1467 serio_unregister_driver(&psmouse_drv); 1468 } 1469 1470 module_init(psmouse_init);
··· 54 module_param_named(smartscroll, psmouse_smartscroll, bool, 0644); 55 MODULE_PARM_DESC(smartscroll, "Logitech Smartscroll autorepeat, 1 = enabled (default), 0 = disabled."); 56 57 + static unsigned int psmouse_resetafter = 5; 58 module_param_named(resetafter, psmouse_resetafter, uint, 0644); 59 MODULE_PARM_DESC(resetafter, "Reset device after so many bad packets (0 = never)."); 60 + 61 + static unsigned int psmouse_resync_time = 5; 62 + module_param_named(resync_time, psmouse_resync_time, uint, 0644); 63 + MODULE_PARM_DESC(resync_time, "How long can mouse stay idle before forcing resync (in seconds, 0 = never)."); 64 65 PSMOUSE_DEFINE_ATTR(protocol, S_IWUSR | S_IRUGO, 66 NULL, ··· 70 PSMOUSE_DEFINE_ATTR(resetafter, S_IWUSR | S_IRUGO, 71 (void *) offsetof(struct psmouse, resetafter), 72 psmouse_show_int_attr, psmouse_set_int_attr); 73 + PSMOUSE_DEFINE_ATTR(resync_time, S_IWUSR | S_IRUGO, 74 + (void *) offsetof(struct psmouse, resync_time), 75 + psmouse_show_int_attr, psmouse_set_int_attr); 76 77 static struct attribute *psmouse_attributes[] = { 78 &psmouse_attr_protocol.dattr.attr, 79 &psmouse_attr_rate.dattr.attr, 80 &psmouse_attr_resolution.dattr.attr, 81 &psmouse_attr_resetafter.dattr.attr, 82 + &psmouse_attr_resync_time.dattr.attr, 83 NULL 84 }; 85 ··· 97 * is taken in "slow" paths it is not worth it. 98 */ 99 static DECLARE_MUTEX(psmouse_sem); 100 + 101 + static struct workqueue_struct *kpsmoused_wq; 102 103 struct psmouse_protocol { 104 enum psmouse_type type; ··· 178 } 179 180 /* 181 + * __psmouse_set_state() sets new psmouse state and resets all flags. 182 + */ 183 + 184 + static inline void __psmouse_set_state(struct psmouse *psmouse, enum psmouse_state new_state) 185 + { 186 + psmouse->state = new_state; 187 + psmouse->pktcnt = psmouse->out_of_sync = 0; 188 + psmouse->ps2dev.flags = 0; 189 + psmouse->last = jiffies; 190 + } 191 + 192 + 193 + /* 194 + * psmouse_set_state() sets new psmouse state and resets all flags and 195 + * counters while holding serio lock so fighting with interrupt handler 196 + * is not a concern. 197 + */ 198 + 199 + static void psmouse_set_state(struct psmouse *psmouse, enum psmouse_state new_state) 200 + { 201 + serio_pause_rx(psmouse->ps2dev.serio); 202 + __psmouse_set_state(psmouse, new_state); 203 + serio_continue_rx(psmouse->ps2dev.serio); 204 + } 205 + 206 + /* 207 + * psmouse_handle_byte() processes one byte of the input data stream 208 + * by calling corresponding protocol handler. 209 + */ 210 + 211 + static int psmouse_handle_byte(struct psmouse *psmouse, struct pt_regs *regs) 212 + { 213 + psmouse_ret_t rc = psmouse->protocol_handler(psmouse, regs); 214 + 215 + switch (rc) { 216 + case PSMOUSE_BAD_DATA: 217 + if (psmouse->state == PSMOUSE_ACTIVATED) { 218 + printk(KERN_WARNING "psmouse.c: %s at %s lost sync at byte %d\n", 219 + psmouse->name, psmouse->phys, psmouse->pktcnt); 220 + if (++psmouse->out_of_sync == psmouse->resetafter) { 221 + __psmouse_set_state(psmouse, PSMOUSE_IGNORE); 222 + printk(KERN_NOTICE "psmouse.c: issuing reconnect request\n"); 223 + serio_reconnect(psmouse->ps2dev.serio); 224 + return -1; 225 + } 226 + } 227 + psmouse->pktcnt = 0; 228 + break; 229 + 230 + case PSMOUSE_FULL_PACKET: 231 + psmouse->pktcnt = 0; 232 + if (psmouse->out_of_sync) { 233 + psmouse->out_of_sync = 0; 234 + printk(KERN_NOTICE "psmouse.c: %s at %s - driver resynched.\n", 235 + psmouse->name, psmouse->phys); 236 + } 237 + break; 238 + 239 + case PSMOUSE_GOOD_DATA: 240 + break; 241 + } 242 + return 0; 243 + } 244 + 245 + /* 246 + * psmouse_interrupt() handles incoming characters, either passing them 247 + * for normal processing or gathering them as command response. 248 */ 249 250 static irqreturn_t psmouse_interrupt(struct serio *serio, 251 unsigned char data, unsigned int flags, struct pt_regs *regs) 252 { 253 struct psmouse *psmouse = serio_get_drvdata(serio); 254 255 if (psmouse->state == PSMOUSE_IGNORE) 256 goto out; ··· 208 if (ps2_handle_response(&psmouse->ps2dev, data)) 209 goto out; 210 211 + if (psmouse->state <= PSMOUSE_RESYNCING) 212 goto out; 213 214 if (psmouse->state == PSMOUSE_ACTIVATED && 215 psmouse->pktcnt && time_after(jiffies, psmouse->last + HZ/2)) { 216 + printk(KERN_INFO "psmouse.c: %s at %s lost synchronization, throwing %d bytes away.\n", 217 psmouse->name, psmouse->phys, psmouse->pktcnt); 218 + psmouse->badbyte = psmouse->packet[0]; 219 + __psmouse_set_state(psmouse, PSMOUSE_RESYNCING); 220 + queue_work(kpsmoused_wq, &psmouse->resync_work); 221 + goto out; 222 } 223 224 psmouse->packet[psmouse->pktcnt++] = data; 225 + /* 226 + * Check if this is a new device announcement (0xAA 0x00) 227 + */ 228 + if (unlikely(psmouse->packet[0] == PSMOUSE_RET_BAT && psmouse->pktcnt <= 2)) { 229 if (psmouse->pktcnt == 1) 230 goto out; 231 232 + if (psmouse->packet[1] == PSMOUSE_RET_ID) { 233 + __psmouse_set_state(psmouse, PSMOUSE_IGNORE); 234 + serio_reconnect(serio); 235 + goto out; 236 } 237 + /* 238 + * Not a new device, try processing first byte normally 239 + */ 240 + psmouse->pktcnt = 1; 241 + if (psmouse_handle_byte(psmouse, regs)) 242 + goto out; 243 + 244 + psmouse->packet[psmouse->pktcnt++] = data; 245 } 246 247 + /* 248 + * See if we need to force resync because mouse was idle for too long 249 + */ 250 + if (psmouse->state == PSMOUSE_ACTIVATED && 251 + psmouse->pktcnt == 1 && psmouse->resync_time && 252 + time_after(jiffies, psmouse->last + psmouse->resync_time * HZ)) { 253 + psmouse->badbyte = psmouse->packet[0]; 254 + __psmouse_set_state(psmouse, PSMOUSE_RESYNCING); 255 + queue_work(kpsmoused_wq, &psmouse->resync_work); 256 + goto out; 257 } 258 + 259 + psmouse->last = jiffies; 260 + psmouse_handle_byte(psmouse, regs); 261 + 262 + out: 263 return IRQ_HANDLED; 264 } 265 ··· 752 } 753 754 /* 755 * psmouse_activate() enables the mouse so that we get motion reports from it. 756 */ 757 ··· 794 psmouse_set_state(psmouse, PSMOUSE_CMD_MODE); 795 } 796 797 + /* 798 + * psmouse_poll() - default poll hanlder. Everyone except for ALPS uses it. 799 + */ 800 + 801 + static int psmouse_poll(struct psmouse *psmouse) 802 + { 803 + return ps2_command(&psmouse->ps2dev, psmouse->packet, 804 + PSMOUSE_CMD_POLL | (psmouse->pktsize << 8)); 805 + } 806 + 807 + 808 + /* 809 + * psmouse_resync() attempts to re-validate current protocol. 810 + */ 811 + 812 + static void psmouse_resync(void *p) 813 + { 814 + struct psmouse *psmouse = p, *parent = NULL; 815 + struct serio *serio = psmouse->ps2dev.serio; 816 + psmouse_ret_t rc = PSMOUSE_GOOD_DATA; 817 + int failed = 0, enabled = 0; 818 + int i; 819 + 820 + down(&psmouse_sem); 821 + 822 + if (psmouse->state != PSMOUSE_RESYNCING) 823 + goto out; 824 + 825 + if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) { 826 + parent = serio_get_drvdata(serio->parent); 827 + psmouse_deactivate(parent); 828 + } 829 + 830 + /* 831 + * Some mice don't ACK commands sent while they are in the middle of 832 + * transmitting motion packet. To avoid delay we use ps2_sendbyte() 833 + * instead of ps2_command() which would wait for 200ms for an ACK 834 + * that may never come. 835 + * As an additional quirk ALPS touchpads may not only forget to ACK 836 + * disable command but will stop reporting taps, so if we see that 837 + * mouse at least once ACKs disable we will do full reconnect if ACK 838 + * is missing. 839 + */ 840 + psmouse->num_resyncs++; 841 + 842 + if (ps2_sendbyte(&psmouse->ps2dev, PSMOUSE_CMD_DISABLE, 20)) { 843 + if (psmouse->num_resyncs < 3 || psmouse->acks_disable_command) 844 + failed = 1; 845 + } else 846 + psmouse->acks_disable_command = 1; 847 + 848 + /* 849 + * Poll the mouse. If it was reset the packet will be shorter than 850 + * psmouse->pktsize and ps2_command will fail. We do not expect and 851 + * do not handle scenario when mouse "upgrades" its protocol while 852 + * disconnected since it would require additional delay. If we ever 853 + * see a mouse that does it we'll adjust the code. 854 + */ 855 + if (!failed) { 856 + if (psmouse->poll(psmouse)) 857 + failed = 1; 858 + else { 859 + psmouse_set_state(psmouse, PSMOUSE_CMD_MODE); 860 + for (i = 0; i < psmouse->pktsize; i++) { 861 + psmouse->pktcnt++; 862 + rc = psmouse->protocol_handler(psmouse, NULL); 863 + if (rc != PSMOUSE_GOOD_DATA) 864 + break; 865 + } 866 + if (rc != PSMOUSE_FULL_PACKET) 867 + failed = 1; 868 + psmouse_set_state(psmouse, PSMOUSE_RESYNCING); 869 + } 870 + } 871 + /* 872 + * Now try to enable mouse. We try to do that even if poll failed and also 873 + * repeat our attempts 5 times, otherwise we may be left out with disabled 874 + * mouse. 875 + */ 876 + for (i = 0; i < 5; i++) { 877 + if (!ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_ENABLE)) { 878 + enabled = 1; 879 + break; 880 + } 881 + msleep(200); 882 + } 883 + 884 + if (!enabled) { 885 + printk(KERN_WARNING "psmouse.c: failed to re-enable mouse on %s\n", 886 + psmouse->ps2dev.serio->phys); 887 + failed = 1; 888 + } 889 + 890 + if (failed) { 891 + psmouse_set_state(psmouse, PSMOUSE_IGNORE); 892 + printk(KERN_INFO "psmouse.c: resync failed, issuing reconnect request\n"); 893 + serio_reconnect(serio); 894 + } else 895 + psmouse_set_state(psmouse, PSMOUSE_ACTIVATED); 896 + 897 + if (parent) 898 + psmouse_activate(parent); 899 + out: 900 + up(&psmouse_sem); 901 + } 902 903 /* 904 * psmouse_cleanup() resets the mouse into power-on state. ··· 821 down(&psmouse_sem); 822 823 psmouse_set_state(psmouse, PSMOUSE_CMD_MODE); 824 + 825 + /* make sure we don't have a resync in progress */ 826 + up(&psmouse_sem); 827 + flush_workqueue(kpsmoused_wq); 828 + down(&psmouse_sem); 829 830 if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) { 831 parent = serio_get_drvdata(serio->parent); ··· 859 860 psmouse->set_rate = psmouse_set_rate; 861 psmouse->set_resolution = psmouse_set_resolution; 862 + psmouse->poll = psmouse_poll; 863 psmouse->protocol_handler = psmouse_process_byte; 864 psmouse->pktsize = 3; 865 ··· 873 } 874 else 875 psmouse->type = psmouse_extensions(psmouse, psmouse_max_proto, 1); 876 + 877 + /* 878 + * If mouse's packet size is 3 there is no point in polling the 879 + * device in hopes to detect protocol reset - we won't get less 880 + * than 3 bytes response anyhow. 881 + */ 882 + if (psmouse->pktsize == 3) 883 + psmouse->resync_time = 0; 884 + 885 + /* 886 + * Some smart KVMs fake response to POLL command returning just 887 + * 3 bytes and messing up our resync logic, so if initial poll 888 + * fails we won't try polling the device anymore. Hopefully 889 + * such KVM will maintain initially selected protocol. 890 + */ 891 + if (psmouse->resync_time && psmouse->poll(psmouse)) 892 + psmouse->resync_time = 0; 893 894 sprintf(psmouse->devname, "%s %s %s", 895 psmouse_protocol_by_type(psmouse->type)->name, psmouse->vendor, psmouse->name); ··· 914 goto out; 915 916 ps2_init(&psmouse->ps2dev, serio); 917 + INIT_WORK(&psmouse->resync_work, psmouse_resync, psmouse); 918 psmouse->dev = input_dev; 919 sprintf(psmouse->phys, "%s/input0", serio->phys); 920 ··· 934 psmouse->rate = psmouse_rate; 935 psmouse->resolution = psmouse_resolution; 936 psmouse->resetafter = psmouse_resetafter; 937 + psmouse->resync_time = parent ? 0 : psmouse_resync_time; 938 psmouse->smartscroll = psmouse_smartscroll; 939 940 psmouse_switch_protocol(psmouse, NULL); ··· 1278 1279 static int __init psmouse_init(void) 1280 { 1281 + kpsmoused_wq = create_singlethread_workqueue("kpsmoused"); 1282 + if (!kpsmoused_wq) { 1283 + printk(KERN_ERR "psmouse: failed to create kpsmoused workqueue\n"); 1284 + return -ENOMEM; 1285 + } 1286 + 1287 serio_register_driver(&psmouse_drv); 1288 + 1289 return 0; 1290 } 1291 1292 static void __exit psmouse_exit(void) 1293 { 1294 serio_unregister_driver(&psmouse_drv); 1295 + destroy_workqueue(kpsmoused_wq); 1296 } 1297 1298 module_init(psmouse_init);
+8 -1
drivers/input/mouse/psmouse.h
··· 7 #define PSMOUSE_CMD_GETINFO 0x03e9 8 #define PSMOUSE_CMD_SETSTREAM 0x00ea 9 #define PSMOUSE_CMD_SETPOLL 0x00f0 10 - #define PSMOUSE_CMD_POLL 0x03eb 11 #define PSMOUSE_CMD_GETID 0x02f2 12 #define PSMOUSE_CMD_SETRATE 0x10f3 13 #define PSMOUSE_CMD_ENABLE 0x00f4 ··· 23 enum psmouse_state { 24 PSMOUSE_IGNORE, 25 PSMOUSE_INITIALIZING, 26 PSMOUSE_CMD_MODE, 27 PSMOUSE_ACTIVATED, 28 }; ··· 39 void *private; 40 struct input_dev *dev; 41 struct ps2dev ps2dev; 42 char *vendor; 43 char *name; 44 unsigned char packet[8]; 45 unsigned char pktcnt; 46 unsigned char pktsize; 47 unsigned char type; 48 unsigned int model; 49 unsigned long last; 50 unsigned long out_of_sync; 51 enum psmouse_state state; 52 char devname[64]; 53 char phys[32]; ··· 59 unsigned int rate; 60 unsigned int resolution; 61 unsigned int resetafter; 62 unsigned int smartscroll; /* Logitech only */ 63 64 psmouse_ret_t (*protocol_handler)(struct psmouse *psmouse, struct pt_regs *regs); ··· 68 69 int (*reconnect)(struct psmouse *psmouse); 70 void (*disconnect)(struct psmouse *psmouse); 71 72 void (*pt_activate)(struct psmouse *psmouse); 73 void (*pt_deactivate)(struct psmouse *psmouse);
··· 7 #define PSMOUSE_CMD_GETINFO 0x03e9 8 #define PSMOUSE_CMD_SETSTREAM 0x00ea 9 #define PSMOUSE_CMD_SETPOLL 0x00f0 10 + #define PSMOUSE_CMD_POLL 0x00eb /* caller sets number of bytes to receive */ 11 #define PSMOUSE_CMD_GETID 0x02f2 12 #define PSMOUSE_CMD_SETRATE 0x10f3 13 #define PSMOUSE_CMD_ENABLE 0x00f4 ··· 23 enum psmouse_state { 24 PSMOUSE_IGNORE, 25 PSMOUSE_INITIALIZING, 26 + PSMOUSE_RESYNCING, 27 PSMOUSE_CMD_MODE, 28 PSMOUSE_ACTIVATED, 29 }; ··· 38 void *private; 39 struct input_dev *dev; 40 struct ps2dev ps2dev; 41 + struct work_struct resync_work; 42 char *vendor; 43 char *name; 44 unsigned char packet[8]; 45 + unsigned char badbyte; 46 unsigned char pktcnt; 47 unsigned char pktsize; 48 unsigned char type; 49 + unsigned char acks_disable_command; 50 unsigned int model; 51 unsigned long last; 52 unsigned long out_of_sync; 53 + unsigned long num_resyncs; 54 enum psmouse_state state; 55 char devname[64]; 56 char phys[32]; ··· 54 unsigned int rate; 55 unsigned int resolution; 56 unsigned int resetafter; 57 + unsigned int resync_time; 58 unsigned int smartscroll; /* Logitech only */ 59 60 psmouse_ret_t (*protocol_handler)(struct psmouse *psmouse, struct pt_regs *regs); ··· 62 63 int (*reconnect)(struct psmouse *psmouse); 64 void (*disconnect)(struct psmouse *psmouse); 65 + int (*poll)(struct psmouse *psmouse); 66 67 void (*pt_activate)(struct psmouse *psmouse); 68 void (*pt_deactivate)(struct psmouse *psmouse);
+2
drivers/input/mouse/synaptics.c
··· 652 psmouse->disconnect = synaptics_disconnect; 653 psmouse->reconnect = synaptics_reconnect; 654 psmouse->pktsize = 6; 655 656 if (SYN_CAP_PASS_THROUGH(priv->capabilities)) 657 synaptics_pt_create(psmouse);
··· 652 psmouse->disconnect = synaptics_disconnect; 653 psmouse->reconnect = synaptics_reconnect; 654 psmouse->pktsize = 6; 655 + /* Synaptics can usually stay in sync without extra help */ 656 + psmouse->resync_time = 0; 657 658 if (SYN_CAP_PASS_THROUGH(priv->capabilities)) 659 synaptics_pt_create(psmouse);
+7
drivers/input/serio/i8042-x86ia64io.h
··· 173 DMI_MATCH(DMI_PRODUCT_NAME, "PC-MM20 Series"), 174 }, 175 }, 176 { } 177 }; 178
··· 173 DMI_MATCH(DMI_PRODUCT_NAME, "PC-MM20 Series"), 174 }, 175 }, 176 + { 177 + .ident = "Sony Vaio FS-115b", 178 + .matches = { 179 + DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), 180 + DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FS115B"), 181 + }, 182 + }, 183 { } 184 }; 185
+10
drivers/usb/input/Kconfig
··· 37 38 If unsure, say Y. 39 40 config HID_FF 41 bool "Force feedback support (EXPERIMENTAL)" 42 depends on USB_HIDINPUT && EXPERIMENTAL
··· 37 38 If unsure, say Y. 39 40 + config USB_HIDINPUT_POWERBOOK 41 + bool "Enable support for iBook/PowerBook special keys" 42 + default n 43 + depends on USB_HIDINPUT 44 + help 45 + Say Y here if you want support for the special keys (Fn, Numlock) on 46 + Apple iBooks and PowerBooks. 47 + 48 + If unsure, say N. 49 + 50 config HID_FF 51 bool "Force feedback support (EXPERIMENTAL)" 52 depends on USB_HIDINPUT && EXPERIMENTAL
+30
drivers/usb/input/hid-core.c
··· 1450 #define USB_VENDOR_ID_APPLE 0x05ac 1451 #define USB_DEVICE_ID_APPLE_POWERMOUSE 0x0304 1452 1453 /* 1454 * Alphabetically sorted blacklist by quirk type. 1455 */ ··· 1583 { USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_RUMBLEPAD, HID_QUIRK_BADPAD }, 1584 { USB_VENDOR_ID_TOPMAX, USB_DEVICE_ID_TOPMAX_COBRAPAD, HID_QUIRK_BADPAD }, 1585 1586 { 0, 0 } 1587 }; 1588 ··· 1637 usb_buffer_free(dev, sizeof(*(hid->cr)), hid->cr, hid->cr_dma); 1638 if (hid->ctrlbuf) 1639 usb_buffer_free(dev, hid->bufsize, hid->ctrlbuf, hid->ctrlbuf_dma); 1640 } 1641 1642 static struct hid_device *usb_hid_configure(struct usb_interface *intf) ··· 1699 kfree(rdesc); 1700 return NULL; 1701 } 1702 1703 #ifdef DEBUG_DATA 1704 printk(KERN_DEBUG __FILE__ ": report descriptor (size %u, read %d) = ", rsize, n);
··· 1450 #define USB_VENDOR_ID_APPLE 0x05ac 1451 #define USB_DEVICE_ID_APPLE_POWERMOUSE 0x0304 1452 1453 + #define USB_VENDOR_ID_CHERRY 0x046a 1454 + #define USB_DEVICE_ID_CHERRY_CYMOTION 0x0023 1455 + 1456 /* 1457 * Alphabetically sorted blacklist by quirk type. 1458 */ ··· 1580 { USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_RUMBLEPAD, HID_QUIRK_BADPAD }, 1581 { USB_VENDOR_ID_TOPMAX, USB_DEVICE_ID_TOPMAX_COBRAPAD, HID_QUIRK_BADPAD }, 1582 1583 + { USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION, HID_QUIRK_CYMOTION }, 1584 + 1585 + { USB_VENDOR_ID_APPLE, 0x020E, HID_QUIRK_POWERBOOK_HAS_FN }, 1586 + { USB_VENDOR_ID_APPLE, 0x020F, HID_QUIRK_POWERBOOK_HAS_FN }, 1587 + { USB_VENDOR_ID_APPLE, 0x0214, HID_QUIRK_POWERBOOK_HAS_FN }, 1588 + { USB_VENDOR_ID_APPLE, 0x0215, HID_QUIRK_POWERBOOK_HAS_FN }, 1589 + { USB_VENDOR_ID_APPLE, 0x0216, HID_QUIRK_POWERBOOK_HAS_FN }, 1590 + { USB_VENDOR_ID_APPLE, 0x030A, HID_QUIRK_POWERBOOK_HAS_FN }, 1591 + { USB_VENDOR_ID_APPLE, 0x030B, HID_QUIRK_POWERBOOK_HAS_FN }, 1592 + 1593 { 0, 0 } 1594 }; 1595 ··· 1624 usb_buffer_free(dev, sizeof(*(hid->cr)), hid->cr, hid->cr_dma); 1625 if (hid->ctrlbuf) 1626 usb_buffer_free(dev, hid->bufsize, hid->ctrlbuf, hid->ctrlbuf_dma); 1627 + } 1628 + 1629 + /* 1630 + * Cherry Cymotion keyboard have an invalid HID report descriptor, 1631 + * that needs fixing before we can parse it. 1632 + */ 1633 + 1634 + static void hid_fixup_cymotion_descriptor(char *rdesc, int rsize) 1635 + { 1636 + if (rsize >= 17 && rdesc[11] == 0x3c && rdesc[12] == 0x02) { 1637 + info("Fixing up Cherry Cymotion report descriptor"); 1638 + rdesc[11] = rdesc[16] = 0xff; 1639 + rdesc[12] = rdesc[17] = 0x03; 1640 + } 1641 } 1642 1643 static struct hid_device *usb_hid_configure(struct usb_interface *intf) ··· 1672 kfree(rdesc); 1673 return NULL; 1674 } 1675 + 1676 + if ((quirks & HID_QUIRK_CYMOTION)) 1677 + hid_fixup_cymotion_descriptor(rdesc, rsize); 1678 1679 #ifdef DEBUG_DATA 1680 printk(KERN_DEBUG __FILE__ ": report descriptor (size %u, read %d) = ", rsize, n);
+176 -3
drivers/usb/input/hid-input.c
··· 73 #define map_key_clear(c) do { map_key(c); clear_bit(c, bit); } while (0) 74 #define map_ff_effect(c) do { set_bit(c, input->ffbit); } while (0) 75 76 static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_field *field, 77 struct hid_usage *usage) 78 { ··· 289 case HID_UP_SIMULATION: 290 291 switch (usage->hid & 0xffff) { 292 - case 0xba: map_abs(ABS_RUDDER); break; 293 case 0xbb: map_abs(ABS_THROTTLE); break; 294 default: goto ignore; 295 } 296 break; ··· 446 case 0x226: map_key_clear(KEY_STOP); break; 447 case 0x227: map_key_clear(KEY_REFRESH); break; 448 case 0x22a: map_key_clear(KEY_BOOKMARKS); break; 449 case 0x238: map_rel(REL_HWHEEL); break; 450 case 0x279: map_key_clear(KEY_REDO); break; 451 case 0x289: map_key_clear(KEY_REPLY); break; 452 case 0x28b: map_key_clear(KEY_FORWARDMAIL); break; 453 case 0x28c: map_key_clear(KEY_SEND); break; 454 default: goto ignore; 455 } 456 break; ··· 490 491 set_bit(EV_REP, input->evbit); 492 switch(usage->hid & HID_USAGE) { 493 - case 0x003: map_key_clear(KEY_FN); break; 494 default: goto ignore; 495 } 496 break; ··· 652 return; 653 } 654 655 if (usage->hat_min < usage->hat_max || usage->hat_dir) { 656 int hat_dir = usage->hat_dir; 657 if (!hat_dir) ··· 697 return; 698 } 699 700 - if((usage->type == EV_KEY) && (usage->code == 0)) /* Key 0 is "unassigned", not KEY_UNKNOWN */ 701 return; 702 703 input_event(input, usage->type, usage->code, value);
··· 73 #define map_key_clear(c) do { map_key(c); clear_bit(c, bit); } while (0) 74 #define map_ff_effect(c) do { set_bit(c, input->ffbit); } while (0) 75 76 + #ifdef CONFIG_USB_HIDINPUT_POWERBOOK 77 + 78 + struct hidinput_key_translation { 79 + u16 from; 80 + u16 to; 81 + u8 flags; 82 + }; 83 + 84 + #define POWERBOOK_FLAG_FKEY 0x01 85 + 86 + static struct hidinput_key_translation powerbook_fn_keys[] = { 87 + { KEY_BACKSPACE, KEY_DELETE }, 88 + { KEY_F1, KEY_BRIGHTNESSDOWN, POWERBOOK_FLAG_FKEY }, 89 + { KEY_F2, KEY_BRIGHTNESSUP, POWERBOOK_FLAG_FKEY }, 90 + { KEY_F3, KEY_MUTE, POWERBOOK_FLAG_FKEY }, 91 + { KEY_F4, KEY_VOLUMEDOWN, POWERBOOK_FLAG_FKEY }, 92 + { KEY_F5, KEY_VOLUMEUP, POWERBOOK_FLAG_FKEY }, 93 + { KEY_F6, KEY_NUMLOCK, POWERBOOK_FLAG_FKEY }, 94 + { KEY_F7, KEY_SWITCHVIDEOMODE, POWERBOOK_FLAG_FKEY }, 95 + { KEY_F8, KEY_KBDILLUMTOGGLE, POWERBOOK_FLAG_FKEY }, 96 + { KEY_F9, KEY_KBDILLUMDOWN, POWERBOOK_FLAG_FKEY }, 97 + { KEY_F10, KEY_KBDILLUMUP, POWERBOOK_FLAG_FKEY }, 98 + { KEY_UP, KEY_PAGEUP }, 99 + { KEY_DOWN, KEY_PAGEDOWN }, 100 + { KEY_LEFT, KEY_HOME }, 101 + { KEY_RIGHT, KEY_END }, 102 + { } 103 + }; 104 + 105 + static struct hidinput_key_translation powerbook_numlock_keys[] = { 106 + { KEY_J, KEY_KP1 }, 107 + { KEY_K, KEY_KP2 }, 108 + { KEY_L, KEY_KP3 }, 109 + { KEY_U, KEY_KP4 }, 110 + { KEY_I, KEY_KP5 }, 111 + { KEY_O, KEY_KP6 }, 112 + { KEY_7, KEY_KP7 }, 113 + { KEY_8, KEY_KP8 }, 114 + { KEY_9, KEY_KP9 }, 115 + { KEY_M, KEY_KP0 }, 116 + { KEY_DOT, KEY_KPDOT }, 117 + { KEY_SLASH, KEY_KPPLUS }, 118 + { KEY_SEMICOLON, KEY_KPMINUS }, 119 + { KEY_P, KEY_KPASTERISK }, 120 + { KEY_MINUS, KEY_KPEQUAL }, 121 + { KEY_0, KEY_KPSLASH }, 122 + { KEY_F6, KEY_NUMLOCK }, 123 + { KEY_KPENTER, KEY_KPENTER }, 124 + { KEY_BACKSPACE, KEY_BACKSPACE }, 125 + { } 126 + }; 127 + 128 + static int usbhid_pb_fnmode = 1; 129 + module_param_named(pb_fnmode, usbhid_pb_fnmode, int, 0644); 130 + MODULE_PARM_DESC(pb_fnmode, 131 + "Mode of fn key on PowerBooks (0 = disabled, 1 = fkeyslast, 2 = fkeysfirst)"); 132 + 133 + static struct hidinput_key_translation *find_translation(struct hidinput_key_translation *table, u16 from) 134 + { 135 + struct hidinput_key_translation *trans; 136 + 137 + /* Look for the translation */ 138 + for (trans = table; trans->from; trans++) 139 + if (trans->from == from) 140 + return trans; 141 + 142 + return NULL; 143 + } 144 + 145 + static int hidinput_pb_event(struct hid_device *hid, struct input_dev *input, 146 + struct hid_usage *usage, __s32 value) 147 + { 148 + struct hidinput_key_translation *trans; 149 + 150 + if (usage->code == KEY_FN) { 151 + if (value) hid->quirks |= HID_QUIRK_POWERBOOK_FN_ON; 152 + else hid->quirks &= ~HID_QUIRK_POWERBOOK_FN_ON; 153 + 154 + input_event(input, usage->type, usage->code, value); 155 + 156 + return 1; 157 + } 158 + 159 + if (usbhid_pb_fnmode) { 160 + int do_translate; 161 + 162 + trans = find_translation(powerbook_fn_keys, usage->code); 163 + if (trans) { 164 + if (test_bit(usage->code, hid->pb_pressed_fn)) 165 + do_translate = 1; 166 + else if (trans->flags & POWERBOOK_FLAG_FKEY) 167 + do_translate = 168 + (usbhid_pb_fnmode == 2 && (hid->quirks & HID_QUIRK_POWERBOOK_FN_ON)) || 169 + (usbhid_pb_fnmode == 1 && !(hid->quirks & HID_QUIRK_POWERBOOK_FN_ON)); 170 + else 171 + do_translate = (hid->quirks & HID_QUIRK_POWERBOOK_FN_ON); 172 + 173 + if (do_translate) { 174 + if (value) 175 + set_bit(usage->code, hid->pb_pressed_fn); 176 + else 177 + clear_bit(usage->code, hid->pb_pressed_fn); 178 + 179 + input_event(input, usage->type, trans->to, value); 180 + 181 + return 1; 182 + } 183 + } 184 + 185 + if (test_bit(usage->code, hid->pb_pressed_numlock) || 186 + test_bit(LED_NUML, input->led)) { 187 + trans = find_translation(powerbook_numlock_keys, usage->code); 188 + 189 + if (trans) { 190 + if (value) 191 + set_bit(usage->code, hid->pb_pressed_numlock); 192 + else 193 + clear_bit(usage->code, hid->pb_pressed_numlock); 194 + 195 + input_event(input, usage->type, trans->to, value); 196 + } 197 + 198 + return 1; 199 + } 200 + } 201 + 202 + return 0; 203 + } 204 + 205 + static void hidinput_pb_setup(struct input_dev *input) 206 + { 207 + struct hidinput_key_translation *trans; 208 + 209 + set_bit(KEY_NUMLOCK, input->keybit); 210 + 211 + /* Enable all needed keys */ 212 + for (trans = powerbook_fn_keys; trans->from; trans++) 213 + set_bit(trans->to, input->keybit); 214 + 215 + for (trans = powerbook_numlock_keys; trans->from; trans++) 216 + set_bit(trans->to, input->keybit); 217 + } 218 + #else 219 + static inline int hidinput_pb_event(struct hid_device *hid, struct input_dev *input, 220 + struct hid_usage *usage, __s32 value) 221 + { 222 + return 0; 223 + } 224 + 225 + static inline void hidinput_pb_setup(struct input_dev *input) 226 + { 227 + } 228 + #endif 229 + 230 static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_field *field, 231 struct hid_usage *usage) 232 { ··· 135 case HID_UP_SIMULATION: 136 137 switch (usage->hid & 0xffff) { 138 + case 0xba: map_abs(ABS_RUDDER); break; 139 case 0xbb: map_abs(ABS_THROTTLE); break; 140 + case 0xc4: map_abs(ABS_GAS); break; 141 + case 0xc5: map_abs(ABS_BRAKE); break; 142 + case 0xc8: map_abs(ABS_WHEEL); break; 143 default: goto ignore; 144 } 145 break; ··· 289 case 0x226: map_key_clear(KEY_STOP); break; 290 case 0x227: map_key_clear(KEY_REFRESH); break; 291 case 0x22a: map_key_clear(KEY_BOOKMARKS); break; 292 + case 0x233: map_key_clear(KEY_SCROLLUP); break; 293 + case 0x234: map_key_clear(KEY_SCROLLDOWN); break; 294 case 0x238: map_rel(REL_HWHEEL); break; 295 case 0x279: map_key_clear(KEY_REDO); break; 296 case 0x289: map_key_clear(KEY_REPLY); break; 297 case 0x28b: map_key_clear(KEY_FORWARDMAIL); break; 298 case 0x28c: map_key_clear(KEY_SEND); break; 299 + 300 + /* Reported on a Cherry Cymotion keyboard */ 301 + case 0x301: map_key_clear(KEY_PROG1); break; 302 + case 0x302: map_key_clear(KEY_PROG2); break; 303 + case 0x303: map_key_clear(KEY_PROG3); break; 304 + 305 default: goto ignore; 306 } 307 break; ··· 325 326 set_bit(EV_REP, input->evbit); 327 switch(usage->hid & HID_USAGE) { 328 + case 0x003: 329 + /* The fn key on Apple PowerBooks */ 330 + map_key_clear(KEY_FN); 331 + hidinput_pb_setup(input); 332 + break; 333 + 334 default: goto ignore; 335 } 336 break; ··· 482 return; 483 } 484 485 + if ((hid->quirks & HID_QUIRK_POWERBOOK_HAS_FN) && hidinput_pb_event(hid, input, usage, value)) 486 + return; 487 + 488 if (usage->hat_min < usage->hat_max || usage->hat_dir) { 489 int hat_dir = usage->hat_dir; 490 if (!hat_dir) ··· 524 return; 525 } 526 527 + if ((usage->type == EV_KEY) && (usage->code == 0)) /* Key 0 is "unassigned", not KEY_UNKNOWN */ 528 return; 529 530 input_event(input, usage->type, usage->code, value);
+19 -11
drivers/usb/input/hid.h
··· 235 * HID device quirks. 236 */ 237 238 - #define HID_QUIRK_INVERT 0x001 239 - #define HID_QUIRK_NOTOUCH 0x002 240 - #define HID_QUIRK_IGNORE 0x004 241 - #define HID_QUIRK_NOGET 0x008 242 - #define HID_QUIRK_HIDDEV 0x010 243 - #define HID_QUIRK_BADPAD 0x020 244 - #define HID_QUIRK_MULTI_INPUT 0x040 245 - #define HID_QUIRK_2WHEEL_MOUSE_HACK_7 0x080 246 - #define HID_QUIRK_2WHEEL_MOUSE_HACK_5 0x100 247 - #define HID_QUIRK_2WHEEL_MOUSE_HACK_ON 0x200 248 - #define HID_QUIRK_2WHEEL_POWERMOUSE 0x400 249 250 /* 251 * This is the global environment of the parser. This information is ··· 434 void (*ff_exit)(struct hid_device*); /* Called by hid_exit_ff(hid) */ 435 int (*ff_event)(struct hid_device *hid, struct input_dev *input, 436 unsigned int type, unsigned int code, int value); 437 }; 438 439 #define HID_GLOBAL_STACK_SIZE 4
··· 235 * HID device quirks. 236 */ 237 238 + #define HID_QUIRK_INVERT 0x00000001 239 + #define HID_QUIRK_NOTOUCH 0x00000002 240 + #define HID_QUIRK_IGNORE 0x00000004 241 + #define HID_QUIRK_NOGET 0x00000008 242 + #define HID_QUIRK_HIDDEV 0x00000010 243 + #define HID_QUIRK_BADPAD 0x00000020 244 + #define HID_QUIRK_MULTI_INPUT 0x00000040 245 + #define HID_QUIRK_2WHEEL_MOUSE_HACK_7 0x00000080 246 + #define HID_QUIRK_2WHEEL_MOUSE_HACK_5 0x00000100 247 + #define HID_QUIRK_2WHEEL_MOUSE_HACK_ON 0x00000200 248 + #define HID_QUIRK_2WHEEL_POWERMOUSE 0x00000400 249 + #define HID_QUIRK_CYMOTION 0x00000800 250 + #define HID_QUIRK_POWERBOOK_HAS_FN 0x00001000 251 + #define HID_QUIRK_POWERBOOK_FN_ON 0x00002000 252 253 /* 254 * This is the global environment of the parser. This information is ··· 431 void (*ff_exit)(struct hid_device*); /* Called by hid_exit_ff(hid) */ 432 int (*ff_event)(struct hid_device *hid, struct input_dev *input, 433 unsigned int type, unsigned int code, int value); 434 + 435 + #ifdef CONFIG_USB_HIDINPUT_POWERBOOK 436 + unsigned long pb_pressed_fn[NBITS(KEY_MAX)]; 437 + unsigned long pb_pressed_numlock[NBITS(KEY_MAX)]; 438 + #endif 439 }; 440 441 #define HID_GLOBAL_STACK_SIZE 4
+1 -1
drivers/usb/input/pid.c
··· 259 int hid_pid_init(struct hid_device *hid) 260 { 261 struct hid_ff_pid *private; 262 - struct hid_input *hidinput = list_entry(&hid->inputs, struct hid_input, list); 263 struct input_dev *input_dev = hidinput->input; 264 265 private = hid->ff_private = kzalloc(sizeof(struct hid_ff_pid), GFP_KERNEL);
··· 259 int hid_pid_init(struct hid_device *hid) 260 { 261 struct hid_ff_pid *private; 262 + struct hid_input *hidinput = list_entry(hid->inputs.next, struct hid_input, list); 263 struct input_dev *input_dev = hidinput->input; 264 265 private = hid->ff_private = kzalloc(sizeof(struct hid_ff_pid), GFP_KERNEL);
+7 -7
drivers/usb/input/wacom.c
··· 95 enum { 96 PENPARTNER = 0, 97 GRAPHIRE, 98 - G4, 99 PL, 100 INTUOS, 101 INTUOS3, ··· 373 374 case 2: /* Mouse with wheel */ 375 input_report_key(dev, BTN_MIDDLE, data[1] & 0x04); 376 - if (wacom->features->type == G4) { 377 rw = data[7] & 0x04 ? -(data[7] & 0x03) : (data[7] & 0x03); 378 input_report_rel(dev, REL_WHEEL, rw); 379 } else ··· 385 id = CURSOR_DEVICE_ID; 386 input_report_key(dev, BTN_LEFT, data[1] & 0x01); 387 input_report_key(dev, BTN_RIGHT, data[1] & 0x02); 388 - if (wacom->features->type == G4) 389 input_report_abs(dev, ABS_DISTANCE, data[6]); 390 else 391 input_report_abs(dev, ABS_DISTANCE, data[7]); ··· 410 input_sync(dev); 411 412 /* send pad data */ 413 - if (wacom->features->type == G4) { 414 /* fist time sending pad data */ 415 if (wacom->tool[1] != BTN_TOOL_FINGER) { 416 wacom->id[1] = 0; ··· 713 { "Wacom Graphire2 5x7", 8, 13918, 10206, 511, 32, GRAPHIRE, wacom_graphire_irq }, 714 { "Wacom Graphire3", 8, 10208, 7424, 511, 32, GRAPHIRE, wacom_graphire_irq }, 715 { "Wacom Graphire3 6x8", 8, 16704, 12064, 511, 32, GRAPHIRE, wacom_graphire_irq }, 716 - { "Wacom Graphire4 4x5", 8, 10208, 7424, 511, 32, G4, wacom_graphire_irq }, 717 - { "Wacom Graphire4 6x8", 8, 16704, 12064, 511, 32, G4, wacom_graphire_irq }, 718 { "Wacom Volito", 8, 5104, 3712, 511, 32, GRAPHIRE, wacom_graphire_irq }, 719 { "Wacom PenStation2", 8, 3250, 2320, 255, 32, GRAPHIRE, wacom_graphire_irq }, 720 { "Wacom Volito2 4x5", 8, 5104, 3712, 511, 32, GRAPHIRE, wacom_graphire_irq }, ··· 859 input_set_abs_params(input_dev, ABS_PRESSURE, 0, wacom->features->pressure_max, 0, 0); 860 861 switch (wacom->features->type) { 862 - case G4: 863 input_dev->evbit[0] |= BIT(EV_MSC); 864 input_dev->mscbit[0] |= BIT(MSC_SERIAL); 865 input_dev->keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_FINGER);
··· 95 enum { 96 PENPARTNER = 0, 97 GRAPHIRE, 98 + WACOM_G4, 99 PL, 100 INTUOS, 101 INTUOS3, ··· 373 374 case 2: /* Mouse with wheel */ 375 input_report_key(dev, BTN_MIDDLE, data[1] & 0x04); 376 + if (wacom->features->type == WACOM_G4) { 377 rw = data[7] & 0x04 ? -(data[7] & 0x03) : (data[7] & 0x03); 378 input_report_rel(dev, REL_WHEEL, rw); 379 } else ··· 385 id = CURSOR_DEVICE_ID; 386 input_report_key(dev, BTN_LEFT, data[1] & 0x01); 387 input_report_key(dev, BTN_RIGHT, data[1] & 0x02); 388 + if (wacom->features->type == WACOM_G4) 389 input_report_abs(dev, ABS_DISTANCE, data[6]); 390 else 391 input_report_abs(dev, ABS_DISTANCE, data[7]); ··· 410 input_sync(dev); 411 412 /* send pad data */ 413 + if (wacom->features->type == WACOM_G4) { 414 /* fist time sending pad data */ 415 if (wacom->tool[1] != BTN_TOOL_FINGER) { 416 wacom->id[1] = 0; ··· 713 { "Wacom Graphire2 5x7", 8, 13918, 10206, 511, 32, GRAPHIRE, wacom_graphire_irq }, 714 { "Wacom Graphire3", 8, 10208, 7424, 511, 32, GRAPHIRE, wacom_graphire_irq }, 715 { "Wacom Graphire3 6x8", 8, 16704, 12064, 511, 32, GRAPHIRE, wacom_graphire_irq }, 716 + { "Wacom Graphire4 4x5", 8, 10208, 7424, 511, 32, WACOM_G4, wacom_graphire_irq }, 717 + { "Wacom Graphire4 6x8", 8, 16704, 12064, 511, 32, WACOM_G4, wacom_graphire_irq }, 718 { "Wacom Volito", 8, 5104, 3712, 511, 32, GRAPHIRE, wacom_graphire_irq }, 719 { "Wacom PenStation2", 8, 3250, 2320, 255, 32, GRAPHIRE, wacom_graphire_irq }, 720 { "Wacom Volito2 4x5", 8, 5104, 3712, 511, 32, GRAPHIRE, wacom_graphire_irq }, ··· 859 input_set_abs_params(input_dev, ABS_PRESSURE, 0, wacom->features->pressure_max, 0, 0); 860 861 switch (wacom->features->type) { 862 + case WACOM_G4: 863 input_dev->evbit[0] |= BIT(EV_MSC); 864 input_dev->mscbit[0] |= BIT(MSC_SERIAL); 865 input_dev->keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_FINGER);