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: sentelic - fix left/right horizontal scroll mapping
Input: pmouse - move Sentelic probe down the list
Input: add compat support for sysfs and /proc capabilities output
Input: i8042 - add Dritek quirk for Acer Aspire 5610.
Input: xbox - do not use GFP_KERNEL under spinlock
Input: psmouse - fix Synaptics detection when protocol is disabled
Input: bcm5974 - report ABS_MT events
Input: davinci_keyscan - add device_enable method to platform data
Input: evdev - be less aggressive about sending SIGIO notifies
Input: atkbd - fix canceling event_work in disconnect
Input: serio - fix potential deadlock when unbinding drivers
Input: gf2k - fix &&/|| confusion in gf2k_connect()

+207 -120
+1
arch/arm/mach-davinci/include/mach/keyscan.h
··· 29 29 }; 30 30 31 31 struct davinci_ks_platform_data { 32 + int (*device_enable)(struct device *dev); 32 33 unsigned short *keymap; 33 34 u32 keymapsize; 34 35 u8 rep:1;
+2 -1
drivers/input/evdev.c
··· 59 59 client->head &= EVDEV_BUFFER_SIZE - 1; 60 60 spin_unlock(&client->buffer_lock); 61 61 62 - kill_fasync(&client->fasync, SIGIO, POLL_IN); 62 + if (event->type == EV_SYN) 63 + kill_fasync(&client->fasync, SIGIO, POLL_IN); 63 64 } 64 65 65 66 /*
+70 -14
drivers/input/input.c
··· 24 24 #include <linux/mutex.h> 25 25 #include <linux/rcupdate.h> 26 26 #include <linux/smp_lock.h> 27 + #include "input-compat.h" 27 28 28 29 MODULE_AUTHOR("Vojtech Pavlik <vojtech@suse.cz>"); 29 30 MODULE_DESCRIPTION("Input core"); ··· 765 764 return error; 766 765 } 767 766 767 + #ifdef CONFIG_COMPAT 768 + 769 + static int input_bits_to_string(char *buf, int buf_size, 770 + unsigned long bits, bool skip_empty) 771 + { 772 + int len = 0; 773 + 774 + if (INPUT_COMPAT_TEST) { 775 + u32 dword = bits >> 32; 776 + if (dword || !skip_empty) 777 + len += snprintf(buf, buf_size, "%x ", dword); 778 + 779 + dword = bits & 0xffffffffUL; 780 + if (dword || !skip_empty || len) 781 + len += snprintf(buf + len, max(buf_size - len, 0), 782 + "%x", dword); 783 + } else { 784 + if (bits || !skip_empty) 785 + len += snprintf(buf, buf_size, "%lx", bits); 786 + } 787 + 788 + return len; 789 + } 790 + 791 + #else /* !CONFIG_COMPAT */ 792 + 793 + static int input_bits_to_string(char *buf, int buf_size, 794 + unsigned long bits, bool skip_empty) 795 + { 796 + return bits || !skip_empty ? 797 + snprintf(buf, buf_size, "%lx", bits) : 0; 798 + } 799 + 800 + #endif 768 801 769 802 #ifdef CONFIG_PROC_FS 770 803 ··· 867 832 unsigned long *bitmap, int max) 868 833 { 869 834 int i; 870 - 871 - for (i = BITS_TO_LONGS(max) - 1; i > 0; i--) 872 - if (bitmap[i]) 873 - break; 835 + bool skip_empty = true; 836 + char buf[18]; 874 837 875 838 seq_printf(seq, "B: %s=", name); 876 - for (; i >= 0; i--) 877 - seq_printf(seq, "%lx%s", bitmap[i], i > 0 ? " " : ""); 839 + 840 + for (i = BITS_TO_LONGS(max) - 1; i >= 0; i--) { 841 + if (input_bits_to_string(buf, sizeof(buf), 842 + bitmap[i], skip_empty)) { 843 + skip_empty = false; 844 + seq_printf(seq, "%s%s", buf, i > 0 ? " " : ""); 845 + } 846 + } 847 + 848 + /* 849 + * If no output was produced print a single 0. 850 + */ 851 + if (skip_empty) 852 + seq_puts(seq, "0"); 853 + 878 854 seq_putc(seq, '\n'); 879 855 } 880 856 ··· 1174 1128 { 1175 1129 int i; 1176 1130 int len = 0; 1131 + bool skip_empty = true; 1177 1132 1178 - for (i = BITS_TO_LONGS(max) - 1; i > 0; i--) 1179 - if (bitmap[i]) 1180 - break; 1133 + for (i = BITS_TO_LONGS(max) - 1; i >= 0; i--) { 1134 + len += input_bits_to_string(buf + len, max(buf_size - len, 0), 1135 + bitmap[i], skip_empty); 1136 + if (len) { 1137 + skip_empty = false; 1138 + if (i > 0) 1139 + len += snprintf(buf + len, max(buf_size - len, 0), " "); 1140 + } 1141 + } 1181 1142 1182 - for (; i >= 0; i--) 1183 - len += snprintf(buf + len, max(buf_size - len, 0), 1184 - "%lx%s", bitmap[i], i > 0 ? " " : ""); 1143 + /* 1144 + * If no output was produced print a single 0. 1145 + */ 1146 + if (len == 0) 1147 + len = snprintf(buf, buf_size, "%d", 0); 1185 1148 1186 1149 if (add_cr) 1187 1150 len += snprintf(buf + len, max(buf_size - len, 0), "\n"); ··· 1205 1150 { \ 1206 1151 struct input_dev *input_dev = to_input_dev(dev); \ 1207 1152 int len = input_print_bitmap(buf, PAGE_SIZE, \ 1208 - input_dev->bm##bit, ev##_MAX, 1); \ 1153 + input_dev->bm##bit, ev##_MAX, \ 1154 + true); \ 1209 1155 return min_t(int, len, PAGE_SIZE); \ 1210 1156 } \ 1211 1157 static DEVICE_ATTR(bm, S_IRUGO, input_dev_show_cap_##bm, NULL) ··· 1270 1214 1271 1215 len = input_print_bitmap(&env->buf[env->buflen - 1], 1272 1216 sizeof(env->buf) - env->buflen, 1273 - bitmap, max, 0); 1217 + bitmap, max, false); 1274 1218 if (len >= (sizeof(env->buf) - env->buflen)) 1275 1219 return -ENOMEM; 1276 1220
+1 -1
drivers/input/joystick/gf2k.c
··· 277 277 } 278 278 279 279 #ifdef RESET_WORKS 280 - if ((gf2k->id != (GB(19,2,0) | GB(15,3,2) | GB(12,3,5))) || 280 + if ((gf2k->id != (GB(19,2,0) | GB(15,3,2) | GB(12,3,5))) && 281 281 (gf2k->id != (GB(31,2,0) | GB(27,3,2) | GB(24,3,5)))) { 282 282 err = -ENODEV; 283 283 goto fail2;
+2 -2
drivers/input/joystick/xpad.c
··· 446 446 } 447 447 448 448 exit: 449 - retval = usb_submit_urb (urb, GFP_ATOMIC); 449 + retval = usb_submit_urb(urb, GFP_ATOMIC); 450 450 if (retval) 451 451 err ("%s - usb_submit_urb failed with result %d", 452 452 __func__, retval); ··· 571 571 xpad->odata[6] = 0x00; 572 572 xpad->odata[7] = 0x00; 573 573 xpad->irq_out->transfer_buffer_length = 8; 574 - usb_submit_urb(xpad->irq_out, GFP_KERNEL); 574 + usb_submit_urb(xpad->irq_out, GFP_ATOMIC); 575 575 } 576 576 577 577 return 0;
+33 -36
drivers/input/keyboard/atkbd.c
··· 225 225 226 226 struct delayed_work event_work; 227 227 unsigned long event_jiffies; 228 - struct mutex event_mutex; 229 228 unsigned long event_mask; 229 + 230 + /* Serializes reconnect(), attr->set() and event work */ 231 + struct mutex mutex; 230 232 }; 231 233 232 234 /* ··· 579 577 { 580 578 struct atkbd *atkbd = container_of(work, struct atkbd, event_work.work); 581 579 582 - mutex_lock(&atkbd->event_mutex); 580 + mutex_lock(&atkbd->mutex); 583 581 584 582 if (!atkbd->enabled) { 585 583 /* ··· 598 596 atkbd_set_repeat_rate(atkbd); 599 597 } 600 598 601 - mutex_unlock(&atkbd->event_mutex); 599 + mutex_unlock(&atkbd->mutex); 602 600 } 603 601 604 602 /* ··· 614 612 615 613 atkbd->event_jiffies = jiffies; 616 614 set_bit(event_bit, &atkbd->event_mask); 617 - wmb(); 615 + mb(); 618 616 schedule_delayed_work(&atkbd->event_work, delay); 619 617 } 620 618 ··· 851 849 { 852 850 struct atkbd *atkbd = serio_get_drvdata(serio); 853 851 852 + sysfs_remove_group(&serio->dev.kobj, &atkbd_attribute_group); 853 + 854 854 atkbd_disable(atkbd); 855 855 856 - /* make sure we don't have a command in flight */ 856 + input_unregister_device(atkbd->dev); 857 + 858 + /* 859 + * Make sure we don't have a command in flight. 860 + * Note that since atkbd->enabled is false event work will keep 861 + * rescheduling itself until it gets canceled and will not try 862 + * accessing freed input device or serio port. 863 + */ 857 864 cancel_delayed_work_sync(&atkbd->event_work); 858 865 859 - sysfs_remove_group(&serio->dev.kobj, &atkbd_attribute_group); 860 - input_unregister_device(atkbd->dev); 861 866 serio_close(serio); 862 867 serio_set_drvdata(serio, NULL); 863 868 kfree(atkbd); ··· 1096 1087 atkbd->dev = dev; 1097 1088 ps2_init(&atkbd->ps2dev, serio); 1098 1089 INIT_DELAYED_WORK(&atkbd->event_work, atkbd_event_work); 1099 - mutex_init(&atkbd->event_mutex); 1090 + mutex_init(&atkbd->mutex); 1100 1091 1101 1092 switch (serio->id.type) { 1102 1093 ··· 1169 1160 { 1170 1161 struct atkbd *atkbd = serio_get_drvdata(serio); 1171 1162 struct serio_driver *drv = serio->drv; 1163 + int retval = -1; 1172 1164 1173 1165 if (!atkbd || !drv) { 1174 1166 printk(KERN_DEBUG "atkbd: reconnect request, but serio is disconnected, ignoring...\n"); 1175 1167 return -1; 1176 1168 } 1177 1169 1170 + mutex_lock(&atkbd->mutex); 1171 + 1178 1172 atkbd_disable(atkbd); 1179 1173 1180 1174 if (atkbd->write) { 1181 1175 if (atkbd_probe(atkbd)) 1182 - return -1; 1176 + goto out; 1177 + 1183 1178 if (atkbd->set != atkbd_select_set(atkbd, atkbd->set, atkbd->extra)) 1184 - return -1; 1179 + goto out; 1185 1180 1186 1181 atkbd_activate(atkbd); 1187 1182 ··· 1203 1190 } 1204 1191 1205 1192 atkbd_enable(atkbd); 1193 + retval = 0; 1206 1194 1207 - return 0; 1195 + out: 1196 + mutex_unlock(&atkbd->mutex); 1197 + return retval; 1208 1198 } 1209 1199 1210 1200 static struct serio_device_id atkbd_serio_ids[] = { ··· 1251 1235 ssize_t (*handler)(struct atkbd *, char *)) 1252 1236 { 1253 1237 struct serio *serio = to_serio_port(dev); 1254 - int retval; 1238 + struct atkbd *atkbd = serio_get_drvdata(serio); 1255 1239 1256 - retval = serio_pin_driver(serio); 1257 - if (retval) 1258 - return retval; 1259 - 1260 - if (serio->drv != &atkbd_drv) { 1261 - retval = -ENODEV; 1262 - goto out; 1263 - } 1264 - 1265 - retval = handler((struct atkbd *)serio_get_drvdata(serio), buf); 1266 - 1267 - out: 1268 - serio_unpin_driver(serio); 1269 - return retval; 1240 + return handler(atkbd, buf); 1270 1241 } 1271 1242 1272 1243 static ssize_t atkbd_attr_set_helper(struct device *dev, const char *buf, size_t count, 1273 1244 ssize_t (*handler)(struct atkbd *, const char *, size_t)) 1274 1245 { 1275 1246 struct serio *serio = to_serio_port(dev); 1276 - struct atkbd *atkbd; 1247 + struct atkbd *atkbd = serio_get_drvdata(serio); 1277 1248 int retval; 1278 1249 1279 - retval = serio_pin_driver(serio); 1250 + retval = mutex_lock_interruptible(&atkbd->mutex); 1280 1251 if (retval) 1281 1252 return retval; 1282 1253 1283 - if (serio->drv != &atkbd_drv) { 1284 - retval = -ENODEV; 1285 - goto out; 1286 - } 1287 - 1288 - atkbd = serio_get_drvdata(serio); 1289 1254 atkbd_disable(atkbd); 1290 1255 retval = handler(atkbd, buf, count); 1291 1256 atkbd_enable(atkbd); 1292 1257 1293 - out: 1294 - serio_unpin_driver(serio); 1258 + mutex_unlock(&atkbd->mutex); 1259 + 1295 1260 return retval; 1296 1261 } 1297 1262
+8
drivers/input/keyboard/davinci_keyscan.c
··· 174 174 struct davinci_ks_platform_data *pdata = pdev->dev.platform_data; 175 175 int error, i; 176 176 177 + if (pdata->device_enable) { 178 + error = pdata->device_enable(dev); 179 + if (error < 0) { 180 + dev_dbg(dev, "device enable function failed\n"); 181 + return error; 182 + } 183 + } 184 + 177 185 if (!pdata->keymap) { 178 186 dev_dbg(dev, "no keymap from pdata\n"); 179 187 return -EINVAL;
+43 -1
drivers/input/mouse/bcm5974.c
··· 139 139 /* trackpad finger data size, empirically at least ten fingers */ 140 140 #define SIZEOF_FINGER sizeof(struct tp_finger) 141 141 #define SIZEOF_ALL_FINGERS (16 * SIZEOF_FINGER) 142 + #define MAX_FINGER_ORIENTATION 16384 142 143 143 144 /* device-specific parameters */ 144 145 struct bcm5974_param { ··· 285 284 input_set_abs_params(input_dev, ABS_Y, 286 285 0, cfg->y.dim, cfg->y.fuzz, 0); 287 286 287 + /* finger touch area */ 288 + input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 289 + cfg->w.devmin, cfg->w.devmax, 0, 0); 290 + input_set_abs_params(input_dev, ABS_MT_TOUCH_MINOR, 291 + cfg->w.devmin, cfg->w.devmax, 0, 0); 292 + /* finger approach area */ 293 + input_set_abs_params(input_dev, ABS_MT_WIDTH_MAJOR, 294 + cfg->w.devmin, cfg->w.devmax, 0, 0); 295 + input_set_abs_params(input_dev, ABS_MT_WIDTH_MINOR, 296 + cfg->w.devmin, cfg->w.devmax, 0, 0); 297 + /* finger orientation */ 298 + input_set_abs_params(input_dev, ABS_MT_ORIENTATION, 299 + -MAX_FINGER_ORIENTATION, 300 + MAX_FINGER_ORIENTATION, 0, 0); 301 + /* finger position */ 302 + input_set_abs_params(input_dev, ABS_MT_POSITION_X, 303 + cfg->x.devmin, cfg->x.devmax, 0, 0); 304 + input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 305 + cfg->y.devmin, cfg->y.devmax, 0, 0); 306 + 288 307 __set_bit(EV_KEY, input_dev->evbit); 289 308 __set_bit(BTN_TOUCH, input_dev->keybit); 290 309 __set_bit(BTN_TOOL_FINGER, input_dev->keybit); ··· 331 310 return 0; 332 311 } 333 312 313 + static void report_finger_data(struct input_dev *input, 314 + const struct bcm5974_config *cfg, 315 + const struct tp_finger *f) 316 + { 317 + input_report_abs(input, ABS_MT_TOUCH_MAJOR, raw2int(f->force_major)); 318 + input_report_abs(input, ABS_MT_TOUCH_MINOR, raw2int(f->force_minor)); 319 + input_report_abs(input, ABS_MT_WIDTH_MAJOR, raw2int(f->size_major)); 320 + input_report_abs(input, ABS_MT_WIDTH_MINOR, raw2int(f->size_minor)); 321 + input_report_abs(input, ABS_MT_ORIENTATION, 322 + MAX_FINGER_ORIENTATION - raw2int(f->orientation)); 323 + input_report_abs(input, ABS_MT_POSITION_X, raw2int(f->abs_x)); 324 + input_report_abs(input, ABS_MT_POSITION_Y, 325 + cfg->y.devmin + cfg->y.devmax - raw2int(f->abs_y)); 326 + input_mt_sync(input); 327 + } 328 + 334 329 /* report trackpad data as logical trackpad state */ 335 330 static int report_tp_state(struct bcm5974 *dev, int size) 336 331 { 337 332 const struct bcm5974_config *c = &dev->cfg; 338 333 const struct tp_finger *f; 339 334 struct input_dev *input = dev->input; 340 - int raw_p, raw_w, raw_x, raw_y, raw_n; 335 + int raw_p, raw_w, raw_x, raw_y, raw_n, i; 341 336 int ptest, origin, ibt = 0, nmin = 0, nmax = 0; 342 337 int abs_p = 0, abs_w = 0, abs_x = 0, abs_y = 0; 343 338 ··· 366 329 367 330 /* always track the first finger; when detached, start over */ 368 331 if (raw_n) { 332 + 333 + /* report raw trackpad data */ 334 + for (i = 0; i < raw_n; i++) 335 + report_finger_data(input, c, &f[i]); 336 + 369 337 raw_p = raw2int(f->force_major); 370 338 raw_w = raw2int(f->size_major); 371 339 raw_x = raw2int(f->abs_x);
+26 -43
drivers/input/mouse/psmouse-base.c
··· 627 627 synaptics_hardware = true; 628 628 629 629 if (max_proto > PSMOUSE_IMEX) { 630 - if (!set_properties || synaptics_init(psmouse) == 0) 630 + /* 631 + * Try activating protocol, but check if support is enabled first, since 632 + * we try detecting Synaptics even when protocol is disabled. 633 + */ 634 + if (synaptics_supported() && 635 + (!set_properties || synaptics_init(psmouse) == 0)) { 631 636 return PSMOUSE_SYNAPTICS; 637 + } 638 + 632 639 /* 633 640 * Some Synaptics touchpads can emulate extended protocols (like IMPS/2). 634 641 * Unfortunately Logitech/Genius probes confuse some firmware versions so ··· 690 683 max_proto = PSMOUSE_IMEX; 691 684 } 692 685 693 - /* 694 - * Try Finger Sensing Pad 695 - */ 696 - if (max_proto > PSMOUSE_IMEX) { 697 - if (fsp_detect(psmouse, set_properties) == 0) { 698 - if (!set_properties || fsp_init(psmouse) == 0) 699 - return PSMOUSE_FSP; 700 - /* 701 - * Init failed, try basic relative protocols 702 - */ 703 - max_proto = PSMOUSE_IMEX; 704 - } 705 - } 706 686 707 687 if (max_proto > PSMOUSE_IMEX) { 708 688 if (genius_detect(psmouse, set_properties) == 0) ··· 703 709 704 710 if (touchkit_ps2_detect(psmouse, set_properties) == 0) 705 711 return PSMOUSE_TOUCHKIT_PS2; 712 + } 713 + 714 + /* 715 + * Try Finger Sensing Pad. We do it here because its probe upsets 716 + * Trackpoint devices (causing TP_READ_ID command to time out). 717 + */ 718 + if (max_proto > PSMOUSE_IMEX) { 719 + if (fsp_detect(psmouse, set_properties) == 0) { 720 + if (!set_properties || fsp_init(psmouse) == 0) 721 + return PSMOUSE_FSP; 722 + /* 723 + * Init failed, try basic relative protocols 724 + */ 725 + max_proto = PSMOUSE_IMEX; 726 + } 706 727 } 707 728 708 729 /* ··· 1459 1450 struct serio *serio = to_serio_port(dev); 1460 1451 struct psmouse_attribute *attr = to_psmouse_attr(devattr); 1461 1452 struct psmouse *psmouse; 1462 - int retval; 1463 - 1464 - retval = serio_pin_driver(serio); 1465 - if (retval) 1466 - return retval; 1467 - 1468 - if (serio->drv != &psmouse_drv) { 1469 - retval = -ENODEV; 1470 - goto out; 1471 - } 1472 1453 1473 1454 psmouse = serio_get_drvdata(serio); 1474 1455 1475 - retval = attr->show(psmouse, attr->data, buf); 1476 - 1477 - out: 1478 - serio_unpin_driver(serio); 1479 - return retval; 1456 + return attr->show(psmouse, attr->data, buf); 1480 1457 } 1481 1458 1482 1459 ssize_t psmouse_attr_set_helper(struct device *dev, struct device_attribute *devattr, ··· 1473 1478 struct psmouse *psmouse, *parent = NULL; 1474 1479 int retval; 1475 1480 1476 - retval = serio_pin_driver(serio); 1477 - if (retval) 1478 - return retval; 1479 - 1480 - if (serio->drv != &psmouse_drv) { 1481 - retval = -ENODEV; 1482 - goto out_unpin; 1483 - } 1484 - 1485 1481 retval = mutex_lock_interruptible(&psmouse_mutex); 1486 1482 if (retval) 1487 - goto out_unpin; 1483 + goto out; 1488 1484 1489 1485 psmouse = serio_get_drvdata(serio); 1490 1486 ··· 1505 1519 1506 1520 out_unlock: 1507 1521 mutex_unlock(&psmouse_mutex); 1508 - out_unpin: 1509 - serio_unpin_driver(serio); 1522 + out: 1510 1523 return retval; 1511 1524 } 1512 1525 ··· 1567 1582 } 1568 1583 1569 1584 mutex_unlock(&psmouse_mutex); 1570 - serio_unpin_driver(serio); 1571 1585 serio_unregister_child_port(serio); 1572 - serio_pin_driver_uninterruptible(serio); 1573 1586 mutex_lock(&psmouse_mutex); 1574 1587 1575 1588 if (serio->drv != &psmouse_drv) {
+3 -3
drivers/input/mouse/sentelic.c
··· 2 2 * Finger Sensing Pad PS/2 mouse driver. 3 3 * 4 4 * Copyright (C) 2005-2007 Asia Vital Components Co., Ltd. 5 - * Copyright (C) 2005-2009 Tai-hwa Liang, Sentelic Corporation. 5 + * Copyright (C) 2005-2010 Tai-hwa Liang, Sentelic Corporation. 6 6 * 7 7 * This program is free software; you can redistribute it and/or 8 8 * modify it under the terms of the GNU General Public License ··· 658 658 if (packet[3] & BIT(1)) 659 659 button_status |= 0x0f; /* wheel up */ 660 660 if (packet[3] & BIT(2)) 661 - button_status |= BIT(5);/* horizontal left */ 661 + button_status |= BIT(4);/* horizontal left */ 662 662 if (packet[3] & BIT(3)) 663 - button_status |= BIT(4);/* horizontal right */ 663 + button_status |= BIT(5);/* horizontal right */ 664 664 /* push back to packet queue */ 665 665 if (button_status != 0) 666 666 packet[3] = button_status;
+10
drivers/input/mouse/synaptics.c
··· 743 743 return -1; 744 744 } 745 745 746 + bool synaptics_supported(void) 747 + { 748 + return true; 749 + } 750 + 746 751 #else /* CONFIG_MOUSE_PS2_SYNAPTICS */ 747 752 748 753 void __init synaptics_module_init(void) ··· 757 752 int synaptics_init(struct psmouse *psmouse) 758 753 { 759 754 return -ENOSYS; 755 + } 756 + 757 + bool synaptics_supported(void) 758 + { 759 + return false; 760 760 } 761 761 762 762 #endif /* CONFIG_MOUSE_PS2_SYNAPTICS */
+1
drivers/input/mouse/synaptics.h
··· 109 109 int synaptics_detect(struct psmouse *psmouse, bool set_properties); 110 110 int synaptics_init(struct psmouse *psmouse); 111 111 void synaptics_reset(struct psmouse *psmouse); 112 + bool synaptics_supported(void); 112 113 113 114 #endif /* _SYNAPTICS_H */
+7
drivers/input/serio/i8042-x86ia64io.h
··· 524 524 */ 525 525 static const struct dmi_system_id __initconst i8042_dmi_dritek_table[] = { 526 526 { 527 + /* Acer Aspire 5610 */ 528 + .matches = { 529 + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 530 + DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5610"), 531 + }, 532 + }, 533 + { 527 534 /* Acer Aspire 5630 */ 528 535 .matches = { 529 536 DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
-19
include/linux/serio.h
··· 136 136 spin_unlock_irq(&serio->lock); 137 137 } 138 138 139 - /* 140 - * Use the following functions to pin serio's driver in process context 141 - */ 142 - static inline int serio_pin_driver(struct serio *serio) 143 - { 144 - return mutex_lock_interruptible(&serio->drv_mutex); 145 - } 146 - 147 - static inline void serio_pin_driver_uninterruptible(struct serio *serio) 148 - { 149 - mutex_lock(&serio->drv_mutex); 150 - } 151 - 152 - static inline void serio_unpin_driver(struct serio *serio) 153 - { 154 - mutex_unlock(&serio->drv_mutex); 155 - } 156 - 157 - 158 139 #endif 159 140 160 141 /*