|
|
|
From 905ee06a9966113fe51d6bad1819759cb30fd0bd Mon Sep 17 00:00:00 2001
|
|
|
|
From: Ionela Voinescu <ionela.voinescu@imgtec.com>
|
|
|
|
Date: Tue, 9 Feb 2016 10:18:31 +0000
|
|
|
|
Subject: spi: img-spfi: use device 0 configuration for all devices
|
|
|
|
|
|
|
|
Given that we control the chip select line externally
|
|
|
|
we can use only one parameter register (device 0 parameter
|
|
|
|
register) and one set of configuration bits (port configuration
|
|
|
|
bits for device 0) for all devices (all chip select lines).
|
|
|
|
|
|
|
|
Signed-off-by: Ionela Voinescu <ionela.voinescu@imgtec.com>
|
|
|
|
---
|
|
|
|
drivers/spi/spi-img-spfi.c | 23 ++++++++++++++++-------
|
|
|
|
1 file changed, 16 insertions(+), 7 deletions(-)
|
|
|
|
|
|
|
|
--- a/drivers/spi/spi-img-spfi.c
|
|
|
|
+++ b/drivers/spi/spi-img-spfi.c
|
|
|
|
@@ -437,18 +437,23 @@ static int img_spfi_prepare(struct spi_m
|
|
|
|
struct img_spfi *spfi = spi_master_get_devdata(master);
|
|
|
|
u32 val;
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * The chip select line is controlled externally so
|
|
|
|
+ * we can use the CS0 configuration for all devices
|
|
|
|
+ */
|
|
|
|
val = spfi_readl(spfi, SPFI_PORT_STATE);
|
|
|
|
+
|
|
|
|
+ /* 0 for device selection */
|
|
|
|
val &= ~(SPFI_PORT_STATE_DEV_SEL_MASK <<
|
|
|
|
SPFI_PORT_STATE_DEV_SEL_SHIFT);
|
|
|
|
- val |= msg->spi->chip_select << SPFI_PORT_STATE_DEV_SEL_SHIFT;
|
|
|
|
if (msg->spi->mode & SPI_CPHA)
|
|
|
|
- val |= SPFI_PORT_STATE_CK_PHASE(msg->spi->chip_select);
|
|
|
|
+ val |= SPFI_PORT_STATE_CK_PHASE(0);
|
|
|
|
else
|
|
|
|
- val &= ~SPFI_PORT_STATE_CK_PHASE(msg->spi->chip_select);
|
|
|
|
+ val &= ~SPFI_PORT_STATE_CK_PHASE(0);
|
|
|
|
if (msg->spi->mode & SPI_CPOL)
|
|
|
|
- val |= SPFI_PORT_STATE_CK_POL(msg->spi->chip_select);
|
|
|
|
+ val |= SPFI_PORT_STATE_CK_POL(0);
|
|
|
|
else
|
|
|
|
- val &= ~SPFI_PORT_STATE_CK_POL(msg->spi->chip_select);
|
|
|
|
+ val &= ~SPFI_PORT_STATE_CK_POL(0);
|
|
|
|
spfi_writel(spfi, val, SPFI_PORT_STATE);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
@@ -548,11 +553,15 @@ static void img_spfi_config(struct spi_m
|
|
|
|
div = DIV_ROUND_UP(clk_get_rate(spfi->spfi_clk), xfer->speed_hz);
|
|
|
|
div = clamp(512 / (1 << get_count_order(div)), 1, 128);
|
|
|
|
|
|
|
|
- val = spfi_readl(spfi, SPFI_DEVICE_PARAMETER(spi->chip_select));
|
|
|
|
+ /*
|
|
|
|
+ * The chip select line is controlled externally so
|
|
|
|
+ * we can use the CS0 parameters for all devices
|
|
|
|
+ */
|
|
|
|
+ val = spfi_readl(spfi, SPFI_DEVICE_PARAMETER(0));
|
|
|
|
val &= ~(SPFI_DEVICE_PARAMETER_BITCLK_MASK <<
|
|
|
|
SPFI_DEVICE_PARAMETER_BITCLK_SHIFT);
|
|
|
|
val |= div << SPFI_DEVICE_PARAMETER_BITCLK_SHIFT;
|
|
|
|
- spfi_writel(spfi, val, SPFI_DEVICE_PARAMETER(spi->chip_select));
|
|
|
|
+ spfi_writel(spfi, val, SPFI_DEVICE_PARAMETER(0));
|
|
|
|
|
|
|
|
if (!list_is_last(&xfer->transfer_list, &master->cur_msg->transfers) &&
|
|
|
|
/*
|