197abac9cSHans de Goede // SPDX-License-Identifier: GPL-2.0-or-later
297abac9cSHans de Goede /*
397abac9cSHans de Goede  * Board info for Asus X86 tablets which ship with Android as the factory image
497abac9cSHans de Goede  * and which have broken DSDT tables. The factory kernels shipped on these
597abac9cSHans de Goede  * devices typically have a bunch of things hardcoded, rather than specified
697abac9cSHans de Goede  * in their DSDT.
797abac9cSHans de Goede  *
897abac9cSHans de Goede  * Copyright (C) 2021-2023 Hans de Goede <hdegoede@redhat.com>
997abac9cSHans de Goede  */
1097abac9cSHans de Goede 
1197abac9cSHans de Goede #include <linux/gpio/machine.h>
1297abac9cSHans de Goede #include <linux/input.h>
1397abac9cSHans de Goede #include <linux/platform_device.h>
1497abac9cSHans de Goede 
1597abac9cSHans de Goede #include "shared-psy-info.h"
1697abac9cSHans de Goede #include "x86-android-tablets.h"
1797abac9cSHans de Goede 
1897abac9cSHans de Goede /* Asus ME176C and TF103C tablets shared data */
1997abac9cSHans de Goede static struct gpiod_lookup_table int3496_gpo2_pin22_gpios = {
2097abac9cSHans de Goede 	.dev_id = "intel-int3496",
2197abac9cSHans de Goede 	.table = {
2297abac9cSHans de Goede 		GPIO_LOOKUP("INT33FC:02", 22, "id", GPIO_ACTIVE_HIGH),
2397abac9cSHans de Goede 		{ }
2497abac9cSHans de Goede 	},
2597abac9cSHans de Goede };
2697abac9cSHans de Goede 
27*6dc6c0c1SHans de Goede static const struct x86_gpio_button asus_me176c_tf103c_lid __initconst = {
28e2200d3fSHans de Goede 	.button = {
2997abac9cSHans de Goede 		.code = SW_LID,
3097abac9cSHans de Goede 		.active_low = true,
3197abac9cSHans de Goede 		.desc = "lid_sw",
3297abac9cSHans de Goede 		.type = EV_SW,
3397abac9cSHans de Goede 		.wakeup = true,
3497abac9cSHans de Goede 		.debounce_interval = 50,
3597abac9cSHans de Goede 	},
36e2200d3fSHans de Goede 	.chip = "INT33FC:02",
37e2200d3fSHans de Goede 	.pin = 12,
3897abac9cSHans de Goede };
3997abac9cSHans de Goede 
4097abac9cSHans de Goede /* Asus ME176C tablets have an Android factory img with everything hardcoded */
4197abac9cSHans de Goede static const char * const asus_me176c_accel_mount_matrix[] = {
4297abac9cSHans de Goede 	"-1", "0", "0",
4397abac9cSHans de Goede 	"0", "1", "0",
4497abac9cSHans de Goede 	"0", "0", "1"
4597abac9cSHans de Goede };
4697abac9cSHans de Goede 
4797abac9cSHans de Goede static const struct property_entry asus_me176c_accel_props[] = {
4897abac9cSHans de Goede 	PROPERTY_ENTRY_STRING_ARRAY("mount-matrix", asus_me176c_accel_mount_matrix),
4997abac9cSHans de Goede 	{ }
5097abac9cSHans de Goede };
5197abac9cSHans de Goede 
5297abac9cSHans de Goede static const struct software_node asus_me176c_accel_node = {
5397abac9cSHans de Goede 	.properties = asus_me176c_accel_props,
5497abac9cSHans de Goede };
5597abac9cSHans de Goede 
5697abac9cSHans de Goede static const struct property_entry asus_me176c_bq24190_props[] = {
5797abac9cSHans de Goede 	PROPERTY_ENTRY_STRING_ARRAY_LEN("supplied-from", tusb1211_chg_det_psy, 1),
5897abac9cSHans de Goede 	PROPERTY_ENTRY_REF("monitored-battery", &generic_lipo_hv_4v35_battery_node),
5997abac9cSHans de Goede 	PROPERTY_ENTRY_U32("ti,system-minimum-microvolt", 3600000),
6097abac9cSHans de Goede 	PROPERTY_ENTRY_BOOL("omit-battery-class"),
6197abac9cSHans de Goede 	PROPERTY_ENTRY_BOOL("disable-reset"),
6297abac9cSHans de Goede 	{ }
6397abac9cSHans de Goede };
6497abac9cSHans de Goede 
6597abac9cSHans de Goede static const struct software_node asus_me176c_bq24190_node = {
6697abac9cSHans de Goede 	.properties = asus_me176c_bq24190_props,
6797abac9cSHans de Goede };
6897abac9cSHans de Goede 
6997abac9cSHans de Goede static const struct property_entry asus_me176c_ug3105_props[] = {
7097abac9cSHans de Goede 	PROPERTY_ENTRY_STRING_ARRAY_LEN("supplied-from", bq24190_psy, 1),
7197abac9cSHans de Goede 	PROPERTY_ENTRY_REF("monitored-battery", &generic_lipo_hv_4v35_battery_node),
7297abac9cSHans de Goede 	PROPERTY_ENTRY_U32("upisemi,rsns-microohm", 10000),
7397abac9cSHans de Goede 	{ }
7497abac9cSHans de Goede };
7597abac9cSHans de Goede 
7697abac9cSHans de Goede static const struct software_node asus_me176c_ug3105_node = {
7797abac9cSHans de Goede 	.properties = asus_me176c_ug3105_props,
7897abac9cSHans de Goede };
7997abac9cSHans de Goede 
8097abac9cSHans de Goede static const struct x86_i2c_client_info asus_me176c_i2c_clients[] __initconst = {
8197abac9cSHans de Goede 	{
8297abac9cSHans de Goede 		/* bq24297 battery charger */
8397abac9cSHans de Goede 		.board_info = {
8497abac9cSHans de Goede 			.type = "bq24190",
8597abac9cSHans de Goede 			.addr = 0x6b,
8697abac9cSHans de Goede 			.dev_name = "bq24297",
8797abac9cSHans de Goede 			.swnode = &asus_me176c_bq24190_node,
8897abac9cSHans de Goede 			.platform_data = &bq24190_pdata,
8997abac9cSHans de Goede 		},
9097abac9cSHans de Goede 		.adapter_path = "\\_SB_.I2C1",
9197abac9cSHans de Goede 		.irq_data = {
9297abac9cSHans de Goede 			.type = X86_ACPI_IRQ_TYPE_PMIC,
9397abac9cSHans de Goede 			.chip = "\\_SB_.I2C7.PMIC",
9497abac9cSHans de Goede 			.domain = DOMAIN_BUS_WAKEUP,
9597abac9cSHans de Goede 			.index = 0,
9697abac9cSHans de Goede 		},
9797abac9cSHans de Goede 	}, {
9897abac9cSHans de Goede 		/* ug3105 battery monitor */
9997abac9cSHans de Goede 		.board_info = {
10097abac9cSHans de Goede 			.type = "ug3105",
10197abac9cSHans de Goede 			.addr = 0x70,
10297abac9cSHans de Goede 			.dev_name = "ug3105",
10397abac9cSHans de Goede 			.swnode = &asus_me176c_ug3105_node,
10497abac9cSHans de Goede 		},
10597abac9cSHans de Goede 		.adapter_path = "\\_SB_.I2C1",
10697abac9cSHans de Goede 	}, {
10797abac9cSHans de Goede 		/* ak09911 compass */
10897abac9cSHans de Goede 		.board_info = {
10997abac9cSHans de Goede 			.type = "ak09911",
11097abac9cSHans de Goede 			.addr = 0x0c,
11197abac9cSHans de Goede 			.dev_name = "ak09911",
11297abac9cSHans de Goede 		},
11397abac9cSHans de Goede 		.adapter_path = "\\_SB_.I2C5",
11497abac9cSHans de Goede 	}, {
11597abac9cSHans de Goede 		/* kxtj21009 accel */
11697abac9cSHans de Goede 		.board_info = {
11797abac9cSHans de Goede 			.type = "kxtj21009",
11897abac9cSHans de Goede 			.addr = 0x0f,
11997abac9cSHans de Goede 			.dev_name = "kxtj21009",
12097abac9cSHans de Goede 			.swnode = &asus_me176c_accel_node,
12197abac9cSHans de Goede 		},
12297abac9cSHans de Goede 		.adapter_path = "\\_SB_.I2C5",
12397abac9cSHans de Goede 		.irq_data = {
12497abac9cSHans de Goede 			.type = X86_ACPI_IRQ_TYPE_APIC,
12597abac9cSHans de Goede 			.index = 0x44,
12697abac9cSHans de Goede 			.trigger = ACPI_EDGE_SENSITIVE,
12797abac9cSHans de Goede 			.polarity = ACPI_ACTIVE_LOW,
12897abac9cSHans de Goede 		},
12997abac9cSHans de Goede 	}, {
13097abac9cSHans de Goede 		/* goodix touchscreen */
13197abac9cSHans de Goede 		.board_info = {
13297abac9cSHans de Goede 			.type = "GDIX1001:00",
13397abac9cSHans de Goede 			.addr = 0x14,
13497abac9cSHans de Goede 			.dev_name = "goodix_ts",
13597abac9cSHans de Goede 		},
13697abac9cSHans de Goede 		.adapter_path = "\\_SB_.I2C6",
13797abac9cSHans de Goede 		.irq_data = {
13897abac9cSHans de Goede 			.type = X86_ACPI_IRQ_TYPE_APIC,
13997abac9cSHans de Goede 			.index = 0x45,
14097abac9cSHans de Goede 			.trigger = ACPI_EDGE_SENSITIVE,
14197abac9cSHans de Goede 			.polarity = ACPI_ACTIVE_LOW,
14297abac9cSHans de Goede 		},
14397abac9cSHans de Goede 	},
14497abac9cSHans de Goede };
14597abac9cSHans de Goede 
14697abac9cSHans de Goede static const struct x86_serdev_info asus_me176c_serdevs[] __initconst = {
14797abac9cSHans de Goede 	{
14897abac9cSHans de Goede 		.ctrl_hid = "80860F0A",
14997abac9cSHans de Goede 		.ctrl_uid = "2",
15097abac9cSHans de Goede 		.ctrl_devname = "serial0",
15197abac9cSHans de Goede 		.serdev_hid = "BCM2E3A",
15297abac9cSHans de Goede 	},
15397abac9cSHans de Goede };
15497abac9cSHans de Goede 
15597abac9cSHans de Goede static struct gpiod_lookup_table asus_me176c_goodix_gpios = {
15697abac9cSHans de Goede 	.dev_id = "i2c-goodix_ts",
15797abac9cSHans de Goede 	.table = {
15897abac9cSHans de Goede 		GPIO_LOOKUP("INT33FC:00", 60, "reset", GPIO_ACTIVE_HIGH),
15997abac9cSHans de Goede 		GPIO_LOOKUP("INT33FC:02", 28, "irq", GPIO_ACTIVE_HIGH),
16097abac9cSHans de Goede 		{ }
16197abac9cSHans de Goede 	},
16297abac9cSHans de Goede };
16397abac9cSHans de Goede 
16497abac9cSHans de Goede static struct gpiod_lookup_table * const asus_me176c_gpios[] = {
16597abac9cSHans de Goede 	&int3496_gpo2_pin22_gpios,
16697abac9cSHans de Goede 	&asus_me176c_goodix_gpios,
16797abac9cSHans de Goede 	NULL
16897abac9cSHans de Goede };
16997abac9cSHans de Goede 
17097abac9cSHans de Goede const struct x86_dev_info asus_me176c_info __initconst = {
17197abac9cSHans de Goede 	.i2c_client_info = asus_me176c_i2c_clients,
17297abac9cSHans de Goede 	.i2c_client_count = ARRAY_SIZE(asus_me176c_i2c_clients),
173e2200d3fSHans de Goede 	.pdev_info = int3496_pdevs,
174e2200d3fSHans de Goede 	.pdev_count = 1,
17597abac9cSHans de Goede 	.serdev_info = asus_me176c_serdevs,
17697abac9cSHans de Goede 	.serdev_count = ARRAY_SIZE(asus_me176c_serdevs),
177e2200d3fSHans de Goede 	.gpio_button = &asus_me176c_tf103c_lid,
178*6dc6c0c1SHans de Goede 	.gpio_button_count = 1,
17997abac9cSHans de Goede 	.gpiod_lookup_tables = asus_me176c_gpios,
18097abac9cSHans de Goede 	.bat_swnode = &generic_lipo_hv_4v35_battery_node,
18197abac9cSHans de Goede 	.modules = bq24190_modules,
18297abac9cSHans de Goede };
18397abac9cSHans de Goede 
18497abac9cSHans de Goede /* Asus TF103C tablets have an Android factory img with everything hardcoded */
18597abac9cSHans de Goede static const char * const asus_tf103c_accel_mount_matrix[] = {
18697abac9cSHans de Goede 	"0", "-1", "0",
18797abac9cSHans de Goede 	"-1", "0", "0",
18897abac9cSHans de Goede 	"0", "0", "1"
18997abac9cSHans de Goede };
19097abac9cSHans de Goede 
19197abac9cSHans de Goede static const struct property_entry asus_tf103c_accel_props[] = {
19297abac9cSHans de Goede 	PROPERTY_ENTRY_STRING_ARRAY("mount-matrix", asus_tf103c_accel_mount_matrix),
19397abac9cSHans de Goede 	{ }
19497abac9cSHans de Goede };
19597abac9cSHans de Goede 
19697abac9cSHans de Goede static const struct software_node asus_tf103c_accel_node = {
19797abac9cSHans de Goede 	.properties = asus_tf103c_accel_props,
19897abac9cSHans de Goede };
19997abac9cSHans de Goede 
20097abac9cSHans de Goede static const struct property_entry asus_tf103c_touchscreen_props[] = {
20197abac9cSHans de Goede 	PROPERTY_ENTRY_STRING("compatible", "atmel,atmel_mxt_ts"),
20297abac9cSHans de Goede 	{ }
20397abac9cSHans de Goede };
20497abac9cSHans de Goede 
20597abac9cSHans de Goede static const struct software_node asus_tf103c_touchscreen_node = {
20697abac9cSHans de Goede 	.properties = asus_tf103c_touchscreen_props,
20797abac9cSHans de Goede };
20897abac9cSHans de Goede 
20997abac9cSHans de Goede static const struct property_entry asus_tf103c_battery_props[] = {
21097abac9cSHans de Goede 	PROPERTY_ENTRY_STRING("compatible", "simple-battery"),
21197abac9cSHans de Goede 	PROPERTY_ENTRY_STRING("device-chemistry", "lithium-ion-polymer"),
21297abac9cSHans de Goede 	PROPERTY_ENTRY_U32("precharge-current-microamp", 256000),
21397abac9cSHans de Goede 	PROPERTY_ENTRY_U32("charge-term-current-microamp", 128000),
21497abac9cSHans de Goede 	PROPERTY_ENTRY_U32("constant-charge-current-max-microamp", 2048000),
21597abac9cSHans de Goede 	PROPERTY_ENTRY_U32("constant-charge-voltage-max-microvolt", 4208000),
21697abac9cSHans de Goede 	PROPERTY_ENTRY_U32("factory-internal-resistance-micro-ohms", 150000),
21797abac9cSHans de Goede 	{ }
21897abac9cSHans de Goede };
21997abac9cSHans de Goede 
22097abac9cSHans de Goede static const struct software_node asus_tf103c_battery_node = {
22197abac9cSHans de Goede 	.properties = asus_tf103c_battery_props,
22297abac9cSHans de Goede };
22397abac9cSHans de Goede 
22497abac9cSHans de Goede static const struct property_entry asus_tf103c_bq24190_props[] = {
22597abac9cSHans de Goede 	PROPERTY_ENTRY_STRING_ARRAY_LEN("supplied-from", tusb1211_chg_det_psy, 1),
22697abac9cSHans de Goede 	PROPERTY_ENTRY_REF("monitored-battery", &asus_tf103c_battery_node),
22797abac9cSHans de Goede 	PROPERTY_ENTRY_U32("ti,system-minimum-microvolt", 3600000),
22897abac9cSHans de Goede 	PROPERTY_ENTRY_BOOL("omit-battery-class"),
22997abac9cSHans de Goede 	PROPERTY_ENTRY_BOOL("disable-reset"),
23097abac9cSHans de Goede 	{ }
23197abac9cSHans de Goede };
23297abac9cSHans de Goede 
23397abac9cSHans de Goede static const struct software_node asus_tf103c_bq24190_node = {
23497abac9cSHans de Goede 	.properties = asus_tf103c_bq24190_props,
23597abac9cSHans de Goede };
23697abac9cSHans de Goede 
23797abac9cSHans de Goede static const struct property_entry asus_tf103c_ug3105_props[] = {
23897abac9cSHans de Goede 	PROPERTY_ENTRY_STRING_ARRAY_LEN("supplied-from", bq24190_psy, 1),
23997abac9cSHans de Goede 	PROPERTY_ENTRY_REF("monitored-battery", &asus_tf103c_battery_node),
24097abac9cSHans de Goede 	PROPERTY_ENTRY_U32("upisemi,rsns-microohm", 5000),
24197abac9cSHans de Goede 	{ }
24297abac9cSHans de Goede };
24397abac9cSHans de Goede 
24497abac9cSHans de Goede static const struct software_node asus_tf103c_ug3105_node = {
24597abac9cSHans de Goede 	.properties = asus_tf103c_ug3105_props,
24697abac9cSHans de Goede };
24797abac9cSHans de Goede 
24897abac9cSHans de Goede static const struct x86_i2c_client_info asus_tf103c_i2c_clients[] __initconst = {
24997abac9cSHans de Goede 	{
25097abac9cSHans de Goede 		/* bq24297 battery charger */
25197abac9cSHans de Goede 		.board_info = {
25297abac9cSHans de Goede 			.type = "bq24190",
25397abac9cSHans de Goede 			.addr = 0x6b,
25497abac9cSHans de Goede 			.dev_name = "bq24297",
25597abac9cSHans de Goede 			.swnode = &asus_tf103c_bq24190_node,
25697abac9cSHans de Goede 			.platform_data = &bq24190_pdata,
25797abac9cSHans de Goede 		},
25897abac9cSHans de Goede 		.adapter_path = "\\_SB_.I2C1",
25997abac9cSHans de Goede 		.irq_data = {
26097abac9cSHans de Goede 			.type = X86_ACPI_IRQ_TYPE_PMIC,
26197abac9cSHans de Goede 			.chip = "\\_SB_.I2C7.PMIC",
26297abac9cSHans de Goede 			.domain = DOMAIN_BUS_WAKEUP,
26397abac9cSHans de Goede 			.index = 0,
26497abac9cSHans de Goede 		},
26597abac9cSHans de Goede 	}, {
26697abac9cSHans de Goede 		/* ug3105 battery monitor */
26797abac9cSHans de Goede 		.board_info = {
26897abac9cSHans de Goede 			.type = "ug3105",
26997abac9cSHans de Goede 			.addr = 0x70,
27097abac9cSHans de Goede 			.dev_name = "ug3105",
27197abac9cSHans de Goede 			.swnode = &asus_tf103c_ug3105_node,
27297abac9cSHans de Goede 		},
27397abac9cSHans de Goede 		.adapter_path = "\\_SB_.I2C1",
27497abac9cSHans de Goede 	}, {
27597abac9cSHans de Goede 		/* ak09911 compass */
27697abac9cSHans de Goede 		.board_info = {
27797abac9cSHans de Goede 			.type = "ak09911",
27897abac9cSHans de Goede 			.addr = 0x0c,
27997abac9cSHans de Goede 			.dev_name = "ak09911",
28097abac9cSHans de Goede 		},
28197abac9cSHans de Goede 		.adapter_path = "\\_SB_.I2C5",
28297abac9cSHans de Goede 	}, {
28397abac9cSHans de Goede 		/* kxtj21009 accel */
28497abac9cSHans de Goede 		.board_info = {
28597abac9cSHans de Goede 			.type = "kxtj21009",
28697abac9cSHans de Goede 			.addr = 0x0f,
28797abac9cSHans de Goede 			.dev_name = "kxtj21009",
28897abac9cSHans de Goede 			.swnode = &asus_tf103c_accel_node,
28997abac9cSHans de Goede 		},
29097abac9cSHans de Goede 		.adapter_path = "\\_SB_.I2C5",
29197abac9cSHans de Goede 	}, {
29297abac9cSHans de Goede 		/* atmel touchscreen */
29397abac9cSHans de Goede 		.board_info = {
29497abac9cSHans de Goede 			.type = "atmel_mxt_ts",
29597abac9cSHans de Goede 			.addr = 0x4a,
29697abac9cSHans de Goede 			.dev_name = "atmel_mxt_ts",
29797abac9cSHans de Goede 			.swnode = &asus_tf103c_touchscreen_node,
29897abac9cSHans de Goede 		},
29997abac9cSHans de Goede 		.adapter_path = "\\_SB_.I2C6",
30097abac9cSHans de Goede 		.irq_data = {
30197abac9cSHans de Goede 			.type = X86_ACPI_IRQ_TYPE_GPIOINT,
30297abac9cSHans de Goede 			.chip = "INT33FC:02",
30397abac9cSHans de Goede 			.index = 28,
30497abac9cSHans de Goede 			.trigger = ACPI_EDGE_SENSITIVE,
30597abac9cSHans de Goede 			.polarity = ACPI_ACTIVE_LOW,
30697abac9cSHans de Goede 		},
30797abac9cSHans de Goede 	},
30897abac9cSHans de Goede };
30997abac9cSHans de Goede 
31097abac9cSHans de Goede static struct gpiod_lookup_table * const asus_tf103c_gpios[] = {
31197abac9cSHans de Goede 	&int3496_gpo2_pin22_gpios,
31297abac9cSHans de Goede 	NULL
31397abac9cSHans de Goede };
31497abac9cSHans de Goede 
31597abac9cSHans de Goede const struct x86_dev_info asus_tf103c_info __initconst = {
31697abac9cSHans de Goede 	.i2c_client_info = asus_tf103c_i2c_clients,
31797abac9cSHans de Goede 	.i2c_client_count = ARRAY_SIZE(asus_tf103c_i2c_clients),
318e2200d3fSHans de Goede 	.pdev_info = int3496_pdevs,
319e2200d3fSHans de Goede 	.pdev_count = 1,
320e2200d3fSHans de Goede 	.gpio_button = &asus_me176c_tf103c_lid,
321*6dc6c0c1SHans de Goede 	.gpio_button_count = 1,
32297abac9cSHans de Goede 	.gpiod_lookup_tables = asus_tf103c_gpios,
32397abac9cSHans de Goede 	.bat_swnode = &asus_tf103c_battery_node,
32497abac9cSHans de Goede 	.modules = bq24190_modules,
32597abac9cSHans de Goede };
326