static void completed(struct device *dev, int error) { struct spi_dw_config *info = dev->config->config_info; struct spi_dw_data *spi = dev->driver_data; if (error) { goto out; } if (spi->fifo_diff || !((spi->tx_buf && !spi->tx_buf_len && !spi->rx_buf) || (spi->rx_buf && !spi->rx_buf_len && !spi->tx_buf) || (spi->tx_buf && !spi->tx_buf_len && spi->rx_buf && !spi->rx_buf_len))) { return; } out: spi->error = error; /* Disabling interrupts */ write_imr(DW_SPI_IMR_MASK, info->regs); /* Disabling the controller */ clear_bit_ssienr(info->regs); _spi_control_cs(dev, 0); DBG("SPI transaction completed %s error\n", error ? "with" : "without"); device_sync_call_complete(&spi->sync); }
int spi_dw_init(struct device *dev) { struct spi_dw_config *info = dev->config->config_info; struct spi_dw_data *spi = dev->driver_data; _clock_config(dev); _clock_on(dev); #ifndef CONFIG_SOC_QUARK_SE_SS if (read_ssi_comp_version(info->regs) != DW_SSI_COMP_VERSION) { _clock_off(dev); return DEV_NOT_CONFIG; } #endif dev->driver_api = &dw_spi_api; info->config_func(); device_sync_call_init(&spi->sync); _spi_config_cs(dev); /* Masking interrupt and making sure controller is disabled */ write_imr(DW_SPI_IMR_MASK, info->regs); clear_bit_ssienr(info->regs); DBG("Designware SPI driver initialized on device: %p\n", dev); return DEV_OK; }
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 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; } /* * There are several situations here. * 1. spi_write w rx_buf - need last_tx && rx_buf_len zero to be done. * 2. spi_write w/o rx_buf - only need to determine when write is done. * 3. spi_read - need rx_buf_len zero. */ if (spi->tx_buf && spi->rx_buf) { if (!spi->last_tx || spi->rx_buf_len) { return; } } else if (spi->tx_buf) { if (!spi->last_tx) { return; } } else { /* or, spi->rx_buf!=0 */ if (spi->rx_buf_len) { return; } } out: /* need to give time for FIFOs to drain before issuing more commands */ while (test_bit_sr_busy(info->regs)) { } spi->error = error; /* Disabling interrupts */ write_imr(DW_SPI_IMR_MASK, info->regs); /* Disabling the controller */ clear_bit_ssienr(info->regs); _spi_control_cs(dev, 0); SYS_LOG_DBG("SPI transaction completed %s error", error ? "with" : "without"); k_sem_give(&spi->device_sync_sem); }
int spi_dw_init(struct device *dev) { const struct spi_dw_config *info = dev->config->config_info; struct spi_dw_data *spi = dev->driver_data; _clock_config(dev); _clock_on(dev); info->config_func(); /* Masking interrupt and making sure controller is disabled */ write_imr(DW_SPI_IMR_MASK, info->regs); clear_bit_ssienr(info->regs); LOG_DBG("Designware SPI driver initialized on device: %p", dev); spi_context_unlock_unconditionally(&spi->ctx); return 0; }
int spi_dw_init(struct device *dev) { const struct spi_dw_config *info = dev->config->config_info; struct spi_dw_data *spi = dev->driver_data; _clock_config(dev); _clock_on(dev); info->config_func(); k_sem_init(&spi->device_sync_sem, 0, UINT_MAX); _spi_config_cs(dev); /* Masking interrupt and making sure controller is disabled */ write_imr(DW_SPI_IMR_MASK, info->regs); clear_bit_ssienr(info->regs); SYS_LOG_DBG("Designware SPI driver initialized on device: %p", dev); return 0; }