Unverified Commit 6564d3e1 authored by Hans de Goede's avatar Hans de Goede Committed by Ilpo Järvinen
Browse files

platform/x86: x86-android-tablets: Add support for Acer A1-840 tablet



Add support for the Acer Iconia One 8 A1-840 (non FHD version) tablet.

This tablet has the usual issues for tablets shipped with Android as
factory OS. The DSDT is broken in various ways, so i2c_clients for
various devices as well as the INT3496 platform-device for OTG extcon
handling need to be instantiated manually by x86-android-tablets.

This tablet is special in that it is the first time a Bay Trail device
has been found to use the Dollar Cove TI PMIC and the first time that
the PMIC's Coulomb Counter is used as fuel-gauge.

So far this PMIC has only been used together with Cherry Trail SoCs
and always in combination with a separate full-featured fuel-gauge IC.

Reviewed-by: default avatarAndy Shevchenko <andy@kernel.org>
Signed-off-by: default avatarHans de Goede <hansg@kernel.org>
Link: https://patch.msgid.link/20250920200713.20193-18-hansg@kernel.org


Signed-off-by: default avatarIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
parent d4bc1496
Loading
Loading
Loading
Loading
+160 −0
Original line number Diff line number Diff line
@@ -16,6 +16,166 @@
#include "shared-psy-info.h"
#include "x86-android-tablets.h"

/* Acer Iconia One 8 A1-840 (non FHD version) */
static const struct property_entry acer_a1_840_bq24190_props[] = {
	PROPERTY_ENTRY_REF("monitored-battery", &generic_lipo_4v2_battery_node),
	PROPERTY_ENTRY_BOOL("omit-battery-class"),
	PROPERTY_ENTRY_BOOL("disable-reset"),
	{ }
};

static const struct software_node acer_a1_840_bq24190_node = {
	.properties = acer_a1_840_bq24190_props,
};

static const struct property_entry acer_a1_840_touchscreen_props[] = {
	PROPERTY_ENTRY_U32("touchscreen-size-x", 800),
	PROPERTY_ENTRY_U32("touchscreen-size-y", 1280),
	PROPERTY_ENTRY_GPIO("reset-gpios", &baytrail_gpiochip_nodes[1], 26, GPIO_ACTIVE_LOW),
	{ }
};

static const struct software_node acer_a1_840_touchscreen_node = {
	.properties = acer_a1_840_touchscreen_props,
};

static const struct x86_i2c_client_info acer_a1_840_i2c_clients[] __initconst = {
	{
		/* BQ24297 charger IC */
		.board_info = {
			.type = "bq24297",
			.addr = 0x6b,
			.dev_name = "bq24297",
			.swnode = &acer_a1_840_bq24190_node,
			.platform_data = &bq24190_pdata,
		},
		.adapter_path = "\\_SB_.I2C1",
		.irq_data = {
			.type = X86_ACPI_IRQ_TYPE_GPIOINT,
			.chip = "INT33FC:02",
			.index = 2,
			.trigger = ACPI_EDGE_SENSITIVE,
			.polarity = ACPI_ACTIVE_LOW,
			.con_id = "bq24297_irq",
		},
	}, {
		/* MPU6515 sensors */
		.board_info = {
			.type = "mpu6515",
			.addr = 0x69,
			.dev_name = "mpu6515",
		},
		.adapter_path = "\\_SB_.I2C3",
		.irq_data = {
			.type = X86_ACPI_IRQ_TYPE_APIC,
			.index = 0x47,
			.trigger = ACPI_EDGE_SENSITIVE,
			.polarity = ACPI_ACTIVE_HIGH,
		},
	}, {
		/* FT5416 touchscreen controller */
		.board_info = {
			.type = "edt-ft5x06",
			.addr = 0x38,
			.dev_name = "ft5416",
			.swnode = &acer_a1_840_touchscreen_node,
		},
		.adapter_path = "\\_SB_.I2C4",
		.irq_data = {
			.type = X86_ACPI_IRQ_TYPE_APIC,
			.index = 0x45,
			.trigger = ACPI_EDGE_SENSITIVE,
			.polarity = ACPI_ACTIVE_HIGH,
		},
	}
};

static const struct property_entry acer_a1_840_int3496_props[] __initconst = {
	PROPERTY_ENTRY_GPIO("mux-gpios", &baytrail_gpiochip_nodes[2], 1, GPIO_ACTIVE_HIGH),
	PROPERTY_ENTRY_GPIO("id-gpios", &baytrail_gpiochip_nodes[2], 18, GPIO_ACTIVE_HIGH),
	{ }
};

static const struct platform_device_info acer_a1_840_pdevs[] __initconst = {
	{
		/* For micro USB ID pin handling */
		.name = "intel-int3496",
		.id = PLATFORM_DEVID_NONE,
		.properties = acer_a1_840_int3496_props,
	},
};

/* Properties for the Dollar Cove TI PMIC battery MFD child used as fuel-gauge */
static const struct property_entry acer_a1_840_fg_props[] = {
	PROPERTY_ENTRY_REF("monitored-battery", &generic_lipo_4v2_battery_node),
	PROPERTY_ENTRY_STRING_ARRAY_LEN("supplied-from", bq24190_psy, 1),
	PROPERTY_ENTRY_GPIO("charged-gpios", &baytrail_gpiochip_nodes[2], 10, GPIO_ACTIVE_HIGH),
	{ }
};

static struct device *acer_a1_840_fg_dev;
static struct fwnode_handle *acer_a1_840_fg_node;

static int __init acer_a1_840_init(struct device *dev)
{
	int ret;

	acer_a1_840_fg_dev = bus_find_device_by_name(&platform_bus_type, NULL, "chtdc_ti_battery");
	if (!acer_a1_840_fg_dev)
		return dev_err_probe(dev, -EPROBE_DEFER, "getting chtdc_ti_battery dev\n");

	acer_a1_840_fg_node = fwnode_create_software_node(acer_a1_840_fg_props, NULL);
	if (IS_ERR(acer_a1_840_fg_node)) {
		ret = PTR_ERR(acer_a1_840_fg_node);
		goto err_put;
	}

	ret = device_add_software_node(acer_a1_840_fg_dev,
				       to_software_node(acer_a1_840_fg_node));
	if (ret)
		goto err_put;

	return 0;

err_put:
	fwnode_handle_put(acer_a1_840_fg_node);
	acer_a1_840_fg_node = NULL;
	put_device(acer_a1_840_fg_dev);
	acer_a1_840_fg_dev = NULL;
	return ret;
}

static void acer_a1_840_exit(void)
{
	device_remove_software_node(acer_a1_840_fg_dev);
	/*
	 * Skip fwnode_handle_put(acer_a1_840_fg_node), instead leak the node.
	 * The intel_dc_ti_battery driver may still reference the strdup-ed
	 * "supplied-from" string. This string will be free-ed if the node
	 * is released.
	 */
	acer_a1_840_fg_node = NULL;
	put_device(acer_a1_840_fg_dev);
	acer_a1_840_fg_dev = NULL;
}

static const char * const acer_a1_840_modules[] __initconst = {
	"bq24190_charger",	/* For the Vbus regulator for intel-int3496 */
	NULL
};

const struct x86_dev_info acer_a1_840_info __initconst = {
	.i2c_client_info = acer_a1_840_i2c_clients,
	.i2c_client_count = ARRAY_SIZE(acer_a1_840_i2c_clients),
	.pdev_info = acer_a1_840_pdevs,
	.pdev_count = ARRAY_SIZE(acer_a1_840_pdevs),
	.gpiochip_type = X86_GPIOCHIP_BAYTRAIL,
	.swnode_group = generic_lipo_4v2_battery_swnodes,
	.modules = acer_a1_840_modules,
	.init = acer_a1_840_init,
	.exit = acer_a1_840_exit,
};

/* Acer Iconia One 7 B1-750 has an Android factory image with everything hardcoded */
static const char * const acer_b1_750_mount_matrix[] = {
	"-1", "0", "0",
+10 −0
Original line number Diff line number Diff line
@@ -16,6 +16,16 @@
#include "x86-android-tablets.h"

const struct dmi_system_id x86_android_tablet_ids[] __initconst = {
	{
		/* Acer Iconia One 8 A1-840 (non FHD version) */
		.matches = {
			DMI_MATCH(DMI_SYS_VENDOR, "Insyde"),
			DMI_MATCH(DMI_PRODUCT_NAME, "BayTrail"),
			/* Above strings are too generic also match BIOS date */
			DMI_MATCH(DMI_BIOS_DATE, "04/01/2014"),
		},
		.driver_data = (void *)&acer_a1_840_info,
	},
	{
		/* Acer Iconia One 7 B1-750 */
		.matches = {
+1 −0
Original line number Diff line number Diff line
@@ -111,6 +111,7 @@ extern const struct software_node cherryview_gpiochip_nodes[];
 * Extern declarations of x86_dev_info structs so there can be a single
 * MODULE_DEVICE_TABLE(dmi, ...), while splitting the board descriptions.
 */
extern const struct x86_dev_info acer_a1_840_info;
extern const struct x86_dev_info acer_b1_750_info;
extern const struct x86_dev_info advantech_mica_071_info;
extern const struct x86_dev_info asus_me176c_info;