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/i2c.h> 15 #include <linux/notifier.h> 16 #include <linux/property.h> 17 #include <linux/string.h> 18 19 struct ts_dmi_data { 20 const char *acpi_name; 21 const struct property_entry *properties; 22 }; 23 24 /* NOTE: Please keep all entries sorted alphabetically */ 25 26 static const struct property_entry chuwi_hi8_props[] = { 27 PROPERTY_ENTRY_U32("touchscreen-size-x", 1665), 28 PROPERTY_ENTRY_U32("touchscreen-size-y", 1140), 29 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 30 PROPERTY_ENTRY_BOOL("silead,home-button"), 31 PROPERTY_ENTRY_STRING("firmware-name", "gsl1680-chuwi-hi8.fw"), 32 { } 33 }; 34 35 static const struct ts_dmi_data chuwi_hi8_data = { 36 .acpi_name = "MSSL0001:00", 37 .properties = chuwi_hi8_props, 38 }; 39 40 static const struct property_entry chuwi_hi8_air_props[] = { 41 PROPERTY_ENTRY_U32("touchscreen-size-x", 1728), 42 PROPERTY_ENTRY_U32("touchscreen-size-y", 1148), 43 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 44 PROPERTY_ENTRY_STRING("firmware-name", "gsl3676-chuwi-hi8-air.fw"), 45 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 46 { } 47 }; 48 49 static const struct ts_dmi_data chuwi_hi8_air_data = { 50 .acpi_name = "MSSL1680:00", 51 .properties = chuwi_hi8_air_props, 52 }; 53 54 static const struct property_entry chuwi_hi8_pro_props[] = { 55 PROPERTY_ENTRY_U32("touchscreen-min-x", 6), 56 PROPERTY_ENTRY_U32("touchscreen-min-y", 3), 57 PROPERTY_ENTRY_U32("touchscreen-size-x", 1728), 58 PROPERTY_ENTRY_U32("touchscreen-size-y", 1148), 59 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 60 PROPERTY_ENTRY_STRING("firmware-name", "gsl3680-chuwi-hi8-pro.fw"), 61 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 62 PROPERTY_ENTRY_BOOL("silead,home-button"), 63 { } 64 }; 65 66 static const struct ts_dmi_data chuwi_hi8_pro_data = { 67 .acpi_name = "MSSL1680:00", 68 .properties = chuwi_hi8_pro_props, 69 }; 70 71 static const struct property_entry chuwi_hi10_air_props[] = { 72 PROPERTY_ENTRY_U32("touchscreen-size-x", 1981), 73 PROPERTY_ENTRY_U32("touchscreen-size-y", 1271), 74 PROPERTY_ENTRY_U32("touchscreen-min-x", 99), 75 PROPERTY_ENTRY_U32("touchscreen-min-y", 9), 76 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 77 PROPERTY_ENTRY_U32("touchscreen-fuzz-x", 5), 78 PROPERTY_ENTRY_U32("touchscreen-fuzz-y", 4), 79 PROPERTY_ENTRY_STRING("firmware-name", "gsl1680-chuwi-hi10-air.fw"), 80 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 81 PROPERTY_ENTRY_BOOL("silead,home-button"), 82 { } 83 }; 84 85 static const struct ts_dmi_data chuwi_hi10_air_data = { 86 .acpi_name = "MSSL1680:00", 87 .properties = chuwi_hi10_air_props, 88 }; 89 90 static const struct property_entry chuwi_hi10_plus_props[] = { 91 PROPERTY_ENTRY_U32("touchscreen-min-x", 0), 92 PROPERTY_ENTRY_U32("touchscreen-min-y", 5), 93 PROPERTY_ENTRY_U32("touchscreen-size-x", 1914), 94 PROPERTY_ENTRY_U32("touchscreen-size-y", 1283), 95 PROPERTY_ENTRY_STRING("firmware-name", "gsl1680-chuwi-hi10plus.fw"), 96 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 97 PROPERTY_ENTRY_BOOL("silead,home-button"), 98 { } 99 }; 100 101 static const struct ts_dmi_data chuwi_hi10_plus_data = { 102 .acpi_name = "MSSL0017:00", 103 .properties = chuwi_hi10_plus_props, 104 }; 105 106 static const struct property_entry chuwi_vi8_props[] = { 107 PROPERTY_ENTRY_U32("touchscreen-min-x", 4), 108 PROPERTY_ENTRY_U32("touchscreen-min-y", 6), 109 PROPERTY_ENTRY_U32("touchscreen-size-x", 1724), 110 PROPERTY_ENTRY_U32("touchscreen-size-y", 1140), 111 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 112 PROPERTY_ENTRY_STRING("firmware-name", "gsl3676-chuwi-vi8.fw"), 113 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 114 PROPERTY_ENTRY_BOOL("silead,home-button"), 115 { } 116 }; 117 118 static const struct ts_dmi_data chuwi_vi8_data = { 119 .acpi_name = "MSSL1680:00", 120 .properties = chuwi_vi8_props, 121 }; 122 123 static const struct property_entry chuwi_vi10_props[] = { 124 PROPERTY_ENTRY_U32("touchscreen-min-x", 0), 125 PROPERTY_ENTRY_U32("touchscreen-min-y", 4), 126 PROPERTY_ENTRY_U32("touchscreen-size-x", 1858), 127 PROPERTY_ENTRY_U32("touchscreen-size-y", 1280), 128 PROPERTY_ENTRY_STRING("firmware-name", "gsl3680-chuwi-vi10.fw"), 129 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 130 PROPERTY_ENTRY_BOOL("silead,home-button"), 131 { } 132 }; 133 134 static const struct ts_dmi_data chuwi_vi10_data = { 135 .acpi_name = "MSSL0002:00", 136 .properties = chuwi_vi10_props, 137 }; 138 139 static const struct property_entry connect_tablet9_props[] = { 140 PROPERTY_ENTRY_U32("touchscreen-min-x", 9), 141 PROPERTY_ENTRY_U32("touchscreen-min-y", 10), 142 PROPERTY_ENTRY_U32("touchscreen-size-x", 1664), 143 PROPERTY_ENTRY_U32("touchscreen-size-y", 880), 144 PROPERTY_ENTRY_BOOL("touchscreen-inverted-y"), 145 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 146 PROPERTY_ENTRY_STRING("firmware-name", "gsl1680-connect-tablet9.fw"), 147 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 148 { } 149 }; 150 151 static const struct ts_dmi_data connect_tablet9_data = { 152 .acpi_name = "MSSL1680:00", 153 .properties = connect_tablet9_props, 154 }; 155 156 static const struct property_entry cube_iwork8_air_props[] = { 157 PROPERTY_ENTRY_U32("touchscreen-min-x", 1), 158 PROPERTY_ENTRY_U32("touchscreen-min-y", 3), 159 PROPERTY_ENTRY_U32("touchscreen-size-x", 1664), 160 PROPERTY_ENTRY_U32("touchscreen-size-y", 896), 161 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 162 PROPERTY_ENTRY_STRING("firmware-name", "gsl3670-cube-iwork8-air.fw"), 163 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 164 { } 165 }; 166 167 static const struct ts_dmi_data cube_iwork8_air_data = { 168 .acpi_name = "MSSL1680:00", 169 .properties = cube_iwork8_air_props, 170 }; 171 172 static const struct property_entry cube_knote_i1101_props[] = { 173 PROPERTY_ENTRY_U32("touchscreen-min-x", 20), 174 PROPERTY_ENTRY_U32("touchscreen-min-y", 22), 175 PROPERTY_ENTRY_U32("touchscreen-size-x", 1961), 176 PROPERTY_ENTRY_U32("touchscreen-size-y", 1513), 177 PROPERTY_ENTRY_STRING("firmware-name", "gsl3692-cube-knote-i1101.fw"), 178 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 179 PROPERTY_ENTRY_BOOL("silead,home-button"), 180 { } 181 }; 182 183 static const struct ts_dmi_data cube_knote_i1101_data = { 184 .acpi_name = "MSSL1680:00", 185 .properties = cube_knote_i1101_props, 186 }; 187 188 static const struct property_entry dexp_ursus_7w_props[] = { 189 PROPERTY_ENTRY_U32("touchscreen-size-x", 890), 190 PROPERTY_ENTRY_U32("touchscreen-size-y", 630), 191 PROPERTY_ENTRY_STRING("firmware-name", "gsl1686-dexp-ursus-7w.fw"), 192 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 193 PROPERTY_ENTRY_BOOL("silead,home-button"), 194 { } 195 }; 196 197 static const struct ts_dmi_data dexp_ursus_7w_data = { 198 .acpi_name = "MSSL1680:00", 199 .properties = dexp_ursus_7w_props, 200 }; 201 202 static const struct property_entry digma_citi_e200_props[] = { 203 PROPERTY_ENTRY_U32("touchscreen-size-x", 1980), 204 PROPERTY_ENTRY_U32("touchscreen-size-y", 1500), 205 PROPERTY_ENTRY_BOOL("touchscreen-inverted-y"), 206 PROPERTY_ENTRY_STRING("firmware-name", 207 "gsl1686-digma_citi_e200.fw"), 208 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 209 PROPERTY_ENTRY_BOOL("silead,home-button"), 210 { } 211 }; 212 213 static const struct ts_dmi_data digma_citi_e200_data = { 214 .acpi_name = "MSSL1680:00", 215 .properties = digma_citi_e200_props, 216 }; 217 218 static const struct property_entry gp_electronic_t701_props[] = { 219 PROPERTY_ENTRY_U32("touchscreen-size-x", 960), 220 PROPERTY_ENTRY_U32("touchscreen-size-y", 640), 221 PROPERTY_ENTRY_BOOL("touchscreen-inverted-x"), 222 PROPERTY_ENTRY_BOOL("touchscreen-inverted-y"), 223 PROPERTY_ENTRY_STRING("firmware-name", 224 "gsl1680-gp-electronic-t701.fw"), 225 { } 226 }; 227 228 static const struct ts_dmi_data gp_electronic_t701_data = { 229 .acpi_name = "MSSL1680:00", 230 .properties = gp_electronic_t701_props, 231 }; 232 233 static const struct property_entry itworks_tw891_props[] = { 234 PROPERTY_ENTRY_U32("touchscreen-min-x", 1), 235 PROPERTY_ENTRY_U32("touchscreen-min-y", 5), 236 PROPERTY_ENTRY_U32("touchscreen-size-x", 1600), 237 PROPERTY_ENTRY_U32("touchscreen-size-y", 896), 238 PROPERTY_ENTRY_BOOL("touchscreen-inverted-y"), 239 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 240 PROPERTY_ENTRY_STRING("firmware-name", "gsl3670-itworks-tw891.fw"), 241 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 242 { } 243 }; 244 245 static const struct ts_dmi_data itworks_tw891_data = { 246 .acpi_name = "MSSL1680:00", 247 .properties = itworks_tw891_props, 248 }; 249 250 static const struct property_entry jumper_ezpad_6_pro_props[] = { 251 PROPERTY_ENTRY_U32("touchscreen-size-x", 1980), 252 PROPERTY_ENTRY_U32("touchscreen-size-y", 1500), 253 PROPERTY_ENTRY_STRING("firmware-name", "gsl3692-jumper-ezpad-6-pro.fw"), 254 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 255 PROPERTY_ENTRY_BOOL("silead,home-button"), 256 { } 257 }; 258 259 static const struct ts_dmi_data jumper_ezpad_6_pro_data = { 260 .acpi_name = "MSSL1680:00", 261 .properties = jumper_ezpad_6_pro_props, 262 }; 263 264 static const struct property_entry jumper_ezpad_6_pro_b_props[] = { 265 PROPERTY_ENTRY_U32("touchscreen-size-x", 1980), 266 PROPERTY_ENTRY_U32("touchscreen-size-y", 1500), 267 PROPERTY_ENTRY_STRING("firmware-name", "gsl3692-jumper-ezpad-6-pro-b.fw"), 268 PROPERTY_ENTRY_BOOL("touchscreen-inverted-y"), 269 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 270 PROPERTY_ENTRY_BOOL("silead,home-button"), 271 { } 272 }; 273 274 static const struct ts_dmi_data jumper_ezpad_6_pro_b_data = { 275 .acpi_name = "MSSL1680:00", 276 .properties = jumper_ezpad_6_pro_b_props, 277 }; 278 279 static const struct property_entry jumper_ezpad_mini3_props[] = { 280 PROPERTY_ENTRY_U32("touchscreen-min-x", 23), 281 PROPERTY_ENTRY_U32("touchscreen-min-y", 16), 282 PROPERTY_ENTRY_U32("touchscreen-size-x", 1700), 283 PROPERTY_ENTRY_U32("touchscreen-size-y", 1138), 284 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 285 PROPERTY_ENTRY_STRING("firmware-name", "gsl3676-jumper-ezpad-mini3.fw"), 286 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 287 { } 288 }; 289 290 static const struct ts_dmi_data jumper_ezpad_mini3_data = { 291 .acpi_name = "MSSL1680:00", 292 .properties = jumper_ezpad_mini3_props, 293 }; 294 295 static const struct property_entry myria_my8307_props[] = { 296 PROPERTY_ENTRY_U32("touchscreen-size-x", 1720), 297 PROPERTY_ENTRY_U32("touchscreen-size-y", 1140), 298 PROPERTY_ENTRY_BOOL("touchscreen-inverted-x"), 299 PROPERTY_ENTRY_BOOL("touchscreen-inverted-y"), 300 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 301 PROPERTY_ENTRY_STRING("firmware-name", "gsl1680-myria-my8307.fw"), 302 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 303 PROPERTY_ENTRY_BOOL("silead,home-button"), 304 { } 305 }; 306 307 static const struct ts_dmi_data myria_my8307_data = { 308 .acpi_name = "MSSL1680:00", 309 .properties = myria_my8307_props, 310 }; 311 312 static const struct property_entry onda_obook_20_plus_props[] = { 313 PROPERTY_ENTRY_U32("touchscreen-size-x", 1728), 314 PROPERTY_ENTRY_U32("touchscreen-size-y", 1148), 315 PROPERTY_ENTRY_BOOL("touchscreen-inverted-x"), 316 PROPERTY_ENTRY_BOOL("touchscreen-inverted-y"), 317 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 318 PROPERTY_ENTRY_STRING("firmware-name", "gsl3676-onda-obook-20-plus.fw"), 319 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 320 PROPERTY_ENTRY_BOOL("silead,home-button"), 321 { } 322 }; 323 324 static const struct ts_dmi_data onda_obook_20_plus_data = { 325 .acpi_name = "MSSL1680:00", 326 .properties = onda_obook_20_plus_props, 327 }; 328 329 static const struct property_entry onda_v80_plus_v3_props[] = { 330 PROPERTY_ENTRY_U32("touchscreen-min-x", 22), 331 PROPERTY_ENTRY_U32("touchscreen-min-y", 15), 332 PROPERTY_ENTRY_U32("touchscreen-size-x", 1698), 333 PROPERTY_ENTRY_U32("touchscreen-size-y", 1140), 334 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 335 PROPERTY_ENTRY_STRING("firmware-name", 336 "gsl3676-onda-v80-plus-v3.fw"), 337 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 338 PROPERTY_ENTRY_BOOL("silead,home-button"), 339 { } 340 }; 341 342 static const struct ts_dmi_data onda_v80_plus_v3_data = { 343 .acpi_name = "MSSL1680:00", 344 .properties = onda_v80_plus_v3_props, 345 }; 346 347 static const struct property_entry onda_v820w_32g_props[] = { 348 PROPERTY_ENTRY_U32("touchscreen-size-x", 1665), 349 PROPERTY_ENTRY_U32("touchscreen-size-y", 1140), 350 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 351 PROPERTY_ENTRY_STRING("firmware-name", 352 "gsl1680-onda-v820w-32g.fw"), 353 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 354 PROPERTY_ENTRY_BOOL("silead,home-button"), 355 { } 356 }; 357 358 static const struct ts_dmi_data onda_v820w_32g_data = { 359 .acpi_name = "MSSL1680:00", 360 .properties = onda_v820w_32g_props, 361 }; 362 363 static const struct property_entry onda_v891w_v1_props[] = { 364 PROPERTY_ENTRY_U32("touchscreen-min-x", 46), 365 PROPERTY_ENTRY_U32("touchscreen-min-y", 8), 366 PROPERTY_ENTRY_U32("touchscreen-size-x", 1676), 367 PROPERTY_ENTRY_U32("touchscreen-size-y", 1130), 368 PROPERTY_ENTRY_STRING("firmware-name", 369 "gsl3680-onda-v891w-v1.fw"), 370 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 371 PROPERTY_ENTRY_BOOL("silead,home-button"), 372 { } 373 }; 374 375 static const struct ts_dmi_data onda_v891w_v1_data = { 376 .acpi_name = "MSSL1680:00", 377 .properties = onda_v891w_v1_props, 378 }; 379 380 static const struct property_entry onda_v891w_v3_props[] = { 381 PROPERTY_ENTRY_U32("touchscreen-min-x", 35), 382 PROPERTY_ENTRY_U32("touchscreen-min-y", 15), 383 PROPERTY_ENTRY_U32("touchscreen-size-x", 1625), 384 PROPERTY_ENTRY_U32("touchscreen-size-y", 1135), 385 PROPERTY_ENTRY_BOOL("touchscreen-inverted-y"), 386 PROPERTY_ENTRY_STRING("firmware-name", 387 "gsl3676-onda-v891w-v3.fw"), 388 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 389 PROPERTY_ENTRY_BOOL("silead,home-button"), 390 { } 391 }; 392 393 static const struct ts_dmi_data onda_v891w_v3_data = { 394 .acpi_name = "MSSL1680:00", 395 .properties = onda_v891w_v3_props, 396 }; 397 398 static const struct property_entry pipo_w2s_props[] = { 399 PROPERTY_ENTRY_U32("touchscreen-size-x", 1660), 400 PROPERTY_ENTRY_U32("touchscreen-size-y", 880), 401 PROPERTY_ENTRY_BOOL("touchscreen-inverted-x"), 402 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 403 PROPERTY_ENTRY_STRING("firmware-name", 404 "gsl1680-pipo-w2s.fw"), 405 { } 406 }; 407 408 static const struct ts_dmi_data pipo_w2s_data = { 409 .acpi_name = "MSSL1680:00", 410 .properties = pipo_w2s_props, 411 }; 412 413 static const struct property_entry pov_mobii_wintab_p800w_v20_props[] = { 414 PROPERTY_ENTRY_U32("touchscreen-min-x", 32), 415 PROPERTY_ENTRY_U32("touchscreen-min-y", 16), 416 PROPERTY_ENTRY_U32("touchscreen-size-x", 1692), 417 PROPERTY_ENTRY_U32("touchscreen-size-y", 1146), 418 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 419 PROPERTY_ENTRY_STRING("firmware-name", 420 "gsl3680-pov-mobii-wintab-p800w-v20.fw"), 421 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 422 PROPERTY_ENTRY_BOOL("silead,home-button"), 423 { } 424 }; 425 426 static const struct ts_dmi_data pov_mobii_wintab_p800w_v20_data = { 427 .acpi_name = "MSSL1680:00", 428 .properties = pov_mobii_wintab_p800w_v20_props, 429 }; 430 431 static const struct property_entry pov_mobii_wintab_p800w_v21_props[] = { 432 PROPERTY_ENTRY_U32("touchscreen-min-x", 1), 433 PROPERTY_ENTRY_U32("touchscreen-min-y", 8), 434 PROPERTY_ENTRY_U32("touchscreen-size-x", 1794), 435 PROPERTY_ENTRY_U32("touchscreen-size-y", 1148), 436 PROPERTY_ENTRY_BOOL("touchscreen-swapped-x-y"), 437 PROPERTY_ENTRY_STRING("firmware-name", 438 "gsl3692-pov-mobii-wintab-p800w.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 pov_mobii_wintab_p800w_v21_data = { 445 .acpi_name = "MSSL1680:00", 446 .properties = pov_mobii_wintab_p800w_v21_props, 447 }; 448 449 static const struct property_entry pov_mobii_wintab_p1006w_v10_props[] = { 450 PROPERTY_ENTRY_U32("touchscreen-min-x", 1), 451 PROPERTY_ENTRY_U32("touchscreen-min-y", 3), 452 PROPERTY_ENTRY_U32("touchscreen-size-x", 1984), 453 PROPERTY_ENTRY_U32("touchscreen-size-y", 1520), 454 PROPERTY_ENTRY_BOOL("touchscreen-inverted-y"), 455 PROPERTY_ENTRY_STRING("firmware-name", 456 "gsl3692-pov-mobii-wintab-p1006w-v10.fw"), 457 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 458 PROPERTY_ENTRY_BOOL("silead,home-button"), 459 { } 460 }; 461 462 static const struct ts_dmi_data pov_mobii_wintab_p1006w_v10_data = { 463 .acpi_name = "MSSL1680:00", 464 .properties = pov_mobii_wintab_p1006w_v10_props, 465 }; 466 467 static const struct property_entry teclast_x3_plus_props[] = { 468 PROPERTY_ENTRY_U32("touchscreen-size-x", 1980), 469 PROPERTY_ENTRY_U32("touchscreen-size-y", 1500), 470 PROPERTY_ENTRY_STRING("firmware-name", "gsl1680-teclast-x3-plus.fw"), 471 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 472 PROPERTY_ENTRY_BOOL("silead,home-button"), 473 { } 474 }; 475 476 static const struct ts_dmi_data teclast_x3_plus_data = { 477 .acpi_name = "MSSL1680:00", 478 .properties = teclast_x3_plus_props, 479 }; 480 481 static const struct property_entry teclast_x98plus2_props[] = { 482 PROPERTY_ENTRY_U32("touchscreen-size-x", 2048), 483 PROPERTY_ENTRY_U32("touchscreen-size-y", 1280), 484 PROPERTY_ENTRY_BOOL("touchscreen-inverted-x"), 485 PROPERTY_ENTRY_BOOL("touchscreen-inverted-y"), 486 PROPERTY_ENTRY_STRING("firmware-name", 487 "gsl1686-teclast_x98plus2.fw"), 488 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 489 { } 490 }; 491 492 static const struct ts_dmi_data teclast_x98plus2_data = { 493 .acpi_name = "MSSL1680:00", 494 .properties = teclast_x98plus2_props, 495 }; 496 497 static const struct property_entry trekstor_primebook_c11_props[] = { 498 PROPERTY_ENTRY_U32("touchscreen-size-x", 1970), 499 PROPERTY_ENTRY_U32("touchscreen-size-y", 1530), 500 PROPERTY_ENTRY_BOOL("touchscreen-inverted-y"), 501 PROPERTY_ENTRY_STRING("firmware-name", 502 "gsl1680-trekstor-primebook-c11.fw"), 503 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 504 PROPERTY_ENTRY_BOOL("silead,home-button"), 505 { } 506 }; 507 508 static const struct ts_dmi_data trekstor_primebook_c11_data = { 509 .acpi_name = "MSSL1680:00", 510 .properties = trekstor_primebook_c11_props, 511 }; 512 513 static const struct property_entry trekstor_primebook_c13_props[] = { 514 PROPERTY_ENTRY_U32("touchscreen-size-x", 2624), 515 PROPERTY_ENTRY_U32("touchscreen-size-y", 1920), 516 PROPERTY_ENTRY_STRING("firmware-name", 517 "gsl1680-trekstor-primebook-c13.fw"), 518 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 519 PROPERTY_ENTRY_BOOL("silead,home-button"), 520 { } 521 }; 522 523 static const struct ts_dmi_data trekstor_primebook_c13_data = { 524 .acpi_name = "MSSL1680:00", 525 .properties = trekstor_primebook_c13_props, 526 }; 527 528 static const struct property_entry trekstor_primetab_t13b_props[] = { 529 PROPERTY_ENTRY_U32("touchscreen-size-x", 2500), 530 PROPERTY_ENTRY_U32("touchscreen-size-y", 1900), 531 PROPERTY_ENTRY_STRING("firmware-name", 532 "gsl1680-trekstor-primetab-t13b.fw"), 533 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 534 PROPERTY_ENTRY_BOOL("silead,home-button"), 535 PROPERTY_ENTRY_BOOL("touchscreen-inverted-y"), 536 { } 537 }; 538 539 static const struct ts_dmi_data trekstor_primetab_t13b_data = { 540 .acpi_name = "MSSL1680:00", 541 .properties = trekstor_primetab_t13b_props, 542 }; 543 544 static const struct property_entry trekstor_surftab_twin_10_1_props[] = { 545 PROPERTY_ENTRY_U32("touchscreen-size-x", 1900), 546 PROPERTY_ENTRY_U32("touchscreen-size-y", 1280), 547 PROPERTY_ENTRY_U32("touchscreen-inverted-y", 1), 548 PROPERTY_ENTRY_STRING("firmware-name", 549 "gsl3670-surftab-twin-10-1-st10432-8.fw"), 550 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 551 { } 552 }; 553 554 static const struct ts_dmi_data trekstor_surftab_twin_10_1_data = { 555 .acpi_name = "MSSL1680:00", 556 .properties = trekstor_surftab_twin_10_1_props, 557 }; 558 559 static const struct property_entry trekstor_surftab_wintron70_props[] = { 560 PROPERTY_ENTRY_U32("touchscreen-min-x", 12), 561 PROPERTY_ENTRY_U32("touchscreen-min-y", 8), 562 PROPERTY_ENTRY_U32("touchscreen-size-x", 884), 563 PROPERTY_ENTRY_U32("touchscreen-size-y", 632), 564 PROPERTY_ENTRY_STRING("firmware-name", 565 "gsl1686-surftab-wintron70-st70416-6.fw"), 566 PROPERTY_ENTRY_U32("silead,max-fingers", 10), 567 PROPERTY_ENTRY_BOOL("silead,home-button"), 568 { } 569 }; 570 571 static const struct ts_dmi_data trekstor_surftab_wintron70_data = { 572 .acpi_name = "MSSL1680:00", 573 .properties = trekstor_surftab_wintron70_props, 574 }; 575 576 /* NOTE: Please keep this table sorted alphabetically */ 577 static const struct dmi_system_id touchscreen_dmi_table[] = { 578 { 579 /* Chuwi Hi8 */ 580 .driver_data = (void *)&chuwi_hi8_data, 581 .matches = { 582 DMI_MATCH(DMI_SYS_VENDOR, "ilife"), 583 DMI_MATCH(DMI_PRODUCT_NAME, "S806"), 584 }, 585 }, 586 { 587 /* Chuwi Hi8 (H1D_S806_206) */ 588 .driver_data = (void *)&chuwi_hi8_data, 589 .matches = { 590 DMI_MATCH(DMI_SYS_VENDOR, "Insyde"), 591 DMI_MATCH(DMI_PRODUCT_NAME, "BayTrail"), 592 DMI_MATCH(DMI_BIOS_VERSION, "H1D_S806_206"), 593 }, 594 }, 595 { 596 /* Chuwi Hi8 Air (CWI543) */ 597 .driver_data = (void *)&chuwi_hi8_air_data, 598 .matches = { 599 DMI_MATCH(DMI_BOARD_VENDOR, "Default string"), 600 DMI_MATCH(DMI_BOARD_NAME, "Cherry Trail CR"), 601 DMI_MATCH(DMI_PRODUCT_NAME, "Hi8 Air"), 602 }, 603 }, 604 { 605 /* Chuwi Hi8 Pro (CWI513) */ 606 .driver_data = (void *)&chuwi_hi8_pro_data, 607 .matches = { 608 DMI_MATCH(DMI_SYS_VENDOR, "Hampoo"), 609 DMI_MATCH(DMI_PRODUCT_NAME, "X1D3_C806N"), 610 }, 611 }, 612 { 613 /* Chuwi Hi10 Air */ 614 .driver_data = (void *)&chuwi_hi10_air_data, 615 .matches = { 616 DMI_MATCH(DMI_SYS_VENDOR, "CHUWI INNOVATION AND TECHNOLOGY(SHENZHEN)CO.LTD"), 617 DMI_MATCH(DMI_BOARD_NAME, "Cherry Trail CR"), 618 DMI_MATCH(DMI_PRODUCT_SKU, "P1W6_C109D_B"), 619 }, 620 }, 621 { 622 /* Chuwi Hi10 Plus (CWI527) */ 623 .driver_data = (void *)&chuwi_hi10_plus_data, 624 .matches = { 625 DMI_MATCH(DMI_BOARD_VENDOR, "Hampoo"), 626 DMI_MATCH(DMI_PRODUCT_NAME, "Hi10 plus tablet"), 627 DMI_MATCH(DMI_BOARD_NAME, "Cherry Trail CR"), 628 }, 629 }, 630 { 631 /* Chuwi Vi8 (CWI506) */ 632 .driver_data = (void *)&chuwi_vi8_data, 633 .matches = { 634 DMI_MATCH(DMI_SYS_VENDOR, "Insyde"), 635 DMI_MATCH(DMI_PRODUCT_NAME, "i86"), 636 DMI_MATCH(DMI_BIOS_VERSION, "CHUWI.D86JLBNR"), 637 }, 638 }, 639 { 640 /* Chuwi Vi10 (CWI505) */ 641 .driver_data = (void *)&chuwi_vi10_data, 642 .matches = { 643 DMI_MATCH(DMI_BOARD_VENDOR, "Hampoo"), 644 DMI_MATCH(DMI_BOARD_NAME, "BYT-PF02"), 645 DMI_MATCH(DMI_SYS_VENDOR, "ilife"), 646 DMI_MATCH(DMI_PRODUCT_NAME, "S165"), 647 }, 648 }, 649 { 650 /* Connect Tablet 9 */ 651 .driver_data = (void *)&connect_tablet9_data, 652 .matches = { 653 DMI_MATCH(DMI_SYS_VENDOR, "Connect"), 654 DMI_MATCH(DMI_PRODUCT_NAME, "Tablet 9"), 655 }, 656 }, 657 { 658 /* CUBE iwork8 Air */ 659 .driver_data = (void *)&cube_iwork8_air_data, 660 .matches = { 661 DMI_MATCH(DMI_SYS_VENDOR, "cube"), 662 DMI_MATCH(DMI_PRODUCT_NAME, "i1-TF"), 663 DMI_MATCH(DMI_BOARD_NAME, "Cherry Trail CR"), 664 }, 665 }, 666 { 667 /* Cube KNote i1101 */ 668 .driver_data = (void *)&cube_knote_i1101_data, 669 .matches = { 670 DMI_MATCH(DMI_BOARD_VENDOR, "Hampoo"), 671 DMI_MATCH(DMI_BOARD_NAME, "L1W6_I1101"), 672 DMI_MATCH(DMI_SYS_VENDOR, "ALLDOCUBE"), 673 DMI_MATCH(DMI_PRODUCT_NAME, "i1101"), 674 }, 675 }, 676 { 677 /* DEXP Ursus 7W */ 678 .driver_data = (void *)&dexp_ursus_7w_data, 679 .matches = { 680 DMI_MATCH(DMI_SYS_VENDOR, "Insyde"), 681 DMI_MATCH(DMI_PRODUCT_NAME, "7W"), 682 }, 683 }, 684 { 685 /* Digma Citi E200 */ 686 .driver_data = (void *)&digma_citi_e200_data, 687 .matches = { 688 DMI_MATCH(DMI_SYS_VENDOR, "Digma"), 689 DMI_MATCH(DMI_PRODUCT_NAME, "CITI E200"), 690 DMI_MATCH(DMI_BOARD_NAME, "Cherry Trail CR"), 691 }, 692 }, 693 { 694 /* GP-electronic T701 */ 695 .driver_data = (void *)&gp_electronic_t701_data, 696 .matches = { 697 DMI_MATCH(DMI_SYS_VENDOR, "Insyde"), 698 DMI_MATCH(DMI_PRODUCT_NAME, "T701"), 699 DMI_MATCH(DMI_BIOS_VERSION, "BYT70A.YNCHENG.WIN.007"), 700 }, 701 }, 702 { 703 /* I.T.Works TW701 (same hardware as the Trekstor ST70416-6) */ 704 .driver_data = (void *)&trekstor_surftab_wintron70_data, 705 .matches = { 706 DMI_MATCH(DMI_SYS_VENDOR, "Insyde"), 707 DMI_MATCH(DMI_PRODUCT_NAME, "i71c"), 708 DMI_MATCH(DMI_BIOS_VERSION, "itWORKS.G.WI71C.JGBMRB"), 709 }, 710 }, 711 { 712 /* I.T.Works TW891 */ 713 .driver_data = (void *)&itworks_tw891_data, 714 .matches = { 715 DMI_MATCH(DMI_SYS_VENDOR, "To be filled by O.E.M."), 716 DMI_MATCH(DMI_PRODUCT_NAME, "TW891"), 717 }, 718 }, 719 { 720 /* Jumper EZpad 6 Pro */ 721 .driver_data = (void *)&jumper_ezpad_6_pro_data, 722 .matches = { 723 DMI_MATCH(DMI_SYS_VENDOR, "Jumper"), 724 DMI_MATCH(DMI_PRODUCT_NAME, "EZpad"), 725 DMI_MATCH(DMI_BIOS_VERSION, "5.12"), 726 /* Above matches are too generic, add bios-date match */ 727 DMI_MATCH(DMI_BIOS_DATE, "08/18/2017"), 728 }, 729 }, 730 { 731 /* Jumper EZpad 6 Pro B */ 732 .driver_data = (void *)&jumper_ezpad_6_pro_b_data, 733 .matches = { 734 DMI_MATCH(DMI_SYS_VENDOR, "Jumper"), 735 DMI_MATCH(DMI_PRODUCT_NAME, "EZpad"), 736 DMI_MATCH(DMI_BIOS_VERSION, "5.12"), 737 /* Above matches are too generic, add bios-date match */ 738 DMI_MATCH(DMI_BIOS_DATE, "04/24/2018"), 739 }, 740 }, 741 { 742 /* Jumper EZpad mini3 */ 743 .driver_data = (void *)&jumper_ezpad_mini3_data, 744 .matches = { 745 DMI_MATCH(DMI_SYS_VENDOR, "Insyde"), 746 /* jumperx.T87.KFBNEEA02 with the version-nr dropped */ 747 DMI_MATCH(DMI_BIOS_VERSION, "jumperx.T87.KFBNEEA"), 748 }, 749 }, 750 { 751 /* Mediacom Flexbook Edge 11 (same hw as TS Primebook C11) */ 752 .driver_data = (void *)&trekstor_primebook_c11_data, 753 .matches = { 754 DMI_MATCH(DMI_SYS_VENDOR, "MEDIACOM"), 755 DMI_MATCH(DMI_PRODUCT_NAME, "FlexBook edge11 - M-FBE11"), 756 }, 757 }, 758 { 759 /* Myria MY8307 */ 760 .driver_data = (void *)&myria_my8307_data, 761 .matches = { 762 DMI_MATCH(DMI_SYS_VENDOR, "Complet Electro Serv"), 763 DMI_MATCH(DMI_PRODUCT_NAME, "MY8307"), 764 }, 765 }, 766 { 767 /* Onda oBook 20 Plus */ 768 .driver_data = (void *)&onda_obook_20_plus_data, 769 .matches = { 770 DMI_MATCH(DMI_SYS_VENDOR, "ONDA"), 771 DMI_MATCH(DMI_PRODUCT_NAME, "OBOOK 20 PLUS"), 772 }, 773 }, 774 { 775 /* ONDA V80 plus v3 (P80PSBG9V3A01501) */ 776 .driver_data = (void *)&onda_v80_plus_v3_data, 777 .matches = { 778 DMI_EXACT_MATCH(DMI_SYS_VENDOR, "ONDA"), 779 DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "V80 PLUS") 780 }, 781 }, 782 { 783 /* ONDA V820w DualOS */ 784 .driver_data = (void *)&onda_v820w_32g_data, 785 .matches = { 786 DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "ONDA"), 787 DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "V820w DualOS") 788 }, 789 }, 790 { 791 /* ONDA V891w revision P891WBEBV1B00 aka v1 */ 792 .driver_data = (void *)&onda_v891w_v1_data, 793 .matches = { 794 DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "ONDA"), 795 DMI_EXACT_MATCH(DMI_BOARD_NAME, "ONDA Tablet"), 796 DMI_EXACT_MATCH(DMI_BOARD_VERSION, "V001"), 797 /* Exact match, different versions need different fw */ 798 DMI_EXACT_MATCH(DMI_BIOS_VERSION, "ONDA.W89EBBN08"), 799 }, 800 }, 801 { 802 /* ONDA V891w Dual OS P891DCF2V1A01274 64GB */ 803 .driver_data = (void *)&onda_v891w_v3_data, 804 .matches = { 805 DMI_MATCH(DMI_SYS_VENDOR, "Insyde"), 806 DMI_MATCH(DMI_PRODUCT_NAME, "ONDA Tablet"), 807 DMI_MATCH(DMI_BIOS_VERSION, "ONDA.D890HBBNR0A"), 808 }, 809 }, 810 { 811 /* Pipo W2S */ 812 .driver_data = (void *)&pipo_w2s_data, 813 .matches = { 814 DMI_MATCH(DMI_SYS_VENDOR, "PIPO"), 815 DMI_MATCH(DMI_PRODUCT_NAME, "W2S"), 816 }, 817 }, 818 { 819 /* Ployer Momo7w (same hardware as the Trekstor ST70416-6) */ 820 .driver_data = (void *)&trekstor_surftab_wintron70_data, 821 .matches = { 822 DMI_MATCH(DMI_SYS_VENDOR, "Shenzhen PLOYER"), 823 DMI_MATCH(DMI_PRODUCT_NAME, "MOMO7W"), 824 /* Exact match, different versions need different fw */ 825 DMI_MATCH(DMI_BIOS_VERSION, "MOMO.G.WI71C.MABMRBA02"), 826 }, 827 }, 828 { 829 /* Point of View mobii wintab p800w (v2.0) */ 830 .driver_data = (void *)&pov_mobii_wintab_p800w_v20_data, 831 .matches = { 832 DMI_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"), 833 DMI_MATCH(DMI_BOARD_NAME, "Aptio CRB"), 834 DMI_MATCH(DMI_BIOS_VERSION, "3BAIR1014"), 835 /* Above matches are too generic, add bios-date match */ 836 DMI_MATCH(DMI_BIOS_DATE, "10/24/2014"), 837 }, 838 }, 839 { 840 /* Point of View mobii wintab p800w (v2.1) */ 841 .driver_data = (void *)&pov_mobii_wintab_p800w_v21_data, 842 .matches = { 843 DMI_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"), 844 DMI_MATCH(DMI_BOARD_NAME, "Aptio CRB"), 845 DMI_MATCH(DMI_BIOS_VERSION, "3BAIR1013"), 846 /* Above matches are too generic, add bios-date match */ 847 DMI_MATCH(DMI_BIOS_DATE, "08/22/2014"), 848 }, 849 }, 850 { 851 /* Point of View mobii wintab p1006w (v1.0) */ 852 .driver_data = (void *)&pov_mobii_wintab_p1006w_v10_data, 853 .matches = { 854 DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Insyde"), 855 DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "BayTrail"), 856 /* Note 105b is Foxcon's USB/PCI vendor id */ 857 DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "105B"), 858 DMI_EXACT_MATCH(DMI_BOARD_NAME, "0E57"), 859 }, 860 }, 861 { 862 /* Teclast X3 Plus */ 863 .driver_data = (void *)&teclast_x3_plus_data, 864 .matches = { 865 DMI_MATCH(DMI_SYS_VENDOR, "TECLAST"), 866 DMI_MATCH(DMI_PRODUCT_NAME, "X3 Plus"), 867 DMI_MATCH(DMI_BOARD_NAME, "X3 Plus"), 868 }, 869 }, 870 { 871 /* Teclast X98 Plus II */ 872 .driver_data = (void *)&teclast_x98plus2_data, 873 .matches = { 874 DMI_MATCH(DMI_SYS_VENDOR, "TECLAST"), 875 DMI_MATCH(DMI_PRODUCT_NAME, "X98 Plus II"), 876 }, 877 }, 878 { 879 /* Trekstor Primebook C11 */ 880 .driver_data = (void *)&trekstor_primebook_c11_data, 881 .matches = { 882 DMI_MATCH(DMI_SYS_VENDOR, "TREKSTOR"), 883 DMI_MATCH(DMI_PRODUCT_NAME, "Primebook C11"), 884 }, 885 }, 886 { 887 /* Trekstor Primebook C13 */ 888 .driver_data = (void *)&trekstor_primebook_c13_data, 889 .matches = { 890 DMI_MATCH(DMI_SYS_VENDOR, "TREKSTOR"), 891 DMI_MATCH(DMI_PRODUCT_NAME, "Primebook C13"), 892 }, 893 }, 894 { 895 /* Trekstor Primetab T13B */ 896 .driver_data = (void *)&trekstor_primetab_t13b_data, 897 .matches = { 898 DMI_MATCH(DMI_SYS_VENDOR, "TREKSTOR"), 899 DMI_MATCH(DMI_PRODUCT_NAME, "Primetab T13B"), 900 }, 901 }, 902 { 903 /* TrekStor SurfTab twin 10.1 ST10432-8 */ 904 .driver_data = (void *)&trekstor_surftab_twin_10_1_data, 905 .matches = { 906 DMI_MATCH(DMI_SYS_VENDOR, "TrekStor"), 907 DMI_MATCH(DMI_PRODUCT_NAME, "SurfTab twin 10.1"), 908 }, 909 }, 910 { 911 /* Trekstor Surftab Wintron 7.0 ST70416-6 */ 912 .driver_data = (void *)&trekstor_surftab_wintron70_data, 913 .matches = { 914 DMI_MATCH(DMI_SYS_VENDOR, "Insyde"), 915 DMI_MATCH(DMI_PRODUCT_NAME, "ST70416-6"), 916 /* Exact match, different versions need different fw */ 917 DMI_MATCH(DMI_BIOS_VERSION, "TREK.G.WI71C.JGBMRBA04"), 918 }, 919 }, 920 { 921 /* Trekstor Surftab Wintron 7.0 ST70416-6, newer BIOS */ 922 .driver_data = (void *)&trekstor_surftab_wintron70_data, 923 .matches = { 924 DMI_MATCH(DMI_SYS_VENDOR, "TrekStor"), 925 DMI_MATCH(DMI_PRODUCT_NAME, 926 "SurfTab wintron 7.0 ST70416-6"), 927 /* Exact match, different versions need different fw */ 928 DMI_MATCH(DMI_BIOS_VERSION, "TREK.G.WI71C.JGBMRBA05"), 929 }, 930 }, 931 { 932 /* Yours Y8W81, same case and touchscreen as Chuwi Vi8 */ 933 .driver_data = (void *)&chuwi_vi8_data, 934 .matches = { 935 DMI_MATCH(DMI_SYS_VENDOR, "YOURS"), 936 DMI_MATCH(DMI_PRODUCT_NAME, "Y8W81"), 937 }, 938 }, 939 { }, 940 }; 941 942 static const struct ts_dmi_data *ts_data; 943 944 static void ts_dmi_add_props(struct i2c_client *client) 945 { 946 struct device *dev = &client->dev; 947 int error; 948 949 if (has_acpi_companion(dev) && 950 !strncmp(ts_data->acpi_name, client->name, I2C_NAME_SIZE)) { 951 error = device_add_properties(dev, ts_data->properties); 952 if (error) 953 dev_err(dev, "failed to add properties: %d\n", error); 954 } 955 } 956 957 static int ts_dmi_notifier_call(struct notifier_block *nb, 958 unsigned long action, void *data) 959 { 960 struct device *dev = data; 961 struct i2c_client *client; 962 963 switch (action) { 964 case BUS_NOTIFY_ADD_DEVICE: 965 client = i2c_verify_client(dev); 966 if (client) 967 ts_dmi_add_props(client); 968 break; 969 970 default: 971 break; 972 } 973 974 return 0; 975 } 976 977 static struct notifier_block ts_dmi_notifier = { 978 .notifier_call = ts_dmi_notifier_call, 979 }; 980 981 static int __init ts_dmi_init(void) 982 { 983 const struct dmi_system_id *dmi_id; 984 int error; 985 986 dmi_id = dmi_first_match(touchscreen_dmi_table); 987 if (!dmi_id) 988 return 0; /* Not an error */ 989 990 ts_data = dmi_id->driver_data; 991 992 error = bus_register_notifier(&i2c_bus_type, &ts_dmi_notifier); 993 if (error) 994 pr_err("%s: failed to register i2c bus notifier: %d\n", 995 __func__, error); 996 997 return error; 998 } 999 1000 /* 1001 * We are registering out notifier after i2c core is initialized and i2c bus 1002 * itself is ready (which happens at postcore initcall level), but before 1003 * ACPI starts enumerating devices (at subsys initcall level). 1004 */ 1005 arch_initcall(ts_dmi_init); 1006