From nobody Wed Dec 17 21:18:51 2025 Received: from mail-lf1-f43.google.com (mail-lf1-f43.google.com [209.85.167.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 79B0E16F0F4 for ; Tue, 25 Jun 2024 14:54:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719327277; cv=none; b=MoTueoozcN5NTqy5ynWWksirn5Wx3whACFI6QV3erNPz16yti6oNFKafGa7tS7rvfuwb1pqKU57xi/sNuL9Mn8eZv/mt0w6yppaBW4yo2WLrkSPCAUaFdso8kMv8kmgnHWaW6Jc/iqKNBSIxcnf/+haihIE7J9ApTMmCZHGKbMo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1719327277; c=relaxed/simple; bh=4wZHRHUTLDa+Ajur4pcLq9kjg9ZZkfOeNHnW5AjdB+U=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=lEn/n5T71KxFR7p3hSUtAlrIw0UT9GzJ2jq99wItnF3y8WyNGCbcql8QqBC5Gdhfo0hdTlE72x+jwQxHM/9p/vaRkMYin/7c5mgLAahuxEmaLzDIIXbT6F2hqkwbYnizbwKEXpZNX5OoU9K8LHymOdgrAy9KEJ9U7u2yS8DoIfg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=EOgUbgky; arc=none smtp.client-ip=209.85.167.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="EOgUbgky" Received: by mail-lf1-f43.google.com with SMTP id 2adb3069b0e04-52cd628f21cso4817266e87.3 for ; Tue, 25 Jun 2024 07:54:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1719327272; x=1719932072; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=JHzYKHNjBXf+9UzjvIdsaqBY3cbTBbTnQBUGbCvbkus=; b=EOgUbgkylyYKGo6OYlr4LUtG9dXh3I4yyLbigphEN1dzUcm00R21FIA/8l5ZL4NNDS O4/T87OnWLbGwz5H2yO9J/2Y/QFD4OyK654074SYYLPLNpmzMndDBzXKweb8hyczlSR/ UpVPe+teHkBbt8lP+ZcNMT+TDgPVArXOo2En9QXlvA/ns7JO4PkcytLLplTqCiRQDPIe 3nqat28UbGB6z4KnjjVEMAdVoOBNkW61ondZJHC6JDT4JRx0DRSNEVkbNmKPZKEvqpOz YSr9/is7c2ZzsCF+2cFWBctRr1eq771TJe2QYP8Ibp+X3bPqtIm9VQVdYlM8xt6pZtNs Acfw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1719327272; x=1719932072; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=JHzYKHNjBXf+9UzjvIdsaqBY3cbTBbTnQBUGbCvbkus=; b=rt+v4MS8+19hoDTNKu5Rj0P+7nfzbjwhvi9SHoVdZ5WEaN94kPye6KrIknMPhCBzUZ VBLNRPnp/bGDSgJPvbJwaW0vv3110iedkSlQ9NS3QdHPMFz4+SSZJWjkVLcWobjVikkL uygGWeFWFU0XedQCrXpmKESOOEDz3epzB4WYE1YpuCySRQx3I7wC3Oaj9OBSAjI83wWN 9SiqucVp7fIZ5mgrvASZzFnHpQ97DLms123epOiCYfx2MksotvscG9zPBcQkCBlE5KRF ydxc3eNINNjvw3t1oV5knDFhIhpQU5fFOqRn5O4RyD4FtZ3G24V7DgSzphVNmk3uTu+p 2fwA== X-Forwarded-Encrypted: i=1; AJvYcCWSdVDVpanB+yPbtQoDko6OVXjF+QdMoqCvV68Ieif/YZlO+KoUf61NfTR1oXN0oe/DPrF8Zr6Vmtt3vd1iAOhlbeDcSyZemOPv0z9n X-Gm-Message-State: AOJu0YzIKQrlopB0LUrGBdQMr6ATUWYjlTN2+BUI6OwELkWmYgXkI1Wa YCXhfXK1tv4kfiVKfZV4jg2Op6XVickshEt1HFC6wnacu3g18ivZyY7XC7N7uV8= X-Google-Smtp-Source: AGHT+IGhqQ+VBKIxaQ2lp2Pfy14XvRHw9UB90ZVR4jtUgoXS1297PMq+RIWx0NHafF59+uQIKs23DQ== X-Received: by 2002:ac2:550d:0:b0:52c:e126:3d50 with SMTP id 2adb3069b0e04-52ce183bf44mr4231354e87.36.1719327271692; Tue, 25 Jun 2024 07:54:31 -0700 (PDT) Received: from umbar.lan ([192.130.178.91]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-52cd64328b7sm1251877e87.221.2024.06.25.07.54.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Jun 2024 07:54:31 -0700 (PDT) From: Dmitry Baryshkov Date: Tue, 25 Jun 2024 17:54:28 +0300 Subject: [PATCH v3 3/7] usb: typec: ucsi: split read operation Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20240625-ucsi-rework-interface-v3-3-7a6c8e17be3a@linaro.org> References: <20240625-ucsi-rework-interface-v3-0-7a6c8e17be3a@linaro.org> In-Reply-To: <20240625-ucsi-rework-interface-v3-0-7a6c8e17be3a@linaro.org> To: Heikki Krogerus , Greg Kroah-Hartman , Maxime Coquelin , Alexandre Torgue Cc: Nikita Travkin , Neil Armstrong , linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, linux-stm32@st-md-mailman.stormreply.com, linux-arm-kernel@lists.infradead.org X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=16964; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=4wZHRHUTLDa+Ajur4pcLq9kjg9ZZkfOeNHnW5AjdB+U=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBmetojz5ODXJomc1rapxF2ktWVUz9a/WEel79T5 OixCXVC8qKJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZnraIwAKCRCLPIo+Aiko 1YChB/9blK+zkNFOWhPUzE/TGHcI/2rtvvJI4F2Rg9lNVf8REPX01zLsxS7WGfj3I0CoSHjDJBm KvwwE/ZRjiTrLYdW4RxTF97d6LJQF2O6lWpXemKOfr/teiJav76MobxTQia8x/EV2Zlgw2e0KHi 9z5a9a8P1IsN6lAYlX2k9C75bn249CnAHnvCvqwfoa5Ea42VBS0ytYxLq5AdJ8x1/fFSV/vDBKt JiXwyITWCxjt4AN96lIs+zUBXxZL7ty0pIT7AtSQHgtftxRsDc5+qQfO38CHTsQaSGoorM6fsqH zKb88YD2sw/SYq0opHpHiOeYUzEe1mykDNGcDbICfvbWdB03 X-Developer-Key: i=dmitry.baryshkov@linaro.org; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A The read operation is only used to read fixed data at fixed offsets (UCSI_VERSION, UCSI_CCI, UCSI_MESSAGE_IN). In some cases drivers apply offset-specific overrides. Split the read() operation into three operations, read_version(), read_cci(), read_message_in(). Signed-off-by: Dmitry Baryshkov --- drivers/usb/typec/ucsi/ucsi.c | 20 ++++----- drivers/usb/typec/ucsi/ucsi.h | 9 +++-- drivers/usb/typec/ucsi/ucsi_acpi.c | 72 ++++++++++++++++++++++++++---= ---- drivers/usb/typec/ucsi/ucsi_ccg.c | 50 ++++++++++++----------- drivers/usb/typec/ucsi/ucsi_glink.c | 19 ++++++++- drivers/usb/typec/ucsi/ucsi_stm32g0.c | 19 ++++++++- drivers/usb/typec/ucsi/ucsi_yoga_c630.c | 52 +++++++++++++++--------- 7 files changed, 169 insertions(+), 72 deletions(-) diff --git a/drivers/usb/typec/ucsi/ucsi.c b/drivers/usb/typec/ucsi/ucsi.c index 52903eea7274..db25f51ff71d 100644 --- a/drivers/usb/typec/ucsi/ucsi.c +++ b/drivers/usb/typec/ucsi/ucsi.c @@ -46,7 +46,7 @@ static int ucsi_read_message_in(struct ucsi *ucsi, void *= buf, if (ucsi->version <=3D UCSI_VERSION_1_2) buf_size =3D clamp(buf_size, 0, 16); =20 - return ucsi->ops->read(ucsi, UCSI_MESSAGE_IN, buf, buf_size); + return ucsi->ops->read_message_in(ucsi, buf, buf_size); } =20 static int ucsi_acknowledge(struct ucsi *ucsi, bool conn_ack) @@ -130,7 +130,7 @@ static int ucsi_exec_command(struct ucsi *ucsi, u64 cmd) if (ret) return ret; =20 - ret =3D ucsi->ops->read(ucsi, UCSI_CCI, &cci, sizeof(cci)); + ret =3D ucsi->ops->read_cci(ucsi, &cci); if (ret) return ret; =20 @@ -1309,7 +1309,7 @@ static int ucsi_reset_ppm(struct ucsi *ucsi) =20 mutex_lock(&ucsi->ppm_lock); =20 - ret =3D ucsi->ops->read(ucsi, UCSI_CCI, &cci, sizeof(cci)); + ret =3D ucsi->ops->read_cci(ucsi, &cci); if (ret < 0) goto out; =20 @@ -1327,8 +1327,7 @@ static int ucsi_reset_ppm(struct ucsi *ucsi) =20 tmo =3D jiffies + msecs_to_jiffies(UCSI_TIMEOUT_MS); do { - ret =3D ucsi->ops->read(ucsi, UCSI_CCI, - &cci, sizeof(cci)); + ret =3D ucsi->ops->read_cci(ucsi, &cci); if (ret < 0) goto out; if (cci & UCSI_CCI_COMMAND_COMPLETE) @@ -1357,7 +1356,7 @@ static int ucsi_reset_ppm(struct ucsi *ucsi) /* Give the PPM time to process a reset before reading CCI */ msleep(20); =20 - ret =3D ucsi->ops->read(ucsi, UCSI_CCI, &cci, sizeof(cci)); + ret =3D ucsi->ops->read_cci(ucsi, &cci); if (ret) goto out; =20 @@ -1777,7 +1776,7 @@ static int ucsi_init(struct ucsi *ucsi) ucsi->ntfy =3D ntfy; =20 mutex_lock(&ucsi->ppm_lock); - ret =3D ucsi->ops->read(ucsi, UCSI_CCI, &cci, sizeof(cci)); + ret =3D ucsi->ops->read_cci(ucsi, &cci); mutex_unlock(&ucsi->ppm_lock); if (ret) return ret; @@ -1891,7 +1890,9 @@ struct ucsi *ucsi_create(struct device *dev, const st= ruct ucsi_operations *ops) { struct ucsi *ucsi; =20 - if (!ops || !ops->read || !ops->sync_control || !ops->async_control) + if (!ops || + !ops->read_version || !ops->read_cci || !ops->read_message_in || + !ops->sync_control || !ops->async_control) return ERR_PTR(-EINVAL); =20 ucsi =3D kzalloc(sizeof(*ucsi), GFP_KERNEL); @@ -1927,8 +1928,7 @@ int ucsi_register(struct ucsi *ucsi) { int ret; =20 - ret =3D ucsi->ops->read(ucsi, UCSI_VERSION, &ucsi->version, - sizeof(ucsi->version)); + ret =3D ucsi->ops->read_version(ucsi, &ucsi->version); if (ret) return ret; =20 diff --git a/drivers/usb/typec/ucsi/ucsi.h b/drivers/usb/typec/ucsi/ucsi.h index 3ad64acffda1..5c5a8c63090d 100644 --- a/drivers/usb/typec/ucsi/ucsi.h +++ b/drivers/usb/typec/ucsi/ucsi.h @@ -56,7 +56,9 @@ struct dentry; =20 /** * struct ucsi_operations - UCSI I/O operations - * @read: Read operation + * @read_version: Read implemented UCSI version + * @read_cci: Read CCI register + * @read_message_in: Read message data from UCSI * @sync_control: Blocking control operation * @async_control: Non-blocking control operation * @update_altmodes: Squashes duplicate DP altmodes @@ -68,8 +70,9 @@ struct dentry; * return immediately after sending the data to the PPM. */ struct ucsi_operations { - int (*read)(struct ucsi *ucsi, unsigned int offset, - void *val, size_t val_len); + int (*read_version)(struct ucsi *ucsi, u16 *version); + int (*read_cci)(struct ucsi *ucsi, u32 *cci); + int (*read_message_in)(struct ucsi *ucsi, void *val, size_t val_len); int (*sync_control)(struct ucsi *ucsi, u64 command); int (*async_control)(struct ucsi *ucsi, u64 command); bool (*update_altmodes)(struct ucsi *ucsi, struct ucsi_altmode *orig, diff --git a/drivers/usb/typec/ucsi/ucsi_acpi.c b/drivers/usb/typec/ucsi/uc= si_acpi.c index f54e4722d8f6..3660dc3e6d32 100644 --- a/drivers/usb/typec/ucsi/ucsi_acpi.c +++ b/drivers/usb/typec/ucsi/ucsi_acpi.c @@ -46,8 +46,7 @@ static int ucsi_acpi_dsm(struct ucsi_acpi *ua, int func) return 0; } =20 -static int ucsi_acpi_read(struct ucsi *ucsi, unsigned int offset, - void *val, size_t val_len) +static int ucsi_acpi_read_version(struct ucsi *ucsi, u16 *version) { struct ucsi_acpi *ua =3D ucsi_get_drvdata(ucsi); int ret; @@ -56,7 +55,35 @@ static int ucsi_acpi_read(struct ucsi *ucsi, unsigned in= t offset, if (ret) return ret; =20 - memcpy(val, ua->base + offset, val_len); + memcpy(version, ua->base + UCSI_VERSION, sizeof(*version)); + + return 0; +} + +static int ucsi_acpi_read_cci(struct ucsi *ucsi, u32 *cci) +{ + struct ucsi_acpi *ua =3D ucsi_get_drvdata(ucsi); + int ret; + + ret =3D 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_acpi_read_message_in(struct ucsi *ucsi, void *val, size_t = val_len) +{ + struct ucsi_acpi *ua =3D ucsi_get_drvdata(ucsi); + int ret; + + ret =3D ucsi_acpi_dsm(ua, UCSI_DSM_FUNC_READ); + if (ret) + return ret; + + memcpy(val, ua->base + UCSI_MESSAGE_IN, val_len); =20 return 0; } @@ -99,36 +126,50 @@ static int ucsi_acpi_sync_control(struct ucsi *ucsi, u= 64 command) } =20 static const struct ucsi_operations ucsi_acpi_ops =3D { - .read =3D ucsi_acpi_read, + .read_version =3D ucsi_acpi_read_version, + .read_cci =3D ucsi_acpi_read_cci, + .read_message_in =3D ucsi_acpi_read_message_in, .sync_control =3D ucsi_acpi_sync_control, .async_control =3D ucsi_acpi_async_control }; =20 static int -ucsi_zenbook_read(struct ucsi *ucsi, unsigned int offset, void *val, size_= t val_len) +ucsi_zenbook_read_cci(struct ucsi *ucsi, u32 *cci) { struct ucsi_acpi *ua =3D ucsi_get_drvdata(ucsi); int ret; =20 - if (offset =3D=3D UCSI_VERSION || UCSI_COMMAND(ua->cmd) =3D=3D UCSI_PPM_R= ESET) { + if (UCSI_COMMAND(ua->cmd) =3D=3D UCSI_PPM_RESET) { ret =3D ucsi_acpi_dsm(ua, UCSI_DSM_FUNC_READ); if (ret) return ret; } =20 - memcpy(val, ua->base + offset, val_len); + 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 =3D 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); =20 return 0; } =20 static const struct ucsi_operations ucsi_zenbook_ops =3D { - .read =3D ucsi_zenbook_read, + .read_version =3D ucsi_acpi_read_version, + .read_cci =3D ucsi_zenbook_read_cci, + .read_message_in =3D ucsi_zenbook_read_message_in, .sync_control =3D ucsi_acpi_sync_control, .async_control =3D ucsi_acpi_async_control }; =20 -static int ucsi_gram_read(struct ucsi *ucsi, unsigned int offset, - void *val, size_t val_len) +static int ucsi_gram_read_message_in(struct ucsi *ucsi, void *val, size_t = val_len) { u16 bogus_change =3D UCSI_CONSTAT_POWER_LEVEL_CHANGE | UCSI_CONSTAT_PDOS_CHANGE; @@ -136,13 +177,12 @@ static int ucsi_gram_read(struct ucsi *ucsi, unsigned= int offset, struct ucsi_connector_status *status; int ret; =20 - ret =3D ucsi_acpi_read(ucsi, offset, val, val_len); + ret =3D ucsi_acpi_read_message_in(ucsi, val, val_len); if (ret < 0) return ret; =20 if (UCSI_COMMAND(ua->cmd) =3D=3D UCSI_GET_CONNECTOR_STATUS && - test_bit(UCSI_ACPI_CHECK_BOGUS_EVENT, &ua->flags) && - offset =3D=3D UCSI_MESSAGE_IN) { + test_bit(UCSI_ACPI_CHECK_BOGUS_EVENT, &ua->flags)) { status =3D (struct ucsi_connector_status *)val; =20 /* Clear the bogus change */ @@ -173,7 +213,9 @@ static int ucsi_gram_sync_control(struct ucsi *ucsi, u6= 4 command) } =20 static const struct ucsi_operations ucsi_gram_ops =3D { - .read =3D ucsi_gram_read, + .read_version =3D ucsi_acpi_read_version, + .read_cci =3D ucsi_acpi_read_cci, + .read_message_in =3D ucsi_gram_read_message_in, .sync_control =3D ucsi_gram_sync_control, .async_control =3D ucsi_acpi_async_control }; @@ -203,7 +245,7 @@ static void ucsi_acpi_notify(acpi_handle handle, u32 ev= ent, void *data) u32 cci; int ret; =20 - ret =3D ua->ucsi->ops->read(ua->ucsi, UCSI_CCI, &cci, sizeof(cci)); + ret =3D ua->ucsi->ops->read_cci(ua->ucsi, &cci); if (ret) return; =20 diff --git a/drivers/usb/typec/ucsi/ucsi_ccg.c b/drivers/usb/typec/ucsi/ucs= i_ccg.c index 76b39bb9762d..6ccc394f268e 100644 --- a/drivers/usb/typec/ucsi/ucsi_ccg.c +++ b/drivers/usb/typec/ucsi/ucsi_ccg.c @@ -556,32 +556,34 @@ static void ucsi_ccg_nvidia_altmode(struct ucsi_ccg *= uc, } } =20 -static int ucsi_ccg_read(struct ucsi *ucsi, unsigned int offset, - void *val, size_t val_len) +static int ucsi_ccg_read_version(struct ucsi *ucsi, u16 *version) { struct ucsi_ccg *uc =3D ucsi_get_drvdata(ucsi); - u16 reg =3D CCGX_RAB_UCSI_DATA_BLOCK(offset); - struct ucsi_capability *cap; - struct ucsi_altmode *alt; - int ret =3D 0; + u16 reg =3D CCGX_RAB_UCSI_DATA_BLOCK(UCSI_VERSION); =20 - if (offset =3D=3D UCSI_CCI) { - spin_lock(&uc->op_lock); - memcpy(val, &(uc->op_data).cci, val_len); - spin_unlock(&uc->op_lock); - } else if (offset =3D=3D UCSI_MESSAGE_IN) { - spin_lock(&uc->op_lock); - memcpy(val, &(uc->op_data).message_in, val_len); - spin_unlock(&uc->op_lock); - } else { - ret =3D ccg_read(uc, reg, val, val_len); - } + return ccg_read(uc, reg, (u8 *)version, sizeof(*version)); +} =20 - if (ret) - return ret; +static int ucsi_ccg_read_cci(struct ucsi *ucsi, u32 *cci) +{ + struct ucsi_ccg *uc =3D ucsi_get_drvdata(ucsi); =20 - if (offset !=3D UCSI_MESSAGE_IN) - return ret; + spin_lock(&uc->op_lock); + *cci =3D uc->op_data.cci; + spin_unlock(&uc->op_lock); + + return 0; +} + +static int ucsi_ccg_read_message_in(struct ucsi *ucsi, void *val, size_t v= al_len) +{ + struct ucsi_ccg *uc =3D ucsi_get_drvdata(ucsi); + struct ucsi_capability *cap; + struct ucsi_altmode *alt; + + spin_lock(&uc->op_lock); + memcpy(val, uc->op_data.message_in, val_len); + spin_unlock(&uc->op_lock); =20 switch (UCSI_COMMAND(uc->last_cmd_sent)) { case UCSI_GET_CURRENT_CAM: @@ -607,7 +609,7 @@ static int ucsi_ccg_read(struct ucsi *ucsi, unsigned in= t offset, } uc->last_cmd_sent =3D 0; =20 - return ret; + return 0; } =20 static int ucsi_ccg_async_control(struct ucsi *ucsi, u64 command) @@ -663,7 +665,9 @@ static int ucsi_ccg_sync_control(struct ucsi *ucsi, u64= command) } =20 static const struct ucsi_operations ucsi_ccg_ops =3D { - .read =3D ucsi_ccg_read, + .read_version =3D ucsi_ccg_read_version, + .read_cci =3D ucsi_ccg_read_cci, + .read_message_in =3D ucsi_ccg_read_message_in, .sync_control =3D ucsi_ccg_sync_control, .async_control =3D ucsi_ccg_async_control, .update_altmodes =3D ucsi_ccg_update_altmodes diff --git a/drivers/usb/typec/ucsi/ucsi_glink.c b/drivers/usb/typec/ucsi/u= csi_glink.c index ebd76257c4fc..56bad054e78f 100644 --- a/drivers/usb/typec/ucsi/ucsi_glink.c +++ b/drivers/usb/typec/ucsi/ucsi_glink.c @@ -114,6 +114,21 @@ static int pmic_glink_ucsi_read(struct ucsi *__ucsi, u= nsigned int offset, return ret; } =20 +static int pmic_glink_ucsi_read_version(struct ucsi *ucsi, u16 *version) +{ + return pmic_glink_ucsi_read(ucsi, UCSI_VERSION, version, sizeof(*version)= ); +} + +static int pmic_glink_ucsi_read_cci(struct ucsi *ucsi, u32 *cci) +{ + return pmic_glink_ucsi_read(ucsi, UCSI_CCI, cci, sizeof(*cci)); +} + +static int pmic_glink_ucsi_read_message_in(struct ucsi *ucsi, void *val, s= ize_t val_len) +{ + return pmic_glink_ucsi_read(ucsi, UCSI_MESSAGE_IN, val, val_len); +} + static int pmic_glink_ucsi_locked_write(struct pmic_glink_ucsi *ucsi, unsi= gned int offset, const void *val, size_t val_len) { @@ -214,7 +229,9 @@ static void pmic_glink_ucsi_connector_status(struct ucs= i_connector *con) } =20 static const struct ucsi_operations pmic_glink_ucsi_ops =3D { - .read =3D pmic_glink_ucsi_read, + .read_version =3D pmic_glink_ucsi_read_version, + .read_cci =3D pmic_glink_ucsi_read_cci, + .read_message_in =3D pmic_glink_ucsi_read_message_in, .sync_control =3D pmic_glink_ucsi_sync_control, .async_control =3D pmic_glink_ucsi_async_control, .update_connector =3D pmic_glink_ucsi_update_connector, diff --git a/drivers/usb/typec/ucsi/ucsi_stm32g0.c b/drivers/usb/typec/ucsi= /ucsi_stm32g0.c index 396e2090e7c3..14737ca3724c 100644 --- a/drivers/usb/typec/ucsi/ucsi_stm32g0.c +++ b/drivers/usb/typec/ucsi/ucsi_stm32g0.c @@ -359,6 +359,21 @@ static int ucsi_stm32g0_read(struct ucsi *ucsi, unsign= ed int offset, void *val, return 0; } =20 +static int ucsi_stm32g0_read_version(struct ucsi *ucsi, u16 *version) +{ + return ucsi_stm32g0_read(ucsi, UCSI_VERSION, version, sizeof(*version)); +} + +static int ucsi_stm32g0_read_cci(struct ucsi *ucsi, u32 *cci) +{ + return ucsi_stm32g0_read(ucsi, UCSI_CCI, cci, sizeof(*cci)); +} + +static int ucsi_stm32g0_read_message_in(struct ucsi *ucsi, void *val, size= _t len) +{ + return ucsi_stm32g0_read(ucsi, UCSI_MESSAGE_IN, val, len); +} + static int ucsi_stm32g0_async_control(struct ucsi *ucsi, u64 command) { struct ucsi_stm32g0 *g0 =3D ucsi_get_drvdata(ucsi); @@ -446,7 +461,9 @@ static irqreturn_t ucsi_stm32g0_irq_handler(int irq, vo= id *data) } =20 static const struct ucsi_operations ucsi_stm32g0_ops =3D { - .read =3D ucsi_stm32g0_read, + .read_version =3D ucsi_stm32g0_read_version, + .read_cci =3D ucsi_stm32g0_read_cci, + .read_message_in =3D ucsi_stm32g0_read_message_in, .sync_control =3D ucsi_stm32g0_sync_control, .async_control =3D ucsi_stm32g0_async_control, }; diff --git a/drivers/usb/typec/ucsi/ucsi_yoga_c630.c b/drivers/usb/typec/uc= si/ucsi_yoga_c630.c index e5e8ba0c0eaa..95a333ad5496 100644 --- a/drivers/usb/typec/ucsi/ucsi_yoga_c630.c +++ b/drivers/usb/typec/ucsi/ucsi_yoga_c630.c @@ -27,8 +27,16 @@ struct yoga_c630_ucsi { u16 version; }; =20 -static int yoga_c630_ucsi_read(struct ucsi *ucsi, unsigned int offset, - void *val, size_t val_len) +static int yoga_c630_ucsi_read_version(struct ucsi *ucsi, u16 *version) +{ + struct yoga_c630_ucsi *uec =3D ucsi_get_drvdata(ucsi); + + *version =3D uec->version; + + return 0; +} + +static int yoga_c630_ucsi_read_cci(struct ucsi *ucsi, u32 *cci) { struct yoga_c630_ucsi *uec =3D ucsi_get_drvdata(ucsi); u8 buf[YOGA_C630_UCSI_READ_SIZE]; @@ -38,22 +46,26 @@ static int yoga_c630_ucsi_read(struct ucsi *ucsi, unsig= ned int offset, if (ret) return ret; =20 - if (offset =3D=3D UCSI_VERSION) { - memcpy(val, &uec->version, min(val_len, sizeof(uec->version))); - return 0; - } + memcpy(cci, buf, sizeof(*cci)); =20 - switch (offset) { - case UCSI_CCI: - memcpy(val, buf, min(val_len, YOGA_C630_UCSI_CCI_SIZE)); - return 0; - case UCSI_MESSAGE_IN: - memcpy(val, buf + YOGA_C630_UCSI_CCI_SIZE, - min(val_len, YOGA_C630_UCSI_DATA_SIZE)); - return 0; - default: - return -EINVAL; - } + return 0; +} + +static int yoga_c630_ucsi_read_message_in(struct ucsi *ucsi, + void *val, size_t val_len) +{ + struct yoga_c630_ucsi *uec =3D ucsi_get_drvdata(ucsi); + u8 buf[YOGA_C630_UCSI_READ_SIZE]; + int ret; + + ret =3D yoga_c630_ec_ucsi_read(uec->ec, buf); + if (ret) + return ret; + + memcpy(val, buf + YOGA_C630_UCSI_CCI_SIZE, + min(val_len, YOGA_C630_UCSI_DATA_SIZE)); + + return 0; } =20 static int yoga_c630_ucsi_async_control(struct ucsi *ucsi, u64 command) @@ -93,7 +105,9 @@ static int yoga_c630_ucsi_sync_control(struct ucsi *ucsi= , u64 command) } =20 const struct ucsi_operations yoga_c630_ucsi_ops =3D { - .read =3D yoga_c630_ucsi_read, + .read_version =3D yoga_c630_ucsi_read_version, + .read_cci =3D yoga_c630_ucsi_read_cci, + .read_message_in =3D yoga_c630_ucsi_read_message_in, .sync_control =3D yoga_c630_ucsi_sync_control, .async_control =3D yoga_c630_ucsi_async_control, }; @@ -126,7 +140,7 @@ static int yoga_c630_ucsi_notify(struct notifier_block = *nb, return NOTIFY_OK; =20 case LENOVO_EC_EVENT_UCSI: - ret =3D uec->ucsi->ops->read(uec->ucsi, UCSI_CCI, &cci, sizeof(cci)); + ret =3D uec->ucsi->ops->read_cci(uec->ucsi, &cci); if (ret) return NOTIFY_DONE; =20 --=20 2.39.2