firmware: ti_sci: Support transfers without response

Check the header flags if an response is expected or not. If it is not
expected skip the receive part of ti_sci_do_xfer(). This prepares the
driver for one-way messages as prepare_sleep for Partial-IO.

Reviewed-by: Kendall Willis <k-willis@ti.com>
Signed-off-by: Markus Schneider-Pargmann (TI.com) <msp@baylibre.com>
Reviewed-by: Dhruva Gole <d-gole@ti.com>
Reviewed-by: Sebin Francis <sebin.francis@ti.com>
Link: https://patch.msgid.link/20251103-topic-am62-partialio-v6-12-b4-v10-1-0557e858d747@baylibre.com
Signed-off-by: Nishanth Menon <nm@ti.com>
This commit is contained in:
Markus Schneider-Pargmann (TI.com) 2025-11-03 13:42:19 +01:00 committed by Nishanth Menon
parent 999e9bc953
commit 170a3ef605
1 changed files with 5 additions and 2 deletions

View File

@ -398,6 +398,9 @@ static void ti_sci_put_one_xfer(struct ti_sci_xfers_info *minfo,
static inline int ti_sci_do_xfer(struct ti_sci_info *info, static inline int ti_sci_do_xfer(struct ti_sci_info *info,
struct ti_sci_xfer *xfer) struct ti_sci_xfer *xfer)
{ {
struct ti_sci_msg_hdr *hdr = (struct ti_sci_msg_hdr *)xfer->tx_message.buf;
bool response_expected = !!(hdr->flags & (TI_SCI_FLAG_REQ_ACK_ON_PROCESSED |
TI_SCI_FLAG_REQ_ACK_ON_RECEIVED));
int ret; int ret;
int timeout; int timeout;
struct device *dev = info->dev; struct device *dev = info->dev;
@ -409,12 +412,12 @@ static inline int ti_sci_do_xfer(struct ti_sci_info *info,
ret = 0; ret = 0;
if (system_state <= SYSTEM_RUNNING) { if (response_expected && system_state <= SYSTEM_RUNNING) {
/* And we wait for the response. */ /* And we wait for the response. */
timeout = msecs_to_jiffies(info->desc->max_rx_timeout_ms); timeout = msecs_to_jiffies(info->desc->max_rx_timeout_ms);
if (!wait_for_completion_timeout(&xfer->done, timeout)) if (!wait_for_completion_timeout(&xfer->done, timeout))
ret = -ETIMEDOUT; ret = -ETIMEDOUT;
} else { } else if (response_expected) {
/* /*
* If we are !running, we cannot use wait_for_completion_timeout * If we are !running, we cannot use wait_for_completion_timeout
* during noirq phase, so we must manually poll the completion. * during noirq phase, so we must manually poll the completion.