drivers: spi_context: Do not use transfer timeout in slave mode

Do not use any timeout in the slave mode, as in this case it is not
known when the transfer will actually start and what the frequency
will be.

Signed-off-by: Andrzej Głąbek <andrzej.glabek@nordicsemi.no>
This commit is contained in:
Andrzej Głąbek 2021-10-27 15:57:08 +02:00 committed by Carles Cufí
commit 3489ca9da2

View file

@ -128,22 +128,34 @@ static inline void spi_context_release(struct spi_context *ctx, int status)
static inline int spi_context_wait_for_completion(struct spi_context *ctx)
{
int status = 0;
k_timeout_t timeout;
/* Do not use any timeout in the slave mode, as in this case it is not
* known when the transfer will actually start and what the frequency
* will be.
*/
if (IS_ENABLED(CONFIG_SPI_SLAVE) && spi_context_is_slave(ctx)) {
timeout = K_FOREVER;
} else {
uint32_t timeout_ms;
timeout_ms = MAX(ctx->tx_len, ctx->rx_len) * 8 * 1000 /
ctx->config->frequency;
timeout_ms += CONFIG_SPI_COMPLETION_TIMEOUT_TOLERANCE;
timeout = K_MSEC(timeout_ms);
}
#ifdef CONFIG_SPI_ASYNC
if (!ctx->asynchronous) {
if (k_sem_take(&ctx->sync, K_MSEC(timeout_ms))) {
if (k_sem_take(&ctx->sync, timeout)) {
LOG_ERR("Timeout waiting for transfer complete");
return -ETIMEDOUT;
}
status = ctx->sync_status;
}
#else
if (k_sem_take(&ctx->sync, K_MSEC(timeout_ms))) {
if (k_sem_take(&ctx->sync, timeout)) {
LOG_ERR("Timeout waiting for transfer complete");
return -ETIMEDOUT;
}