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*e2200d3fSHans de Goede static const struct x86_gpio_button asus_me176c_tf103c_lid __initconst = { 28*e2200d3fSHans 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 }, 36*e2200d3fSHans de Goede .chip = "INT33FC:02", 37*e2200d3fSHans 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), 173*e2200d3fSHans de Goede .pdev_info = int3496_pdevs, 174*e2200d3fSHans de Goede .pdev_count = 1, 17597abac9cSHans de Goede .serdev_info = asus_me176c_serdevs, 17697abac9cSHans de Goede .serdev_count = ARRAY_SIZE(asus_me176c_serdevs), 177*e2200d3fSHans de Goede .gpio_button = &asus_me176c_tf103c_lid, 17897abac9cSHans 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), 318*e2200d3fSHans de Goede .pdev_info = int3496_pdevs, 319*e2200d3fSHans de Goede .pdev_count = 1, 320*e2200d3fSHans de Goede .gpio_button = &asus_me176c_tf103c_lid, 32197abac9cSHans 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