From: Dirk Eibach <dirk.eib...@gdsys.cc>

Armada 38x has two spi controllers.

Signed-off-by: Dirk Eibach <dirk.eib...@gdsys.cc>
---

 drivers/spi/kirkwood_spi.c | 52 +++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 45 insertions(+), 7 deletions(-)

diff --git a/drivers/spi/kirkwood_spi.c b/drivers/spi/kirkwood_spi.c
index e7b0982..200c391 100644
--- a/drivers/spi/kirkwood_spi.c
+++ b/drivers/spi/kirkwood_spi.c
@@ -18,17 +18,25 @@
 #endif
 #include <asm/arch-mvebu/spi.h>
 
-static struct kwspi_registers *spireg =
-       (struct kwspi_registers *)MVEBU_SPI_BASE;
-
 #ifdef CONFIG_KIRKWOOD
 static u32 cs_spi_mpp_back[2];
 #endif
 
+struct kwspi_slave {
+       struct spi_slave slave;
+       struct kwspi_registers *spireg;
+};
+
+static inline struct kwspi_slave *to_kwspi(struct spi_slave *slave)
+{
+       return container_of(slave, struct kwspi_slave, slave);
+}
+
 struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
                                unsigned int max_hz, unsigned int mode)
 {
-       struct spi_slave *slave;
+       struct kwspi_slave *kwspi_slave;
+       struct kwspi_registers *spireg;
        u32 data;
 #ifdef CONFIG_KIRKWOOD
        static const u32 kwspi_mpp_config[2][2] = {
@@ -40,10 +48,27 @@ struct spi_slave *spi_setup_slave(unsigned int bus, 
unsigned int cs,
        if (!spi_cs_is_valid(bus, cs))
                return NULL;
 
-       slave = spi_alloc_slave_base(bus, cs);
-       if (!slave)
+       kwspi_slave = spi_alloc_slave(struct kwspi_slave, bus, cs);
+       if (!kwspi_slave)
                return NULL;
 
+       switch (bus) {
+       case 0:
+               kwspi_slave->spireg = (struct kwspi_registers *)MVEBU_SPI_BASE;
+               break;
+#ifdef CONFIG_ARMADA_38X
+       /* Armada 38x has two SPI controllers */
+       case 1:
+               kwspi_slave->spireg =
+                       (struct kwspi_registers *)(MVEBU_SPI_BASE + 0x80);
+               break;
+#endif
+       default:
+               return NULL;
+       }
+
+       spireg = kwspi_slave->spireg;
+
        writel(KWSPI_SMEMRDY, &spireg->ctrl);
 
        /* calculate spi clock prescaller using max_hz */
@@ -63,7 +88,7 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned 
int cs,
        kirkwood_mpp_conf(kwspi_mpp_config[cs ? 1 : 0], cs_spi_mpp_back);
 #endif
 
-       return slave;
+       return &kwspi_slave->slave;
 }
 
 void spi_free_slave(struct spi_slave *slave)
@@ -137,7 +162,12 @@ void spi_release_bus(struct spi_slave *slave)
  */
 int spi_cs_is_valid(unsigned int bus, unsigned int cs)
 {
+#ifdef CONFIG_ARMADA_38X
+       /* Armada 38x has two SPI controllers */
+       return (bus < 2) && (cs < 3);
+#else
        return bus == 0 && (cs == 0 || cs == 1);
+#endif
 }
 #endif
 
@@ -147,11 +177,17 @@ void spi_init(void)
 
 void spi_cs_activate(struct spi_slave *slave)
 {
+       struct kwspi_slave *kwspi_slave = to_kwspi(slave);
+       struct kwspi_registers *spireg = kwspi_slave->spireg;
+
        setbits_le32(&spireg->ctrl, KWSPI_CSN_ACT);
 }
 
 void spi_cs_deactivate(struct spi_slave *slave)
 {
+       struct kwspi_slave *kwspi_slave = to_kwspi(slave);
+       struct kwspi_registers *spireg = kwspi_slave->spireg;
+
        clrbits_le32(&spireg->ctrl, KWSPI_CSN_ACT);
 }
 
@@ -160,6 +196,8 @@ int spi_xfer(struct spi_slave *slave, unsigned int bitlen, 
const void *dout,
 {
        unsigned int tmpdout, tmpdin;
        int tm, isread = 0;
+       struct kwspi_slave *kwspi_slave = to_kwspi(slave);
+       struct kwspi_registers *spireg = kwspi_slave->spireg;
 
        debug("spi_xfer: slave %u:%u dout %p din %p bitlen %u\n",
              slave->bus, slave->cs, dout, din, bitlen);
-- 
2.1.3

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to