162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Board info for Asus X86 tablets which ship with Android as the factory image
462306a36Sopenharmony_ci * and which have broken DSDT tables. The factory kernels shipped on these
562306a36Sopenharmony_ci * devices typically have a bunch of things hardcoded, rather than specified
662306a36Sopenharmony_ci * in their DSDT.
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci * Copyright (C) 2021-2023 Hans de Goede <hdegoede@redhat.com>
962306a36Sopenharmony_ci */
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <linux/gpio/machine.h>
1262306a36Sopenharmony_ci#include <linux/input.h>
1362306a36Sopenharmony_ci#include <linux/platform_device.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#include "shared-psy-info.h"
1662306a36Sopenharmony_ci#include "x86-android-tablets.h"
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci/* Asus ME176C and TF103C tablets shared data */
1962306a36Sopenharmony_cistatic struct gpiod_lookup_table int3496_gpo2_pin22_gpios = {
2062306a36Sopenharmony_ci	.dev_id = "intel-int3496",
2162306a36Sopenharmony_ci	.table = {
2262306a36Sopenharmony_ci		GPIO_LOOKUP("INT33FC:02", 22, "id", GPIO_ACTIVE_HIGH),
2362306a36Sopenharmony_ci		{ }
2462306a36Sopenharmony_ci	},
2562306a36Sopenharmony_ci};
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_cistatic const struct x86_gpio_button asus_me176c_tf103c_lid __initconst = {
2862306a36Sopenharmony_ci	.button = {
2962306a36Sopenharmony_ci		.code = SW_LID,
3062306a36Sopenharmony_ci		.active_low = true,
3162306a36Sopenharmony_ci		.desc = "lid_sw",
3262306a36Sopenharmony_ci		.type = EV_SW,
3362306a36Sopenharmony_ci		.wakeup = true,
3462306a36Sopenharmony_ci		.debounce_interval = 50,
3562306a36Sopenharmony_ci	},
3662306a36Sopenharmony_ci	.chip = "INT33FC:02",
3762306a36Sopenharmony_ci	.pin = 12,
3862306a36Sopenharmony_ci};
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci/* Asus ME176C tablets have an Android factory img with everything hardcoded */
4162306a36Sopenharmony_cistatic const char * const asus_me176c_accel_mount_matrix[] = {
4262306a36Sopenharmony_ci	"-1", "0", "0",
4362306a36Sopenharmony_ci	"0", "1", "0",
4462306a36Sopenharmony_ci	"0", "0", "1"
4562306a36Sopenharmony_ci};
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_cistatic const struct property_entry asus_me176c_accel_props[] = {
4862306a36Sopenharmony_ci	PROPERTY_ENTRY_STRING_ARRAY("mount-matrix", asus_me176c_accel_mount_matrix),
4962306a36Sopenharmony_ci	{ }
5062306a36Sopenharmony_ci};
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_cistatic const struct software_node asus_me176c_accel_node = {
5362306a36Sopenharmony_ci	.properties = asus_me176c_accel_props,
5462306a36Sopenharmony_ci};
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_cistatic const struct property_entry asus_me176c_bq24190_props[] = {
5762306a36Sopenharmony_ci	PROPERTY_ENTRY_STRING_ARRAY_LEN("supplied-from", tusb1211_chg_det_psy, 1),
5862306a36Sopenharmony_ci	PROPERTY_ENTRY_REF("monitored-battery", &generic_lipo_hv_4v35_battery_node),
5962306a36Sopenharmony_ci	PROPERTY_ENTRY_U32("ti,system-minimum-microvolt", 3600000),
6062306a36Sopenharmony_ci	PROPERTY_ENTRY_BOOL("omit-battery-class"),
6162306a36Sopenharmony_ci	PROPERTY_ENTRY_BOOL("disable-reset"),
6262306a36Sopenharmony_ci	{ }
6362306a36Sopenharmony_ci};
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_cistatic const struct software_node asus_me176c_bq24190_node = {
6662306a36Sopenharmony_ci	.properties = asus_me176c_bq24190_props,
6762306a36Sopenharmony_ci};
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_cistatic const struct property_entry asus_me176c_ug3105_props[] = {
7062306a36Sopenharmony_ci	PROPERTY_ENTRY_STRING_ARRAY_LEN("supplied-from", bq24190_psy, 1),
7162306a36Sopenharmony_ci	PROPERTY_ENTRY_REF("monitored-battery", &generic_lipo_hv_4v35_battery_node),
7262306a36Sopenharmony_ci	PROPERTY_ENTRY_U32("upisemi,rsns-microohm", 10000),
7362306a36Sopenharmony_ci	{ }
7462306a36Sopenharmony_ci};
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_cistatic const struct software_node asus_me176c_ug3105_node = {
7762306a36Sopenharmony_ci	.properties = asus_me176c_ug3105_props,
7862306a36Sopenharmony_ci};
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_cistatic const struct x86_i2c_client_info asus_me176c_i2c_clients[] __initconst = {
8162306a36Sopenharmony_ci	{
8262306a36Sopenharmony_ci		/* bq24297 battery charger */
8362306a36Sopenharmony_ci		.board_info = {
8462306a36Sopenharmony_ci			.type = "bq24190",
8562306a36Sopenharmony_ci			.addr = 0x6b,
8662306a36Sopenharmony_ci			.dev_name = "bq24297",
8762306a36Sopenharmony_ci			.swnode = &asus_me176c_bq24190_node,
8862306a36Sopenharmony_ci			.platform_data = &bq24190_pdata,
8962306a36Sopenharmony_ci		},
9062306a36Sopenharmony_ci		.adapter_path = "\\_SB_.I2C1",
9162306a36Sopenharmony_ci		.irq_data = {
9262306a36Sopenharmony_ci			.type = X86_ACPI_IRQ_TYPE_PMIC,
9362306a36Sopenharmony_ci			.chip = "\\_SB_.I2C7.PMIC",
9462306a36Sopenharmony_ci			.domain = DOMAIN_BUS_WAKEUP,
9562306a36Sopenharmony_ci			.index = 0,
9662306a36Sopenharmony_ci		},
9762306a36Sopenharmony_ci	}, {
9862306a36Sopenharmony_ci		/* ug3105 battery monitor */
9962306a36Sopenharmony_ci		.board_info = {
10062306a36Sopenharmony_ci			.type = "ug3105",
10162306a36Sopenharmony_ci			.addr = 0x70,
10262306a36Sopenharmony_ci			.dev_name = "ug3105",
10362306a36Sopenharmony_ci			.swnode = &asus_me176c_ug3105_node,
10462306a36Sopenharmony_ci		},
10562306a36Sopenharmony_ci		.adapter_path = "\\_SB_.I2C1",
10662306a36Sopenharmony_ci	}, {
10762306a36Sopenharmony_ci		/* ak09911 compass */
10862306a36Sopenharmony_ci		.board_info = {
10962306a36Sopenharmony_ci			.type = "ak09911",
11062306a36Sopenharmony_ci			.addr = 0x0c,
11162306a36Sopenharmony_ci			.dev_name = "ak09911",
11262306a36Sopenharmony_ci		},
11362306a36Sopenharmony_ci		.adapter_path = "\\_SB_.I2C5",
11462306a36Sopenharmony_ci	}, {
11562306a36Sopenharmony_ci		/* kxtj21009 accel */
11662306a36Sopenharmony_ci		.board_info = {
11762306a36Sopenharmony_ci			.type = "kxtj21009",
11862306a36Sopenharmony_ci			.addr = 0x0f,
11962306a36Sopenharmony_ci			.dev_name = "kxtj21009",
12062306a36Sopenharmony_ci			.swnode = &asus_me176c_accel_node,
12162306a36Sopenharmony_ci		},
12262306a36Sopenharmony_ci		.adapter_path = "\\_SB_.I2C5",
12362306a36Sopenharmony_ci		.irq_data = {
12462306a36Sopenharmony_ci			.type = X86_ACPI_IRQ_TYPE_APIC,
12562306a36Sopenharmony_ci			.index = 0x44,
12662306a36Sopenharmony_ci			.trigger = ACPI_EDGE_SENSITIVE,
12762306a36Sopenharmony_ci			.polarity = ACPI_ACTIVE_LOW,
12862306a36Sopenharmony_ci		},
12962306a36Sopenharmony_ci	}, {
13062306a36Sopenharmony_ci		/* goodix touchscreen */
13162306a36Sopenharmony_ci		.board_info = {
13262306a36Sopenharmony_ci			.type = "GDIX1001:00",
13362306a36Sopenharmony_ci			.addr = 0x14,
13462306a36Sopenharmony_ci			.dev_name = "goodix_ts",
13562306a36Sopenharmony_ci		},
13662306a36Sopenharmony_ci		.adapter_path = "\\_SB_.I2C6",
13762306a36Sopenharmony_ci		.irq_data = {
13862306a36Sopenharmony_ci			.type = X86_ACPI_IRQ_TYPE_APIC,
13962306a36Sopenharmony_ci			.index = 0x45,
14062306a36Sopenharmony_ci			.trigger = ACPI_EDGE_SENSITIVE,
14162306a36Sopenharmony_ci			.polarity = ACPI_ACTIVE_LOW,
14262306a36Sopenharmony_ci		},
14362306a36Sopenharmony_ci	},
14462306a36Sopenharmony_ci};
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_cistatic const struct x86_serdev_info asus_me176c_serdevs[] __initconst = {
14762306a36Sopenharmony_ci	{
14862306a36Sopenharmony_ci		.ctrl_hid = "80860F0A",
14962306a36Sopenharmony_ci		.ctrl_uid = "2",
15062306a36Sopenharmony_ci		.ctrl_devname = "serial0",
15162306a36Sopenharmony_ci		.serdev_hid = "BCM2E3A",
15262306a36Sopenharmony_ci	},
15362306a36Sopenharmony_ci};
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_cistatic struct gpiod_lookup_table asus_me176c_goodix_gpios = {
15662306a36Sopenharmony_ci	.dev_id = "i2c-goodix_ts",
15762306a36Sopenharmony_ci	.table = {
15862306a36Sopenharmony_ci		GPIO_LOOKUP("INT33FC:00", 60, "reset", GPIO_ACTIVE_HIGH),
15962306a36Sopenharmony_ci		GPIO_LOOKUP("INT33FC:02", 28, "irq", GPIO_ACTIVE_HIGH),
16062306a36Sopenharmony_ci		{ }
16162306a36Sopenharmony_ci	},
16262306a36Sopenharmony_ci};
16362306a36Sopenharmony_ci
16462306a36Sopenharmony_cistatic struct gpiod_lookup_table * const asus_me176c_gpios[] = {
16562306a36Sopenharmony_ci	&int3496_gpo2_pin22_gpios,
16662306a36Sopenharmony_ci	&asus_me176c_goodix_gpios,
16762306a36Sopenharmony_ci	NULL
16862306a36Sopenharmony_ci};
16962306a36Sopenharmony_ci
17062306a36Sopenharmony_ciconst struct x86_dev_info asus_me176c_info __initconst = {
17162306a36Sopenharmony_ci	.i2c_client_info = asus_me176c_i2c_clients,
17262306a36Sopenharmony_ci	.i2c_client_count = ARRAY_SIZE(asus_me176c_i2c_clients),
17362306a36Sopenharmony_ci	.pdev_info = int3496_pdevs,
17462306a36Sopenharmony_ci	.pdev_count = 1,
17562306a36Sopenharmony_ci	.serdev_info = asus_me176c_serdevs,
17662306a36Sopenharmony_ci	.serdev_count = ARRAY_SIZE(asus_me176c_serdevs),
17762306a36Sopenharmony_ci	.gpio_button = &asus_me176c_tf103c_lid,
17862306a36Sopenharmony_ci	.gpio_button_count = 1,
17962306a36Sopenharmony_ci	.gpiod_lookup_tables = asus_me176c_gpios,
18062306a36Sopenharmony_ci	.bat_swnode = &generic_lipo_hv_4v35_battery_node,
18162306a36Sopenharmony_ci	.modules = bq24190_modules,
18262306a36Sopenharmony_ci};
18362306a36Sopenharmony_ci
18462306a36Sopenharmony_ci/* Asus TF103C tablets have an Android factory img with everything hardcoded */
18562306a36Sopenharmony_cistatic const char * const asus_tf103c_accel_mount_matrix[] = {
18662306a36Sopenharmony_ci	"0", "-1", "0",
18762306a36Sopenharmony_ci	"-1", "0", "0",
18862306a36Sopenharmony_ci	"0", "0", "1"
18962306a36Sopenharmony_ci};
19062306a36Sopenharmony_ci
19162306a36Sopenharmony_cistatic const struct property_entry asus_tf103c_accel_props[] = {
19262306a36Sopenharmony_ci	PROPERTY_ENTRY_STRING_ARRAY("mount-matrix", asus_tf103c_accel_mount_matrix),
19362306a36Sopenharmony_ci	{ }
19462306a36Sopenharmony_ci};
19562306a36Sopenharmony_ci
19662306a36Sopenharmony_cistatic const struct software_node asus_tf103c_accel_node = {
19762306a36Sopenharmony_ci	.properties = asus_tf103c_accel_props,
19862306a36Sopenharmony_ci};
19962306a36Sopenharmony_ci
20062306a36Sopenharmony_cistatic const struct property_entry asus_tf103c_touchscreen_props[] = {
20162306a36Sopenharmony_ci	PROPERTY_ENTRY_STRING("compatible", "atmel,atmel_mxt_ts"),
20262306a36Sopenharmony_ci	{ }
20362306a36Sopenharmony_ci};
20462306a36Sopenharmony_ci
20562306a36Sopenharmony_cistatic const struct software_node asus_tf103c_touchscreen_node = {
20662306a36Sopenharmony_ci	.properties = asus_tf103c_touchscreen_props,
20762306a36Sopenharmony_ci};
20862306a36Sopenharmony_ci
20962306a36Sopenharmony_cistatic const struct property_entry asus_tf103c_battery_props[] = {
21062306a36Sopenharmony_ci	PROPERTY_ENTRY_STRING("compatible", "simple-battery"),
21162306a36Sopenharmony_ci	PROPERTY_ENTRY_STRING("device-chemistry", "lithium-ion-polymer"),
21262306a36Sopenharmony_ci	PROPERTY_ENTRY_U32("precharge-current-microamp", 256000),
21362306a36Sopenharmony_ci	PROPERTY_ENTRY_U32("charge-term-current-microamp", 128000),
21462306a36Sopenharmony_ci	PROPERTY_ENTRY_U32("constant-charge-current-max-microamp", 2048000),
21562306a36Sopenharmony_ci	PROPERTY_ENTRY_U32("constant-charge-voltage-max-microvolt", 4208000),
21662306a36Sopenharmony_ci	PROPERTY_ENTRY_U32("factory-internal-resistance-micro-ohms", 150000),
21762306a36Sopenharmony_ci	{ }
21862306a36Sopenharmony_ci};
21962306a36Sopenharmony_ci
22062306a36Sopenharmony_cistatic const struct software_node asus_tf103c_battery_node = {
22162306a36Sopenharmony_ci	.properties = asus_tf103c_battery_props,
22262306a36Sopenharmony_ci};
22362306a36Sopenharmony_ci
22462306a36Sopenharmony_cistatic const struct property_entry asus_tf103c_bq24190_props[] = {
22562306a36Sopenharmony_ci	PROPERTY_ENTRY_STRING_ARRAY_LEN("supplied-from", tusb1211_chg_det_psy, 1),
22662306a36Sopenharmony_ci	PROPERTY_ENTRY_REF("monitored-battery", &asus_tf103c_battery_node),
22762306a36Sopenharmony_ci	PROPERTY_ENTRY_U32("ti,system-minimum-microvolt", 3600000),
22862306a36Sopenharmony_ci	PROPERTY_ENTRY_BOOL("omit-battery-class"),
22962306a36Sopenharmony_ci	PROPERTY_ENTRY_BOOL("disable-reset"),
23062306a36Sopenharmony_ci	{ }
23162306a36Sopenharmony_ci};
23262306a36Sopenharmony_ci
23362306a36Sopenharmony_cistatic const struct software_node asus_tf103c_bq24190_node = {
23462306a36Sopenharmony_ci	.properties = asus_tf103c_bq24190_props,
23562306a36Sopenharmony_ci};
23662306a36Sopenharmony_ci
23762306a36Sopenharmony_cistatic const struct property_entry asus_tf103c_ug3105_props[] = {
23862306a36Sopenharmony_ci	PROPERTY_ENTRY_STRING_ARRAY_LEN("supplied-from", bq24190_psy, 1),
23962306a36Sopenharmony_ci	PROPERTY_ENTRY_REF("monitored-battery", &asus_tf103c_battery_node),
24062306a36Sopenharmony_ci	PROPERTY_ENTRY_U32("upisemi,rsns-microohm", 5000),
24162306a36Sopenharmony_ci	{ }
24262306a36Sopenharmony_ci};
24362306a36Sopenharmony_ci
24462306a36Sopenharmony_cistatic const struct software_node asus_tf103c_ug3105_node = {
24562306a36Sopenharmony_ci	.properties = asus_tf103c_ug3105_props,
24662306a36Sopenharmony_ci};
24762306a36Sopenharmony_ci
24862306a36Sopenharmony_cistatic const struct x86_i2c_client_info asus_tf103c_i2c_clients[] __initconst = {
24962306a36Sopenharmony_ci	{
25062306a36Sopenharmony_ci		/* bq24297 battery charger */
25162306a36Sopenharmony_ci		.board_info = {
25262306a36Sopenharmony_ci			.type = "bq24190",
25362306a36Sopenharmony_ci			.addr = 0x6b,
25462306a36Sopenharmony_ci			.dev_name = "bq24297",
25562306a36Sopenharmony_ci			.swnode = &asus_tf103c_bq24190_node,
25662306a36Sopenharmony_ci			.platform_data = &bq24190_pdata,
25762306a36Sopenharmony_ci		},
25862306a36Sopenharmony_ci		.adapter_path = "\\_SB_.I2C1",
25962306a36Sopenharmony_ci		.irq_data = {
26062306a36Sopenharmony_ci			.type = X86_ACPI_IRQ_TYPE_PMIC,
26162306a36Sopenharmony_ci			.chip = "\\_SB_.I2C7.PMIC",
26262306a36Sopenharmony_ci			.domain = DOMAIN_BUS_WAKEUP,
26362306a36Sopenharmony_ci			.index = 0,
26462306a36Sopenharmony_ci		},
26562306a36Sopenharmony_ci	}, {
26662306a36Sopenharmony_ci		/* ug3105 battery monitor */
26762306a36Sopenharmony_ci		.board_info = {
26862306a36Sopenharmony_ci			.type = "ug3105",
26962306a36Sopenharmony_ci			.addr = 0x70,
27062306a36Sopenharmony_ci			.dev_name = "ug3105",
27162306a36Sopenharmony_ci			.swnode = &asus_tf103c_ug3105_node,
27262306a36Sopenharmony_ci		},
27362306a36Sopenharmony_ci		.adapter_path = "\\_SB_.I2C1",
27462306a36Sopenharmony_ci	}, {
27562306a36Sopenharmony_ci		/* ak09911 compass */
27662306a36Sopenharmony_ci		.board_info = {
27762306a36Sopenharmony_ci			.type = "ak09911",
27862306a36Sopenharmony_ci			.addr = 0x0c,
27962306a36Sopenharmony_ci			.dev_name = "ak09911",
28062306a36Sopenharmony_ci		},
28162306a36Sopenharmony_ci		.adapter_path = "\\_SB_.I2C5",
28262306a36Sopenharmony_ci	}, {
28362306a36Sopenharmony_ci		/* kxtj21009 accel */
28462306a36Sopenharmony_ci		.board_info = {
28562306a36Sopenharmony_ci			.type = "kxtj21009",
28662306a36Sopenharmony_ci			.addr = 0x0f,
28762306a36Sopenharmony_ci			.dev_name = "kxtj21009",
28862306a36Sopenharmony_ci			.swnode = &asus_tf103c_accel_node,
28962306a36Sopenharmony_ci		},
29062306a36Sopenharmony_ci		.adapter_path = "\\_SB_.I2C5",
29162306a36Sopenharmony_ci	}, {
29262306a36Sopenharmony_ci		/* atmel touchscreen */
29362306a36Sopenharmony_ci		.board_info = {
29462306a36Sopenharmony_ci			.type = "atmel_mxt_ts",
29562306a36Sopenharmony_ci			.addr = 0x4a,
29662306a36Sopenharmony_ci			.dev_name = "atmel_mxt_ts",
29762306a36Sopenharmony_ci			.swnode = &asus_tf103c_touchscreen_node,
29862306a36Sopenharmony_ci		},
29962306a36Sopenharmony_ci		.adapter_path = "\\_SB_.I2C6",
30062306a36Sopenharmony_ci		.irq_data = {
30162306a36Sopenharmony_ci			.type = X86_ACPI_IRQ_TYPE_GPIOINT,
30262306a36Sopenharmony_ci			.chip = "INT33FC:02",
30362306a36Sopenharmony_ci			.index = 28,
30462306a36Sopenharmony_ci			.trigger = ACPI_EDGE_SENSITIVE,
30562306a36Sopenharmony_ci			.polarity = ACPI_ACTIVE_LOW,
30662306a36Sopenharmony_ci		},
30762306a36Sopenharmony_ci	},
30862306a36Sopenharmony_ci};
30962306a36Sopenharmony_ci
31062306a36Sopenharmony_cistatic struct gpiod_lookup_table * const asus_tf103c_gpios[] = {
31162306a36Sopenharmony_ci	&int3496_gpo2_pin22_gpios,
31262306a36Sopenharmony_ci	NULL
31362306a36Sopenharmony_ci};
31462306a36Sopenharmony_ci
31562306a36Sopenharmony_ciconst struct x86_dev_info asus_tf103c_info __initconst = {
31662306a36Sopenharmony_ci	.i2c_client_info = asus_tf103c_i2c_clients,
31762306a36Sopenharmony_ci	.i2c_client_count = ARRAY_SIZE(asus_tf103c_i2c_clients),
31862306a36Sopenharmony_ci	.pdev_info = int3496_pdevs,
31962306a36Sopenharmony_ci	.pdev_count = 1,
32062306a36Sopenharmony_ci	.gpio_button = &asus_me176c_tf103c_lid,
32162306a36Sopenharmony_ci	.gpio_button_count = 1,
32262306a36Sopenharmony_ci	.gpiod_lookup_tables = asus_tf103c_gpios,
32362306a36Sopenharmony_ci	.bat_swnode = &asus_tf103c_battery_node,
32462306a36Sopenharmony_ci	.modules = bq24190_modules,
32562306a36Sopenharmony_ci};
326