Skip to content

Commit db00286

Browse files
pakatiyargregkh
authored andcommitted
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>
1 parent 3e08297 commit db00286

3 files changed

Lines changed: 32 additions & 0 deletions

File tree

drivers/usb/typec/ucsi/ucsi.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,20 @@ int ucsi_sync_control_common(struct ucsi *ucsi, u64 command, u32 *cci)
6767

6868
reinit_completion(&ucsi->complete);
6969

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+
7084
ret = ucsi->ops->async_control(ucsi, command);
7185
if (ret)
7286
goto out_clear_bit;

drivers/usb/typec/ucsi/ucsi.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ struct dentry;
6969
* @read_cci: Read CCI register
7070
* @poll_cci: Read CCI register while polling with notifications disabled
7171
* @read_message_in: Read message data from UCSI
72+
* @write_message_out: Write message data to UCSI
7273
* @sync_control: Blocking control operation
7374
* @async_control: Non-blocking control operation
7475
* @update_altmodes: Squashes duplicate DP altmodes
@@ -84,6 +85,7 @@ struct ucsi_operations {
8485
int (*read_cci)(struct ucsi *ucsi, u32 *cci);
8586
int (*poll_cci)(struct ucsi *ucsi, u32 *cci);
8687
int (*read_message_in)(struct ucsi *ucsi, void *val, size_t val_len);
88+
int (*write_message_out)(struct ucsi *ucsi, void *data, size_t data_len);
8789
int (*sync_control)(struct ucsi *ucsi, u64 command, u32 *cci);
8890
int (*async_control)(struct ucsi *ucsi, u64 command);
8991
bool (*update_altmodes)(struct ucsi *ucsi, u8 recipient,

drivers/usb/typec/ucsi/ucsi_acpi.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,21 @@ static int ucsi_acpi_read_message_in(struct ucsi *ucsi, void *val, size_t val_le
8686
return 0;
8787
}
8888

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+
89104
static int ucsi_acpi_async_control(struct ucsi *ucsi, u64 command)
90105
{
91106
struct ucsi_acpi *ua = ucsi_get_drvdata(ucsi);
@@ -101,6 +116,7 @@ static const struct ucsi_operations ucsi_acpi_ops = {
101116
.read_cci = ucsi_acpi_read_cci,
102117
.poll_cci = ucsi_acpi_poll_cci,
103118
.read_message_in = ucsi_acpi_read_message_in,
119+
.write_message_out = ucsi_acpi_write_message_out,
104120
.sync_control = ucsi_sync_control_common,
105121
.async_control = ucsi_acpi_async_control
106122
};

0 commit comments

Comments
 (0)