]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
usb: typec: ucsi: Add support for message out data structure
authorPooja Katiyar <pooja.katiyar@intel.com>
Thu, 30 Oct 2025 14:48:56 +0000 (07:48 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 21 Nov 2025 14:13:07 +0000 (15:13 +0100)
Add support for updating message out data structure for UCSI
ACPI interface for UCSI 2.1 and UCSI 3.0 commands such as
Set PDOs and LPM Firmware Update.

Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: Pooja Katiyar <pooja.katiyar@intel.com>
Link: https://patch.msgid.link/5bb1f367e44c9fc5244c3e10e513f02d62fe8166.1761773881.git.pooja.katiyar@intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/typec/ucsi/ucsi.c
drivers/usb/typec/ucsi/ucsi.h
drivers/usb/typec/ucsi/ucsi_acpi.c

index 8195407131501c1b2cdc087ed8e00f1cb1eae86d..9b3df776137a17e569588d41ee437a778342146e 100644 (file)
@@ -67,6 +67,20 @@ int ucsi_sync_control_common(struct ucsi *ucsi, u64 command, u32 *cci)
 
        reinit_completion(&ucsi->complete);
 
+       if (ucsi->message_out_size > 0) {
+               if (!ucsi->ops->write_message_out) {
+                       ucsi->message_out_size = 0;
+                       ret = -EOPNOTSUPP;
+                       goto out_clear_bit;
+               }
+
+               ret = ucsi->ops->write_message_out(ucsi, ucsi->message_out,
+                                                  ucsi->message_out_size);
+               ucsi->message_out_size = 0;
+               if (ret)
+                       goto out_clear_bit;
+       }
+
        ret = ucsi->ops->async_control(ucsi, command);
        if (ret)
                goto out_clear_bit;
index 479bf1f69c72b94ba0e34e624c2b0257cf4d9225..d01b796a8d23a13867b8186ca4e4885bdee86845 100644 (file)
@@ -69,6 +69,7 @@ struct dentry;
  * @read_cci: Read CCI register
  * @poll_cci: Read CCI register while polling with notifications disabled
  * @read_message_in: Read message data from UCSI
+ * @write_message_out: Write message data to UCSI
  * @sync_control: Blocking control operation
  * @async_control: Non-blocking control operation
  * @update_altmodes: Squashes duplicate DP altmodes
@@ -84,6 +85,7 @@ struct ucsi_operations {
        int (*read_cci)(struct ucsi *ucsi, u32 *cci);
        int (*poll_cci)(struct ucsi *ucsi, u32 *cci);
        int (*read_message_in)(struct ucsi *ucsi, void *val, size_t val_len);
+       int (*write_message_out)(struct ucsi *ucsi, void *data, size_t data_len);
        int (*sync_control)(struct ucsi *ucsi, u64 command, u32 *cci);
        int (*async_control)(struct ucsi *ucsi, u64 command);
        bool (*update_altmodes)(struct ucsi *ucsi, u8 recipient,
index f1d1f6917b0984679af9c8bac0f0660d54d8c0be..f9beeb835238280c3ed26b817e012daad252bbeb 100644 (file)
@@ -86,6 +86,21 @@ static int ucsi_acpi_read_message_in(struct ucsi *ucsi, void *val, size_t val_le
        return 0;
 }
 
+static int ucsi_acpi_write_message_out(struct ucsi *ucsi, void *data, size_t data_len)
+{
+       struct ucsi_acpi *ua = ucsi_get_drvdata(ucsi);
+
+       if (!data || !data_len)
+               return -EINVAL;
+
+       if (ucsi->version <= UCSI_VERSION_1_2)
+               memcpy(ua->base + UCSI_MESSAGE_OUT, data, data_len);
+       else
+               memcpy(ua->base + UCSIv2_MESSAGE_OUT, data, data_len);
+
+       return 0;
+}
+
 static int ucsi_acpi_async_control(struct ucsi *ucsi, u64 command)
 {
        struct ucsi_acpi *ua = ucsi_get_drvdata(ucsi);
@@ -101,6 +116,7 @@ static const struct ucsi_operations ucsi_acpi_ops = {
        .read_cci = ucsi_acpi_read_cci,
        .poll_cci = ucsi_acpi_poll_cci,
        .read_message_in = ucsi_acpi_read_message_in,
+       .write_message_out = ucsi_acpi_write_message_out,
        .sync_control = ucsi_sync_control_common,
        .async_control = ucsi_acpi_async_control
 };