diff options
| author | Dmitry Torokhov <[email protected]> | 2023-08-30 16:06:38 -0700 | 
|---|---|---|
| committer | Dmitry Torokhov <[email protected]> | 2023-08-30 16:06:38 -0700 | 
| commit | 1ac731c529cd4d6adbce134754b51ff7d822b145 (patch) | |
| tree | 143ab3f35ca5f3b69f583c84e6964b17139c2ec1 /drivers/platform/x86/x86-android-tablets/asus.c | |
| parent | 07b4c950f27bef0362dc6ad7ee713aab61d58149 (diff) | |
| parent | 54116d442e001e1b6bd482122043b1870998a1f3 (diff) | |
Merge branch 'next' into for-linus
Prepare input updates for 6.6 merge window.
Diffstat (limited to 'drivers/platform/x86/x86-android-tablets/asus.c')
| -rw-r--r-- | drivers/platform/x86/x86-android-tablets/asus.c | 325 | 
1 files changed, 325 insertions, 0 deletions
diff --git a/drivers/platform/x86/x86-android-tablets/asus.c b/drivers/platform/x86/x86-android-tablets/asus.c new file mode 100644 index 000000000000..cfa038b44b43 --- /dev/null +++ b/drivers/platform/x86/x86-android-tablets/asus.c @@ -0,0 +1,325 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Board info for Asus X86 tablets which ship with Android as the factory image + * and which have broken DSDT tables. The factory kernels shipped on these + * devices typically have a bunch of things hardcoded, rather than specified + * in their DSDT. + * + * Copyright (C) 2021-2023 Hans de Goede <[email protected]> + */ + +#include <linux/gpio/machine.h> +#include <linux/input.h> +#include <linux/platform_device.h> + +#include "shared-psy-info.h" +#include "x86-android-tablets.h" + +/* Asus ME176C and TF103C tablets shared data */ +static struct gpiod_lookup_table int3496_gpo2_pin22_gpios = { +	.dev_id = "intel-int3496", +	.table = { +		GPIO_LOOKUP("INT33FC:02", 22, "id", GPIO_ACTIVE_HIGH), +		{ } +	}, +}; + +static struct x86_gpio_button asus_me176c_tf103c_lid = { +	.button = { +		.code = SW_LID, +		.active_low = true, +		.desc = "lid_sw", +		.type = EV_SW, +		.wakeup = true, +		.debounce_interval = 50, +	}, +	.chip = "INT33FC:02", +	.pin = 12, +}; + +/* Asus ME176C tablets have an Android factory img with everything hardcoded */ +static const char * const asus_me176c_accel_mount_matrix[] = { +	"-1", "0", "0", +	"0", "1", "0", +	"0", "0", "1" +}; + +static const struct property_entry asus_me176c_accel_props[] = { +	PROPERTY_ENTRY_STRING_ARRAY("mount-matrix", asus_me176c_accel_mount_matrix), +	{ } +}; + +static const struct software_node asus_me176c_accel_node = { +	.properties = asus_me176c_accel_props, +}; + +static const struct property_entry asus_me176c_bq24190_props[] = { +	PROPERTY_ENTRY_STRING_ARRAY_LEN("supplied-from", tusb1211_chg_det_psy, 1), +	PROPERTY_ENTRY_REF("monitored-battery", &generic_lipo_hv_4v35_battery_node), +	PROPERTY_ENTRY_U32("ti,system-minimum-microvolt", 3600000), +	PROPERTY_ENTRY_BOOL("omit-battery-class"), +	PROPERTY_ENTRY_BOOL("disable-reset"), +	{ } +}; + +static const struct software_node asus_me176c_bq24190_node = { +	.properties = asus_me176c_bq24190_props, +}; + +static const struct property_entry asus_me176c_ug3105_props[] = { +	PROPERTY_ENTRY_STRING_ARRAY_LEN("supplied-from", bq24190_psy, 1), +	PROPERTY_ENTRY_REF("monitored-battery", &generic_lipo_hv_4v35_battery_node), +	PROPERTY_ENTRY_U32("upisemi,rsns-microohm", 10000), +	{ } +}; + +static const struct software_node asus_me176c_ug3105_node = { +	.properties = asus_me176c_ug3105_props, +}; + +static const struct x86_i2c_client_info asus_me176c_i2c_clients[] __initconst = { +	{ +		/* bq24297 battery charger */ +		.board_info = { +			.type = "bq24190", +			.addr = 0x6b, +			.dev_name = "bq24297", +			.swnode = &asus_me176c_bq24190_node, +			.platform_data = &bq24190_pdata, +		}, +		.adapter_path = "\\_SB_.I2C1", +		.irq_data = { +			.type = X86_ACPI_IRQ_TYPE_PMIC, +			.chip = "\\_SB_.I2C7.PMIC", +			.domain = DOMAIN_BUS_WAKEUP, +			.index = 0, +		}, +	}, { +		/* ug3105 battery monitor */ +		.board_info = { +			.type = "ug3105", +			.addr = 0x70, +			.dev_name = "ug3105", +			.swnode = &asus_me176c_ug3105_node, +		}, +		.adapter_path = "\\_SB_.I2C1", +	}, { +		/* ak09911 compass */ +		.board_info = { +			.type = "ak09911", +			.addr = 0x0c, +			.dev_name = "ak09911", +		}, +		.adapter_path = "\\_SB_.I2C5", +	}, { +		/* kxtj21009 accel */ +		.board_info = { +			.type = "kxtj21009", +			.addr = 0x0f, +			.dev_name = "kxtj21009", +			.swnode = &asus_me176c_accel_node, +		}, +		.adapter_path = "\\_SB_.I2C5", +		.irq_data = { +			.type = X86_ACPI_IRQ_TYPE_APIC, +			.index = 0x44, +			.trigger = ACPI_EDGE_SENSITIVE, +			.polarity = ACPI_ACTIVE_LOW, +		}, +	}, { +		/* goodix touchscreen */ +		.board_info = { +			.type = "GDIX1001:00", +			.addr = 0x14, +			.dev_name = "goodix_ts", +		}, +		.adapter_path = "\\_SB_.I2C6", +		.irq_data = { +			.type = X86_ACPI_IRQ_TYPE_APIC, +			.index = 0x45, +			.trigger = ACPI_EDGE_SENSITIVE, +			.polarity = ACPI_ACTIVE_LOW, +		}, +	}, +}; + +static const struct x86_serdev_info asus_me176c_serdevs[] __initconst = { +	{ +		.ctrl_hid = "80860F0A", +		.ctrl_uid = "2", +		.ctrl_devname = "serial0", +		.serdev_hid = "BCM2E3A", +	}, +}; + +static struct gpiod_lookup_table asus_me176c_goodix_gpios = { +	.dev_id = "i2c-goodix_ts", +	.table = { +		GPIO_LOOKUP("INT33FC:00", 60, "reset", GPIO_ACTIVE_HIGH), +		GPIO_LOOKUP("INT33FC:02", 28, "irq", GPIO_ACTIVE_HIGH), +		{ } +	}, +}; + +static struct gpiod_lookup_table * const asus_me176c_gpios[] = { +	&int3496_gpo2_pin22_gpios, +	&asus_me176c_goodix_gpios, +	NULL +}; + +const struct x86_dev_info asus_me176c_info __initconst = { +	.i2c_client_info = asus_me176c_i2c_clients, +	.i2c_client_count = ARRAY_SIZE(asus_me176c_i2c_clients), +	.pdev_info = int3496_pdevs, +	.pdev_count = 1, +	.serdev_info = asus_me176c_serdevs, +	.serdev_count = ARRAY_SIZE(asus_me176c_serdevs), +	.gpio_button = &asus_me176c_tf103c_lid, +	.gpiod_lookup_tables = asus_me176c_gpios, +	.bat_swnode = &generic_lipo_hv_4v35_battery_node, +	.modules = bq24190_modules, +	.invalid_aei_gpiochip = "INT33FC:02", +}; + +/* Asus TF103C tablets have an Android factory img with everything hardcoded */ +static const char * const asus_tf103c_accel_mount_matrix[] = { +	"0", "-1", "0", +	"-1", "0", "0", +	"0", "0", "1" +}; + +static const struct property_entry asus_tf103c_accel_props[] = { +	PROPERTY_ENTRY_STRING_ARRAY("mount-matrix", asus_tf103c_accel_mount_matrix), +	{ } +}; + +static const struct software_node asus_tf103c_accel_node = { +	.properties = asus_tf103c_accel_props, +}; + +static const struct property_entry asus_tf103c_touchscreen_props[] = { +	PROPERTY_ENTRY_STRING("compatible", "atmel,atmel_mxt_ts"), +	{ } +}; + +static const struct software_node asus_tf103c_touchscreen_node = { +	.properties = asus_tf103c_touchscreen_props, +}; + +static const struct property_entry asus_tf103c_battery_props[] = { +	PROPERTY_ENTRY_STRING("compatible", "simple-battery"), +	PROPERTY_ENTRY_STRING("device-chemistry", "lithium-ion-polymer"), +	PROPERTY_ENTRY_U32("precharge-current-microamp", 256000), +	PROPERTY_ENTRY_U32("charge-term-current-microamp", 128000), +	PROPERTY_ENTRY_U32("constant-charge-current-max-microamp", 2048000), +	PROPERTY_ENTRY_U32("constant-charge-voltage-max-microvolt", 4208000), +	PROPERTY_ENTRY_U32("factory-internal-resistance-micro-ohms", 150000), +	{ } +}; + +static const struct software_node asus_tf103c_battery_node = { +	.properties = asus_tf103c_battery_props, +}; + +static const struct property_entry asus_tf103c_bq24190_props[] = { +	PROPERTY_ENTRY_STRING_ARRAY_LEN("supplied-from", tusb1211_chg_det_psy, 1), +	PROPERTY_ENTRY_REF("monitored-battery", &asus_tf103c_battery_node), +	PROPERTY_ENTRY_U32("ti,system-minimum-microvolt", 3600000), +	PROPERTY_ENTRY_BOOL("omit-battery-class"), +	PROPERTY_ENTRY_BOOL("disable-reset"), +	{ } +}; + +static const struct software_node asus_tf103c_bq24190_node = { +	.properties = asus_tf103c_bq24190_props, +}; + +static const struct property_entry asus_tf103c_ug3105_props[] = { +	PROPERTY_ENTRY_STRING_ARRAY_LEN("supplied-from", bq24190_psy, 1), +	PROPERTY_ENTRY_REF("monitored-battery", &asus_tf103c_battery_node), +	PROPERTY_ENTRY_U32("upisemi,rsns-microohm", 5000), +	{ } +}; + +static const struct software_node asus_tf103c_ug3105_node = { +	.properties = asus_tf103c_ug3105_props, +}; + +static const struct x86_i2c_client_info asus_tf103c_i2c_clients[] __initconst = { +	{ +		/* bq24297 battery charger */ +		.board_info = { +			.type = "bq24190", +			.addr = 0x6b, +			.dev_name = "bq24297", +			.swnode = &asus_tf103c_bq24190_node, +			.platform_data = &bq24190_pdata, +		}, +		.adapter_path = "\\_SB_.I2C1", +		.irq_data = { +			.type = X86_ACPI_IRQ_TYPE_PMIC, +			.chip = "\\_SB_.I2C7.PMIC", +			.domain = DOMAIN_BUS_WAKEUP, +			.index = 0, +		}, +	}, { +		/* ug3105 battery monitor */ +		.board_info = { +			.type = "ug3105", +			.addr = 0x70, +			.dev_name = "ug3105", +			.swnode = &asus_tf103c_ug3105_node, +		}, +		.adapter_path = "\\_SB_.I2C1", +	}, { +		/* ak09911 compass */ +		.board_info = { +			.type = "ak09911", +			.addr = 0x0c, +			.dev_name = "ak09911", +		}, +		.adapter_path = "\\_SB_.I2C5", +	}, { +		/* kxtj21009 accel */ +		.board_info = { +			.type = "kxtj21009", +			.addr = 0x0f, +			.dev_name = "kxtj21009", +			.swnode = &asus_tf103c_accel_node, +		}, +		.adapter_path = "\\_SB_.I2C5", +	}, { +		/* atmel touchscreen */ +		.board_info = { +			.type = "atmel_mxt_ts", +			.addr = 0x4a, +			.dev_name = "atmel_mxt_ts", +			.swnode = &asus_tf103c_touchscreen_node, +		}, +		.adapter_path = "\\_SB_.I2C6", +		.irq_data = { +			.type = X86_ACPI_IRQ_TYPE_GPIOINT, +			.chip = "INT33FC:02", +			.index = 28, +			.trigger = ACPI_EDGE_SENSITIVE, +			.polarity = ACPI_ACTIVE_LOW, +		}, +	}, +}; + +static struct gpiod_lookup_table * const asus_tf103c_gpios[] = { +	&int3496_gpo2_pin22_gpios, +	NULL +}; + +const struct x86_dev_info asus_tf103c_info __initconst = { +	.i2c_client_info = asus_tf103c_i2c_clients, +	.i2c_client_count = ARRAY_SIZE(asus_tf103c_i2c_clients), +	.pdev_info = int3496_pdevs, +	.pdev_count = 1, +	.gpio_button = &asus_me176c_tf103c_lid, +	.gpiod_lookup_tables = asus_tf103c_gpios, +	.bat_swnode = &asus_tf103c_battery_node, +	.modules = bq24190_modules, +	.invalid_aei_gpiochip = "INT33FC:02", +};  |