1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * Touchscreen driver DMI based configuration code 4 * 5 * Copyright (c) 2017 Red Hat Inc. 6 * 7 * Red Hat authors: 8 * Hans de Goede <hdegoede@redhat.com> 9 */ 10 11 #include <linux/acpi.h> 12 #include <linux/device.h> 13 #include <linux/dmi.h> 14 #include <linux/efi_embedded_fw.h> 15 #include <linux/i2c.h> 16 #include <linux/notifier.h> 17 #include <linux/property.h> 18 #include <linux/string.h> 19 20 struct ts_dmi_data { 21 /* The EFI embedded-fw code expects this to be the first member! */ 22 struct efi_embedded_fw_desc embedded_fw; 23 const char *acpi_name; 24 const struct property_entry *properties; 25 }; 26 27 /* NOTE: Please keep all entries sorted alphabetically */ 28 29 static const struct property_entry archos_101_cesium_educ_props[] = { 30 PROPERTY_ENTRY_U32("touchscreen-size-x", 1280), 31 PROPERTY_ENTRY_U32("touchscreen-size-y", 1850), 32 PROPERTY_ENTRY_BOOL("touchscreen-inverted-x"), 33 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 34 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 35 PROPERTY_ENTRY_STRING("firmware-name", "gsl1680-archos-101-cesium-educ.fw"), 36 { } 37 }; 38 39 static const struct ts_dmi_data archos_101_cesium_educ_data = { 40 .acpi_name = "MSSL1680:00", 41 .properties = archos_101_cesium_educ_props, 42 }; 43 44 static const struct property_entry chuwi_hi8_props[] = { 45 PROPERTY_ENTRY_U32("touchscreen-size-x", 1665), 46 PROPERTY_ENTRY_U32("touchscreen-size-y", 1140), 47 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 48 PROPERTY_ENTRY_BOOL("silead,home-button"), 49 PROPERTY_ENTRY_STRING("firmware-name", "gsl1680-chuwi-hi8.fw"), 50 { } 51 }; 52 53 static const struct ts_dmi_data chuwi_hi8_data = { 54 .acpi_name = "MSSL0001:00", 55 .properties = chuwi_hi8_props, 56 }; 57 58 static const struct property_entry chuwi_hi8_air_props[] = { 59 PROPERTY_ENTRY_U32("touchscreen-size-x", 1728), 60 PROPERTY_ENTRY_U32("touchscreen-size-y", 1148), 61 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 62 PROPERTY_ENTRY_STRING("firmware-name", "gsl3676-chuwi-hi8-air.fw"), 63 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 64 { } 65 }; 66 67 static const struct ts_dmi_data chuwi_hi8_air_data = { 68 .acpi_name = "MSSL1680:00", 69 .properties = chuwi_hi8_air_props, 70 }; 71 72 static const struct property_entry chuwi_hi8_pro_props[] = { 73 PROPERTY_ENTRY_U32("touchscreen-min-x", 6), 74 PROPERTY_ENTRY_U32("touchscreen-min-y", 3), 75 PROPERTY_ENTRY_U32("touchscreen-size-x", 1728), 76 PROPERTY_ENTRY_U32("touchscreen-size-y", 1148), 77 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 78 PROPERTY_ENTRY_STRING("firmware-name", "gsl3680-chuwi-hi8-pro.fw"), 79 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 80 PROPERTY_ENTRY_BOOL("silead,home-button"), 81 { } 82 }; 83 84 static const struct ts_dmi_data chuwi_hi8_pro_data = { 85 .embedded_fw = { 86 .name = "silead/gsl3680-chuwi-hi8-pro.fw", 87 .prefix = { 0xf0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00 }, 88 .length = 39864, 89 .sha256 = { 0xc0, 0x88, 0xc5, 0xef, 0xd1, 0x70, 0x77, 0x59, 90 0x4e, 0xe9, 0xc4, 0xd8, 0x2e, 0xcd, 0xbf, 0x95, 91 0x32, 0xd9, 0x03, 0x28, 0x0d, 0x48, 0x9f, 0x92, 92 0x35, 0x37, 0xf6, 0x8b, 0x2a, 0xe4, 0x73, 0xff }, 93 }, 94 .acpi_name = "MSSL1680:00", 95 .properties = chuwi_hi8_pro_props, 96 }; 97 98 static const struct property_entry chuwi_hi10_air_props[] = { 99 PROPERTY_ENTRY_U32("touchscreen-size-x", 1981), 100 PROPERTY_ENTRY_U32("touchscreen-size-y", 1271), 101 PROPERTY_ENTRY_U32("touchscreen-min-x", 99), 102 PROPERTY_ENTRY_U32("touchscreen-min-y", 9), 103 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 104 PROPERTY_ENTRY_U32("touchscreen-fuzz-x", 5), 105 PROPERTY_ENTRY_U32("touchscreen-fuzz-y", 4), 106 PROPERTY_ENTRY_STRING("firmware-name", "gsl1680-chuwi-hi10-air.fw"), 107 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 108 PROPERTY_ENTRY_BOOL("silead,home-button"), 109 { } 110 }; 111 112 static const struct ts_dmi_data chuwi_hi10_air_data = { 113 .acpi_name = "MSSL1680:00", 114 .properties = chuwi_hi10_air_props, 115 }; 116 117 static const struct property_entry chuwi_hi10_plus_props[] = { 118 PROPERTY_ENTRY_U32("touchscreen-min-x", 12), 119 PROPERTY_ENTRY_U32("touchscreen-min-y", 10), 120 PROPERTY_ENTRY_U32("touchscreen-size-x", 1908), 121 PROPERTY_ENTRY_U32("touchscreen-size-y", 1270), 122 PROPERTY_ENTRY_STRING("firmware-name", "gsl1680-chuwi-hi10plus.fw"), 123 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 124 PROPERTY_ENTRY_BOOL("silead,home-button"), 125 PROPERTY_ENTRY_BOOL("silead,pen-supported"), 126 PROPERTY_ENTRY_U32("silead,pen-resolution-x", 8), 127 PROPERTY_ENTRY_U32("silead,pen-resolution-y", 8), 128 { } 129 }; 130 131 static const struct ts_dmi_data chuwi_hi10_plus_data = { 132 .embedded_fw = { 133 .name = "silead/gsl1680-chuwi-hi10plus.fw", 134 .prefix = { 0xf0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00 }, 135 .length = 34056, 136 .sha256 = { 0xfd, 0x0a, 0x08, 0x08, 0x3c, 0xa6, 0x34, 0x4e, 137 0x2c, 0x49, 0x9c, 0xcd, 0x7d, 0x44, 0x9d, 0x38, 138 0x10, 0x68, 0xb5, 0xbd, 0xb7, 0x2a, 0x63, 0xb5, 139 0x67, 0x0b, 0x96, 0xbd, 0x89, 0x67, 0x85, 0x09 }, 140 }, 141 .acpi_name = "MSSL0017:00", 142 .properties = chuwi_hi10_plus_props, 143 }; 144 145 static const u32 chuwi_hi10_pro_efi_min_max[] = { 8, 1911, 8, 1271 }; 146 147 static const struct property_entry chuwi_hi10_pro_props[] = { 148 PROPERTY_ENTRY_U32("touchscreen-min-x", 80), 149 PROPERTY_ENTRY_U32("touchscreen-min-y", 26), 150 PROPERTY_ENTRY_U32("touchscreen-size-x", 1962), 151 PROPERTY_ENTRY_U32("touchscreen-size-y", 1254), 152 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 153 PROPERTY_ENTRY_STRING("firmware-name", "gsl1680-chuwi-hi10-pro.fw"), 154 PROPERTY_ENTRY_U32_ARRAY("silead,efi-fw-min-max", chuwi_hi10_pro_efi_min_max), 155 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 156 PROPERTY_ENTRY_BOOL("silead,home-button"), 157 PROPERTY_ENTRY_BOOL("silead,pen-supported"), 158 PROPERTY_ENTRY_U32("silead,pen-resolution-x", 8), 159 PROPERTY_ENTRY_U32("silead,pen-resolution-y", 8), 160 { } 161 }; 162 163 static const struct ts_dmi_data chuwi_hi10_pro_data = { 164 .embedded_fw = { 165 .name = "silead/gsl1680-chuwi-hi10-pro.fw", 166 .prefix = { 0xf0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00 }, 167 .length = 42504, 168 .sha256 = { 0xdb, 0x92, 0x68, 0xa8, 0xdb, 0x81, 0x31, 0x00, 169 0x1f, 0x58, 0x89, 0xdb, 0x19, 0x1b, 0x15, 0x8c, 170 0x05, 0x14, 0xf4, 0x95, 0xba, 0x15, 0x45, 0x98, 171 0x42, 0xa3, 0xbb, 0x65, 0xe3, 0x30, 0xa5, 0x93 }, 172 }, 173 .acpi_name = "MSSL1680:00", 174 .properties = chuwi_hi10_pro_props, 175 }; 176 177 static const struct property_entry chuwi_hibook_props[] = { 178 PROPERTY_ENTRY_U32("touchscreen-min-x", 30), 179 PROPERTY_ENTRY_U32("touchscreen-min-y", 4), 180 PROPERTY_ENTRY_U32("touchscreen-size-x", 1892), 181 PROPERTY_ENTRY_U32("touchscreen-size-y", 1276), 182 PROPERTY_ENTRY_BOOL("touchscreen-inverted-y"), 183 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 184 PROPERTY_ENTRY_STRING("firmware-name", "gsl1680-chuwi-hibook.fw"), 185 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 186 PROPERTY_ENTRY_BOOL("silead,home-button"), 187 { } 188 }; 189 190 static const struct ts_dmi_data chuwi_hibook_data = { 191 .embedded_fw = { 192 .name = "silead/gsl1680-chuwi-hibook.fw", 193 .prefix = { 0xf0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00 }, 194 .length = 40392, 195 .sha256 = { 0xf7, 0xc0, 0xe8, 0x5a, 0x6c, 0xf2, 0xeb, 0x8d, 196 0x12, 0xc4, 0x45, 0xbf, 0x55, 0x13, 0x4c, 0x1a, 197 0x13, 0x04, 0x31, 0x08, 0x65, 0x73, 0xf7, 0xa8, 198 0x1b, 0x7d, 0x59, 0xc9, 0xe6, 0x97, 0xf7, 0x38 }, 199 }, 200 .acpi_name = "MSSL0017:00", 201 .properties = chuwi_hibook_props, 202 }; 203 204 static const struct property_entry chuwi_vi8_props[] = { 205 PROPERTY_ENTRY_U32("touchscreen-min-x", 4), 206 PROPERTY_ENTRY_U32("touchscreen-min-y", 6), 207 PROPERTY_ENTRY_U32("touchscreen-size-x", 1724), 208 PROPERTY_ENTRY_U32("touchscreen-size-y", 1140), 209 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 210 PROPERTY_ENTRY_STRING("firmware-name", "gsl3676-chuwi-vi8.fw"), 211 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 212 PROPERTY_ENTRY_BOOL("silead,home-button"), 213 { } 214 }; 215 216 static const struct ts_dmi_data chuwi_vi8_data = { 217 .acpi_name = "MSSL1680:00", 218 .properties = chuwi_vi8_props, 219 }; 220 221 static const struct ts_dmi_data chuwi_vi8_plus_data = { 222 .embedded_fw = { 223 .name = "chipone/icn8505-HAMP0002.fw", 224 .prefix = { 0xb0, 0x07, 0x00, 0x00, 0xe4, 0x07, 0x00, 0x00 }, 225 .length = 35012, 226 .sha256 = { 0x93, 0xe5, 0x49, 0xe0, 0xb6, 0xa2, 0xb4, 0xb3, 227 0x88, 0x96, 0x34, 0x97, 0x5e, 0xa8, 0x13, 0x78, 228 0x72, 0x98, 0xb8, 0x29, 0xeb, 0x5c, 0xa7, 0xf1, 229 0x25, 0x13, 0x43, 0xf4, 0x30, 0x7c, 0xfc, 0x7c }, 230 }, 231 }; 232 233 static const struct property_entry chuwi_vi10_props[] = { 234 PROPERTY_ENTRY_U32("touchscreen-min-x", 0), 235 PROPERTY_ENTRY_U32("touchscreen-min-y", 4), 236 PROPERTY_ENTRY_U32("touchscreen-size-x", 1858), 237 PROPERTY_ENTRY_U32("touchscreen-size-y", 1280), 238 PROPERTY_ENTRY_STRING("firmware-name", "gsl3680-chuwi-vi10.fw"), 239 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 240 PROPERTY_ENTRY_BOOL("silead,home-button"), 241 { } 242 }; 243 244 static const struct ts_dmi_data chuwi_vi10_data = { 245 .acpi_name = "MSSL0002:00", 246 .properties = chuwi_vi10_props, 247 }; 248 249 static const struct property_entry chuwi_surbook_mini_props[] = { 250 PROPERTY_ENTRY_U32("touchscreen-min-x", 88), 251 PROPERTY_ENTRY_U32("touchscreen-min-y", 13), 252 PROPERTY_ENTRY_U32("touchscreen-size-x", 2040), 253 PROPERTY_ENTRY_U32("touchscreen-size-y", 1524), 254 PROPERTY_ENTRY_STRING("firmware-name", "gsl1680-chuwi-surbook-mini.fw"), 255 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 256 PROPERTY_ENTRY_BOOL("touchscreen-inverted-y"), 257 { } 258 }; 259 260 static const struct ts_dmi_data chuwi_surbook_mini_data = { 261 .acpi_name = "MSSL1680:00", 262 .properties = chuwi_surbook_mini_props, 263 }; 264 265 static const struct property_entry connect_tablet9_props[] = { 266 PROPERTY_ENTRY_U32("touchscreen-min-x", 9), 267 PROPERTY_ENTRY_U32("touchscreen-min-y", 10), 268 PROPERTY_ENTRY_U32("touchscreen-size-x", 1664), 269 PROPERTY_ENTRY_U32("touchscreen-size-y", 880), 270 PROPERTY_ENTRY_BOOL("touchscreen-inverted-y"), 271 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 272 PROPERTY_ENTRY_STRING("firmware-name", "gsl1680-connect-tablet9.fw"), 273 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 274 { } 275 }; 276 277 static const struct ts_dmi_data connect_tablet9_data = { 278 .acpi_name = "MSSL1680:00", 279 .properties = connect_tablet9_props, 280 }; 281 282 static const struct property_entry csl_panther_tab_hd_props[] = { 283 PROPERTY_ENTRY_U32("touchscreen-min-x", 1), 284 PROPERTY_ENTRY_U32("touchscreen-min-y", 20), 285 PROPERTY_ENTRY_U32("touchscreen-size-x", 1980), 286 PROPERTY_ENTRY_U32("touchscreen-size-y", 1526), 287 PROPERTY_ENTRY_BOOL("touchscreen-inverted-y"), 288 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 289 PROPERTY_ENTRY_STRING("firmware-name", "gsl1680-csl-panther-tab-hd.fw"), 290 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 291 { } 292 }; 293 294 static const struct ts_dmi_data csl_panther_tab_hd_data = { 295 .acpi_name = "MSSL1680:00", 296 .properties = csl_panther_tab_hd_props, 297 }; 298 299 static const struct property_entry cube_iwork8_air_props[] = { 300 PROPERTY_ENTRY_U32("touchscreen-min-x", 1), 301 PROPERTY_ENTRY_U32("touchscreen-min-y", 3), 302 PROPERTY_ENTRY_U32("touchscreen-size-x", 1664), 303 PROPERTY_ENTRY_U32("touchscreen-size-y", 896), 304 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 305 PROPERTY_ENTRY_STRING("firmware-name", "gsl3670-cube-iwork8-air.fw"), 306 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 307 { } 308 }; 309 310 static const struct ts_dmi_data cube_iwork8_air_data = { 311 .embedded_fw = { 312 .name = "silead/gsl3670-cube-iwork8-air.fw", 313 .prefix = { 0xf0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00 }, 314 .length = 38808, 315 .sha256 = { 0xff, 0x62, 0x2d, 0xd1, 0x8a, 0x78, 0x04, 0x7b, 316 0x33, 0x06, 0xb0, 0x4f, 0x7f, 0x02, 0x08, 0x9c, 317 0x96, 0xd4, 0x9f, 0x04, 0xe1, 0x47, 0x25, 0x25, 318 0x60, 0x77, 0x41, 0x33, 0xeb, 0x12, 0x82, 0xfc }, 319 }, 320 .acpi_name = "MSSL1680:00", 321 .properties = cube_iwork8_air_props, 322 }; 323 324 static const struct property_entry cube_knote_i1101_props[] = { 325 PROPERTY_ENTRY_U32("touchscreen-min-x", 20), 326 PROPERTY_ENTRY_U32("touchscreen-min-y", 22), 327 PROPERTY_ENTRY_U32("touchscreen-size-x", 1961), 328 PROPERTY_ENTRY_U32("touchscreen-size-y", 1513), 329 PROPERTY_ENTRY_STRING("firmware-name", "gsl3692-cube-knote-i1101.fw"), 330 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 331 PROPERTY_ENTRY_BOOL("silead,home-button"), 332 { } 333 }; 334 335 static const struct ts_dmi_data cube_knote_i1101_data = { 336 .acpi_name = "MSSL1680:00", 337 .properties = cube_knote_i1101_props, 338 }; 339 340 static const struct property_entry dexp_ursus_7w_props[] = { 341 PROPERTY_ENTRY_U32("touchscreen-size-x", 890), 342 PROPERTY_ENTRY_U32("touchscreen-size-y", 630), 343 PROPERTY_ENTRY_STRING("firmware-name", "gsl1686-dexp-ursus-7w.fw"), 344 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 345 PROPERTY_ENTRY_BOOL("silead,home-button"), 346 { } 347 }; 348 349 static const struct ts_dmi_data dexp_ursus_7w_data = { 350 .acpi_name = "MSSL1680:00", 351 .properties = dexp_ursus_7w_props, 352 }; 353 354 static const struct property_entry dexp_ursus_kx210i_props[] = { 355 PROPERTY_ENTRY_U32("touchscreen-min-x", 5), 356 PROPERTY_ENTRY_U32("touchscreen-min-y", 2), 357 PROPERTY_ENTRY_U32("touchscreen-size-x", 1720), 358 PROPERTY_ENTRY_U32("touchscreen-size-y", 1137), 359 PROPERTY_ENTRY_STRING("firmware-name", "gsl1680-dexp-ursus-kx210i.fw"), 360 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 361 PROPERTY_ENTRY_BOOL("silead,home-button"), 362 { } 363 }; 364 365 static const struct ts_dmi_data dexp_ursus_kx210i_data = { 366 .acpi_name = "MSSL1680:00", 367 .properties = dexp_ursus_kx210i_props, 368 }; 369 370 static const struct property_entry digma_citi_e200_props[] = { 371 PROPERTY_ENTRY_U32("touchscreen-size-x", 1980), 372 PROPERTY_ENTRY_U32("touchscreen-size-y", 1500), 373 PROPERTY_ENTRY_BOOL("touchscreen-inverted-y"), 374 PROPERTY_ENTRY_STRING("firmware-name", "gsl1686-digma_citi_e200.fw"), 375 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 376 PROPERTY_ENTRY_BOOL("silead,home-button"), 377 { } 378 }; 379 380 static const struct ts_dmi_data digma_citi_e200_data = { 381 .acpi_name = "MSSL1680:00", 382 .properties = digma_citi_e200_props, 383 }; 384 385 static const struct property_entry estar_beauty_hd_props[] = { 386 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 387 { } 388 }; 389 390 static const struct ts_dmi_data estar_beauty_hd_data = { 391 .acpi_name = "GDIX1001:00", 392 .properties = estar_beauty_hd_props, 393 }; 394 395 /* Generic props + data for upside-down mounted GDIX1001 touchscreens */ 396 static const struct property_entry gdix1001_upside_down_props[] = { 397 PROPERTY_ENTRY_BOOL("touchscreen-inverted-x"), 398 PROPERTY_ENTRY_BOOL("touchscreen-inverted-y"), 399 { } 400 }; 401 402 static const struct ts_dmi_data gdix1001_00_upside_down_data = { 403 .acpi_name = "GDIX1001:00", 404 .properties = gdix1001_upside_down_props, 405 }; 406 407 static const struct ts_dmi_data gdix1001_01_upside_down_data = { 408 .acpi_name = "GDIX1001:01", 409 .properties = gdix1001_upside_down_props, 410 }; 411 412 static const struct ts_dmi_data gdix1002_00_upside_down_data = { 413 .acpi_name = "GDIX1002:00", 414 .properties = gdix1001_upside_down_props, 415 }; 416 417 static const struct property_entry gp_electronic_t701_props[] = { 418 PROPERTY_ENTRY_U32("touchscreen-size-x", 960), 419 PROPERTY_ENTRY_U32("touchscreen-size-y", 640), 420 PROPERTY_ENTRY_BOOL("touchscreen-inverted-x"), 421 PROPERTY_ENTRY_BOOL("touchscreen-inverted-y"), 422 PROPERTY_ENTRY_STRING("firmware-name", "gsl1680-gp-electronic-t701.fw"), 423 { } 424 }; 425 426 static const struct ts_dmi_data gp_electronic_t701_data = { 427 .acpi_name = "MSSL1680:00", 428 .properties = gp_electronic_t701_props, 429 }; 430 431 static const struct property_entry irbis_tw90_props[] = { 432 PROPERTY_ENTRY_U32("touchscreen-size-x", 1720), 433 PROPERTY_ENTRY_U32("touchscreen-size-y", 1138), 434 PROPERTY_ENTRY_U32("touchscreen-min-x", 8), 435 PROPERTY_ENTRY_U32("touchscreen-min-y", 14), 436 PROPERTY_ENTRY_BOOL("touchscreen-inverted-y"), 437 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 438 PROPERTY_ENTRY_STRING("firmware-name", "gsl3680-irbis_tw90.fw"), 439 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 440 PROPERTY_ENTRY_BOOL("silead,home-button"), 441 { } 442 }; 443 444 static const struct ts_dmi_data irbis_tw90_data = { 445 .acpi_name = "MSSL1680:00", 446 .properties = irbis_tw90_props, 447 }; 448 449 static const struct property_entry irbis_tw118_props[] = { 450 PROPERTY_ENTRY_U32("touchscreen-min-x", 20), 451 PROPERTY_ENTRY_U32("touchscreen-min-y", 30), 452 PROPERTY_ENTRY_U32("touchscreen-size-x", 1960), 453 PROPERTY_ENTRY_U32("touchscreen-size-y", 1510), 454 PROPERTY_ENTRY_STRING("firmware-name", "gsl1680-irbis-tw118.fw"), 455 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 456 { } 457 }; 458 459 static const struct ts_dmi_data irbis_tw118_data = { 460 .acpi_name = "MSSL1680:00", 461 .properties = irbis_tw118_props, 462 }; 463 464 static const struct property_entry itworks_tw891_props[] = { 465 PROPERTY_ENTRY_U32("touchscreen-min-x", 1), 466 PROPERTY_ENTRY_U32("touchscreen-min-y", 5), 467 PROPERTY_ENTRY_U32("touchscreen-size-x", 1600), 468 PROPERTY_ENTRY_U32("touchscreen-size-y", 896), 469 PROPERTY_ENTRY_BOOL("touchscreen-inverted-y"), 470 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 471 PROPERTY_ENTRY_STRING("firmware-name", "gsl3670-itworks-tw891.fw"), 472 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 473 { } 474 }; 475 476 static const struct ts_dmi_data itworks_tw891_data = { 477 .acpi_name = "MSSL1680:00", 478 .properties = itworks_tw891_props, 479 }; 480 481 static const struct property_entry jumper_ezpad_6_pro_props[] = { 482 PROPERTY_ENTRY_U32("touchscreen-size-x", 1980), 483 PROPERTY_ENTRY_U32("touchscreen-size-y", 1500), 484 PROPERTY_ENTRY_STRING("firmware-name", "gsl3692-jumper-ezpad-6-pro.fw"), 485 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 486 PROPERTY_ENTRY_BOOL("silead,home-button"), 487 { } 488 }; 489 490 static const struct ts_dmi_data jumper_ezpad_6_pro_data = { 491 .acpi_name = "MSSL1680:00", 492 .properties = jumper_ezpad_6_pro_props, 493 }; 494 495 static const struct property_entry jumper_ezpad_6_pro_b_props[] = { 496 PROPERTY_ENTRY_U32("touchscreen-size-x", 1980), 497 PROPERTY_ENTRY_U32("touchscreen-size-y", 1500), 498 PROPERTY_ENTRY_STRING("firmware-name", "gsl3692-jumper-ezpad-6-pro-b.fw"), 499 PROPERTY_ENTRY_BOOL("touchscreen-inverted-y"), 500 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 501 PROPERTY_ENTRY_BOOL("silead,home-button"), 502 { } 503 }; 504 505 static const struct ts_dmi_data jumper_ezpad_6_pro_b_data = { 506 .acpi_name = "MSSL1680:00", 507 .properties = jumper_ezpad_6_pro_b_props, 508 }; 509 510 static const struct property_entry jumper_ezpad_6_m4_props[] = { 511 PROPERTY_ENTRY_U32("touchscreen-min-x", 35), 512 PROPERTY_ENTRY_U32("touchscreen-min-y", 15), 513 PROPERTY_ENTRY_U32("touchscreen-size-x", 1950), 514 PROPERTY_ENTRY_U32("touchscreen-size-y", 1525), 515 PROPERTY_ENTRY_STRING("firmware-name", "gsl3692-jumper-ezpad-6-m4.fw"), 516 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 517 PROPERTY_ENTRY_BOOL("silead,home-button"), 518 { } 519 }; 520 521 static const struct ts_dmi_data jumper_ezpad_6_m4_data = { 522 .acpi_name = "MSSL1680:00", 523 .properties = jumper_ezpad_6_m4_props, 524 }; 525 526 static const struct property_entry jumper_ezpad_7_props[] = { 527 PROPERTY_ENTRY_U32("touchscreen-min-x", 4), 528 PROPERTY_ENTRY_U32("touchscreen-min-y", 10), 529 PROPERTY_ENTRY_U32("touchscreen-size-x", 2044), 530 PROPERTY_ENTRY_U32("touchscreen-size-y", 1526), 531 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 532 PROPERTY_ENTRY_STRING("firmware-name", "gsl3680-jumper-ezpad-7.fw"), 533 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 534 PROPERTY_ENTRY_BOOL("silead,stuck-controller-bug"), 535 { } 536 }; 537 538 static const struct ts_dmi_data jumper_ezpad_7_data = { 539 .acpi_name = "MSSL1680:00", 540 .properties = jumper_ezpad_7_props, 541 }; 542 543 static const struct property_entry jumper_ezpad_mini3_props[] = { 544 PROPERTY_ENTRY_U32("touchscreen-min-x", 23), 545 PROPERTY_ENTRY_U32("touchscreen-min-y", 16), 546 PROPERTY_ENTRY_U32("touchscreen-size-x", 1700), 547 PROPERTY_ENTRY_U32("touchscreen-size-y", 1138), 548 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 549 PROPERTY_ENTRY_STRING("firmware-name", "gsl3676-jumper-ezpad-mini3.fw"), 550 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 551 { } 552 }; 553 554 static const struct ts_dmi_data jumper_ezpad_mini3_data = { 555 .acpi_name = "MSSL1680:00", 556 .properties = jumper_ezpad_mini3_props, 557 }; 558 559 static const struct property_entry mpman_converter9_props[] = { 560 PROPERTY_ENTRY_U32("touchscreen-min-x", 8), 561 PROPERTY_ENTRY_U32("touchscreen-min-y", 8), 562 PROPERTY_ENTRY_U32("touchscreen-size-x", 1664), 563 PROPERTY_ENTRY_U32("touchscreen-size-y", 880), 564 PROPERTY_ENTRY_BOOL("touchscreen-inverted-y"), 565 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 566 PROPERTY_ENTRY_STRING("firmware-name", "gsl1680-mpman-converter9.fw"), 567 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 568 { } 569 }; 570 571 static const struct ts_dmi_data mpman_converter9_data = { 572 .acpi_name = "MSSL1680:00", 573 .properties = mpman_converter9_props, 574 }; 575 576 static const struct property_entry mpman_mpwin895cl_props[] = { 577 PROPERTY_ENTRY_U32("touchscreen-min-x", 3), 578 PROPERTY_ENTRY_U32("touchscreen-min-y", 9), 579 PROPERTY_ENTRY_U32("touchscreen-size-x", 1728), 580 PROPERTY_ENTRY_U32("touchscreen-size-y", 1150), 581 PROPERTY_ENTRY_BOOL("touchscreen-inverted-y"), 582 PROPERTY_ENTRY_STRING("firmware-name", "gsl3680-mpman-mpwin895cl.fw"), 583 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 584 PROPERTY_ENTRY_BOOL("silead,home-button"), 585 { } 586 }; 587 588 static const struct ts_dmi_data mpman_mpwin895cl_data = { 589 .acpi_name = "MSSL1680:00", 590 .properties = mpman_mpwin895cl_props, 591 }; 592 593 static const struct property_entry myria_my8307_props[] = { 594 PROPERTY_ENTRY_U32("touchscreen-size-x", 1720), 595 PROPERTY_ENTRY_U32("touchscreen-size-y", 1140), 596 PROPERTY_ENTRY_BOOL("touchscreen-inverted-x"), 597 PROPERTY_ENTRY_BOOL("touchscreen-inverted-y"), 598 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 599 PROPERTY_ENTRY_STRING("firmware-name", "gsl1680-myria-my8307.fw"), 600 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 601 PROPERTY_ENTRY_BOOL("silead,home-button"), 602 { } 603 }; 604 605 static const struct ts_dmi_data myria_my8307_data = { 606 .acpi_name = "MSSL1680:00", 607 .properties = myria_my8307_props, 608 }; 609 610 static const struct property_entry onda_obook_20_plus_props[] = { 611 PROPERTY_ENTRY_U32("touchscreen-size-x", 1728), 612 PROPERTY_ENTRY_U32("touchscreen-size-y", 1148), 613 PROPERTY_ENTRY_BOOL("touchscreen-inverted-x"), 614 PROPERTY_ENTRY_BOOL("touchscreen-inverted-y"), 615 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 616 PROPERTY_ENTRY_STRING("firmware-name", "gsl3676-onda-obook-20-plus.fw"), 617 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 618 PROPERTY_ENTRY_BOOL("silead,home-button"), 619 { } 620 }; 621 622 static const struct ts_dmi_data onda_obook_20_plus_data = { 623 .acpi_name = "MSSL1680:00", 624 .properties = onda_obook_20_plus_props, 625 }; 626 627 static const struct property_entry onda_v80_plus_v3_props[] = { 628 PROPERTY_ENTRY_U32("touchscreen-min-x", 22), 629 PROPERTY_ENTRY_U32("touchscreen-min-y", 15), 630 PROPERTY_ENTRY_U32("touchscreen-size-x", 1698), 631 PROPERTY_ENTRY_U32("touchscreen-size-y", 1140), 632 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 633 PROPERTY_ENTRY_STRING("firmware-name", "gsl3676-onda-v80-plus-v3.fw"), 634 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 635 PROPERTY_ENTRY_BOOL("silead,home-button"), 636 { } 637 }; 638 639 static const struct ts_dmi_data onda_v80_plus_v3_data = { 640 .embedded_fw = { 641 .name = "silead/gsl3676-onda-v80-plus-v3.fw", 642 .prefix = { 0xf0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00 }, 643 .length = 37224, 644 .sha256 = { 0x8f, 0xbd, 0x8f, 0x0c, 0x6b, 0xba, 0x5b, 0xf5, 645 0xa3, 0xc7, 0xa3, 0xc0, 0x4f, 0xcd, 0xdf, 0x32, 646 0xcc, 0xe4, 0x70, 0xd6, 0x46, 0x9c, 0xd7, 0xa7, 647 0x4b, 0x82, 0x3f, 0xab, 0xc7, 0x90, 0xea, 0x23 }, 648 }, 649 .acpi_name = "MSSL1680:00", 650 .properties = onda_v80_plus_v3_props, 651 }; 652 653 static const struct property_entry onda_v820w_32g_props[] = { 654 PROPERTY_ENTRY_U32("touchscreen-size-x", 1665), 655 PROPERTY_ENTRY_U32("touchscreen-size-y", 1140), 656 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 657 PROPERTY_ENTRY_STRING("firmware-name", "gsl1680-onda-v820w-32g.fw"), 658 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 659 PROPERTY_ENTRY_BOOL("silead,home-button"), 660 { } 661 }; 662 663 static const struct ts_dmi_data onda_v820w_32g_data = { 664 .acpi_name = "MSSL1680:00", 665 .properties = onda_v820w_32g_props, 666 }; 667 668 static const struct property_entry onda_v891_v5_props[] = { 669 PROPERTY_ENTRY_U32("touchscreen-size-x", 1715), 670 PROPERTY_ENTRY_U32("touchscreen-size-y", 1140), 671 PROPERTY_ENTRY_BOOL("touchscreen-inverted-x"), 672 PROPERTY_ENTRY_BOOL("touchscreen-inverted-y"), 673 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 674 PROPERTY_ENTRY_STRING("firmware-name", 675 "gsl3676-onda-v891-v5.fw"), 676 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 677 PROPERTY_ENTRY_BOOL("silead,home-button"), 678 { } 679 }; 680 681 static const struct ts_dmi_data onda_v891_v5_data = { 682 .acpi_name = "MSSL1680:00", 683 .properties = onda_v891_v5_props, 684 }; 685 686 static const struct property_entry onda_v891w_v1_props[] = { 687 PROPERTY_ENTRY_U32("touchscreen-min-x", 46), 688 PROPERTY_ENTRY_U32("touchscreen-min-y", 8), 689 PROPERTY_ENTRY_U32("touchscreen-size-x", 1676), 690 PROPERTY_ENTRY_U32("touchscreen-size-y", 1130), 691 PROPERTY_ENTRY_STRING("firmware-name", "gsl3680-onda-v891w-v1.fw"), 692 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 693 PROPERTY_ENTRY_BOOL("silead,home-button"), 694 { } 695 }; 696 697 static const struct ts_dmi_data onda_v891w_v1_data = { 698 .acpi_name = "MSSL1680:00", 699 .properties = onda_v891w_v1_props, 700 }; 701 702 static const struct property_entry onda_v891w_v3_props[] = { 703 PROPERTY_ENTRY_U32("touchscreen-min-x", 35), 704 PROPERTY_ENTRY_U32("touchscreen-min-y", 15), 705 PROPERTY_ENTRY_U32("touchscreen-size-x", 1625), 706 PROPERTY_ENTRY_U32("touchscreen-size-y", 1135), 707 PROPERTY_ENTRY_BOOL("touchscreen-inverted-y"), 708 PROPERTY_ENTRY_STRING("firmware-name", "gsl3676-onda-v891w-v3.fw"), 709 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 710 PROPERTY_ENTRY_BOOL("silead,home-button"), 711 { } 712 }; 713 714 static const struct ts_dmi_data onda_v891w_v3_data = { 715 .acpi_name = "MSSL1680:00", 716 .properties = onda_v891w_v3_props, 717 }; 718 719 static const struct property_entry pipo_w2s_props[] = { 720 PROPERTY_ENTRY_U32("touchscreen-size-x", 1660), 721 PROPERTY_ENTRY_U32("touchscreen-size-y", 880), 722 PROPERTY_ENTRY_BOOL("touchscreen-inverted-x"), 723 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 724 PROPERTY_ENTRY_STRING("firmware-name", "gsl1680-pipo-w2s.fw"), 725 { } 726 }; 727 728 static const struct ts_dmi_data pipo_w2s_data = { 729 .embedded_fw = { 730 .name = "silead/gsl1680-pipo-w2s.fw", 731 .prefix = { 0xf0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00 }, 732 .length = 39072, 733 .sha256 = { 0xd0, 0x58, 0xc4, 0x7d, 0x55, 0x2d, 0x62, 0x18, 734 0xd1, 0x6a, 0x71, 0x73, 0x0b, 0x3f, 0xbe, 0x60, 735 0xbb, 0x45, 0x8c, 0x52, 0x27, 0xb7, 0x18, 0xf4, 736 0x31, 0x00, 0x6a, 0x49, 0x76, 0xd8, 0x7c, 0xd3 }, 737 }, 738 .acpi_name = "MSSL1680:00", 739 .properties = pipo_w2s_props, 740 }; 741 742 static const struct property_entry pipo_w11_props[] = { 743 PROPERTY_ENTRY_U32("touchscreen-min-x", 1), 744 PROPERTY_ENTRY_U32("touchscreen-min-y", 15), 745 PROPERTY_ENTRY_U32("touchscreen-size-x", 1984), 746 PROPERTY_ENTRY_U32("touchscreen-size-y", 1532), 747 PROPERTY_ENTRY_STRING("firmware-name", "gsl1680-pipo-w11.fw"), 748 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 749 PROPERTY_ENTRY_BOOL("silead,home-button"), 750 { } 751 }; 752 753 static const struct ts_dmi_data pipo_w11_data = { 754 .acpi_name = "MSSL1680:00", 755 .properties = pipo_w11_props, 756 }; 757 758 static const struct property_entry pov_mobii_wintab_p800w_v20_props[] = { 759 PROPERTY_ENTRY_U32("touchscreen-min-x", 32), 760 PROPERTY_ENTRY_U32("touchscreen-min-y", 16), 761 PROPERTY_ENTRY_U32("touchscreen-size-x", 1692), 762 PROPERTY_ENTRY_U32("touchscreen-size-y", 1146), 763 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 764 PROPERTY_ENTRY_STRING("firmware-name", "gsl3680-pov-mobii-wintab-p800w-v20.fw"), 765 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 766 PROPERTY_ENTRY_BOOL("silead,home-button"), 767 { } 768 }; 769 770 static const struct ts_dmi_data pov_mobii_wintab_p800w_v20_data = { 771 .acpi_name = "MSSL1680:00", 772 .properties = pov_mobii_wintab_p800w_v20_props, 773 }; 774 775 static const struct property_entry pov_mobii_wintab_p800w_v21_props[] = { 776 PROPERTY_ENTRY_U32("touchscreen-min-x", 1), 777 PROPERTY_ENTRY_U32("touchscreen-min-y", 8), 778 PROPERTY_ENTRY_U32("touchscreen-size-x", 1794), 779 PROPERTY_ENTRY_U32("touchscreen-size-y", 1148), 780 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 781 PROPERTY_ENTRY_STRING("firmware-name", "gsl3692-pov-mobii-wintab-p800w.fw"), 782 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 783 PROPERTY_ENTRY_BOOL("silead,home-button"), 784 { } 785 }; 786 787 static const struct ts_dmi_data pov_mobii_wintab_p800w_v21_data = { 788 .acpi_name = "MSSL1680:00", 789 .properties = pov_mobii_wintab_p800w_v21_props, 790 }; 791 792 static const struct property_entry pov_mobii_wintab_p1006w_v10_props[] = { 793 PROPERTY_ENTRY_U32("touchscreen-min-x", 1), 794 PROPERTY_ENTRY_U32("touchscreen-min-y", 3), 795 PROPERTY_ENTRY_U32("touchscreen-size-x", 1984), 796 PROPERTY_ENTRY_U32("touchscreen-size-y", 1520), 797 PROPERTY_ENTRY_BOOL("touchscreen-inverted-y"), 798 PROPERTY_ENTRY_STRING("firmware-name", "gsl3692-pov-mobii-wintab-p1006w-v10.fw"), 799 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 800 PROPERTY_ENTRY_BOOL("silead,home-button"), 801 { } 802 }; 803 804 static const struct ts_dmi_data pov_mobii_wintab_p1006w_v10_data = { 805 .acpi_name = "MSSL1680:00", 806 .properties = pov_mobii_wintab_p1006w_v10_props, 807 }; 808 809 static const struct property_entry predia_basic_props[] = { 810 PROPERTY_ENTRY_U32("touchscreen-min-x", 3), 811 PROPERTY_ENTRY_U32("touchscreen-min-y", 10), 812 PROPERTY_ENTRY_U32("touchscreen-size-x", 1728), 813 PROPERTY_ENTRY_U32("touchscreen-size-y", 1144), 814 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 815 PROPERTY_ENTRY_STRING("firmware-name", "gsl3680-predia-basic.fw"), 816 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 817 PROPERTY_ENTRY_BOOL("silead,home-button"), 818 { } 819 }; 820 821 static const struct ts_dmi_data predia_basic_data = { 822 .acpi_name = "MSSL1680:00", 823 .properties = predia_basic_props, 824 }; 825 826 static const struct property_entry rca_cambio_w101_v2_props[] = { 827 PROPERTY_ENTRY_U32("touchscreen-min-x", 4), 828 PROPERTY_ENTRY_U32("touchscreen-min-y", 20), 829 PROPERTY_ENTRY_U32("touchscreen-size-x", 1644), 830 PROPERTY_ENTRY_U32("touchscreen-size-y", 874), 831 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 832 PROPERTY_ENTRY_STRING("firmware-name", "gsl1680-rca-cambio-w101-v2.fw"), 833 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 834 { } 835 }; 836 837 static const struct ts_dmi_data rca_cambio_w101_v2_data = { 838 .acpi_name = "MSSL1680:00", 839 .properties = rca_cambio_w101_v2_props, 840 }; 841 842 static const struct property_entry rwc_nanote_p8_props[] = { 843 PROPERTY_ENTRY_U32("touchscreen-min-y", 46), 844 PROPERTY_ENTRY_U32("touchscreen-size-x", 1728), 845 PROPERTY_ENTRY_U32("touchscreen-size-y", 1140), 846 PROPERTY_ENTRY_BOOL("touchscreen-inverted-y"), 847 PROPERTY_ENTRY_STRING("firmware-name", "gsl1680-rwc-nanote-p8.fw"), 848 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 849 { } 850 }; 851 852 static const struct ts_dmi_data rwc_nanote_p8_data = { 853 .acpi_name = "MSSL1680:00", 854 .properties = rwc_nanote_p8_props, 855 }; 856 857 static const struct property_entry schneider_sct101ctm_props[] = { 858 PROPERTY_ENTRY_U32("touchscreen-size-x", 1715), 859 PROPERTY_ENTRY_U32("touchscreen-size-y", 1140), 860 PROPERTY_ENTRY_BOOL("touchscreen-inverted-x"), 861 PROPERTY_ENTRY_BOOL("touchscreen-inverted-y"), 862 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 863 PROPERTY_ENTRY_STRING("firmware-name", "gsl1680-schneider-sct101ctm.fw"), 864 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 865 PROPERTY_ENTRY_BOOL("silead,home-button"), 866 { } 867 }; 868 869 static const struct ts_dmi_data schneider_sct101ctm_data = { 870 .acpi_name = "MSSL1680:00", 871 .properties = schneider_sct101ctm_props, 872 }; 873 874 static const struct property_entry techbite_arc_11_6_props[] = { 875 PROPERTY_ENTRY_U32("touchscreen-min-x", 5), 876 PROPERTY_ENTRY_U32("touchscreen-min-y", 7), 877 PROPERTY_ENTRY_U32("touchscreen-size-x", 1981), 878 PROPERTY_ENTRY_U32("touchscreen-size-y", 1270), 879 PROPERTY_ENTRY_BOOL("touchscreen-inverted-y"), 880 PROPERTY_ENTRY_STRING("firmware-name", "gsl1680-techbite-arc-11-6.fw"), 881 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 882 { } 883 }; 884 885 static const struct ts_dmi_data techbite_arc_11_6_data = { 886 .acpi_name = "MSSL1680:00", 887 .properties = techbite_arc_11_6_props, 888 }; 889 890 static const struct property_entry teclast_tbook11_props[] = { 891 PROPERTY_ENTRY_U32("touchscreen-min-x", 8), 892 PROPERTY_ENTRY_U32("touchscreen-min-y", 14), 893 PROPERTY_ENTRY_U32("touchscreen-size-x", 1916), 894 PROPERTY_ENTRY_U32("touchscreen-size-y", 1264), 895 PROPERTY_ENTRY_BOOL("touchscreen-inverted-y"), 896 PROPERTY_ENTRY_STRING("firmware-name", "gsl3692-teclast-tbook11.fw"), 897 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 898 PROPERTY_ENTRY_BOOL("silead,home-button"), 899 { } 900 }; 901 902 static const struct ts_dmi_data teclast_tbook11_data = { 903 .embedded_fw = { 904 .name = "silead/gsl3692-teclast-tbook11.fw", 905 .prefix = { 0xf0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00 }, 906 .length = 43560, 907 .sha256 = { 0x9d, 0xb0, 0x3d, 0xf1, 0x00, 0x3c, 0xb5, 0x25, 908 0x62, 0x8a, 0xa0, 0x93, 0x4b, 0xe0, 0x4e, 0x75, 909 0xd1, 0x27, 0xb1, 0x65, 0x3c, 0xba, 0xa5, 0x0f, 910 0xcd, 0xb4, 0xbe, 0x00, 0xbb, 0xf6, 0x43, 0x29 }, 911 }, 912 .acpi_name = "MSSL1680:00", 913 .properties = teclast_tbook11_props, 914 }; 915 916 static const struct property_entry teclast_x3_plus_props[] = { 917 PROPERTY_ENTRY_U32("touchscreen-size-x", 1980), 918 PROPERTY_ENTRY_U32("touchscreen-size-y", 1500), 919 PROPERTY_ENTRY_STRING("firmware-name", "gsl1680-teclast-x3-plus.fw"), 920 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 921 PROPERTY_ENTRY_BOOL("silead,home-button"), 922 { } 923 }; 924 925 static const struct ts_dmi_data teclast_x3_plus_data = { 926 .acpi_name = "MSSL1680:00", 927 .properties = teclast_x3_plus_props, 928 }; 929 930 static const struct property_entry teclast_x98plus2_props[] = { 931 PROPERTY_ENTRY_U32("touchscreen-size-x", 2048), 932 PROPERTY_ENTRY_U32("touchscreen-size-y", 1280), 933 PROPERTY_ENTRY_BOOL("touchscreen-inverted-x"), 934 PROPERTY_ENTRY_BOOL("touchscreen-inverted-y"), 935 PROPERTY_ENTRY_STRING("firmware-name", "gsl1686-teclast_x98plus2.fw"), 936 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 937 { } 938 }; 939 940 static const struct ts_dmi_data teclast_x98plus2_data = { 941 .acpi_name = "MSSL1680:00", 942 .properties = teclast_x98plus2_props, 943 }; 944 945 static const struct property_entry trekstor_primebook_c11_props[] = { 946 PROPERTY_ENTRY_U32("touchscreen-size-x", 1970), 947 PROPERTY_ENTRY_U32("touchscreen-size-y", 1530), 948 PROPERTY_ENTRY_BOOL("touchscreen-inverted-y"), 949 PROPERTY_ENTRY_STRING("firmware-name", "gsl1680-trekstor-primebook-c11.fw"), 950 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 951 PROPERTY_ENTRY_BOOL("silead,home-button"), 952 { } 953 }; 954 955 static const struct ts_dmi_data trekstor_primebook_c11_data = { 956 .acpi_name = "MSSL1680:00", 957 .properties = trekstor_primebook_c11_props, 958 }; 959 960 static const struct property_entry trekstor_primebook_c13_props[] = { 961 PROPERTY_ENTRY_U32("touchscreen-size-x", 2624), 962 PROPERTY_ENTRY_U32("touchscreen-size-y", 1920), 963 PROPERTY_ENTRY_STRING("firmware-name", "gsl1680-trekstor-primebook-c13.fw"), 964 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 965 PROPERTY_ENTRY_BOOL("silead,home-button"), 966 { } 967 }; 968 969 static const struct ts_dmi_data trekstor_primebook_c13_data = { 970 .acpi_name = "MSSL1680:00", 971 .properties = trekstor_primebook_c13_props, 972 }; 973 974 static const struct property_entry trekstor_primetab_t13b_props[] = { 975 PROPERTY_ENTRY_U32("touchscreen-size-x", 2500), 976 PROPERTY_ENTRY_U32("touchscreen-size-y", 1900), 977 PROPERTY_ENTRY_STRING("firmware-name", "gsl1680-trekstor-primetab-t13b.fw"), 978 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 979 PROPERTY_ENTRY_BOOL("silead,home-button"), 980 PROPERTY_ENTRY_BOOL("touchscreen-inverted-y"), 981 { } 982 }; 983 984 static const struct ts_dmi_data trekstor_primetab_t13b_data = { 985 .acpi_name = "MSSL1680:00", 986 .properties = trekstor_primetab_t13b_props, 987 }; 988 989 static const struct property_entry trekstor_surftab_duo_w1_props[] = { 990 PROPERTY_ENTRY_BOOL("touchscreen-inverted-x"), 991 { } 992 }; 993 994 static const struct ts_dmi_data trekstor_surftab_duo_w1_data = { 995 .acpi_name = "GDIX1001:00", 996 .properties = trekstor_surftab_duo_w1_props, 997 }; 998 999 static const struct property_entry trekstor_surftab_twin_10_1_props[] = { 1000 PROPERTY_ENTRY_U32("touchscreen-min-x", 20), 1001 PROPERTY_ENTRY_U32("touchscreen-min-y", 0), 1002 PROPERTY_ENTRY_U32("touchscreen-size-x", 1890), 1003 PROPERTY_ENTRY_U32("touchscreen-size-y", 1280), 1004 PROPERTY_ENTRY_U32("touchscreen-inverted-y", 1), 1005 PROPERTY_ENTRY_STRING("firmware-name", "gsl3670-surftab-twin-10-1-st10432-8.fw"), 1006 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 1007 PROPERTY_ENTRY_BOOL("silead,home-button"), 1008 { } 1009 }; 1010 1011 static const struct ts_dmi_data trekstor_surftab_twin_10_1_data = { 1012 .acpi_name = "MSSL1680:00", 1013 .properties = trekstor_surftab_twin_10_1_props, 1014 }; 1015 1016 static const struct property_entry trekstor_surftab_wintron70_props[] = { 1017 PROPERTY_ENTRY_U32("touchscreen-min-x", 12), 1018 PROPERTY_ENTRY_U32("touchscreen-min-y", 8), 1019 PROPERTY_ENTRY_U32("touchscreen-size-x", 884), 1020 PROPERTY_ENTRY_U32("touchscreen-size-y", 632), 1021 PROPERTY_ENTRY_STRING("firmware-name", "gsl1686-surftab-wintron70-st70416-6.fw"), 1022 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 1023 PROPERTY_ENTRY_BOOL("silead,home-button"), 1024 { } 1025 }; 1026 1027 static const struct ts_dmi_data trekstor_surftab_wintron70_data = { 1028 .acpi_name = "MSSL1680:00", 1029 .properties = trekstor_surftab_wintron70_props, 1030 }; 1031 1032 static const struct property_entry viglen_connect_10_props[] = { 1033 PROPERTY_ENTRY_U32("touchscreen-size-x", 1890), 1034 PROPERTY_ENTRY_U32("touchscreen-size-y", 1280), 1035 PROPERTY_ENTRY_U32("touchscreen-fuzz-x", 6), 1036 PROPERTY_ENTRY_U32("touchscreen-fuzz-y", 6), 1037 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 1038 PROPERTY_ENTRY_STRING("firmware-name", "gsl3680-viglen-connect-10.fw"), 1039 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 1040 PROPERTY_ENTRY_BOOL("silead,home-button"), 1041 { } 1042 }; 1043 1044 static const struct ts_dmi_data viglen_connect_10_data = { 1045 .acpi_name = "MSSL1680:00", 1046 .properties = viglen_connect_10_props, 1047 }; 1048 1049 static const struct property_entry vinga_twizzle_j116_props[] = { 1050 PROPERTY_ENTRY_U32("touchscreen-size-x", 1920), 1051 PROPERTY_ENTRY_U32("touchscreen-size-y", 1280), 1052 PROPERTY_ENTRY_STRING("firmware-name", "gsl1680-vinga-twizzle_j116.fw"), 1053 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 1054 PROPERTY_ENTRY_BOOL("silead,home-button"), 1055 { } 1056 }; 1057 1058 static const struct ts_dmi_data vinga_twizzle_j116_data = { 1059 .acpi_name = "MSSL1680:00", 1060 .properties = vinga_twizzle_j116_props, 1061 }; 1062 1063 /* NOTE: Please keep this table sorted alphabetically */ 1064 const struct dmi_system_id touchscreen_dmi_table[] = { 1065 { 1066 /* Archos 101 Cesium Educ */ 1067 .driver_data = (void *)&archos_101_cesium_educ_data, 1068 .matches = { 1069 DMI_MATCH(DMI_PRODUCT_NAME, "ARCHOS 101 Cesium Educ"), 1070 }, 1071 }, 1072 { 1073 /* Chuwi Hi8 */ 1074 .driver_data = (void *)&chuwi_hi8_data, 1075 .matches = { 1076 DMI_MATCH(DMI_SYS_VENDOR, "ilife"), 1077 DMI_MATCH(DMI_PRODUCT_NAME, "S806"), 1078 }, 1079 }, 1080 { 1081 /* Chuwi Hi8 (H1D_S806_206) */ 1082 .driver_data = (void *)&chuwi_hi8_data, 1083 .matches = { 1084 DMI_MATCH(DMI_SYS_VENDOR, "Insyde"), 1085 DMI_MATCH(DMI_PRODUCT_NAME, "BayTrail"), 1086 DMI_MATCH(DMI_BIOS_VERSION, "H1D_S806_206"), 1087 }, 1088 }, 1089 { 1090 /* Chuwi Hi8 Air (CWI543) */ 1091 .driver_data = (void *)&chuwi_hi8_air_data, 1092 .matches = { 1093 DMI_MATCH(DMI_BOARD_VENDOR, "Default string"), 1094 DMI_MATCH(DMI_BOARD_NAME, "Cherry Trail CR"), 1095 DMI_MATCH(DMI_PRODUCT_NAME, "Hi8 Air"), 1096 }, 1097 }, 1098 { 1099 /* Chuwi Hi8 Pro (CWI513) */ 1100 .driver_data = (void *)&chuwi_hi8_pro_data, 1101 .matches = { 1102 DMI_MATCH(DMI_SYS_VENDOR, "Hampoo"), 1103 DMI_MATCH(DMI_PRODUCT_NAME, "X1D3_C806N"), 1104 }, 1105 }, 1106 { 1107 /* Chuwi Hi10 Air */ 1108 .driver_data = (void *)&chuwi_hi10_air_data, 1109 .matches = { 1110 DMI_MATCH(DMI_SYS_VENDOR, "CHUWI INNOVATION AND TECHNOLOGY(SHENZHEN)CO.LTD"), 1111 DMI_MATCH(DMI_BOARD_NAME, "Cherry Trail CR"), 1112 DMI_MATCH(DMI_PRODUCT_SKU, "P1W6_C109D_B"), 1113 }, 1114 }, 1115 { 1116 /* Chuwi Hi10 Plus (CWI527) */ 1117 .driver_data = (void *)&chuwi_hi10_plus_data, 1118 .matches = { 1119 DMI_MATCH(DMI_BOARD_VENDOR, "Hampoo"), 1120 DMI_MATCH(DMI_PRODUCT_NAME, "Hi10 plus tablet"), 1121 DMI_MATCH(DMI_BOARD_NAME, "Cherry Trail CR"), 1122 }, 1123 }, 1124 { 1125 /* Chuwi Hi10 Pro (CWI529) */ 1126 .driver_data = (void *)&chuwi_hi10_pro_data, 1127 .matches = { 1128 DMI_MATCH(DMI_BOARD_VENDOR, "Hampoo"), 1129 DMI_MATCH(DMI_PRODUCT_NAME, "Hi10 pro tablet"), 1130 DMI_MATCH(DMI_BOARD_NAME, "Cherry Trail CR"), 1131 }, 1132 }, 1133 { 1134 /* Chuwi HiBook (CWI514) */ 1135 .driver_data = (void *)&chuwi_hibook_data, 1136 .matches = { 1137 DMI_MATCH(DMI_BOARD_VENDOR, "Hampoo"), 1138 DMI_MATCH(DMI_BOARD_NAME, "Cherry Trail CR"), 1139 /* Above matches are too generic, add bios-date match */ 1140 DMI_MATCH(DMI_BIOS_DATE, "05/07/2016"), 1141 }, 1142 }, 1143 { 1144 /* Chuwi Vi8 (CWI501) */ 1145 .driver_data = (void *)&chuwi_vi8_data, 1146 .matches = { 1147 DMI_MATCH(DMI_SYS_VENDOR, "Insyde"), 1148 DMI_MATCH(DMI_PRODUCT_NAME, "i86"), 1149 DMI_MATCH(DMI_BIOS_VERSION, "CHUWI.W86JLBNR01"), 1150 }, 1151 }, 1152 { 1153 /* Chuwi Vi8 (CWI506) */ 1154 .driver_data = (void *)&chuwi_vi8_data, 1155 .matches = { 1156 DMI_MATCH(DMI_SYS_VENDOR, "Insyde"), 1157 DMI_MATCH(DMI_PRODUCT_NAME, "i86"), 1158 DMI_MATCH(DMI_BIOS_VERSION, "CHUWI.D86JLBNR"), 1159 }, 1160 }, 1161 { 1162 /* Chuwi Vi8 Plus (CWI519) */ 1163 .driver_data = (void *)&chuwi_vi8_plus_data, 1164 .matches = { 1165 DMI_MATCH(DMI_SYS_VENDOR, "Hampoo"), 1166 DMI_MATCH(DMI_PRODUCT_NAME, "D2D3_Vi8A1"), 1167 DMI_MATCH(DMI_BOARD_NAME, "Cherry Trail CR"), 1168 }, 1169 }, 1170 { 1171 /* Chuwi Vi10 (CWI505) */ 1172 .driver_data = (void *)&chuwi_vi10_data, 1173 .matches = { 1174 DMI_MATCH(DMI_BOARD_VENDOR, "Hampoo"), 1175 DMI_MATCH(DMI_BOARD_NAME, "BYT-PF02"), 1176 DMI_MATCH(DMI_SYS_VENDOR, "ilife"), 1177 DMI_MATCH(DMI_PRODUCT_NAME, "S165"), 1178 }, 1179 }, 1180 { 1181 /* Chuwi Surbook Mini (CWI540) */ 1182 .driver_data = (void *)&chuwi_surbook_mini_data, 1183 .matches = { 1184 DMI_MATCH(DMI_BOARD_VENDOR, "Hampoo"), 1185 DMI_MATCH(DMI_PRODUCT_NAME, "C3W6_AP108_4G"), 1186 }, 1187 }, 1188 { 1189 /* Connect Tablet 9 */ 1190 .driver_data = (void *)&connect_tablet9_data, 1191 .matches = { 1192 DMI_MATCH(DMI_SYS_VENDOR, "Connect"), 1193 DMI_MATCH(DMI_PRODUCT_NAME, "Tablet 9"), 1194 }, 1195 }, 1196 { 1197 /* CSL Panther Tab HD */ 1198 .driver_data = (void *)&csl_panther_tab_hd_data, 1199 .matches = { 1200 DMI_MATCH(DMI_SYS_VENDOR, "CSL Computer GmbH & Co. KG"), 1201 DMI_MATCH(DMI_PRODUCT_NAME, "CSL Panther Tab HD"), 1202 }, 1203 }, 1204 { 1205 /* CUBE iwork8 Air */ 1206 .driver_data = (void *)&cube_iwork8_air_data, 1207 .matches = { 1208 DMI_MATCH(DMI_SYS_VENDOR, "cube"), 1209 DMI_MATCH(DMI_PRODUCT_NAME, "i1-TF"), 1210 DMI_MATCH(DMI_BOARD_NAME, "Cherry Trail CR"), 1211 }, 1212 }, 1213 { 1214 /* Cube KNote i1101 */ 1215 .driver_data = (void *)&cube_knote_i1101_data, 1216 .matches = { 1217 DMI_MATCH(DMI_BOARD_VENDOR, "Hampoo"), 1218 DMI_MATCH(DMI_BOARD_NAME, "L1W6_I1101"), 1219 DMI_MATCH(DMI_SYS_VENDOR, "ALLDOCUBE"), 1220 DMI_MATCH(DMI_PRODUCT_NAME, "i1101"), 1221 }, 1222 }, 1223 { 1224 /* DEXP Ursus 7W */ 1225 .driver_data = (void *)&dexp_ursus_7w_data, 1226 .matches = { 1227 DMI_MATCH(DMI_SYS_VENDOR, "Insyde"), 1228 DMI_MATCH(DMI_PRODUCT_NAME, "7W"), 1229 }, 1230 }, 1231 { 1232 /* DEXP Ursus KX210i */ 1233 .driver_data = (void *)&dexp_ursus_kx210i_data, 1234 .matches = { 1235 DMI_MATCH(DMI_SYS_VENDOR, "INSYDE Corp."), 1236 DMI_MATCH(DMI_PRODUCT_NAME, "S107I"), 1237 }, 1238 }, 1239 { 1240 /* Digma Citi E200 */ 1241 .driver_data = (void *)&digma_citi_e200_data, 1242 .matches = { 1243 DMI_MATCH(DMI_SYS_VENDOR, "Digma"), 1244 DMI_MATCH(DMI_PRODUCT_NAME, "CITI E200"), 1245 DMI_MATCH(DMI_BOARD_NAME, "Cherry Trail CR"), 1246 }, 1247 }, 1248 { 1249 /* Estar Beauty HD (MID 7316R) */ 1250 .driver_data = (void *)&estar_beauty_hd_data, 1251 .matches = { 1252 DMI_MATCH(DMI_SYS_VENDOR, "Estar"), 1253 DMI_MATCH(DMI_PRODUCT_NAME, "eSTAR BEAUTY HD Intel Quad core"), 1254 }, 1255 }, 1256 { 1257 /* GP-electronic T701 */ 1258 .driver_data = (void *)&gp_electronic_t701_data, 1259 .matches = { 1260 DMI_MATCH(DMI_SYS_VENDOR, "Insyde"), 1261 DMI_MATCH(DMI_PRODUCT_NAME, "T701"), 1262 DMI_MATCH(DMI_BIOS_VERSION, "BYT70A.YNCHENG.WIN.007"), 1263 }, 1264 }, 1265 { 1266 /* I.T.Works TW701 (same hardware as the Trekstor ST70416-6) */ 1267 .driver_data = (void *)&trekstor_surftab_wintron70_data, 1268 .matches = { 1269 DMI_MATCH(DMI_SYS_VENDOR, "Insyde"), 1270 DMI_MATCH(DMI_PRODUCT_NAME, "i71c"), 1271 DMI_MATCH(DMI_BIOS_VERSION, "itWORKS.G.WI71C.JGBMRB"), 1272 }, 1273 }, 1274 { 1275 /* Irbis TW90 */ 1276 .driver_data = (void *)&irbis_tw90_data, 1277 .matches = { 1278 DMI_MATCH(DMI_SYS_VENDOR, "IRBIS"), 1279 DMI_MATCH(DMI_PRODUCT_NAME, "TW90"), 1280 }, 1281 }, 1282 { 1283 /* Irbis TW118 */ 1284 .driver_data = (void *)&irbis_tw118_data, 1285 .matches = { 1286 DMI_MATCH(DMI_SYS_VENDOR, "IRBIS"), 1287 DMI_MATCH(DMI_PRODUCT_NAME, "TW118"), 1288 }, 1289 }, 1290 { 1291 /* I.T.Works TW891 */ 1292 .driver_data = (void *)&itworks_tw891_data, 1293 .matches = { 1294 DMI_MATCH(DMI_SYS_VENDOR, "To be filled by O.E.M."), 1295 DMI_MATCH(DMI_PRODUCT_NAME, "TW891"), 1296 }, 1297 }, 1298 { 1299 /* Jumper EZpad 6 Pro */ 1300 .driver_data = (void *)&jumper_ezpad_6_pro_data, 1301 .matches = { 1302 DMI_MATCH(DMI_SYS_VENDOR, "Jumper"), 1303 DMI_MATCH(DMI_PRODUCT_NAME, "EZpad"), 1304 DMI_MATCH(DMI_BIOS_VERSION, "5.12"), 1305 /* Above matches are too generic, add bios-date match */ 1306 DMI_MATCH(DMI_BIOS_DATE, "08/18/2017"), 1307 }, 1308 }, 1309 { 1310 /* Jumper EZpad 6 Pro B */ 1311 .driver_data = (void *)&jumper_ezpad_6_pro_b_data, 1312 .matches = { 1313 DMI_MATCH(DMI_SYS_VENDOR, "Jumper"), 1314 DMI_MATCH(DMI_PRODUCT_NAME, "EZpad"), 1315 DMI_MATCH(DMI_BIOS_VERSION, "5.12"), 1316 /* Above matches are too generic, add bios-date match */ 1317 DMI_MATCH(DMI_BIOS_DATE, "04/24/2018"), 1318 }, 1319 }, 1320 { 1321 /* Jumper EZpad 6 m4 */ 1322 .driver_data = (void *)&jumper_ezpad_6_m4_data, 1323 .matches = { 1324 DMI_MATCH(DMI_SYS_VENDOR, "jumper"), 1325 DMI_MATCH(DMI_PRODUCT_NAME, "EZpad"), 1326 /* Jumper8.S106x.A00C.1066 with the version dropped */ 1327 DMI_MATCH(DMI_BIOS_VERSION, "Jumper8.S106x"), 1328 }, 1329 }, 1330 { 1331 /* Jumper EZpad 7 */ 1332 .driver_data = (void *)&jumper_ezpad_7_data, 1333 .matches = { 1334 DMI_MATCH(DMI_SYS_VENDOR, "Jumper"), 1335 DMI_MATCH(DMI_PRODUCT_NAME, "EZpad"), 1336 /* Jumper12x.WJ2012.bsBKRCP05 with the version dropped */ 1337 DMI_MATCH(DMI_BIOS_VERSION, "Jumper12x.WJ2012.bsBKRCP"), 1338 }, 1339 }, 1340 { 1341 /* Jumper EZpad mini3 */ 1342 .driver_data = (void *)&jumper_ezpad_mini3_data, 1343 .matches = { 1344 DMI_MATCH(DMI_SYS_VENDOR, "Insyde"), 1345 /* jumperx.T87.KFBNEEA02 with the version-nr dropped */ 1346 DMI_MATCH(DMI_BIOS_VERSION, "jumperx.T87.KFBNEEA"), 1347 }, 1348 }, 1349 { 1350 /* Juno Tablet */ 1351 .driver_data = (void *)&gdix1002_00_upside_down_data, 1352 .matches = { 1353 DMI_MATCH(DMI_SYS_VENDOR, "Default string"), 1354 /* Both product- and board-name being "Default string" is somewhat rare */ 1355 DMI_MATCH(DMI_PRODUCT_NAME, "Default string"), 1356 DMI_MATCH(DMI_BOARD_NAME, "Default string"), 1357 /* Above matches are too generic, add partial bios-version match */ 1358 DMI_MATCH(DMI_BIOS_VERSION, "JP2V1."), 1359 }, 1360 }, 1361 { 1362 /* Mediacom WinPad 7.0 W700 (same hw as Wintron surftab 7") */ 1363 .driver_data = (void *)&trekstor_surftab_wintron70_data, 1364 .matches = { 1365 DMI_MATCH(DMI_SYS_VENDOR, "MEDIACOM"), 1366 DMI_MATCH(DMI_PRODUCT_NAME, "WinPad 7 W10 - WPW700"), 1367 }, 1368 }, 1369 { 1370 /* Mediacom Flexbook Edge 11 (same hw as TS Primebook C11) */ 1371 .driver_data = (void *)&trekstor_primebook_c11_data, 1372 .matches = { 1373 DMI_MATCH(DMI_SYS_VENDOR, "MEDIACOM"), 1374 DMI_MATCH(DMI_PRODUCT_NAME, "FlexBook edge11 - M-FBE11"), 1375 }, 1376 }, 1377 { 1378 /* MP Man Converter 9 */ 1379 .driver_data = (void *)&mpman_converter9_data, 1380 .matches = { 1381 DMI_MATCH(DMI_SYS_VENDOR, "MPMAN"), 1382 DMI_MATCH(DMI_PRODUCT_NAME, "Converter9"), 1383 }, 1384 }, 1385 { 1386 /* MP Man MPWIN895CL */ 1387 .driver_data = (void *)&mpman_mpwin895cl_data, 1388 .matches = { 1389 DMI_MATCH(DMI_SYS_VENDOR, "MPMAN"), 1390 DMI_MATCH(DMI_PRODUCT_NAME, "MPWIN8900CL"), 1391 }, 1392 }, 1393 { 1394 /* Myria MY8307 */ 1395 .driver_data = (void *)&myria_my8307_data, 1396 .matches = { 1397 DMI_MATCH(DMI_SYS_VENDOR, "Complet Electro Serv"), 1398 DMI_MATCH(DMI_PRODUCT_NAME, "MY8307"), 1399 }, 1400 }, 1401 { 1402 /* Onda oBook 20 Plus */ 1403 .driver_data = (void *)&onda_obook_20_plus_data, 1404 .matches = { 1405 DMI_MATCH(DMI_SYS_VENDOR, "ONDA"), 1406 DMI_MATCH(DMI_PRODUCT_NAME, "OBOOK 20 PLUS"), 1407 }, 1408 }, 1409 { 1410 /* ONDA V80 plus v3 (P80PSBG9V3A01501) */ 1411 .driver_data = (void *)&onda_v80_plus_v3_data, 1412 .matches = { 1413 DMI_EXACT_MATCH(DMI_SYS_VENDOR, "ONDA"), 1414 DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "V80 PLUS") 1415 }, 1416 }, 1417 { 1418 /* ONDA V820w DualOS */ 1419 .driver_data = (void *)&onda_v820w_32g_data, 1420 .matches = { 1421 DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "ONDA"), 1422 DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "V820w DualOS") 1423 }, 1424 }, 1425 { 1426 /* ONDA V891 v5 */ 1427 .driver_data = (void *)&onda_v891_v5_data, 1428 .matches = { 1429 DMI_MATCH(DMI_SYS_VENDOR, "ONDA"), 1430 DMI_MATCH(DMI_PRODUCT_NAME, "ONDA Tablet"), 1431 DMI_MATCH(DMI_BIOS_VERSION, "ONDA.D869CJABNRBA06"), 1432 }, 1433 }, 1434 { 1435 /* ONDA V891w revision P891WBEBV1B00 aka v1 */ 1436 .driver_data = (void *)&onda_v891w_v1_data, 1437 .matches = { 1438 DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "ONDA"), 1439 DMI_EXACT_MATCH(DMI_BOARD_NAME, "ONDA Tablet"), 1440 DMI_EXACT_MATCH(DMI_BOARD_VERSION, "V001"), 1441 /* Exact match, different versions need different fw */ 1442 DMI_EXACT_MATCH(DMI_BIOS_VERSION, "ONDA.W89EBBN08"), 1443 }, 1444 }, 1445 { 1446 /* ONDA V891w Dual OS P891DCF2V1A01274 64GB */ 1447 .driver_data = (void *)&onda_v891w_v3_data, 1448 .matches = { 1449 DMI_MATCH(DMI_SYS_VENDOR, "Insyde"), 1450 DMI_MATCH(DMI_PRODUCT_NAME, "ONDA Tablet"), 1451 DMI_MATCH(DMI_BIOS_VERSION, "ONDA.D890HBBNR0A"), 1452 }, 1453 }, 1454 { 1455 /* Pipo W2S */ 1456 .driver_data = (void *)&pipo_w2s_data, 1457 .matches = { 1458 DMI_MATCH(DMI_SYS_VENDOR, "PIPO"), 1459 DMI_MATCH(DMI_PRODUCT_NAME, "W2S"), 1460 }, 1461 }, 1462 { 1463 /* Pipo W11 */ 1464 .driver_data = (void *)&pipo_w11_data, 1465 .matches = { 1466 DMI_MATCH(DMI_SYS_VENDOR, "PIPO"), 1467 DMI_MATCH(DMI_PRODUCT_NAME, "To be filled by O.E.M."), 1468 /* Above matches are too generic, add bios-ver match */ 1469 DMI_MATCH(DMI_BIOS_VERSION, "JS-BI-10.6-SF133GR300-GA55B-024-F"), 1470 }, 1471 }, 1472 { 1473 /* Ployer Momo7w (same hardware as the Trekstor ST70416-6) */ 1474 .driver_data = (void *)&trekstor_surftab_wintron70_data, 1475 .matches = { 1476 DMI_MATCH(DMI_SYS_VENDOR, "Shenzhen PLOYER"), 1477 DMI_MATCH(DMI_PRODUCT_NAME, "MOMO7W"), 1478 /* Exact match, different versions need different fw */ 1479 DMI_MATCH(DMI_BIOS_VERSION, "MOMO.G.WI71C.MABMRBA02"), 1480 }, 1481 }, 1482 { 1483 /* Point of View mobii wintab p800w (v2.0) */ 1484 .driver_data = (void *)&pov_mobii_wintab_p800w_v20_data, 1485 .matches = { 1486 DMI_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"), 1487 DMI_MATCH(DMI_BOARD_NAME, "Aptio CRB"), 1488 DMI_MATCH(DMI_BIOS_VERSION, "3BAIR1014"), 1489 /* Above matches are too generic, add bios-date match */ 1490 DMI_MATCH(DMI_BIOS_DATE, "10/24/2014"), 1491 }, 1492 }, 1493 { 1494 /* Predia Basic tablet) */ 1495 .driver_data = (void *)&predia_basic_data, 1496 .matches = { 1497 DMI_MATCH(DMI_SYS_VENDOR, "Insyde"), 1498 DMI_MATCH(DMI_PRODUCT_NAME, "CherryTrail"), 1499 /* Above matches are too generic, add bios-version match */ 1500 DMI_MATCH(DMI_BIOS_VERSION, "Mx.WT107.KUBNGEA"), 1501 }, 1502 }, 1503 { 1504 /* Point of View mobii wintab p800w (v2.1) */ 1505 .driver_data = (void *)&pov_mobii_wintab_p800w_v21_data, 1506 .matches = { 1507 DMI_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"), 1508 DMI_MATCH(DMI_BOARD_NAME, "Aptio CRB"), 1509 DMI_MATCH(DMI_BIOS_VERSION, "3BAIR1013"), 1510 /* Above matches are too generic, add bios-date match */ 1511 DMI_MATCH(DMI_BIOS_DATE, "08/22/2014"), 1512 }, 1513 }, 1514 { 1515 /* Point of View mobii wintab p1006w (v1.0) */ 1516 .driver_data = (void *)&pov_mobii_wintab_p1006w_v10_data, 1517 .matches = { 1518 DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Insyde"), 1519 DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "BayTrail"), 1520 /* Note 105b is Foxcon's USB/PCI vendor id */ 1521 DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "105B"), 1522 DMI_EXACT_MATCH(DMI_BOARD_NAME, "0E57"), 1523 }, 1524 }, 1525 { 1526 /* RCA Cambio W101 v2 */ 1527 /* https://github.com/onitake/gsl-firmware/discussions/193 */ 1528 .driver_data = (void *)&rca_cambio_w101_v2_data, 1529 .matches = { 1530 DMI_MATCH(DMI_SYS_VENDOR, "RCA"), 1531 DMI_MATCH(DMI_PRODUCT_NAME, "W101SA23T1"), 1532 }, 1533 }, 1534 { 1535 /* RWC NANOTE P8 */ 1536 .driver_data = (void *)&rwc_nanote_p8_data, 1537 .matches = { 1538 DMI_MATCH(DMI_BOARD_VENDOR, "Default string"), 1539 DMI_MATCH(DMI_PRODUCT_NAME, "AY07J"), 1540 DMI_MATCH(DMI_PRODUCT_SKU, "0001") 1541 }, 1542 }, 1543 { 1544 /* Schneider SCT101CTM */ 1545 .driver_data = (void *)&schneider_sct101ctm_data, 1546 .matches = { 1547 DMI_MATCH(DMI_SYS_VENDOR, "Default string"), 1548 DMI_MATCH(DMI_PRODUCT_NAME, "SCT101CTM"), 1549 }, 1550 }, 1551 { 1552 /* Techbite Arc 11.6 */ 1553 .driver_data = (void *)&techbite_arc_11_6_data, 1554 .matches = { 1555 DMI_MATCH(DMI_SYS_VENDOR, "mPTech"), 1556 DMI_MATCH(DMI_PRODUCT_NAME, "techBite Arc 11.6"), 1557 DMI_MATCH(DMI_BOARD_NAME, "G8316_272B"), 1558 }, 1559 }, 1560 { 1561 /* Teclast Tbook 11 */ 1562 .driver_data = (void *)&teclast_tbook11_data, 1563 .matches = { 1564 DMI_MATCH(DMI_SYS_VENDOR, "TECLAST"), 1565 DMI_MATCH(DMI_PRODUCT_NAME, "TbooK 11"), 1566 DMI_MATCH(DMI_PRODUCT_SKU, "E5A6_A1"), 1567 }, 1568 }, 1569 { 1570 /* Teclast X3 Plus */ 1571 .driver_data = (void *)&teclast_x3_plus_data, 1572 .matches = { 1573 DMI_MATCH(DMI_SYS_VENDOR, "TECLAST"), 1574 DMI_MATCH(DMI_PRODUCT_NAME, "X3 Plus"), 1575 DMI_MATCH(DMI_BOARD_NAME, "X3 Plus"), 1576 }, 1577 }, 1578 { 1579 /* Teclast X89 (Android version / BIOS) */ 1580 .driver_data = (void *)&gdix1001_00_upside_down_data, 1581 .matches = { 1582 DMI_MATCH(DMI_BOARD_VENDOR, "WISKY"), 1583 DMI_MATCH(DMI_BOARD_NAME, "3G062i"), 1584 }, 1585 }, 1586 { 1587 /* Teclast X89 (Windows version / BIOS) */ 1588 .driver_data = (void *)&gdix1001_01_upside_down_data, 1589 .matches = { 1590 /* tPAD is too generic, also match on bios date */ 1591 DMI_MATCH(DMI_BOARD_VENDOR, "TECLAST"), 1592 DMI_MATCH(DMI_BOARD_NAME, "tPAD"), 1593 DMI_MATCH(DMI_BIOS_DATE, "12/19/2014"), 1594 }, 1595 }, 1596 { 1597 /* Teclast X98 Plus II */ 1598 .driver_data = (void *)&teclast_x98plus2_data, 1599 .matches = { 1600 DMI_MATCH(DMI_SYS_VENDOR, "TECLAST"), 1601 DMI_MATCH(DMI_PRODUCT_NAME, "X98 Plus II"), 1602 }, 1603 }, 1604 { 1605 /* Teclast X98 Pro */ 1606 .driver_data = (void *)&gdix1001_00_upside_down_data, 1607 .matches = { 1608 /* 1609 * Only match BIOS date, because the manufacturers 1610 * BIOS does not report the board name at all 1611 * (sometimes)... 1612 */ 1613 DMI_MATCH(DMI_BOARD_VENDOR, "TECLAST"), 1614 DMI_MATCH(DMI_BIOS_DATE, "10/28/2015"), 1615 }, 1616 }, 1617 { 1618 /* Trekstor Primebook C11 */ 1619 .driver_data = (void *)&trekstor_primebook_c11_data, 1620 .matches = { 1621 DMI_MATCH(DMI_SYS_VENDOR, "TREKSTOR"), 1622 DMI_MATCH(DMI_PRODUCT_NAME, "Primebook C11"), 1623 }, 1624 }, 1625 { 1626 /* Trekstor Primebook C11B (same touchscreen as the C11) */ 1627 .driver_data = (void *)&trekstor_primebook_c11_data, 1628 .matches = { 1629 DMI_MATCH(DMI_SYS_VENDOR, "TREKSTOR"), 1630 DMI_MATCH(DMI_PRODUCT_NAME, "PRIMEBOOK C11B"), 1631 }, 1632 }, 1633 { 1634 /* Trekstor Primebook C13 */ 1635 .driver_data = (void *)&trekstor_primebook_c13_data, 1636 .matches = { 1637 DMI_MATCH(DMI_SYS_VENDOR, "TREKSTOR"), 1638 DMI_MATCH(DMI_PRODUCT_NAME, "Primebook C13"), 1639 }, 1640 }, 1641 { 1642 /* Trekstor Primetab T13B */ 1643 .driver_data = (void *)&trekstor_primetab_t13b_data, 1644 .matches = { 1645 DMI_MATCH(DMI_SYS_VENDOR, "TREKSTOR"), 1646 DMI_MATCH(DMI_PRODUCT_NAME, "Primetab T13B"), 1647 }, 1648 }, 1649 { 1650 /* TrekStor SurfTab duo W1 10.1 ST10432-10b */ 1651 .driver_data = (void *)&trekstor_surftab_duo_w1_data, 1652 .matches = { 1653 DMI_MATCH(DMI_SYS_VENDOR, "TrekStor"), 1654 DMI_MATCH(DMI_PRODUCT_NAME, "SurfTab duo W1 10.1 (VT4)"), 1655 }, 1656 }, 1657 { 1658 /* TrekStor SurfTab twin 10.1 ST10432-8 */ 1659 .driver_data = (void *)&trekstor_surftab_twin_10_1_data, 1660 .matches = { 1661 DMI_MATCH(DMI_SYS_VENDOR, "TrekStor"), 1662 DMI_MATCH(DMI_PRODUCT_NAME, "SurfTab twin 10.1"), 1663 }, 1664 }, 1665 { 1666 /* Trekstor Surftab Wintron 7.0 ST70416-6 */ 1667 .driver_data = (void *)&trekstor_surftab_wintron70_data, 1668 .matches = { 1669 DMI_MATCH(DMI_SYS_VENDOR, "Insyde"), 1670 DMI_MATCH(DMI_PRODUCT_NAME, "ST70416-6"), 1671 /* Exact match, different versions need different fw */ 1672 DMI_MATCH(DMI_BIOS_VERSION, "TREK.G.WI71C.JGBMRBA04"), 1673 }, 1674 }, 1675 { 1676 /* Trekstor Surftab Wintron 7.0 ST70416-6, newer BIOS */ 1677 .driver_data = (void *)&trekstor_surftab_wintron70_data, 1678 .matches = { 1679 DMI_MATCH(DMI_SYS_VENDOR, "TrekStor"), 1680 DMI_MATCH(DMI_PRODUCT_NAME, "SurfTab wintron 7.0 ST70416-6"), 1681 /* Exact match, different versions need different fw */ 1682 DMI_MATCH(DMI_BIOS_VERSION, "TREK.G.WI71C.JGBMRBA05"), 1683 }, 1684 }, 1685 { 1686 /* Trekstor Yourbook C11B (same touchscreen as the Primebook C11) */ 1687 .driver_data = (void *)&trekstor_primebook_c11_data, 1688 .matches = { 1689 DMI_MATCH(DMI_SYS_VENDOR, "TREKSTOR"), 1690 DMI_MATCH(DMI_PRODUCT_NAME, "YOURBOOK C11B"), 1691 }, 1692 }, 1693 { 1694 /* Viglen Connect 10 */ 1695 .driver_data = (void *)&viglen_connect_10_data, 1696 .matches = { 1697 DMI_MATCH(DMI_SYS_VENDOR, "Viglen Ltd."), 1698 DMI_MATCH(DMI_PRODUCT_NAME, "Connect 10'' Tablet PC"), 1699 }, 1700 }, 1701 { 1702 /* Vinga Twizzle J116 */ 1703 .driver_data = (void *)&vinga_twizzle_j116_data, 1704 .matches = { 1705 DMI_MATCH(DMI_PRODUCT_NAME, "VINGA Twizzle J116"), 1706 }, 1707 }, 1708 { 1709 /* "WinBook TW100" */ 1710 .driver_data = (void *)&gdix1001_00_upside_down_data, 1711 .matches = { 1712 DMI_MATCH(DMI_SYS_VENDOR, "WinBook"), 1713 DMI_MATCH(DMI_PRODUCT_NAME, "TW100") 1714 } 1715 }, 1716 { 1717 /* WinBook TW700 */ 1718 .driver_data = (void *)&gdix1001_00_upside_down_data, 1719 .matches = { 1720 DMI_MATCH(DMI_SYS_VENDOR, "WinBook"), 1721 DMI_MATCH(DMI_PRODUCT_NAME, "TW700") 1722 }, 1723 }, 1724 { 1725 /* Yours Y8W81, same case and touchscreen as Chuwi Vi8 */ 1726 .driver_data = (void *)&chuwi_vi8_data, 1727 .matches = { 1728 DMI_MATCH(DMI_SYS_VENDOR, "YOURS"), 1729 DMI_MATCH(DMI_PRODUCT_NAME, "Y8W81"), 1730 }, 1731 }, 1732 { } 1733 }; 1734 1735 static const struct ts_dmi_data *ts_data; 1736 1737 static void ts_dmi_add_props(struct i2c_client *client) 1738 { 1739 struct device *dev = &client->dev; 1740 int error; 1741 1742 if (has_acpi_companion(dev) && 1743 !strncmp(ts_data->acpi_name, client->name, I2C_NAME_SIZE)) { 1744 error = device_create_managed_software_node(dev, ts_data->properties, NULL); 1745 if (error) 1746 dev_err(dev, "failed to add properties: %d\n", error); 1747 } 1748 } 1749 1750 static int ts_dmi_notifier_call(struct notifier_block *nb, 1751 unsigned long action, void *data) 1752 { 1753 struct device *dev = data; 1754 struct i2c_client *client; 1755 1756 switch (action) { 1757 case BUS_NOTIFY_ADD_DEVICE: 1758 client = i2c_verify_client(dev); 1759 if (client) 1760 ts_dmi_add_props(client); 1761 break; 1762 1763 default: 1764 break; 1765 } 1766 1767 return 0; 1768 } 1769 1770 static struct notifier_block ts_dmi_notifier = { 1771 .notifier_call = ts_dmi_notifier_call, 1772 }; 1773 1774 static int __init ts_dmi_init(void) 1775 { 1776 const struct dmi_system_id *dmi_id; 1777 int error; 1778 1779 dmi_id = dmi_first_match(touchscreen_dmi_table); 1780 if (!dmi_id) 1781 return 0; /* Not an error */ 1782 1783 ts_data = dmi_id->driver_data; 1784 /* Some dmi table entries only provide an efi_embedded_fw_desc */ 1785 if (!ts_data->properties) 1786 return 0; 1787 1788 error = bus_register_notifier(&i2c_bus_type, &ts_dmi_notifier); 1789 if (error) 1790 pr_err("%s: failed to register i2c bus notifier: %d\n", 1791 __func__, error); 1792 1793 return error; 1794 } 1795 1796 /* 1797 * We are registering out notifier after i2c core is initialized and i2c bus 1798 * itself is ready (which happens at postcore initcall level), but before 1799 * ACPI starts enumerating devices (at subsys initcall level). 1800 */ 1801 arch_initcall(ts_dmi_init); 1802