Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

usb: typec: ucsi: Add support for message out data structure

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>

authored by

Pooja Katiyar and committed by
Greg Kroah-Hartman
db002863 3e082978

+32
+14
drivers/usb/typec/ucsi/ucsi.c
··· 67 67 68 68 reinit_completion(&ucsi->complete); 69 69 70 + if (ucsi->message_out_size > 0) { 71 + if (!ucsi->ops->write_message_out) { 72 + ucsi->message_out_size = 0; 73 + ret = -EOPNOTSUPP; 74 + goto out_clear_bit; 75 + } 76 + 77 + ret = ucsi->ops->write_message_out(ucsi, ucsi->message_out, 78 + ucsi->message_out_size); 79 + ucsi->message_out_size = 0; 80 + if (ret) 81 + goto out_clear_bit; 82 + } 83 + 70 84 ret = ucsi->ops->async_control(ucsi, command); 71 85 if (ret) 72 86 goto out_clear_bit;
+2
drivers/usb/typec/ucsi/ucsi.h
··· 69 69 * @read_cci: Read CCI register 70 70 * @poll_cci: Read CCI register while polling with notifications disabled 71 71 * @read_message_in: Read message data from UCSI 72 + * @write_message_out: Write message data to UCSI 72 73 * @sync_control: Blocking control operation 73 74 * @async_control: Non-blocking control operation 74 75 * @update_altmodes: Squashes duplicate DP altmodes ··· 85 84 int (*read_cci)(struct ucsi *ucsi, u32 *cci); 86 85 int (*poll_cci)(struct ucsi *ucsi, u32 *cci); 87 86 int (*read_message_in)(struct ucsi *ucsi, void *val, size_t val_len); 87 + int (*write_message_out)(struct ucsi *ucsi, void *data, size_t data_len); 88 88 int (*sync_control)(struct ucsi *ucsi, u64 command, u32 *cci); 89 89 int (*async_control)(struct ucsi *ucsi, u64 command); 90 90 bool (*update_altmodes)(struct ucsi *ucsi, u8 recipient,
+16
drivers/usb/typec/ucsi/ucsi_acpi.c
··· 86 86 return 0; 87 87 } 88 88 89 + static int ucsi_acpi_write_message_out(struct ucsi *ucsi, void *data, size_t data_len) 90 + { 91 + struct ucsi_acpi *ua = ucsi_get_drvdata(ucsi); 92 + 93 + if (!data || !data_len) 94 + return -EINVAL; 95 + 96 + if (ucsi->version <= UCSI_VERSION_1_2) 97 + memcpy(ua->base + UCSI_MESSAGE_OUT, data, data_len); 98 + else 99 + memcpy(ua->base + UCSIv2_MESSAGE_OUT, data, data_len); 100 + 101 + return 0; 102 + } 103 + 89 104 static int ucsi_acpi_async_control(struct ucsi *ucsi, u64 command) 90 105 { 91 106 struct ucsi_acpi *ua = ucsi_get_drvdata(ucsi); ··· 116 101 .read_cci = ucsi_acpi_read_cci, 117 102 .poll_cci = ucsi_acpi_poll_cci, 118 103 .read_message_in = ucsi_acpi_read_message_in, 104 + .write_message_out = ucsi_acpi_write_message_out, 119 105 .sync_control = ucsi_sync_control_common, 120 106 .async_control = ucsi_acpi_async_control 121 107 };