summarylogtreecommitdiffstats
path: root/0002-hid.patch
diff options
context:
space:
mode:
Diffstat (limited to '0002-hid.patch')
-rw-r--r--0002-hid.patch315
1 files changed, 315 insertions, 0 deletions
diff --git a/0002-hid.patch b/0002-hid.patch
new file mode 100644
index 000000000000..467e920b324a
--- /dev/null
+++ b/0002-hid.patch
@@ -0,0 +1,315 @@
+diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
+index 330ca98..fd75182 100644
+--- a/drivers/hid/hid-core.c
++++ b/drivers/hid/hid-core.c
+@@ -723,7 +723,8 @@ static void hid_scan_collection(struct hid_parser *parser, unsigned type)
+ hid->group = HID_GROUP_SENSOR_HUB;
+
+ if (hid->vendor == USB_VENDOR_ID_MICROSOFT &&
+- hid->product == USB_DEVICE_ID_MS_POWER_COVER &&
++ (hid->product == USB_DEVICE_ID_MS_SURFACE_LAPTOP ||
++ hid->product == USB_DEVICE_ID_MS_POWER_COVER) &&
+ hid->group == HID_GROUP_MULTITOUCH)
+ hid->group = HID_GROUP_GENERIC;
+
+@@ -2179,6 +2180,7 @@ static const struct hid_device_id hid_have_special_driver[] = {
+ { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_DIGITAL_MEDIA_7K) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_DIGITAL_MEDIA_600) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_DIGITAL_MEDIA_3KV1) },
++ { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_SURFACE_LAPTOP) },
+ { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_POWER_COVER) },
+ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PRESENTER_8K_BT) },
+ #endif
+diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
+index be2e005..e011419 100644
+--- a/drivers/hid/hid-ids.h
++++ b/drivers/hid/hid-ids.h
+@@ -757,11 +757,20 @@
+ #define USB_DEVICE_ID_MS_DIGITAL_MEDIA_3KV1 0x0732
+ #define USB_DEVICE_ID_MS_DIGITAL_MEDIA_600 0x0750
+ #define USB_DEVICE_ID_MS_COMFORT_MOUSE_4500 0x076c
+-#define USB_DEVICE_ID_MS_COMFORT_KEYBOARD 0x00e3
+-#define USB_DEVICE_ID_MS_SURFACE_PRO_2 0x0799
+-#define USB_DEVICE_ID_MS_TOUCH_COVER_2 0x07a7
+-#define USB_DEVICE_ID_MS_TYPE_COVER_2 0x07a9
+-#define USB_DEVICE_ID_MS_POWER_COVER 0x07da
++#define USB_DEVICE_ID_MS_COMFORT_KEYBOARD 0x00e3
++#define USB_DEVICE_ID_MS_SURFACE_PRO_2 0x0799
++#define USB_DEVICE_ID_MS_TOUCH_COVER_2 0x07a7
++#define USB_DEVICE_ID_MS_TYPE_COVER_2 0x07a9
++#define USB_DEVICE_ID_MS_TYPE_COVER_3 0x07de
++#define USB_DEVICE_ID_MS_TYPE_COVER_PRO_3 0x07dc
++#define USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_1 0x07de
++#define USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_2 0x07e2
++#define USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_JP 0x07dd
++#define USB_DEVICE_ID_MS_TYPE_COVER_PRO_4 0x07e8
++#define USB_DEVICE_ID_MS_TYPE_COVER_PRO_4_1 0x07e4
++#define USB_DEVICE_ID_MS_SURFACE_BOOK 0x07cd
++#define USB_DEVICE_ID_MS_SURFACE_LAPTOP 0xf001
++#define USB_DEVICE_ID_MS_POWER_COVER 0x07da
+
+ #define USB_VENDOR_ID_MOJO 0x8282
+ #define USB_DEVICE_ID_RETRO_ADAPTER 0x3201
+diff --git a/drivers/hid/hid-microsoft.c b/drivers/hid/hid-microsoft.c
+index 96e7d32..9127164 100644
+--- a/drivers/hid/hid-microsoft.c
++++ b/drivers/hid/hid-microsoft.c
+@@ -274,6 +274,8 @@ static const struct hid_device_id ms_devices[] = {
+ .driver_data = MS_NOGET },
+ { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_COMFORT_MOUSE_4500),
+ .driver_data = MS_DUPLICATE_USAGES },
++ { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_SURFACE_LAPTOP),
++ .driver_data = MS_HIDINPUT },
+ { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_POWER_COVER),
+ .driver_data = MS_HIDINPUT },
+ { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_COMFORT_KEYBOARD),
+diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
+index 9e8c4d2..53cf903 100644
+--- a/drivers/hid/hid-multitouch.c
++++ b/drivers/hid/hid-multitouch.c
+@@ -140,6 +140,7 @@ struct mt_device {
+
+ static void mt_post_parse_default_settings(struct mt_device *td);
+ static void mt_post_parse(struct mt_device *td);
++static int cc_seen = 0;
+
+ /* classes of device behavior */
+ #define MT_CLS_DEFAULT 0x0001
+@@ -588,8 +589,12 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi,
+ if (field->index >= field->report->maxfield ||
+ usage->usage_index >= field->report_count)
+ return 1;
+- td->cc_index = field->index;
+- td->cc_value_index = usage->usage_index;
++
++ if(cc_seen != 1) {
++ td->cc_index = field->index;
++ td->cc_value_index = usage->usage_index;
++ cc_seen++;
++ }
+ return 1;
+ case HID_DG_CONTACTMAX:
+ /* we don't set td->last_slot_field as contactcount and
+@@ -626,6 +631,16 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi,
+ return 0;
+ }
+
++static int mt_touch_input_mapped(struct hid_device *hdev, struct hid_input *hi,
++ struct hid_field *field, struct hid_usage *usage,
++ unsigned long **bit, int *max)
++{
++ if (usage->type == EV_KEY || usage->type == EV_ABS)
++ set_bit(usage->type, hi->input->evbit);
++
++ return -1;
++}
++
+ static int mt_compute_slot(struct mt_device *td, struct input_dev *input)
+ {
+ __s32 quirks = td->mtclass.quirks;
+@@ -929,9 +944,11 @@ static int mt_input_mapping(struct hid_device *hdev, struct hid_input *hi,
+ field->application != HID_DG_TOUCHSCREEN &&
+ field->application != HID_DG_PEN &&
+ field->application != HID_DG_TOUCHPAD &&
++ field->application != HID_GD_MOUSE &&
+ field->application != HID_GD_KEYBOARD &&
+ field->application != HID_GD_SYSTEM_CONTROL &&
+ field->application != HID_CP_CONSUMER_CONTROL &&
++ field->logical != HID_DG_TOUCHSCREEN &&
+ field->application != HID_GD_WIRELESS_RADIO_CTLS &&
+ !(field->application == HID_VD_ASUS_CUSTOM_MEDIA_KEYS &&
+ td->mtclass.quirks & MT_QUIRK_ASUS_CUSTOM_UP))
+@@ -994,10 +1011,8 @@ static int mt_input_mapped(struct hid_device *hdev, struct hid_input *hi,
+ return 0;
+
+ if (field->application == HID_DG_TOUCHSCREEN ||
+- field->application == HID_DG_TOUCHPAD) {
+- /* We own these mappings, tell hid-input to ignore them */
+- return -1;
+- }
++ field->application == HID_DG_TOUCHPAD)
++ return mt_touch_input_mapped(hdev, hi, field, usage, bit, max);
+
+ /* let hid-core decide for the others */
+ return 0;
+@@ -1140,6 +1155,7 @@ static int mt_input_configured(struct hid_device *hdev, struct hid_input *hi)
+ suffix = "Pen";
+ /* force BTN_STYLUS to allow tablet matching in udev */
+ __set_bit(BTN_STYLUS, hi->input->keybit);
++ __set_bit(INPUT_PROP_DIRECT, hi->input->propbit);
+ } else {
+ switch (field->application) {
+ case HID_GD_KEYBOARD:
+@@ -1155,9 +1171,10 @@ static int mt_input_configured(struct hid_device *hdev, struct hid_input *hi)
+ suffix = "Pen";
+ /* force BTN_STYLUS to allow tablet matching in udev */
+ __set_bit(BTN_STYLUS, hi->input->keybit);
++ __set_bit(INPUT_PROP_DIRECT, hi->input->propbit);
+ break;
+ case HID_DG_TOUCHSCREEN:
+- /* we do not set suffix = "Touchscreen" */
++ suffix = "Touchscreen";
+ break;
+ case HID_DG_TOUCHPAD:
+ suffix = "Touchpad";
+@@ -1286,6 +1303,7 @@ static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id)
+ td->inputmode_value = MT_INPUTMODE_TOUCHSCREEN;
+ td->cc_index = -1;
+ td->mt_report_id = -1;
++ cc_seen = 0;
+ hid_set_drvdata(hdev, td);
+
+ td->fields = devm_kzalloc(&hdev->dev, sizeof(struct mt_fields),
+@@ -1332,7 +1350,6 @@ static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id)
+ hdev->quirks |= HID_QUIRK_NO_INIT_REPORTS;
+
+ setup_timer(&td->release_timer, mt_expired_timeout, (long)hdev);
+-
+ ret = hid_parse(hdev);
+ if (ret != 0)
+ return ret;
+@@ -1594,6 +1611,47 @@ static const struct hid_device_id mt_devices[] = {
+ HID_USB_DEVICE(USB_VENDOR_ID_LG,
+ USB_DEVICE_ID_LG_MELFAS_MT) },
+
++ /* Microsoft Touch Cover */
++ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
++ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
++ USB_DEVICE_ID_MS_TOUCH_COVER_2) },
++
++ /* Microsoft Type Cover */
++ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
++ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
++ USB_DEVICE_ID_MS_TYPE_COVER_2) },
++ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
++ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
++ USB_DEVICE_ID_MS_TYPE_COVER_3) },
++ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
++ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
++ USB_DEVICE_ID_MS_TYPE_COVER_PRO_3) },
++ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
++ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
++ USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_1) },
++ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
++ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
++ USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_2) },
++ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
++ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
++ USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_JP) },
++ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
++ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
++ USB_DEVICE_ID_MS_TYPE_COVER_PRO_4) },
++ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
++ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
++ USB_DEVICE_ID_MS_TYPE_COVER_PRO_4_1) },
++
++ /* Microsoft Surface Book */
++ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
++ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
++ USB_DEVICE_ID_MS_SURFACE_BOOK) },
++
++ /* Microsoft Power Cover */
++ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
++ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
++ USB_DEVICE_ID_MS_POWER_COVER) },
++
+ /* MosArt panels */
+ { .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE,
+ MT_USB_DEVICE(USB_VENDOR_ID_ASUS,
+diff --git a/drivers/hid/i2c-hid/i2c-hid.c b/drivers/hid/i2c-hid/i2c-hid.c
+index 9145c21..71dbae5 100644
+--- a/drivers/hid/i2c-hid/i2c-hid.c
++++ b/drivers/hid/i2c-hid/i2c-hid.c
+@@ -929,11 +929,6 @@ static int i2c_hid_of_probe(struct i2c_client *client,
+ }
+ pdata->hid_descriptor_address = val;
+
+- ret = of_property_read_u32(dev->of_node, "post-power-on-delay-ms",
+- &val);
+- if (!ret)
+- pdata->post_power_delay_ms = val;
+-
+ return 0;
+ }
+
+@@ -950,6 +945,16 @@ static inline int i2c_hid_of_probe(struct i2c_client *client,
+ }
+ #endif
+
++static void i2c_hid_fwnode_probe(struct i2c_client *client,
++ struct i2c_hid_platform_data *pdata)
++{
++ u32 val;
++
++ if (!device_property_read_u32(&client->dev, "post-power-on-delay-ms",
++ &val))
++ pdata->post_power_delay_ms = val;
++}
++
+ static int i2c_hid_probe(struct i2c_client *client,
+ const struct i2c_device_id *dev_id)
+ {
+@@ -993,6 +998,9 @@ static int i2c_hid_probe(struct i2c_client *client,
+ ihid->pdata = *platform_data;
+ }
+
++ /* Parse platform agnostic common properties from ACPI / device tree */
++ i2c_hid_fwnode_probe(client, &ihid->pdata);
++
+ ihid->pdata.supply = devm_regulator_get(&client->dev, "vdd");
+ if (IS_ERR(ihid->pdata.supply)) {
+ ret = PTR_ERR(ihid->pdata.supply);
+diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c
+index f489a5c..7b48120 100644
+--- a/drivers/hid/usbhid/hid-quirks.c
++++ b/drivers/hid/usbhid/hid-quirks.c
+@@ -108,8 +108,17 @@ static const struct hid_blacklist {
+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_MOUSE_C06A, HID_QUIRK_ALWAYS_POLL },
+ { USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS, HID_QUIRK_NOGET },
+ { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_SURFACE_PRO_2, HID_QUIRK_NO_INIT_REPORTS },
+- { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_2, HID_QUIRK_NO_INIT_REPORTS },
+ { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TOUCH_COVER_2, HID_QUIRK_NO_INIT_REPORTS },
++ { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_2, HID_QUIRK_NO_INIT_REPORTS },
++ { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_3, HID_QUIRK_NO_INIT_REPORTS },
++ { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_3, HID_QUIRK_NO_INIT_REPORTS },
++ { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_1, HID_QUIRK_NO_INIT_REPORTS },
++ { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_2, HID_QUIRK_NO_INIT_REPORTS },
++ { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_JP, HID_QUIRK_NO_INIT_REPORTS },
++ { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_4, HID_QUIRK_NO_INIT_REPORTS },
++ { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_4_1, HID_QUIRK_NO_INIT_REPORTS },
++ { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_SURFACE_BOOK, HID_QUIRK_NO_INIT_REPORTS },
++ { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_SURFACE_LAPTOP, HID_QUIRK_NO_INIT_REPORTS },
+ { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_POWER_COVER, HID_QUIRK_NO_INIT_REPORTS },
+ { USB_VENDOR_ID_MSI, USB_DEVICE_ID_MSI_GT683R_LED_PANEL, HID_QUIRK_NO_INIT_REPORTS },
+ { USB_VENDOR_ID_NEXIO, USB_DEVICE_ID_NEXIO_MULTITOUCH_PTI0750, HID_QUIRK_NO_INIT_REPORTS },
+diff --git a/drivers/platform/x86/surfacepro3_button.c b/drivers/platform/x86/surfacepro3_button.c
+index 6505c97..2d89a42 100644
+--- a/drivers/platform/x86/surfacepro3_button.c
++++ b/drivers/platform/x86/surfacepro3_button.c
+@@ -1,6 +1,6 @@
+ /*
+ * power/home/volume button support for
+- * Microsoft Surface Pro 3/4 tablet.
++ * Microsoft Surface Pro 3/4/2017 tablet.
+ *
+ * Copyright (c) 2015 Intel Corporation.
+ * All rights reserved.
+@@ -21,8 +21,9 @@
+
+ #define SURFACE_PRO3_BUTTON_HID "MSHW0028"
+ #define SURFACE_PRO4_BUTTON_HID "MSHW0040"
++#define SURFACE_PRO2017_BUTTON_HID "MSHW0040"
+ #define SURFACE_BUTTON_OBJ_NAME "VGBI"
+-#define SURFACE_BUTTON_DEVICE_NAME "Surface Pro 3/4 Buttons"
++#define SURFACE_BUTTON_DEVICE_NAME "Surface Pro 3/4/2017 Buttons"
+
+ #define SURFACE_BUTTON_NOTIFY_TABLET_MODE 0xc8
+
+@@ -59,6 +60,7 @@ MODULE_LICENSE("GPL v2");
+ static const struct acpi_device_id surface_button_device_ids[] = {
+ {SURFACE_PRO3_BUTTON_HID, 0},
+ {SURFACE_PRO4_BUTTON_HID, 0},
++ {SURFACE_PRO2017_BUTTON_HID, 0},
+ {"", 0},
+ };
+ MODULE_DEVICE_TABLE(acpi, surface_button_device_ids);