Commit 99f24aea authored by Mahesh Mahadevan's avatar Mahesh Mahadevan Committed by Maureen Helm
Browse files

MCUX Flexcomm SPI: Add Slave support



Add support for Slave mode in the mcux flexcomm spi driver

Signed-off-by: default avatarMahesh Mahadevan <mahesh.mahadevan@nxp.com>
parent 63e85826
Loading
Loading
Loading
Loading
+72 −36
Original line number Diff line number Diff line
@@ -102,7 +102,7 @@ static void spi_mcux_isr(void *arg)
	SPI_MasterTransferHandleIRQ(base, &data->handle);
}

static void spi_mcux_master_transfer_callback(SPI_Type *base,
static void spi_mcux_transfer_callback(SPI_Type *base,
		spi_master_handle_t *handle, status_t status, void *userData)
{
	struct device *dev = userData;
@@ -120,7 +120,6 @@ static int spi_mcux_configure(struct device *dev,
	const struct spi_mcux_config *config = dev->config;
	struct spi_mcux_data *data = dev->data;
	SPI_Type *base = config->base;
	spi_master_config_t master_config;
	uint32_t clock_freq;
	uint32_t word_size;

@@ -129,6 +128,20 @@ static int spi_mcux_configure(struct device *dev,
		return 0;
	}

	word_size = SPI_WORD_SIZE_GET(spi_cfg->operation);
	if (word_size > SPI_MAX_DATA_WIDTH) {
		LOG_ERR("Word size %d is greater than %d",
			    word_size, SPI_MAX_DATA_WIDTH);
		return -EINVAL;
	}

	/*
	 * Do master or slave initializastion, depending on the
	 * mode requested.
	 */
	if (SPI_OP_MODE_GET(spi_cfg->operation) == SPI_OP_MODE_MASTER) {
		spi_master_config_t master_config;

		SPI_MasterGetDefaultConfig(&master_config);

		if (spi_cfg->slave > SPI_CHIP_SELECT_COUNT) {
@@ -137,13 +150,6 @@ static int spi_mcux_configure(struct device *dev,
			return -EINVAL;
		}

	word_size = SPI_WORD_SIZE_GET(spi_cfg->operation);
	if (word_size > SPI_MAX_DATA_WIDTH) {
		LOG_ERR("Word size %d is greater than %d",
			    word_size, SPI_MAX_DATA_WIDTH);
		return -EINVAL;
	}

		master_config.sselNum = spi_cfg->slave;
		master_config.sselPol = kSPI_SpolActiveAllLow;
		master_config.dataWidth = word_size - 1;
@@ -174,12 +180,42 @@ static int spi_mcux_configure(struct device *dev,
		SPI_MasterInit(base, &master_config, clock_freq);

		SPI_MasterTransferCreateHandle(base, &data->handle,
				       spi_mcux_master_transfer_callback, dev);
					       spi_mcux_transfer_callback, dev);

		SPI_SetDummyData(base, 0);

	data->ctx.config = spi_cfg;
		spi_context_cs_configure(&data->ctx);
	} else {
		spi_slave_config_t slave_config;

		SPI_SlaveGetDefaultConfig(&slave_config);

		slave_config.polarity =
			(SPI_MODE_GET(spi_cfg->operation) & SPI_MODE_CPOL)
			? kSPI_ClockPolarityActiveLow
			: kSPI_ClockPolarityActiveHigh;

		slave_config.phase =
			(SPI_MODE_GET(spi_cfg->operation) & SPI_MODE_CPHA)
			? kSPI_ClockPhaseSecondEdge
			: kSPI_ClockPhaseFirstEdge;

		slave_config.direction =
			(spi_cfg->operation & SPI_TRANSFER_LSB)
			? kSPI_LsbFirst
			: kSPI_MsbFirst;

		/* SS pin active low */
		slave_config.sselPol = kSPI_SpolActiveAllLow;
		slave_config.dataWidth = word_size - 1;

		SPI_SlaveInit(base, &slave_config);

		SPI_SlaveTransferCreateHandle(base, &data->handle,
					      spi_mcux_transfer_callback, dev);
	}

	data->ctx.config = spi_cfg;

	return 0;
}