From mboxrd@z Thu Jan 1 00:00:00 1970 From: Scott McNutt Date: Tue, 23 Mar 2010 16:05:02 -0400 Subject: [U-Boot] [PATCH v2] spi: add altera spi controller support In-Reply-To: <1269315379-6378-1-git-send-email-thomas@wytron.com.tw> References: <1269315379-6378-1-git-send-email-thomas@wytron.com.tw> Message-ID: <4BA91EEE.1030306@psyent.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Applied. Thanks, --Scott Thomas Chou wrote: > This patch adds the driver of altera spi controller, which is also > used as epcs/spi flash controller. > > With the spi_flash driver, they can replace the epcs driver at > cpu/nios2/epcs.c. > > Signed-off-by: Thomas Chou > --- > drivers/spi/Makefile | 1 + > drivers/spi/altera_spi.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 82 insertions(+), 0 deletions(-) > create mode 100644 drivers/spi/altera_spi.c > > diff --git a/drivers/spi/Makefile b/drivers/spi/Makefile > index f112ed0..dfcbb8b 100644 > --- a/drivers/spi/Makefile > +++ b/drivers/spi/Makefile > @@ -25,6 +25,7 @@ include $(TOPDIR)/config.mk > > LIB := $(obj)libspi.a > > +COBJS-$(CONFIG_ALTERA_SPI) += altera_spi.o > COBJS-$(CONFIG_ATMEL_DATAFLASH_SPI) += atmel_dataflash_spi.o > COBJS-$(CONFIG_ATMEL_SPI) += atmel_spi.o > COBJS-$(CONFIG_BFIN_SPI) += bfin_spi.o > diff --git a/drivers/spi/altera_spi.c b/drivers/spi/altera_spi.c > new file mode 100644 > index 0000000..7a021d0 > --- /dev/null > +++ b/drivers/spi/altera_spi.c > @@ -0,0 +1,81 @@ > +/* > + * Altera SPI driver > + * > + * Copyright (C) 2010 Thomas Chou > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License version 2 as > + * published by the Free Software Foundation. > + */ > +#include > +#include > +#include > +#include > +#include > + > +static nios_spi_t *nios_spi = (nios_spi_t *)CONFIG_SYS_SPI_BASE; > + > +void spi_init (void) > +{ > + /* empty read buffer */ > + if (readl (&nios_spi->status) & NIOS_SPI_RRDY) > + readl (&nios_spi->rxdata); > + return; > +} > + > +struct spi_slave *spi_setup_slave (unsigned int bus, unsigned int cs, > + unsigned int max_hz, unsigned int mode) > +{ > + struct spi_slave *slave; > + > + slave = malloc (sizeof(struct spi_slave)); > + if (!slave) > + return NULL; > + > + slave->bus = bus; > + slave->cs = cs; > + > + return slave; > +} > + > +void spi_free_slave (struct spi_slave *slave) > +{ > + free (slave); > +} > + > +int spi_claim_bus (struct spi_slave *slave) > +{ > + return 0; > +} > + > +void spi_release_bus (struct spi_slave *slave) > +{ > + return; > +} > + > +int spi_xfer (struct spi_slave *slave, unsigned int bitlen, const void *dout, > + void *din, unsigned long flags) > +{ > + int i, iter = bitlen >> 3; > + const uchar *txp = dout; > + uchar *rxp = din; > + uchar d; > + > + if (flags & SPI_XFER_BEGIN) { > + writel (1 << slave->cs, &nios_spi->slaveselect); > + writel (NIOS_SPI_SSO, &nios_spi->control); > + } > + > + for (i = 0; i < iter; i++) { > + writel (txp ? txp[i] : 0, &nios_spi->txdata); > + while (!(readl (&nios_spi->status) & NIOS_SPI_RRDY)) > + ; > + d = readl (&nios_spi->rxdata); > + if (rxp) > + rxp[i] = d; > + } > + if (flags & SPI_XFER_END) > + writel (0, &nios_spi->control); > + > + return 0; > +}