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) static inline int spi_context_wait_for_completion(struct spi_context *ctx)
{ {
int status = 0; int status = 0;
uint32_t timeout_ms; k_timeout_t timeout;
timeout_ms = MAX(ctx->tx_len, ctx->rx_len) * 8 * 1000 / /* Do not use any timeout in the slave mode, as in this case it is not
ctx->config->frequency; * known when the transfer will actually start and what the frequency
timeout_ms += CONFIG_SPI_COMPLETION_TIMEOUT_TOLERANCE; * 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 #ifdef CONFIG_SPI_ASYNC
if (!ctx->asynchronous) { 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"); LOG_ERR("Timeout waiting for transfer complete");
return -ETIMEDOUT; return -ETIMEDOUT;
} }
status = ctx->sync_status; status = ctx->sync_status;
} }
#else #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"); LOG_ERR("Timeout waiting for transfer complete");
return -ETIMEDOUT; return -ETIMEDOUT;
} }