root/drivers/platform/x86/touchscreen_dmi.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. ts_dmi_add_props
  2. ts_dmi_notifier_call
  3. ts_dmi_init

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

/* [<][>][^][v][top][bottom][index][help] */