Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
   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
  19struct 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
  26static 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
  35static const struct ts_dmi_data chuwi_hi8_data = {
  36	.acpi_name      = "MSSL0001:00",
  37	.properties     = chuwi_hi8_props,
  38};
  39
  40static 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
  49static const struct ts_dmi_data chuwi_hi8_air_data = {
  50	.acpi_name	= "MSSL1680:00",
  51	.properties	= chuwi_hi8_air_props,
  52};
  53
  54static 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
  66static const struct ts_dmi_data chuwi_hi8_pro_data = {
  67	.acpi_name	= "MSSL1680:00",
  68	.properties	= chuwi_hi8_pro_props,
  69};
  70
  71static 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
  85static const struct ts_dmi_data chuwi_hi10_air_data = {
  86	.acpi_name	= "MSSL1680:00",
  87	.properties	= chuwi_hi10_air_props,
  88};
  89
  90static 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
 101static const struct ts_dmi_data chuwi_hi10_plus_data = {
 102	.acpi_name      = "MSSL0017:00",
 103	.properties     = chuwi_hi10_plus_props,
 104};
 105
 106static 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
 118static const struct ts_dmi_data chuwi_vi8_data = {
 119	.acpi_name      = "MSSL1680:00",
 120	.properties     = chuwi_vi8_props,
 121};
 122
 123static 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
 134static const struct ts_dmi_data chuwi_vi10_data = {
 135	.acpi_name      = "MSSL0002:00",
 136	.properties     = chuwi_vi10_props,
 137};
 138
 139static 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
 150static const struct ts_dmi_data chuwi_surbook_mini_data = {
 151	.acpi_name      = "MSSL1680:00",
 152	.properties     = chuwi_surbook_mini_props,
 153};
 154
 155static 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
 167static const struct ts_dmi_data connect_tablet9_data = {
 168	.acpi_name      = "MSSL1680:00",
 169	.properties     = connect_tablet9_props,
 170};
 171
 172static 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
 183static const struct ts_dmi_data cube_iwork8_air_data = {
 184	.acpi_name	= "MSSL1680:00",
 185	.properties	= cube_iwork8_air_props,
 186};
 187
 188static 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
 199static const struct ts_dmi_data cube_knote_i1101_data = {
 200	.acpi_name	= "MSSL1680:00",
 201	.properties	= cube_knote_i1101_props,
 202};
 203
 204static 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
 213static const struct ts_dmi_data dexp_ursus_7w_data = {
 214	.acpi_name	= "MSSL1680:00",
 215	.properties	= dexp_ursus_7w_props,
 216};
 217
 218static 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
 229static const struct ts_dmi_data digma_citi_e200_data = {
 230	.acpi_name	= "MSSL1680:00",
 231	.properties	= digma_citi_e200_props,
 232};
 233
 234static 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
 244static const struct ts_dmi_data gp_electronic_t701_data = {
 245	.acpi_name	= "MSSL1680:00",
 246	.properties	= gp_electronic_t701_props,
 247};
 248
 249static 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
 262static const struct ts_dmi_data irbis_tw90_data = {
 263	.acpi_name	= "MSSL1680:00",
 264	.properties	= irbis_tw90_props,
 265};
 266
 267static 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
 279static const struct ts_dmi_data itworks_tw891_data = {
 280	.acpi_name	= "MSSL1680:00",
 281	.properties	= itworks_tw891_props,
 282};
 283
 284static 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
 293static const struct ts_dmi_data jumper_ezpad_6_pro_data = {
 294	.acpi_name	= "MSSL1680:00",
 295	.properties	= jumper_ezpad_6_pro_props,
 296};
 297
 298static 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
 308static 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
 313static 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
 324static const struct ts_dmi_data jumper_ezpad_mini3_data = {
 325	.acpi_name	= "MSSL1680:00",
 326	.properties	= jumper_ezpad_mini3_props,
 327};
 328
 329static 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
 341static const struct ts_dmi_data myria_my8307_data = {
 342	.acpi_name	= "MSSL1680:00",
 343	.properties	= myria_my8307_props,
 344};
 345
 346static 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
 358static const struct ts_dmi_data onda_obook_20_plus_data = {
 359	.acpi_name	= "MSSL1680:00",
 360	.properties	= onda_obook_20_plus_props,
 361};
 362
 363static 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
 376static const struct ts_dmi_data onda_v80_plus_v3_data = {
 377	.acpi_name	= "MSSL1680:00",
 378	.properties	= onda_v80_plus_v3_props,
 379};
 380
 381static 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
 392static const struct ts_dmi_data onda_v820w_32g_data = {
 393	.acpi_name	= "MSSL1680:00",
 394	.properties	= onda_v820w_32g_props,
 395};
 396
 397static 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
 409static const struct ts_dmi_data onda_v891w_v1_data = {
 410	.acpi_name	= "MSSL1680:00",
 411	.properties	= onda_v891w_v1_props,
 412};
 413
 414static 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
 427static const struct ts_dmi_data onda_v891w_v3_data = {
 428	.acpi_name	= "MSSL1680:00",
 429	.properties	= onda_v891w_v3_props,
 430};
 431
 432static 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
 442static const struct ts_dmi_data pipo_w2s_data = {
 443	.acpi_name	= "MSSL1680:00",
 444	.properties	= pipo_w2s_props,
 445};
 446
 447static 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
 460static 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
 465static 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
 478static 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
 483static 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
 496static 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
 501static 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
 510static const struct ts_dmi_data teclast_x3_plus_data = {
 511	.acpi_name	= "MSSL1680:00",
 512	.properties	= teclast_x3_plus_props,
 513};
 514
 515static 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
 526static const struct ts_dmi_data teclast_x98plus2_data = {
 527	.acpi_name	= "MSSL1680:00",
 528	.properties	= teclast_x98plus2_props,
 529};
 530
 531static 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
 542static const struct ts_dmi_data trekstor_primebook_c11_data = {
 543	.acpi_name	= "MSSL1680:00",
 544	.properties	= trekstor_primebook_c11_props,
 545};
 546
 547static 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
 557static const struct ts_dmi_data trekstor_primebook_c13_data = {
 558	.acpi_name	= "MSSL1680:00",
 559	.properties	= trekstor_primebook_c13_props,
 560};
 561
 562static 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
 573static const struct ts_dmi_data trekstor_primetab_t13b_data = {
 574	.acpi_name  = "MSSL1680:00",
 575	.properties = trekstor_primetab_t13b_props,
 576};
 577
 578static 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
 588static 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
 593static 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
 605static 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 */
 611static 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
1000static const struct ts_dmi_data *ts_data;
1001
1002static 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
1015static 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
1035static struct notifier_block ts_dmi_notifier = {
1036	.notifier_call = ts_dmi_notifier_call,
1037};
1038
1039static 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 */
1063arch_initcall(ts_dmi_init);