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);

Reply via email to