summaryrefslogtreecommitdiffstats
path: root/drivers/spi/spi-img-spfi.c
diff options
context:
space:
mode:
authorEzequiel Garcia <ezequiel.garcia@imgtec.com>2015-04-06 17:29:04 -0400
committerMark Brown <broonie@kernel.org>2015-04-07 07:17:54 -0400
commitb6fe39770aa63d14129bc7e061c95cfc3cb1419a (patch)
tree88c0c91755c5d0ced3259d3728a0d2a985934aff /drivers/spi/spi-img-spfi.c
parent6e0050ec8e909a5ed7d062552cd4fd223d286687 (diff)
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: Ezequiel Garcia <ezequiel.garcia@imgtec.com> Signed-off-by: Andrew Bresticker <abrestic@chromium.org> Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'drivers/spi/spi-img-spfi.c')
-rw-r--r--drivers/spi/spi-img-spfi.c32
1 files changed, 20 insertions, 12 deletions
diff --git a/drivers/spi/spi-img-spfi.c b/drivers/spi/spi-img-spfi.c
index fde4b5dd40f2..642259e88429 100644
--- a/drivers/spi/spi-img-spfi.c
+++ b/drivers/spi/spi-img-spfi.c
@@ -396,6 +396,25 @@ stop_dma:
396 return -EIO; 396 return -EIO;
397} 397}
398 398
399static int img_spfi_prepare(struct spi_master *master, struct spi_message *msg)
400{
401 struct img_spfi *spfi = spi_master_get_devdata(master);
402 u32 val;
403
404 val = spfi_readl(spfi, SPFI_PORT_STATE);
405 if (msg->spi->mode & SPI_CPHA)
406 val |= SPFI_PORT_STATE_CK_PHASE(msg->spi->chip_select);
407 else
408 val &= ~SPFI_PORT_STATE_CK_PHASE(msg->spi->chip_select);
409 if (msg->spi->mode & SPI_CPOL)
410 val |= SPFI_PORT_STATE_CK_POL(msg->spi->chip_select);
411 else
412 val &= ~SPFI_PORT_STATE_CK_POL(msg->spi->chip_select);
413 spfi_writel(spfi, val, SPFI_PORT_STATE);
414
415 return 0;
416}
417
399static void img_spfi_config(struct spi_master *master, struct spi_device *spi, 418static void img_spfi_config(struct spi_master *master, struct spi_device *spi,
400 struct spi_transfer *xfer) 419 struct spi_transfer *xfer)
401{ 420{
@@ -433,18 +452,6 @@ static void img_spfi_config(struct spi_master *master, struct spi_device *spi,
433 &master->cur_msg->transfers)) 452 &master->cur_msg->transfers))
434 val |= SPFI_CONTROL_CONTINUE; 453 val |= SPFI_CONTROL_CONTINUE;
435 spfi_writel(spfi, val, SPFI_CONTROL); 454 spfi_writel(spfi, val, SPFI_CONTROL);
436
437 val = spfi_readl(spfi, SPFI_PORT_STATE);
438 if (spi->mode & SPI_CPHA)
439 val |= SPFI_PORT_STATE_CK_PHASE(spi->chip_select);
440 else
441 val &= ~SPFI_PORT_STATE_CK_PHASE(spi->chip_select);
442 if (spi->mode & SPI_CPOL)
443 val |= SPFI_PORT_STATE_CK_POL(spi->chip_select);
444 else
445 val &= ~SPFI_PORT_STATE_CK_POL(spi->chip_select);
446 spfi_writel(spfi, val, SPFI_PORT_STATE);
447
448 spfi_writel(spfi, xfer->len << SPFI_TRANSACTION_TSIZE_SHIFT, 455 spfi_writel(spfi, xfer->len << SPFI_TRANSACTION_TSIZE_SHIFT,
449 SPFI_TRANSACTION); 456 SPFI_TRANSACTION);
450} 457}
@@ -591,6 +598,7 @@ static int img_spfi_probe(struct platform_device *pdev)
591 598
592 master->set_cs = img_spfi_set_cs; 599 master->set_cs = img_spfi_set_cs;
593 master->transfer_one = img_spfi_transfer_one; 600 master->transfer_one = img_spfi_transfer_one;
601 master->prepare_message = img_spfi_prepare;
594 602
595 spfi->tx_ch = dma_request_slave_channel(spfi->dev, "tx"); 603 spfi->tx_ch = dma_request_slave_channel(spfi->dev, "tx");
596 spfi->rx_ch = dma_request_slave_channel(spfi->dev, "rx"); 604 spfi->rx_ch = dma_request_slave_channel(spfi->dev, "rx");