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