Commit db002863 authored by Pooja Katiyar's avatar Pooja Katiyar Committed by Greg Kroah-Hartman
Browse files

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: default avatarHeikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: default avatarPooja Katiyar <pooja.katiyar@intel.com>
Link: https://patch.msgid.link/5bb1f367e44c9fc5244c3e10e513f02d62fe8166.1761773881.git.pooja.katiyar@intel.com


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 3e082978
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -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;
+2 −0
Original line number Diff line number Diff line
@@ -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,
+16 −0
Original line number Diff line number Diff line
@@ -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
};