static void completed(struct device *dev, int error) { const struct spi_dw_config *info = dev->config->config_info; struct spi_dw_data *spi = dev->driver_data; if (error) { goto out; } if (spi_context_tx_on(&spi->ctx) || spi_context_rx_on(&spi->ctx)) { return; } out: /* need to give time for FIFOs to drain before issuing more commands */ while (test_bit_sr_busy(info->regs)) { } /* Disabling interrupts */ write_imr(DW_SPI_IMR_MASK, info->regs); /* Disabling the controller */ clear_bit_ssienr(info->regs); spi_context_cs_control(&spi->ctx, false); LOG_DBG("SPI transaction completed %s error", error ? "with" : "without"); spi_context_complete(&spi->ctx, error); }
static void prepare_for_transfer(struct device *dev) { struct spi_nrfx_data *dev_data = get_dev_data(dev); const struct spi_nrfx_config *dev_config = get_dev_config(dev); struct spi_context *ctx = &dev_data->ctx; int status; size_t buf_len = spi_context_longest_current_buf(ctx); if (buf_len > 0) { nrfx_err_t result; if (buf_len > dev_config->max_buf_len) { buf_len = dev_config->max_buf_len; } result = nrfx_spis_buffers_set( &dev_config->spis, ctx->tx_buf, spi_context_tx_buf_on(ctx) ? buf_len : 0, ctx->rx_buf, spi_context_rx_buf_on(ctx) ? buf_len : 0); if (result == NRFX_SUCCESS) { return; } /* Cannot prepare for transfer. */ status = -EIO; } else { /* Zero-length buffer provided. */ status = 0; } spi_context_complete(ctx, status); }
static void spi_stm32_complete(struct spi_stm32_data *data, SPI_TypeDef *spi, int status) { #ifdef CONFIG_SPI_STM32_INTERRUPT LL_SPI_DisableIT_TXE(spi); LL_SPI_DisableIT_RXNE(spi); LL_SPI_DisableIT_ERR(spi); #endif spi_context_cs_control(&data->ctx, false); #if defined(CONFIG_SOC_SERIES_STM32L4X) || defined(CONFIG_SOC_SERIES_STM32F3X) /* Flush RX buffer */ while (LL_SPI_IsActiveFlag_RXNE(spi)) { (void) LL_SPI_ReceiveData8(spi); } #endif if (LL_SPI_GetMode(spi) == LL_SPI_MODE_MASTER) { while (LL_SPI_IsActiveFlag_BSY(spi)) { /* NOP */ } } LL_SPI_Disable(spi); #ifdef CONFIG_SPI_STM32_INTERRUPT spi_context_complete(&data->ctx, status); #endif }
static void event_handler(const nrfx_spis_evt_t *p_event, void *p_context) { struct device *dev = p_context; struct spi_nrfx_data *dev_data = get_dev_data(dev); if (p_event->evt_type == NRFX_SPIS_XFER_DONE) { spi_context_complete(&dev_data->ctx, p_event->rx_amount); } }