brintos

brintos / linux-shallow public Read only

0
0
Text · 8.7 KiB · 07fbeab Raw
327 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*3 * Board info for Asus X86 tablets which ship with Android as the factory image4 * and which have broken DSDT tables. The factory kernels shipped on these5 * devices typically have a bunch of things hardcoded, rather than specified6 * in their DSDT.7 *8 * Copyright (C) 2021-2023 Hans de Goede <hdegoede@redhat.com>9 */10 11#include <linux/gpio/machine.h>12#include <linux/input.h>13#include <linux/platform_device.h>14 15#include "shared-psy-info.h"16#include "x86-android-tablets.h"17 18/* Asus ME176C and TF103C tablets shared data */19static struct gpiod_lookup_table int3496_gpo2_pin22_gpios = {20	.dev_id = "intel-int3496",21	.table = {22		GPIO_LOOKUP("INT33FC:02", 22, "id", GPIO_ACTIVE_HIGH),23		{ }24	},25};26 27static const struct x86_gpio_button asus_me176c_tf103c_lid __initconst = {28	.button = {29		.code = SW_LID,30		.active_low = true,31		.desc = "lid_sw",32		.type = EV_SW,33		.wakeup = true,34		.debounce_interval = 50,35	},36	.chip = "INT33FC:02",37	.pin = 12,38};39 40/* Asus ME176C tablets have an Android factory image with everything hardcoded */41static const char * const asus_me176c_accel_mount_matrix[] = {42	"-1", "0", "0",43	"0", "1", "0",44	"0", "0", "1"45};46 47static const struct property_entry asus_me176c_accel_props[] = {48	PROPERTY_ENTRY_STRING_ARRAY("mount-matrix", asus_me176c_accel_mount_matrix),49	{ }50};51 52static const struct software_node asus_me176c_accel_node = {53	.properties = asus_me176c_accel_props,54};55 56static const struct property_entry asus_me176c_bq24190_props[] = {57	PROPERTY_ENTRY_STRING_ARRAY_LEN("supplied-from", tusb1211_chg_det_psy, 1),58	PROPERTY_ENTRY_REF("monitored-battery", &generic_lipo_hv_4v35_battery_node),59	PROPERTY_ENTRY_U32("ti,system-minimum-microvolt", 3600000),60	PROPERTY_ENTRY_BOOL("omit-battery-class"),61	PROPERTY_ENTRY_BOOL("disable-reset"),62	{ }63};64 65static const struct software_node asus_me176c_bq24190_node = {66	.properties = asus_me176c_bq24190_props,67};68 69static const struct property_entry asus_me176c_ug3105_props[] = {70	PROPERTY_ENTRY_STRING_ARRAY_LEN("supplied-from", bq24190_psy, 1),71	PROPERTY_ENTRY_REF("monitored-battery", &generic_lipo_hv_4v35_battery_node),72	PROPERTY_ENTRY_U32("upisemi,rsns-microohm", 10000),73	{ }74};75 76static const struct software_node asus_me176c_ug3105_node = {77	.properties = asus_me176c_ug3105_props,78};79 80static const struct x86_i2c_client_info asus_me176c_i2c_clients[] __initconst = {81	{82		/* bq24297 battery charger */83		.board_info = {84			.type = "bq24190",85			.addr = 0x6b,86			.dev_name = "bq24297",87			.swnode = &asus_me176c_bq24190_node,88			.platform_data = &bq24190_pdata,89		},90		.adapter_path = "\\_SB_.I2C1",91		.irq_data = {92			.type = X86_ACPI_IRQ_TYPE_PMIC,93			.chip = "\\_SB_.I2C7.PMIC",94			.domain = DOMAIN_BUS_WAKEUP,95			.index = 0,96		},97	}, {98		/* ug3105 battery monitor */99		.board_info = {100			.type = "ug3105",101			.addr = 0x70,102			.dev_name = "ug3105",103			.swnode = &asus_me176c_ug3105_node,104		},105		.adapter_path = "\\_SB_.I2C1",106	}, {107		/* ak09911 compass */108		.board_info = {109			.type = "ak09911",110			.addr = 0x0c,111			.dev_name = "ak09911",112		},113		.adapter_path = "\\_SB_.I2C5",114	}, {115		/* kxtj21009 accelerometer */116		.board_info = {117			.type = "kxtj21009",118			.addr = 0x0f,119			.dev_name = "kxtj21009",120			.swnode = &asus_me176c_accel_node,121		},122		.adapter_path = "\\_SB_.I2C5",123		.irq_data = {124			.type = X86_ACPI_IRQ_TYPE_APIC,125			.index = 0x44,126			.trigger = ACPI_EDGE_SENSITIVE,127			.polarity = ACPI_ACTIVE_LOW,128		},129	}, {130		/* goodix touchscreen */131		.board_info = {132			.type = "GDIX1001:00",133			.addr = 0x14,134			.dev_name = "goodix_ts",135		},136		.adapter_path = "\\_SB_.I2C6",137		.irq_data = {138			.type = X86_ACPI_IRQ_TYPE_APIC,139			.index = 0x45,140			.trigger = ACPI_EDGE_SENSITIVE,141			.polarity = ACPI_ACTIVE_LOW,142		},143	},144};145 146static const struct x86_serdev_info asus_me176c_serdevs[] __initconst = {147	{148		.ctrl_hid = "80860F0A",149		.ctrl_uid = "2",150		.ctrl_devname = "serial0",151		.serdev_hid = "BCM2E3A",152	},153};154 155static struct gpiod_lookup_table asus_me176c_goodix_gpios = {156	.dev_id = "i2c-goodix_ts",157	.table = {158		GPIO_LOOKUP("INT33FC:00", 60, "reset", GPIO_ACTIVE_HIGH),159		GPIO_LOOKUP("INT33FC:02", 28, "irq", GPIO_ACTIVE_HIGH),160		{ }161	},162};163 164static struct gpiod_lookup_table * const asus_me176c_gpios[] = {165	&int3496_gpo2_pin22_gpios,166	&asus_me176c_goodix_gpios,167	NULL168};169 170const struct x86_dev_info asus_me176c_info __initconst = {171	.i2c_client_info = asus_me176c_i2c_clients,172	.i2c_client_count = ARRAY_SIZE(asus_me176c_i2c_clients),173	.pdev_info = int3496_pdevs,174	.pdev_count = 1,175	.serdev_info = asus_me176c_serdevs,176	.serdev_count = ARRAY_SIZE(asus_me176c_serdevs),177	.gpio_button = &asus_me176c_tf103c_lid,178	.gpio_button_count = 1,179	.gpiod_lookup_tables = asus_me176c_gpios,180	.bat_swnode = &generic_lipo_hv_4v35_battery_node,181	.modules = bq24190_modules,182};183 184/* Asus TF103C tablets have an Android factory image with everything hardcoded */185static const char * const asus_tf103c_accel_mount_matrix[] = {186	"0", "-1", "0",187	"-1", "0", "0",188	"0", "0", "1"189};190 191static const struct property_entry asus_tf103c_accel_props[] = {192	PROPERTY_ENTRY_STRING_ARRAY("mount-matrix", asus_tf103c_accel_mount_matrix),193	{ }194};195 196static const struct software_node asus_tf103c_accel_node = {197	.properties = asus_tf103c_accel_props,198};199 200static const struct property_entry asus_tf103c_touchscreen_props[] = {201	PROPERTY_ENTRY_STRING("compatible", "atmel,atmel_mxt_ts"),202	{ }203};204 205static const struct software_node asus_tf103c_touchscreen_node = {206	.properties = asus_tf103c_touchscreen_props,207};208 209static const struct property_entry asus_tf103c_battery_props[] = {210	PROPERTY_ENTRY_STRING("compatible", "simple-battery"),211	PROPERTY_ENTRY_STRING("device-chemistry", "lithium-ion-polymer"),212	PROPERTY_ENTRY_U32("precharge-current-microamp", 256000),213	PROPERTY_ENTRY_U32("charge-term-current-microamp", 128000),214	PROPERTY_ENTRY_U32("constant-charge-current-max-microamp", 2048000),215	PROPERTY_ENTRY_U32("constant-charge-voltage-max-microvolt", 4208000),216	PROPERTY_ENTRY_U32("factory-internal-resistance-micro-ohms", 150000),217	{ }218};219 220static const struct software_node asus_tf103c_battery_node = {221	.properties = asus_tf103c_battery_props,222};223 224static const struct property_entry asus_tf103c_bq24190_props[] = {225	PROPERTY_ENTRY_STRING_ARRAY_LEN("supplied-from", tusb1211_chg_det_psy, 1),226	PROPERTY_ENTRY_REF("monitored-battery", &asus_tf103c_battery_node),227	PROPERTY_ENTRY_U32("ti,system-minimum-microvolt", 3600000),228	PROPERTY_ENTRY_BOOL("omit-battery-class"),229	PROPERTY_ENTRY_BOOL("disable-reset"),230	{ }231};232 233static const struct software_node asus_tf103c_bq24190_node = {234	.properties = asus_tf103c_bq24190_props,235};236 237static const struct property_entry asus_tf103c_ug3105_props[] = {238	PROPERTY_ENTRY_STRING_ARRAY_LEN("supplied-from", bq24190_psy, 1),239	PROPERTY_ENTRY_REF("monitored-battery", &asus_tf103c_battery_node),240	PROPERTY_ENTRY_U32("upisemi,rsns-microohm", 5000),241	{ }242};243 244static const struct software_node asus_tf103c_ug3105_node = {245	.properties = asus_tf103c_ug3105_props,246};247 248static const struct x86_i2c_client_info asus_tf103c_i2c_clients[] __initconst = {249	{250		/* bq24297 battery charger */251		.board_info = {252			.type = "bq24190",253			.addr = 0x6b,254			.dev_name = "bq24297",255			.swnode = &asus_tf103c_bq24190_node,256			.platform_data = &bq24190_pdata,257		},258		.adapter_path = "\\_SB_.I2C1",259		.irq_data = {260			.type = X86_ACPI_IRQ_TYPE_PMIC,261			.chip = "\\_SB_.I2C7.PMIC",262			.domain = DOMAIN_BUS_WAKEUP,263			.index = 0,264		},265	}, {266		/* ug3105 battery monitor */267		.board_info = {268			.type = "ug3105",269			.addr = 0x70,270			.dev_name = "ug3105",271			.swnode = &asus_tf103c_ug3105_node,272		},273		.adapter_path = "\\_SB_.I2C1",274	}, {275		/* ak09911 compass */276		.board_info = {277			.type = "ak09911",278			.addr = 0x0c,279			.dev_name = "ak09911",280		},281		.adapter_path = "\\_SB_.I2C5",282	}, {283		/* kxtj21009 accelerometer */284		.board_info = {285			.type = "kxtj21009",286			.addr = 0x0f,287			.dev_name = "kxtj21009",288			.swnode = &asus_tf103c_accel_node,289		},290		.adapter_path = "\\_SB_.I2C5",291	}, {292		/* atmel touchscreen */293		.board_info = {294			.type = "atmel_mxt_ts",295			.addr = 0x4a,296			.dev_name = "atmel_mxt_ts",297			.swnode = &asus_tf103c_touchscreen_node,298		},299		.adapter_path = "\\_SB_.I2C6",300		.irq_data = {301			.type = X86_ACPI_IRQ_TYPE_GPIOINT,302			.chip = "INT33FC:02",303			.index = 28,304			.trigger = ACPI_EDGE_SENSITIVE,305			.polarity = ACPI_ACTIVE_LOW,306			.con_id = "atmel_mxt_ts_irq",307		},308	},309};310 311static struct gpiod_lookup_table * const asus_tf103c_gpios[] = {312	&int3496_gpo2_pin22_gpios,313	NULL314};315 316const struct x86_dev_info asus_tf103c_info __initconst = {317	.i2c_client_info = asus_tf103c_i2c_clients,318	.i2c_client_count = ARRAY_SIZE(asus_tf103c_i2c_clients),319	.pdev_info = int3496_pdevs,320	.pdev_count = 1,321	.gpio_button = &asus_me176c_tf103c_lid,322	.gpio_button_count = 1,323	.gpiod_lookup_tables = asus_tf103c_gpios,324	.bat_swnode = &asus_tf103c_battery_node,325	.modules = bq24190_modules,326};327