Module Name: src Committed By: hkenken Date: Mon Aug 7 09:24:43 UTC 2017
Modified Files: src/sys/arch/arm/imx: imxspi.c src/sys/arch/evbarm/conf: NETWALKER src/sys/dev/spi: m25p.c Log Message: Add support Microchip SST25VF016B. - Fixed imxspi send and receive bugs. To generate a diff of this commit: cvs rdiff -u -r1.2 -r1.3 src/sys/arch/arm/imx/imxspi.c cvs rdiff -u -r1.35 -r1.36 src/sys/arch/evbarm/conf/NETWALKER cvs rdiff -u -r1.4 -r1.5 src/sys/dev/spi/m25p.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/arm/imx/imxspi.c diff -u src/sys/arch/arm/imx/imxspi.c:1.2 src/sys/arch/arm/imx/imxspi.c:1.3 --- src/sys/arch/arm/imx/imxspi.c:1.2 Sat Mar 29 12:00:27 2014 +++ src/sys/arch/arm/imx/imxspi.c Mon Aug 7 09:24:43 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: imxspi.c,v 1.2 2014/03/29 12:00:27 hkenken Exp $ */ +/* $NetBSD: imxspi.c,v 1.3 2017/08/07 09:24:43 hkenken Exp $ */ /*- * Copyright (c) 2014 Genetec Corporation. All rights reserved. @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: imxspi.c,v 1.2 2014/03/29 12:00:27 hkenken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: imxspi.c,v 1.3 2017/08/07 09:24:43 hkenken Exp $"); #include "opt_imx.h" #include "opt_imxspi.h" @@ -256,7 +256,7 @@ imxspi_send(struct imxspi_softc *sc) while (chunk->chunk_wresid) { /* transmit fifo full? */ if (READ_REG(sc, STATREG) & IMXSPI(STAT_TF)) - return; + goto out; if (chunk->chunk_wptr) { data = *chunk->chunk_wptr; @@ -271,7 +271,7 @@ imxspi_send(struct imxspi_softc *sc) /* advance to next transfer */ sc->sc_wchunk = sc->sc_wchunk->chunk_next; } - +out: if (!(READ_REG(sc, STATREG) & IMXSPI(INTR_TE_EN))) WRITE_REG(sc, CONREG, READ_REG(sc, CONREG) | IMXSPI(CON_XCH)); } @@ -321,7 +321,7 @@ imxspi_sched(struct imxspi_softc *sc) sc->sc_tag->spi_cs_enable(sc->sc_tag->cookie, st->st_slave); - /*chip slect*/ + /* chip slect */ chipselect = READ_REG(sc, CONREG); chipselect &= ~IMXSPI(CON_CS); chipselect |= __SHIFTIN(st->st_slave, IMXSPI(CON_CS)); @@ -382,19 +382,19 @@ imxspi_intr(void *arg) return 0; } - /* Transfer Conplete? */ - if (sr & IMXSPI(INTR_TC_EN)) { - /* complete TX */ - imxspi_send(sc); - } - - /* RXFIFO ready */ + /* RXFIFO ready? */ if (sr & IMXSPI(INTR_RR_EN)) { imxspi_recv(sc); if (sc->sc_wchunk == NULL && sc->sc_rchunk == NULL) imxspi_done(sc, err); } + /* Transfer Conplete? */ + if (sr & IMXSPI(INTR_TC_EN)) { + /* complete TX */ + imxspi_send(sc); + } + /* status register clear */ WRITE_REG(sc, STATREG, sr); Index: src/sys/arch/evbarm/conf/NETWALKER diff -u src/sys/arch/evbarm/conf/NETWALKER:1.35 src/sys/arch/evbarm/conf/NETWALKER:1.36 --- src/sys/arch/evbarm/conf/NETWALKER:1.35 Mon Dec 21 04:26:29 2015 +++ src/sys/arch/evbarm/conf/NETWALKER Mon Aug 7 09:24:43 2017 @@ -1,4 +1,4 @@ -# $NetBSD: NETWALKER,v 1.35 2015/12/21 04:26:29 hkenken Exp $ +# $NetBSD: NETWALKER,v 1.36 2017/08/07 09:24:43 hkenken Exp $ # # NETWALKER -- http://www.sharp.co.jp/netwalker/ # @@ -113,8 +113,8 @@ lidsw0 at gpio3 offset 12 mask 0x01 # i imxpwm0 at axi? addr 0x73FB4000 irq 61 # SPI NOR-Flash -#spiflash0 at spiflashbus? -#m25p0 at spi0 slave 1 +spiflash0 at spiflashbus? +m25p0 at spi0 slave 1 # SD/MMC sdhc0 at axi? addr 0x70004000 irq 1 # eSDHC1 Index: src/sys/dev/spi/m25p.c diff -u src/sys/dev/spi/m25p.c:1.4 src/sys/dev/spi/m25p.c:1.5 --- src/sys/dev/spi/m25p.c:1.4 Sat Oct 26 15:18:21 2013 +++ src/sys/dev/spi/m25p.c Mon Aug 7 09:24:43 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: m25p.c,v 1.4 2013/10/26 15:18:21 rkujawa Exp $ */ +/* $NetBSD: m25p.c,v 1.5 2017/08/07 09:24:43 hkenken Exp $ */ /*- * Copyright (c) 2006 Urbana-Champaign Independent Media Center. @@ -42,7 +42,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: m25p.c,v 1.4 2013/10/26 15:18:21 rkujawa Exp $"); +__KERNEL_RCSID(0, "$NetBSD: m25p.c,v 1.5 2017/08/07 09:24:43 hkenken Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -60,6 +60,7 @@ __KERNEL_RCSID(0, "$NetBSD: m25p.c,v 1.4 static int m25p_match(device_t , cfdata_t , void *); static void m25p_attach(device_t , device_t , void *); +static void m25p_doattach(device_t); static const char *m25p_getname(void *); static struct spi_handle *m25p_gethandle(void *); static int m25p_getflags(void *); @@ -95,7 +96,8 @@ static const struct m25p_info { { 0x14, 0x20, 0x2015, "STMicro M25P16", 2048, 64 }, /* 16Mbit */ { 0x12, 0x20, 0x2013, "STMicro M25P40", 512, 64 }, /* 4Mbit */ { 0xc0, 0x20, 0x7117, "STMicro M25PX64", 8192, 64 }, /* 64Mbit */ - { 0x0, 0x20, 0xBB18, "Numonyx N25Q128", 16384, 64 }, /* 128Mbit */ + { 0x00, 0x20, 0xBB18, "Numonyx N25Q128", 16384, 64 }, /* 128Mbit */ + { 0x00, 0xBF, 0x2541, "Microchip SST25VF016B", 2048, 64 }, /* 16Mbit */ { 0 } }; @@ -116,20 +118,27 @@ m25p_attach(device_t parent, device_t se { struct m25p_softc *sc = device_private(self); struct spi_attach_args *sa = aux; + + sc->sc_sh = sa->sa_handle; + + config_interrupts(self, m25p_doattach); +} + +static void +m25p_doattach(device_t self) +{ + struct m25p_softc *sc = device_private(self); const struct m25p_info *info; - uint8_t buf[4]; + uint8_t buf[4]; uint8_t cmd; uint8_t mfgid; uint8_t sig; uint16_t devid; - sc->sc_sh = sa->sa_handle; - /* first we try JEDEC ID read */ - cmd = SPIFLASH_CMD_RDJI; - if (spi_send_recv(sa->sa_handle, 1, &cmd, 3, buf)) { - aprint_error(": failed to get JEDEC identification\n"); + if (spi_send_recv(sc->sc_sh, 1, &cmd, 3, buf)) { + aprint_error(": failed to get JEDEC identification\n"); return; } mfgid = buf[0]; @@ -137,7 +146,7 @@ m25p_attach(device_t parent, device_t se if ((mfgid == 0xff) || (mfgid == 0)) { cmd = SPIFLASH_CMD_RDID; - if (spi_send_recv(sa->sa_handle, 1, &cmd, 4, buf)) { + if (spi_send_recv(sc->sc_sh, 1, &cmd, 4, buf)) { aprint_error(": failed to get legacy signature\n"); return; } @@ -150,7 +159,7 @@ m25p_attach(device_t parent, device_t se for (info = m25p_infos; info->name; info++) { if ((info->mfgid == mfgid) && (info->devid == devid)) break; - if (sig == info->sig) + if ((sig != 0) && (sig == info->sig)) break; } @@ -160,7 +169,6 @@ m25p_attach(device_t parent, device_t se } sc->sc_name = info->name; - sc->sc_sh = sa->sa_handle; sc->sc_sizes[SPIFLASH_SIZE_DEVICE] = info->size * 1024; sc->sc_sizes[SPIFLASH_SIZE_ERASE] = info->sector * 1024; sc->sc_sizes[SPIFLASH_SIZE_WRITE] = 256; @@ -168,6 +176,8 @@ m25p_attach(device_t parent, device_t se sc->sc_flags = SPIFLASH_FLAG_FAST_READ; + aprint_normal_dev(self, "JEDEC ID mfgid:0x%02X, devid:0x%04X", + mfgid, devid); aprint_normal("\n"); spiflash_attach_mi(&m25p_hw_if, sc, self);