Commit fa48d7e8 authored by Saranya Gopal's avatar Saranya Gopal Committed by Greg Kroah-Hartman
Browse files

usb: typec: ucsi: Do not call ACPI _DSM method for UCSI read operations



ACPI _DSM methods are needed only for UCSI write operations and for reading
CCI during RESET_PPM operation. So, remove _DSM calls from other places.
While there, remove the Zenbook quirk also since the default behavior
now aligns with the Zenbook quirk. With this change, GET_CONNECTOR_STATUS
returns at least 6 seconds faster than before in Arrowlake-S platforms.

Reviewed-by: default avatarHeikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: default avatarSaranya Gopal <saranya.gopal@intel.com>
Reviewed-by: default avatarChristian A. Ehrhardt <lk@c--e.de>
Link: https://lore.kernel.org/r/20240830084342.460109-1-saranya.gopal@intel.com


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 64f3b5a6
Loading
Loading
Loading
Loading
+5 −51
Original line number Diff line number Diff line
@@ -61,9 +61,11 @@ static int ucsi_acpi_read_cci(struct ucsi *ucsi, u32 *cci)
	struct ucsi_acpi *ua = ucsi_get_drvdata(ucsi);
	int ret;

	if (UCSI_COMMAND(ua->cmd) == UCSI_PPM_RESET) {
		ret = ucsi_acpi_dsm(ua, UCSI_DSM_FUNC_READ);
		if (ret)
			return ret;
	}

	memcpy(cci, ua->base + UCSI_CCI, sizeof(*cci));

@@ -73,11 +75,6 @@ static int ucsi_acpi_read_cci(struct ucsi *ucsi, u32 *cci)
static int ucsi_acpi_read_message_in(struct ucsi *ucsi, void *val, size_t val_len)
{
	struct ucsi_acpi *ua = ucsi_get_drvdata(ucsi);
	int ret;

	ret = ucsi_acpi_dsm(ua, UCSI_DSM_FUNC_READ);
	if (ret)
		return ret;

	memcpy(val, ua->base + UCSI_MESSAGE_IN, val_len);

@@ -102,42 +99,6 @@ static const struct ucsi_operations ucsi_acpi_ops = {
	.async_control = ucsi_acpi_async_control
};

static int
ucsi_zenbook_read_cci(struct ucsi *ucsi, u32 *cci)
{
	struct ucsi_acpi *ua = ucsi_get_drvdata(ucsi);
	int ret;

	if (UCSI_COMMAND(ua->cmd) == UCSI_PPM_RESET) {
		ret = ucsi_acpi_dsm(ua, UCSI_DSM_FUNC_READ);
		if (ret)
			return ret;
	}

	memcpy(cci, ua->base + UCSI_CCI, sizeof(*cci));

	return 0;
}

static int
ucsi_zenbook_read_message_in(struct ucsi *ucsi, void *val, size_t val_len)
{
	struct ucsi_acpi *ua = ucsi_get_drvdata(ucsi);

	/* UCSI_MESSAGE_IN is never read for PPM_RESET, return stored data */
	memcpy(val, ua->base + UCSI_MESSAGE_IN, val_len);

	return 0;
}

static const struct ucsi_operations ucsi_zenbook_ops = {
	.read_version = ucsi_acpi_read_version,
	.read_cci = ucsi_zenbook_read_cci,
	.read_message_in = ucsi_zenbook_read_message_in,
	.sync_control = ucsi_sync_control_common,
	.async_control = ucsi_acpi_async_control
};

static int ucsi_gram_read_message_in(struct ucsi *ucsi, void *val, size_t val_len)
{
	u16 bogus_change = UCSI_CONSTAT_POWER_LEVEL_CHANGE |
@@ -190,13 +151,6 @@ static const struct ucsi_operations ucsi_gram_ops = {
};

static const struct dmi_system_id ucsi_acpi_quirks[] = {
	{
		.matches = {
			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
			DMI_MATCH(DMI_PRODUCT_NAME, "ZenBook UX325UA_UM325UA"),
		},
		.driver_data = (void *)&ucsi_zenbook_ops,
	},
	{
		.matches = {
			DMI_MATCH(DMI_SYS_VENDOR, "LG Electronics"),