Use the spi_slave bus and cs attributes, reduce C2T/T2C delays,
allow overriding of spi_cs_is_valid().

As it is, this patch breaks the configuration files for DaVinci boards
that only use SPI1.

Signed-off-by: Jérôme Carretero <c...@zougloub.eu>
CC: Manjunathappa, Prakash <prakash...@ti.com>
--
 drivers/spi/davinci_spi.c |   16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/drivers/spi/davinci_spi.c b/drivers/spi/davinci_spi.c
index 13aca52..74f385e 100644
--- a/drivers/spi/davinci_spi.c
+++ b/drivers/spi/davinci_spi.c
@@ -23,6 +23,9 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  * MA 02111-1307 USA
+ *
+ * References: SPRUH77 Chapter 30
+ *
  */
 #include <common.h>
 #include <spi.h>
@@ -50,7 +53,7 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned 
int cs,
 
        ds->slave.bus = bus;
        ds->slave.cs = cs;
-       ds->regs = (struct davinci_spi_regs *)CONFIG_SYS_SPI_BASE;
+       ds->regs = (struct davinci_spi_regs *)(bus == 0 ? DAVINCI_SPI0_BASE : 
DAVINCI_SPI1_BASE);
        ds->freq = max_hz;
 
        return &ds->slave;
@@ -67,6 +70,7 @@ int spi_claim_bus(struct spi_slave *slave)
 {
        struct davinci_spi_slave *ds = to_davinci_spi(slave);
        unsigned int scalar;
+       unsigned int cs;
 
        /* Enable the SPI hardware */
        writel(SPIGCR0_SPIRST_MASK, &ds->regs->gcr0);
@@ -76,8 +80,9 @@ int spi_claim_bus(struct spi_slave *slave)
        /* Set master mode, powered up and not activated */
        writel(SPIGCR1_MASTER_MASK | SPIGCR1_CLKMOD_MASK, &ds->regs->gcr1);
 
+       cs = BIT(slave->cs); /* SPIPC0_EN0FUN_MASK ... */
        /* CS, CLK, SIMO and SOMI are functional pins */
-       writel((SPIPC0_EN0FUN_MASK | SPIPC0_CLKFUN_MASK |
+       writel((cs | SPIPC0_CLKFUN_MASK |
                SPIPC0_DOFUN_MASK | SPIPC0_DIFUN_MASK), &ds->regs->pc0);
 
        /* setup format */
@@ -97,11 +102,11 @@ int spi_claim_bus(struct spi_slave *slave)
         * Including a minor delay. No science here. Should be good even with
         * no delay
         */
-       writel((50 << SPI_C2TDELAY_SHIFT) |
-               (50 << SPI_T2CDELAY_SHIFT), &ds->regs->delay);
+       writel((10 << SPI_C2TDELAY_SHIFT) |
+               (10 << SPI_T2CDELAY_SHIFT), &ds->regs->delay);
 
        /* default chip select register */
-       writel(SPIDEF_CSDEF0_MASK, &ds->regs->def);
+       writel(cs, &ds->regs->def);
 
        /* no interrupts */
        writel(0, &ds->regs->int0);
@@ -280,6 +285,7 @@ out:
        return 0;
 }
 
+__attribute__((weak))
 int spi_cs_is_valid(unsigned int bus, unsigned int cs)
 {
        return bus == 0 && cs == 0;
-- 
1.7.9.4
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to