[U-Boot] [PATCH v0 5/5] spi: Add support for Armada 38x second controller

dirk.eibach at gdsys.cc dirk.eibach at gdsys.cc
Wed Oct 28 16:44:16 CET 2015


From: Dirk Eibach <dirk.eibach at gdsys.cc>

Armada 38x has two spi controllers.

Signed-off-by: Dirk Eibach <dirk.eibach at 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



More information about the U-Boot mailing list