xref: /linux/drivers/platform/x86/x86-android-tablets/asus.c (revision 6093a688a07da07808f0122f9aa2a3eed250d853)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Board info for Asus X86 tablets which ship with Android as the factory image
4  * and which have broken DSDT tables. 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 <hansg@kernel.org>
9  */
10 
11 #include <linux/gpio/machine.h>
12 #include <linux/gpio/property.h>
13 #include <linux/input-event-codes.h>
14 #include <linux/platform_device.h>
15 
16 #include "shared-psy-info.h"
17 #include "x86-android-tablets.h"
18 
19 /* Asus ME176C and TF103C tablets shared data */
20 static const struct property_entry asus_me176c_tf103c_int3496_props[] __initconst = {
21 	PROPERTY_ENTRY_GPIO("id-gpios", &baytrail_gpiochip_nodes[2], 22, GPIO_ACTIVE_HIGH),
22 	{ }
23 };
24 
25 static const struct platform_device_info asus_me176c_tf103c_pdevs[] __initconst = {
26 	{
27 		/* For micro USB ID pin handling */
28 		.name = "intel-int3496",
29 		.id = PLATFORM_DEVID_NONE,
30 		.properties = asus_me176c_tf103c_int3496_props,
31 	},
32 };
33 
34 static const struct software_node asus_me176c_tf103c_gpio_keys_node = {
35 	.name = "lid_sw",
36 };
37 
38 static const struct property_entry asus_me176c_tf103c_lid_props[] = {
39 	PROPERTY_ENTRY_U32("linux,input-type", EV_SW),
40 	PROPERTY_ENTRY_U32("linux,code", SW_LID),
41 	PROPERTY_ENTRY_STRING("label", "lid_sw"),
42 	PROPERTY_ENTRY_GPIO("gpios", &baytrail_gpiochip_nodes[2], 12, GPIO_ACTIVE_LOW),
43 	PROPERTY_ENTRY_U32("debounce-interval", 50),
44 	PROPERTY_ENTRY_BOOL("wakeup-source"),
45 	{ }
46 };
47 
48 static const struct software_node asus_me176c_tf103c_lid_node = {
49 	.parent = &asus_me176c_tf103c_gpio_keys_node,
50 	.properties = asus_me176c_tf103c_lid_props,
51 };
52 
53 static const struct software_node *asus_me176c_tf103c_lid_swnodes[] = {
54 	&asus_me176c_tf103c_gpio_keys_node,
55 	&asus_me176c_tf103c_lid_node,
56 	NULL
57 };
58 
59 /* Asus ME176C tablets have an Android factory image with everything hardcoded */
60 static const char * const asus_me176c_accel_mount_matrix[] = {
61 	"-1", "0", "0",
62 	"0", "1", "0",
63 	"0", "0", "1"
64 };
65 
66 static const struct property_entry asus_me176c_accel_props[] = {
67 	PROPERTY_ENTRY_STRING_ARRAY("mount-matrix", asus_me176c_accel_mount_matrix),
68 	{ }
69 };
70 
71 static const struct software_node asus_me176c_accel_node = {
72 	.properties = asus_me176c_accel_props,
73 };
74 
75 static const struct property_entry asus_me176c_bq24190_props[] = {
76 	PROPERTY_ENTRY_STRING_ARRAY_LEN("supplied-from", tusb1211_chg_det_psy, 1),
77 	PROPERTY_ENTRY_REF("monitored-battery", &generic_lipo_hv_4v35_battery_node),
78 	PROPERTY_ENTRY_U32("ti,system-minimum-microvolt", 3600000),
79 	PROPERTY_ENTRY_BOOL("omit-battery-class"),
80 	PROPERTY_ENTRY_BOOL("disable-reset"),
81 	{ }
82 };
83 
84 static const struct software_node asus_me176c_bq24190_node = {
85 	.properties = asus_me176c_bq24190_props,
86 };
87 
88 static const struct property_entry asus_me176c_ug3105_props[] = {
89 	PROPERTY_ENTRY_STRING_ARRAY_LEN("supplied-from", bq24190_psy, 1),
90 	PROPERTY_ENTRY_REF("monitored-battery", &generic_lipo_hv_4v35_battery_node),
91 	PROPERTY_ENTRY_U32("upisemi,rsns-microohm", 10000),
92 	{ }
93 };
94 
95 static const struct software_node asus_me176c_ug3105_node = {
96 	.properties = asus_me176c_ug3105_props,
97 };
98 
99 static const struct property_entry asus_me176c_touchscreen_props[] = {
100 	PROPERTY_ENTRY_GPIO("reset-gpios", &baytrail_gpiochip_nodes[0], 60, GPIO_ACTIVE_HIGH),
101 	PROPERTY_ENTRY_GPIO("irq-gpios", &baytrail_gpiochip_nodes[2], 28, GPIO_ACTIVE_HIGH),
102 	{ }
103 };
104 
105 static const struct software_node asus_me176c_touchscreen_node = {
106 	.properties = asus_me176c_touchscreen_props,
107 };
108 
109 static const struct x86_i2c_client_info asus_me176c_i2c_clients[] __initconst = {
110 	{
111 		/* bq24297 battery charger */
112 		.board_info = {
113 			.type = "bq24190",
114 			.addr = 0x6b,
115 			.dev_name = "bq24297",
116 			.swnode = &asus_me176c_bq24190_node,
117 			.platform_data = &bq24190_pdata,
118 		},
119 		.adapter_path = "\\_SB_.I2C1",
120 		.irq_data = {
121 			.type = X86_ACPI_IRQ_TYPE_PMIC,
122 			.chip = "\\_SB_.I2C7.PMIC",
123 			.domain = DOMAIN_BUS_WAKEUP,
124 			.index = 0,
125 		},
126 	}, {
127 		/* ug3105 battery monitor */
128 		.board_info = {
129 			.type = "ug3105",
130 			.addr = 0x70,
131 			.dev_name = "ug3105",
132 			.swnode = &asus_me176c_ug3105_node,
133 		},
134 		.adapter_path = "\\_SB_.I2C1",
135 	}, {
136 		/* ak09911 compass */
137 		.board_info = {
138 			.type = "ak09911",
139 			.addr = 0x0c,
140 			.dev_name = "ak09911",
141 		},
142 		.adapter_path = "\\_SB_.I2C5",
143 	}, {
144 		/* kxtj21009 accelerometer */
145 		.board_info = {
146 			.type = "kxtj21009",
147 			.addr = 0x0f,
148 			.dev_name = "kxtj21009",
149 			.swnode = &asus_me176c_accel_node,
150 		},
151 		.adapter_path = "\\_SB_.I2C5",
152 		.irq_data = {
153 			.type = X86_ACPI_IRQ_TYPE_APIC,
154 			.index = 0x44,
155 			.trigger = ACPI_EDGE_SENSITIVE,
156 			.polarity = ACPI_ACTIVE_LOW,
157 		},
158 	}, {
159 		/* goodix touchscreen */
160 		.board_info = {
161 			.type = "GDIX1001:00",
162 			.addr = 0x14,
163 			.dev_name = "goodix_ts",
164 			.swnode = &asus_me176c_touchscreen_node,
165 		},
166 		.adapter_path = "\\_SB_.I2C6",
167 		.irq_data = {
168 			.type = X86_ACPI_IRQ_TYPE_APIC,
169 			.index = 0x45,
170 			.trigger = ACPI_EDGE_SENSITIVE,
171 			.polarity = ACPI_ACTIVE_LOW,
172 		},
173 	},
174 };
175 
176 static const struct x86_serdev_info asus_me176c_serdevs[] __initconst = {
177 	{
178 		.ctrl.acpi.hid = "80860F0A",
179 		.ctrl.acpi.uid = "2",
180 		.ctrl_devname = "serial0",
181 		.serdev_hid = "BCM2E3A",
182 	},
183 };
184 
185 const struct x86_dev_info asus_me176c_info __initconst = {
186 	.i2c_client_info = asus_me176c_i2c_clients,
187 	.i2c_client_count = ARRAY_SIZE(asus_me176c_i2c_clients),
188 	.pdev_info = asus_me176c_tf103c_pdevs,
189 	.pdev_count = ARRAY_SIZE(asus_me176c_tf103c_pdevs),
190 	.serdev_info = asus_me176c_serdevs,
191 	.serdev_count = ARRAY_SIZE(asus_me176c_serdevs),
192 	.gpio_button_swnodes = asus_me176c_tf103c_lid_swnodes,
193 	.swnode_group = generic_lipo_hv_4v35_battery_swnodes,
194 	.modules = bq24190_modules,
195 	.gpiochip_type = X86_GPIOCHIP_BAYTRAIL,
196 };
197 
198 /* Asus TF103C tablets have an Android factory image with everything hardcoded */
199 static const char * const asus_tf103c_accel_mount_matrix[] = {
200 	"0", "-1", "0",
201 	"-1", "0", "0",
202 	"0", "0", "1"
203 };
204 
205 static const struct property_entry asus_tf103c_accel_props[] = {
206 	PROPERTY_ENTRY_STRING_ARRAY("mount-matrix", asus_tf103c_accel_mount_matrix),
207 	{ }
208 };
209 
210 static const struct software_node asus_tf103c_accel_node = {
211 	.properties = asus_tf103c_accel_props,
212 };
213 
214 static const struct property_entry asus_tf103c_touchscreen_props[] = {
215 	PROPERTY_ENTRY_STRING("compatible", "atmel,atmel_mxt_ts"),
216 	{ }
217 };
218 
219 static const struct software_node asus_tf103c_touchscreen_node = {
220 	.properties = asus_tf103c_touchscreen_props,
221 };
222 
223 static const struct property_entry asus_tf103c_bq24190_props[] = {
224 	PROPERTY_ENTRY_STRING_ARRAY_LEN("supplied-from", tusb1211_chg_det_psy, 1),
225 	PROPERTY_ENTRY_REF("monitored-battery", &generic_lipo_4v2_battery_node),
226 	PROPERTY_ENTRY_U32("ti,system-minimum-microvolt", 3600000),
227 	PROPERTY_ENTRY_BOOL("omit-battery-class"),
228 	PROPERTY_ENTRY_BOOL("disable-reset"),
229 	{ }
230 };
231 
232 static const struct software_node asus_tf103c_bq24190_node = {
233 	.properties = asus_tf103c_bq24190_props,
234 };
235 
236 static const struct property_entry asus_tf103c_ug3105_props[] = {
237 	PROPERTY_ENTRY_STRING_ARRAY_LEN("supplied-from", bq24190_psy, 1),
238 	PROPERTY_ENTRY_REF("monitored-battery", &generic_lipo_4v2_battery_node),
239 	PROPERTY_ENTRY_U32("upisemi,rsns-microohm", 5000),
240 	{ }
241 };
242 
243 static const struct software_node asus_tf103c_ug3105_node = {
244 	.properties = asus_tf103c_ug3105_props,
245 };
246 
247 static const struct x86_i2c_client_info asus_tf103c_i2c_clients[] __initconst = {
248 	{
249 		/* bq24297 battery charger */
250 		.board_info = {
251 			.type = "bq24190",
252 			.addr = 0x6b,
253 			.dev_name = "bq24297",
254 			.swnode = &asus_tf103c_bq24190_node,
255 			.platform_data = &bq24190_pdata,
256 		},
257 		.adapter_path = "\\_SB_.I2C1",
258 		.irq_data = {
259 			.type = X86_ACPI_IRQ_TYPE_PMIC,
260 			.chip = "\\_SB_.I2C7.PMIC",
261 			.domain = DOMAIN_BUS_WAKEUP,
262 			.index = 0,
263 		},
264 	}, {
265 		/* ug3105 battery monitor */
266 		.board_info = {
267 			.type = "ug3105",
268 			.addr = 0x70,
269 			.dev_name = "ug3105",
270 			.swnode = &asus_tf103c_ug3105_node,
271 		},
272 		.adapter_path = "\\_SB_.I2C1",
273 	}, {
274 		/* ak09911 compass */
275 		.board_info = {
276 			.type = "ak09911",
277 			.addr = 0x0c,
278 			.dev_name = "ak09911",
279 		},
280 		.adapter_path = "\\_SB_.I2C5",
281 	}, {
282 		/* kxtj21009 accelerometer */
283 		.board_info = {
284 			.type = "kxtj21009",
285 			.addr = 0x0f,
286 			.dev_name = "kxtj21009",
287 			.swnode = &asus_tf103c_accel_node,
288 		},
289 		.adapter_path = "\\_SB_.I2C5",
290 	}, {
291 		/* atmel touchscreen */
292 		.board_info = {
293 			.type = "atmel_mxt_ts",
294 			.addr = 0x4a,
295 			.dev_name = "atmel_mxt_ts",
296 			.swnode = &asus_tf103c_touchscreen_node,
297 		},
298 		.adapter_path = "\\_SB_.I2C6",
299 		.irq_data = {
300 			.type = X86_ACPI_IRQ_TYPE_GPIOINT,
301 			.chip = "INT33FC:02",
302 			.index = 28,
303 			.trigger = ACPI_EDGE_SENSITIVE,
304 			.polarity = ACPI_ACTIVE_LOW,
305 			.con_id = "atmel_mxt_ts_irq",
306 		},
307 	},
308 };
309 
310 const struct x86_dev_info asus_tf103c_info __initconst = {
311 	.i2c_client_info = asus_tf103c_i2c_clients,
312 	.i2c_client_count = ARRAY_SIZE(asus_tf103c_i2c_clients),
313 	.pdev_info = asus_me176c_tf103c_pdevs,
314 	.pdev_count = ARRAY_SIZE(asus_me176c_tf103c_pdevs),
315 	.gpio_button_swnodes = asus_me176c_tf103c_lid_swnodes,
316 	.swnode_group = generic_lipo_4v2_battery_swnodes,
317 	.modules = bq24190_modules,
318 	.gpiochip_type = X86_GPIOCHIP_BAYTRAIL,
319 };
320