1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * DMI based code to deal with broken DSDTs on X86 tablets which ship with
4 * Android as (part of) the factory image. The factory kernels shipped on these
5 * devices typically have a bunch of things hardcoded, rather than specified
6 * in their DSDT.
7 *
8 * Copyright (C) 2021-2023 Hans de Goede <hdegoede@redhat.com>
9 */
10
11#include <linux/dmi.h>
12#include <linux/init.h>
13#include <linux/mod_devicetable.h>
14#include <linux/module.h>
15
16#include "x86-android-tablets.h"
17
18const struct dmi_system_id x86_android_tablet_ids[] __initconst = {
19	{
20		/* Acer Iconia One 7 B1-750 */
21		.matches = {
22			DMI_MATCH(DMI_SYS_VENDOR, "Insyde"),
23			DMI_MATCH(DMI_PRODUCT_NAME, "VESPA2"),
24		},
25		.driver_data = (void *)&acer_b1_750_info,
26	},
27	{
28		/* Advantech MICA-071 */
29		.matches = {
30			DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Advantech"),
31			DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "MICA-071"),
32		},
33		.driver_data = (void *)&advantech_mica_071_info,
34	},
35	{
36		/* Asus MeMO Pad 7 ME176C */
37		.matches = {
38			DMI_EXACT_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
39			DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "ME176C"),
40		},
41		.driver_data = (void *)&asus_me176c_info,
42	},
43	{
44		/* Asus TF103C */
45		.matches = {
46			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
47			DMI_MATCH(DMI_PRODUCT_NAME, "TF103C"),
48		},
49		.driver_data = (void *)&asus_tf103c_info,
50	},
51	{
52		/* Chuwi Hi8 (CWI509) */
53		.matches = {
54			DMI_MATCH(DMI_BOARD_VENDOR, "Hampoo"),
55			DMI_MATCH(DMI_BOARD_NAME, "BYT-PA03C"),
56			DMI_MATCH(DMI_SYS_VENDOR, "ilife"),
57			DMI_MATCH(DMI_PRODUCT_NAME, "S806"),
58		},
59		.driver_data = (void *)&chuwi_hi8_info,
60	},
61	{
62		/* Cyberbook T116 Android version */
63		.matches = {
64			DMI_MATCH(DMI_BOARD_VENDOR, "Default string"),
65			DMI_MATCH(DMI_BOARD_NAME, "Cherry Trail CR"),
66			/* Above strings are much too generic, also match on SKU + BIOS date */
67			DMI_MATCH(DMI_PRODUCT_SKU, "20170531"),
68			DMI_MATCH(DMI_BIOS_DATE, "07/12/2017"),
69		},
70		.driver_data = (void *)&cyberbook_t116_info,
71	},
72	{
73		/* CZC P10T */
74		.ident = "CZC ODEON TPC-10 (\"P10T\")",
75		.matches = {
76			DMI_MATCH(DMI_SYS_VENDOR, "CZC"),
77			DMI_MATCH(DMI_PRODUCT_NAME, "ODEON*TPC-10"),
78		},
79		.driver_data = (void *)&czc_p10t,
80	},
81	{
82		/* CZC P10T variant */
83		.ident = "ViewSonic ViewPad 10",
84		.matches = {
85			DMI_MATCH(DMI_SYS_VENDOR, "ViewSonic"),
86			DMI_MATCH(DMI_PRODUCT_NAME, "VPAD10"),
87		},
88		.driver_data = (void *)&czc_p10t,
89	},
90	{
91		/* Lenovo Yoga Book X90F / X90L */
92		.matches = {
93			DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Intel Corporation"),
94			DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "CHERRYVIEW D1 PLATFORM"),
95			DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "YETI-11"),
96		},
97		.driver_data = (void *)&lenovo_yogabook_x90_info,
98	},
99	{
100		/* Lenovo Yoga Book X91F / X91L */
101		.matches = {
102			/* Non exact match to match F + L versions */
103			DMI_MATCH(DMI_PRODUCT_NAME, "Lenovo YB1-X91"),
104		},
105		.driver_data = (void *)&lenovo_yogabook_x91_info,
106	},
107	{
108		/*
109		 * Lenovo Yoga Tablet 2 Pro 1380F/L (13") This has more or less
110		 * the same BIOS as the 830F/L or 1050F/L (8" and 10") below,
111		 * but unlike the 8" / 10" models which share the same mainboard
112		 * this model has a different mainboard.
113		 * This match for the 13" model MUST come before the 8" + 10"
114		 * match since that one will also match the 13" model!
115		 */
116		.matches = {
117			DMI_MATCH(DMI_SYS_VENDOR, "Intel Corp."),
118			DMI_MATCH(DMI_PRODUCT_NAME, "VALLEYVIEW C0 PLATFORM"),
119			DMI_MATCH(DMI_BOARD_NAME, "BYT-T FFD8"),
120			/* Full match so as to NOT match the 830/1050 BIOS */
121			DMI_MATCH(DMI_BIOS_VERSION, "BLADE_21.X64.0005.R00.1504101516"),
122		},
123		.driver_data = (void *)&lenovo_yoga_tab2_1380_info,
124	},
125	{
126		/*
127		 * Lenovo Yoga Tablet 2 830F/L or 1050F/L (The 8" and 10"
128		 * Lenovo Yoga Tablet 2 use the same mainboard)
129		 */
130		.matches = {
131			DMI_MATCH(DMI_SYS_VENDOR, "Intel Corp."),
132			DMI_MATCH(DMI_PRODUCT_NAME, "VALLEYVIEW C0 PLATFORM"),
133			DMI_MATCH(DMI_BOARD_NAME, "BYT-T FFD8"),
134			/* Partial match on beginning of BIOS version */
135			DMI_MATCH(DMI_BIOS_VERSION, "BLADE_21"),
136		},
137		.driver_data = (void *)&lenovo_yoga_tab2_830_1050_info,
138	},
139	{
140		/* Lenovo Yoga Tab 3 Pro YT3-X90F */
141		.matches = {
142			DMI_MATCH(DMI_SYS_VENDOR, "Intel Corporation"),
143			DMI_MATCH(DMI_PRODUCT_NAME, "CHERRYVIEW D1 PLATFORM"),
144			DMI_MATCH(DMI_PRODUCT_VERSION, "Blade3-10A-001"),
145		},
146		.driver_data = (void *)&lenovo_yt3_info,
147	},
148	{
149		/* Medion Lifetab S10346 */
150		.matches = {
151			DMI_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"),
152			DMI_MATCH(DMI_BOARD_NAME, "Aptio CRB"),
153			/* Above strings are much too generic, also match on BIOS date */
154			DMI_MATCH(DMI_BIOS_DATE, "10/22/2015"),
155		},
156		.driver_data = (void *)&medion_lifetab_s10346_info,
157	},
158	{
159		/* Nextbook Ares 8 (BYT version) */
160		.matches = {
161			DMI_MATCH(DMI_SYS_VENDOR, "Insyde"),
162			DMI_MATCH(DMI_PRODUCT_NAME, "M890BAP"),
163		},
164		.driver_data = (void *)&nextbook_ares8_info,
165	},
166	{
167		/* Nextbook Ares 8A (CHT version)*/
168		.matches = {
169			DMI_MATCH(DMI_SYS_VENDOR, "Insyde"),
170			DMI_MATCH(DMI_PRODUCT_NAME, "CherryTrail"),
171			DMI_MATCH(DMI_BIOS_VERSION, "M882"),
172		},
173		.driver_data = (void *)&nextbook_ares8a_info,
174	},
175	{
176		/* Peaq C1010 */
177		.matches = {
178			DMI_MATCH(DMI_SYS_VENDOR, "PEAQ"),
179			DMI_MATCH(DMI_PRODUCT_NAME, "PEAQ PMM C1010 MD99187"),
180		},
181		.driver_data = (void *)&peaq_c1010_info,
182	},
183	{
184		/* Whitelabel (sold as various brands) TM800A550L */
185		.matches = {
186			DMI_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"),
187			DMI_MATCH(DMI_BOARD_NAME, "Aptio CRB"),
188			/* Above strings are too generic, also match on BIOS version */
189			DMI_MATCH(DMI_BIOS_VERSION, "ZY-8-BI-PX4S70VTR400-X423B-005-D"),
190		},
191		.driver_data = (void *)&whitelabel_tm800a550l_info,
192	},
193	{
194		/* Xiaomi Mi Pad 2 */
195		.matches = {
196			DMI_MATCH(DMI_SYS_VENDOR, "Xiaomi Inc"),
197			DMI_MATCH(DMI_PRODUCT_NAME, "Mipad2"),
198		},
199		.driver_data = (void *)&xiaomi_mipad2_info,
200	},
201	{ }
202};
203MODULE_DEVICE_TABLE(dmi, x86_android_tablet_ids);
204