Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b6fe3977 authored by Ezequiel Garcia's avatar Ezequiel Garcia Committed by Mark Brown
Browse files

spi: img-spfi: Implement a prepare_message() callback



In preparation for switching to using the SPI core's CS GPIO handling,
move setup of the PORT_STATE register, which must be configured before
CS is asserted, to a prepare_message() callback.

Signed-off-by: default avatarEzequiel Garcia <ezequiel.garcia@imgtec.com>
Signed-off-by: default avatarAndrew Bresticker <abrestic@chromium.org>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 6e0050ec
Loading
Loading
Loading
Loading
+20 −12
Original line number Diff line number Diff line
@@ -396,6 +396,25 @@ static int img_spfi_start_dma(struct spi_master *master,
	return -EIO;
}

static int img_spfi_prepare(struct spi_master *master, struct spi_message *msg)
{
	struct img_spfi *spfi = spi_master_get_devdata(master);
	u32 val;

	val = spfi_readl(spfi, SPFI_PORT_STATE);
	if (msg->spi->mode & SPI_CPHA)
		val |= SPFI_PORT_STATE_CK_PHASE(msg->spi->chip_select);
	else
		val &= ~SPFI_PORT_STATE_CK_PHASE(msg->spi->chip_select);
	if (msg->spi->mode & SPI_CPOL)
		val |= SPFI_PORT_STATE_CK_POL(msg->spi->chip_select);
	else
		val &= ~SPFI_PORT_STATE_CK_POL(msg->spi->chip_select);
	spfi_writel(spfi, val, SPFI_PORT_STATE);

	return 0;
}

static void img_spfi_config(struct spi_master *master, struct spi_device *spi,
			    struct spi_transfer *xfer)
{
@@ -433,18 +452,6 @@ static void img_spfi_config(struct spi_master *master, struct spi_device *spi,
					      &master->cur_msg->transfers))
		val |= SPFI_CONTROL_CONTINUE;
	spfi_writel(spfi, val, SPFI_CONTROL);

	val = spfi_readl(spfi, SPFI_PORT_STATE);
	if (spi->mode & SPI_CPHA)
		val |= SPFI_PORT_STATE_CK_PHASE(spi->chip_select);
	else
		val &= ~SPFI_PORT_STATE_CK_PHASE(spi->chip_select);
	if (spi->mode & SPI_CPOL)
		val |= SPFI_PORT_STATE_CK_POL(spi->chip_select);
	else
		val &= ~SPFI_PORT_STATE_CK_POL(spi->chip_select);
	spfi_writel(spfi, val, SPFI_PORT_STATE);

	spfi_writel(spfi, xfer->len << SPFI_TRANSACTION_TSIZE_SHIFT,
		    SPFI_TRANSACTION);
}
@@ -591,6 +598,7 @@ static int img_spfi_probe(struct platform_device *pdev)

	master->set_cs = img_spfi_set_cs;
	master->transfer_one = img_spfi_transfer_one;
	master->prepare_message = img_spfi_prepare;

	spfi->tx_ch = dma_request_slave_channel(spfi->dev, "tx");
	spfi->rx_ch = dma_request_slave_channel(spfi->dev, "rx");