-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path0050-ioxo-m133-touchpad.patch
85 lines (77 loc) · 2.27 KB
/
0050-ioxo-m133-touchpad.patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
--- a/drivers/hid/i2c-hid/i2c-hid-dmi-quirks.c
+++ b/drivers/hid/i2c-hid/i2c-hid-dmi-quirks.c
@@ -13,6 +13,7 @@
#include "i2c-hid.h"
+const char IOXO_IDENT[] = "IOXO";
struct i2c_hid_desc_override {
union {
@@ -413,11 +414,26 @@
},
.driver_data = (void *)&sipodev_desc
},
+ {
+ .ident = IOXO_IDENT,
+ .matches = {
+ /* Unfortunately everything other than board_name is set to
+ * "Default string". Hopefully by matching on the board name
+ * and a bunch of default strings we still get a reasonably
+ * narrow filter.
+ *
+ * [OVER-12957] */
+ DMI_EXACT_MATCH(DMI_BOARD_NAME, "SCHNEIDER"),
+ DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Default string"),
+ DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Default string"),
+ DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "Default string"),
+ },
+ .driver_data = (void *)&sipodev_desc
+ },
{ } /* Terminate list */
};
-
-struct i2c_hid_desc *i2c_hid_get_dmi_i2c_hid_desc_override(uint8_t *i2c_name)
+static struct i2c_hid_desc_override *i2c_hid_get_dmi_i2c_override(uint8_t *i2c_name)
{
struct i2c_hid_desc_override *override;
const struct dmi_system_id *system_id;
@@ -427,7 +443,27 @@
return NULL;
override = system_id->driver_data;
- if (strcmp(override->i2c_name, i2c_name))
+ /* Special case for the IOXO laptop: it has the broken SIPODEV
+ * device, but it reports itself as ALPS instead of SYNA.
+ *
+ * [OVER-12957] */
+ if (strcmp(system_id->ident, IOXO_IDENT) == 0) {
+ if (strcmp("ALPS0001:01", i2c_name) != 0)
+ return NULL;
+ } else {
+ if (strcmp(override->i2c_name, i2c_name) != 0)
+ return NULL;
+ }
+
+ return override;
+}
+
+struct i2c_hid_desc *i2c_hid_get_dmi_i2c_hid_desc_override(uint8_t *i2c_name)
+{
+ struct i2c_hid_desc_override *override;
+
+ override = i2c_hid_get_dmi_i2c_override(i2c_name);
+ if (!override)
return NULL;
return override->i2c_hid_desc;
@@ -437,14 +473,9 @@
unsigned int *size)
{
struct i2c_hid_desc_override *override;
- const struct dmi_system_id *system_id;
- system_id = dmi_first_match(i2c_hid_dmi_desc_override_table);
- if (!system_id)
- return NULL;
-
- override = system_id->driver_data;
- if (strcmp(override->i2c_name, i2c_name))
+ override = i2c_hid_get_dmi_i2c_override(i2c_name);
+ if (!override)
return NULL;
*size = override->hid_report_desc_size;