aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/spi/davinci_spi.c
diff options
context:
space:
mode:
authorBrian Niebuhr <bniebuhr@efjohnson.com>2010-08-12 02:57:33 -0400
committerSekhar Nori <nsekhar@ti.com>2010-11-18 08:08:24 -0500
commitcfbc5d1d8fda9d337e912a03502cf77d29870a8e (patch)
tree847a5d9426e69a18c5fff666d8a507ab737f9bec /drivers/spi/davinci_spi.c
parent7978b8c385a86f0b5b9304e81a1dfb5dcaf21528 (diff)
spi: davinci: remove unnecessary data transmit on CS disable
On TI DaVinci's SPI controller, the SPIDAT1 register which controls the chip slect status, also has data transmit register in the lower 16 bits. Writing to the whole 32-bits triggers an additional data transmit every time the chip select is disabled. While most SPI slaves cope-up with this, some cannot. This patch fixes this by doing a 16-bit write on the upper half of the SPIDAT1 register While at it, group the SPIGCR1 register related defines seperately from SPIDAT1 register defines. Signed-off-by: Brian Niebuhr <bniebuhr@efjohnson.com> Tested-By: Michael Williamson <michael.williamson@criticallink.com> Signed-off-by: Sekhar Nori <nsekhar@ti.com>
Diffstat (limited to 'drivers/spi/davinci_spi.c')
-rw-r--r--drivers/spi/davinci_spi.c20
1 files changed, 8 insertions, 12 deletions
diff --git a/drivers/spi/davinci_spi.c b/drivers/spi/davinci_spi.c
index 105c686b2cea..82dddf83daf7 100644
--- a/drivers/spi/davinci_spi.c
+++ b/drivers/spi/davinci_spi.c
@@ -65,9 +65,10 @@
65#define SPI_INTLVL_1 0x000001FFu 65#define SPI_INTLVL_1 0x000001FFu
66#define SPI_INTLVL_0 0x00000000u 66#define SPI_INTLVL_0 0x00000000u
67 67
68/* SPIDAT1 */ 68/* SPIDAT1 (upper 16 bit defines) */
69#define SPIDAT1_CSHOLD_MASK BIT(28) 69#define SPIDAT1_CSHOLD_MASK BIT(12)
70#define SPIDAT1_CSNR_SHIFT 16 70
71/* SPIGCR1 */
71#define SPIGCR1_CLKMOD_MASK BIT(1) 72#define SPIGCR1_CLKMOD_MASK BIT(1)
72#define SPIGCR1_MASTER_MASK BIT(0) 73#define SPIGCR1_MASTER_MASK BIT(0)
73#define SPIGCR1_LOOPBACK_MASK BIT(16) 74#define SPIGCR1_LOOPBACK_MASK BIT(16)
@@ -235,8 +236,8 @@ static void davinci_spi_chipselect(struct spi_device *spi, int value)
235{ 236{
236 struct davinci_spi *davinci_spi; 237 struct davinci_spi *davinci_spi;
237 struct davinci_spi_platform_data *pdata; 238 struct davinci_spi_platform_data *pdata;
238 u32 data1_reg_val;
239 u8 chip_sel = spi->chip_select; 239 u8 chip_sel = spi->chip_select;
240 u16 spidat1_cfg = CS_DEFAULT;
240 241
241 davinci_spi = spi_master_get_devdata(spi->master); 242 davinci_spi = spi_master_get_devdata(spi->master);
242 pdata = davinci_spi->pdata; 243 pdata = davinci_spi->pdata;
@@ -245,17 +246,12 @@ static void davinci_spi_chipselect(struct spi_device *spi, int value)
245 * Board specific chip select logic decides the polarity and cs 246 * Board specific chip select logic decides the polarity and cs
246 * line for the controller 247 * line for the controller
247 */ 248 */
248 data1_reg_val = CS_DEFAULT << SPIDAT1_CSNR_SHIFT;
249 if (value == BITBANG_CS_ACTIVE) { 249 if (value == BITBANG_CS_ACTIVE) {
250 data1_reg_val |= SPIDAT1_CSHOLD_MASK; 250 spidat1_cfg |= SPIDAT1_CSHOLD_MASK;
251 data1_reg_val &= ~((0x1 << chip_sel) << SPIDAT1_CSNR_SHIFT); 251 spidat1_cfg &= ~(0x1 << chip_sel);
252 } 252 }
253 253
254 iowrite32(data1_reg_val, davinci_spi->base + SPIDAT1); 254 iowrite16(spidat1_cfg, davinci_spi->base + SPIDAT1 + 2);
255 while ((ioread32(davinci_spi->base + SPIBUF)
256 & SPIBUF_RXEMPTY_MASK) == 0)
257 cpu_relax();
258
259} 255}
260 256
261/** 257/**