Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'next' into for-linus

Prepare second round of updates for 4.1 merge window.

+806 -42
+7 -2
Documentation/input/alps.txt
··· 94 94 95 95 Note that the device never signals overflow condition. 96 96 97 + For protocol version 2 devices when the trackpoint is used, and no fingers 98 + are on the touchpad, the M R L bits signal the combined status of both the 99 + pointingstick and touchpad buttons. 100 + 97 101 ALPS Absolute Mode - Protocol Version 1 98 102 -------------------------------------- 99 103 ··· 111 107 ALPS Absolute Mode - Protocol Version 2 112 108 --------------------------------------- 113 109 114 - byte 0: 1 ? ? ? 1 ? ? ? 110 + byte 0: 1 ? ? ? 1 PSM PSR PSL 115 111 byte 1: 0 x6 x5 x4 x3 x2 x1 x0 116 112 byte 2: 0 x10 x9 x8 x7 ? fin ges 117 113 byte 3: 0 y9 y8 y7 1 M R L ··· 119 115 byte 5: 0 z6 z5 z4 z3 z2 z1 z0 120 116 121 117 Protocol Version 2 DualPoint devices send standard PS/2 mouse packets for 122 - the DualPoint Stick. 118 + the DualPoint Stick. For non interleaved dualpoint devices the pointingstick 119 + buttons get reported separately in the PSM, PSR and PSL bits. 123 120 124 121 Dualpoint device -- interleaved packet format 125 122 ---------------------------------------------
+8
MAINTAINERS
··· 10530 10530 S: Maintained 10531 10531 F: drivers/misc/vmw_balloon.c 10532 10532 10533 + VMWARE VMMOUSE SUBDRIVER 10534 + M: "VMware Graphics" <linux-graphics-maintainer@vmware.com> 10535 + M: "VMware, Inc." <pv-drivers@vmware.com> 10536 + L: linux-input@vger.kernel.org 10537 + S: Maintained 10538 + F: drivers/input/mouse/vmmouse.c 10539 + F: drivers/input/mouse/vmmouse.h 10540 + 10533 10541 VMWARE VMXNET3 ETHERNET DRIVER 10534 10542 M: Shreyas Bhatewara <sbhatewara@vmware.com> 10535 10543 M: "VMware, Inc." <pv-drivers@vmware.com>
+4 -6
drivers/input/ff-core.c
··· 23 23 24 24 /* #define DEBUG */ 25 25 26 - #define pr_fmt(fmt) KBUILD_BASENAME ": " fmt 27 - 28 26 #include <linux/input.h> 29 27 #include <linux/module.h> 30 28 #include <linux/mutex.h> ··· 114 116 115 117 if (effect->type < FF_EFFECT_MIN || effect->type > FF_EFFECT_MAX || 116 118 !test_bit(effect->type, dev->ffbit)) { 117 - pr_debug("invalid or not supported effect type in upload\n"); 119 + dev_dbg(&dev->dev, "invalid or not supported effect type in upload\n"); 118 120 return -EINVAL; 119 121 } 120 122 ··· 122 124 (effect->u.periodic.waveform < FF_WAVEFORM_MIN || 123 125 effect->u.periodic.waveform > FF_WAVEFORM_MAX || 124 126 !test_bit(effect->u.periodic.waveform, dev->ffbit))) { 125 - pr_debug("invalid or not supported wave form in upload\n"); 127 + dev_dbg(&dev->dev, "invalid or not supported wave form in upload\n"); 126 128 return -EINVAL; 127 129 } 128 130 ··· 244 246 struct ff_device *ff = dev->ff; 245 247 int i; 246 248 247 - pr_debug("flushing now\n"); 249 + dev_dbg(&dev->dev, "flushing now\n"); 248 250 249 251 mutex_lock(&ff->mutex); 250 252 ··· 314 316 int i; 315 317 316 318 if (!max_effects) { 317 - pr_err("cannot allocate device without any effects\n"); 319 + dev_err(&dev->dev, "cannot allocate device without any effects\n"); 318 320 return -EINVAL; 319 321 } 320 322
+20 -1
drivers/input/joystick/xpad.c
··· 31 31 * - the iForce driver drivers/char/joystick/iforce.c 32 32 * - the skeleton-driver drivers/usb/usb-skeleton.c 33 33 * - Xbox 360 information http://www.free60.org/wiki/Gamepad 34 + * - Xbox One information https://github.com/quantus/xbox-one-controller-protocol 34 35 * 35 36 * Thanks to: 36 37 * - ITO Takayuki for providing essential xpad information on his website 37 38 * - Vojtech Pavlik - iforce driver / input subsystem 38 39 * - Greg Kroah-Hartman - usb-skeleton driver 39 40 * - XBOX Linux project - extra USB id's 41 + * - Pekka Pöyry (quantus) - Xbox One controller reverse engineering 40 42 * 41 43 * TODO: 42 44 * - fine tune axes (especially trigger axes) ··· 830 828 831 829 return usb_submit_urb(xpad->irq_out, GFP_ATOMIC); 832 830 831 + case XTYPE_XBOXONE: 832 + xpad->odata[0] = 0x09; /* activate rumble */ 833 + xpad->odata[1] = 0x08; 834 + xpad->odata[2] = 0x00; 835 + xpad->odata[3] = 0x08; /* continuous effect */ 836 + xpad->odata[4] = 0x00; /* simple rumble mode */ 837 + xpad->odata[5] = 0x03; /* L and R actuator only */ 838 + xpad->odata[6] = 0x00; /* TODO: LT actuator */ 839 + xpad->odata[7] = 0x00; /* TODO: RT actuator */ 840 + xpad->odata[8] = strong / 256; /* left actuator */ 841 + xpad->odata[9] = weak / 256; /* right actuator */ 842 + xpad->odata[10] = 0x80; /* length of pulse */ 843 + xpad->odata[11] = 0x00; /* stop period of pulse */ 844 + xpad->irq_out->transfer_buffer_length = 12; 845 + 846 + return usb_submit_urb(xpad->irq_out, GFP_ATOMIC); 847 + 833 848 default: 834 849 dev_dbg(&xpad->dev->dev, 835 850 "%s - rumble command sent to unsupported xpad type: %d\n", ··· 860 841 861 842 static int xpad_init_ff(struct usb_xpad *xpad) 862 843 { 863 - if (xpad->xtype == XTYPE_UNKNOWN || xpad->xtype == XTYPE_XBOXONE) 844 + if (xpad->xtype == XTYPE_UNKNOWN) 864 845 return 0; 865 846 866 847 input_set_capability(xpad->dev, EV_FF, FF_RUMBLE);
+2 -2
drivers/input/keyboard/lm8333.c
··· 1 1 /* 2 2 * LM8333 keypad driver 3 - * Copyright (C) 2012 Wolfram Sang, Pengutronix <w.sang@pengutronix.de> 3 + * Copyright (C) 2012 Wolfram Sang, Pengutronix <kernel@pengutronix.de> 4 4 * 5 5 * This program is free software; you can redistribute it and/or modify 6 6 * it under the terms of the GNU General Public License as published by ··· 231 231 }; 232 232 module_i2c_driver(lm8333_driver); 233 233 234 - MODULE_AUTHOR("Wolfram Sang <w.sang@pengutronix.de>"); 234 + MODULE_AUTHOR("Wolfram Sang <kernel@pengutronix.de>"); 235 235 MODULE_DESCRIPTION("LM8333 keyboard driver"); 236 236 MODULE_LICENSE("GPL v2");
+12
drivers/input/mouse/Kconfig
··· 149 149 150 150 If unsure, say Y. 151 151 152 + config MOUSE_PS2_VMMOUSE 153 + bool "Virtual mouse (vmmouse)" 154 + depends on MOUSE_PS2 && X86 && HYPERVISOR_GUEST 155 + help 156 + Say Y here if you are running under control of VMware hypervisor 157 + (ESXi, Workstation or Fusion). Also make sure that when you enable 158 + this option, you remove the xf86-input-vmmouse user-space driver 159 + or upgrade it to at least xf86-input-vmmouse 13.0.1, which doesn't 160 + load in the presence of an in-kernel vmmouse driver. 161 + 162 + If unsure, say N. 163 + 152 164 config MOUSE_SERIAL 153 165 tristate "Serial mouse" 154 166 select SERIO
+1
drivers/input/mouse/Makefile
··· 36 36 psmouse-$(CONFIG_MOUSE_PS2_TRACKPOINT) += trackpoint.o 37 37 psmouse-$(CONFIG_MOUSE_PS2_TOUCHKIT) += touchkit_ps2.o 38 38 psmouse-$(CONFIG_MOUSE_PS2_CYPRESS) += cypress_ps2.o 39 + psmouse-$(CONFIG_MOUSE_PS2_VMMOUSE) += vmmouse.o 39 40 40 41 elan_i2c-objs := elan_i2c_core.o 41 42 elan_i2c-$(CONFIG_MOUSE_ELAN_I2C_I2C) += elan_i2c_i2c.o
+2 -2
drivers/input/mouse/cyapa.c
··· 723 723 } else if (sysfs_streq(buf, OFF_MODE_NAME)) { 724 724 cyapa->suspend_power_mode = PWR_MODE_OFF; 725 725 } else if (!kstrtou16(buf, 10, &sleep_time)) { 726 - cyapa->suspend_sleep_time = max_t(u16, sleep_time, 1000); 726 + cyapa->suspend_sleep_time = min_t(u16, sleep_time, 1000); 727 727 cyapa->suspend_power_mode = 728 728 cyapa_sleep_time_to_pwr_cmd(cyapa->suspend_sleep_time); 729 729 } else { ··· 840 840 if (error) 841 841 return error; 842 842 843 - cyapa->runtime_suspend_sleep_time = max_t(u16, time, 1000); 843 + cyapa->runtime_suspend_sleep_time = min_t(u16, time, 1000); 844 844 cyapa->runtime_suspend_power_mode = 845 845 cyapa_sleep_time_to_pwr_cmd(cyapa->runtime_suspend_sleep_time); 846 846
+3
drivers/input/mouse/elan_i2c.h
··· 25 25 #define ETP_ENABLE_CALIBRATE 0x0002 26 26 #define ETP_DISABLE_CALIBRATE 0x0000 27 27 #define ETP_DISABLE_POWER 0x0001 28 + #define ETP_PRESSURE_OFFSET 25 28 29 29 30 /* IAP Firmware handling */ 30 31 #define ETP_FW_NAME "elan_i2c.bin" ··· 80 79 struct completion *reset_done); 81 80 82 81 int (*get_report)(struct i2c_client *client, u8 *report); 82 + int (*get_pressure_adjustment)(struct i2c_client *client, 83 + int *adjustment); 83 84 }; 84 85 85 86 extern const struct elan_transport_ops elan_smbus_ops, elan_i2c_ops;
+25 -13
drivers/input/mouse/elan_i2c_core.c
··· 4 4 * Copyright (c) 2013 ELAN Microelectronics Corp. 5 5 * 6 6 * Author: 林政維 (Duson Lin) <dusonlin@emc.com.tw> 7 - * Version: 1.5.6 7 + * Version: 1.5.7 8 8 * 9 9 * Based on cyapa driver: 10 10 * copyright (c) 2011-2012 Cypress Semiconductor, Inc. ··· 40 40 #include "elan_i2c.h" 41 41 42 42 #define DRIVER_NAME "elan_i2c" 43 - #define ELAN_DRIVER_VERSION "1.5.6" 44 - #define ETP_PRESSURE_OFFSET 25 43 + #define ELAN_DRIVER_VERSION "1.5.7" 45 44 #define ETP_MAX_PRESSURE 255 46 45 #define ETP_FWIDTH_REDUCE 90 47 46 #define ETP_FINGER_WIDTH 15 ··· 52 53 #define ETP_REPORT_ID_OFFSET 2 53 54 #define ETP_TOUCH_INFO_OFFSET 3 54 55 #define ETP_FINGER_DATA_OFFSET 4 56 + #define ETP_HOVER_INFO_OFFSET 30 55 57 #define ETP_MAX_REPORT_LEN 34 56 58 57 59 /* The main device structure */ ··· 81 81 u8 sm_version; 82 82 u8 iap_version; 83 83 u16 fw_checksum; 84 - 84 + int pressure_adjustment; 85 85 u8 mode; 86 86 87 87 bool irq_wake; ··· 226 226 return error; 227 227 228 228 error = data->ops->get_version(data->client, true, &data->iap_version); 229 + if (error) 230 + return error; 231 + 232 + error = data->ops->get_pressure_adjustment(data->client, 233 + &data->pressure_adjustment); 229 234 if (error) 230 235 return error; 231 236 ··· 726 721 */ 727 722 static void elan_report_contact(struct elan_tp_data *data, 728 723 int contact_num, bool contact_valid, 729 - u8 *finger_data) 724 + bool hover_event, u8 *finger_data) 730 725 { 731 726 struct input_dev *input = data->input; 732 727 unsigned int pos_x, pos_y; 733 728 unsigned int pressure, mk_x, mk_y; 734 - unsigned int area_x, area_y, major, minor, new_pressure; 735 - 729 + unsigned int area_x, area_y, major, minor; 730 + unsigned int scaled_pressure; 736 731 737 732 if (contact_valid) { 738 733 pos_x = ((finger_data[0] & 0xf0) << 4) | ··· 761 756 major = max(area_x, area_y); 762 757 minor = min(area_x, area_y); 763 758 764 - new_pressure = pressure + ETP_PRESSURE_OFFSET; 765 - if (new_pressure > ETP_MAX_PRESSURE) 766 - new_pressure = ETP_MAX_PRESSURE; 759 + scaled_pressure = pressure + data->pressure_adjustment; 760 + 761 + if (scaled_pressure > ETP_MAX_PRESSURE) 762 + scaled_pressure = ETP_MAX_PRESSURE; 767 763 768 764 input_mt_slot(input, contact_num); 769 765 input_mt_report_slot_state(input, MT_TOOL_FINGER, true); 770 766 input_report_abs(input, ABS_MT_POSITION_X, pos_x); 771 767 input_report_abs(input, ABS_MT_POSITION_Y, data->max_y - pos_y); 772 - input_report_abs(input, ABS_MT_PRESSURE, new_pressure); 768 + input_report_abs(input, ABS_MT_DISTANCE, hover_event); 769 + input_report_abs(input, ABS_MT_PRESSURE, 770 + hover_event ? 0 : scaled_pressure); 773 771 input_report_abs(input, ABS_TOOL_WIDTH, mk_x); 774 772 input_report_abs(input, ABS_MT_TOUCH_MAJOR, major); 775 773 input_report_abs(input, ABS_MT_TOUCH_MINOR, minor); ··· 788 780 u8 *finger_data = &packet[ETP_FINGER_DATA_OFFSET]; 789 781 int i; 790 782 u8 tp_info = packet[ETP_TOUCH_INFO_OFFSET]; 791 - bool contact_valid; 783 + u8 hover_info = packet[ETP_HOVER_INFO_OFFSET]; 784 + bool contact_valid, hover_event; 792 785 786 + hover_event = hover_info & 0x40; 793 787 for (i = 0; i < ETP_MAX_FINGERS; i++) { 794 788 contact_valid = tp_info & (1U << (3 + i)); 795 - elan_report_contact(data, i, contact_valid, finger_data); 789 + elan_report_contact(data, i, contact_valid, hover_event, 790 + finger_data); 796 791 797 792 if (contact_valid) 798 793 finger_data += ETP_FINGER_DATA_LEN; ··· 889 878 ETP_FINGER_WIDTH * max_width, 0, 0); 890 879 input_set_abs_params(input, ABS_MT_TOUCH_MINOR, 0, 891 880 ETP_FINGER_WIDTH * min_width, 0, 0); 881 + input_set_abs_params(input, ABS_MT_DISTANCE, 0, 1, 0, 0); 892 882 893 883 data->input = input; 894 884
+25 -2
drivers/input/mouse/elan_i2c_i2c.c
··· 41 41 #define ETP_I2C_MAX_X_AXIS_CMD 0x0106 42 42 #define ETP_I2C_MAX_Y_AXIS_CMD 0x0107 43 43 #define ETP_I2C_RESOLUTION_CMD 0x0108 44 + #define ETP_I2C_PRESSURE_CMD 0x010A 44 45 #define ETP_I2C_IAP_VERSION_CMD 0x0110 45 46 #define ETP_I2C_SET_CMD 0x0300 46 47 #define ETP_I2C_POWER_CMD 0x0307 ··· 365 364 return error; 366 365 } 367 366 368 - *x_traces = val[0] - 1; 369 - *y_traces = val[1] - 1; 367 + *x_traces = val[0]; 368 + *y_traces = val[1]; 369 + 370 + return 0; 371 + } 372 + 373 + static int elan_i2c_get_pressure_adjustment(struct i2c_client *client, 374 + int *adjustment) 375 + { 376 + int error; 377 + u8 val[3]; 378 + 379 + error = elan_i2c_read_cmd(client, ETP_I2C_PRESSURE_CMD, val); 380 + if (error) { 381 + dev_err(&client->dev, "failed to get pressure format: %d\n", 382 + error); 383 + return error; 384 + } 385 + 386 + if ((val[0] >> 4) & 0x1) 387 + *adjustment = 0; 388 + else 389 + *adjustment = ETP_PRESSURE_OFFSET; 370 390 371 391 return 0; 372 392 } ··· 624 602 .get_sm_version = elan_i2c_get_sm_version, 625 603 .get_product_id = elan_i2c_get_product_id, 626 604 .get_checksum = elan_i2c_get_checksum, 605 + .get_pressure_adjustment = elan_i2c_get_pressure_adjustment, 627 606 628 607 .get_max = elan_i2c_get_max, 629 608 .get_resolution = elan_i2c_get_resolution,
+10 -2
drivers/input/mouse/elan_i2c_smbus.c
··· 268 268 return error; 269 269 } 270 270 271 - *x_traces = val[1] - 1; 272 - *y_traces = val[2] - 1; 271 + *x_traces = val[1]; 272 + *y_traces = val[2]; 273 273 274 + return 0; 275 + } 276 + 277 + static int elan_smbus_get_pressure_adjustment(struct i2c_client *client, 278 + int *adjustment) 279 + { 280 + *adjustment = ETP_PRESSURE_OFFSET; 274 281 return 0; 275 282 } 276 283 ··· 504 497 .get_sm_version = elan_smbus_get_sm_version, 505 498 .get_product_id = elan_smbus_get_product_id, 506 499 .get_checksum = elan_smbus_get_checksum, 500 + .get_pressure_adjustment = elan_smbus_get_pressure_adjustment, 507 501 508 502 .get_max = elan_smbus_get_max, 509 503 .get_resolution = elan_smbus_get_resolution,
+17
drivers/input/mouse/psmouse-base.c
··· 36 36 #include "sentelic.h" 37 37 #include "cypress_ps2.h" 38 38 #include "focaltech.h" 39 + #include "vmmouse.h" 39 40 40 41 #define DRIVER_DESC "PS/2 mouse driver" 41 42 ··· 791 790 } 792 791 } 793 792 793 + if (psmouse_do_detect(vmmouse_detect, psmouse, set_properties) == 0) { 794 + if (max_proto > PSMOUSE_IMEX) { 795 + if (!set_properties || vmmouse_init(psmouse) == 0) 796 + return PSMOUSE_VMMOUSE; 797 + } 798 + } 799 + 794 800 /* 795 801 * Try Kensington ThinkingMouse (we try first, because synaptics probe 796 802 * upsets the thinkingmouse). ··· 1119 1111 .alias = "focaltech", 1120 1112 .detect = focaltech_detect, 1121 1113 .init = focaltech_init, 1114 + }, 1115 + #endif 1116 + #ifdef CONFIG_MOUSE_PS2_VMMOUSE 1117 + { 1118 + .type = PSMOUSE_VMMOUSE, 1119 + .name = VMMOUSE_PSNAME, 1120 + .alias = "vmmouse", 1121 + .detect = vmmouse_detect, 1122 + .init = vmmouse_init, 1122 1123 }, 1123 1124 #endif 1124 1125 {
+1
drivers/input/mouse/psmouse.h
··· 103 103 PSMOUSE_SYNAPTICS_RELATIVE, 104 104 PSMOUSE_CYPRESS, 105 105 PSMOUSE_FOCALTECH, 106 + PSMOUSE_VMMOUSE, 106 107 PSMOUSE_AUTO /* This one should always be last */ 107 108 }; 108 109
+508
drivers/input/mouse/vmmouse.c
··· 1 + /* 2 + * Driver for Virtual PS/2 Mouse on VMware and QEMU hypervisors. 3 + * 4 + * Copyright (C) 2014, VMware, Inc. All Rights Reserved. 5 + * 6 + * This program is free software; you can redistribute it and/or modify it 7 + * under the terms of the GNU General Public License version 2 as published by 8 + * the Free Software Foundation. 9 + * 10 + * Twin device code is hugely inspired by the ALPS driver. 11 + * Authors: 12 + * Dmitry Torokhov <dmitry.torokhov@gmail.com> 13 + * Thomas Hellstrom <thellstrom@vmware.com> 14 + */ 15 + 16 + #include <linux/input.h> 17 + #include <linux/serio.h> 18 + #include <linux/libps2.h> 19 + #include <linux/slab.h> 20 + #include <linux/module.h> 21 + #include <asm/hypervisor.h> 22 + 23 + #include "psmouse.h" 24 + #include "vmmouse.h" 25 + 26 + #define VMMOUSE_PROTO_MAGIC 0x564D5868U 27 + #define VMMOUSE_PROTO_PORT 0x5658 28 + 29 + /* 30 + * Main commands supported by the vmmouse hypervisor port. 31 + */ 32 + #define VMMOUSE_PROTO_CMD_GETVERSION 10 33 + #define VMMOUSE_PROTO_CMD_ABSPOINTER_DATA 39 34 + #define VMMOUSE_PROTO_CMD_ABSPOINTER_STATUS 40 35 + #define VMMOUSE_PROTO_CMD_ABSPOINTER_COMMAND 41 36 + #define VMMOUSE_PROTO_CMD_ABSPOINTER_RESTRICT 86 37 + 38 + /* 39 + * Subcommands for VMMOUSE_PROTO_CMD_ABSPOINTER_COMMAND 40 + */ 41 + #define VMMOUSE_CMD_ENABLE 0x45414552U 42 + #define VMMOUSE_CMD_DISABLE 0x000000f5U 43 + #define VMMOUSE_CMD_REQUEST_RELATIVE 0x4c455252U 44 + #define VMMOUSE_CMD_REQUEST_ABSOLUTE 0x53424152U 45 + 46 + #define VMMOUSE_ERROR 0xffff0000U 47 + 48 + #define VMMOUSE_VERSION_ID 0x3442554aU 49 + 50 + #define VMMOUSE_RELATIVE_PACKET 0x00010000U 51 + 52 + #define VMMOUSE_LEFT_BUTTON 0x20 53 + #define VMMOUSE_RIGHT_BUTTON 0x10 54 + #define VMMOUSE_MIDDLE_BUTTON 0x08 55 + 56 + /* 57 + * VMMouse Restrict command 58 + */ 59 + #define VMMOUSE_RESTRICT_ANY 0x00 60 + #define VMMOUSE_RESTRICT_CPL0 0x01 61 + #define VMMOUSE_RESTRICT_IOPL 0x02 62 + 63 + #define VMMOUSE_MAX_X 0xFFFF 64 + #define VMMOUSE_MAX_Y 0xFFFF 65 + 66 + #define VMMOUSE_VENDOR "VMware" 67 + #define VMMOUSE_NAME "VMMouse" 68 + 69 + /** 70 + * struct vmmouse_data - private data structure for the vmmouse driver 71 + * 72 + * @abs_dev: "Absolute" device used to report absolute mouse movement. 73 + * @phys: Physical path for the absolute device. 74 + * @dev_name: Name attribute name for the absolute device. 75 + */ 76 + struct vmmouse_data { 77 + struct input_dev *abs_dev; 78 + char phys[32]; 79 + char dev_name[128]; 80 + }; 81 + 82 + /** 83 + * Hypervisor-specific bi-directional communication channel 84 + * implementing the vmmouse protocol. Should never execute on 85 + * bare metal hardware. 86 + */ 87 + #define VMMOUSE_CMD(cmd, in1, out1, out2, out3, out4) \ 88 + ({ \ 89 + unsigned long __dummy1, __dummy2; \ 90 + __asm__ __volatile__ ("inl %%dx" : \ 91 + "=a"(out1), \ 92 + "=b"(out2), \ 93 + "=c"(out3), \ 94 + "=d"(out4), \ 95 + "=S"(__dummy1), \ 96 + "=D"(__dummy2) : \ 97 + "a"(VMMOUSE_PROTO_MAGIC), \ 98 + "b"(in1), \ 99 + "c"(VMMOUSE_PROTO_CMD_##cmd), \ 100 + "d"(VMMOUSE_PROTO_PORT) : \ 101 + "memory"); \ 102 + }) 103 + 104 + /** 105 + * vmmouse_report_button - report button state on the correct input device 106 + * 107 + * @psmouse: Pointer to the psmouse struct 108 + * @abs_dev: The absolute input device 109 + * @rel_dev: The relative input device 110 + * @pref_dev: The preferred device for reporting 111 + * @code: Button code 112 + * @value: Button value 113 + * 114 + * Report @value and @code on @pref_dev, unless the button is already 115 + * pressed on the other device, in which case the state is reported on that 116 + * device. 117 + */ 118 + static void vmmouse_report_button(struct psmouse *psmouse, 119 + struct input_dev *abs_dev, 120 + struct input_dev *rel_dev, 121 + struct input_dev *pref_dev, 122 + unsigned int code, int value) 123 + { 124 + if (test_bit(code, abs_dev->key)) 125 + pref_dev = abs_dev; 126 + else if (test_bit(code, rel_dev->key)) 127 + pref_dev = rel_dev; 128 + 129 + input_report_key(pref_dev, code, value); 130 + } 131 + 132 + /** 133 + * vmmouse_report_events - process events on the vmmouse communications channel 134 + * 135 + * @psmouse: Pointer to the psmouse struct 136 + * 137 + * This function pulls events from the vmmouse communications channel and 138 + * reports them on the correct (absolute or relative) input device. When the 139 + * communications channel is drained, or if we've processed more than 255 140 + * psmouse commands, the function returns PSMOUSE_FULL_PACKET. If there is a 141 + * host- or synchronization error, the function returns PSMOUSE_BAD_DATA in 142 + * the hope that the caller will reset the communications channel. 143 + */ 144 + static psmouse_ret_t vmmouse_report_events(struct psmouse *psmouse) 145 + { 146 + struct input_dev *rel_dev = psmouse->dev; 147 + struct vmmouse_data *priv = psmouse->private; 148 + struct input_dev *abs_dev = priv->abs_dev; 149 + struct input_dev *pref_dev; 150 + u32 status, x, y, z; 151 + u32 dummy1, dummy2, dummy3; 152 + unsigned int queue_length; 153 + unsigned int count = 255; 154 + 155 + while (count--) { 156 + /* See if we have motion data. */ 157 + VMMOUSE_CMD(ABSPOINTER_STATUS, 0, 158 + status, dummy1, dummy2, dummy3); 159 + if ((status & VMMOUSE_ERROR) == VMMOUSE_ERROR) { 160 + psmouse_err(psmouse, "failed to fetch status data\n"); 161 + /* 162 + * After a few attempts this will result in 163 + * reconnect. 164 + */ 165 + return PSMOUSE_BAD_DATA; 166 + } 167 + 168 + queue_length = status & 0xffff; 169 + if (queue_length == 0) 170 + break; 171 + 172 + if (queue_length % 4) { 173 + psmouse_err(psmouse, "invalid queue length\n"); 174 + return PSMOUSE_BAD_DATA; 175 + } 176 + 177 + /* Now get it */ 178 + VMMOUSE_CMD(ABSPOINTER_DATA, 4, status, x, y, z); 179 + 180 + /* 181 + * And report what we've got. Prefer to report button 182 + * events on the same device where we report motion events. 183 + * This doesn't work well with the mouse wheel, though. See 184 + * below. Ideally we would want to report that on the 185 + * preferred device as well. 186 + */ 187 + if (status & VMMOUSE_RELATIVE_PACKET) { 188 + pref_dev = rel_dev; 189 + input_report_rel(rel_dev, REL_X, (s32)x); 190 + input_report_rel(rel_dev, REL_Y, -(s32)y); 191 + } else { 192 + pref_dev = abs_dev; 193 + input_report_abs(abs_dev, ABS_X, x); 194 + input_report_abs(abs_dev, ABS_Y, y); 195 + } 196 + 197 + /* Xorg seems to ignore wheel events on absolute devices */ 198 + input_report_rel(rel_dev, REL_WHEEL, -(s8)((u8) z)); 199 + 200 + vmmouse_report_button(psmouse, abs_dev, rel_dev, 201 + pref_dev, BTN_LEFT, 202 + status & VMMOUSE_LEFT_BUTTON); 203 + vmmouse_report_button(psmouse, abs_dev, rel_dev, 204 + pref_dev, BTN_RIGHT, 205 + status & VMMOUSE_RIGHT_BUTTON); 206 + vmmouse_report_button(psmouse, abs_dev, rel_dev, 207 + pref_dev, BTN_MIDDLE, 208 + status & VMMOUSE_MIDDLE_BUTTON); 209 + input_sync(abs_dev); 210 + input_sync(rel_dev); 211 + } 212 + 213 + return PSMOUSE_FULL_PACKET; 214 + } 215 + 216 + /** 217 + * vmmouse_process_byte - process data on the ps/2 channel 218 + * 219 + * @psmouse: Pointer to the psmouse struct 220 + * 221 + * When the ps/2 channel indicates that there is vmmouse data available, 222 + * call vmmouse channel processing. Otherwise, continue to accept bytes. If 223 + * there is a synchronization or communication data error, return 224 + * PSMOUSE_BAD_DATA in the hope that the caller will reset the mouse. 225 + */ 226 + static psmouse_ret_t vmmouse_process_byte(struct psmouse *psmouse) 227 + { 228 + unsigned char *packet = psmouse->packet; 229 + 230 + switch (psmouse->pktcnt) { 231 + case 1: 232 + return (packet[0] & 0x8) == 0x8 ? 233 + PSMOUSE_GOOD_DATA : PSMOUSE_BAD_DATA; 234 + 235 + case 2: 236 + return PSMOUSE_GOOD_DATA; 237 + 238 + default: 239 + return vmmouse_report_events(psmouse); 240 + } 241 + } 242 + 243 + /** 244 + * vmmouse_disable - Disable vmmouse 245 + * 246 + * @psmouse: Pointer to the psmouse struct 247 + * 248 + * Tries to disable vmmouse mode. 249 + */ 250 + static void vmmouse_disable(struct psmouse *psmouse) 251 + { 252 + u32 status; 253 + u32 dummy1, dummy2, dummy3, dummy4; 254 + 255 + VMMOUSE_CMD(ABSPOINTER_COMMAND, VMMOUSE_CMD_DISABLE, 256 + dummy1, dummy2, dummy3, dummy4); 257 + 258 + VMMOUSE_CMD(ABSPOINTER_STATUS, 0, 259 + status, dummy1, dummy2, dummy3); 260 + 261 + if ((status & VMMOUSE_ERROR) != VMMOUSE_ERROR) 262 + psmouse_warn(psmouse, "failed to disable vmmouse device\n"); 263 + } 264 + 265 + /** 266 + * vmmouse_enable - Enable vmmouse and request absolute mode. 267 + * 268 + * @psmouse: Pointer to the psmouse struct 269 + * 270 + * Tries to enable vmmouse mode. Performs basic checks and requests 271 + * absolute vmmouse mode. 272 + * Returns 0 on success, -ENODEV on failure. 273 + */ 274 + static int vmmouse_enable(struct psmouse *psmouse) 275 + { 276 + u32 status, version; 277 + u32 dummy1, dummy2, dummy3, dummy4; 278 + 279 + /* 280 + * Try enabling the device. If successful, we should be able to 281 + * read valid version ID back from it. 282 + */ 283 + VMMOUSE_CMD(ABSPOINTER_COMMAND, VMMOUSE_CMD_ENABLE, 284 + dummy1, dummy2, dummy3, dummy4); 285 + 286 + /* 287 + * See if version ID can be retrieved. 288 + */ 289 + VMMOUSE_CMD(ABSPOINTER_STATUS, 0, status, dummy1, dummy2, dummy3); 290 + if ((status & 0x0000ffff) == 0) { 291 + psmouse_dbg(psmouse, "empty flags - assuming no device\n"); 292 + return -ENXIO; 293 + } 294 + 295 + VMMOUSE_CMD(ABSPOINTER_DATA, 1 /* single item */, 296 + version, dummy1, dummy2, dummy3); 297 + if (version != VMMOUSE_VERSION_ID) { 298 + psmouse_dbg(psmouse, "Unexpected version value: %u vs %u\n", 299 + (unsigned) version, VMMOUSE_VERSION_ID); 300 + vmmouse_disable(psmouse); 301 + return -ENXIO; 302 + } 303 + 304 + /* 305 + * Restrict ioport access, if possible. 306 + */ 307 + VMMOUSE_CMD(ABSPOINTER_RESTRICT, VMMOUSE_RESTRICT_CPL0, 308 + dummy1, dummy2, dummy3, dummy4); 309 + 310 + VMMOUSE_CMD(ABSPOINTER_COMMAND, VMMOUSE_CMD_REQUEST_ABSOLUTE, 311 + dummy1, dummy2, dummy3, dummy4); 312 + 313 + return 0; 314 + } 315 + 316 + /* 317 + * Array of supported hypervisors. 318 + */ 319 + static const struct hypervisor_x86 *vmmouse_supported_hypervisors[] = { 320 + &x86_hyper_vmware, 321 + #ifdef CONFIG_KVM_GUEST 322 + &x86_hyper_kvm, 323 + #endif 324 + }; 325 + 326 + /** 327 + * vmmouse_check_hypervisor - Check if we're running on a supported hypervisor 328 + */ 329 + static bool vmmouse_check_hypervisor(void) 330 + { 331 + int i; 332 + 333 + for (i = 0; i < ARRAY_SIZE(vmmouse_supported_hypervisors); i++) 334 + if (vmmouse_supported_hypervisors[i] == x86_hyper) 335 + return true; 336 + 337 + return false; 338 + } 339 + 340 + /** 341 + * vmmouse_detect - Probe whether vmmouse is available 342 + * 343 + * @psmouse: Pointer to the psmouse struct 344 + * @set_properties: Whether to set psmouse name and vendor 345 + * 346 + * Returns 0 if vmmouse channel is available. Negative error code if not. 347 + */ 348 + int vmmouse_detect(struct psmouse *psmouse, bool set_properties) 349 + { 350 + u32 response, version, dummy1, dummy2; 351 + 352 + if (!vmmouse_check_hypervisor()) { 353 + psmouse_dbg(psmouse, 354 + "VMMouse not running on supported hypervisor.\n"); 355 + return -ENXIO; 356 + } 357 + 358 + if (!request_region(VMMOUSE_PROTO_PORT, 4, "vmmouse")) { 359 + psmouse_dbg(psmouse, "VMMouse port in use.\n"); 360 + return -EBUSY; 361 + } 362 + 363 + /* Check if the device is present */ 364 + response = ~VMMOUSE_PROTO_MAGIC; 365 + VMMOUSE_CMD(GETVERSION, 0, version, response, dummy1, dummy2); 366 + if (response != VMMOUSE_PROTO_MAGIC || version == 0xffffffffU) { 367 + release_region(VMMOUSE_PROTO_PORT, 4); 368 + return -ENXIO; 369 + } 370 + 371 + if (set_properties) { 372 + psmouse->vendor = VMMOUSE_VENDOR; 373 + psmouse->name = VMMOUSE_NAME; 374 + psmouse->model = version; 375 + } 376 + 377 + release_region(VMMOUSE_PROTO_PORT, 4); 378 + 379 + return 0; 380 + } 381 + 382 + /** 383 + * vmmouse_disconnect - Take down vmmouse driver 384 + * 385 + * @psmouse: Pointer to the psmouse struct 386 + * 387 + * Takes down vmmouse driver and frees resources set up in vmmouse_init(). 388 + */ 389 + static void vmmouse_disconnect(struct psmouse *psmouse) 390 + { 391 + struct vmmouse_data *priv = psmouse->private; 392 + 393 + vmmouse_disable(psmouse); 394 + psmouse_reset(psmouse); 395 + input_unregister_device(priv->abs_dev); 396 + kfree(priv); 397 + release_region(VMMOUSE_PROTO_PORT, 4); 398 + } 399 + 400 + /** 401 + * vmmouse_reconnect - Reset the ps/2 - and vmmouse connections 402 + * 403 + * @psmouse: Pointer to the psmouse struct 404 + * 405 + * Attempts to reset the mouse connections. Returns 0 on success and 406 + * -1 on failure. 407 + */ 408 + static int vmmouse_reconnect(struct psmouse *psmouse) 409 + { 410 + int error; 411 + 412 + psmouse_reset(psmouse); 413 + vmmouse_disable(psmouse); 414 + error = vmmouse_enable(psmouse); 415 + if (error) { 416 + psmouse_err(psmouse, 417 + "Unable to re-enable mouse when reconnecting, err: %d\n", 418 + error); 419 + return error; 420 + } 421 + 422 + return 0; 423 + } 424 + 425 + /** 426 + * vmmouse_init - Initialize the vmmouse driver 427 + * 428 + * @psmouse: Pointer to the psmouse struct 429 + * 430 + * Requests the device and tries to enable vmmouse mode. 431 + * If successful, sets up the input device for relative movement events. 432 + * It also allocates another input device and sets it up for absolute motion 433 + * events. Returns 0 on success and -1 on failure. 434 + */ 435 + int vmmouse_init(struct psmouse *psmouse) 436 + { 437 + struct vmmouse_data *priv; 438 + struct input_dev *rel_dev = psmouse->dev, *abs_dev; 439 + int error; 440 + 441 + if (!request_region(VMMOUSE_PROTO_PORT, 4, "vmmouse")) { 442 + psmouse_dbg(psmouse, "VMMouse port in use.\n"); 443 + return -EBUSY; 444 + } 445 + 446 + psmouse_reset(psmouse); 447 + error = vmmouse_enable(psmouse); 448 + if (error) 449 + goto release_region; 450 + 451 + priv = kzalloc(sizeof(*priv), GFP_KERNEL); 452 + abs_dev = input_allocate_device(); 453 + if (!priv || !abs_dev) { 454 + error = -ENOMEM; 455 + goto init_fail; 456 + } 457 + 458 + priv->abs_dev = abs_dev; 459 + psmouse->private = priv; 460 + 461 + input_set_capability(rel_dev, EV_REL, REL_WHEEL); 462 + 463 + /* Set up and register absolute device */ 464 + snprintf(priv->phys, sizeof(priv->phys), "%s/input1", 465 + psmouse->ps2dev.serio->phys); 466 + 467 + /* Mimic name setup for relative device in psmouse-base.c */ 468 + snprintf(priv->dev_name, sizeof(priv->dev_name), "%s %s %s", 469 + VMMOUSE_PSNAME, VMMOUSE_VENDOR, VMMOUSE_NAME); 470 + abs_dev->phys = priv->phys; 471 + abs_dev->name = priv->dev_name; 472 + abs_dev->id.bustype = BUS_I8042; 473 + abs_dev->id.vendor = 0x0002; 474 + abs_dev->id.product = PSMOUSE_VMMOUSE; 475 + abs_dev->id.version = psmouse->model; 476 + abs_dev->dev.parent = &psmouse->ps2dev.serio->dev; 477 + 478 + error = input_register_device(priv->abs_dev); 479 + if (error) 480 + goto init_fail; 481 + 482 + /* Set absolute device capabilities */ 483 + input_set_capability(abs_dev, EV_KEY, BTN_LEFT); 484 + input_set_capability(abs_dev, EV_KEY, BTN_RIGHT); 485 + input_set_capability(abs_dev, EV_KEY, BTN_MIDDLE); 486 + input_set_capability(abs_dev, EV_ABS, ABS_X); 487 + input_set_capability(abs_dev, EV_ABS, ABS_Y); 488 + input_set_abs_params(abs_dev, ABS_X, 0, VMMOUSE_MAX_X, 0, 0); 489 + input_set_abs_params(abs_dev, ABS_Y, 0, VMMOUSE_MAX_Y, 0, 0); 490 + 491 + psmouse->protocol_handler = vmmouse_process_byte; 492 + psmouse->disconnect = vmmouse_disconnect; 493 + psmouse->reconnect = vmmouse_reconnect; 494 + 495 + return 0; 496 + 497 + init_fail: 498 + vmmouse_disable(psmouse); 499 + psmouse_reset(psmouse); 500 + input_free_device(abs_dev); 501 + kfree(priv); 502 + psmouse->private = NULL; 503 + 504 + release_region: 505 + release_region(VMMOUSE_PROTO_PORT, 4); 506 + 507 + return error; 508 + }
+30
drivers/input/mouse/vmmouse.h
··· 1 + /* 2 + * Driver for Virtual PS/2 Mouse on VMware and QEMU hypervisors. 3 + * 4 + * Copyright (C) 2014, VMware, Inc. All Rights Reserved. 5 + * 6 + * This program is free software; you can redistribute it and/or modify it 7 + * under the terms of the GNU General Public License version 2 as published by 8 + * the Free Software Foundation. 9 + */ 10 + 11 + #ifndef _VMMOUSE_H 12 + #define _VMMOUSE_H 13 + 14 + #ifdef CONFIG_MOUSE_PS2_VMMOUSE 15 + #define VMMOUSE_PSNAME "VirtualPS/2" 16 + 17 + int vmmouse_detect(struct psmouse *psmouse, bool set_properties); 18 + int vmmouse_init(struct psmouse *psmouse); 19 + #else 20 + static inline int vmmouse_detect(struct psmouse *psmouse, bool set_properties) 21 + { 22 + return -ENOSYS; 23 + } 24 + static inline int vmmouse_init(struct psmouse *psmouse) 25 + { 26 + return -ENOSYS; 27 + } 28 + #endif 29 + 30 + #endif
+130 -11
drivers/input/touchscreen/atmel_mxt_ts.c
··· 14 14 * 15 15 */ 16 16 17 + #include <linux/acpi.h> 18 + #include <linux/dmi.h> 17 19 #include <linux/module.h> 18 20 #include <linux/init.h> 19 21 #include <linux/completion.h> ··· 2373 2371 } 2374 2372 2375 2373 #ifdef CONFIG_OF 2376 - static struct mxt_platform_data *mxt_parse_dt(struct i2c_client *client) 2374 + static const struct mxt_platform_data *mxt_parse_dt(struct i2c_client *client) 2377 2375 { 2378 2376 struct mxt_platform_data *pdata; 2379 2377 u32 *keymap; ··· 2381 2379 int proplen, i, ret; 2382 2380 2383 2381 if (!client->dev.of_node) 2384 - return ERR_PTR(-ENODEV); 2382 + return ERR_PTR(-ENOENT); 2385 2383 2386 2384 pdata = devm_kzalloc(&client->dev, sizeof(*pdata), GFP_KERNEL); 2387 2385 if (!pdata) ··· 2412 2410 return pdata; 2413 2411 } 2414 2412 #else 2415 - static struct mxt_platform_data *mxt_parse_dt(struct i2c_client *client) 2413 + static const struct mxt_platform_data *mxt_parse_dt(struct i2c_client *client) 2416 2414 { 2417 - dev_dbg(&client->dev, "No platform data specified\n"); 2418 - return ERR_PTR(-EINVAL); 2415 + return ERR_PTR(-ENOENT); 2419 2416 } 2420 2417 #endif 2418 + 2419 + #ifdef CONFIG_ACPI 2420 + 2421 + struct mxt_acpi_platform_data { 2422 + const char *hid; 2423 + struct mxt_platform_data pdata; 2424 + }; 2425 + 2426 + static unsigned int samus_touchpad_buttons[] = { 2427 + KEY_RESERVED, 2428 + KEY_RESERVED, 2429 + KEY_RESERVED, 2430 + BTN_LEFT 2431 + }; 2432 + 2433 + static struct mxt_acpi_platform_data samus_platform_data[] = { 2434 + { 2435 + /* Touchpad */ 2436 + .hid = "ATML0000", 2437 + .pdata = { 2438 + .t19_num_keys = ARRAY_SIZE(samus_touchpad_buttons), 2439 + .t19_keymap = samus_touchpad_buttons, 2440 + }, 2441 + }, 2442 + { 2443 + /* Touchscreen */ 2444 + .hid = "ATML0001", 2445 + }, 2446 + { } 2447 + }; 2448 + 2449 + static const struct dmi_system_id mxt_dmi_table[] = { 2450 + { 2451 + /* 2015 Google Pixel */ 2452 + .ident = "Chromebook Pixel 2", 2453 + .matches = { 2454 + DMI_MATCH(DMI_SYS_VENDOR, "GOOGLE"), 2455 + DMI_MATCH(DMI_PRODUCT_NAME, "Samus"), 2456 + }, 2457 + .driver_data = samus_platform_data, 2458 + }, 2459 + { } 2460 + }; 2461 + 2462 + static const struct mxt_platform_data *mxt_parse_acpi(struct i2c_client *client) 2463 + { 2464 + struct acpi_device *adev; 2465 + const struct dmi_system_id *system_id; 2466 + const struct mxt_acpi_platform_data *acpi_pdata; 2467 + 2468 + /* 2469 + * Ignore ACPI devices representing bootloader mode. 2470 + * 2471 + * This is a bit of a hack: Google Chromebook BIOS creates ACPI 2472 + * devices for both application and bootloader modes, but we are 2473 + * interested in application mode only (if device is in bootloader 2474 + * mode we'll end up switching into application anyway). So far 2475 + * application mode addresses were all above 0x40, so we'll use it 2476 + * as a threshold. 2477 + */ 2478 + if (client->addr < 0x40) 2479 + return ERR_PTR(-ENXIO); 2480 + 2481 + adev = ACPI_COMPANION(&client->dev); 2482 + if (!adev) 2483 + return ERR_PTR(-ENOENT); 2484 + 2485 + system_id = dmi_first_match(mxt_dmi_table); 2486 + if (!system_id) 2487 + return ERR_PTR(-ENOENT); 2488 + 2489 + acpi_pdata = system_id->driver_data; 2490 + if (!acpi_pdata) 2491 + return ERR_PTR(-ENOENT); 2492 + 2493 + while (acpi_pdata->hid) { 2494 + if (!strcmp(acpi_device_hid(adev), acpi_pdata->hid)) 2495 + return &acpi_pdata->pdata; 2496 + 2497 + acpi_pdata++; 2498 + } 2499 + 2500 + return ERR_PTR(-ENOENT); 2501 + } 2502 + #else 2503 + static const struct mxt_platform_data *mxt_parse_acpi(struct i2c_client *client) 2504 + { 2505 + return ERR_PTR(-ENOENT); 2506 + } 2507 + #endif 2508 + 2509 + static const struct mxt_platform_data * 2510 + mxt_get_platform_data(struct i2c_client *client) 2511 + { 2512 + const struct mxt_platform_data *pdata; 2513 + 2514 + pdata = dev_get_platdata(&client->dev); 2515 + if (pdata) 2516 + return pdata; 2517 + 2518 + pdata = mxt_parse_dt(client); 2519 + if (!IS_ERR(pdata) || PTR_ERR(pdata) != -ENOENT) 2520 + return pdata; 2521 + 2522 + pdata = mxt_parse_acpi(client); 2523 + if (!IS_ERR(pdata) || PTR_ERR(pdata) != -ENOENT) 2524 + return pdata; 2525 + 2526 + dev_err(&client->dev, "No platform data specified\n"); 2527 + return ERR_PTR(-EINVAL); 2528 + } 2421 2529 2422 2530 static int mxt_probe(struct i2c_client *client, const struct i2c_device_id *id) 2423 2531 { ··· 2535 2423 const struct mxt_platform_data *pdata; 2536 2424 int error; 2537 2425 2538 - pdata = dev_get_platdata(&client->dev); 2539 - if (!pdata) { 2540 - pdata = mxt_parse_dt(client); 2541 - if (IS_ERR(pdata)) 2542 - return PTR_ERR(pdata); 2543 - } 2426 + pdata = mxt_get_platform_data(client); 2427 + if (IS_ERR(pdata)) 2428 + return PTR_ERR(pdata); 2544 2429 2545 2430 data = kzalloc(sizeof(struct mxt_data), GFP_KERNEL); 2546 2431 if (!data) { ··· 2645 2536 }; 2646 2537 MODULE_DEVICE_TABLE(of, mxt_of_match); 2647 2538 2539 + #ifdef CONFIG_ACPI 2540 + static const struct acpi_device_id mxt_acpi_id[] = { 2541 + { "ATML0000", 0 }, /* Touchpad */ 2542 + { "ATML0001", 0 }, /* Touchscreen */ 2543 + { } 2544 + }; 2545 + MODULE_DEVICE_TABLE(acpi, mxt_acpi_id); 2546 + #endif 2547 + 2648 2548 static const struct i2c_device_id mxt_id[] = { 2649 2549 { "qt602240_ts", 0 }, 2650 2550 { "atmel_mxt_ts", 0 }, ··· 2668 2550 .name = "atmel_mxt_ts", 2669 2551 .owner = THIS_MODULE, 2670 2552 .of_match_table = of_match_ptr(mxt_of_match), 2553 + .acpi_match_table = ACPI_PTR(mxt_acpi_id), 2671 2554 .pm = &mxt_pm_ops, 2672 2555 }, 2673 2556 .probe = mxt_probe,
+1 -1
drivers/input/touchscreen/elants_i2c.c
··· 699 699 char *fw_name; 700 700 int error; 701 701 702 - fw_name = kasprintf(GFP_KERNEL, "elants_i2c_%4x.bin", ts->hw_version); 702 + fw_name = kasprintf(GFP_KERNEL, "elants_i2c_%04x.bin", ts->hw_version); 703 703 if (!fw_name) 704 704 return -ENOMEM; 705 705