On 28 October 2015 at 21:14, <dirk.eib...@gdsys.cc> wrote: > 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 */
Can you please add this through driver-model, I understand it's bit big task but I can help you at any moment. > + 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 -- Jagan | openedev. _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot