diff options
author | Ezequiel Garcia <ezequiel.garcia@imgtec.com> | 2015-04-06 17:29:04 -0400 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2015-04-07 07:17:54 -0400 |
commit | b6fe39770aa63d14129bc7e061c95cfc3cb1419a (patch) | |
tree | 88c0c91755c5d0ced3259d3728a0d2a985934aff /drivers/spi/spi-img-spfi.c | |
parent | 6e0050ec8e909a5ed7d062552cd4fd223d286687 (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.c | 32 |
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 | ||
399 | static 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 | |||
399 | static void img_spfi_config(struct spi_master *master, struct spi_device *spi, | 418 | static 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"); |