[U-Boot] [PATCH v2 03/11] drivers: spi: cf_spi: migrate to DM and DT

Angelo Dureghello angelo at sysam.it
Wed Oct 10 09:57:21 UTC 2018


Hi Jagan,

On Wed, Oct 10, 2018 at 11:28:17AM +0530, Jagan Teki wrote:
> On Wed, Oct 10, 2018 at 5:10 AM Angelo Dureghello <angelo at sysam.it> wrote:
> >
> > Adding DM and DT support and removing old non-DM code.
> 
> Commit head can be: spi: cf_spi: Convert to driver model
>
Ok, as you prefer. Will do in v3.
 
> >
> > Signed-off-by: Angelo Dureghello <angelo at sysam.it>
> > ---
> > Changes for v2:
> > - removed non DM code part
> > - add default setup of CTAR registers
> > - add DT CTAR register setup support
> > ---
> >  drivers/spi/cf_spi.c                    | 510 +++++++++++++++---------
> >  include/dm/platform_data/spi_coldfire.h |  29 ++
> >  2 files changed, 346 insertions(+), 193 deletions(-)
> >  create mode 100644 include/dm/platform_data/spi_coldfire.h
> >
> > diff --git a/drivers/spi/cf_spi.c b/drivers/spi/cf_spi.c
> > index 522631cbbf..55e2c9d7b7 100644
> > --- a/drivers/spi/cf_spi.c
> > +++ b/drivers/spi/cf_spi.c
> > @@ -6,16 +6,28 @@
> >   *
> >   * Copyright (C) 2004-2009 Freescale Semiconductor, Inc.
> >   * TsiChung Liew (Tsi-Chung.Liew at freescale.com)
> > + *
> > + * Support for DM and DT, non-DM code removed.
> > + * Copyright (C) 2018 Angelo Dureghello <angelo at sysam.it>
> > + *
> > + * TODO: fsl_dspi.c should work as a driver for the DSPI module.
> 
> what is this for?
> 

cf_spi.c is here for historical reasons, but may probably 
be removed completely, since fsl_dspi.c is for the same
Freescale DSPI hardware module, with the minimal difference
of the FIFO size, that is raised to 16 words (from 4) in ColdFire.

If you look fsl_dspi.c you will find some CONFIG_M68K references
so this means someone already tried to use it for m68k, even if
actually still only cf_spi.c is used from the ColdFire family.

In linux i mainlined usage of fsl_dspi for ColdFire, so very likely
it is possible to use fsl_dspi and remove totally cf_spi also
in u-boot).
But this would need a further step to verify feasibility and to
test it carefully.

> >   */
> >
> >  #include <common.h>
> > +#include <dm.h>
> > +#include <dm/platform_data/spi_coldfire.h>
> >  #include <spi.h>
> >  #include <malloc.h>
> >  #include <asm/immap.h>
> > +#include <asm/io.h>
> >
> > -struct cf_spi_slave {
> > +struct coldfire_spi_priv {
> > +#ifndef CONFIG_DM_SPI
> >         struct spi_slave slave;
> > +#endif
> 
> do you still maintain non-dm code? if yes can't we get rid of?
> 
Ack, will rmeove.

> > +       struct dspi *regs;
> >         uint baudrate;
> > +       int mode;
> >         int charbit;
> >  };
> >
> > @@ -38,14 +50,30 @@ DECLARE_GLOBAL_DATA_PTR;
> >  #define SPI_MODE_MOD   0x00200000
> >  #define SPI_DBLRATE    0x00100000
> >
> > -static inline struct cf_spi_slave *to_cf_spi_slave(struct spi_slave *slave)
> > -{
> > -       return container_of(slave, struct cf_spi_slave, slave);
> > -}
> > +#define MCF_DSPI_MAX_CTAR_REGS         8
> > +
> > +/* Default values */
> > +#define MCF_DSPI_DEFAULT_SCK_FREQ      10000000
> > +#define MCF_DSPI_DEFAULT_MAX_CS                4
> > +#define MCF_DSPI_DEFAULT_MODE          0
> >
> > -static void cfspi_init(void)
> > +#define MCF_DSPI_DEFAULT_CTAR          (DSPI_CTAR_TRSZ(7) | \
> > +                                       DSPI_CTAR_PCSSCK_1CLK | \
> > +                                       DSPI_CTAR_PASC(0) | \
> > +                                       DSPI_CTAR_PDT(0) | \
> > +                                       DSPI_CTAR_CSSCK(0) | \
> > +                                       DSPI_CTAR_ASC(0) | \
> 
> [snip]
> 
> > -int spi_xfer(struct spi_slave *slave, unsigned int bitlen, const void *dout,
> > -            void *din, unsigned long flags)
> > +static int coldfire_spi_probe(struct udevice *bus)
> >  {
> > -       return cfspi_xfer(slave, bitlen, dout, din, flags);
> > +       struct coldfire_spi_platdata *plat = dev_get_platdata(bus);
> > +       struct coldfire_spi_priv *cfspi = dev_get_priv(bus);
> > +       int i;
> > +
> > +       cfspi->regs = (struct dspi *)plat->regs_addr;
> > +
> > +       cfspi->baudrate = plat->speed_hz;
> > +       cfspi->mode = plat->mode;
> > +
> > +       for (i = 0; i < MCF_DSPI_MAX_CTAR_REGS; i++) {
> > +               unsigned int ctar = 0;
> > +
> > +               if (plat->ctar[i][0] == 0)
> > +                       break;
> > +
> > +               ctar = DSPI_CTAR_TRSZ(plat->ctar[i][0]) |
> > +                       DSPI_CTAR_PCSSCK(plat->ctar[i][1]) |
> > +                       DSPI_CTAR_PASC(plat->ctar[i][2]) |
> > +                       DSPI_CTAR_PDT(plat->ctar[i][3]) |
> > +                       DSPI_CTAR_CSSCK(plat->ctar[i][4]) |
> > +                       DSPI_CTAR_ASC(plat->ctar[i][5]) |
> > +                       DSPI_CTAR_DT(plat->ctar[i][6]) |
> > +                       DSPI_CTAR_BR(plat->ctar[i][7]);
> > +
> > +               writel(ctar, &cfspi->regs->ctar[i]);
> > +       }
> > +
> > +       __spi_init(cfspi);
> > +
> > +       return 0;
> >  }
> > -#endif                         /* CONFIG_CMD_SPI */
> > +
> > +static int coldfire_dspi_ofdata_to_platdata(struct udevice *bus)
> 
> If you want to support platdata, it shouldn't available for DT so add
> ifdef for DT. See recent patches about this change.

Ok, will do.

Regards,
Angelo


More information about the U-Boot mailing list