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