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