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: hp_sdc_rtc - fix test in hp_sdc_rtc_read_rt()
Input: atkbd - consolidate force release quirks for volume keys
Input: logips2pp - model 73 is actually TrackMan FX
Input: i8042 - add Sony Vaio VGN-FZ240E to the nomux list
Input: fix locking issue in /proc/bus/input/ handlers
Input: atkbd - postpone restoring LED/repeat rate at resume
Input: atkbd - restore resetting LED state at startup
Input: i8042 - make pnp_data_busted variable boolean instead of int
Input: synaptics - add another Protege M300 to rate blacklist

+127 -61
+48 -17
drivers/input/input.c
··· 782 782 return 0; 783 783 } 784 784 785 + union input_seq_state { 786 + struct { 787 + unsigned short pos; 788 + bool mutex_acquired; 789 + }; 790 + void *p; 791 + }; 792 + 785 793 static void *input_devices_seq_start(struct seq_file *seq, loff_t *pos) 786 794 { 787 - if (mutex_lock_interruptible(&input_mutex)) 788 - return NULL; 795 + union input_seq_state *state = (union input_seq_state *)&seq->private; 796 + int error; 797 + 798 + /* We need to fit into seq->private pointer */ 799 + BUILD_BUG_ON(sizeof(union input_seq_state) != sizeof(seq->private)); 800 + 801 + error = mutex_lock_interruptible(&input_mutex); 802 + if (error) { 803 + state->mutex_acquired = false; 804 + return ERR_PTR(error); 805 + } 806 + 807 + state->mutex_acquired = true; 789 808 790 809 return seq_list_start(&input_dev_list, *pos); 791 810 } ··· 814 795 return seq_list_next(v, &input_dev_list, pos); 815 796 } 816 797 817 - static void input_devices_seq_stop(struct seq_file *seq, void *v) 798 + static void input_seq_stop(struct seq_file *seq, void *v) 818 799 { 819 - mutex_unlock(&input_mutex); 800 + union input_seq_state *state = (union input_seq_state *)&seq->private; 801 + 802 + if (state->mutex_acquired) 803 + mutex_unlock(&input_mutex); 820 804 } 821 805 822 806 static void input_seq_print_bitmap(struct seq_file *seq, const char *name, ··· 883 861 static const struct seq_operations input_devices_seq_ops = { 884 862 .start = input_devices_seq_start, 885 863 .next = input_devices_seq_next, 886 - .stop = input_devices_seq_stop, 864 + .stop = input_seq_stop, 887 865 .show = input_devices_seq_show, 888 866 }; 889 867 ··· 903 881 904 882 static void *input_handlers_seq_start(struct seq_file *seq, loff_t *pos) 905 883 { 906 - if (mutex_lock_interruptible(&input_mutex)) 907 - return NULL; 884 + union input_seq_state *state = (union input_seq_state *)&seq->private; 885 + int error; 908 886 909 - seq->private = (void *)(unsigned long)*pos; 887 + /* We need to fit into seq->private pointer */ 888 + BUILD_BUG_ON(sizeof(union input_seq_state) != sizeof(seq->private)); 889 + 890 + error = mutex_lock_interruptible(&input_mutex); 891 + if (error) { 892 + state->mutex_acquired = false; 893 + return ERR_PTR(error); 894 + } 895 + 896 + state->mutex_acquired = true; 897 + state->pos = *pos; 898 + 910 899 return seq_list_start(&input_handler_list, *pos); 911 900 } 912 901 913 902 static void *input_handlers_seq_next(struct seq_file *seq, void *v, loff_t *pos) 914 903 { 915 - seq->private = (void *)(unsigned long)(*pos + 1); 916 - return seq_list_next(v, &input_handler_list, pos); 917 - } 904 + union input_seq_state *state = (union input_seq_state *)&seq->private; 918 905 919 - static void input_handlers_seq_stop(struct seq_file *seq, void *v) 920 - { 921 - mutex_unlock(&input_mutex); 906 + state->pos = *pos + 1; 907 + return seq_list_next(v, &input_handler_list, pos); 922 908 } 923 909 924 910 static int input_handlers_seq_show(struct seq_file *seq, void *v) 925 911 { 926 912 struct input_handler *handler = container_of(v, struct input_handler, node); 913 + union input_seq_state *state = (union input_seq_state *)&seq->private; 927 914 928 - seq_printf(seq, "N: Number=%ld Name=%s", 929 - (unsigned long)seq->private, handler->name); 915 + seq_printf(seq, "N: Number=%u Name=%s", state->pos, handler->name); 930 916 if (handler->fops) 931 917 seq_printf(seq, " Minor=%d", handler->minor); 932 918 seq_putc(seq, '\n'); 933 919 934 920 return 0; 935 921 } 922 + 936 923 static const struct seq_operations input_handlers_seq_ops = { 937 924 .start = input_handlers_seq_start, 938 925 .next = input_handlers_seq_next, 939 - .stop = input_handlers_seq_stop, 926 + .stop = input_seq_stop, 940 927 .show = input_handlers_seq_show, 941 928 }; 942 929
+55 -41
drivers/input/keyboard/atkbd.c
··· 574 574 575 575 mutex_lock(&atkbd->event_mutex); 576 576 577 - if (test_and_clear_bit(ATKBD_LED_EVENT_BIT, &atkbd->event_mask)) 578 - atkbd_set_leds(atkbd); 577 + if (!atkbd->enabled) { 578 + /* 579 + * Serio ports are resumed asynchronously so while driver core 580 + * thinks that device is already fully operational in reality 581 + * it may not be ready yet. In this case we need to keep 582 + * rescheduling till reconnect completes. 583 + */ 584 + schedule_delayed_work(&atkbd->event_work, 585 + msecs_to_jiffies(100)); 586 + } else { 587 + if (test_and_clear_bit(ATKBD_LED_EVENT_BIT, &atkbd->event_mask)) 588 + atkbd_set_leds(atkbd); 579 589 580 - if (test_and_clear_bit(ATKBD_REP_EVENT_BIT, &atkbd->event_mask)) 581 - atkbd_set_repeat_rate(atkbd); 590 + if (test_and_clear_bit(ATKBD_REP_EVENT_BIT, &atkbd->event_mask)) 591 + atkbd_set_repeat_rate(atkbd); 592 + } 582 593 583 594 mutex_unlock(&atkbd->event_mutex); 584 595 } ··· 781 770 return 3; 782 771 } 783 772 773 + static int atkbd_reset_state(struct atkbd *atkbd) 774 + { 775 + struct ps2dev *ps2dev = &atkbd->ps2dev; 776 + unsigned char param[1]; 777 + 778 + /* 779 + * Set the LEDs to a predefined state (all off). 780 + */ 781 + 782 + param[0] = 0; 783 + if (ps2_command(ps2dev, param, ATKBD_CMD_SETLEDS)) 784 + return -1; 785 + 786 + /* 787 + * Set autorepeat to fastest possible. 788 + */ 789 + 790 + param[0] = 0; 791 + if (ps2_command(ps2dev, param, ATKBD_CMD_SETREP)) 792 + return -1; 793 + 794 + return 0; 795 + } 796 + 784 797 static int atkbd_activate(struct atkbd *atkbd) 785 798 { 786 799 struct ps2dev *ps2dev = &atkbd->ps2dev; ··· 887 852 }; 888 853 889 854 /* 890 - * Inventec system with broken key release on volume keys 891 - */ 892 - static unsigned int atkbd_inventec_forced_release_keys[] = { 893 - 0xae, 0xb0, -1U 894 - }; 895 - 896 - /* 897 - * Perform fixup for HP Pavilion ZV6100 laptop that doesn't generate release 898 - * for its volume buttons 899 - */ 900 - static unsigned int atkbd_hp_zv6100_forced_release_keys[] = { 901 - 0xae, 0xb0, -1U 902 - }; 903 - 904 - /* 905 - * Perform fixup for HP (Compaq) Presario R4000 R4100 R4200 that don't generate 906 - * release for their volume buttons 907 - */ 908 - static unsigned int atkbd_hp_r4000_forced_release_keys[] = { 909 - 0xae, 0xb0, -1U 910 - }; 911 - 912 - /* 913 855 * Samsung NC10,NC20 with Fn+F? key release not working 914 856 */ 915 857 static unsigned int atkbd_samsung_forced_release_keys[] = { 916 858 0x82, 0x83, 0x84, 0x86, 0x88, 0x89, 0xb3, 0xf7, 0xf9, -1U 917 - }; 918 - 919 - /* 920 - * The volume up and volume down special keys on a Fujitsu Amilo PA 1510 laptop 921 - * do not generate release events so we have to do it ourselves. 922 - */ 923 - static unsigned int atkbd_amilo_pa1510_forced_release_keys[] = { 924 - 0xb0, 0xae, -1U 925 859 }; 926 860 927 861 /* ··· 912 908 */ 913 909 static unsigned int atkdb_soltech_ta12_forced_release_keys[] = { 914 910 0xa0, 0xae, 0xb0, -1U 911 + }; 912 + 913 + /* 914 + * Many notebooks don't send key release event for volume up/down 915 + * keys, with key list below common among them 916 + */ 917 + static unsigned int atkbd_volume_forced_release_keys[] = { 918 + 0xae, 0xb0, -1U 915 919 }; 916 920 917 921 /* ··· 1099 1087 } 1100 1088 1101 1089 atkbd->set = atkbd_select_set(atkbd, atkbd_set, atkbd_extra); 1090 + atkbd_reset_state(atkbd); 1102 1091 atkbd_activate(atkbd); 1103 1092 1104 1093 } else { ··· 1280 1267 1281 1268 atkbd->dev = new_dev; 1282 1269 atkbd->set = atkbd_select_set(atkbd, atkbd->set, value); 1270 + atkbd_reset_state(atkbd); 1283 1271 atkbd_activate(atkbd); 1284 1272 atkbd_set_keycode_table(atkbd); 1285 1273 atkbd_set_device_attrs(atkbd); ··· 1562 1548 DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion ZV6100"), 1563 1549 }, 1564 1550 .callback = atkbd_setup_forced_release, 1565 - .driver_data = atkbd_hp_zv6100_forced_release_keys, 1551 + .driver_data = atkbd_volume_forced_release_keys, 1566 1552 }, 1567 1553 { 1568 1554 .ident = "HP Presario R4000", ··· 1571 1557 DMI_MATCH(DMI_PRODUCT_NAME, "Presario R4000"), 1572 1558 }, 1573 1559 .callback = atkbd_setup_forced_release, 1574 - .driver_data = atkbd_hp_r4000_forced_release_keys, 1560 + .driver_data = atkbd_volume_forced_release_keys, 1575 1561 }, 1576 1562 { 1577 1563 .ident = "HP Presario R4100", ··· 1580 1566 DMI_MATCH(DMI_PRODUCT_NAME, "Presario R4100"), 1581 1567 }, 1582 1568 .callback = atkbd_setup_forced_release, 1583 - .driver_data = atkbd_hp_r4000_forced_release_keys, 1569 + .driver_data = atkbd_volume_forced_release_keys, 1584 1570 }, 1585 1571 { 1586 1572 .ident = "HP Presario R4200", ··· 1589 1575 DMI_MATCH(DMI_PRODUCT_NAME, "Presario R4200"), 1590 1576 }, 1591 1577 .callback = atkbd_setup_forced_release, 1592 - .driver_data = atkbd_hp_r4000_forced_release_keys, 1578 + .driver_data = atkbd_volume_forced_release_keys, 1593 1579 }, 1594 1580 { 1595 1581 .ident = "Inventec Symphony", ··· 1598 1584 DMI_MATCH(DMI_PRODUCT_NAME, "SYMPHONY 6.0/7.0"), 1599 1585 }, 1600 1586 .callback = atkbd_setup_forced_release, 1601 - .driver_data = atkbd_inventec_forced_release_keys, 1587 + .driver_data = atkbd_volume_forced_release_keys, 1602 1588 }, 1603 1589 { 1604 1590 .ident = "Samsung NC10", ··· 1634 1620 DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pa 1510"), 1635 1621 }, 1636 1622 .callback = atkbd_setup_forced_release, 1637 - .driver_data = atkbd_amilo_pa1510_forced_release_keys, 1623 + .driver_data = atkbd_volume_forced_release_keys, 1638 1624 }, 1639 1625 { 1640 1626 .ident = "Fujitsu Amilo Pi 3525",
+1 -1
drivers/input/misc/hp_sdc_rtc.c
··· 209 209 210 210 /* Read the i8042 fast handshake timer */ 211 211 static inline int hp_sdc_rtc_read_fhs(struct timeval *res) { 212 - uint64_t raw; 212 + int64_t raw; 213 213 unsigned int tenms; 214 214 215 215 raw = hp_sdc_rtc_read_i8042timer(HP_SDC_CMD_LOAD_FHS, 2);
+1 -1
drivers/input/mouse/logips2pp.c
··· 219 219 PS2PP_WHEEL | PS2PP_SIDE_BTN | PS2PP_TASK_BTN | 220 220 PS2PP_EXTRA_BTN | PS2PP_NAV_BTN | PS2PP_HWHEEL }, 221 221 { 72, PS2PP_KIND_TRACKMAN, 0 }, /* T-CH11: TrackMan Marble */ 222 - { 73, 0, PS2PP_SIDE_BTN }, 222 + { 73, PS2PP_KIND_TRACKMAN, PS2PP_SIDE_BTN }, /* TrackMan FX */ 223 223 { 75, PS2PP_KIND_WHEEL, PS2PP_WHEEL }, 224 224 { 76, PS2PP_KIND_WHEEL, PS2PP_WHEEL }, 225 225 { 79, PS2PP_KIND_TRACKMAN, PS2PP_WHEEL }, /* TrackMan with wheel */
+10
drivers/input/mouse/synaptics.c
··· 652 652 DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), 653 653 DMI_MATCH(DMI_PRODUCT_NAME, "PORTEGE M300"), 654 654 }, 655 + 656 + }, 657 + { 658 + .ident = "Toshiba Portege M300", 659 + .matches = { 660 + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), 661 + DMI_MATCH(DMI_PRODUCT_NAME, "Portable PC"), 662 + DMI_MATCH(DMI_PRODUCT_VERSION, "Version 1.0"), 663 + }, 664 + 655 665 }, 656 666 { } 657 667 };
+12 -1
drivers/input/serio/i8042-x86ia64io.h
··· 327 327 }, 328 328 }, 329 329 { 330 + /* 331 + * Reset and GET ID commands issued via KBD port are 332 + * sometimes being delivered to AUX3. 333 + */ 334 + .ident = "Sony Vaio FZ-240E", 335 + .matches = { 336 + DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), 337 + DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FZ240E"), 338 + }, 339 + }, 340 + { 330 341 .ident = "Amoi M636/A737", 331 342 .matches = { 332 343 DMI_MATCH(DMI_SYS_VENDOR, "Amoi Electronics CO.,LTD."), ··· 672 661 static int __init i8042_pnp_init(void) 673 662 { 674 663 char kbd_irq_str[4] = { 0 }, aux_irq_str[4] = { 0 }; 675 - int pnp_data_busted = false; 664 + bool pnp_data_busted = false; 676 665 int err; 677 666 678 667 #ifdef CONFIG_X86