// 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 <hdegoede@redhat.com>
*/
#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 const struct x86_gpio_button asus_me176c_tf103c_lid __initconst = {
.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 image 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 accelerometer */
.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.acpi.hid = "80860F0A" ,
.ctrl.acpi.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,
.gpio_button_count = 1,
.gpiod_lookup_tables = asus_me176c_gpios,
.bat_swnode = &generic_lipo_hv_4v35_battery_node,
.modules = bq24190_modules,
};
/* Asus TF103C tablets have an Android factory image 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_bq24190_props[] = {
PROPERTY_ENTRY_STRING_ARRAY_LEN("supplied-from" , tusb1211_chg_det_psy, 1),
PROPERTY_ENTRY_REF("monitored-battery" , &generic_lipo_4v2_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" , &generic_lipo_4v2_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 accelerometer */
.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,
.con_id = "atmel_mxt_ts_irq" ,
},
},
};
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,
.gpio_button_count = 1,
.gpiod_lookup_tables = asus_tf103c_gpios,
.bat_swnode = &generic_lipo_4v2_battery_node,
.modules = bq24190_modules,
};
Messung V0.5 C=94 H=89 G=91
¤ Dauer der Verarbeitung: 0.4 Sekunden
¤
*© Formatika GbR, Deutschland