touchscreen_dmi.c 61 KB

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