public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
* [U-Boot] [RESEND PATCH v2 01/20] sf: Divide spi_flash into multiple parts
       [not found] <1375805851-32163-1-git-send-email-jaganna@xilinx.com>
@ 2013-08-06 16:17 ` Jagannadha Sutradharudu Teki
  2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 02/20] sf: probe: Add new spi_flash_probe support Jagannadha Sutradharudu Teki
                   ` (18 subsequent siblings)
  19 siblings, 0 replies; 23+ messages in thread
From: Jagannadha Sutradharudu Teki @ 2013-08-06 16:17 UTC (permalink / raw)
  To: u-boot

Divided the spi_flash framework into mutiple parts for
- spi_flash.c:
        spi flash core file, interaction for spi/qspi driver to
        spi_flash framework.
- spi_flash_ops.c
        spi flash preffered operations, erase,write and read.
- spi_flash_probe.c
        spi flash probing, easy to extend probing functionality.

This change will support to extend the functionality in a
proper manner.

Signed-off-by: Jagannadha Sutradharudu Teki <jaganna@xilinx.com>
---
Changes for v2:
	- none

 drivers/mtd/spi/Makefile          |   2 +-
 drivers/mtd/spi/spi_flash.c       | 569 +-------------------------------------
 drivers/mtd/spi/spi_flash_ops.c   | 314 +++++++++++++++++++++
 drivers/mtd/spi/spi_flash_probe.c | 274 ++++++++++++++++++
 4 files changed, 594 insertions(+), 565 deletions(-)
 create mode 100644 drivers/mtd/spi/spi_flash_ops.c
 create mode 100644 drivers/mtd/spi/spi_flash_probe.c

diff --git a/drivers/mtd/spi/Makefile b/drivers/mtd/spi/Makefile
index e537fcf..0304b12 100644
--- a/drivers/mtd/spi/Makefile
+++ b/drivers/mtd/spi/Makefile
@@ -13,7 +13,7 @@ ifdef CONFIG_SPL_BUILD
 COBJS-$(CONFIG_SPL_SPI_LOAD)	+= spi_spl_load.o
 endif
 
-COBJS-$(CONFIG_SPI_FLASH)	+= spi_flash.o
+COBJS-$(CONFIG_SPI_FLASH)	+= spi_flash_probe.o spi_flash_ops.o spi_flash.o
 COBJS-$(CONFIG_SPI_FLASH_ATMEL)	+= atmel.o
 COBJS-$(CONFIG_SPI_FLASH_EON)	+= eon.o
 COBJS-$(CONFIG_SPI_FLASH_GIGADEVICE)	+= gigadevice.o
diff --git a/drivers/mtd/spi/spi_flash.c b/drivers/mtd/spi/spi_flash.c
index 9814395..ddbdda0 100644
--- a/drivers/mtd/spi/spi_flash.c
+++ b/drivers/mtd/spi/spi_flash.c
@@ -8,23 +8,7 @@
  */
 
 #include <common.h>
-#include <fdtdec.h>
-#include <malloc.h>
 #include <spi.h>
-#include <spi_flash.h>
-#include <watchdog.h>
-
-#include "spi_flash_internal.h"
-
-DECLARE_GLOBAL_DATA_PTR;
-
-static void spi_flash_addr(u32 addr, u8 *cmd)
-{
-	/* cmd[0] is actual command */
-	cmd[1] = addr >> 16;
-	cmd[2] = addr >> 8;
-	cmd[3] = addr >> 0;
-}
 
 static int spi_flash_read_write(struct spi_slave *spi,
 				const u8 *cmd, size_t cmd_len,
@@ -52,562 +36,19 @@ static int spi_flash_read_write(struct spi_slave *spi,
 	return ret;
 }
 
-int spi_flash_cmd(struct spi_slave *spi, u8 cmd, void *response, size_t len)
-{
-	return spi_flash_cmd_read(spi, &cmd, 1, response, len);
-}
-
 int spi_flash_cmd_read(struct spi_slave *spi, const u8 *cmd,
 		size_t cmd_len, void *data, size_t data_len)
 {
 	return spi_flash_read_write(spi, cmd, cmd_len, NULL, data, data_len);
 }
 
-int spi_flash_cmd_write(struct spi_slave *spi, const u8 *cmd, size_t cmd_len,
-		const void *data, size_t data_len)
-{
-	return spi_flash_read_write(spi, cmd, cmd_len, data, NULL, data_len);
-}
-
-int spi_flash_cmd_wait_ready(struct spi_flash *flash, unsigned long timeout)
-{
-	struct spi_slave *spi = flash->spi;
-	unsigned long timebase;
-	int ret;
-	u8 status;
-	u8 check_status = 0x0;
-	u8 poll_bit = STATUS_WIP;
-	u8 cmd = flash->poll_cmd;
-
-	if (cmd == CMD_FLAG_STATUS) {
-		poll_bit = STATUS_PEC;
-		check_status = poll_bit;
-	}
-
-	ret = spi_xfer(spi, 8, &cmd, NULL, SPI_XFER_BEGIN);
-	if (ret) {
-		debug("SF: fail to read %s status register\n",
-		      cmd == CMD_READ_STATUS ? "read" : "flag");
-		return ret;
-	}
-
-	timebase = get_timer(0);
-	do {
-		WATCHDOG_RESET();
-
-		ret = spi_xfer(spi, 8, NULL, &status, 0);
-		if (ret)
-			return -1;
-
-		if ((status & poll_bit) == check_status)
-			break;
-
-	} while (get_timer(timebase) < timeout);
-
-	spi_xfer(spi, 0, NULL, NULL, SPI_XFER_END);
-
-	if ((status & poll_bit) == check_status)
-		return 0;
-
-	/* Timed out */
-	debug("SF: time out!\n");
-	return -1;
-}
-
-int spi_flash_write_common(struct spi_flash *flash, const u8 *cmd,
-		size_t cmd_len, const void *buf, size_t buf_len)
-{
-	struct spi_slave *spi = flash->spi;
-	unsigned long timeout = SPI_FLASH_PROG_TIMEOUT;
-	int ret;
-
-	if (buf == NULL)
-		timeout = SPI_FLASH_PAGE_ERASE_TIMEOUT;
-
-	ret = spi_claim_bus(flash->spi);
-	if (ret) {
-		debug("SF: unable to claim SPI bus\n");
-		return ret;
-	}
-
-	ret = spi_flash_cmd_write_enable(flash);
-	if (ret < 0) {
-		debug("SF: enabling write failed\n");
-		return ret;
-	}
-
-	ret = spi_flash_cmd_write(spi, cmd, cmd_len, buf, buf_len);
-	if (ret < 0) {
-		debug("SF: write cmd failed\n");
-		return ret;
-	}
-
-	ret = spi_flash_cmd_wait_ready(flash, timeout);
-	if (ret < 0) {
-		debug("SF: write %s timed out\n",
-		      timeout == SPI_FLASH_PROG_TIMEOUT ?
-			"program" : "page erase");
-		return ret;
-	}
-
-	spi_release_bus(spi);
-
-	return ret;
-}
-
-int spi_flash_cmd_erase(struct spi_flash *flash, u32 offset, size_t len)
-{
-	u32 erase_size;
-	u8 cmd[4];
-	int ret = -1;
-
-	erase_size = flash->sector_size;
-	if (offset % erase_size || len % erase_size) {
-		debug("SF: Erase offset/length not multiple of erase size\n");
-		return -1;
-	}
-
-	if (erase_size == 4096)
-		cmd[0] = CMD_ERASE_4K;
-	else
-		cmd[0] = CMD_ERASE_64K;
-
-	while (len) {
-#ifdef CONFIG_SPI_FLASH_BAR
-		u8 bank_sel;
-
-		bank_sel = offset / SPI_FLASH_16MB_BOUN;
-
-		ret = spi_flash_cmd_bankaddr_write(flash, bank_sel);
-		if (ret) {
-			debug("SF: fail to set bank%d\n", bank_sel);
-			return ret;
-		}
-#endif
-		spi_flash_addr(offset, cmd);
-
-		debug("SF: erase %2x %2x %2x %2x (%x)\n", cmd[0], cmd[1],
-		      cmd[2], cmd[3], offset);
-
-		ret = spi_flash_write_common(flash, cmd, sizeof(cmd), NULL, 0);
-		if (ret < 0) {
-			debug("SF: erase failed\n");
-			break;
-		}
-
-		offset += erase_size;
-		len -= erase_size;
-	}
-
-	return ret;
-}
-
-int spi_flash_cmd_write_multi(struct spi_flash *flash, u32 offset,
-		size_t len, const void *buf)
-{
-	unsigned long byte_addr, page_size;
-	size_t chunk_len, actual;
-	u8 cmd[4];
-	int ret = -1;
-
-	page_size = flash->page_size;
-
-	cmd[0] = CMD_PAGE_PROGRAM;
-	for (actual = 0; actual < len; actual += chunk_len) {
-#ifdef CONFIG_SPI_FLASH_BAR
-		u8 bank_sel;
-
-		bank_sel = offset / SPI_FLASH_16MB_BOUN;
-
-		ret = spi_flash_cmd_bankaddr_write(flash, bank_sel);
-		if (ret) {
-			debug("SF: fail to set bank%d\n", bank_sel);
-			return ret;
-		}
-#endif
-		byte_addr = offset % page_size;
-		chunk_len = min(len - actual, page_size - byte_addr);
-
-		if (flash->spi->max_write_size)
-			chunk_len = min(chunk_len, flash->spi->max_write_size);
-
-		spi_flash_addr(offset, cmd);
-
-		debug("PP: 0x%p => cmd = { 0x%02x 0x%02x%02x%02x } chunk_len = %zu\n",
-		      buf + actual, cmd[0], cmd[1], cmd[2], cmd[3], chunk_len);
-
-		ret = spi_flash_write_common(flash, cmd, sizeof(cmd),
-					buf + actual, chunk_len);
-		if (ret < 0) {
-			debug("SF: write failed\n");
-			break;
-		}
-
-		offset += chunk_len;
-	}
-
-	return ret;
-}
-
-int spi_flash_read_common(struct spi_flash *flash, const u8 *cmd,
-		size_t cmd_len, void *data, size_t data_len)
-{
-	struct spi_slave *spi = flash->spi;
-	int ret;
-
-	ret = spi_claim_bus(flash->spi);
-	if (ret) {
-		debug("SF: unable to claim SPI bus\n");
-		return ret;
-	}
-
-	ret = spi_flash_cmd_read(spi, cmd, cmd_len, data, data_len);
-	if (ret < 0) {
-		debug("SF: read cmd failed\n");
-		return ret;
-	}
-
-	spi_release_bus(spi);
-
-	return ret;
-}
-
-int spi_flash_cmd_read_fast(struct spi_flash *flash, u32 offset,
-		size_t len, void *data)
-{
-	u8 cmd[5], bank_sel = 0;
-	u32 remain_len, read_len;
-	int ret = -1;
-
-	/* Handle memory-mapped SPI */
-	if (flash->memory_map) {
-		memcpy(data, flash->memory_map + offset, len);
-		return 0;
-	}
-
-	cmd[0] = CMD_READ_ARRAY_FAST;
-	cmd[4] = 0x00;
-
-	while (len) {
-#ifdef CONFIG_SPI_FLASH_BAR
-		bank_sel = offset / SPI_FLASH_16MB_BOUN;
-
-		ret = spi_flash_cmd_bankaddr_write(flash, bank_sel);
-		if (ret) {
-			debug("SF: fail to set bank%d\n", bank_sel);
-			return ret;
-		}
-#endif
-		remain_len = (SPI_FLASH_16MB_BOUN * (bank_sel + 1) - offset);
-		if (len < remain_len)
-			read_len = len;
-		else
-			read_len = remain_len;
-
-		spi_flash_addr(offset, cmd);
-
-		ret = spi_flash_read_common(flash, cmd, sizeof(cmd),
-							data, read_len);
-		if (ret < 0) {
-			debug("SF: read failed\n");
-			break;
-		}
-
-		offset += read_len;
-		len -= read_len;
-		data += read_len;
-	}
-
-	return ret;
-}
-
-int spi_flash_cmd_write_status(struct spi_flash *flash, u8 sr)
-{
-	u8 cmd;
-	int ret;
-
-	cmd = CMD_WRITE_STATUS;
-	ret = spi_flash_write_common(flash, &cmd, 1, &sr, 1);
-	if (ret < 0) {
-		debug("SF: fail to write status register\n");
-		return ret;
-	}
-
-	return 0;
-}
-
-#ifdef CONFIG_SPI_FLASH_BAR
-int spi_flash_cmd_bankaddr_write(struct spi_flash *flash, u8 bank_sel)
-{
-	u8 cmd;
-	int ret;
-
-	if (flash->bank_curr == bank_sel) {
-		debug("SF: not require to enable bank%d\n", bank_sel);
-		return 0;
-	}
-
-	cmd = flash->bank_write_cmd;
-	ret = spi_flash_write_common(flash, &cmd, 1, &bank_sel, 1);
-	if (ret < 0) {
-		debug("SF: fail to write bank register\n");
-		return ret;
-	}
-	flash->bank_curr = bank_sel;
-
-	return 0;
-}
-
-int spi_flash_bank_config(struct spi_flash *flash, u8 idcode0)
-{
-	u8 cmd;
-	u8 curr_bank = 0;
-
-	/* discover bank cmds */
-	switch (idcode0) {
-	case SPI_FLASH_SPANSION_IDCODE0:
-		flash->bank_read_cmd = CMD_BANKADDR_BRRD;
-		flash->bank_write_cmd = CMD_BANKADDR_BRWR;
-		break;
-	case SPI_FLASH_STMICRO_IDCODE0:
-	case SPI_FLASH_WINBOND_IDCODE0:
-		flash->bank_read_cmd = CMD_EXTNADDR_RDEAR;
-		flash->bank_write_cmd = CMD_EXTNADDR_WREAR;
-		break;
-	default:
-		printf("SF: Unsupported bank commands %02x\n", idcode0);
-		return -1;
-	}
-
-	/* read the bank reg - on which bank the flash is in currently */
-	cmd = flash->bank_read_cmd;
-	if (flash->size > SPI_FLASH_16MB_BOUN) {
-		if (spi_flash_read_common(flash, &cmd, 1, &curr_bank, 1)) {
-			debug("SF: fail to read bank addr register\n");
-			return -1;
-		}
-		flash->bank_curr = curr_bank;
-	} else {
-		flash->bank_curr = curr_bank;
-	}
-
-	return 0;
-}
-#endif
-
-#ifdef CONFIG_OF_CONTROL
-int spi_flash_decode_fdt(const void *blob, struct spi_flash *flash)
-{
-	fdt_addr_t addr;
-	fdt_size_t size;
-	int node;
-
-	/* If there is no node, do nothing */
-	node = fdtdec_next_compatible(blob, 0, COMPAT_GENERIC_SPI_FLASH);
-	if (node < 0)
-		return 0;
-
-	addr = fdtdec_get_addr_size(blob, node, "memory-map", &size);
-	if (addr == FDT_ADDR_T_NONE) {
-		debug("%s: Cannot decode address\n", __func__);
-		return 0;
-	}
-
-	if (flash->size != size) {
-		debug("%s: Memory map must cover entire device\n", __func__);
-		return -1;
-	}
-	flash->memory_map = (void *)addr;
-
-	return 0;
-}
-#endif /* CONFIG_OF_CONTROL */
-
-/*
- * The following table holds all device probe functions
- *
- * shift:  number of continuation bytes before the ID
- * idcode: the expected IDCODE or 0xff for non JEDEC devices
- * probe:  the function to call
- *
- * Non JEDEC devices should be ordered in the table such that
- * the probe functions with best detection algorithms come first.
- *
- * Several matching entries are permitted, they will be tried
- * in sequence until a probe function returns non NULL.
- *
- * IDCODE_CONT_LEN may be redefined if a device needs to declare a
- * larger "shift" value.  IDCODE_PART_LEN generally shouldn't be
- * changed.  This is the max number of bytes probe functions may
- * examine when looking up part-specific identification info.
- *
- * Probe functions will be given the idcode buffer starting at their
- * manu id byte (the "idcode" in the table below).  In other words,
- * all of the continuation bytes will be skipped (the "shift" below).
- */
-#define IDCODE_CONT_LEN 0
-#define IDCODE_PART_LEN 5
-static const struct {
-	const u8 shift;
-	const u8 idcode;
-	struct spi_flash *(*probe) (struct spi_slave *spi, u8 *idcode);
-} flashes[] = {
-	/* Keep it sorted by define name */
-#ifdef CONFIG_SPI_FLASH_ATMEL
-	{ 0, 0x1f, spi_flash_probe_atmel, },
-#endif
-#ifdef CONFIG_SPI_FLASH_EON
-	{ 0, 0x1c, spi_flash_probe_eon, },
-#endif
-#ifdef CONFIG_SPI_FLASH_GIGADEVICE
-	{ 0, 0xc8, spi_flash_probe_gigadevice, },
-#endif
-#ifdef CONFIG_SPI_FLASH_MACRONIX
-	{ 0, 0xc2, spi_flash_probe_macronix, },
-#endif
-#ifdef CONFIG_SPI_FLASH_SPANSION
-	{ 0, 0x01, spi_flash_probe_spansion, },
-#endif
-#ifdef CONFIG_SPI_FLASH_SST
-	{ 0, 0xbf, spi_flash_probe_sst, },
-#endif
-#ifdef CONFIG_SPI_FLASH_STMICRO
-	{ 0, 0x20, spi_flash_probe_stmicro, },
-#endif
-#ifdef CONFIG_SPI_FLASH_WINBOND
-	{ 0, 0xef, spi_flash_probe_winbond, },
-#endif
-#ifdef CONFIG_SPI_FRAM_RAMTRON
-	{ 6, 0xc2, spi_fram_probe_ramtron, },
-# undef IDCODE_CONT_LEN
-# define IDCODE_CONT_LEN 6
-#endif
-	/* Keep it sorted by best detection */
-#ifdef CONFIG_SPI_FLASH_STMICRO
-	{ 0, 0xff, spi_flash_probe_stmicro, },
-#endif
-#ifdef CONFIG_SPI_FRAM_RAMTRON_NON_JEDEC
-	{ 0, 0xff, spi_fram_probe_ramtron, },
-#endif
-};
-#define IDCODE_LEN (IDCODE_CONT_LEN + IDCODE_PART_LEN)
-
-struct spi_flash *spi_flash_probe(unsigned int bus, unsigned int cs,
-		unsigned int max_hz, unsigned int spi_mode)
-{
-	struct spi_slave *spi;
-	struct spi_flash *flash = NULL;
-	int ret, i, shift;
-	u8 idcode[IDCODE_LEN], *idp;
-
-	spi = spi_setup_slave(bus, cs, max_hz, spi_mode);
-	if (!spi) {
-		printf("SF: Failed to set up slave\n");
-		return NULL;
-	}
-
-	ret = spi_claim_bus(spi);
-	if (ret) {
-		debug("SF: Failed to claim SPI bus: %d\n", ret);
-		goto err_claim_bus;
-	}
-
-	/* Read the ID codes */
-	ret = spi_flash_cmd(spi, CMD_READ_ID, idcode, sizeof(idcode));
-	if (ret)
-		goto err_read_id;
-
-#ifdef DEBUG
-	printf("SF: Got idcodes\n");
-	print_buffer(0, idcode, 1, sizeof(idcode), 0);
-#endif
-
-	/* count the number of continuation bytes */
-	for (shift = 0, idp = idcode;
-	     shift < IDCODE_CONT_LEN && *idp == 0x7f;
-	     ++shift, ++idp)
-		continue;
-
-	/* search the table for matches in shift and id */
-	for (i = 0; i < ARRAY_SIZE(flashes); ++i)
-		if (flashes[i].shift == shift && flashes[i].idcode == *idp) {
-			/* we have a match, call probe */
-			flash = flashes[i].probe(spi, idp);
-			if (flash)
-				break;
-		}
-
-	if (!flash) {
-		printf("SF: Unsupported manufacturer %02x\n", *idp);
-		goto err_manufacturer_probe;
-	}
-
-#ifdef CONFIG_SPI_FLASH_BAR
-	/* Configure the BAR - disover bank cmds and read current bank  */
-	ret = spi_flash_bank_config(flash, *idp);
-	if (ret < 0)
-		goto err_manufacturer_probe;
-#endif
-
-#ifdef CONFIG_OF_CONTROL
-	if (spi_flash_decode_fdt(gd->fdt_blob, flash)) {
-		debug("SF: FDT decode error\n");
-		goto err_manufacturer_probe;
-	}
-#endif
-	printf("SF: Detected %s with page size ", flash->name);
-	print_size(flash->sector_size, ", total ");
-	print_size(flash->size, "");
-	if (flash->memory_map)
-		printf(", mapped at %p", flash->memory_map);
-	puts("\n");
-#ifndef CONFIG_SPI_FLASH_BAR
-	if (flash->size > SPI_FLASH_16MB_BOUN) {
-		puts("SF: Warning - Only lower 16MiB accessible,");
-		puts(" Full access #define CONFIG_SPI_FLASH_BAR\n");
-	}
-#endif
-
-	spi_release_bus(spi);
-
-	return flash;
-
-err_manufacturer_probe:
-err_read_id:
-	spi_release_bus(spi);
-err_claim_bus:
-	spi_free_slave(spi);
-	return NULL;
-}
-
-void *spi_flash_do_alloc(int offset, int size, struct spi_slave *spi,
-			 const char *name)
+int spi_flash_cmd(struct spi_slave *spi, u8 cmd, void *response, size_t len)
 {
-	struct spi_flash *flash;
-	void *ptr;
-
-	ptr = malloc(size);
-	if (!ptr) {
-		debug("SF: Failed to allocate memory\n");
-		return NULL;
-	}
-	memset(ptr, '\0', size);
-	flash = (struct spi_flash *)(ptr + offset);
-
-	/* Set up some basic fields - caller will sort out sizes */
-	flash->spi = spi;
-	flash->name = name;
-	flash->poll_cmd = CMD_READ_STATUS;
-
-	flash->read = spi_flash_cmd_read_fast;
-	flash->write = spi_flash_cmd_write_multi;
-	flash->erase = spi_flash_cmd_erase;
-
-	return flash;
+	return spi_flash_cmd_read(spi, &cmd, 1, response, len);
 }
 
-void spi_flash_free(struct spi_flash *flash)
+int spi_flash_cmd_write(struct spi_slave *spi, const u8 *cmd, size_t cmd_len,
+		const void *data, size_t data_len)
 {
-	spi_free_slave(flash->spi);
-	free(flash);
+	return spi_flash_read_write(spi, cmd, cmd_len, data, NULL, data_len);
 }
diff --git a/drivers/mtd/spi/spi_flash_ops.c b/drivers/mtd/spi/spi_flash_ops.c
new file mode 100644
index 0000000..6133363
--- /dev/null
+++ b/drivers/mtd/spi/spi_flash_ops.c
@@ -0,0 +1,314 @@
+/*
+ * SPI flash operations
+ *
+ * Copyright (C) 2008 Atmel Corporation
+ * Copyright (C) 2010 Reinhard Meyer, EMK Elektronik
+ * Copyright (C) 2013 Jagannadha Sutradharudu Teki, Xilinx Inc.
+ *
+ * Licensed under the GPL-2 or later.
+ */
+
+#include <common.h>
+#include <spi.h>
+#include <spi_flash.h>
+#include <watchdog.h>
+
+#include "spi_flash_internal.h"
+
+static void spi_flash_addr(u32 addr, u8 *cmd)
+{
+	/* cmd[0] is actual command */
+	cmd[1] = addr >> 16;
+	cmd[2] = addr >> 8;
+	cmd[3] = addr >> 0;
+}
+
+int spi_flash_cmd_write_status(struct spi_flash *flash, u8 sr)
+{
+	u8 cmd;
+	int ret;
+
+	cmd = CMD_WRITE_STATUS;
+	ret = spi_flash_write_common(flash, &cmd, 1, &sr, 1);
+	if (ret < 0) {
+		debug("SF: fail to write status register\n");
+		return ret;
+	}
+
+	return 0;
+}
+
+#ifdef CONFIG_SPI_FLASH_BAR
+int spi_flash_cmd_bankaddr_write(struct spi_flash *flash, u8 bank_sel)
+{
+	u8 cmd;
+	int ret;
+
+	if (flash->bank_curr == bank_sel) {
+		debug("SF: not require to enable bank%d\n", bank_sel);
+		return 0;
+	}
+
+	cmd = flash->bank_write_cmd;
+	ret = spi_flash_write_common(flash, &cmd, 1, &bank_sel, 1);
+	if (ret < 0) {
+		debug("SF: fail to write bank register\n");
+		return ret;
+	}
+	flash->bank_curr = bank_sel;
+
+	return 0;
+}
+#endif
+
+int spi_flash_cmd_wait_ready(struct spi_flash *flash, unsigned long timeout)
+{
+	struct spi_slave *spi = flash->spi;
+	unsigned long timebase;
+	int ret;
+	u8 status;
+	u8 check_status = 0x0;
+	u8 poll_bit = STATUS_WIP;
+	u8 cmd = flash->poll_cmd;
+
+	if (cmd == CMD_FLAG_STATUS) {
+		poll_bit = STATUS_PEC;
+		check_status = poll_bit;
+	}
+
+	ret = spi_xfer(spi, 8, &cmd, NULL, SPI_XFER_BEGIN);
+	if (ret) {
+		debug("SF: fail to read %s status register\n",
+		      cmd == CMD_READ_STATUS ? "read" : "flag");
+		return ret;
+	}
+
+	timebase = get_timer(0);
+	do {
+		WATCHDOG_RESET();
+
+		ret = spi_xfer(spi, 8, NULL, &status, 0);
+		if (ret)
+			return -1;
+
+		if ((status & poll_bit) == check_status)
+			break;
+
+	} while (get_timer(timebase) < timeout);
+
+	spi_xfer(spi, 0, NULL, NULL, SPI_XFER_END);
+
+	if ((status & poll_bit) == check_status)
+		return 0;
+
+	/* Timed out */
+	debug("SF: time out!\n");
+	return -1;
+}
+
+int spi_flash_write_common(struct spi_flash *flash, const u8 *cmd,
+		size_t cmd_len, const void *buf, size_t buf_len)
+{
+	struct spi_slave *spi = flash->spi;
+	unsigned long timeout = SPI_FLASH_PROG_TIMEOUT;
+	int ret;
+
+	if (buf == NULL)
+		timeout = SPI_FLASH_PAGE_ERASE_TIMEOUT;
+
+	ret = spi_claim_bus(flash->spi);
+	if (ret) {
+		debug("SF: unable to claim SPI bus\n");
+		return ret;
+	}
+
+	ret = spi_flash_cmd_write_enable(flash);
+	if (ret < 0) {
+		debug("SF: enabling write failed\n");
+		return ret;
+	}
+
+	ret = spi_flash_cmd_write(spi, cmd, cmd_len, buf, buf_len);
+	if (ret < 0) {
+		debug("SF: write cmd failed\n");
+		return ret;
+	}
+
+	ret = spi_flash_cmd_wait_ready(flash, timeout);
+	if (ret < 0) {
+		debug("SF: write %s timed out\n",
+		      timeout == SPI_FLASH_PROG_TIMEOUT ?
+			"program" : "page erase");
+		return ret;
+	}
+
+	spi_release_bus(spi);
+
+	return ret;
+}
+
+int spi_flash_cmd_erase(struct spi_flash *flash, u32 offset, size_t len)
+{
+	u32 erase_size;
+	u8 cmd[4];
+	int ret = -1;
+
+	erase_size = flash->sector_size;
+	if (offset % erase_size || len % erase_size) {
+		debug("SF: Erase offset/length not multiple of erase size\n");
+		return -1;
+	}
+
+	if (erase_size == 4096)
+		cmd[0] = CMD_ERASE_4K;
+	else
+		cmd[0] = CMD_ERASE_64K;
+
+	while (len) {
+#ifdef CONFIG_SPI_FLASH_BAR
+		u8 bank_sel;
+
+		bank_sel = offset / SPI_FLASH_16MB_BOUN;
+
+		ret = spi_flash_cmd_bankaddr_write(flash, bank_sel);
+		if (ret) {
+			debug("SF: fail to set bank%d\n", bank_sel);
+			return ret;
+		}
+#endif
+		spi_flash_addr(offset, cmd);
+
+		debug("SF: erase %2x %2x %2x %2x (%x)\n", cmd[0], cmd[1],
+		      cmd[2], cmd[3], offset);
+
+		ret = spi_flash_write_common(flash, cmd, sizeof(cmd), NULL, 0);
+		if (ret < 0) {
+			debug("SF: erase failed\n");
+			break;
+		}
+
+		offset += erase_size;
+		len -= erase_size;
+	}
+
+	return ret;
+}
+
+int spi_flash_cmd_write_multi(struct spi_flash *flash, u32 offset,
+		size_t len, const void *buf)
+{
+	unsigned long byte_addr, page_size;
+	size_t chunk_len, actual;
+	u8 cmd[4];
+	int ret = -1;
+
+	page_size = flash->page_size;
+
+	cmd[0] = CMD_PAGE_PROGRAM;
+	for (actual = 0; actual < len; actual += chunk_len) {
+#ifdef CONFIG_SPI_FLASH_BAR
+		u8 bank_sel;
+
+		bank_sel = offset / SPI_FLASH_16MB_BOUN;
+
+		ret = spi_flash_cmd_bankaddr_write(flash, bank_sel);
+		if (ret) {
+			debug("SF: fail to set bank%d\n", bank_sel);
+			return ret;
+		}
+#endif
+		byte_addr = offset % page_size;
+		chunk_len = min(len - actual, page_size - byte_addr);
+
+		if (flash->spi->max_write_size)
+			chunk_len = min(chunk_len, flash->spi->max_write_size);
+
+		spi_flash_addr(offset, cmd);
+
+		debug("PP: 0x%p => cmd = { 0x%02x 0x%02x%02x%02x } chunk_len = %zu\n",
+		      buf + actual, cmd[0], cmd[1], cmd[2], cmd[3], chunk_len);
+
+		ret = spi_flash_write_common(flash, cmd, sizeof(cmd),
+					buf + actual, chunk_len);
+		if (ret < 0) {
+			debug("SF: write failed\n");
+			break;
+		}
+
+		offset += chunk_len;
+	}
+
+	return ret;
+}
+
+int spi_flash_read_common(struct spi_flash *flash, const u8 *cmd,
+		size_t cmd_len, void *data, size_t data_len)
+{
+	struct spi_slave *spi = flash->spi;
+	int ret;
+
+	ret = spi_claim_bus(flash->spi);
+	if (ret) {
+		debug("SF: unable to claim SPI bus\n");
+		return ret;
+	}
+
+	ret = spi_flash_cmd_read(spi, cmd, cmd_len, data, data_len);
+	if (ret < 0) {
+		debug("SF: read cmd failed\n");
+		return ret;
+	}
+
+	spi_release_bus(spi);
+
+	return ret;
+}
+
+int spi_flash_cmd_read_fast(struct spi_flash *flash, u32 offset,
+		size_t len, void *data)
+{
+	u8 cmd[5], bank_sel = 0;
+	u32 remain_len, read_len;
+	int ret = -1;
+
+	/* Handle memory-mapped SPI */
+	if (flash->memory_map) {
+		memcpy(data, flash->memory_map + offset, len);
+		return 0;
+	}
+
+	cmd[0] = CMD_READ_ARRAY_FAST;
+	cmd[4] = 0x00;
+
+	while (len) {
+#ifdef CONFIG_SPI_FLASH_BAR
+		bank_sel = offset / SPI_FLASH_16MB_BOUN;
+
+		ret = spi_flash_cmd_bankaddr_write(flash, bank_sel);
+		if (ret) {
+			debug("SF: fail to set bank%d\n", bank_sel);
+			return ret;
+		}
+#endif
+		remain_len = (SPI_FLASH_16MB_BOUN * (bank_sel + 1) - offset);
+		if (len < remain_len)
+			read_len = len;
+		else
+			read_len = remain_len;
+
+		spi_flash_addr(offset, cmd);
+
+		ret = spi_flash_read_common(flash, cmd, sizeof(cmd),
+							data, read_len);
+		if (ret < 0) {
+			debug("SF: read failed\n");
+			break;
+		}
+
+		offset += read_len;
+		len -= read_len;
+		data += read_len;
+	}
+
+	return ret;
+}
diff --git a/drivers/mtd/spi/spi_flash_probe.c b/drivers/mtd/spi/spi_flash_probe.c
new file mode 100644
index 0000000..fedc81e
--- /dev/null
+++ b/drivers/mtd/spi/spi_flash_probe.c
@@ -0,0 +1,274 @@
+/*
+ * SPI flash probing
+ *
+ * Copyright (C) 2008 Atmel Corporation
+ * Copyright (C) 2010 Reinhard Meyer, EMK Elektronik
+ * Copyright (C) 2013 Jagannadha Sutradharudu Teki, Xilinx Inc.
+ *
+ * Licensed under the GPL-2 or later.
+ */
+
+#include <common.h>
+#include <fdtdec.h>
+#include <malloc.h>
+#include <spi.h>
+#include <spi_flash.h>
+
+#include "spi_flash_internal.h"
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#ifdef CONFIG_SPI_FLASH_BAR
+int spi_flash_bank_config(struct spi_flash *flash, u8 idcode0)
+{
+	u8 cmd;
+	u8 curr_bank = 0;
+
+	/* discover bank cmds */
+	switch (idcode0) {
+	case SPI_FLASH_SPANSION_IDCODE0:
+		flash->bank_read_cmd = CMD_BANKADDR_BRRD;
+		flash->bank_write_cmd = CMD_BANKADDR_BRWR;
+		break;
+	case SPI_FLASH_STMICRO_IDCODE0:
+	case SPI_FLASH_WINBOND_IDCODE0:
+		flash->bank_read_cmd = CMD_EXTNADDR_RDEAR;
+		flash->bank_write_cmd = CMD_EXTNADDR_WREAR;
+		break;
+	default:
+		printf("SF: Unsupported bank commands %02x\n", idcode0);
+		return -1;
+	}
+
+	/* read the bank reg - on which bank the flash is in currently */
+	cmd = flash->bank_read_cmd;
+	if (flash->size > SPI_FLASH_16MB_BOUN) {
+		if (spi_flash_read_common(flash, &cmd, 1, &curr_bank, 1)) {
+			debug("SF: fail to read bank addr register\n");
+			return -1;
+		}
+		flash->bank_curr = curr_bank;
+	} else {
+		flash->bank_curr = curr_bank;
+	}
+
+	return 0;
+}
+#endif
+
+#ifdef CONFIG_OF_CONTROL
+int spi_flash_decode_fdt(const void *blob, struct spi_flash *flash)
+{
+	fdt_addr_t addr;
+	fdt_size_t size;
+	int node;
+
+	/* If there is no node, do nothing */
+	node = fdtdec_next_compatible(blob, 0, COMPAT_GENERIC_SPI_FLASH);
+	if (node < 0)
+		return 0;
+
+	addr = fdtdec_get_addr_size(blob, node, "memory-map", &size);
+	if (addr == FDT_ADDR_T_NONE) {
+		debug("%s: Cannot decode address\n", __func__);
+		return 0;
+	}
+
+	if (flash->size != size) {
+		debug("%s: Memory map must cover entire device\n", __func__);
+		return -1;
+	}
+	flash->memory_map = (void *)addr;
+
+	return 0;
+}
+#endif /* CONFIG_OF_CONTROL */
+
+/*
+ * The following table holds all device probe functions
+ *
+ * shift:  number of continuation bytes before the ID
+ * idcode: the expected IDCODE or 0xff for non JEDEC devices
+ * probe:  the function to call
+ *
+ * Non JEDEC devices should be ordered in the table such that
+ * the probe functions with best detection algorithms come first.
+ *
+ * Several matching entries are permitted, they will be tried
+ * in sequence until a probe function returns non NULL.
+ *
+ * IDCODE_CONT_LEN may be redefined if a device needs to declare a
+ * larger "shift" value.  IDCODE_PART_LEN generally shouldn't be
+ * changed.  This is the max number of bytes probe functions may
+ * examine when looking up part-specific identification info.
+ *
+ * Probe functions will be given the idcode buffer starting at their
+ * manu id byte (the "idcode" in the table below).  In other words,
+ * all of the continuation bytes will be skipped (the "shift" below).
+ */
+#define IDCODE_CONT_LEN 0
+#define IDCODE_PART_LEN 5
+static const struct {
+	const u8 shift;
+	const u8 idcode;
+	struct spi_flash *(*probe) (struct spi_slave *spi, u8 *idcode);
+} flashes[] = {
+	/* Keep it sorted by define name */
+#ifdef CONFIG_SPI_FLASH_ATMEL
+	{ 0, 0x1f, spi_flash_probe_atmel, },
+#endif
+#ifdef CONFIG_SPI_FLASH_EON
+	{ 0, 0x1c, spi_flash_probe_eon, },
+#endif
+#ifdef CONFIG_SPI_FLASH_GIGADEVICE
+	{ 0, 0xc8, spi_flash_probe_gigadevice, },
+#endif
+#ifdef CONFIG_SPI_FLASH_MACRONIX
+	{ 0, 0xc2, spi_flash_probe_macronix, },
+#endif
+#ifdef CONFIG_SPI_FLASH_SPANSION
+	{ 0, 0x01, spi_flash_probe_spansion, },
+#endif
+#ifdef CONFIG_SPI_FLASH_SST
+	{ 0, 0xbf, spi_flash_probe_sst, },
+#endif
+#ifdef CONFIG_SPI_FLASH_STMICRO
+	{ 0, 0x20, spi_flash_probe_stmicro, },
+#endif
+#ifdef CONFIG_SPI_FLASH_WINBOND
+	{ 0, 0xef, spi_flash_probe_winbond, },
+#endif
+#ifdef CONFIG_SPI_FRAM_RAMTRON
+	{ 6, 0xc2, spi_fram_probe_ramtron, },
+# undef IDCODE_CONT_LEN
+# define IDCODE_CONT_LEN 6
+#endif
+	/* Keep it sorted by best detection */
+#ifdef CONFIG_SPI_FLASH_STMICRO
+	{ 0, 0xff, spi_flash_probe_stmicro, },
+#endif
+#ifdef CONFIG_SPI_FRAM_RAMTRON_NON_JEDEC
+	{ 0, 0xff, spi_fram_probe_ramtron, },
+#endif
+};
+#define IDCODE_LEN (IDCODE_CONT_LEN + IDCODE_PART_LEN)
+
+struct spi_flash *spi_flash_probe(unsigned int bus, unsigned int cs,
+		unsigned int max_hz, unsigned int spi_mode)
+{
+	struct spi_slave *spi;
+	struct spi_flash *flash = NULL;
+	int ret, i, shift;
+	u8 idcode[IDCODE_LEN], *idp;
+
+	spi = spi_setup_slave(bus, cs, max_hz, spi_mode);
+	if (!spi) {
+		printf("SF: Failed to set up slave\n");
+		return NULL;
+	}
+
+	ret = spi_claim_bus(spi);
+	if (ret) {
+		debug("SF: Failed to claim SPI bus: %d\n", ret);
+		goto err_claim_bus;
+	}
+
+	/* Read the ID codes */
+	ret = spi_flash_cmd(spi, CMD_READ_ID, idcode, sizeof(idcode));
+	if (ret)
+		goto err_read_id;
+
+#ifdef DEBUG
+	printf("SF: Got idcodes\n");
+	print_buffer(0, idcode, 1, sizeof(idcode), 0);
+#endif
+
+	/* count the number of continuation bytes */
+	for (shift = 0, idp = idcode;
+	     shift < IDCODE_CONT_LEN && *idp == 0x7f;
+	     ++shift, ++idp)
+		continue;
+
+	/* search the table for matches in shift and id */
+	for (i = 0; i < ARRAY_SIZE(flashes); ++i)
+		if (flashes[i].shift == shift && flashes[i].idcode == *idp) {
+			/* we have a match, call probe */
+			flash = flashes[i].probe(spi, idp);
+			if (flash)
+				break;
+		}
+
+	if (!flash) {
+		printf("SF: Unsupported manufacturer %02x\n", *idp);
+		goto err_manufacturer_probe;
+	}
+
+#ifdef CONFIG_SPI_FLASH_BAR
+	/* Configure the BAR - disover bank cmds and read current bank  */
+	ret = spi_flash_bank_config(flash, *idp);
+	if (ret < 0)
+		goto err_manufacturer_probe;
+#endif
+
+#ifdef CONFIG_OF_CONTROL
+	if (spi_flash_decode_fdt(gd->fdt_blob, flash)) {
+		debug("SF: FDT decode error\n");
+		goto err_manufacturer_probe;
+	}
+#endif
+	printf("SF: Detected %s with page size ", flash->name);
+	print_size(flash->sector_size, ", total ");
+	print_size(flash->size, "");
+	if (flash->memory_map)
+		printf(", mapped at %p", flash->memory_map);
+	puts("\n");
+#ifndef CONFIG_SPI_FLASH_BAR
+	if (flash->size > SPI_FLASH_16MB_BOUN) {
+		puts("SF: Warning - Only lower 16MiB accessible,");
+		puts(" Full access #define CONFIG_SPI_FLASH_BAR\n");
+	}
+#endif
+
+	spi_release_bus(spi);
+
+	return flash;
+
+err_manufacturer_probe:
+err_read_id:
+	spi_release_bus(spi);
+err_claim_bus:
+	spi_free_slave(spi);
+	return NULL;
+}
+
+void *spi_flash_do_alloc(int offset, int size, struct spi_slave *spi,
+			 const char *name)
+{
+	struct spi_flash *flash;
+	void *ptr;
+
+	ptr = malloc(size);
+	if (!ptr) {
+		debug("SF: Failed to allocate memory\n");
+		return NULL;
+	}
+	memset(ptr, '\0', size);
+	flash = (struct spi_flash *)(ptr + offset);
+
+	/* Set up some basic fields - caller will sort out sizes */
+	flash->spi = spi;
+	flash->name = name;
+	flash->poll_cmd = CMD_READ_STATUS;
+
+	flash->read = spi_flash_cmd_read_fast;
+	flash->write = spi_flash_cmd_write_multi;
+	flash->erase = spi_flash_cmd_erase;
+
+	return flash;
+}
+
+void spi_flash_free(struct spi_flash *flash)
+{
+	spi_free_slave(flash->spi);
+	free(flash);
+}
-- 
1.8.3

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [U-Boot] [RESEND PATCH v2 02/20] sf: probe: Add new spi_flash_probe support
       [not found] <1375805851-32163-1-git-send-email-jaganna@xilinx.com>
  2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 01/20] sf: Divide spi_flash into multiple parts Jagannadha Sutradharudu Teki
@ 2013-08-06 16:17 ` Jagannadha Sutradharudu Teki
  2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 03/20] sf: probe: Add support for M25P* flash parts Jagannadha Sutradharudu Teki
                   ` (17 subsequent siblings)
  19 siblings, 0 replies; 23+ messages in thread
From: Jagannadha Sutradharudu Teki @ 2013-08-06 16:17 UTC (permalink / raw)
  To: u-boot

Added new spi_flash_probe support, currently added N25Q*
flash part attributes support.

Updated the sector_size attributes as per the flash parts.
Looks fine for with this sector_size for computing the size
of flash.

Defined CONFIG_SPI_FLASH_LEGACY for old probing style
which is available on spi_flash_probe_legacy.c, this will
removed soon once all flashes are supported in new spi_flash_probe.

Signed-off-by: Jagannadha Sutradharudu Teki <jaganna@xilinx.com>
---
Changes for v2:
        - Removed CONFIG_SPI_FLASH_NEW, add CONFIG_SPI_FLASH_LEGACY
        - Enable CONFIG_SPI_FLASH_STMICRO in spi_flash_params table
	- Updated few structure members

 drivers/mtd/spi/Makefile                 |   1 +
 drivers/mtd/spi/spi_flash_probe.c        | 230 ++++++++++++--------------
 drivers/mtd/spi/spi_flash_probe_legacy.c | 274 +++++++++++++++++++++++++++++++
 3 files changed, 384 insertions(+), 121 deletions(-)
 create mode 100644 drivers/mtd/spi/spi_flash_probe_legacy.c

diff --git a/drivers/mtd/spi/Makefile b/drivers/mtd/spi/Makefile
index 0304b12..452747a 100644
--- a/drivers/mtd/spi/Makefile
+++ b/drivers/mtd/spi/Makefile
@@ -13,6 +13,7 @@ ifdef CONFIG_SPL_BUILD
 COBJS-$(CONFIG_SPL_SPI_LOAD)	+= spi_spl_load.o
 endif
 
+COBJS-$(CONFIG_SPI_FLASH_LEGACY) += spi_flash_probe_legacy.o spi_flash_ops.o spi_flash.o
 COBJS-$(CONFIG_SPI_FLASH)	+= spi_flash_probe.o spi_flash_ops.o spi_flash.o
 COBJS-$(CONFIG_SPI_FLASH_ATMEL)	+= atmel.o
 COBJS-$(CONFIG_SPI_FLASH_EON)	+= eon.o
diff --git a/drivers/mtd/spi/spi_flash_probe.c b/drivers/mtd/spi/spi_flash_probe.c
index fedc81e..f2de72d 100644
--- a/drivers/mtd/spi/spi_flash_probe.c
+++ b/drivers/mtd/spi/spi_flash_probe.c
@@ -18,6 +18,98 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
+/*
+ * struct spi_flash_params - SPI/QSPI flash device params structure
+ *
+ * @name:		Device name ([MANUFLETTER][DEVTYPE][DENSITY][EXTRAINFO])
+ * @jedec:		Device jedec ID (0x[1byte_manuf_id][2byte_dev_id])
+ * @ext_jedec:		Device ext_jedec ID
+ * @sector_size:	Sector size of this device
+ * @nr_sectors:		No.of sectors on this device
+ */
+struct spi_flash_params {
+	const char *name;
+	u32 jedec;
+	u16 ext_jedec;
+	u32 sector_size;
+	u32 nr_sectors;
+};
+
+static const struct spi_flash_params spi_flash_params_table[] = {
+#ifdef CONFIG_SPI_FLASH_STMICRO		/* STMICRO */
+	{"N25Q32",		0x20ba16, 0x0,     64 * 1024,	  64},
+	{"N25Q32A",		0x20bb16, 0x0,     64 * 1024,	  64},
+	{"N25Q64",		0x20ba17, 0x0,     64 * 1024,	 128},
+	{"N25Q64A",		0x20bb17, 0x0,     64 * 1024,	 128},
+	{"N25Q128",		0x20ba18, 0x0,     64 * 1024,	 256},
+	{"N25Q128A",		0x20bb18, 0x0,     64 * 1024,	 256},
+	{"N25Q256",		0x20ba19, 0x0,     64 * 1024,	 512},
+	{"N25Q256A",		0x20bb19, 0x0,     64 * 1024,	 512},
+	{"N25Q512",		0x20ba20, 0x0,     64 * 1024,	1024},
+	{"N25Q512A",		0x20bb20, 0x0,     64 * 1024,	1024},
+	{"N25Q1024",		0x20ba21, 0x0,     64 * 1024,	2048},
+	{"N25Q1024A",		0x20bb21, 0x0,     64 * 1024,	2048},
+#endif
+	/*
+	 * TODO:
+	 * ATMEL
+	 * EON
+	 * GIGADEVICE
+	 * MACRONIX
+	 * RAMTRON
+	 * SPANSION
+	 * SST
+	 * STMICRO (M25*)
+	 * WINBOND
+	 */
+};
+
+struct spi_flash *spi_flash_validate_ids(struct spi_slave *spi, u8 *idcode)
+{
+	const struct spi_flash_params *params;
+	struct spi_flash *flash;
+	int i;
+	u16 jedec = idcode[1] << 8 | idcode[2];
+
+	/* Get the flash id (jedec = manuf_id + dev_id) */
+	for (i = 0; i < ARRAY_SIZE(spi_flash_params_table); i++) {
+		params = &spi_flash_params_table[i];
+		if ((params->jedec >> 16) == idcode[0]) {
+			if (((params->jedec << 16) >> 16) == jedec)
+				break;
+		}
+	}
+
+	if (i == ARRAY_SIZE(spi_flash_params_table)) {
+		printf("SF: Unsupported flash ID: manuf %02x, jedec %04x\n",
+		       idcode[0], jedec);
+		return NULL;
+	}
+
+	flash = malloc(sizeof(*flash));
+	if (!flash) {
+		debug("SF: Failed to allocate spi_flash\n");
+		return NULL;
+	}
+	memset(flash, '\0', sizeof(*flash));
+
+	flash->spi = spi;
+	flash->name = params->name;
+	flash->poll_cmd = CMD_READ_STATUS;
+
+	/* Assign spi_flash ops */
+	flash->write = spi_flash_cmd_write_multi;
+	flash->erase = spi_flash_cmd_erase;
+	flash->read = spi_flash_cmd_read_fast;
+
+	/* Compute the flash size */
+	flash->page_size = 256;
+	flash->sector_size = params->sector_size;
+	flash->size = flash->sector_size * params->nr_sectors;
+
+	return flash;
+}
+
 #ifdef CONFIG_SPI_FLASH_BAR
 int spi_flash_bank_config(struct spi_flash *flash, u8 idcode0)
 {
@@ -84,89 +176,22 @@ int spi_flash_decode_fdt(const void *blob, struct spi_flash *flash)
 }
 #endif /* CONFIG_OF_CONTROL */
 
-/*
- * The following table holds all device probe functions
- *
- * shift:  number of continuation bytes before the ID
- * idcode: the expected IDCODE or 0xff for non JEDEC devices
- * probe:  the function to call
- *
- * Non JEDEC devices should be ordered in the table such that
- * the probe functions with best detection algorithms come first.
- *
- * Several matching entries are permitted, they will be tried
- * in sequence until a probe function returns non NULL.
- *
- * IDCODE_CONT_LEN may be redefined if a device needs to declare a
- * larger "shift" value.  IDCODE_PART_LEN generally shouldn't be
- * changed.  This is the max number of bytes probe functions may
- * examine when looking up part-specific identification info.
- *
- * Probe functions will be given the idcode buffer starting at their
- * manu id byte (the "idcode" in the table below).  In other words,
- * all of the continuation bytes will be skipped (the "shift" below).
- */
-#define IDCODE_CONT_LEN 0
-#define IDCODE_PART_LEN 5
-static const struct {
-	const u8 shift;
-	const u8 idcode;
-	struct spi_flash *(*probe) (struct spi_slave *spi, u8 *idcode);
-} flashes[] = {
-	/* Keep it sorted by define name */
-#ifdef CONFIG_SPI_FLASH_ATMEL
-	{ 0, 0x1f, spi_flash_probe_atmel, },
-#endif
-#ifdef CONFIG_SPI_FLASH_EON
-	{ 0, 0x1c, spi_flash_probe_eon, },
-#endif
-#ifdef CONFIG_SPI_FLASH_GIGADEVICE
-	{ 0, 0xc8, spi_flash_probe_gigadevice, },
-#endif
-#ifdef CONFIG_SPI_FLASH_MACRONIX
-	{ 0, 0xc2, spi_flash_probe_macronix, },
-#endif
-#ifdef CONFIG_SPI_FLASH_SPANSION
-	{ 0, 0x01, spi_flash_probe_spansion, },
-#endif
-#ifdef CONFIG_SPI_FLASH_SST
-	{ 0, 0xbf, spi_flash_probe_sst, },
-#endif
-#ifdef CONFIG_SPI_FLASH_STMICRO
-	{ 0, 0x20, spi_flash_probe_stmicro, },
-#endif
-#ifdef CONFIG_SPI_FLASH_WINBOND
-	{ 0, 0xef, spi_flash_probe_winbond, },
-#endif
-#ifdef CONFIG_SPI_FRAM_RAMTRON
-	{ 6, 0xc2, spi_fram_probe_ramtron, },
-# undef IDCODE_CONT_LEN
-# define IDCODE_CONT_LEN 6
-#endif
-	/* Keep it sorted by best detection */
-#ifdef CONFIG_SPI_FLASH_STMICRO
-	{ 0, 0xff, spi_flash_probe_stmicro, },
-#endif
-#ifdef CONFIG_SPI_FRAM_RAMTRON_NON_JEDEC
-	{ 0, 0xff, spi_fram_probe_ramtron, },
-#endif
-};
-#define IDCODE_LEN (IDCODE_CONT_LEN + IDCODE_PART_LEN)
-
 struct spi_flash *spi_flash_probe(unsigned int bus, unsigned int cs,
 		unsigned int max_hz, unsigned int spi_mode)
 {
 	struct spi_slave *spi;
 	struct spi_flash *flash = NULL;
-	int ret, i, shift;
-	u8 idcode[IDCODE_LEN], *idp;
+	u8 idcode[5], *idp;
+	int ret;
 
+	/* Setup spi_slave */
 	spi = spi_setup_slave(bus, cs, max_hz, spi_mode);
 	if (!spi) {
 		printf("SF: Failed to set up slave\n");
 		return NULL;
 	}
 
+	/* Claim spi bus */
 	ret = spi_claim_bus(spi);
 	if (ret) {
 		debug("SF: Failed to claim SPI bus: %d\n", ret);
@@ -175,47 +200,36 @@ struct spi_flash *spi_flash_probe(unsigned int bus, unsigned int cs,
 
 	/* Read the ID codes */
 	ret = spi_flash_cmd(spi, CMD_READ_ID, idcode, sizeof(idcode));
-	if (ret)
+	if (ret) {
+		printf("SF: Failed to get idcodes\n");
 		goto err_read_id;
+	}
 
 #ifdef DEBUG
 	printf("SF: Got idcodes\n");
 	print_buffer(0, idcode, 1, sizeof(idcode), 0);
 #endif
 
-	/* count the number of continuation bytes */
-	for (shift = 0, idp = idcode;
-	     shift < IDCODE_CONT_LEN && *idp == 0x7f;
-	     ++shift, ++idp)
-		continue;
-
-	/* search the table for matches in shift and id */
-	for (i = 0; i < ARRAY_SIZE(flashes); ++i)
-		if (flashes[i].shift == shift && flashes[i].idcode == *idp) {
-			/* we have a match, call probe */
-			flash = flashes[i].probe(spi, idp);
-			if (flash)
-				break;
-		}
-
-	if (!flash) {
-		printf("SF: Unsupported manufacturer %02x\n", *idp);
-		goto err_manufacturer_probe;
-	}
+	/* Validate ID's from flash dev table */
+	idp = idcode;
+	flash = spi_flash_validate_ids(spi, idp);
+	if (!flash)
+		goto err_read_id;
 
 #ifdef CONFIG_SPI_FLASH_BAR
-	/* Configure the BAR - disover bank cmds and read current bank  */
+	/* Configure the BAR - discover bank cmds and read current bank  */
 	ret = spi_flash_bank_config(flash, *idp);
 	if (ret < 0)
-		goto err_manufacturer_probe;
+		goto err_read_id;
 #endif
 
 #ifdef CONFIG_OF_CONTROL
 	if (spi_flash_decode_fdt(gd->fdt_blob, flash)) {
 		debug("SF: FDT decode error\n");
-		goto err_manufacturer_probe;
+		goto err_read_id;
 	}
 #endif
+
 	printf("SF: Detected %s with page size ", flash->name);
 	print_size(flash->sector_size, ", total ");
 	print_size(flash->size, "");
@@ -229,11 +243,11 @@ struct spi_flash *spi_flash_probe(unsigned int bus, unsigned int cs,
 	}
 #endif
 
+	/* Release spi bus */
 	spi_release_bus(spi);
 
 	return flash;
 
-err_manufacturer_probe:
 err_read_id:
 	spi_release_bus(spi);
 err_claim_bus:
@@ -241,32 +255,6 @@ err_claim_bus:
 	return NULL;
 }
 
-void *spi_flash_do_alloc(int offset, int size, struct spi_slave *spi,
-			 const char *name)
-{
-	struct spi_flash *flash;
-	void *ptr;
-
-	ptr = malloc(size);
-	if (!ptr) {
-		debug("SF: Failed to allocate memory\n");
-		return NULL;
-	}
-	memset(ptr, '\0', size);
-	flash = (struct spi_flash *)(ptr + offset);
-
-	/* Set up some basic fields - caller will sort out sizes */
-	flash->spi = spi;
-	flash->name = name;
-	flash->poll_cmd = CMD_READ_STATUS;
-
-	flash->read = spi_flash_cmd_read_fast;
-	flash->write = spi_flash_cmd_write_multi;
-	flash->erase = spi_flash_cmd_erase;
-
-	return flash;
-}
-
 void spi_flash_free(struct spi_flash *flash)
 {
 	spi_free_slave(flash->spi);
diff --git a/drivers/mtd/spi/spi_flash_probe_legacy.c b/drivers/mtd/spi/spi_flash_probe_legacy.c
new file mode 100644
index 0000000..fedc81e
--- /dev/null
+++ b/drivers/mtd/spi/spi_flash_probe_legacy.c
@@ -0,0 +1,274 @@
+/*
+ * SPI flash probing
+ *
+ * Copyright (C) 2008 Atmel Corporation
+ * Copyright (C) 2010 Reinhard Meyer, EMK Elektronik
+ * Copyright (C) 2013 Jagannadha Sutradharudu Teki, Xilinx Inc.
+ *
+ * Licensed under the GPL-2 or later.
+ */
+
+#include <common.h>
+#include <fdtdec.h>
+#include <malloc.h>
+#include <spi.h>
+#include <spi_flash.h>
+
+#include "spi_flash_internal.h"
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#ifdef CONFIG_SPI_FLASH_BAR
+int spi_flash_bank_config(struct spi_flash *flash, u8 idcode0)
+{
+	u8 cmd;
+	u8 curr_bank = 0;
+
+	/* discover bank cmds */
+	switch (idcode0) {
+	case SPI_FLASH_SPANSION_IDCODE0:
+		flash->bank_read_cmd = CMD_BANKADDR_BRRD;
+		flash->bank_write_cmd = CMD_BANKADDR_BRWR;
+		break;
+	case SPI_FLASH_STMICRO_IDCODE0:
+	case SPI_FLASH_WINBOND_IDCODE0:
+		flash->bank_read_cmd = CMD_EXTNADDR_RDEAR;
+		flash->bank_write_cmd = CMD_EXTNADDR_WREAR;
+		break;
+	default:
+		printf("SF: Unsupported bank commands %02x\n", idcode0);
+		return -1;
+	}
+
+	/* read the bank reg - on which bank the flash is in currently */
+	cmd = flash->bank_read_cmd;
+	if (flash->size > SPI_FLASH_16MB_BOUN) {
+		if (spi_flash_read_common(flash, &cmd, 1, &curr_bank, 1)) {
+			debug("SF: fail to read bank addr register\n");
+			return -1;
+		}
+		flash->bank_curr = curr_bank;
+	} else {
+		flash->bank_curr = curr_bank;
+	}
+
+	return 0;
+}
+#endif
+
+#ifdef CONFIG_OF_CONTROL
+int spi_flash_decode_fdt(const void *blob, struct spi_flash *flash)
+{
+	fdt_addr_t addr;
+	fdt_size_t size;
+	int node;
+
+	/* If there is no node, do nothing */
+	node = fdtdec_next_compatible(blob, 0, COMPAT_GENERIC_SPI_FLASH);
+	if (node < 0)
+		return 0;
+
+	addr = fdtdec_get_addr_size(blob, node, "memory-map", &size);
+	if (addr == FDT_ADDR_T_NONE) {
+		debug("%s: Cannot decode address\n", __func__);
+		return 0;
+	}
+
+	if (flash->size != size) {
+		debug("%s: Memory map must cover entire device\n", __func__);
+		return -1;
+	}
+	flash->memory_map = (void *)addr;
+
+	return 0;
+}
+#endif /* CONFIG_OF_CONTROL */
+
+/*
+ * The following table holds all device probe functions
+ *
+ * shift:  number of continuation bytes before the ID
+ * idcode: the expected IDCODE or 0xff for non JEDEC devices
+ * probe:  the function to call
+ *
+ * Non JEDEC devices should be ordered in the table such that
+ * the probe functions with best detection algorithms come first.
+ *
+ * Several matching entries are permitted, they will be tried
+ * in sequence until a probe function returns non NULL.
+ *
+ * IDCODE_CONT_LEN may be redefined if a device needs to declare a
+ * larger "shift" value.  IDCODE_PART_LEN generally shouldn't be
+ * changed.  This is the max number of bytes probe functions may
+ * examine when looking up part-specific identification info.
+ *
+ * Probe functions will be given the idcode buffer starting at their
+ * manu id byte (the "idcode" in the table below).  In other words,
+ * all of the continuation bytes will be skipped (the "shift" below).
+ */
+#define IDCODE_CONT_LEN 0
+#define IDCODE_PART_LEN 5
+static const struct {
+	const u8 shift;
+	const u8 idcode;
+	struct spi_flash *(*probe) (struct spi_slave *spi, u8 *idcode);
+} flashes[] = {
+	/* Keep it sorted by define name */
+#ifdef CONFIG_SPI_FLASH_ATMEL
+	{ 0, 0x1f, spi_flash_probe_atmel, },
+#endif
+#ifdef CONFIG_SPI_FLASH_EON
+	{ 0, 0x1c, spi_flash_probe_eon, },
+#endif
+#ifdef CONFIG_SPI_FLASH_GIGADEVICE
+	{ 0, 0xc8, spi_flash_probe_gigadevice, },
+#endif
+#ifdef CONFIG_SPI_FLASH_MACRONIX
+	{ 0, 0xc2, spi_flash_probe_macronix, },
+#endif
+#ifdef CONFIG_SPI_FLASH_SPANSION
+	{ 0, 0x01, spi_flash_probe_spansion, },
+#endif
+#ifdef CONFIG_SPI_FLASH_SST
+	{ 0, 0xbf, spi_flash_probe_sst, },
+#endif
+#ifdef CONFIG_SPI_FLASH_STMICRO
+	{ 0, 0x20, spi_flash_probe_stmicro, },
+#endif
+#ifdef CONFIG_SPI_FLASH_WINBOND
+	{ 0, 0xef, spi_flash_probe_winbond, },
+#endif
+#ifdef CONFIG_SPI_FRAM_RAMTRON
+	{ 6, 0xc2, spi_fram_probe_ramtron, },
+# undef IDCODE_CONT_LEN
+# define IDCODE_CONT_LEN 6
+#endif
+	/* Keep it sorted by best detection */
+#ifdef CONFIG_SPI_FLASH_STMICRO
+	{ 0, 0xff, spi_flash_probe_stmicro, },
+#endif
+#ifdef CONFIG_SPI_FRAM_RAMTRON_NON_JEDEC
+	{ 0, 0xff, spi_fram_probe_ramtron, },
+#endif
+};
+#define IDCODE_LEN (IDCODE_CONT_LEN + IDCODE_PART_LEN)
+
+struct spi_flash *spi_flash_probe(unsigned int bus, unsigned int cs,
+		unsigned int max_hz, unsigned int spi_mode)
+{
+	struct spi_slave *spi;
+	struct spi_flash *flash = NULL;
+	int ret, i, shift;
+	u8 idcode[IDCODE_LEN], *idp;
+
+	spi = spi_setup_slave(bus, cs, max_hz, spi_mode);
+	if (!spi) {
+		printf("SF: Failed to set up slave\n");
+		return NULL;
+	}
+
+	ret = spi_claim_bus(spi);
+	if (ret) {
+		debug("SF: Failed to claim SPI bus: %d\n", ret);
+		goto err_claim_bus;
+	}
+
+	/* Read the ID codes */
+	ret = spi_flash_cmd(spi, CMD_READ_ID, idcode, sizeof(idcode));
+	if (ret)
+		goto err_read_id;
+
+#ifdef DEBUG
+	printf("SF: Got idcodes\n");
+	print_buffer(0, idcode, 1, sizeof(idcode), 0);
+#endif
+
+	/* count the number of continuation bytes */
+	for (shift = 0, idp = idcode;
+	     shift < IDCODE_CONT_LEN && *idp == 0x7f;
+	     ++shift, ++idp)
+		continue;
+
+	/* search the table for matches in shift and id */
+	for (i = 0; i < ARRAY_SIZE(flashes); ++i)
+		if (flashes[i].shift == shift && flashes[i].idcode == *idp) {
+			/* we have a match, call probe */
+			flash = flashes[i].probe(spi, idp);
+			if (flash)
+				break;
+		}
+
+	if (!flash) {
+		printf("SF: Unsupported manufacturer %02x\n", *idp);
+		goto err_manufacturer_probe;
+	}
+
+#ifdef CONFIG_SPI_FLASH_BAR
+	/* Configure the BAR - disover bank cmds and read current bank  */
+	ret = spi_flash_bank_config(flash, *idp);
+	if (ret < 0)
+		goto err_manufacturer_probe;
+#endif
+
+#ifdef CONFIG_OF_CONTROL
+	if (spi_flash_decode_fdt(gd->fdt_blob, flash)) {
+		debug("SF: FDT decode error\n");
+		goto err_manufacturer_probe;
+	}
+#endif
+	printf("SF: Detected %s with page size ", flash->name);
+	print_size(flash->sector_size, ", total ");
+	print_size(flash->size, "");
+	if (flash->memory_map)
+		printf(", mapped at %p", flash->memory_map);
+	puts("\n");
+#ifndef CONFIG_SPI_FLASH_BAR
+	if (flash->size > SPI_FLASH_16MB_BOUN) {
+		puts("SF: Warning - Only lower 16MiB accessible,");
+		puts(" Full access #define CONFIG_SPI_FLASH_BAR\n");
+	}
+#endif
+
+	spi_release_bus(spi);
+
+	return flash;
+
+err_manufacturer_probe:
+err_read_id:
+	spi_release_bus(spi);
+err_claim_bus:
+	spi_free_slave(spi);
+	return NULL;
+}
+
+void *spi_flash_do_alloc(int offset, int size, struct spi_slave *spi,
+			 const char *name)
+{
+	struct spi_flash *flash;
+	void *ptr;
+
+	ptr = malloc(size);
+	if (!ptr) {
+		debug("SF: Failed to allocate memory\n");
+		return NULL;
+	}
+	memset(ptr, '\0', size);
+	flash = (struct spi_flash *)(ptr + offset);
+
+	/* Set up some basic fields - caller will sort out sizes */
+	flash->spi = spi;
+	flash->name = name;
+	flash->poll_cmd = CMD_READ_STATUS;
+
+	flash->read = spi_flash_cmd_read_fast;
+	flash->write = spi_flash_cmd_write_multi;
+	flash->erase = spi_flash_cmd_erase;
+
+	return flash;
+}
+
+void spi_flash_free(struct spi_flash *flash)
+{
+	spi_free_slave(flash->spi);
+	free(flash);
+}
-- 
1.8.3

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [U-Boot] [RESEND PATCH v2 03/20] sf: probe: Add support for M25P* flash parts
       [not found] <1375805851-32163-1-git-send-email-jaganna@xilinx.com>
  2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 01/20] sf: Divide spi_flash into multiple parts Jagannadha Sutradharudu Teki
  2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 02/20] sf: probe: Add new spi_flash_probe support Jagannadha Sutradharudu Teki
@ 2013-08-06 16:17 ` Jagannadha Sutradharudu Teki
  2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 04/20] sf: probe: Add support for EN25Q* " Jagannadha Sutradharudu Teki
                   ` (16 subsequent siblings)
  19 siblings, 0 replies; 23+ messages in thread
From: Jagannadha Sutradharudu Teki @ 2013-08-06 16:17 UTC (permalink / raw)
  To: u-boot

Added M25P* parts are which are avilable in spi_flash_probe_legacy.c.

Updated the sector_size attributes as per the flash parts.
Looks fine for with this sector_size for computing the size of flash.

Signed-off-by: Jagannadha Sutradharudu Teki <jaganna@xilinx.com>
---
Changes for v2:
	- none

 drivers/mtd/spi/spi_flash_probe.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/drivers/mtd/spi/spi_flash_probe.c b/drivers/mtd/spi/spi_flash_probe.c
index f2de72d..a107978 100644
--- a/drivers/mtd/spi/spi_flash_probe.c
+++ b/drivers/mtd/spi/spi_flash_probe.c
@@ -37,6 +37,14 @@ struct spi_flash_params {
 
 static const struct spi_flash_params spi_flash_params_table[] = {
 #ifdef CONFIG_SPI_FLASH_STMICRO		/* STMICRO */
+	{"M25P10",		0x202011, 0x0,     32 * 1024,	   4},
+	{"M25P20",		0x202012, 0x0,     64 * 1024,	   4},
+	{"M25P40",		0x202013, 0x0,     64 * 1024,	   8},
+	{"M25P80",		0x202014, 0x0,     64 * 1024,	  16},
+	{"M25P16",		0x202015, 0x0,     64 * 1024,	  32},
+	{"M25P32",		0x202016, 0x0,     64 * 1024,	  64},
+	{"M25P64",		0x202017, 0x0,     64 * 1024,	 128},
+	{"M25P128",		0x202018, 0x0,    256 * 1024,	  64},
 	{"N25Q32",		0x20ba16, 0x0,     64 * 1024,	  64},
 	{"N25Q32A",		0x20bb16, 0x0,     64 * 1024,	  64},
 	{"N25Q64",		0x20ba17, 0x0,     64 * 1024,	 128},
@@ -59,7 +67,6 @@ static const struct spi_flash_params spi_flash_params_table[] = {
 	 * RAMTRON
 	 * SPANSION
 	 * SST
-	 * STMICRO (M25*)
 	 * WINBOND
 	 */
 };
-- 
1.8.3

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [U-Boot] [RESEND PATCH v2 04/20] sf: probe: Add support for EN25Q* flash parts
       [not found] <1375805851-32163-1-git-send-email-jaganna@xilinx.com>
                   ` (2 preceding siblings ...)
  2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 03/20] sf: probe: Add support for M25P* flash parts Jagannadha Sutradharudu Teki
@ 2013-08-06 16:17 ` Jagannadha Sutradharudu Teki
  2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 05/20] sf: probe: Add support for GD25* " Jagannadha Sutradharudu Teki
                   ` (15 subsequent siblings)
  19 siblings, 0 replies; 23+ messages in thread
From: Jagannadha Sutradharudu Teki @ 2013-08-06 16:17 UTC (permalink / raw)
  To: u-boot

Added EN25Q* parts are which are avilable in spi_flash_probe_legacy.c.

Updated the sector_size attributes as per the flash parts.
Looks fine for with this sector_size for computing the size
of flash.

Signed-off-by: Jagannadha Sutradharudu Teki <jaganna@xilinx.com>
---
Changes for v2:
	- Enable CONFIG_SPI_FLASH_EON

 drivers/mtd/spi/spi_flash_probe.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/mtd/spi/spi_flash_probe.c b/drivers/mtd/spi/spi_flash_probe.c
index a107978..4fd2b31 100644
--- a/drivers/mtd/spi/spi_flash_probe.c
+++ b/drivers/mtd/spi/spi_flash_probe.c
@@ -36,6 +36,10 @@ struct spi_flash_params {
 };
 
 static const struct spi_flash_params spi_flash_params_table[] = {
+#ifdef CONFIG_SPI_FLASH_EON		/* EON */
+	{"EN25Q32B",		0x1c3016, 0x0,	   64 * 1024,	  64},
+	{"EN25Q128B",		0x1c3018, 0x0,     64 * 1024,	 256},
+#endif
 #ifdef CONFIG_SPI_FLASH_STMICRO		/* STMICRO */
 	{"M25P10",		0x202011, 0x0,     32 * 1024,	   4},
 	{"M25P20",		0x202012, 0x0,     64 * 1024,	   4},
@@ -61,7 +65,6 @@ static const struct spi_flash_params spi_flash_params_table[] = {
 	/*
 	 * TODO:
 	 * ATMEL
-	 * EON
 	 * GIGADEVICE
 	 * MACRONIX
 	 * RAMTRON
-- 
1.8.3

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [U-Boot] [RESEND PATCH v2 05/20] sf: probe: Add support for GD25* flash parts
       [not found] <1375805851-32163-1-git-send-email-jaganna@xilinx.com>
                   ` (3 preceding siblings ...)
  2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 04/20] sf: probe: Add support for EN25Q* " Jagannadha Sutradharudu Teki
@ 2013-08-06 16:17 ` Jagannadha Sutradharudu Teki
  2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 06/20] sf: probe: Add support for MX25L* " Jagannadha Sutradharudu Teki
                   ` (14 subsequent siblings)
  19 siblings, 0 replies; 23+ messages in thread
From: Jagannadha Sutradharudu Teki @ 2013-08-06 16:17 UTC (permalink / raw)
  To: u-boot

Added GD25* parts are which are avilable in spi_flash_probe_legacy.c.

Updated the sector_size attributes as per the flash parts.
Looks fine for with this sector_size for computing the size
of flash.

Signed-off-by: Jagannadha Sutradharudu Teki <jaganna@xilinx.com>
---
Changes for v2:
	- Enable CONFIG_SPI_FLASH_GIGADEVICE

 drivers/mtd/spi/spi_flash_probe.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/mtd/spi/spi_flash_probe.c b/drivers/mtd/spi/spi_flash_probe.c
index 4fd2b31..21cd483 100644
--- a/drivers/mtd/spi/spi_flash_probe.c
+++ b/drivers/mtd/spi/spi_flash_probe.c
@@ -40,6 +40,10 @@ static const struct spi_flash_params spi_flash_params_table[] = {
 	{"EN25Q32B",		0x1c3016, 0x0,	   64 * 1024,	  64},
 	{"EN25Q128B",		0x1c3018, 0x0,     64 * 1024,	 256},
 #endif
+#ifdef CONFIG_SPI_FLASH_GIGADEVICE	/* GIGADEVICE */
+	{"GD25Q64B",		0xc84017, 0x0,	   64 * 1024,	 128},
+	{"GD25LQ32",		0xc86016, 0x0,	   64 * 1024,	  64},
+#endif
 #ifdef CONFIG_SPI_FLASH_STMICRO		/* STMICRO */
 	{"M25P10",		0x202011, 0x0,     32 * 1024,	   4},
 	{"M25P20",		0x202012, 0x0,     64 * 1024,	   4},
@@ -65,7 +69,6 @@ static const struct spi_flash_params spi_flash_params_table[] = {
 	/*
 	 * TODO:
 	 * ATMEL
-	 * GIGADEVICE
 	 * MACRONIX
 	 * RAMTRON
 	 * SPANSION
-- 
1.8.3

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [U-Boot] [RESEND PATCH v2 06/20] sf: probe: Add support for MX25L* flash parts
       [not found] <1375805851-32163-1-git-send-email-jaganna@xilinx.com>
                   ` (4 preceding siblings ...)
  2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 05/20] sf: probe: Add support for GD25* " Jagannadha Sutradharudu Teki
@ 2013-08-06 16:17 ` Jagannadha Sutradharudu Teki
  2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 07/20] sf: probe: Add support for W25* " Jagannadha Sutradharudu Teki
                   ` (13 subsequent siblings)
  19 siblings, 0 replies; 23+ messages in thread
From: Jagannadha Sutradharudu Teki @ 2013-08-06 16:17 UTC (permalink / raw)
  To: u-boot

Added MX25L* parts are which are avilable in spi_flash_probe_legacy.c.

Updated the sector_size attributes as per the flash parts.
Looks fine for with this sector_size for computing the size
of flash.

Signed-off-by: Jagannadha Sutradharudu Teki <jaganna@xilinx.com>
---
Changes for v2:
	- Enable CONFIG_SPI_FLASH_MACRONIX

 drivers/mtd/spi/spi_flash_probe.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/drivers/mtd/spi/spi_flash_probe.c b/drivers/mtd/spi/spi_flash_probe.c
index 21cd483..1544ab7 100644
--- a/drivers/mtd/spi/spi_flash_probe.c
+++ b/drivers/mtd/spi/spi_flash_probe.c
@@ -44,6 +44,15 @@ static const struct spi_flash_params spi_flash_params_table[] = {
 	{"GD25Q64B",		0xc84017, 0x0,	   64 * 1024,	 128},
 	{"GD25LQ32",		0xc86016, 0x0,	   64 * 1024,	  64},
 #endif
+#ifdef CONFIG_SPI_FLASH_MACRONIX	/* MACRONIX */
+	{"MX25L4005",		0xc22013, 0x0,	   64 * 1024,	   8},
+	{"MX25L8005",		0xc22014, 0x0,	   64 * 1024,	  16},
+	{"MX25L1605D",		0xc22015, 0x0,	   64 * 1024,	  32},
+	{"MX25L3205D",		0xc22016, 0x0,	   64 * 1024,	  64},
+	{"MX25L6405D",		0xc22017, 0x0,	   64 * 1024,	 128},
+	{"MX25L12805",		0xc22018, 0x0,	   64 * 1024,	 256},
+	{"MX25L12855E",		0xc22618, 0x0,	   64 * 1024,	 256},
+#endif
 #ifdef CONFIG_SPI_FLASH_STMICRO		/* STMICRO */
 	{"M25P10",		0x202011, 0x0,     32 * 1024,	   4},
 	{"M25P20",		0x202012, 0x0,     64 * 1024,	   4},
@@ -69,7 +78,6 @@ static const struct spi_flash_params spi_flash_params_table[] = {
 	/*
 	 * TODO:
 	 * ATMEL
-	 * MACRONIX
 	 * RAMTRON
 	 * SPANSION
 	 * SST
-- 
1.8.3

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [U-Boot] [RESEND PATCH v2 07/20] sf: probe: Add support for W25* flash parts
       [not found] <1375805851-32163-1-git-send-email-jaganna@xilinx.com>
                   ` (5 preceding siblings ...)
  2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 06/20] sf: probe: Add support for MX25L* " Jagannadha Sutradharudu Teki
@ 2013-08-06 16:17 ` Jagannadha Sutradharudu Teki
  2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 08/20] sf: probe: Add support for S25FL* " Jagannadha Sutradharudu Teki
                   ` (12 subsequent siblings)
  19 siblings, 0 replies; 23+ messages in thread
From: Jagannadha Sutradharudu Teki @ 2013-08-06 16:17 UTC (permalink / raw)
  To: u-boot

Added W25* parts are which are avilable in spi_flash_probe_legacy.c.

Updated the sector_size attributes as per the flash parts.
Looks fine for with this sector_size for computing the size
of flash.

Signed-off-by: Jagannadha Sutradharudu Teki <jaganna@xilinx.com>
---
Changes for v2:
	- Enable CONFIG_SPI_FLASH_WINBOND

 drivers/mtd/spi/spi_flash_probe.c | 33 ++++++++++++++++++++++++++++++++-
 1 file changed, 32 insertions(+), 1 deletion(-)

diff --git a/drivers/mtd/spi/spi_flash_probe.c b/drivers/mtd/spi/spi_flash_probe.c
index 1544ab7..347455f 100644
--- a/drivers/mtd/spi/spi_flash_probe.c
+++ b/drivers/mtd/spi/spi_flash_probe.c
@@ -75,13 +75,44 @@ static const struct spi_flash_params spi_flash_params_table[] = {
 	{"N25Q1024",		0x20ba21, 0x0,     64 * 1024,	2048},
 	{"N25Q1024A",		0x20bb21, 0x0,     64 * 1024,	2048},
 #endif
+#ifdef CONFIG_SPI_FLASH_WINBOND		/* WINBOND */
+	{"W25P80",		0xef2014, 0x0,	   64 * 1024,	  16},
+	{"W25P16",		0xef2015, 0x0,	   64 * 1024,	  32},
+	{"W25P32",		0xef2016, 0x0,	   64 * 1024,	  64},
+	{"W25X40",		0xef3013, 0x0,	   64 * 1024,	   8},
+	{"W25X16",		0xef3015, 0x0,	   64 * 1024,	  32},
+	{"W25X32",		0xef3016, 0x0,	   64 * 1024,	  64},
+	{"W25X64",		0xef3017, 0x0,	   64 * 1024,	 128},
+	{"W25Q80BL",		0xef4014, 0x0,	   64 * 1024,	  16},
+	{"W25Q16CL",		0xef4015, 0x0,	   64 * 1024,	  32},
+	{"W25Q32BV",		0xef4016, 0x0,	   64 * 1024,	  64},
+	{"W25Q64CV",		0xef4017, 0x0,	   64 * 1024,	 128},
+	{"W25Q128BV",		0xef4018, 0x0,	   64 * 1024,	 256},
+	{"W25Q256",		0xef4019, 0x0,	   64 * 1024,	 512},
+	{"W25Q80BW",		0xef5014, 0x0,	   64 * 1024,	  16},
+	{"W25Q16DW",		0xef6015, 0x0,	   64 * 1024,	  32},
+	{"W25Q32DW",		0xef6016, 0x0,	   64 * 1024,	  64},
+	{"W25Q64DW",		0xef6017, 0x0,	   64 * 1024,	 128},
+	{"W25Q128FW",		0xef6018, 0x0,	   64 * 1024,	 256},
+#endif
+	/*
+	 * Note:
+	 * Below paired flash devices has similar spi_flash_params params.
+	 * (W25Q80BL, W25Q80BV)
+	 * (W25Q16CL, W25Q16DV)
+	 * (W25Q32BV, W25Q32FV_SPI)
+	 * (W25Q64CV, W25Q64FV_SPI)
+	 * (W25Q128BV, W25Q128FV_SPI)
+	 * (W25Q32DW, W25Q32FV_QPI)
+	 * (W25Q64DW, W25Q64FV_QPI)
+	 * (W25Q128FW, W25Q128FV_QPI)
+	 */
 	/*
 	 * TODO:
 	 * ATMEL
 	 * RAMTRON
 	 * SPANSION
 	 * SST
-	 * WINBOND
 	 */
 };
 
-- 
1.8.3

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [U-Boot] [RESEND PATCH v2 08/20] sf: probe: Add support for S25FL* flash parts
       [not found] <1375805851-32163-1-git-send-email-jaganna@xilinx.com>
                   ` (6 preceding siblings ...)
  2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 07/20] sf: probe: Add support for W25* " Jagannadha Sutradharudu Teki
@ 2013-08-06 16:17 ` Jagannadha Sutradharudu Teki
  2013-08-06 19:49   ` Wolfgang Denk
  2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 09/20] sf: probe: Add support for SST25* " Jagannadha Sutradharudu Teki
                   ` (11 subsequent siblings)
  19 siblings, 1 reply; 23+ messages in thread
From: Jagannadha Sutradharudu Teki @ 2013-08-06 16:17 UTC (permalink / raw)
  To: u-boot

Added S25FL* parts are which are avilable in spi_flash_probe_legacy.c.

Updated the sector_size attributes as per the flash parts.
Looks fine for with this sector_size for computing the size
of flash.

Signed-off-by: Jagannadha Sutradharudu Teki <jaganna@xilinx.com>
---
Changes for v2:
	- Enable CONFIG_SPI_FLASH_SPANSION

 drivers/mtd/spi/spi_flash_probe.c | 28 +++++++++++++++++++++++-----
 1 file changed, 23 insertions(+), 5 deletions(-)

diff --git a/drivers/mtd/spi/spi_flash_probe.c b/drivers/mtd/spi/spi_flash_probe.c
index 347455f..c1daab3 100644
--- a/drivers/mtd/spi/spi_flash_probe.c
+++ b/drivers/mtd/spi/spi_flash_probe.c
@@ -53,6 +53,19 @@ static const struct spi_flash_params spi_flash_params_table[] = {
 	{"MX25L12805",		0xc22018, 0x0,	   64 * 1024,	 256},
 	{"MX25L12855E",		0xc22618, 0x0,	   64 * 1024,	 256},
 #endif
+#ifdef CONFIG_SPI_FLASH_SPANSION	/* SPANSION */
+	{"S25FL008A",		0x010213, 0x0,	   64 * 1024,	  16},
+	{"S25FL016A",		0x010214, 0x0,	   64 * 1024,	  32},
+	{"S25FL032A",		0x010215, 0x0,	   64 * 1024,	  64},
+	{"S25FL064A",		0x010216, 0x0,	   64 * 1024,	 128},
+	{"S25FL128P_256K",	0x012018, 0x0300, 256 * 1024,	  64},
+	{"S25FL128P_64K",	0x012018, 0x0301,  64 * 1024,	 256},
+	{"S25FL032P",		0x010215, 0x4d00,  64 * 1024,	  64},
+	{"S25FL064P",		0x010216, 0x4d00,  64 * 1024,	 128},
+	{"S25FL128S_64K",	0x012018, 0x4d01,  64 * 1024,	 256},
+	{"S25FL256S_64K",	0x010219, 0x4d01,  64 * 1024,	 512},
+	{"S25FL512S_64K",	0x010220, 0x4d01,  64 * 1024,	1024},
+#endif
 #ifdef CONFIG_SPI_FLASH_STMICRO		/* STMICRO */
 	{"M25P10",		0x202011, 0x0,     32 * 1024,	   4},
 	{"M25P20",		0x202012, 0x0,     64 * 1024,	   4},
@@ -98,6 +111,7 @@ static const struct spi_flash_params spi_flash_params_table[] = {
 	/*
 	 * Note:
 	 * Below paired flash devices has similar spi_flash_params params.
+	 * (S25FL129P_64K, S25FL128S_64K)
 	 * (W25Q80BL, W25Q80BV)
 	 * (W25Q16CL, W25Q16DV)
 	 * (W25Q32BV, W25Q32FV_SPI)
@@ -111,7 +125,6 @@ static const struct spi_flash_params spi_flash_params_table[] = {
 	 * TODO:
 	 * ATMEL
 	 * RAMTRON
-	 * SPANSION
 	 * SST
 	 */
 };
@@ -122,19 +135,24 @@ struct spi_flash *spi_flash_validate_ids(struct spi_slave *spi, u8 *idcode)
 	struct spi_flash *flash;
 	int i;
 	u16 jedec = idcode[1] << 8 | idcode[2];
+	u16 ext_jedec = idcode[3] << 8 | idcode[4];
 
-	/* Get the flash id (jedec = manuf_id + dev_id) */
+	/* Get the flash id (jedec = manuf_id + dev_id, ext_jedec) */
 	for (i = 0; i < ARRAY_SIZE(spi_flash_params_table); i++) {
 		params = &spi_flash_params_table[i];
 		if ((params->jedec >> 16) == idcode[0]) {
-			if (((params->jedec << 16) >> 16) == jedec)
+			if (((params->jedec << 16) >> 16) == jedec) {
+				if ((params->ext_jedec != 0) &&
+				    (params->ext_jedec == ext_jedec))
+					continue;
 				break;
+			}
 		}
 	}
 
 	if (i == ARRAY_SIZE(spi_flash_params_table)) {
-		printf("SF: Unsupported flash ID: manuf %02x, jedec %04x\n",
-		       idcode[0], jedec);
+		printf("SF: Unsupported flash ID: manuf %02x, jedec %04x "
+		       "ext_jedec %04x\n", idcode[0], jedec, ext_jedec);
 		return NULL;
 	}
 
-- 
1.8.3

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [U-Boot] [RESEND PATCH v2 09/20] sf: probe: Add support for SST25* flash parts
       [not found] <1375805851-32163-1-git-send-email-jaganna@xilinx.com>
                   ` (7 preceding siblings ...)
  2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 08/20] sf: probe: Add support for S25FL* " Jagannadha Sutradharudu Teki
@ 2013-08-06 16:17 ` Jagannadha Sutradharudu Teki
  2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 10/20] sf: probe: Add support for AT45DB* " Jagannadha Sutradharudu Teki
                   ` (10 subsequent siblings)
  19 siblings, 0 replies; 23+ messages in thread
From: Jagannadha Sutradharudu Teki @ 2013-08-06 16:17 UTC (permalink / raw)
  To: u-boot

Added SST25* parts are which are avilable in spi_flash_probe_legacy.c.

Updated the sector_size attributes as per the flash parts.
Looks fine for with this sector_size for computing the size
of flash.

Signed-off-by: Jagannadha Sutradharudu Teki <jaganna@xilinx.com>
---
Changes for v2:
	- Enable CONFIG_SPI_FLASH_SST

 drivers/mtd/spi/spi_flash_probe.c | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/drivers/mtd/spi/spi_flash_probe.c b/drivers/mtd/spi/spi_flash_probe.c
index c1daab3..34e7ca1 100644
--- a/drivers/mtd/spi/spi_flash_probe.c
+++ b/drivers/mtd/spi/spi_flash_probe.c
@@ -88,6 +88,18 @@ static const struct spi_flash_params spi_flash_params_table[] = {
 	{"N25Q1024",		0x20ba21, 0x0,     64 * 1024,	2048},
 	{"N25Q1024A",		0x20bb21, 0x0,     64 * 1024,	2048},
 #endif
+#ifdef CONFIG_SPI_FLASH_SST		/* SST */
+	{"SST25VF040B",		0xbf258d, 0x0,	   64 * 1024,	   8},
+	{"SST25VF080B",		0xbf258e, 0x0,	   64 * 1024,	  16},
+	{"SST25VF016B",		0xbf2541, 0x0,	   64 * 1024,	  32},
+	{"SST25VF032B",		0xbf254a, 0x0,	   64 * 1024,	  64},
+	{"SST25VF064C",		0xbf254b, 0x0,	   64 * 1024,	 128},
+	{"SST25WF512",		0xbf2501, 0x0,	   64 * 1024,	   1},
+	{"SST25WF010",		0xbf2502, 0x0,	   64 * 1024,	   2},
+	{"SST25WF020",		0xbf2503, 0x0,	   64 * 1024,	   4},
+	{"SST25WF040",		0xbf2504, 0x0,	   64 * 1024,	   8},
+	{"SST25WF080",		0xbf2505, 0x0,	   64 * 1024,	  16},
+#endif
 #ifdef CONFIG_SPI_FLASH_WINBOND		/* WINBOND */
 	{"W25P80",		0xef2014, 0x0,	   64 * 1024,	  16},
 	{"W25P16",		0xef2015, 0x0,	   64 * 1024,	  32},
@@ -125,7 +137,6 @@ static const struct spi_flash_params spi_flash_params_table[] = {
 	 * TODO:
 	 * ATMEL
 	 * RAMTRON
-	 * SST
 	 */
 };
 
-- 
1.8.3

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [U-Boot] [RESEND PATCH v2 10/20] sf: probe: Add support for AT45DB* flash parts
       [not found] <1375805851-32163-1-git-send-email-jaganna@xilinx.com>
                   ` (8 preceding siblings ...)
  2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 09/20] sf: probe: Add support for SST25* " Jagannadha Sutradharudu Teki
@ 2013-08-06 16:17 ` Jagannadha Sutradharudu Teki
  2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 11/20] sf: probe: Give proper spacing on flash table params Jagannadha Sutradharudu Teki
                   ` (9 subsequent siblings)
  19 siblings, 0 replies; 23+ messages in thread
From: Jagannadha Sutradharudu Teki @ 2013-08-06 16:17 UTC (permalink / raw)
  To: u-boot

Added AT45DB* parts are which are avilable in spi_flash_probe_legacy.c.

Updated the sector_size attributes as per the flash parts.
Looks fine for with this sector_size for computing the size
of flash.

Signed-off-by: Jagannadha Sutradharudu Teki <jaganna@xilinx.com>
---
Changes for v2:
	- Enable CONFIG_SPI_FLASH_ATMEL

 drivers/mtd/spi/spi_flash_probe.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/drivers/mtd/spi/spi_flash_probe.c b/drivers/mtd/spi/spi_flash_probe.c
index 34e7ca1..948fcdb 100644
--- a/drivers/mtd/spi/spi_flash_probe.c
+++ b/drivers/mtd/spi/spi_flash_probe.c
@@ -36,6 +36,15 @@ struct spi_flash_params {
 };
 
 static const struct spi_flash_params spi_flash_params_table[] = {
+#ifdef CONFIG_SPI_FLASH_ATMEL		/* ATMEL */
+	{"AT45DB011D",		0x1f2200, 0x0,	   64 * 1024,	   4},
+	{"AT45DB021D",		0x1f2300, 0x0,	   64 * 1024,	   8},
+	{"AT45DB041D",		0x1f2400, 0x0,	   64 * 1024,	   8},
+	{"AT45DB081D",		0x1f2500, 0x0,	   64 * 1024,	  16},
+	{"AT45DB161D",		0x1f2600, 0x0,	   64 * 1024,	  32},
+	{"AT45DB321D",		0x1f2700, 0x0,	   64 * 1024,	  64},
+	{"AT45DB641D",		0x1f2800, 0x0,	   64 * 1024,	 128},
+#endif
 #ifdef CONFIG_SPI_FLASH_EON		/* EON */
 	{"EN25Q32B",		0x1c3016, 0x0,	   64 * 1024,	  64},
 	{"EN25Q128B",		0x1c3018, 0x0,     64 * 1024,	 256},
@@ -135,7 +144,6 @@ static const struct spi_flash_params spi_flash_params_table[] = {
 	 */
 	/*
 	 * TODO:
-	 * ATMEL
 	 * RAMTRON
 	 */
 };
-- 
1.8.3

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [U-Boot] [RESEND PATCH v2 11/20] sf: probe: Give proper spacing on flash table params
       [not found] <1375805851-32163-1-git-send-email-jaganna@xilinx.com>
                   ` (9 preceding siblings ...)
  2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 10/20] sf: probe: Add support for AT45DB* " Jagannadha Sutradharudu Teki
@ 2013-08-06 16:17 ` Jagannadha Sutradharudu Teki
  2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 12/20] sf: probe: Add support for SST_WP Jagannadha Sutradharudu Teki
                   ` (8 subsequent siblings)
  19 siblings, 0 replies; 23+ messages in thread
From: Jagannadha Sutradharudu Teki @ 2013-08-06 16:17 UTC (permalink / raw)
  To: u-boot

Given proper spacing between flash table params.

Signed-off-by: Jagannadha Sutradharudu Teki <jaganna@xilinx.com>
---
 drivers/mtd/spi/spi_flash_probe.c | 154 +++++++++++++++++++-------------------
 1 file changed, 77 insertions(+), 77 deletions(-)

diff --git a/drivers/mtd/spi/spi_flash_probe.c b/drivers/mtd/spi/spi_flash_probe.c
index 948fcdb..94505b3 100644
--- a/drivers/mtd/spi/spi_flash_probe.c
+++ b/drivers/mtd/spi/spi_flash_probe.c
@@ -37,97 +37,97 @@ struct spi_flash_params {
 
 static const struct spi_flash_params spi_flash_params_table[] = {
 #ifdef CONFIG_SPI_FLASH_ATMEL		/* ATMEL */
-	{"AT45DB011D",		0x1f2200, 0x0,	   64 * 1024,	   4},
-	{"AT45DB021D",		0x1f2300, 0x0,	   64 * 1024,	   8},
-	{"AT45DB041D",		0x1f2400, 0x0,	   64 * 1024,	   8},
-	{"AT45DB081D",		0x1f2500, 0x0,	   64 * 1024,	  16},
-	{"AT45DB161D",		0x1f2600, 0x0,	   64 * 1024,	  32},
-	{"AT45DB321D",		0x1f2700, 0x0,	   64 * 1024,	  64},
-	{"AT45DB641D",		0x1f2800, 0x0,	   64 * 1024,	 128},
+	{"AT45DB011D",	   0x1f2200, 0x0,	64 * 1024,     4},
+	{"AT45DB021D",	   0x1f2300, 0x0,	64 * 1024,     8},
+	{"AT45DB041D",	   0x1f2400, 0x0,	64 * 1024,     8},
+	{"AT45DB081D",	   0x1f2500, 0x0,	64 * 1024,    16},
+	{"AT45DB161D",	   0x1f2600, 0x0,	64 * 1024,    32},
+	{"AT45DB321D",	   0x1f2700, 0x0,	64 * 1024,    64},
+	{"AT45DB641D",	   0x1f2800, 0x0,	64 * 1024,   128},
 #endif
 #ifdef CONFIG_SPI_FLASH_EON		/* EON */
-	{"EN25Q32B",		0x1c3016, 0x0,	   64 * 1024,	  64},
-	{"EN25Q128B",		0x1c3018, 0x0,     64 * 1024,	 256},
+	{"EN25Q32B",	   0x1c3016, 0x0,	64 * 1024,    64},
+	{"EN25Q128B",	   0x1c3018, 0x0,       64 * 1024,   256},
 #endif
 #ifdef CONFIG_SPI_FLASH_GIGADEVICE	/* GIGADEVICE */
-	{"GD25Q64B",		0xc84017, 0x0,	   64 * 1024,	 128},
-	{"GD25LQ32",		0xc86016, 0x0,	   64 * 1024,	  64},
+	{"GD25Q64B",	   0xc84017, 0x0,	64 * 1024,   128},
+	{"GD25LQ32",	   0xc86016, 0x0,	64 * 1024,    64},
 #endif
 #ifdef CONFIG_SPI_FLASH_MACRONIX	/* MACRONIX */
-	{"MX25L4005",		0xc22013, 0x0,	   64 * 1024,	   8},
-	{"MX25L8005",		0xc22014, 0x0,	   64 * 1024,	  16},
-	{"MX25L1605D",		0xc22015, 0x0,	   64 * 1024,	  32},
-	{"MX25L3205D",		0xc22016, 0x0,	   64 * 1024,	  64},
-	{"MX25L6405D",		0xc22017, 0x0,	   64 * 1024,	 128},
-	{"MX25L12805",		0xc22018, 0x0,	   64 * 1024,	 256},
-	{"MX25L12855E",		0xc22618, 0x0,	   64 * 1024,	 256},
+	{"MX25L4005",	   0xc22013, 0x0,	64 * 1024,     8},
+	{"MX25L8005",	   0xc22014, 0x0,	64 * 1024,    16},
+	{"MX25L1605D",	   0xc22015, 0x0,	64 * 1024,    32},
+	{"MX25L3205D",	   0xc22016, 0x0,	64 * 1024,    64},
+	{"MX25L6405D",	   0xc22017, 0x0,	64 * 1024,   128},
+	{"MX25L12805",	   0xc22018, 0x0,	64 * 1024,   256},
+	{"MX25L12855E",	   0xc22618, 0x0,	64 * 1024,   256},
 #endif
 #ifdef CONFIG_SPI_FLASH_SPANSION	/* SPANSION */
-	{"S25FL008A",		0x010213, 0x0,	   64 * 1024,	  16},
-	{"S25FL016A",		0x010214, 0x0,	   64 * 1024,	  32},
-	{"S25FL032A",		0x010215, 0x0,	   64 * 1024,	  64},
-	{"S25FL064A",		0x010216, 0x0,	   64 * 1024,	 128},
-	{"S25FL128P_256K",	0x012018, 0x0300, 256 * 1024,	  64},
-	{"S25FL128P_64K",	0x012018, 0x0301,  64 * 1024,	 256},
-	{"S25FL032P",		0x010215, 0x4d00,  64 * 1024,	  64},
-	{"S25FL064P",		0x010216, 0x4d00,  64 * 1024,	 128},
-	{"S25FL128S_64K",	0x012018, 0x4d01,  64 * 1024,	 256},
-	{"S25FL256S_64K",	0x010219, 0x4d01,  64 * 1024,	 512},
-	{"S25FL512S_64K",	0x010220, 0x4d01,  64 * 1024,	1024},
+	{"S25FL008A",	   0x010213, 0x0,	64 * 1024,    16},
+	{"S25FL016A",	   0x010214, 0x0,	64 * 1024,    32},
+	{"S25FL032A",	   0x010215, 0x0,	64 * 1024,    64},
+	{"S25FL064A",	   0x010216, 0x0,	64 * 1024,   128},
+	{"S25FL128P_256K", 0x012018, 0x0300,   256 * 1024,    64},
+	{"S25FL128P_64K",  0x012018, 0x0301,    64 * 1024,   256},
+	{"S25FL032P",	   0x010215, 0x4d00,    64 * 1024,    64},
+	{"S25FL064P",	   0x010216, 0x4d00,    64 * 1024,   128},
+	{"S25FL128S_64K",  0x012018, 0x4d01,    64 * 1024,   256},
+	{"S25FL256S_64K",  0x010219, 0x4d01,    64 * 1024,   512},
+	{"S25FL512S_64K",  0x010220, 0x4d01,    64 * 1024,  1024},
 #endif
 #ifdef CONFIG_SPI_FLASH_STMICRO		/* STMICRO */
-	{"M25P10",		0x202011, 0x0,     32 * 1024,	   4},
-	{"M25P20",		0x202012, 0x0,     64 * 1024,	   4},
-	{"M25P40",		0x202013, 0x0,     64 * 1024,	   8},
-	{"M25P80",		0x202014, 0x0,     64 * 1024,	  16},
-	{"M25P16",		0x202015, 0x0,     64 * 1024,	  32},
-	{"M25P32",		0x202016, 0x0,     64 * 1024,	  64},
-	{"M25P64",		0x202017, 0x0,     64 * 1024,	 128},
-	{"M25P128",		0x202018, 0x0,    256 * 1024,	  64},
-	{"N25Q32",		0x20ba16, 0x0,     64 * 1024,	  64},
-	{"N25Q32A",		0x20bb16, 0x0,     64 * 1024,	  64},
-	{"N25Q64",		0x20ba17, 0x0,     64 * 1024,	 128},
-	{"N25Q64A",		0x20bb17, 0x0,     64 * 1024,	 128},
-	{"N25Q128",		0x20ba18, 0x0,     64 * 1024,	 256},
-	{"N25Q128A",		0x20bb18, 0x0,     64 * 1024,	 256},
-	{"N25Q256",		0x20ba19, 0x0,     64 * 1024,	 512},
-	{"N25Q256A",		0x20bb19, 0x0,     64 * 1024,	 512},
-	{"N25Q512",		0x20ba20, 0x0,     64 * 1024,	1024},
-	{"N25Q512A",		0x20bb20, 0x0,     64 * 1024,	1024},
-	{"N25Q1024",		0x20ba21, 0x0,     64 * 1024,	2048},
-	{"N25Q1024A",		0x20bb21, 0x0,     64 * 1024,	2048},
+	{"M25P10",	   0x202011, 0x0,       32 * 1024,     4},
+	{"M25P20",	   0x202012, 0x0,       64 * 1024,     4},
+	{"M25P40",	   0x202013, 0x0,       64 * 1024,     8},
+	{"M25P80",	   0x202014, 0x0,       64 * 1024,    16},
+	{"M25P16",	   0x202015, 0x0,       64 * 1024,    32},
+	{"M25P32",	   0x202016, 0x0,       64 * 1024,    64},
+	{"M25P64",	   0x202017, 0x0,       64 * 1024,   128},
+	{"M25P128",	   0x202018, 0x0,      256 * 1024,    64},
+	{"N25Q32",	   0x20ba16, 0x0,       64 * 1024,    64},
+	{"N25Q32A",	   0x20bb16, 0x0,       64 * 1024,    64},
+	{"N25Q64",	   0x20ba17, 0x0,       64 * 1024,   128},
+	{"N25Q64A",	   0x20bb17, 0x0,       64 * 1024,   128},
+	{"N25Q128",	   0x20ba18, 0x0,       64 * 1024,   256},
+	{"N25Q128A",	   0x20bb18, 0x0,       64 * 1024,   256},
+	{"N25Q256",	   0x20ba19, 0x0,       64 * 1024,   512},
+	{"N25Q256A",	   0x20bb19, 0x0,       64 * 1024,   512},
+	{"N25Q512",	   0x20ba20, 0x0,       64 * 1024,  1024},
+	{"N25Q512A",	   0x20bb20, 0x0,       64 * 1024,  1024},
+	{"N25Q1024",	   0x20ba21, 0x0,       64 * 1024,  2048},
+	{"N25Q1024A",	   0x20bb21, 0x0,       64 * 1024,  2048},
 #endif
 #ifdef CONFIG_SPI_FLASH_SST		/* SST */
-	{"SST25VF040B",		0xbf258d, 0x0,	   64 * 1024,	   8},
-	{"SST25VF080B",		0xbf258e, 0x0,	   64 * 1024,	  16},
-	{"SST25VF016B",		0xbf2541, 0x0,	   64 * 1024,	  32},
-	{"SST25VF032B",		0xbf254a, 0x0,	   64 * 1024,	  64},
-	{"SST25VF064C",		0xbf254b, 0x0,	   64 * 1024,	 128},
-	{"SST25WF512",		0xbf2501, 0x0,	   64 * 1024,	   1},
-	{"SST25WF010",		0xbf2502, 0x0,	   64 * 1024,	   2},
-	{"SST25WF020",		0xbf2503, 0x0,	   64 * 1024,	   4},
-	{"SST25WF040",		0xbf2504, 0x0,	   64 * 1024,	   8},
-	{"SST25WF080",		0xbf2505, 0x0,	   64 * 1024,	  16},
+	{"SST25VF040B",	   0xbf258d, 0x0,	64 * 1024,     8},
+	{"SST25VF080B",	   0xbf258e, 0x0,	64 * 1024,    16},
+	{"SST25VF016B",	   0xbf2541, 0x0,	64 * 1024,    32},
+	{"SST25VF032B",	   0xbf254a, 0x0,	64 * 1024,    64},
+	{"SST25VF064C",	   0xbf254b, 0x0,	64 * 1024,   128},
+	{"SST25WF512",	   0xbf2501, 0x0,	64 * 1024,     1},
+	{"SST25WF010",	   0xbf2502, 0x0,	64 * 1024,     2},
+	{"SST25WF020",	   0xbf2503, 0x0,	64 * 1024,     4},
+	{"SST25WF040",	   0xbf2504, 0x0,	64 * 1024,     8},
+	{"SST25WF080",	   0xbf2505, 0x0,	64 * 1024,    16},
 #endif
 #ifdef CONFIG_SPI_FLASH_WINBOND		/* WINBOND */
-	{"W25P80",		0xef2014, 0x0,	   64 * 1024,	  16},
-	{"W25P16",		0xef2015, 0x0,	   64 * 1024,	  32},
-	{"W25P32",		0xef2016, 0x0,	   64 * 1024,	  64},
-	{"W25X40",		0xef3013, 0x0,	   64 * 1024,	   8},
-	{"W25X16",		0xef3015, 0x0,	   64 * 1024,	  32},
-	{"W25X32",		0xef3016, 0x0,	   64 * 1024,	  64},
-	{"W25X64",		0xef3017, 0x0,	   64 * 1024,	 128},
-	{"W25Q80BL",		0xef4014, 0x0,	   64 * 1024,	  16},
-	{"W25Q16CL",		0xef4015, 0x0,	   64 * 1024,	  32},
-	{"W25Q32BV",		0xef4016, 0x0,	   64 * 1024,	  64},
-	{"W25Q64CV",		0xef4017, 0x0,	   64 * 1024,	 128},
-	{"W25Q128BV",		0xef4018, 0x0,	   64 * 1024,	 256},
-	{"W25Q256",		0xef4019, 0x0,	   64 * 1024,	 512},
-	{"W25Q80BW",		0xef5014, 0x0,	   64 * 1024,	  16},
-	{"W25Q16DW",		0xef6015, 0x0,	   64 * 1024,	  32},
-	{"W25Q32DW",		0xef6016, 0x0,	   64 * 1024,	  64},
-	{"W25Q64DW",		0xef6017, 0x0,	   64 * 1024,	 128},
-	{"W25Q128FW",		0xef6018, 0x0,	   64 * 1024,	 256},
+	{"W25P80",	   0xef2014, 0x0,	64 * 1024,    16},
+	{"W25P16",	   0xef2015, 0x0,	64 * 1024,    32},
+	{"W25P32",	   0xef2016, 0x0,	64 * 1024,    64},
+	{"W25X40",	   0xef3013, 0x0,	64 * 1024,     8},
+	{"W25X16",	   0xef3015, 0x0,	64 * 1024,    32},
+	{"W25X32",	   0xef3016, 0x0,	64 * 1024,    64},
+	{"W25X64",	   0xef3017, 0x0,	64 * 1024,   128},
+	{"W25Q80BL",	   0xef4014, 0x0,	64 * 1024,    16},
+	{"W25Q16CL",	   0xef4015, 0x0,	64 * 1024,    32},
+	{"W25Q32BV",	   0xef4016, 0x0,	64 * 1024,    64},
+	{"W25Q64CV",	   0xef4017, 0x0,	64 * 1024,   128},
+	{"W25Q128BV",	   0xef4018, 0x0,	64 * 1024,   256},
+	{"W25Q256",	   0xef4019, 0x0,	64 * 1024,   512},
+	{"W25Q80BW",	   0xef5014, 0x0,	64 * 1024,    16},
+	{"W25Q16DW",	   0xef6015, 0x0,	64 * 1024,    32},
+	{"W25Q32DW",	   0xef6016, 0x0,	64 * 1024,    64},
+	{"W25Q64DW",	   0xef6017, 0x0,	64 * 1024,   128},
+	{"W25Q128FW",	   0xef6018, 0x0,	64 * 1024,   256},
 #endif
 	/*
 	 * Note:
-- 
1.8.3

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [U-Boot] [RESEND PATCH v2 12/20] sf: probe: Add support for SST_WP
       [not found] <1375805851-32163-1-git-send-email-jaganna@xilinx.com>
                   ` (10 preceding siblings ...)
  2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 11/20] sf: probe: Give proper spacing on flash table params Jagannadha Sutradharudu Teki
@ 2013-08-06 16:17 ` Jagannadha Sutradharudu Teki
  2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 13/20] sf: probe: Add support to clear flash BP# bits Jagannadha Sutradharudu Teki
                   ` (7 subsequent siblings)
  19 siblings, 0 replies; 23+ messages in thread
From: Jagannadha Sutradharudu Teki @ 2013-08-06 16:17 UTC (permalink / raw)
  To: u-boot

Most of the SST flashes needs to write up using SST_WP, AAI
Word Program, so added a flag param on spi_flash_params table.

SST flashes, which supports SST_WP need to use a WP write
sst_write_wp instead of common flash write.

Signed-off-by: Jagannadha Sutradharudu Teki <jaganna@xilinx.com>
---
Changes for v2:
	- none

 drivers/mtd/spi/spi_flash_internal.h |   5 ++
 drivers/mtd/spi/spi_flash_ops.c      |  93 ++++++++++++++++++++
 drivers/mtd/spi/spi_flash_probe.c    | 160 ++++++++++++++++++-----------------
 include/spi_flash.h                  |   7 ++
 4 files changed, 188 insertions(+), 77 deletions(-)

diff --git a/drivers/mtd/spi/spi_flash_internal.h b/drivers/mtd/spi/spi_flash_internal.h
index af1afa9..ce34ce0 100644
--- a/drivers/mtd/spi/spi_flash_internal.h
+++ b/drivers/mtd/spi/spi_flash_internal.h
@@ -75,6 +75,11 @@ int spi_flash_cmd_write(struct spi_slave *spi, const u8 *cmd, size_t cmd_len,
 int spi_flash_cmd_write_multi(struct spi_flash *flash, u32 offset,
 		size_t len, const void *buf);
 
+#ifdef CONFIG_SPI_FLASH_SST
+int sst_write_wp(struct spi_flash *flash, u32 offset, size_t len,
+		const void *buf);
+#endif
+
 /*
  * Enable writing on the SPI flash.
  */
diff --git a/drivers/mtd/spi/spi_flash_ops.c b/drivers/mtd/spi/spi_flash_ops.c
index 6133363..79381b1 100644
--- a/drivers/mtd/spi/spi_flash_ops.c
+++ b/drivers/mtd/spi/spi_flash_ops.c
@@ -312,3 +312,96 @@ int spi_flash_cmd_read_fast(struct spi_flash *flash, u32 offset,
 
 	return ret;
 }
+
+#ifdef CONFIG_SPI_FLASH_SST
+static int sst_byte_write(struct spi_flash *flash, u32 offset, const void *buf)
+{
+	int ret;
+	u8 cmd[4] = {
+		CMD_SST_BP,
+		offset >> 16,
+		offset >> 8,
+		offset,
+	};
+
+	debug("BP[%02x]: 0x%p => cmd = { 0x%02x 0x%06x }\n",
+	      spi_w8r8(flash->spi, CMD_READ_STATUS), buf, cmd[0], offset);
+
+	ret = spi_flash_cmd_write_enable(flash);
+	if (ret)
+		return ret;
+
+	ret = spi_flash_cmd_write(flash->spi, cmd, sizeof(cmd), buf, 1);
+	if (ret)
+		return ret;
+
+	return spi_flash_cmd_wait_ready(flash, SPI_FLASH_PROG_TIMEOUT);
+}
+
+int sst_write_wp(struct spi_flash *flash, u32 offset, size_t len,
+		const void *buf)
+{
+	size_t actual, cmd_len;
+	int ret;
+	u8 cmd[4];
+
+	ret = spi_claim_bus(flash->spi);
+	if (ret) {
+		debug("SF: Unable to claim SPI bus\n");
+		return ret;
+	}
+
+	/* If the data is not word aligned, write out leading single byte */
+	actual = offset % 2;
+	if (actual) {
+		ret = sst_byte_write(flash, offset, buf);
+		if (ret)
+			goto done;
+	}
+	offset += actual;
+
+	ret = spi_flash_cmd_write_enable(flash);
+	if (ret)
+		goto done;
+
+	cmd_len = 4;
+	cmd[0] = CMD_SST_AAI_WP;
+	cmd[1] = offset >> 16;
+	cmd[2] = offset >> 8;
+	cmd[3] = offset;
+
+	for (; actual < len - 1; actual += 2) {
+		debug("WP[%02x]: 0x%p => cmd = { 0x%02x 0x%06x }\n",
+		      spi_w8r8(flash->spi, CMD_READ_STATUS), buf + actual,
+		      cmd[0], offset);
+
+		ret = spi_flash_cmd_write(flash->spi, cmd, cmd_len,
+					buf + actual, 2);
+		if (ret) {
+			debug("SF: sst word program failed\n");
+			break;
+		}
+
+		ret = spi_flash_cmd_wait_ready(flash, SPI_FLASH_PROG_TIMEOUT);
+		if (ret)
+			break;
+
+		cmd_len = 1;
+		offset += 2;
+	}
+
+	if (!ret)
+		ret = spi_flash_cmd_write_disable(flash);
+
+	/* If there is a single trailing byte, write it out */
+	if (!ret && actual != len)
+		ret = sst_byte_write(flash, offset, buf + actual);
+
+ done:
+	debug("SF: sst: program %s %zu bytes @ 0x%zx\n",
+	      ret ? "failure" : "success", len, offset - actual);
+
+	spi_release_bus(flash->spi);
+	return ret;
+}
+#endif
diff --git a/drivers/mtd/spi/spi_flash_probe.c b/drivers/mtd/spi/spi_flash_probe.c
index 94505b3..e045e53 100644
--- a/drivers/mtd/spi/spi_flash_probe.c
+++ b/drivers/mtd/spi/spi_flash_probe.c
@@ -26,6 +26,7 @@ DECLARE_GLOBAL_DATA_PTR;
  * @ext_jedec:		Device ext_jedec ID
  * @sector_size:	Sector size of this device
  * @nr_sectors:		No.of sectors on this device
+ * @flags:		Importent param, for flash specific behaviour
  */
 struct spi_flash_params {
 	const char *name;
@@ -33,101 +34,102 @@ struct spi_flash_params {
 	u16 ext_jedec;
 	u32 sector_size;
 	u32 nr_sectors;
+	u16 flags;
 };
 
 static const struct spi_flash_params spi_flash_params_table[] = {
 #ifdef CONFIG_SPI_FLASH_ATMEL		/* ATMEL */
-	{"AT45DB011D",	   0x1f2200, 0x0,	64 * 1024,     4},
-	{"AT45DB021D",	   0x1f2300, 0x0,	64 * 1024,     8},
-	{"AT45DB041D",	   0x1f2400, 0x0,	64 * 1024,     8},
-	{"AT45DB081D",	   0x1f2500, 0x0,	64 * 1024,    16},
-	{"AT45DB161D",	   0x1f2600, 0x0,	64 * 1024,    32},
-	{"AT45DB321D",	   0x1f2700, 0x0,	64 * 1024,    64},
-	{"AT45DB641D",	   0x1f2800, 0x0,	64 * 1024,   128},
+	{"AT45DB011D",	   0x1f2200, 0x0,	64 * 1024,     4,	     0},
+	{"AT45DB021D",	   0x1f2300, 0x0,	64 * 1024,     8,	     0},
+	{"AT45DB041D",	   0x1f2400, 0x0,	64 * 1024,     8,	     0},
+	{"AT45DB081D",	   0x1f2500, 0x0,	64 * 1024,    16,	     0},
+	{"AT45DB161D",	   0x1f2600, 0x0,	64 * 1024,    32,	     0},
+	{"AT45DB321D",	   0x1f2700, 0x0,	64 * 1024,    64,	     0},
+	{"AT45DB641D",	   0x1f2800, 0x0,	64 * 1024,   128,	     0},
 #endif
 #ifdef CONFIG_SPI_FLASH_EON		/* EON */
-	{"EN25Q32B",	   0x1c3016, 0x0,	64 * 1024,    64},
-	{"EN25Q128B",	   0x1c3018, 0x0,       64 * 1024,   256},
+	{"EN25Q32B",	   0x1c3016, 0x0,	64 * 1024,    64,	     0},
+	{"EN25Q128B",	   0x1c3018, 0x0,       64 * 1024,   256,	     0},
 #endif
 #ifdef CONFIG_SPI_FLASH_GIGADEVICE	/* GIGADEVICE */
-	{"GD25Q64B",	   0xc84017, 0x0,	64 * 1024,   128},
-	{"GD25LQ32",	   0xc86016, 0x0,	64 * 1024,    64},
+	{"GD25Q64B",	   0xc84017, 0x0,	64 * 1024,   128,	     0},
+	{"GD25LQ32",	   0xc86016, 0x0,	64 * 1024,    64,	     0},
 #endif
 #ifdef CONFIG_SPI_FLASH_MACRONIX	/* MACRONIX */
-	{"MX25L4005",	   0xc22013, 0x0,	64 * 1024,     8},
-	{"MX25L8005",	   0xc22014, 0x0,	64 * 1024,    16},
-	{"MX25L1605D",	   0xc22015, 0x0,	64 * 1024,    32},
-	{"MX25L3205D",	   0xc22016, 0x0,	64 * 1024,    64},
-	{"MX25L6405D",	   0xc22017, 0x0,	64 * 1024,   128},
-	{"MX25L12805",	   0xc22018, 0x0,	64 * 1024,   256},
-	{"MX25L12855E",	   0xc22618, 0x0,	64 * 1024,   256},
+	{"MX25L4005",	   0xc22013, 0x0,	64 * 1024,     8,	     0},
+	{"MX25L8005",	   0xc22014, 0x0,	64 * 1024,    16,	     0},
+	{"MX25L1605D",	   0xc22015, 0x0,	64 * 1024,    32,	     0},
+	{"MX25L3205D",	   0xc22016, 0x0,	64 * 1024,    64,	     0},
+	{"MX25L6405D",	   0xc22017, 0x0,	64 * 1024,   128,	     0},
+	{"MX25L12805",	   0xc22018, 0x0,	64 * 1024,   256,	     0},
+	{"MX25L12855E",	   0xc22618, 0x0,	64 * 1024,   256,	     0},
 #endif
 #ifdef CONFIG_SPI_FLASH_SPANSION	/* SPANSION */
-	{"S25FL008A",	   0x010213, 0x0,	64 * 1024,    16},
-	{"S25FL016A",	   0x010214, 0x0,	64 * 1024,    32},
-	{"S25FL032A",	   0x010215, 0x0,	64 * 1024,    64},
-	{"S25FL064A",	   0x010216, 0x0,	64 * 1024,   128},
-	{"S25FL128P_256K", 0x012018, 0x0300,   256 * 1024,    64},
-	{"S25FL128P_64K",  0x012018, 0x0301,    64 * 1024,   256},
-	{"S25FL032P",	   0x010215, 0x4d00,    64 * 1024,    64},
-	{"S25FL064P",	   0x010216, 0x4d00,    64 * 1024,   128},
-	{"S25FL128S_64K",  0x012018, 0x4d01,    64 * 1024,   256},
-	{"S25FL256S_64K",  0x010219, 0x4d01,    64 * 1024,   512},
-	{"S25FL512S_64K",  0x010220, 0x4d01,    64 * 1024,  1024},
+	{"S25FL008A",	   0x010213, 0x0,	64 * 1024,    16,	     0},
+	{"S25FL016A",	   0x010214, 0x0,	64 * 1024,    32,	     0},
+	{"S25FL032A",	   0x010215, 0x0,	64 * 1024,    64,	     0},
+	{"S25FL064A",	   0x010216, 0x0,	64 * 1024,   128,	     0},
+	{"S25FL128P_256K", 0x012018, 0x0300,   256 * 1024,    64,	     0},
+	{"S25FL128P_64K",  0x012018, 0x0301,    64 * 1024,   256,	     0},
+	{"S25FL032P",	   0x010215, 0x4d00,    64 * 1024,    64,	     0},
+	{"S25FL064P",	   0x010216, 0x4d00,    64 * 1024,   128,	     0},
+	{"S25FL128S_64K",  0x012018, 0x4d01,    64 * 1024,   256,	     0},
+	{"S25FL256S_64K",  0x010219, 0x4d01,    64 * 1024,   512,	     0},
+	{"S25FL512S_64K",  0x010220, 0x4d01,    64 * 1024,  1024,	     0},
 #endif
 #ifdef CONFIG_SPI_FLASH_STMICRO		/* STMICRO */
-	{"M25P10",	   0x202011, 0x0,       32 * 1024,     4},
-	{"M25P20",	   0x202012, 0x0,       64 * 1024,     4},
-	{"M25P40",	   0x202013, 0x0,       64 * 1024,     8},
-	{"M25P80",	   0x202014, 0x0,       64 * 1024,    16},
-	{"M25P16",	   0x202015, 0x0,       64 * 1024,    32},
-	{"M25P32",	   0x202016, 0x0,       64 * 1024,    64},
-	{"M25P64",	   0x202017, 0x0,       64 * 1024,   128},
-	{"M25P128",	   0x202018, 0x0,      256 * 1024,    64},
-	{"N25Q32",	   0x20ba16, 0x0,       64 * 1024,    64},
-	{"N25Q32A",	   0x20bb16, 0x0,       64 * 1024,    64},
-	{"N25Q64",	   0x20ba17, 0x0,       64 * 1024,   128},
-	{"N25Q64A",	   0x20bb17, 0x0,       64 * 1024,   128},
-	{"N25Q128",	   0x20ba18, 0x0,       64 * 1024,   256},
-	{"N25Q128A",	   0x20bb18, 0x0,       64 * 1024,   256},
-	{"N25Q256",	   0x20ba19, 0x0,       64 * 1024,   512},
-	{"N25Q256A",	   0x20bb19, 0x0,       64 * 1024,   512},
-	{"N25Q512",	   0x20ba20, 0x0,       64 * 1024,  1024},
-	{"N25Q512A",	   0x20bb20, 0x0,       64 * 1024,  1024},
-	{"N25Q1024",	   0x20ba21, 0x0,       64 * 1024,  2048},
-	{"N25Q1024A",	   0x20bb21, 0x0,       64 * 1024,  2048},
+	{"M25P10",	   0x202011, 0x0,       32 * 1024,     4,	     0},
+	{"M25P20",	   0x202012, 0x0,       64 * 1024,     4,	     0},
+	{"M25P40",	   0x202013, 0x0,       64 * 1024,     8,	     0},
+	{"M25P80",	   0x202014, 0x0,       64 * 1024,    16,	     0},
+	{"M25P16",	   0x202015, 0x0,       64 * 1024,    32,	     0},
+	{"M25P32",	   0x202016, 0x0,       64 * 1024,    64,	     0},
+	{"M25P64",	   0x202017, 0x0,       64 * 1024,   128,	     0},
+	{"M25P128",	   0x202018, 0x0,      256 * 1024,    64,	     0},
+	{"N25Q32",	   0x20ba16, 0x0,       64 * 1024,    64,	     0},
+	{"N25Q32A",	   0x20bb16, 0x0,       64 * 1024,    64,	     0},
+	{"N25Q64",	   0x20ba17, 0x0,       64 * 1024,   128,	     0},
+	{"N25Q64A",	   0x20bb17, 0x0,       64 * 1024,   128,	     0},
+	{"N25Q128",	   0x20ba18, 0x0,       64 * 1024,   256,	     0},
+	{"N25Q128A",	   0x20bb18, 0x0,       64 * 1024,   256,	     0},
+	{"N25Q256",	   0x20ba19, 0x0,       64 * 1024,   512,	     0},
+	{"N25Q256A",	   0x20bb19, 0x0,       64 * 1024,   512,	     0},
+	{"N25Q512",	   0x20ba20, 0x0,       64 * 1024,  1024,	     0},
+	{"N25Q512A",	   0x20bb20, 0x0,       64 * 1024,  1024,	     0},
+	{"N25Q1024",	   0x20ba21, 0x0,       64 * 1024,  2048,	     0},
+	{"N25Q1024A",	   0x20bb21, 0x0,       64 * 1024,  2048,	     0},
 #endif
 #ifdef CONFIG_SPI_FLASH_SST		/* SST */
-	{"SST25VF040B",	   0xbf258d, 0x0,	64 * 1024,     8},
-	{"SST25VF080B",	   0xbf258e, 0x0,	64 * 1024,    16},
-	{"SST25VF016B",	   0xbf2541, 0x0,	64 * 1024,    32},
-	{"SST25VF032B",	   0xbf254a, 0x0,	64 * 1024,    64},
-	{"SST25VF064C",	   0xbf254b, 0x0,	64 * 1024,   128},
-	{"SST25WF512",	   0xbf2501, 0x0,	64 * 1024,     1},
-	{"SST25WF010",	   0xbf2502, 0x0,	64 * 1024,     2},
-	{"SST25WF020",	   0xbf2503, 0x0,	64 * 1024,     4},
-	{"SST25WF040",	   0xbf2504, 0x0,	64 * 1024,     8},
-	{"SST25WF080",	   0xbf2505, 0x0,	64 * 1024,    16},
+	{"SST25VF040B",	   0xbf258d, 0x0,	64 * 1024,     8,	SST_WP},
+	{"SST25VF080B",	   0xbf258e, 0x0,	64 * 1024,    16,	SST_WP},
+	{"SST25VF016B",	   0xbf2541, 0x0,	64 * 1024,    32,	SST_WP},
+	{"SST25VF032B",	   0xbf254a, 0x0,	64 * 1024,    64,	SST_WP},
+	{"SST25VF064C",	   0xbf254b, 0x0,	64 * 1024,   128,	     0},
+	{"SST25WF512",	   0xbf2501, 0x0,	64 * 1024,     1,	SST_WP},
+	{"SST25WF010",	   0xbf2502, 0x0,	64 * 1024,     2,	SST_WP},
+	{"SST25WF020",	   0xbf2503, 0x0,	64 * 1024,     4,	SST_WP},
+	{"SST25WF040",	   0xbf2504, 0x0,	64 * 1024,     8,	SST_WP},
+	{"SST25WF080",	   0xbf2505, 0x0,	64 * 1024,    16,	SST_WP},
 #endif
 #ifdef CONFIG_SPI_FLASH_WINBOND		/* WINBOND */
-	{"W25P80",	   0xef2014, 0x0,	64 * 1024,    16},
-	{"W25P16",	   0xef2015, 0x0,	64 * 1024,    32},
-	{"W25P32",	   0xef2016, 0x0,	64 * 1024,    64},
-	{"W25X40",	   0xef3013, 0x0,	64 * 1024,     8},
-	{"W25X16",	   0xef3015, 0x0,	64 * 1024,    32},
-	{"W25X32",	   0xef3016, 0x0,	64 * 1024,    64},
-	{"W25X64",	   0xef3017, 0x0,	64 * 1024,   128},
-	{"W25Q80BL",	   0xef4014, 0x0,	64 * 1024,    16},
-	{"W25Q16CL",	   0xef4015, 0x0,	64 * 1024,    32},
-	{"W25Q32BV",	   0xef4016, 0x0,	64 * 1024,    64},
-	{"W25Q64CV",	   0xef4017, 0x0,	64 * 1024,   128},
-	{"W25Q128BV",	   0xef4018, 0x0,	64 * 1024,   256},
-	{"W25Q256",	   0xef4019, 0x0,	64 * 1024,   512},
-	{"W25Q80BW",	   0xef5014, 0x0,	64 * 1024,    16},
-	{"W25Q16DW",	   0xef6015, 0x0,	64 * 1024,    32},
-	{"W25Q32DW",	   0xef6016, 0x0,	64 * 1024,    64},
-	{"W25Q64DW",	   0xef6017, 0x0,	64 * 1024,   128},
-	{"W25Q128FW",	   0xef6018, 0x0,	64 * 1024,   256},
+	{"W25P80",	   0xef2014, 0x0,	64 * 1024,    16,	     0},
+	{"W25P16",	   0xef2015, 0x0,	64 * 1024,    32,	     0},
+	{"W25P32",	   0xef2016, 0x0,	64 * 1024,    64,	     0},
+	{"W25X40",	   0xef3013, 0x0,	64 * 1024,     8,	     0},
+	{"W25X16",	   0xef3015, 0x0,	64 * 1024,    32,	     0},
+	{"W25X32",	   0xef3016, 0x0,	64 * 1024,    64,	     0},
+	{"W25X64",	   0xef3017, 0x0,	64 * 1024,   128,	     0},
+	{"W25Q80BL",	   0xef4014, 0x0,	64 * 1024,    16,	     0},
+	{"W25Q16CL",	   0xef4015, 0x0,	64 * 1024,    32,	     0},
+	{"W25Q32BV",	   0xef4016, 0x0,	64 * 1024,    64,	     0},
+	{"W25Q64CV",	   0xef4017, 0x0,	64 * 1024,   128,	     0},
+	{"W25Q128BV",	   0xef4018, 0x0,	64 * 1024,   256,	     0},
+	{"W25Q256",	   0xef4019, 0x0,	64 * 1024,   512,	     0},
+	{"W25Q80BW",	   0xef5014, 0x0,	64 * 1024,    16,	     0},
+	{"W25Q16DW",	   0xef6015, 0x0,	64 * 1024,    32,	     0},
+	{"W25Q32DW",	   0xef6016, 0x0,	64 * 1024,    64,	     0},
+	{"W25Q64DW",	   0xef6017, 0x0,	64 * 1024,   128,	     0},
+	{"W25Q128FW",	   0xef6018, 0x0,	64 * 1024,   256,	     0},
 #endif
 	/*
 	 * Note:
@@ -188,6 +190,10 @@ struct spi_flash *spi_flash_validate_ids(struct spi_slave *spi, u8 *idcode)
 
 	/* Assign spi_flash ops */
 	flash->write = spi_flash_cmd_write_multi;
+#ifdef CONFIG_SPI_FLASH_SST
+	if (params->flags & SST_WP)
+		flash->write = sst_write_wp;
+#endif
 	flash->erase = spi_flash_cmd_erase;
 	flash->read = spi_flash_cmd_read_fast;
 
diff --git a/include/spi_flash.h b/include/spi_flash.h
index bfc59aa..4f35c30 100644
--- a/include/spi_flash.h
+++ b/include/spi_flash.h
@@ -17,6 +17,13 @@
 #include <linux/types.h>
 #include <linux/compiler.h>
 
+/* SST specific macros */
+#ifdef CONFIG_SPI_FLASH_SST
+# define SST_WP			0x01	/* Supports AAI word program */
+# define CMD_SST_BP		0x02    /* Byte Program */
+# define CMD_SST_AAI_WP		0xAD	/* Auto Address Incr Word Program */
+#endif
+
 struct spi_flash {
 	struct spi_slave *spi;
 
-- 
1.8.3

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [U-Boot] [RESEND PATCH v2 13/20] sf: probe: Add support to clear flash BP# bits
       [not found] <1375805851-32163-1-git-send-email-jaganna@xilinx.com>
                   ` (11 preceding siblings ...)
  2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 12/20] sf: probe: Add support for SST_WP Jagannadha Sutradharudu Teki
@ 2013-08-06 16:17 ` Jagannadha Sutradharudu Teki
  2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 14/20] sf: probe: Add support for erase sector selection flag Jagannadha Sutradharudu Teki
                   ` (6 subsequent siblings)
  19 siblings, 0 replies; 23+ messages in thread
From: Jagannadha Sutradharudu Teki @ 2013-08-06 16:17 UTC (permalink / raw)
  To: u-boot

Few of the flashes(Atmel, Macronix and SST) require to
clear BP# bits in flash power ups.

So clear these BP# bits at probe time, so-that the flash
is ready for user operations.

Signed-off-by: Jagannadha Sutradharudu Teki <jaganna@xilinx.com>
---
Changes for v2:
	- none

 drivers/mtd/spi/spi_flash_probe.c | 6 ++++++
 include/spi_flash.h               | 5 +++++
 2 files changed, 11 insertions(+)

diff --git a/drivers/mtd/spi/spi_flash_probe.c b/drivers/mtd/spi/spi_flash_probe.c
index e045e53..4368867 100644
--- a/drivers/mtd/spi/spi_flash_probe.c
+++ b/drivers/mtd/spi/spi_flash_probe.c
@@ -202,6 +202,12 @@ struct spi_flash *spi_flash_validate_ids(struct spi_slave *spi, u8 *idcode)
 	flash->sector_size = params->sector_size;
 	flash->size = flash->sector_size * params->nr_sectors;
 
+	/* Flash powers up read-only, so clear BP# bits */
+	if (((params->jedec >> 16) == SPI_FLASH_CFI_MFR_ATMEL) ||
+	    ((params->jedec >> 16) == SPI_FLASH_CFI_MFR_MACRONIX) ||
+	    ((params->jedec >> 16) == SPI_FLASH_CFI_MFR_SST))
+		spi_flash_cmd_write_status(flash, 0);
+
 	return flash;
 }
 
diff --git a/include/spi_flash.h b/include/spi_flash.h
index 4f35c30..8de4e8d 100644
--- a/include/spi_flash.h
+++ b/include/spi_flash.h
@@ -17,6 +17,11 @@
 #include <linux/types.h>
 #include <linux/compiler.h>
 
+/* SPI flash CFI Manufacture ID's */
+#define SPI_FLASH_CFI_MFR_ATMEL			0x1f
+#define SPI_FLASH_CFI_MFR_MACRONIX		0xc2
+#define SPI_FLASH_CFI_MFR_SST			0xbf
+
 /* SST specific macros */
 #ifdef CONFIG_SPI_FLASH_SST
 # define SST_WP			0x01	/* Supports AAI word program */
-- 
1.8.3

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [U-Boot] [RESEND PATCH v2 14/20] sf: probe: Add support for erase sector selection flag
       [not found] <1375805851-32163-1-git-send-email-jaganna@xilinx.com>
                   ` (12 preceding siblings ...)
  2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 13/20] sf: probe: Add support to clear flash BP# bits Jagannadha Sutradharudu Teki
@ 2013-08-06 16:17 ` Jagannadha Sutradharudu Teki
  2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 15/20] sf: probe: Add support for flag status polling Jagannadha Sutradharudu Teki
                   ` (5 subsequent siblings)
  19 siblings, 0 replies; 23+ messages in thread
From: Jagannadha Sutradharudu Teki @ 2013-08-06 16:17 UTC (permalink / raw)
  To: u-boot

SECT_4K, SECT_32K and SECT_64K opeartions are performed to
to specific flash by adding a SECT* flag on respective
spi_flash_params.flag param.

Signed-off-by: Jagannadha Sutradharudu Teki <jaganna@xilinx.com>
---
Changes for v2:
	- none

 drivers/mtd/spi/spi_flash_ops.c   |   8 +-
 drivers/mtd/spi/spi_flash_probe.c | 166 ++++++++++++++++++++------------------
 include/spi_flash.h               |  10 ++-
 3 files changed, 100 insertions(+), 84 deletions(-)

diff --git a/drivers/mtd/spi/spi_flash_ops.c b/drivers/mtd/spi/spi_flash_ops.c
index 79381b1..c408e27 100644
--- a/drivers/mtd/spi/spi_flash_ops.c
+++ b/drivers/mtd/spi/spi_flash_ops.c
@@ -153,17 +153,13 @@ int spi_flash_cmd_erase(struct spi_flash *flash, u32 offset, size_t len)
 	u8 cmd[4];
 	int ret = -1;
 
-	erase_size = flash->sector_size;
+	erase_size = flash->erase_size;
 	if (offset % erase_size || len % erase_size) {
 		debug("SF: Erase offset/length not multiple of erase size\n");
 		return -1;
 	}
 
-	if (erase_size == 4096)
-		cmd[0] = CMD_ERASE_4K;
-	else
-		cmd[0] = CMD_ERASE_64K;
-
+	cmd[0] = flash->erase_cmd;
 	while (len) {
 #ifdef CONFIG_SPI_FLASH_BAR
 		u8 bank_sel;
diff --git a/drivers/mtd/spi/spi_flash_probe.c b/drivers/mtd/spi/spi_flash_probe.c
index 4368867..0d005a1 100644
--- a/drivers/mtd/spi/spi_flash_probe.c
+++ b/drivers/mtd/spi/spi_flash_probe.c
@@ -39,97 +39,97 @@ struct spi_flash_params {
 
 static const struct spi_flash_params spi_flash_params_table[] = {
 #ifdef CONFIG_SPI_FLASH_ATMEL		/* ATMEL */
-	{"AT45DB011D",	   0x1f2200, 0x0,	64 * 1024,     4,	     0},
-	{"AT45DB021D",	   0x1f2300, 0x0,	64 * 1024,     8,	     0},
-	{"AT45DB041D",	   0x1f2400, 0x0,	64 * 1024,     8,	     0},
-	{"AT45DB081D",	   0x1f2500, 0x0,	64 * 1024,    16,	     0},
-	{"AT45DB161D",	   0x1f2600, 0x0,	64 * 1024,    32,	     0},
-	{"AT45DB321D",	   0x1f2700, 0x0,	64 * 1024,    64,	     0},
-	{"AT45DB641D",	   0x1f2800, 0x0,	64 * 1024,   128,	     0},
+	{"AT45DB011D",	   0x1f2200, 0x0,	64 * 1024,     4,	       SECT_4K},
+	{"AT45DB021D",	   0x1f2300, 0x0,	64 * 1024,     8,	       SECT_4K},
+	{"AT45DB041D",	   0x1f2400, 0x0,	64 * 1024,     8,	       SECT_4K},
+	{"AT45DB081D",	   0x1f2500, 0x0,	64 * 1024,    16,	       SECT_4K},
+	{"AT45DB161D",	   0x1f2600, 0x0,	64 * 1024,    32,	       SECT_4K},
+	{"AT45DB321D",	   0x1f2700, 0x0,	64 * 1024,    64,	       SECT_4K},
+	{"AT45DB641D",	   0x1f2800, 0x0,	64 * 1024,   128,	       SECT_4K},
 #endif
 #ifdef CONFIG_SPI_FLASH_EON		/* EON */
-	{"EN25Q32B",	   0x1c3016, 0x0,	64 * 1024,    64,	     0},
-	{"EN25Q128B",	   0x1c3018, 0x0,       64 * 1024,   256,	     0},
+	{"EN25Q32B",	   0x1c3016, 0x0,	64 * 1024,    64,	             0},
+	{"EN25Q128B",	   0x1c3018, 0x0,       64 * 1024,   256,	             0},
 #endif
 #ifdef CONFIG_SPI_FLASH_GIGADEVICE	/* GIGADEVICE */
-	{"GD25Q64B",	   0xc84017, 0x0,	64 * 1024,   128,	     0},
-	{"GD25LQ32",	   0xc86016, 0x0,	64 * 1024,    64,	     0},
+	{"GD25Q64B",	   0xc84017, 0x0,	64 * 1024,   128,	       SECT_4K},
+	{"GD25LQ32",	   0xc86016, 0x0,	64 * 1024,    64,	       SECT_4K},
 #endif
 #ifdef CONFIG_SPI_FLASH_MACRONIX	/* MACRONIX */
-	{"MX25L4005",	   0xc22013, 0x0,	64 * 1024,     8,	     0},
-	{"MX25L8005",	   0xc22014, 0x0,	64 * 1024,    16,	     0},
-	{"MX25L1605D",	   0xc22015, 0x0,	64 * 1024,    32,	     0},
-	{"MX25L3205D",	   0xc22016, 0x0,	64 * 1024,    64,	     0},
-	{"MX25L6405D",	   0xc22017, 0x0,	64 * 1024,   128,	     0},
-	{"MX25L12805",	   0xc22018, 0x0,	64 * 1024,   256,	     0},
-	{"MX25L12855E",	   0xc22618, 0x0,	64 * 1024,   256,	     0},
+	{"MX25L4005",	   0xc22013, 0x0,	64 * 1024,     8,	             0},
+	{"MX25L8005",	   0xc22014, 0x0,	64 * 1024,    16,	             0},
+	{"MX25L1605D",	   0xc22015, 0x0,	64 * 1024,    32,	             0},
+	{"MX25L3205D",	   0xc22016, 0x0,	64 * 1024,    64,	             0},
+	{"MX25L6405D",	   0xc22017, 0x0,	64 * 1024,   128,	             0},
+	{"MX25L12805",	   0xc22018, 0x0,	64 * 1024,   256,	             0},
+	{"MX25L12855E",	   0xc22618, 0x0,	64 * 1024,   256,	             0},
 #endif
 #ifdef CONFIG_SPI_FLASH_SPANSION	/* SPANSION */
-	{"S25FL008A",	   0x010213, 0x0,	64 * 1024,    16,	     0},
-	{"S25FL016A",	   0x010214, 0x0,	64 * 1024,    32,	     0},
-	{"S25FL032A",	   0x010215, 0x0,	64 * 1024,    64,	     0},
-	{"S25FL064A",	   0x010216, 0x0,	64 * 1024,   128,	     0},
-	{"S25FL128P_256K", 0x012018, 0x0300,   256 * 1024,    64,	     0},
-	{"S25FL128P_64K",  0x012018, 0x0301,    64 * 1024,   256,	     0},
-	{"S25FL032P",	   0x010215, 0x4d00,    64 * 1024,    64,	     0},
-	{"S25FL064P",	   0x010216, 0x4d00,    64 * 1024,   128,	     0},
-	{"S25FL128S_64K",  0x012018, 0x4d01,    64 * 1024,   256,	     0},
-	{"S25FL256S_64K",  0x010219, 0x4d01,    64 * 1024,   512,	     0},
-	{"S25FL512S_64K",  0x010220, 0x4d01,    64 * 1024,  1024,	     0},
+	{"S25FL008A",	   0x010213, 0x0,	64 * 1024,    16,	             0},
+	{"S25FL016A",	   0x010214, 0x0,	64 * 1024,    32,	             0},
+	{"S25FL032A",	   0x010215, 0x0,	64 * 1024,    64,	             0},
+	{"S25FL064A",	   0x010216, 0x0,	64 * 1024,   128,	             0},
+	{"S25FL128P_256K", 0x012018, 0x0300,   256 * 1024,    64,	             0},
+	{"S25FL128P_64K",  0x012018, 0x0301,    64 * 1024,   256,	             0},
+	{"S25FL032P",	   0x010215, 0x4d00,    64 * 1024,    64,	             0},
+	{"S25FL064P",	   0x010216, 0x4d00,    64 * 1024,   128,	             0},
+	{"S25FL128S_64K",  0x012018, 0x4d01,    64 * 1024,   256,		     0},
+	{"S25FL256S_64K",  0x010219, 0x4d01,    64 * 1024,   512,	             0},
+	{"S25FL512S_64K",  0x010220, 0x4d01,    64 * 1024,  1024,	             0},
 #endif
 #ifdef CONFIG_SPI_FLASH_STMICRO		/* STMICRO */
-	{"M25P10",	   0x202011, 0x0,       32 * 1024,     4,	     0},
-	{"M25P20",	   0x202012, 0x0,       64 * 1024,     4,	     0},
-	{"M25P40",	   0x202013, 0x0,       64 * 1024,     8,	     0},
-	{"M25P80",	   0x202014, 0x0,       64 * 1024,    16,	     0},
-	{"M25P16",	   0x202015, 0x0,       64 * 1024,    32,	     0},
-	{"M25P32",	   0x202016, 0x0,       64 * 1024,    64,	     0},
-	{"M25P64",	   0x202017, 0x0,       64 * 1024,   128,	     0},
-	{"M25P128",	   0x202018, 0x0,      256 * 1024,    64,	     0},
-	{"N25Q32",	   0x20ba16, 0x0,       64 * 1024,    64,	     0},
-	{"N25Q32A",	   0x20bb16, 0x0,       64 * 1024,    64,	     0},
-	{"N25Q64",	   0x20ba17, 0x0,       64 * 1024,   128,	     0},
-	{"N25Q64A",	   0x20bb17, 0x0,       64 * 1024,   128,	     0},
-	{"N25Q128",	   0x20ba18, 0x0,       64 * 1024,   256,	     0},
-	{"N25Q128A",	   0x20bb18, 0x0,       64 * 1024,   256,	     0},
-	{"N25Q256",	   0x20ba19, 0x0,       64 * 1024,   512,	     0},
-	{"N25Q256A",	   0x20bb19, 0x0,       64 * 1024,   512,	     0},
-	{"N25Q512",	   0x20ba20, 0x0,       64 * 1024,  1024,	     0},
-	{"N25Q512A",	   0x20bb20, 0x0,       64 * 1024,  1024,	     0},
-	{"N25Q1024",	   0x20ba21, 0x0,       64 * 1024,  2048,	     0},
-	{"N25Q1024A",	   0x20bb21, 0x0,       64 * 1024,  2048,	     0},
+	{"M25P10",	   0x202011, 0x0,       32 * 1024,     4,	             0},
+	{"M25P20",	   0x202012, 0x0,       64 * 1024,     4,	             0},
+	{"M25P40",	   0x202013, 0x0,       64 * 1024,     8,	             0},
+	{"M25P80",	   0x202014, 0x0,       64 * 1024,    16,	             0},
+	{"M25P16",	   0x202015, 0x0,       64 * 1024,    32,	             0},
+	{"M25P32",	   0x202016, 0x0,       64 * 1024,    64,	             0},
+	{"M25P64",	   0x202017, 0x0,       64 * 1024,   128,	             0},
+	{"M25P128",	   0x202018, 0x0,      256 * 1024,    64,	             0},
+	{"N25Q32",	   0x20ba16, 0x0,       64 * 1024,    64,	       SECT_4K},
+	{"N25Q32A",	   0x20bb16, 0x0,       64 * 1024,    64,	       SECT_4K},
+	{"N25Q64",	   0x20ba17, 0x0,       64 * 1024,   128,	       SECT_4K},
+	{"N25Q64A",	   0x20bb17, 0x0,       64 * 1024,   128,	       SECT_4K},
+	{"N25Q128",	   0x20ba18, 0x0,       64 * 1024,   256,	       SECT_4K},
+	{"N25Q128A",	   0x20bb18, 0x0,       64 * 1024,   256,	       SECT_4K},
+	{"N25Q256",	   0x20ba19, 0x0,       64 * 1024,   512,	       SECT_4K},
+	{"N25Q256A",	   0x20bb19, 0x0,       64 * 1024,   512,	       SECT_4K},
+	{"N25Q512",	   0x20ba20, 0x0,       64 * 1024,  1024,	       SECT_4K},
+	{"N25Q512A",	   0x20bb20, 0x0,       64 * 1024,  1024,	       SECT_4K},
+	{"N25Q1024",	   0x20ba21, 0x0,       64 * 1024,  2048,	       SECT_4K},
+	{"N25Q1024A",	   0x20bb21, 0x0,       64 * 1024,  2048,	       SECT_4K},
 #endif
 #ifdef CONFIG_SPI_FLASH_SST		/* SST */
-	{"SST25VF040B",	   0xbf258d, 0x0,	64 * 1024,     8,	SST_WP},
-	{"SST25VF080B",	   0xbf258e, 0x0,	64 * 1024,    16,	SST_WP},
-	{"SST25VF016B",	   0xbf2541, 0x0,	64 * 1024,    32,	SST_WP},
-	{"SST25VF032B",	   0xbf254a, 0x0,	64 * 1024,    64,	SST_WP},
-	{"SST25VF064C",	   0xbf254b, 0x0,	64 * 1024,   128,	     0},
-	{"SST25WF512",	   0xbf2501, 0x0,	64 * 1024,     1,	SST_WP},
-	{"SST25WF010",	   0xbf2502, 0x0,	64 * 1024,     2,	SST_WP},
-	{"SST25WF020",	   0xbf2503, 0x0,	64 * 1024,     4,	SST_WP},
-	{"SST25WF040",	   0xbf2504, 0x0,	64 * 1024,     8,	SST_WP},
-	{"SST25WF080",	   0xbf2505, 0x0,	64 * 1024,    16,	SST_WP},
+	{"SST25VF040B",	   0xbf258d, 0x0,	64 * 1024,     8,     SECT_4K | SST_WP},
+	{"SST25VF080B",	   0xbf258e, 0x0,	64 * 1024,    16,     SECT_4K | SST_WP},
+	{"SST25VF016B",	   0xbf2541, 0x0,	64 * 1024,    32,     SECT_4K | SST_WP},
+	{"SST25VF032B",	   0xbf254a, 0x0,	64 * 1024,    64,     SECT_4K | SST_WP},
+	{"SST25VF064C",	   0xbf254b, 0x0,	64 * 1024,   128,	       SECT_4K},
+	{"SST25WF512",	   0xbf2501, 0x0,	64 * 1024,     1,     SECT_4K | SST_WP},
+	{"SST25WF010",	   0xbf2502, 0x0,	64 * 1024,     2,     SECT_4K | SST_WP},
+	{"SST25WF020",	   0xbf2503, 0x0,	64 * 1024,     4,     SECT_4K | SST_WP},
+	{"SST25WF040",	   0xbf2504, 0x0,	64 * 1024,     8,     SECT_4K | SST_WP},
+	{"SST25WF080",	   0xbf2505, 0x0,	64 * 1024,    16,     SECT_4K | SST_WP},
 #endif
 #ifdef CONFIG_SPI_FLASH_WINBOND		/* WINBOND */
-	{"W25P80",	   0xef2014, 0x0,	64 * 1024,    16,	     0},
-	{"W25P16",	   0xef2015, 0x0,	64 * 1024,    32,	     0},
-	{"W25P32",	   0xef2016, 0x0,	64 * 1024,    64,	     0},
-	{"W25X40",	   0xef3013, 0x0,	64 * 1024,     8,	     0},
-	{"W25X16",	   0xef3015, 0x0,	64 * 1024,    32,	     0},
-	{"W25X32",	   0xef3016, 0x0,	64 * 1024,    64,	     0},
-	{"W25X64",	   0xef3017, 0x0,	64 * 1024,   128,	     0},
-	{"W25Q80BL",	   0xef4014, 0x0,	64 * 1024,    16,	     0},
-	{"W25Q16CL",	   0xef4015, 0x0,	64 * 1024,    32,	     0},
-	{"W25Q32BV",	   0xef4016, 0x0,	64 * 1024,    64,	     0},
-	{"W25Q64CV",	   0xef4017, 0x0,	64 * 1024,   128,	     0},
-	{"W25Q128BV",	   0xef4018, 0x0,	64 * 1024,   256,	     0},
-	{"W25Q256",	   0xef4019, 0x0,	64 * 1024,   512,	     0},
-	{"W25Q80BW",	   0xef5014, 0x0,	64 * 1024,    16,	     0},
-	{"W25Q16DW",	   0xef6015, 0x0,	64 * 1024,    32,	     0},
-	{"W25Q32DW",	   0xef6016, 0x0,	64 * 1024,    64,	     0},
-	{"W25Q64DW",	   0xef6017, 0x0,	64 * 1024,   128,	     0},
-	{"W25Q128FW",	   0xef6018, 0x0,	64 * 1024,   256,	     0},
+	{"W25P80",	   0xef2014, 0x0,	64 * 1024,    16,		SEC_4K},
+	{"W25P16",	   0xef2015, 0x0,	64 * 1024,    32,		SEC_4K},
+	{"W25P32",	   0xef2016, 0x0,	64 * 1024,    64,		SEC_4K},
+	{"W25X40",	   0xef3013, 0x0,	64 * 1024,     8,		SEC_4K},
+	{"W25X16",	   0xef3015, 0x0,	64 * 1024,    32,		SEC_4K},
+	{"W25X32",	   0xef3016, 0x0,	64 * 1024,    64,		SEC_4K},
+	{"W25X64",	   0xef3017, 0x0,	64 * 1024,   128,		SEC_4K},
+	{"W25Q80BL",	   0xef4014, 0x0,	64 * 1024,    16,		SEC_4K},
+	{"W25Q16CL",	   0xef4015, 0x0,	64 * 1024,    32,		SEC_4K},
+	{"W25Q32BV",	   0xef4016, 0x0,	64 * 1024,    64,		SEC_4K},
+	{"W25Q64CV",	   0xef4017, 0x0,	64 * 1024,   128,	       SEC_32K},
+	{"W25Q128BV",	   0xef4018, 0x0,	64 * 1024,   256,		SEC_4K},
+	{"W25Q256",	   0xef4019, 0x0,	64 * 1024,   512,		SEC_4K},
+	{"W25Q80BW",	   0xef5014, 0x0,	64 * 1024,    16,		SEC_4K},
+	{"W25Q16DW",	   0xef6015, 0x0,	64 * 1024,    32,		SEC_4K},
+	{"W25Q32DW",	   0xef6016, 0x0,	64 * 1024,    64,		SEC_4K},
+	{"W25Q64DW",	   0xef6017, 0x0,	64 * 1024,   128,		SEC_4K},
+	{"W25Q128FW",	   0xef6018, 0x0,	64 * 1024,   256,		SEC_4K},
 #endif
 	/*
 	 * Note:
@@ -202,6 +202,18 @@ struct spi_flash *spi_flash_validate_ids(struct spi_slave *spi, u8 *idcode)
 	flash->sector_size = params->sector_size;
 	flash->size = flash->sector_size * params->nr_sectors;
 
+	/* Compute erase sector and command */
+	if (params->flags & SECT_4K) {
+		flash->erase_cmd = CMD_ERASE_4K;
+		flash->erase_size = 4096;
+	} else if (params->flags & SECT_32K) {
+		flash->erase_cmd = CMD_ERASE_32K;
+		flash->erase_size = 32768;
+	} else {
+		flash->erase_cmd = CMD_ERASE_64K;
+		flash->erase_size = flash->sector_size;
+	}
+
 	/* Flash powers up read-only, so clear BP# bits */
 	if (((params->jedec >> 16) == SPI_FLASH_CFI_MFR_ATMEL) ||
 	    ((params->jedec >> 16) == SPI_FLASH_CFI_MFR_MACRONIX) ||
diff --git a/include/spi_flash.h b/include/spi_flash.h
index 8de4e8d..387af86 100644
--- a/include/spi_flash.h
+++ b/include/spi_flash.h
@@ -22,6 +22,10 @@
 #define SPI_FLASH_CFI_MFR_MACRONIX		0xc2
 #define SPI_FLASH_CFI_MFR_SST			0xbf
 
+/* SECT flags */
+#define SECT_4K			(1 << 0)
+#define SECT_32K		(1 << 1)
+
 /* SST specific macros */
 #ifdef CONFIG_SPI_FLASH_SST
 # define SST_WP			0x01	/* Supports AAI word program */
@@ -38,8 +42,10 @@ struct spi_flash {
 	u32		size;
 	/* Write (page) size */
 	u32		page_size;
-	/* Erase (sector) size */
+	/* Sector size */
 	u32		sector_size;
+	/* Erase size */
+	u32		erase_size;
 #ifdef CONFIG_SPI_FLASH_BAR
 	/* Bank read cmd */
 	u8		bank_read_cmd;
@@ -50,6 +56,8 @@ struct spi_flash {
 #endif
 	/* Poll cmd - for flash erase/program */
 	u8		poll_cmd;
+	/* Erase cmd 4K, 32K, 64K */
+	u8		erase_cmd;
 
 	void *memory_map;	/* Address of read-only SPI flash access */
 	int		(*read)(struct spi_flash *flash, u32 offset,
-- 
1.8.3

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [U-Boot] [RESEND PATCH v2 15/20] sf: probe: Add support for flag status polling
       [not found] <1375805851-32163-1-git-send-email-jaganna@xilinx.com>
                   ` (13 preceding siblings ...)
  2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 14/20] sf: probe: Add support for erase sector selection flag Jagannadha Sutradharudu Teki
@ 2013-08-06 16:17 ` Jagannadha Sutradharudu Teki
  2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 16/20] sf: probe: Move BAR config to spi_flash_validate_ids Jagannadha Sutradharudu Teki
                   ` (4 subsequent siblings)
  19 siblings, 0 replies; 23+ messages in thread
From: Jagannadha Sutradharudu Teki @ 2013-08-06 16:17 UTC (permalink / raw)
  To: u-boot



^ permalink raw reply	[flat|nested] 23+ messages in thread

* [U-Boot] [RESEND PATCH v2 16/20] sf: probe: Move BAR config to spi_flash_validate_ids
       [not found] <1375805851-32163-1-git-send-email-jaganna@xilinx.com>
                   ` (14 preceding siblings ...)
  2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 15/20] sf: probe: Add support for flag status polling Jagannadha Sutradharudu Teki
@ 2013-08-06 16:17 ` Jagannadha Sutradharudu Teki
  2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 17/20] sf: Add proper comment style on spi_flash structure Jagannadha Sutradharudu Teki
                   ` (3 subsequent siblings)
  19 siblings, 0 replies; 23+ messages in thread
From: Jagannadha Sutradharudu Teki @ 2013-08-06 16:17 UTC (permalink / raw)
  To: u-boot

Moved BAR config to spi_flash_validate_ids, so its
better to have all flash initalization at once.

Signed-off-by: Jagannadha Sutradharudu Teki <jaganna@xilinx.com>
---
Changes for v2:
	- none

 drivers/mtd/spi/spi_flash_internal.h |  5 -----
 drivers/mtd/spi/spi_flash_probe.c    | 24 +++++++++++-------------
 include/spi_flash.h                  |  3 +++
 3 files changed, 14 insertions(+), 18 deletions(-)

diff --git a/drivers/mtd/spi/spi_flash_internal.h b/drivers/mtd/spi/spi_flash_internal.h
index ce34ce0..6227d2e 100644
--- a/drivers/mtd/spi/spi_flash_internal.h
+++ b/drivers/mtd/spi/spi_flash_internal.h
@@ -31,11 +31,6 @@
 
 #define SPI_FLASH_16MB_BOUN		0x1000000
 
-/* Manufacture ID's */
-#define SPI_FLASH_SPANSION_IDCODE0	0x01
-#define SPI_FLASH_STMICRO_IDCODE0	0x20
-#define SPI_FLASH_WINBOND_IDCODE0	0xef
-
 #ifdef CONFIG_SPI_FLASH_BAR
 /* Bank addr access commands */
 # define CMD_BANKADDR_BRWR		0x17
diff --git a/drivers/mtd/spi/spi_flash_probe.c b/drivers/mtd/spi/spi_flash_probe.c
index acccee0..db5f804 100644
--- a/drivers/mtd/spi/spi_flash_probe.c
+++ b/drivers/mtd/spi/spi_flash_probe.c
@@ -218,6 +218,12 @@ struct spi_flash *spi_flash_validate_ids(struct spi_slave *spi, u8 *idcode)
 	if (params->flags & E_FSR)
 		flash->poll_cmd = CMD_FLAG_STATUS;
 
+#ifdef CONFIG_SPI_FLASH_BAR
+	/* Configure the BAR - discover bank cmds and read current bank  */
+	if (spi_flash_bank_config(flash, idcode[0]) < 0)
+		return NULL;
+#endif
+
 	/* Flash powers up read-only, so clear BP# bits */
 	if (((params->jedec >> 16) == SPI_FLASH_CFI_MFR_ATMEL) ||
 	    ((params->jedec >> 16) == SPI_FLASH_CFI_MFR_MACRONIX) ||
@@ -235,12 +241,12 @@ int spi_flash_bank_config(struct spi_flash *flash, u8 idcode0)
 
 	/* discover bank cmds */
 	switch (idcode0) {
-	case SPI_FLASH_SPANSION_IDCODE0:
+	case SPI_FLASH_CFI_MFR_SPANSION:
 		flash->bank_read_cmd = CMD_BANKADDR_BRRD;
 		flash->bank_write_cmd = CMD_BANKADDR_BRWR;
 		break;
-	case SPI_FLASH_STMICRO_IDCODE0:
-	case SPI_FLASH_WINBOND_IDCODE0:
+	case SPI_FLASH_CFI_MFR_STMICRO:
+	case SPI_FLASH_CFI_MFR_WINBOND:
 		flash->bank_read_cmd = CMD_EXTNADDR_RDEAR;
 		flash->bank_write_cmd = CMD_EXTNADDR_WREAR;
 		break;
@@ -298,7 +304,7 @@ struct spi_flash *spi_flash_probe(unsigned int bus, unsigned int cs,
 {
 	struct spi_slave *spi;
 	struct spi_flash *flash = NULL;
-	u8 idcode[5], *idp;
+	u8 idcode[5];
 	int ret;
 
 	/* Setup spi_slave */
@@ -328,18 +334,10 @@ struct spi_flash *spi_flash_probe(unsigned int bus, unsigned int cs,
 #endif
 
 	/* Validate ID's from flash dev table */
-	idp = idcode;
-	flash = spi_flash_validate_ids(spi, idp);
+	flash = spi_flash_validate_ids(spi, idcode);
 	if (!flash)
 		goto err_read_id;
 
-#ifdef CONFIG_SPI_FLASH_BAR
-	/* Configure the BAR - discover bank cmds and read current bank  */
-	ret = spi_flash_bank_config(flash, *idp);
-	if (ret < 0)
-		goto err_read_id;
-#endif
-
 #ifdef CONFIG_OF_CONTROL
 	if (spi_flash_decode_fdt(gd->fdt_blob, flash)) {
 		debug("SF: FDT decode error\n");
diff --git a/include/spi_flash.h b/include/spi_flash.h
index 3e60fdc..14e4ae2 100644
--- a/include/spi_flash.h
+++ b/include/spi_flash.h
@@ -20,7 +20,10 @@
 /* SPI flash CFI Manufacture ID's */
 #define SPI_FLASH_CFI_MFR_ATMEL			0x1f
 #define SPI_FLASH_CFI_MFR_MACRONIX		0xc2
+#define SPI_FLASH_CFI_MFR_SPANSION		0x01
 #define SPI_FLASH_CFI_MFR_SST			0xbf
+#define SPI_FLASH_CFI_MFR_STMICRO		0x20
+#define SPI_FLASH_CFI_MFR_WINBOND		0xef
 
 /* SECT flags */
 #define SECT_4K			(1 << 0)
-- 
1.8.3

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [U-Boot] [RESEND PATCH v2 17/20] sf: Add proper comment style on spi_flash structure
       [not found] <1375805851-32163-1-git-send-email-jaganna@xilinx.com>
                   ` (15 preceding siblings ...)
  2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 16/20] sf: probe: Move BAR config to spi_flash_validate_ids Jagannadha Sutradharudu Teki
@ 2013-08-06 16:17 ` Jagannadha Sutradharudu Teki
  2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 18/20] sf: ramtron: Add support for separate flash driver Jagannadha Sutradharudu Teki
                   ` (2 subsequent siblings)
  19 siblings, 0 replies; 23+ messages in thread
From: Jagannadha Sutradharudu Teki @ 2013-08-06 16:17 UTC (permalink / raw)
  To: u-boot

Added proper comment style on spi_flash structure to make
more readable.

Signed-off-by: Jagannadha Sutradharudu Teki <jaganna@xilinx.com>
---
Changes for v2:
	- none

 include/spi_flash.h | 63 +++++++++++++++++++++++++++++------------------------
 1 file changed, 35 insertions(+), 28 deletions(-)

diff --git a/include/spi_flash.h b/include/spi_flash.h
index 14e4ae2..34a167b 100644
--- a/include/spi_flash.h
+++ b/include/spi_flash.h
@@ -37,39 +37,46 @@
 # define CMD_SST_AAI_WP		0xAD	/* Auto Address Incr Word Program */
 #endif
 
+/**
+ * struct spi_flash - SPI flash structure
+ *
+ * @spi:		SPI slave
+ * @name:		Name of SPI flash
+ * @size:		Total flash size
+ * @page_size:		Write (page) size
+ * @sector_size:	Sector size
+ * @erase_size:		Erase size
+ * @bank_read_cmd:	Bank read cmd
+ * @bank_write_cmd:	Bank write cmd
+ * @bank_curr:		Current flash bank
+ * @poll_cmd:		Poll cmd - for flash erase/program
+ * @erase_cmd:		Erase cmd 4K, 32K, 64K
+ * @memory_map:		Address of read-only SPI flash access
+ * @read:		Flash read ops
+ * @write:		Flash write ops
+ * @erase:		Flash erase ops
+ */
 struct spi_flash {
 	struct spi_slave *spi;
+	const char *name;
 
-	const char	*name;
-
-	/* Total flash size */
-	u32		size;
-	/* Write (page) size */
-	u32		page_size;
-	/* Sector size */
-	u32		sector_size;
-	/* Erase size */
-	u32		erase_size;
+	u32 size;
+	u32 page_size;
+	u32 sector_size;
+	u32 erase_size;
 #ifdef CONFIG_SPI_FLASH_BAR
-	/* Bank read cmd */
-	u8		bank_read_cmd;
-	/* Bank write cmd */
-	u8		bank_write_cmd;
-	/* Current flash bank */
-	u8		bank_curr;
+	u8 bank_read_cmd;
+	u8 bank_write_cmd;
+	u8 bank_curr;
 #endif
-	/* Poll cmd - for flash erase/program */
-	u8		poll_cmd;
-	/* Erase cmd 4K, 32K, 64K */
-	u8		erase_cmd;
-
-	void *memory_map;	/* Address of read-only SPI flash access */
-	int		(*read)(struct spi_flash *flash, u32 offset,
-				size_t len, void *buf);
-	int		(*write)(struct spi_flash *flash, u32 offset,
-				size_t len, const void *buf);
-	int		(*erase)(struct spi_flash *flash, u32 offset,
-				size_t len);
+	u8 poll_cmd;
+	u8 erase_cmd;
+
+	void *memory_map;
+	int (*read)(struct spi_flash *flash, u32 offset, size_t len, void *buf);
+	int (*write)(struct spi_flash *flash, u32 offset, size_t len,
+			const void *buf);
+	int (*erase)(struct spi_flash *flash, u32 offset, size_t len);
 };
 
 /**
-- 
1.8.3

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [U-Boot] [RESEND PATCH v2 18/20] sf: ramtron: Add support for separate flash driver
       [not found] <1375805851-32163-1-git-send-email-jaganna@xilinx.com>
                   ` (16 preceding siblings ...)
  2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 17/20] sf: Add proper comment style on spi_flash structure Jagannadha Sutradharudu Teki
@ 2013-08-06 16:17 ` Jagannadha Sutradharudu Teki
  2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 19/20] sf: Remove unneeded flash drivers files Jagannadha Sutradharudu Teki
  2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 20/20] sf: probe: Add support for EN25Q64 Jagannadha Sutradharudu Teki
  19 siblings, 0 replies; 23+ messages in thread
From: Jagannadha Sutradharudu Teki @ 2013-08-06 16:17 UTC (permalink / raw)
  To: u-boot

Compared to other spi flashes, ramtron has a different
probing and implementation on flash ops, hence moved
ramtron probe code into ramtron driver.

Signed-off-by: Jagannadha Sutradharudu Teki <jaganna@xilinx.com>
---
Changes for v2:
	- none

 drivers/mtd/spi/Makefile                 |   6 +-
 drivers/mtd/spi/ramtron.c                | 123 +++++++++++++-
 drivers/mtd/spi/spi_flash_internal.h     |   1 -
 drivers/mtd/spi/spi_flash_probe.c        |   4 -
 drivers/mtd/spi/spi_flash_probe_legacy.c | 274 -------------------------------
 include/configs/top9000.h                |   1 -
 6 files changed, 125 insertions(+), 284 deletions(-)
 delete mode 100644 drivers/mtd/spi/spi_flash_probe_legacy.c

diff --git a/drivers/mtd/spi/Makefile b/drivers/mtd/spi/Makefile
index 452747a..e06924a 100644
--- a/drivers/mtd/spi/Makefile
+++ b/drivers/mtd/spi/Makefile
@@ -13,8 +13,10 @@ ifdef CONFIG_SPL_BUILD
 COBJS-$(CONFIG_SPL_SPI_LOAD)	+= spi_spl_load.o
 endif
 
-COBJS-$(CONFIG_SPI_FLASH_LEGACY) += spi_flash_probe_legacy.o spi_flash_ops.o spi_flash.o
-COBJS-$(CONFIG_SPI_FLASH)	+= spi_flash_probe.o spi_flash_ops.o spi_flash.o
+ifdef CONFIG_CMD_SF
+COBJS-y	+= spi_flash.o
+endif
+COBJS-$(CONFIG_SPI_FLASH)	+= spi_flash_probe.o spi_flash_ops.o
 COBJS-$(CONFIG_SPI_FLASH_ATMEL)	+= atmel.o
 COBJS-$(CONFIG_SPI_FLASH_EON)	+= eon.o
 COBJS-$(CONFIG_SPI_FLASH_GIGADEVICE)	+= gigadevice.o
diff --git a/drivers/mtd/spi/ramtron.c b/drivers/mtd/spi/ramtron.c
index 38f9d69..c9701d0 100644
--- a/drivers/mtd/spi/ramtron.c
+++ b/drivers/mtd/spi/ramtron.c
@@ -214,7 +214,8 @@ static int ramtron_erase(struct spi_flash *flash, u32 offset, size_t len)
  * nore: we are called here with idcode pointing to the first non-0x7f byte
  * already!
  */
-struct spi_flash *spi_fram_probe_ramtron(struct spi_slave *spi, u8 *idcode)
+static struct spi_flash *spi_fram_probe_ramtron(struct spi_slave *spi,
+		u8 *idcode)
 {
 	const struct ramtron_spi_fram_params *params;
 	struct ramtron_spi_fram *sn;
@@ -270,7 +271,7 @@ struct spi_flash *spi_fram_probe_ramtron(struct spi_slave *spi, u8 *idcode)
 	return NULL;
 
 found:
-	sn = spi_flash_alloc(struct ramtron_spi_fram, spi, params->name);
+	sn = malloc(sizeof(*sn));
 	if (!sn) {
 		debug("SF: Failed to allocate memory\n");
 		return NULL;
@@ -285,3 +286,121 @@ found:
 
 	return &sn->flash;
 }
+
+/*
+ * The following table holds all device probe functions
+ * (All flashes are removed and implemented a common probe at
+ *  spi_flash_probe.c)
+ *
+ * shift:  number of continuation bytes before the ID
+ * idcode: the expected IDCODE or 0xff for non JEDEC devices
+ * probe:  the function to call
+ *
+ * Non JEDEC devices should be ordered in the table such that
+ * the probe functions with best detection algorithms come first.
+ *
+ * Several matching entries are permitted, they will be tried
+ * in sequence until a probe function returns non NULL.
+ *
+ * IDCODE_CONT_LEN may be redefined if a device needs to declare a
+ * larger "shift" value.  IDCODE_PART_LEN generally shouldn't be
+ * changed.  This is the max number of bytes probe functions may
+ * examine when looking up part-specific identification info.
+ *
+ * Probe functions will be given the idcode buffer starting at their
+ * manu id byte (the "idcode" in the table below).  In other words,
+ * all of the continuation bytes will be skipped (the "shift" below).
+ */
+#define IDCODE_CONT_LEN 0
+#define IDCODE_PART_LEN 5
+static const struct {
+	const u8 shift;
+	const u8 idcode;
+	struct spi_flash *(*probe) (struct spi_slave *spi, u8 *idcode);
+} flashes[] = {
+	/* Keep it sorted by define name */
+#ifdef CONFIG_SPI_FRAM_RAMTRON
+	{ 6, 0xc2, spi_fram_probe_ramtron, },
+# undef IDCODE_CONT_LEN
+# define IDCODE_CONT_LEN 6
+#endif
+#ifdef CONFIG_SPI_FRAM_RAMTRON_NON_JEDEC
+	{ 0, 0xff, spi_fram_probe_ramtron, },
+#endif
+};
+#define IDCODE_LEN (IDCODE_CONT_LEN + IDCODE_PART_LEN)
+
+struct spi_flash *spi_flash_probe(unsigned int bus, unsigned int cs,
+		unsigned int max_hz, unsigned int spi_mode)
+{
+	struct spi_slave *spi;
+	struct spi_flash *flash = NULL;
+	int ret, i, shift;
+	u8 idcode[IDCODE_LEN], *idp;
+
+	spi = spi_setup_slave(bus, cs, max_hz, spi_mode);
+	if (!spi) {
+		printf("SF: Failed to set up slave\n");
+		return NULL;
+	}
+
+	ret = spi_claim_bus(spi);
+	if (ret) {
+		debug("SF: Failed to claim SPI bus: %d\n", ret);
+		goto err_claim_bus;
+	}
+
+	/* Read the ID codes */
+	ret = spi_flash_cmd(spi, CMD_READ_ID, idcode, sizeof(idcode));
+	if (ret)
+		goto err_read_id;
+
+#ifdef DEBUG
+	printf("SF: Got idcodes\n");
+	print_buffer(0, idcode, 1, sizeof(idcode), 0);
+#endif
+
+	/* count the number of continuation bytes */
+	for (shift = 0, idp = idcode;
+	     shift < IDCODE_CONT_LEN && *idp == 0x7f;
+	     ++shift, ++idp)
+		continue;
+
+	/* search the table for matches in shift and id */
+	for (i = 0; i < ARRAY_SIZE(flashes); ++i)
+		if (flashes[i].shift == shift && flashes[i].idcode == *idp) {
+			/* we have a match, call probe */
+			flash = flashes[i].probe(spi, idp);
+			if (flash)
+				break;
+		}
+
+	if (!flash) {
+		printf("SF: Unsupported manufacturer %02x\n", *idp);
+		goto err_manufacturer_probe;
+	}
+
+	printf("SF: Detected %s with page size ", flash->name);
+	print_size(flash->sector_size, ", total ");
+	print_size(flash->size, "");
+	if (flash->memory_map)
+		printf(", mapped at %p", flash->memory_map);
+	puts("\n");
+
+	spi_release_bus(spi);
+
+	return flash;
+
+err_manufacturer_probe:
+err_read_id:
+	spi_release_bus(spi);
+err_claim_bus:
+	spi_free_slave(spi);
+	return NULL;
+}
+
+void spi_flash_free(struct spi_flash *flash)
+{
+	spi_free_slave(flash->spi);
+	free(flash);
+}
diff --git a/drivers/mtd/spi/spi_flash_internal.h b/drivers/mtd/spi/spi_flash_internal.h
index 6227d2e..a9d03ee 100644
--- a/drivers/mtd/spi/spi_flash_internal.h
+++ b/drivers/mtd/spi/spi_flash_internal.h
@@ -136,5 +136,4 @@ struct spi_flash *spi_flash_probe_macronix(struct spi_slave *spi, u8 *idcode);
 struct spi_flash *spi_flash_probe_sst(struct spi_slave *spi, u8 *idcode);
 struct spi_flash *spi_flash_probe_stmicro(struct spi_slave *spi, u8 *idcode);
 struct spi_flash *spi_flash_probe_winbond(struct spi_slave *spi, u8 *idcode);
-struct spi_flash *spi_fram_probe_ramtron(struct spi_slave *spi, u8 *idcode);
 struct spi_flash *spi_flash_probe_gigadevice(struct spi_slave *spi, u8 *idcode);
diff --git a/drivers/mtd/spi/spi_flash_probe.c b/drivers/mtd/spi/spi_flash_probe.c
index db5f804..86cb881 100644
--- a/drivers/mtd/spi/spi_flash_probe.c
+++ b/drivers/mtd/spi/spi_flash_probe.c
@@ -144,10 +144,6 @@ static const struct spi_flash_params spi_flash_params_table[] = {
 	 * (W25Q64DW, W25Q64FV_QPI)
 	 * (W25Q128FW, W25Q128FV_QPI)
 	 */
-	/*
-	 * TODO:
-	 * RAMTRON
-	 */
 };
 
 struct spi_flash *spi_flash_validate_ids(struct spi_slave *spi, u8 *idcode)
diff --git a/drivers/mtd/spi/spi_flash_probe_legacy.c b/drivers/mtd/spi/spi_flash_probe_legacy.c
deleted file mode 100644
index fedc81e..0000000
--- a/drivers/mtd/spi/spi_flash_probe_legacy.c
+++ /dev/null
@@ -1,274 +0,0 @@
-/*
- * SPI flash probing
- *
- * Copyright (C) 2008 Atmel Corporation
- * Copyright (C) 2010 Reinhard Meyer, EMK Elektronik
- * Copyright (C) 2013 Jagannadha Sutradharudu Teki, Xilinx Inc.
- *
- * Licensed under the GPL-2 or later.
- */
-
-#include <common.h>
-#include <fdtdec.h>
-#include <malloc.h>
-#include <spi.h>
-#include <spi_flash.h>
-
-#include "spi_flash_internal.h"
-
-DECLARE_GLOBAL_DATA_PTR;
-
-#ifdef CONFIG_SPI_FLASH_BAR
-int spi_flash_bank_config(struct spi_flash *flash, u8 idcode0)
-{
-	u8 cmd;
-	u8 curr_bank = 0;
-
-	/* discover bank cmds */
-	switch (idcode0) {
-	case SPI_FLASH_SPANSION_IDCODE0:
-		flash->bank_read_cmd = CMD_BANKADDR_BRRD;
-		flash->bank_write_cmd = CMD_BANKADDR_BRWR;
-		break;
-	case SPI_FLASH_STMICRO_IDCODE0:
-	case SPI_FLASH_WINBOND_IDCODE0:
-		flash->bank_read_cmd = CMD_EXTNADDR_RDEAR;
-		flash->bank_write_cmd = CMD_EXTNADDR_WREAR;
-		break;
-	default:
-		printf("SF: Unsupported bank commands %02x\n", idcode0);
-		return -1;
-	}
-
-	/* read the bank reg - on which bank the flash is in currently */
-	cmd = flash->bank_read_cmd;
-	if (flash->size > SPI_FLASH_16MB_BOUN) {
-		if (spi_flash_read_common(flash, &cmd, 1, &curr_bank, 1)) {
-			debug("SF: fail to read bank addr register\n");
-			return -1;
-		}
-		flash->bank_curr = curr_bank;
-	} else {
-		flash->bank_curr = curr_bank;
-	}
-
-	return 0;
-}
-#endif
-
-#ifdef CONFIG_OF_CONTROL
-int spi_flash_decode_fdt(const void *blob, struct spi_flash *flash)
-{
-	fdt_addr_t addr;
-	fdt_size_t size;
-	int node;
-
-	/* If there is no node, do nothing */
-	node = fdtdec_next_compatible(blob, 0, COMPAT_GENERIC_SPI_FLASH);
-	if (node < 0)
-		return 0;
-
-	addr = fdtdec_get_addr_size(blob, node, "memory-map", &size);
-	if (addr == FDT_ADDR_T_NONE) {
-		debug("%s: Cannot decode address\n", __func__);
-		return 0;
-	}
-
-	if (flash->size != size) {
-		debug("%s: Memory map must cover entire device\n", __func__);
-		return -1;
-	}
-	flash->memory_map = (void *)addr;
-
-	return 0;
-}
-#endif /* CONFIG_OF_CONTROL */
-
-/*
- * The following table holds all device probe functions
- *
- * shift:  number of continuation bytes before the ID
- * idcode: the expected IDCODE or 0xff for non JEDEC devices
- * probe:  the function to call
- *
- * Non JEDEC devices should be ordered in the table such that
- * the probe functions with best detection algorithms come first.
- *
- * Several matching entries are permitted, they will be tried
- * in sequence until a probe function returns non NULL.
- *
- * IDCODE_CONT_LEN may be redefined if a device needs to declare a
- * larger "shift" value.  IDCODE_PART_LEN generally shouldn't be
- * changed.  This is the max number of bytes probe functions may
- * examine when looking up part-specific identification info.
- *
- * Probe functions will be given the idcode buffer starting at their
- * manu id byte (the "idcode" in the table below).  In other words,
- * all of the continuation bytes will be skipped (the "shift" below).
- */
-#define IDCODE_CONT_LEN 0
-#define IDCODE_PART_LEN 5
-static const struct {
-	const u8 shift;
-	const u8 idcode;
-	struct spi_flash *(*probe) (struct spi_slave *spi, u8 *idcode);
-} flashes[] = {
-	/* Keep it sorted by define name */
-#ifdef CONFIG_SPI_FLASH_ATMEL
-	{ 0, 0x1f, spi_flash_probe_atmel, },
-#endif
-#ifdef CONFIG_SPI_FLASH_EON
-	{ 0, 0x1c, spi_flash_probe_eon, },
-#endif
-#ifdef CONFIG_SPI_FLASH_GIGADEVICE
-	{ 0, 0xc8, spi_flash_probe_gigadevice, },
-#endif
-#ifdef CONFIG_SPI_FLASH_MACRONIX
-	{ 0, 0xc2, spi_flash_probe_macronix, },
-#endif
-#ifdef CONFIG_SPI_FLASH_SPANSION
-	{ 0, 0x01, spi_flash_probe_spansion, },
-#endif
-#ifdef CONFIG_SPI_FLASH_SST
-	{ 0, 0xbf, spi_flash_probe_sst, },
-#endif
-#ifdef CONFIG_SPI_FLASH_STMICRO
-	{ 0, 0x20, spi_flash_probe_stmicro, },
-#endif
-#ifdef CONFIG_SPI_FLASH_WINBOND
-	{ 0, 0xef, spi_flash_probe_winbond, },
-#endif
-#ifdef CONFIG_SPI_FRAM_RAMTRON
-	{ 6, 0xc2, spi_fram_probe_ramtron, },
-# undef IDCODE_CONT_LEN
-# define IDCODE_CONT_LEN 6
-#endif
-	/* Keep it sorted by best detection */
-#ifdef CONFIG_SPI_FLASH_STMICRO
-	{ 0, 0xff, spi_flash_probe_stmicro, },
-#endif
-#ifdef CONFIG_SPI_FRAM_RAMTRON_NON_JEDEC
-	{ 0, 0xff, spi_fram_probe_ramtron, },
-#endif
-};
-#define IDCODE_LEN (IDCODE_CONT_LEN + IDCODE_PART_LEN)
-
-struct spi_flash *spi_flash_probe(unsigned int bus, unsigned int cs,
-		unsigned int max_hz, unsigned int spi_mode)
-{
-	struct spi_slave *spi;
-	struct spi_flash *flash = NULL;
-	int ret, i, shift;
-	u8 idcode[IDCODE_LEN], *idp;
-
-	spi = spi_setup_slave(bus, cs, max_hz, spi_mode);
-	if (!spi) {
-		printf("SF: Failed to set up slave\n");
-		return NULL;
-	}
-
-	ret = spi_claim_bus(spi);
-	if (ret) {
-		debug("SF: Failed to claim SPI bus: %d\n", ret);
-		goto err_claim_bus;
-	}
-
-	/* Read the ID codes */
-	ret = spi_flash_cmd(spi, CMD_READ_ID, idcode, sizeof(idcode));
-	if (ret)
-		goto err_read_id;
-
-#ifdef DEBUG
-	printf("SF: Got idcodes\n");
-	print_buffer(0, idcode, 1, sizeof(idcode), 0);
-#endif
-
-	/* count the number of continuation bytes */
-	for (shift = 0, idp = idcode;
-	     shift < IDCODE_CONT_LEN && *idp == 0x7f;
-	     ++shift, ++idp)
-		continue;
-
-	/* search the table for matches in shift and id */
-	for (i = 0; i < ARRAY_SIZE(flashes); ++i)
-		if (flashes[i].shift == shift && flashes[i].idcode == *idp) {
-			/* we have a match, call probe */
-			flash = flashes[i].probe(spi, idp);
-			if (flash)
-				break;
-		}
-
-	if (!flash) {
-		printf("SF: Unsupported manufacturer %02x\n", *idp);
-		goto err_manufacturer_probe;
-	}
-
-#ifdef CONFIG_SPI_FLASH_BAR
-	/* Configure the BAR - disover bank cmds and read current bank  */
-	ret = spi_flash_bank_config(flash, *idp);
-	if (ret < 0)
-		goto err_manufacturer_probe;
-#endif
-
-#ifdef CONFIG_OF_CONTROL
-	if (spi_flash_decode_fdt(gd->fdt_blob, flash)) {
-		debug("SF: FDT decode error\n");
-		goto err_manufacturer_probe;
-	}
-#endif
-	printf("SF: Detected %s with page size ", flash->name);
-	print_size(flash->sector_size, ", total ");
-	print_size(flash->size, "");
-	if (flash->memory_map)
-		printf(", mapped at %p", flash->memory_map);
-	puts("\n");
-#ifndef CONFIG_SPI_FLASH_BAR
-	if (flash->size > SPI_FLASH_16MB_BOUN) {
-		puts("SF: Warning - Only lower 16MiB accessible,");
-		puts(" Full access #define CONFIG_SPI_FLASH_BAR\n");
-	}
-#endif
-
-	spi_release_bus(spi);
-
-	return flash;
-
-err_manufacturer_probe:
-err_read_id:
-	spi_release_bus(spi);
-err_claim_bus:
-	spi_free_slave(spi);
-	return NULL;
-}
-
-void *spi_flash_do_alloc(int offset, int size, struct spi_slave *spi,
-			 const char *name)
-{
-	struct spi_flash *flash;
-	void *ptr;
-
-	ptr = malloc(size);
-	if (!ptr) {
-		debug("SF: Failed to allocate memory\n");
-		return NULL;
-	}
-	memset(ptr, '\0', size);
-	flash = (struct spi_flash *)(ptr + offset);
-
-	/* Set up some basic fields - caller will sort out sizes */
-	flash->spi = spi;
-	flash->name = name;
-	flash->poll_cmd = CMD_READ_STATUS;
-
-	flash->read = spi_flash_cmd_read_fast;
-	flash->write = spi_flash_cmd_write_multi;
-	flash->erase = spi_flash_cmd_erase;
-
-	return flash;
-}
-
-void spi_flash_free(struct spi_flash *flash)
-{
-	spi_free_slave(flash->spi);
-	free(flash);
-}
diff --git a/include/configs/top9000.h b/include/configs/top9000.h
index 65dabde..a6d6928 100644
--- a/include/configs/top9000.h
+++ b/include/configs/top9000.h
@@ -120,7 +120,6 @@
 #define CONFIG_ATMEL_SPI0		/* SPI used for FRAM is SPI0 */
 #define FRAM_SPI_BUS		0
 #define FRAM_CS_NUM		0
-#define CONFIG_SPI_FLASH		/* RAMTRON FRAM on SPI bus */
 #define CONFIG_SPI_FRAM_RAMTRON
 #define CONFIG_SF_DEFAULT_SPEED	1000000	/* be conservative here... */
 #define CONFIG_SF_DEFAULT_MODE	SPI_MODE_0
-- 
1.8.3

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [U-Boot] [RESEND PATCH v2 19/20] sf: Remove unneeded flash drivers files
       [not found] <1375805851-32163-1-git-send-email-jaganna@xilinx.com>
                   ` (17 preceding siblings ...)
  2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 18/20] sf: ramtron: Add support for separate flash driver Jagannadha Sutradharudu Teki
@ 2013-08-06 16:17 ` Jagannadha Sutradharudu Teki
  2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 20/20] sf: probe: Add support for EN25Q64 Jagannadha Sutradharudu Teki
  19 siblings, 0 replies; 23+ messages in thread
From: Jagannadha Sutradharudu Teki @ 2013-08-06 16:17 UTC (permalink / raw)
  To: u-boot

Now the common probing is handled in spi_flash_probe.c
hence removed the unneeded flash drivers.

Signed-off-by: Jagannadha Sutradharudu Teki <jaganna@xilinx.com>
---
Changes for v2:
	- none

 drivers/mtd/spi/Makefile             |  12 +-
 drivers/mtd/spi/atmel.c              | 544 -----------------------------------
 drivers/mtd/spi/eon.c                |  60 ----
 drivers/mtd/spi/gigadevice.c         |  65 -----
 drivers/mtd/spi/macronix.c           |  98 -------
 drivers/mtd/spi/ramtron.c            | 406 --------------------------
 drivers/mtd/spi/spansion.c           | 141 ---------
 drivers/mtd/spi/spi_flash_internal.h |  10 -
 drivers/mtd/spi/sst.c                | 232 ---------------
 drivers/mtd/spi/stmicro.c            | 202 -------------
 drivers/mtd/spi/winbond.c            | 141 ---------
 11 files changed, 2 insertions(+), 1909 deletions(-)
 delete mode 100644 drivers/mtd/spi/atmel.c
 delete mode 100644 drivers/mtd/spi/eon.c
 delete mode 100644 drivers/mtd/spi/gigadevice.c
 delete mode 100644 drivers/mtd/spi/macronix.c
 delete mode 100644 drivers/mtd/spi/ramtron.c
 delete mode 100644 drivers/mtd/spi/spansion.c
 delete mode 100644 drivers/mtd/spi/sst.c
 delete mode 100644 drivers/mtd/spi/stmicro.c
 delete mode 100644 drivers/mtd/spi/winbond.c

diff --git a/drivers/mtd/spi/Makefile b/drivers/mtd/spi/Makefile
index e06924a..db2003b 100644
--- a/drivers/mtd/spi/Makefile
+++ b/drivers/mtd/spi/Makefile
@@ -16,16 +16,8 @@ endif
 ifdef CONFIG_CMD_SF
 COBJS-y	+= spi_flash.o
 endif
-COBJS-$(CONFIG_SPI_FLASH)	+= spi_flash_probe.o spi_flash_ops.o
-COBJS-$(CONFIG_SPI_FLASH_ATMEL)	+= atmel.o
-COBJS-$(CONFIG_SPI_FLASH_EON)	+= eon.o
-COBJS-$(CONFIG_SPI_FLASH_GIGADEVICE)	+= gigadevice.o
-COBJS-$(CONFIG_SPI_FLASH_MACRONIX)	+= macronix.o
-COBJS-$(CONFIG_SPI_FLASH_SPANSION)	+= spansion.o
-COBJS-$(CONFIG_SPI_FLASH_SST)	+= sst.o
-COBJS-$(CONFIG_SPI_FLASH_STMICRO)	+= stmicro.o
-COBJS-$(CONFIG_SPI_FLASH_WINBOND)	+= winbond.o
-COBJS-$(CONFIG_SPI_FRAM_RAMTRON)	+= ramtron.o
+COBJS-$(CONFIG_SPI_FLASH) += spi_flash_probe.o spi_flash_ops.o
+COBJS-$(CONFIG_SPI_FRAM_RAMTRON) += ramtron.o
 COBJS-$(CONFIG_SPI_M95XXX) += eeprom_m95xxx.o
 
 COBJS	:= $(COBJS-y)
diff --git a/drivers/mtd/spi/atmel.c b/drivers/mtd/spi/atmel.c
deleted file mode 100644
index f34df43..0000000
--- a/drivers/mtd/spi/atmel.c
+++ /dev/null
@@ -1,544 +0,0 @@
-/*
- * Atmel SPI DataFlash support
- *
- * Copyright (C) 2008 Atmel Corporation
- * Licensed under the GPL-2 or later.
- */
-
-#include <common.h>
-#include <malloc.h>
-#include <spi_flash.h>
-
-#include "spi_flash_internal.h"
-
-/* AT45-specific commands */
-#define CMD_AT45_READ_STATUS		0xd7
-#define CMD_AT45_ERASE_PAGE		0x81
-#define CMD_AT45_LOAD_PROG_BUF1		0x82
-#define CMD_AT45_LOAD_BUF1		0x84
-#define CMD_AT45_LOAD_PROG_BUF2		0x85
-#define CMD_AT45_LOAD_BUF2		0x87
-#define CMD_AT45_PROG_BUF1		0x88
-#define CMD_AT45_PROG_BUF2		0x89
-
-/* AT45 status register bits */
-#define AT45_STATUS_P2_PAGE_SIZE	(1 << 0)
-#define AT45_STATUS_READY		(1 << 7)
-
-/* DataFlash family IDs, as obtained from the second idcode byte */
-#define DF_FAMILY_AT26F			0
-#define DF_FAMILY_AT45			1
-#define DF_FAMILY_AT26DF		2	/* AT25DF and AT26DF */
-
-struct atmel_spi_flash_params {
-	u8		idcode1;
-	/* Log2 of page size in power-of-two mode */
-	u8		l2_page_size;
-	u8		pages_per_block;
-	u8		blocks_per_sector;
-	u8		nr_sectors;
-	const char	*name;
-};
-
-/* spi_flash needs to be first so upper layers can free() it */
-struct atmel_spi_flash {
-	struct spi_flash flash;
-	const struct atmel_spi_flash_params *params;
-};
-
-static inline struct atmel_spi_flash *
-to_atmel_spi_flash(struct spi_flash *flash)
-{
-	return container_of(flash, struct atmel_spi_flash, flash);
-}
-
-static const struct atmel_spi_flash_params atmel_spi_flash_table[] = {
-	{
-		.idcode1		= 0x22,
-		.l2_page_size		= 8,
-		.pages_per_block	= 8,
-		.blocks_per_sector	= 16,
-		.nr_sectors		= 4,
-		.name			= "AT45DB011D",
-	},
-	{
-		.idcode1		= 0x23,
-		.l2_page_size		= 8,
-		.pages_per_block	= 8,
-		.blocks_per_sector	= 16,
-		.nr_sectors		= 8,
-		.name			= "AT45DB021D",
-	},
-	{
-		.idcode1		= 0x24,
-		.l2_page_size		= 8,
-		.pages_per_block	= 8,
-		.blocks_per_sector	= 32,
-		.nr_sectors		= 8,
-		.name			= "AT45DB041D",
-	},
-	{
-		.idcode1		= 0x25,
-		.l2_page_size		= 8,
-		.pages_per_block	= 8,
-		.blocks_per_sector	= 32,
-		.nr_sectors		= 16,
-		.name			= "AT45DB081D",
-	},
-	{
-		.idcode1		= 0x26,
-		.l2_page_size		= 9,
-		.pages_per_block	= 8,
-		.blocks_per_sector	= 32,
-		.nr_sectors		= 16,
-		.name			= "AT45DB161D",
-	},
-	{
-		.idcode1		= 0x27,
-		.l2_page_size		= 9,
-		.pages_per_block	= 8,
-		.blocks_per_sector	= 64,
-		.nr_sectors		= 64,
-		.name			= "AT45DB321D",
-	},
-	{
-		.idcode1		= 0x28,
-		.l2_page_size		= 10,
-		.pages_per_block	= 8,
-		.blocks_per_sector	= 32,
-		.nr_sectors		= 32,
-		.name			= "AT45DB642D",
-	},
-	{
-		.idcode1		= 0x47,
-		.l2_page_size		= 8,
-		.pages_per_block	= 16,
-		.blocks_per_sector	= 16,
-		.nr_sectors		= 64,
-		.name			= "AT25DF321",
-	},
-};
-
-static int at45_wait_ready(struct spi_flash *flash, unsigned long timeout)
-{
-	struct spi_slave *spi = flash->spi;
-	unsigned long timebase;
-	int ret;
-	u8 cmd = CMD_AT45_READ_STATUS;
-	u8 status;
-
-	timebase = get_timer(0);
-
-	ret = spi_xfer(spi, 8, &cmd, NULL, SPI_XFER_BEGIN);
-	if (ret)
-		return -1;
-
-	do {
-		ret = spi_xfer(spi, 8, NULL, &status, 0);
-		if (ret)
-			return -1;
-
-		if (status & AT45_STATUS_READY)
-			break;
-	} while (get_timer(timebase) < timeout);
-
-	/* Deactivate CS */
-	spi_xfer(spi, 0, NULL, NULL, SPI_XFER_END);
-
-	if (status & AT45_STATUS_READY)
-		return 0;
-
-	/* Timed out */
-	return -1;
-}
-
-/*
- * Assemble the address part of a command for AT45 devices in
- * non-power-of-two page size mode.
- */
-static void at45_build_address(struct atmel_spi_flash *asf, u8 *cmd, u32 offset)
-{
-	unsigned long page_addr;
-	unsigned long byte_addr;
-	unsigned long page_size;
-	unsigned int page_shift;
-
-	/*
-	 * The "extra" space per page is the power-of-two page size
-	 * divided by 32.
-	 */
-	page_shift = asf->params->l2_page_size;
-	page_size = (1 << page_shift) + (1 << (page_shift - 5));
-	page_shift++;
-	page_addr = offset / page_size;
-	byte_addr = offset % page_size;
-
-	cmd[0] = page_addr >> (16 - page_shift);
-	cmd[1] = page_addr << (page_shift - 8) | (byte_addr >> 8);
-	cmd[2] = byte_addr;
-}
-
-static int dataflash_read_fast_at45(struct spi_flash *flash,
-		u32 offset, size_t len, void *buf)
-{
-	struct atmel_spi_flash *asf = to_atmel_spi_flash(flash);
-	u8 cmd[5];
-
-	cmd[0] = CMD_READ_ARRAY_FAST;
-	at45_build_address(asf, cmd + 1, offset);
-	cmd[4] = 0x00;
-
-	return spi_flash_read_common(flash, cmd, sizeof(cmd), buf, len);
-}
-
-/*
- * TODO: the two write funcs (_p2/_at45) should get unified ...
- */
-static int dataflash_write_p2(struct spi_flash *flash,
-		u32 offset, size_t len, const void *buf)
-{
-	struct atmel_spi_flash *asf = to_atmel_spi_flash(flash);
-	unsigned long page_size;
-	u32 addr = offset;
-	size_t chunk_len;
-	size_t actual;
-	int ret;
-	u8 cmd[4];
-
-	/*
-	 * TODO: This function currently uses only page buffer #1.  We can
-	 * speed this up by using both buffers and loading one buffer while
-	 * the other is being programmed into main memory.
-	 */
-
-	page_size = (1 << asf->params->l2_page_size);
-
-	ret = spi_claim_bus(flash->spi);
-	if (ret) {
-		debug("SF: Unable to claim SPI bus\n");
-		return ret;
-	}
-
-	for (actual = 0; actual < len; actual += chunk_len) {
-		chunk_len = min(len - actual, page_size - (addr % page_size));
-
-		/* Use the same address bits for both commands */
-		cmd[0] = CMD_AT45_LOAD_BUF1;
-		cmd[1] = addr >> 16;
-		cmd[2] = addr >> 8;
-		cmd[3] = addr;
-
-		ret = spi_flash_cmd_write(flash->spi, cmd, 4,
-				buf + actual, chunk_len);
-		if (ret < 0) {
-			debug("SF: Loading AT45 buffer failed\n");
-			goto out;
-		}
-
-		cmd[0] = CMD_AT45_PROG_BUF1;
-		ret = spi_flash_cmd_write(flash->spi, cmd, 4, NULL, 0);
-		if (ret < 0) {
-			debug("SF: AT45 page programming failed\n");
-			goto out;
-		}
-
-		ret = at45_wait_ready(flash, SPI_FLASH_PROG_TIMEOUT);
-		if (ret < 0) {
-			debug("SF: AT45 page programming timed out\n");
-			goto out;
-		}
-
-		addr += chunk_len;
-	}
-
-	debug("SF: AT45: Successfully programmed %zu bytes @ 0x%x\n",
-	      len, offset);
-	ret = 0;
-
-out:
-	spi_release_bus(flash->spi);
-	return ret;
-}
-
-static int dataflash_write_at45(struct spi_flash *flash,
-		u32 offset, size_t len, const void *buf)
-{
-	struct atmel_spi_flash *asf = to_atmel_spi_flash(flash);
-	unsigned long page_addr;
-	unsigned long byte_addr;
-	unsigned long page_size;
-	unsigned int page_shift;
-	size_t chunk_len;
-	size_t actual;
-	int ret;
-	u8 cmd[4];
-
-	/*
-	 * TODO: This function currently uses only page buffer #1.  We can
-	 * speed this up by using both buffers and loading one buffer while
-	 * the other is being programmed into main memory.
-	 */
-
-	page_shift = asf->params->l2_page_size;
-	page_size = (1 << page_shift) + (1 << (page_shift - 5));
-	page_shift++;
-	page_addr = offset / page_size;
-	byte_addr = offset % page_size;
-
-	ret = spi_claim_bus(flash->spi);
-	if (ret) {
-		debug("SF: Unable to claim SPI bus\n");
-		return ret;
-	}
-
-	for (actual = 0; actual < len; actual += chunk_len) {
-		chunk_len = min(len - actual, page_size - byte_addr);
-
-		/* Use the same address bits for both commands */
-		cmd[0] = CMD_AT45_LOAD_BUF1;
-		cmd[1] = page_addr >> (16 - page_shift);
-		cmd[2] = page_addr << (page_shift - 8) | (byte_addr >> 8);
-		cmd[3] = byte_addr;
-
-		ret = spi_flash_cmd_write(flash->spi, cmd, 4,
-				buf + actual, chunk_len);
-		if (ret < 0) {
-			debug("SF: Loading AT45 buffer failed\n");
-			goto out;
-		}
-
-		cmd[0] = CMD_AT45_PROG_BUF1;
-		ret = spi_flash_cmd_write(flash->spi, cmd, 4, NULL, 0);
-		if (ret < 0) {
-			debug("SF: AT45 page programming failed\n");
-			goto out;
-		}
-
-		ret = at45_wait_ready(flash, SPI_FLASH_PROG_TIMEOUT);
-		if (ret < 0) {
-			debug("SF: AT45 page programming timed out\n");
-			goto out;
-		}
-
-		page_addr++;
-		byte_addr = 0;
-	}
-
-	debug("SF: AT45: Successfully programmed %zu bytes @ 0x%x\n",
-	      len, offset);
-	ret = 0;
-
-out:
-	spi_release_bus(flash->spi);
-	return ret;
-}
-
-/*
- * TODO: the two erase funcs (_p2/_at45) should get unified ...
- */
-static int dataflash_erase_p2(struct spi_flash *flash, u32 offset, size_t len)
-{
-	struct atmel_spi_flash *asf = to_atmel_spi_flash(flash);
-	unsigned long page_size;
-
-	size_t actual;
-	int ret;
-	u8 cmd[4];
-
-	/*
-	 * TODO: This function currently uses page erase only. We can
-	 * probably speed things up by using block and/or sector erase
-	 * when possible.
-	 */
-
-	page_size = (1 << asf->params->l2_page_size);
-
-	if (offset % page_size || len % page_size) {
-		debug("SF: Erase offset/length not multiple of page size\n");
-		return -1;
-	}
-
-	cmd[0] = CMD_AT45_ERASE_PAGE;
-	cmd[3] = 0x00;
-
-	ret = spi_claim_bus(flash->spi);
-	if (ret) {
-		debug("SF: Unable to claim SPI bus\n");
-		return ret;
-	}
-
-	for (actual = 0; actual < len; actual += page_size) {
-		cmd[1] = offset >> 16;
-		cmd[2] = offset >> 8;
-
-		ret = spi_flash_cmd_write(flash->spi, cmd, 4, NULL, 0);
-		if (ret < 0) {
-			debug("SF: AT45 page erase failed\n");
-			goto out;
-		}
-
-		ret = at45_wait_ready(flash, SPI_FLASH_PAGE_ERASE_TIMEOUT);
-		if (ret < 0) {
-			debug("SF: AT45 page erase timed out\n");
-			goto out;
-		}
-
-		offset += page_size;
-	}
-
-	debug("SF: AT45: Successfully erased %zu bytes @ 0x%x\n",
-	      len, offset);
-	ret = 0;
-
-out:
-	spi_release_bus(flash->spi);
-	return ret;
-}
-
-static int dataflash_erase_at45(struct spi_flash *flash, u32 offset, size_t len)
-{
-	struct atmel_spi_flash *asf = to_atmel_spi_flash(flash);
-	unsigned long page_addr;
-	unsigned long page_size;
-	unsigned int page_shift;
-	size_t actual;
-	int ret;
-	u8 cmd[4];
-
-	/*
-	 * TODO: This function currently uses page erase only. We can
-	 * probably speed things up by using block and/or sector erase
-	 * when possible.
-	 */
-
-	page_shift = asf->params->l2_page_size;
-	page_size = (1 << page_shift) + (1 << (page_shift - 5));
-	page_shift++;
-	page_addr = offset / page_size;
-
-	if (offset % page_size || len % page_size) {
-		debug("SF: Erase offset/length not multiple of page size\n");
-		return -1;
-	}
-
-	cmd[0] = CMD_AT45_ERASE_PAGE;
-	cmd[3] = 0x00;
-
-	ret = spi_claim_bus(flash->spi);
-	if (ret) {
-		debug("SF: Unable to claim SPI bus\n");
-		return ret;
-	}
-
-	for (actual = 0; actual < len; actual += page_size) {
-		cmd[1] = page_addr >> (16 - page_shift);
-		cmd[2] = page_addr << (page_shift - 8);
-
-		ret = spi_flash_cmd_write(flash->spi, cmd, 4, NULL, 0);
-		if (ret < 0) {
-			debug("SF: AT45 page erase failed\n");
-			goto out;
-		}
-
-		ret = at45_wait_ready(flash, SPI_FLASH_PAGE_ERASE_TIMEOUT);
-		if (ret < 0) {
-			debug("SF: AT45 page erase timed out\n");
-			goto out;
-		}
-
-		page_addr++;
-	}
-
-	debug("SF: AT45: Successfully erased %zu bytes @ 0x%x\n",
-	      len, offset);
-	ret = 0;
-
-out:
-	spi_release_bus(flash->spi);
-	return ret;
-}
-
-struct spi_flash *spi_flash_probe_atmel(struct spi_slave *spi, u8 *idcode)
-{
-	const struct atmel_spi_flash_params *params;
-	unsigned page_size;
-	unsigned int family;
-	struct atmel_spi_flash *asf;
-	unsigned int i;
-	int ret;
-	u8 status;
-
-	for (i = 0; i < ARRAY_SIZE(atmel_spi_flash_table); i++) {
-		params = &atmel_spi_flash_table[i];
-		if (params->idcode1 == idcode[1])
-			break;
-	}
-
-	if (i == ARRAY_SIZE(atmel_spi_flash_table)) {
-		debug("SF: Unsupported DataFlash ID %02x\n",
-		      idcode[1]);
-		return NULL;
-	}
-
-	asf = spi_flash_alloc(struct atmel_spi_flash, spi, params->name);
-	if (!asf) {
-		debug("SF: Failed to allocate memory\n");
-		return NULL;
-	}
-
-	asf->params = params;
-
-	/* Assuming power-of-two page size initially. */
-	page_size = 1 << params->l2_page_size;
-
-	family = idcode[1] >> 5;
-
-	switch (family) {
-	case DF_FAMILY_AT45:
-		/*
-		 * AT45 chips have configurable page size. The status
-		 * register indicates which configuration is active.
-		 */
-		ret = spi_flash_cmd(spi, CMD_AT45_READ_STATUS, &status, 1);
-		if (ret)
-			goto err;
-
-		debug("SF: AT45 status register: %02x\n", status);
-
-		if (!(status & AT45_STATUS_P2_PAGE_SIZE)) {
-			asf->flash.read = dataflash_read_fast_at45;
-			asf->flash.write = dataflash_write_at45;
-			asf->flash.erase = dataflash_erase_at45;
-			page_size += 1 << (params->l2_page_size - 5);
-		} else {
-			asf->flash.write = dataflash_write_p2;
-			asf->flash.erase = dataflash_erase_p2;
-		}
-
-		asf->flash.page_size = page_size;
-		asf->flash.sector_size = page_size;
-		break;
-
-	case DF_FAMILY_AT26F:
-	case DF_FAMILY_AT26DF:
-		asf->flash.page_size = page_size;
-		asf->flash.sector_size = 4096;
-		/* clear SPRL# bit for locked flash */
-		spi_flash_cmd_write_status(&asf->flash, 0);
-		break;
-
-	default:
-		debug("SF: Unsupported DataFlash family %u\n", family);
-		goto err;
-	}
-
-	asf->flash.size = page_size * params->pages_per_block
-				* params->blocks_per_sector
-				* params->nr_sectors;
-
-	return &asf->flash;
-
-err:
-	free(asf);
-	return NULL;
-}
diff --git a/drivers/mtd/spi/eon.c b/drivers/mtd/spi/eon.c
deleted file mode 100644
index 25cfc12..0000000
--- a/drivers/mtd/spi/eon.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * (C) Copyright 2010, ucRobotics Inc.
- * Author: Chong Huang <chuang@ucrobotics.com>
- * Licensed under the GPL-2 or later.
- */
-
-#include <common.h>
-#include <malloc.h>
-#include <spi_flash.h>
-
-#include "spi_flash_internal.h"
-
-struct eon_spi_flash_params {
-	u8 idcode1;
-	u16 nr_sectors;
-	const char *name;
-};
-
-static const struct eon_spi_flash_params eon_spi_flash_table[] = {
-	{
-		.idcode1 = 0x16,
-		.nr_sectors = 1024,
-		.name = "EN25Q32B",
-	},
-	{
-		.idcode1 = 0x18,
-		.nr_sectors = 4096,
-		.name = "EN25Q128",
-	},
-};
-
-struct spi_flash *spi_flash_probe_eon(struct spi_slave *spi, u8 *idcode)
-{
-	const struct eon_spi_flash_params *params;
-	struct spi_flash *flash;
-	unsigned int i;
-
-	for (i = 0; i < ARRAY_SIZE(eon_spi_flash_table); ++i) {
-		params = &eon_spi_flash_table[i];
-		if (params->idcode1 == idcode[2])
-			break;
-	}
-
-	if (i == ARRAY_SIZE(eon_spi_flash_table)) {
-		debug("SF: Unsupported EON ID %02x\n", idcode[1]);
-		return NULL;
-	}
-
-	flash = spi_flash_alloc_base(spi, params->name);
-	if (!flash) {
-		debug("SF: Failed to allocate memory\n");
-		return NULL;
-	}
-
-	flash->page_size = 256;
-	flash->sector_size = 256 * 16 * 16;
-	flash->size = 256 * 16 * params->nr_sectors;
-
-	return flash;
-}
diff --git a/drivers/mtd/spi/gigadevice.c b/drivers/mtd/spi/gigadevice.c
deleted file mode 100644
index b42581a..0000000
--- a/drivers/mtd/spi/gigadevice.c
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Gigadevice SPI flash driver
- * Copyright 2013, Samsung Electronics Co., Ltd.
- * Author: Banajit Goswami <banajit.g@samsung.com>
- *
- * SPDX-License-Identifier:	GPL-2.0+
- */
-
-#include <common.h>
-#include <malloc.h>
-#include <spi_flash.h>
-
-#include "spi_flash_internal.h"
-
-struct gigadevice_spi_flash_params {
-	uint16_t	id;
-	uint16_t	nr_blocks;
-	const char	*name;
-};
-
-static const struct gigadevice_spi_flash_params gigadevice_spi_flash_table[] = {
-	{
-		.id			= 0x6016,
-		.nr_blocks		= 64,
-		.name			= "GD25LQ",
-	},
-	{
-		.id			= 0x4017,
-		.nr_blocks		= 128,
-		.name			= "GD25Q64B",
-	},
-};
-
-struct spi_flash *spi_flash_probe_gigadevice(struct spi_slave *spi, u8 *idcode)
-{
-	const struct gigadevice_spi_flash_params *params;
-	struct spi_flash *flash;
-	unsigned int i;
-
-	for (i = 0; i < ARRAY_SIZE(gigadevice_spi_flash_table); i++) {
-		params = &gigadevice_spi_flash_table[i];
-		if (params->id == ((idcode[1] << 8) | idcode[2]))
-			break;
-	}
-
-	if (i == ARRAY_SIZE(gigadevice_spi_flash_table)) {
-		debug("SF: Unsupported Gigadevice ID %02x%02x\n",
-		      idcode[1], idcode[2]);
-		return NULL;
-	}
-
-	flash = spi_flash_alloc_base(spi, params->name);
-	if (!flash) {
-		debug("SF: Failed to allocate memory\n");
-		return NULL;
-	}
-	/* page_size */
-	flash->page_size = 256;
-	/* sector_size = page_size * pages_per_sector */
-	flash->sector_size = flash->page_size * 16;
-	/* size = sector_size * sector_per_block * number of blocks */
-	flash->size = flash->sector_size * 16 * params->nr_blocks;
-
-	return flash;
-}
diff --git a/drivers/mtd/spi/macronix.c b/drivers/mtd/spi/macronix.c
deleted file mode 100644
index 70435eb..0000000
--- a/drivers/mtd/spi/macronix.c
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright 2009(C) Marvell International Ltd. and its affiliates
- * Prafulla Wadaskar <prafulla@marvell.com>
- *
- * Based on drivers/mtd/spi/stmicro.c
- *
- * Copyright 2008, Network Appliance Inc.
- * Jason McMullan <mcmullan@netapp.com>
- *
- * Copyright (C) 2004-2007 Freescale Semiconductor, Inc.
- * TsiChung Liew (Tsi-Chung.Liew at freescale.com)
- *
- * SPDX-License-Identifier:	GPL-2.0+
- */
-
-#include <common.h>
-#include <malloc.h>
-#include <spi_flash.h>
-
-#include "spi_flash_internal.h"
-
-struct macronix_spi_flash_params {
-	u16 idcode;
-	u16 nr_blocks;
-	const char *name;
-};
-
-static const struct macronix_spi_flash_params macronix_spi_flash_table[] = {
-	{
-		.idcode = 0x2013,
-		.nr_blocks = 8,
-		.name = "MX25L4005",
-	},
-	{
-		.idcode = 0x2014,
-		.nr_blocks = 16,
-		.name = "MX25L8005",
-	},
-	{
-		.idcode = 0x2015,
-		.nr_blocks = 32,
-		.name = "MX25L1605D",
-	},
-	{
-		.idcode = 0x2016,
-		.nr_blocks = 64,
-		.name = "MX25L3205D",
-	},
-	{
-		.idcode = 0x2017,
-		.nr_blocks = 128,
-		.name = "MX25L6405D",
-	},
-	{
-		.idcode = 0x2018,
-		.nr_blocks = 256,
-		.name = "MX25L12805D",
-	},
-	{
-		.idcode = 0x2618,
-		.nr_blocks = 256,
-		.name = "MX25L12855E",
-	},
-};
-
-struct spi_flash *spi_flash_probe_macronix(struct spi_slave *spi, u8 *idcode)
-{
-	const struct macronix_spi_flash_params *params;
-	struct spi_flash *flash;
-	unsigned int i;
-	u16 id = idcode[2] | idcode[1] << 8;
-
-	for (i = 0; i < ARRAY_SIZE(macronix_spi_flash_table); i++) {
-		params = &macronix_spi_flash_table[i];
-		if (params->idcode == id)
-			break;
-	}
-
-	if (i == ARRAY_SIZE(macronix_spi_flash_table)) {
-		debug("SF: Unsupported Macronix ID %04x\n", id);
-		return NULL;
-	}
-
-	flash = spi_flash_alloc_base(spi, params->name);
-	if (!flash) {
-		debug("SF: Failed to allocate memory\n");
-		return NULL;
-	}
-
-	flash->page_size = 256;
-	flash->sector_size = 256 * 16 * 16;
-	flash->size = flash->sector_size * params->nr_blocks;
-
-	/* Clear BP# bits for read-only flash */
-	spi_flash_cmd_write_status(flash, 0);
-
-	return flash;
-}
diff --git a/drivers/mtd/spi/ramtron.c b/drivers/mtd/spi/ramtron.c
deleted file mode 100644
index c9701d0..0000000
--- a/drivers/mtd/spi/ramtron.c
+++ /dev/null
@@ -1,406 +0,0 @@
-/*
- * (C) Copyright 2010
- * Reinhard Meyer, EMK Elektronik, reinhard.meyer at emk-elektronik.de
- *
- * SPDX-License-Identifier:	GPL-2.0+
- */
-
-/*
- * Note: RAMTRON SPI FRAMs are ferroelectric, nonvolatile RAMs
- * with an interface identical to SPI flash devices.
- * However since they behave like RAM there are no delays or
- * busy polls required. They can sustain read or write at the
- * allowed SPI bus speed, which can be 40 MHz for some devices.
- *
- * Unfortunately some RAMTRON devices do not have a means of
- * identifying them. They will leave the SO line undriven when
- * the READ-ID command is issued. It is therefore mandatory
- * that the MISO line has a proper pull-up, so that READ-ID
- * will return a row of 0xff. This 0xff pseudo-id will cause
- * probes by all vendor specific functions that are designed
- * to handle it. If the MISO line is not pulled up, READ-ID
- * could return any random noise, even mimicking another
- * device.
- *
- * We use CONFIG_SPI_FRAM_RAMTRON_NON_JEDEC
- * to define which device will be assumed after a simple status
- * register verify. This method is prone to false positive
- * detection and should therefore be the last to be tried.
- * Enter it in the last position in the table in spi_flash.c!
- *
- * The define CONFIG_SPI_FRAM_RAMTRON_NON_JEDEC both activates
- * compilation of the special handler and defines the device
- * to assume.
- */
-
-#include <common.h>
-#include <malloc.h>
-#include <spi_flash.h>
-#include "spi_flash_internal.h"
-
-/*
- * Properties of supported FRAMs
- * Note: speed is currently not used because we have no method to deliver that
- * value to the upper layers
- */
-struct ramtron_spi_fram_params {
-	u32	size;		/* size in bytes */
-	u8	addr_len;	/* number of address bytes */
-	u8	merge_cmd;	/* some address bits are in the command byte */
-	u8	id1;		/* device ID 1 (family, density) */
-	u8	id2;		/* device ID 2 (sub, rev, rsvd) */
-	u32	speed;		/* max. SPI clock in Hz */
-	const char *name;	/* name for display and/or matching */
-};
-
-struct ramtron_spi_fram {
-	struct spi_flash flash;
-	const struct ramtron_spi_fram_params *params;
-};
-
-static inline struct ramtron_spi_fram *to_ramtron_spi_fram(struct spi_flash
-							     *flash)
-{
-	return container_of(flash, struct ramtron_spi_fram, flash);
-}
-
-/*
- * table describing supported FRAM chips:
- * chips without RDID command must have the values 0xff for id1 and id2
- */
-static const struct ramtron_spi_fram_params ramtron_spi_fram_table[] = {
-	{
-		.size = 32*1024,
-		.addr_len = 2,
-		.merge_cmd = 0,
-		.id1 = 0x22,
-		.id2 = 0x00,
-		.speed = 40000000,
-		.name = "FM25V02",
-	},
-	{
-		.size = 32*1024,
-		.addr_len = 2,
-		.merge_cmd = 0,
-		.id1 = 0x22,
-		.id2 = 0x01,
-		.speed = 40000000,
-		.name = "FM25VN02",
-	},
-	{
-		.size = 64*1024,
-		.addr_len = 2,
-		.merge_cmd = 0,
-		.id1 = 0x23,
-		.id2 = 0x00,
-		.speed = 40000000,
-		.name = "FM25V05",
-	},
-	{
-		.size = 64*1024,
-		.addr_len = 2,
-		.merge_cmd = 0,
-		.id1 = 0x23,
-		.id2 = 0x01,
-		.speed = 40000000,
-		.name = "FM25VN05",
-	},
-	{
-		.size = 128*1024,
-		.addr_len = 3,
-		.merge_cmd = 0,
-		.id1 = 0x24,
-		.id2 = 0x00,
-		.speed = 40000000,
-		.name = "FM25V10",
-	},
-	{
-		.size = 128*1024,
-		.addr_len = 3,
-		.merge_cmd = 0,
-		.id1 = 0x24,
-		.id2 = 0x01,
-		.speed = 40000000,
-		.name = "FM25VN10",
-	},
-#ifdef CONFIG_SPI_FRAM_RAMTRON_NON_JEDEC
-	{
-		.size = 256*1024,
-		.addr_len = 3,
-		.merge_cmd = 0,
-		.id1 = 0xff,
-		.id2 = 0xff,
-		.speed = 40000000,
-		.name = "FM25H20",
-	},
-#endif
-};
-
-static int ramtron_common(struct spi_flash *flash,
-		u32 offset, size_t len, void *buf, u8 command)
-{
-	struct ramtron_spi_fram *sn = to_ramtron_spi_fram(flash);
-	u8 cmd[4];
-	int cmd_len;
-	int ret;
-
-	if (sn->params->addr_len == 3 && sn->params->merge_cmd == 0) {
-		cmd[0] = command;
-		cmd[1] = offset >> 16;
-		cmd[2] = offset >> 8;
-		cmd[3] = offset;
-		cmd_len = 4;
-	} else if (sn->params->addr_len == 2 && sn->params->merge_cmd == 0) {
-		cmd[0] = command;
-		cmd[1] = offset >> 8;
-		cmd[2] = offset;
-		cmd_len = 3;
-	} else {
-		printf("SF: unsupported addr_len or merge_cmd\n");
-		return -1;
-	}
-
-	/* claim the bus */
-	ret = spi_claim_bus(flash->spi);
-	if (ret) {
-		debug("SF: Unable to claim SPI bus\n");
-		return ret;
-	}
-
-	if (command == CMD_PAGE_PROGRAM) {
-		/* send WREN */
-		ret = spi_flash_cmd_write_enable(flash);
-		if (ret < 0) {
-			debug("SF: Enabling Write failed\n");
-			goto releasebus;
-		}
-	}
-
-	/* do the transaction */
-	if (command == CMD_PAGE_PROGRAM)
-		ret = spi_flash_cmd_write(flash->spi, cmd, cmd_len, buf, len);
-	else
-		ret = spi_flash_cmd_read(flash->spi, cmd, cmd_len, buf, len);
-	if (ret < 0)
-		debug("SF: Transaction failed\n");
-
-releasebus:
-	/* release the bus */
-	spi_release_bus(flash->spi);
-	return ret;
-}
-
-static int ramtron_read(struct spi_flash *flash,
-		u32 offset, size_t len, void *buf)
-{
-	return ramtron_common(flash, offset, len, buf,
-		CMD_READ_ARRAY_SLOW);
-}
-
-static int ramtron_write(struct spi_flash *flash,
-		u32 offset, size_t len, const void *buf)
-{
-	return ramtron_common(flash, offset, len, (void *)buf,
-		CMD_PAGE_PROGRAM);
-}
-
-static int ramtron_erase(struct spi_flash *flash, u32 offset, size_t len)
-{
-	debug("SF: Erase of RAMTRON FRAMs is pointless\n");
-	return -1;
-}
-
-/*
- * nore: we are called here with idcode pointing to the first non-0x7f byte
- * already!
- */
-static struct spi_flash *spi_fram_probe_ramtron(struct spi_slave *spi,
-		u8 *idcode)
-{
-	const struct ramtron_spi_fram_params *params;
-	struct ramtron_spi_fram *sn;
-	unsigned int i;
-#ifdef CONFIG_SPI_FRAM_RAMTRON_NON_JEDEC
-	int ret;
-	u8 sr;
-#endif
-
-	/* NOTE: the bus has been claimed before this function is called! */
-	switch (idcode[0]) {
-	case 0xc2:
-		/* JEDEC conformant RAMTRON id */
-		for (i = 0; i < ARRAY_SIZE(ramtron_spi_fram_table); i++) {
-			params = &ramtron_spi_fram_table[i];
-			if (idcode[1] == params->id1 &&
-			    idcode[2] == params->id2)
-				goto found;
-		}
-		break;
-#ifdef CONFIG_SPI_FRAM_RAMTRON_NON_JEDEC
-	case 0xff:
-		/*
-		 * probably open MISO line, pulled up.
-		 * We COULD have a non JEDEC conformant FRAM here,
-		 * read the status register to verify
-		 */
-		ret = spi_flash_cmd(spi, CMD_READ_STATUS, &sr, 1);
-		if (ret)
-			return NULL;
-
-		/* Bits 5,4,0 are fixed 0 for all devices */
-		if ((sr & 0x31) != 0x00)
-			return NULL;
-		/* now find the device */
-		for (i = 0; i < ARRAY_SIZE(ramtron_spi_fram_table); i++) {
-			params = &ramtron_spi_fram_table[i];
-			if (!strcmp(params->name,
-				    CONFIG_SPI_FRAM_RAMTRON_NON_JEDEC))
-				goto found;
-		}
-		debug("SF: Unsupported non-JEDEC RAMTRON device "
-			CONFIG_SPI_FRAM_RAMTRON_NON_JEDEC "\n");
-		break;
-#endif
-	default:
-		break;
-	}
-
-	/* arriving here means no method has found a device we can handle */
-	debug("SF/ramtron: unsupported device id0=%02x id1=%02x id2=%02x\n",
-	      idcode[0], idcode[1], idcode[2]);
-	return NULL;
-
-found:
-	sn = malloc(sizeof(*sn));
-	if (!sn) {
-		debug("SF: Failed to allocate memory\n");
-		return NULL;
-	}
-
-	sn->params = params;
-
-	sn->flash.write = ramtron_write;
-	sn->flash.read = ramtron_read;
-	sn->flash.erase = ramtron_erase;
-	sn->flash.size = params->size;
-
-	return &sn->flash;
-}
-
-/*
- * The following table holds all device probe functions
- * (All flashes are removed and implemented a common probe at
- *  spi_flash_probe.c)
- *
- * shift:  number of continuation bytes before the ID
- * idcode: the expected IDCODE or 0xff for non JEDEC devices
- * probe:  the function to call
- *
- * Non JEDEC devices should be ordered in the table such that
- * the probe functions with best detection algorithms come first.
- *
- * Several matching entries are permitted, they will be tried
- * in sequence until a probe function returns non NULL.
- *
- * IDCODE_CONT_LEN may be redefined if a device needs to declare a
- * larger "shift" value.  IDCODE_PART_LEN generally shouldn't be
- * changed.  This is the max number of bytes probe functions may
- * examine when looking up part-specific identification info.
- *
- * Probe functions will be given the idcode buffer starting at their
- * manu id byte (the "idcode" in the table below).  In other words,
- * all of the continuation bytes will be skipped (the "shift" below).
- */
-#define IDCODE_CONT_LEN 0
-#define IDCODE_PART_LEN 5
-static const struct {
-	const u8 shift;
-	const u8 idcode;
-	struct spi_flash *(*probe) (struct spi_slave *spi, u8 *idcode);
-} flashes[] = {
-	/* Keep it sorted by define name */
-#ifdef CONFIG_SPI_FRAM_RAMTRON
-	{ 6, 0xc2, spi_fram_probe_ramtron, },
-# undef IDCODE_CONT_LEN
-# define IDCODE_CONT_LEN 6
-#endif
-#ifdef CONFIG_SPI_FRAM_RAMTRON_NON_JEDEC
-	{ 0, 0xff, spi_fram_probe_ramtron, },
-#endif
-};
-#define IDCODE_LEN (IDCODE_CONT_LEN + IDCODE_PART_LEN)
-
-struct spi_flash *spi_flash_probe(unsigned int bus, unsigned int cs,
-		unsigned int max_hz, unsigned int spi_mode)
-{
-	struct spi_slave *spi;
-	struct spi_flash *flash = NULL;
-	int ret, i, shift;
-	u8 idcode[IDCODE_LEN], *idp;
-
-	spi = spi_setup_slave(bus, cs, max_hz, spi_mode);
-	if (!spi) {
-		printf("SF: Failed to set up slave\n");
-		return NULL;
-	}
-
-	ret = spi_claim_bus(spi);
-	if (ret) {
-		debug("SF: Failed to claim SPI bus: %d\n", ret);
-		goto err_claim_bus;
-	}
-
-	/* Read the ID codes */
-	ret = spi_flash_cmd(spi, CMD_READ_ID, idcode, sizeof(idcode));
-	if (ret)
-		goto err_read_id;
-
-#ifdef DEBUG
-	printf("SF: Got idcodes\n");
-	print_buffer(0, idcode, 1, sizeof(idcode), 0);
-#endif
-
-	/* count the number of continuation bytes */
-	for (shift = 0, idp = idcode;
-	     shift < IDCODE_CONT_LEN && *idp == 0x7f;
-	     ++shift, ++idp)
-		continue;
-
-	/* search the table for matches in shift and id */
-	for (i = 0; i < ARRAY_SIZE(flashes); ++i)
-		if (flashes[i].shift == shift && flashes[i].idcode == *idp) {
-			/* we have a match, call probe */
-			flash = flashes[i].probe(spi, idp);
-			if (flash)
-				break;
-		}
-
-	if (!flash) {
-		printf("SF: Unsupported manufacturer %02x\n", *idp);
-		goto err_manufacturer_probe;
-	}
-
-	printf("SF: Detected %s with page size ", flash->name);
-	print_size(flash->sector_size, ", total ");
-	print_size(flash->size, "");
-	if (flash->memory_map)
-		printf(", mapped at %p", flash->memory_map);
-	puts("\n");
-
-	spi_release_bus(spi);
-
-	return flash;
-
-err_manufacturer_probe:
-err_read_id:
-	spi_release_bus(spi);
-err_claim_bus:
-	spi_free_slave(spi);
-	return NULL;
-}
-
-void spi_flash_free(struct spi_flash *flash)
-{
-	spi_free_slave(flash->spi);
-	free(flash);
-}
diff --git a/drivers/mtd/spi/spansion.c b/drivers/mtd/spi/spansion.c
deleted file mode 100644
index fa7ac8c..0000000
--- a/drivers/mtd/spi/spansion.c
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright (C) 2009 Freescale Semiconductor, Inc.
- *
- * Author: Mingkai Hu (Mingkai.hu at freescale.com)
- * Based on stmicro.c by Wolfgang Denk (wd at denx.de),
- * TsiChung Liew (Tsi-Chung.Liew at freescale.com),
- * and  Jason McMullan (mcmullan at netapp.com)
- *
- * SPDX-License-Identifier:	GPL-2.0+
- */
-
-#include <common.h>
-#include <malloc.h>
-#include <spi_flash.h>
-
-#include "spi_flash_internal.h"
-
-struct spansion_spi_flash_params {
-	u16 idcode1;
-	u16 idcode2;
-	u16 pages_per_sector;
-	u16 nr_sectors;
-	const char *name;
-};
-
-static const struct spansion_spi_flash_params spansion_spi_flash_table[] = {
-	{
-		.idcode1 = 0x0213,
-		.idcode2 = 0,
-		.pages_per_sector = 256,
-		.nr_sectors = 16,
-		.name = "S25FL008A",
-	},
-	{
-		.idcode1 = 0x0214,
-		.idcode2 = 0,
-		.pages_per_sector = 256,
-		.nr_sectors = 32,
-		.name = "S25FL016A",
-	},
-	{
-		.idcode1 = 0x0215,
-		.idcode2 = 0,
-		.pages_per_sector = 256,
-		.nr_sectors = 64,
-		.name = "S25FL032A",
-	},
-	{
-		.idcode1 = 0x0216,
-		.idcode2 = 0,
-		.pages_per_sector = 256,
-		.nr_sectors = 128,
-		.name = "S25FL064A",
-	},
-	{
-		.idcode1 = 0x2018,
-		.idcode2 = 0x0301,
-		.pages_per_sector = 256,
-		.nr_sectors = 256,
-		.name = "S25FL128P_64K",
-	},
-	{
-		.idcode1 = 0x2018,
-		.idcode2 = 0x0300,
-		.pages_per_sector = 1024,
-		.nr_sectors = 64,
-		.name = "S25FL128P_256K",
-	},
-	{
-		.idcode1 = 0x0215,
-		.idcode2 = 0x4d00,
-		.pages_per_sector = 256,
-		.nr_sectors = 64,
-		.name = "S25FL032P",
-	},
-	{
-		.idcode1 = 0x0216,
-		.idcode2 = 0x4d00,
-		.pages_per_sector = 256,
-		.nr_sectors = 128,
-		.name = "S25FL064P",
-	},
-	{
-		.idcode1 = 0x2018,
-		.idcode2 = 0x4d01,
-		.pages_per_sector = 256,
-		.nr_sectors = 256,
-		.name = "S25FL129P_64K/S25FL128S_64K",
-	},
-	{
-		.idcode1 = 0x0219,
-		.idcode2 = 0x4d01,
-		.pages_per_sector = 256,
-		.nr_sectors = 512,
-		.name = "S25FL256S_64K",
-	},
-	{
-		.idcode1 = 0x0220,
-		.idcode2 = 0x4d01,
-		.pages_per_sector = 256,
-		.nr_sectors = 1024,
-		.name = "S25FL512S_64K",
-	},
-};
-
-struct spi_flash *spi_flash_probe_spansion(struct spi_slave *spi, u8 *idcode)
-{
-	const struct spansion_spi_flash_params *params;
-	struct spi_flash *flash;
-	unsigned int i;
-	unsigned short jedec, ext_jedec;
-
-	jedec = idcode[1] << 8 | idcode[2];
-	ext_jedec = idcode[3] << 8 | idcode[4];
-
-	for (i = 0; i < ARRAY_SIZE(spansion_spi_flash_table); i++) {
-		params = &spansion_spi_flash_table[i];
-		if (params->idcode1 == jedec) {
-			if (params->idcode2 == ext_jedec)
-				break;
-		}
-	}
-
-	if (i == ARRAY_SIZE(spansion_spi_flash_table)) {
-		debug("SF: Unsupported SPANSION ID %04x %04x\n",
-		      jedec, ext_jedec);
-		return NULL;
-	}
-
-	flash = spi_flash_alloc_base(spi, params->name);
-	if (!flash) {
-		debug("SF: Failed to allocate memory\n");
-		return NULL;
-	}
-
-	flash->page_size = 256;
-	flash->sector_size = 256 * params->pages_per_sector;
-	flash->size = flash->sector_size * params->nr_sectors;
-
-	return flash;
-}
diff --git a/drivers/mtd/spi/spi_flash_internal.h b/drivers/mtd/spi/spi_flash_internal.h
index a9d03ee..286082a 100644
--- a/drivers/mtd/spi/spi_flash_internal.h
+++ b/drivers/mtd/spi/spi_flash_internal.h
@@ -127,13 +127,3 @@ int spi_flash_cmd_wait_ready(struct spi_flash *flash, unsigned long timeout);
 
 /* Erase sectors. */
 int spi_flash_cmd_erase(struct spi_flash *flash, u32 offset, size_t len);
-
-/* Manufacturer-specific probe functions */
-struct spi_flash *spi_flash_probe_spansion(struct spi_slave *spi, u8 *idcode);
-struct spi_flash *spi_flash_probe_atmel(struct spi_slave *spi, u8 *idcode);
-struct spi_flash *spi_flash_probe_eon(struct spi_slave *spi, u8 *idcode);
-struct spi_flash *spi_flash_probe_macronix(struct spi_slave *spi, u8 *idcode);
-struct spi_flash *spi_flash_probe_sst(struct spi_slave *spi, u8 *idcode);
-struct spi_flash *spi_flash_probe_stmicro(struct spi_slave *spi, u8 *idcode);
-struct spi_flash *spi_flash_probe_winbond(struct spi_slave *spi, u8 *idcode);
-struct spi_flash *spi_flash_probe_gigadevice(struct spi_slave *spi, u8 *idcode);
diff --git a/drivers/mtd/spi/sst.c b/drivers/mtd/spi/sst.c
deleted file mode 100644
index c9dec3c52..0000000
--- a/drivers/mtd/spi/sst.c
+++ /dev/null
@@ -1,232 +0,0 @@
-/*
- * Driver for SST serial flashes
- *
- * (C) Copyright 2000-2002
- * Wolfgang Denk, DENX Software Engineering, wd at denx.de.
- * Copyright 2008, Network Appliance Inc.
- * Jason McMullan <mcmullan@netapp.com>
- * Copyright (C) 2004-2007 Freescale Semiconductor, Inc.
- * TsiChung Liew (Tsi-Chung.Liew at freescale.com)
- * Copyright (c) 2008-2009 Analog Devices Inc.
- *
- * Licensed under the GPL-2 or later.
- */
-
-#include <common.h>
-#include <malloc.h>
-#include <spi_flash.h>
-
-#include "spi_flash_internal.h"
-
-#define CMD_SST_BP		0x02	/* Byte Program */
-#define CMD_SST_AAI_WP		0xAD	/* Auto Address Incr Word Program */
-
-#define SST_SR_WIP		(1 << 0)	/* Write-in-Progress */
-#define SST_SR_WEL		(1 << 1)	/* Write enable */
-#define SST_SR_BP0		(1 << 2)	/* Block Protection 0 */
-#define SST_SR_BP1		(1 << 3)	/* Block Protection 1 */
-#define SST_SR_BP2		(1 << 4)	/* Block Protection 2 */
-#define SST_SR_AAI		(1 << 6)	/* Addressing mode */
-#define SST_SR_BPL		(1 << 7)	/* BP bits lock */
-
-#define SST_FEAT_WP		(1 << 0)	/* Supports AAI word program */
-#define SST_FEAT_MBP		(1 << 1)	/* Supports multibyte program */
-
-struct sst_spi_flash_params {
-	u8 idcode1;
-	u8 flags;
-	u16 nr_sectors;
-	const char *name;
-};
-
-struct sst_spi_flash {
-	struct spi_flash flash;
-	const struct sst_spi_flash_params *params;
-};
-
-static const struct sst_spi_flash_params sst_spi_flash_table[] = {
-	{
-		.idcode1 = 0x8d,
-		.flags = SST_FEAT_WP,
-		.nr_sectors = 128,
-		.name = "SST25VF040B",
-	},
-	{
-		.idcode1 = 0x8e,
-		.flags = SST_FEAT_WP,
-		.nr_sectors = 256,
-		.name = "SST25VF080B",
-	},
-	{
-		.idcode1 = 0x41,
-		.flags = SST_FEAT_WP,
-		.nr_sectors = 512,
-		.name = "SST25VF016B",
-	},
-	{
-		.idcode1 = 0x4a,
-		.flags = SST_FEAT_WP,
-		.nr_sectors = 1024,
-		.name = "SST25VF032B",
-	},
-	{
-		.idcode1 = 0x4b,
-		.flags = SST_FEAT_MBP,
-		.nr_sectors = 2048,
-		.name = "SST25VF064C",
-	},
-	{
-		.idcode1 = 0x01,
-		.flags = SST_FEAT_WP,
-		.nr_sectors = 16,
-		.name = "SST25WF512",
-	},
-	{
-		.idcode1 = 0x02,
-		.flags = SST_FEAT_WP,
-		.nr_sectors = 32,
-		.name = "SST25WF010",
-	},
-	{
-		.idcode1 = 0x03,
-		.flags = SST_FEAT_WP,
-		.nr_sectors = 64,
-		.name = "SST25WF020",
-	},
-	{
-		.idcode1 = 0x04,
-		.flags = SST_FEAT_WP,
-		.nr_sectors = 128,
-		.name = "SST25WF040",
-	},
-};
-
-static int
-sst_byte_write(struct spi_flash *flash, u32 offset, const void *buf)
-{
-	int ret;
-	u8 cmd[4] = {
-		CMD_SST_BP,
-		offset >> 16,
-		offset >> 8,
-		offset,
-	};
-
-	debug("BP[%02x]: 0x%p => cmd = { 0x%02x 0x%06x }\n",
-	      spi_w8r8(flash->spi, CMD_READ_STATUS), buf, cmd[0], offset);
-
-	ret = spi_flash_cmd_write_enable(flash);
-	if (ret)
-		return ret;
-
-	ret = spi_flash_cmd_write(flash->spi, cmd, sizeof(cmd), buf, 1);
-	if (ret)
-		return ret;
-
-	return spi_flash_cmd_wait_ready(flash, SPI_FLASH_PROG_TIMEOUT);
-}
-
-static int
-sst_write_wp(struct spi_flash *flash, u32 offset, size_t len, const void *buf)
-{
-	size_t actual, cmd_len;
-	int ret;
-	u8 cmd[4];
-
-	ret = spi_claim_bus(flash->spi);
-	if (ret) {
-		debug("SF: Unable to claim SPI bus\n");
-		return ret;
-	}
-
-	/* If the data is not word aligned, write out leading single byte */
-	actual = offset % 2;
-	if (actual) {
-		ret = sst_byte_write(flash, offset, buf);
-		if (ret)
-			goto done;
-	}
-	offset += actual;
-
-	ret = spi_flash_cmd_write_enable(flash);
-	if (ret)
-		goto done;
-
-	cmd_len = 4;
-	cmd[0] = CMD_SST_AAI_WP;
-	cmd[1] = offset >> 16;
-	cmd[2] = offset >> 8;
-	cmd[3] = offset;
-
-	for (; actual < len - 1; actual += 2) {
-		debug("WP[%02x]: 0x%p => cmd = { 0x%02x 0x%06x }\n",
-		      spi_w8r8(flash->spi, CMD_READ_STATUS), buf + actual,
-		      cmd[0], offset);
-
-		ret = spi_flash_cmd_write(flash->spi, cmd, cmd_len,
-					buf + actual, 2);
-		if (ret) {
-			debug("SF: sst word program failed\n");
-			break;
-		}
-
-		ret = spi_flash_cmd_wait_ready(flash, SPI_FLASH_PROG_TIMEOUT);
-		if (ret)
-			break;
-
-		cmd_len = 1;
-		offset += 2;
-	}
-
-	if (!ret)
-		ret = spi_flash_cmd_write_disable(flash);
-
-	/* If there is a single trailing byte, write it out */
-	if (!ret && actual != len)
-		ret = sst_byte_write(flash, offset, buf + actual);
-
- done:
-	debug("SF: sst: program %s %zu bytes @ 0x%zx\n",
-	      ret ? "failure" : "success", len, offset - actual);
-
-	spi_release_bus(flash->spi);
-	return ret;
-}
-
-struct spi_flash *
-spi_flash_probe_sst(struct spi_slave *spi, u8 *idcode)
-{
-	const struct sst_spi_flash_params *params;
-	struct sst_spi_flash *stm;
-	size_t i;
-
-	for (i = 0; i < ARRAY_SIZE(sst_spi_flash_table); ++i) {
-		params = &sst_spi_flash_table[i];
-		if (params->idcode1 == idcode[2])
-			break;
-	}
-
-	if (i == ARRAY_SIZE(sst_spi_flash_table)) {
-		debug("SF: Unsupported SST ID %02x\n", idcode[1]);
-		return NULL;
-	}
-
-	stm = spi_flash_alloc(struct sst_spi_flash, spi, params->name);
-	if (!stm) {
-		debug("SF: Failed to allocate memory\n");
-		return NULL;
-	}
-
-	stm->params = params;
-
-	if (stm->params->flags & SST_FEAT_WP)
-		stm->flash.write = sst_write_wp;
-	stm->flash.page_size = 256;
-	stm->flash.sector_size = 4096;
-	stm->flash.size = stm->flash.sector_size * params->nr_sectors;
-
-	/* Flash powers up read-only, so clear BP# bits */
-	spi_flash_cmd_write_status(&stm->flash, 0);
-
-	return &stm->flash;
-}
diff --git a/drivers/mtd/spi/stmicro.c b/drivers/mtd/spi/stmicro.c
deleted file mode 100644
index c5fa64e..0000000
--- a/drivers/mtd/spi/stmicro.c
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * (C) Copyright 2000-2002
- * Wolfgang Denk, DENX Software Engineering, wd at denx.de.
- *
- * Copyright 2008, Network Appliance Inc.
- * Jason McMullan <mcmullan@netapp.com>
- *
- * Copyright (C) 2004-2007 Freescale Semiconductor, Inc.
- * TsiChung Liew (Tsi-Chung.Liew at freescale.com)
- *
- * SPDX-License-Identifier:	GPL-2.0+
- */
-
-#include <common.h>
-#include <malloc.h>
-#include <spi_flash.h>
-
-#include "spi_flash_internal.h"
-
-/* M25Pxx-specific commands */
-#define CMD_M25PXX_RES	0xab	/* Release from DP, and Read Signature */
-
-struct stmicro_spi_flash_params {
-	u16 id;
-	u16 pages_per_sector;
-	u16 nr_sectors;
-	const char *name;
-};
-
-static const struct stmicro_spi_flash_params stmicro_spi_flash_table[] = {
-	{
-		.id = 0x2011,
-		.pages_per_sector = 128,
-		.nr_sectors = 4,
-		.name = "M25P10",
-	},
-	{
-		.id = 0x2015,
-		.pages_per_sector = 256,
-		.nr_sectors = 32,
-		.name = "M25P16",
-	},
-	{
-		.id = 0x2012,
-		.pages_per_sector = 256,
-		.nr_sectors = 4,
-		.name = "M25P20",
-	},
-	{
-		.id = 0x2016,
-		.pages_per_sector = 256,
-		.nr_sectors = 64,
-		.name = "M25P32",
-	},
-	{
-		.id = 0x2013,
-		.pages_per_sector = 256,
-		.nr_sectors = 8,
-		.name = "M25P40",
-	},
-	{
-		.id = 0x2017,
-		.pages_per_sector = 256,
-		.nr_sectors = 128,
-		.name = "M25P64",
-	},
-	{
-		.id = 0x2014,
-		.pages_per_sector = 256,
-		.nr_sectors = 16,
-		.name = "M25P80",
-	},
-	{
-		.id = 0x2018,
-		.pages_per_sector = 1024,
-		.nr_sectors = 64,
-		.name = "M25P128",
-	},
-	{
-		.id = 0xba16,
-		.pages_per_sector = 256,
-		.nr_sectors = 64,
-		.name = "N25Q32",
-	},
-	{
-		.id = 0xbb16,
-		.pages_per_sector = 256,
-		.nr_sectors = 64,
-		.name = "N25Q32A",
-	},
-	{
-		.id = 0xba17,
-		.pages_per_sector = 256,
-		.nr_sectors = 128,
-		.name = "N25Q064",
-	},
-	{
-		.id = 0xbb17,
-		.pages_per_sector = 256,
-		.nr_sectors = 128,
-		.name = "N25Q64A",
-	},
-	{
-		.id = 0xba18,
-		.pages_per_sector = 256,
-		.nr_sectors = 256,
-		.name = "N25Q128",
-	},
-	{
-		.id = 0xbb18,
-		.pages_per_sector = 256,
-		.nr_sectors = 256,
-		.name = "N25Q128A",
-	},
-	{
-		.id = 0xba19,
-		.pages_per_sector = 256,
-		.nr_sectors = 512,
-		.name = "N25Q256",
-	},
-	{
-		.id = 0xbb19,
-		.pages_per_sector = 256,
-		.nr_sectors = 512,
-		.name = "N25Q256A",
-	},
-	{
-		.id = 0xba20,
-		.pages_per_sector = 256,
-		.nr_sectors = 1024,
-		.name = "N25Q512",
-	},
-	{
-		.id = 0xbb20,
-		.pages_per_sector = 256,
-		.nr_sectors = 1024,
-		.name = "N25Q512A",
-	},
-	{
-		.id = 0xba21,
-		.pages_per_sector = 256,
-		.nr_sectors = 2048,
-		.name = "N25Q1024",
-	},
-	{
-		.id = 0xbb21,
-		.pages_per_sector = 256,
-		.nr_sectors = 2048,
-		.name = "N25Q1024A",
-	},
-};
-
-struct spi_flash *spi_flash_probe_stmicro(struct spi_slave *spi, u8 *idcode)
-{
-	const struct stmicro_spi_flash_params *params;
-	struct spi_flash *flash;
-	unsigned int i;
-	u16 id;
-
-	if (idcode[0] == 0xff) {
-		i = spi_flash_cmd(spi, CMD_M25PXX_RES,
-				  idcode, 4);
-		if (i)
-			return NULL;
-		if ((idcode[3] & 0xf0) == 0x10) {
-			idcode[0] = 0x20;
-			idcode[1] = 0x20;
-			idcode[2] = idcode[3] + 1;
-		} else {
-			return NULL;
-		}
-	}
-
-	id = ((idcode[1] << 8) | idcode[2]);
-
-	for (i = 0; i < ARRAY_SIZE(stmicro_spi_flash_table); i++) {
-		params = &stmicro_spi_flash_table[i];
-		if (params->id == id)
-			break;
-	}
-
-	if (i == ARRAY_SIZE(stmicro_spi_flash_table)) {
-		debug("SF: Unsupported STMicro ID %04x\n", id);
-		return NULL;
-	}
-
-	flash = spi_flash_alloc_base(spi, params->name);
-	if (!flash) {
-		debug("SF: Failed to allocate memory\n");
-		return NULL;
-	}
-
-	flash->page_size = 256;
-	flash->sector_size = 256 * params->pages_per_sector;
-	flash->size = flash->sector_size * params->nr_sectors;
-
-	/* for >= 512MiB flashes, use flag status instead of read_status */
-	if (flash->size >= 0x4000000)
-		flash->poll_cmd = CMD_FLAG_STATUS;
-
-	return flash;
-}
diff --git a/drivers/mtd/spi/winbond.c b/drivers/mtd/spi/winbond.c
deleted file mode 100644
index b31911a..0000000
--- a/drivers/mtd/spi/winbond.c
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright 2008, Network Appliance Inc.
- * Author: Jason McMullan <mcmullan <at> netapp.com>
- * Licensed under the GPL-2 or later.
- */
-
-#include <common.h>
-#include <malloc.h>
-#include <spi_flash.h>
-
-#include "spi_flash_internal.h"
-
-struct winbond_spi_flash_params {
-	uint16_t	id;
-	uint16_t	nr_blocks;
-	const char	*name;
-};
-
-static const struct winbond_spi_flash_params winbond_spi_flash_table[] = {
-	{
-		.id			= 0x2014,
-		.nr_blocks		= 16,
-		.name			= "W25P80",
-	},
-	{
-		.id			= 0x2015,
-		.nr_blocks		= 32,
-		.name			= "W25P16",
-	},
-	{
-		.id			= 0x2016,
-		.nr_blocks		= 64,
-		.name			= "W25P32",
-	},
-	{
-		.id			= 0x3013,
-		.nr_blocks		= 8,
-		.name			= "W25X40",
-	},
-	{
-		.id			= 0x3015,
-		.nr_blocks		= 32,
-		.name			= "W25X16",
-	},
-	{
-		.id			= 0x3016,
-		.nr_blocks		= 64,
-		.name			= "W25X32",
-	},
-	{
-		.id			= 0x3017,
-		.nr_blocks		= 128,
-		.name			= "W25X64",
-	},
-	{
-		.id			= 0x4014,
-		.nr_blocks		= 16,
-		.name			= "W25Q80BL/W25Q80BV",
-	},
-	{
-		.id			= 0x4015,
-		.nr_blocks		= 32,
-		.name			= "W25Q16CL/W25Q16DV",
-	},
-	{
-		.id			= 0x4016,
-		.nr_blocks		= 64,
-		.name			= "W25Q32BV/W25Q32FV_SPI",
-	},
-	{
-		.id			= 0x4017,
-		.nr_blocks		= 128,
-		.name			= "W25Q64CV/W25Q64FV_SPI",
-	},
-	{
-		.id			= 0x4018,
-		.nr_blocks		= 256,
-		.name			= "W25Q128BV/W25Q128FV_SPI",
-	},
-	{
-		.id			= 0x4019,
-		.nr_blocks		= 512,
-		.name			= "W25Q256",
-	},
-	{
-		.id			= 0x5014,
-		.nr_blocks		= 16,
-		.name			= "W25Q80BW",
-	},
-	{
-		.id			= 0x6015,
-		.nr_blocks		= 32,
-		.name			= "W25Q16DW",
-	},
-	{
-		.id			= 0x6016,
-		.nr_blocks		= 64,
-		.name			= "W25Q32DW/W25Q32FV_QPI",
-	},
-	{
-		.id			= 0x6017,
-		.nr_blocks		= 128,
-		.name			= "W25Q64DW/W25Q64FV_QPI",
-	},
-	{
-		.id			= 0x6018,
-		.nr_blocks		= 256,
-		.name			= "W25Q128FW/W25Q128FV_QPI",
-	},
-};
-
-struct spi_flash *spi_flash_probe_winbond(struct spi_slave *spi, u8 *idcode)
-{
-	const struct winbond_spi_flash_params *params;
-	struct spi_flash *flash;
-	unsigned int i;
-
-	for (i = 0; i < ARRAY_SIZE(winbond_spi_flash_table); i++) {
-		params = &winbond_spi_flash_table[i];
-		if (params->id == ((idcode[1] << 8) | idcode[2]))
-			break;
-	}
-
-	if (i == ARRAY_SIZE(winbond_spi_flash_table)) {
-		debug("SF: Unsupported Winbond ID %02x%02x\n",
-		      idcode[1], idcode[2]);
-		return NULL;
-	}
-
-	flash = spi_flash_alloc_base(spi, params->name);
-	if (!flash) {
-		debug("SF: Failed to allocate memory\n");
-		return NULL;
-	}
-
-	flash->page_size = 256;
-	flash->sector_size = (idcode[1] == 0x20) ? 65536 : 4096;
-	flash->size = 4096 * 16 * params->nr_blocks;
-
-	return flash;
-}
-- 
1.8.3

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [U-Boot] [RESEND PATCH v2 20/20] sf: probe: Add support for EN25Q64
       [not found] <1375805851-32163-1-git-send-email-jaganna@xilinx.com>
                   ` (18 preceding siblings ...)
  2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 19/20] sf: Remove unneeded flash drivers files Jagannadha Sutradharudu Teki
@ 2013-08-06 16:17 ` Jagannadha Sutradharudu Teki
  19 siblings, 0 replies; 23+ messages in thread
From: Jagannadha Sutradharudu Teki @ 2013-08-06 16:17 UTC (permalink / raw)
  To: u-boot

Add support for EON EN25Q64 SPI flash.

Signed-off-by: Jagannadha Sutradharudu Teki <jaganna@xilinx.com>
---
Changes for v2:
	- none

 drivers/mtd/spi/spi_flash_probe.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/mtd/spi/spi_flash_probe.c b/drivers/mtd/spi/spi_flash_probe.c
index 86cb881..de4ba0d 100644
--- a/drivers/mtd/spi/spi_flash_probe.c
+++ b/drivers/mtd/spi/spi_flash_probe.c
@@ -49,6 +49,7 @@ static const struct spi_flash_params spi_flash_params_table[] = {
 #endif
 #ifdef CONFIG_SPI_FLASH_EON		/* EON */
 	{"EN25Q32B",	   0x1c3016, 0x0,	64 * 1024,    64,	             0},
+	{"EN25Q64",	   0x1c3017, 0x0,	64 * 1024,   128,	       SECT_4K},
 	{"EN25Q128B",	   0x1c3018, 0x0,       64 * 1024,   256,	             0},
 #endif
 #ifdef CONFIG_SPI_FLASH_GIGADEVICE	/* GIGADEVICE */
-- 
1.8.3

^ permalink raw reply related	[flat|nested] 23+ messages in thread

* [U-Boot] [RESEND PATCH v2 08/20] sf: probe: Add support for S25FL* flash parts
  2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 08/20] sf: probe: Add support for S25FL* " Jagannadha Sutradharudu Teki
@ 2013-08-06 19:49   ` Wolfgang Denk
  2013-08-06 19:54     ` Jagan Teki
       [not found]     ` <64c2a6cb-98f6-4cde-a615-ecd37a96b6ea@DB8EHSMHS012.ehs.local>
  0 siblings, 2 replies; 23+ messages in thread
From: Wolfgang Denk @ 2013-08-06 19:49 UTC (permalink / raw)
  To: u-boot

Dear Jagannadha Sutradharudu Teki,

In message <90b1d9f1-4c63-43c6-989f-55a6571689c7@TX2EHSMHS011.ehs.local> you wrote:
> Added S25FL* parts are which are avilable in spi_flash_probe_legacy.c.
> 
> Updated the sector_size attributes as per the flash parts.
> Looks fine for with this sector_size for computing the size
> of flash.
> 
> Signed-off-by: Jagannadha Sutradharudu Teki <jaganna@xilinx.com>
> ---
> Changes for v2:
> 	- Enable CONFIG_SPI_FLASH_SPANSION

Checkpatch reports:

WARNING: quoted string split across lines
#194: FILE: drivers/mtd/spi/spi_flash_probe.c:155:
+               printf("SF: Unsupported flash ID: manuf %02x, jedec %04x "
+                      "ext_jedec %04x\n", idcode[0], jedec, ext_jedec);


Please fix!

Thanks.

Wolfgang Denk

-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
Old programmers never die, they just become managers.

^ permalink raw reply	[flat|nested] 23+ messages in thread

* [U-Boot] [RESEND PATCH v2 08/20] sf: probe: Add support for S25FL* flash parts
  2013-08-06 19:49   ` Wolfgang Denk
@ 2013-08-06 19:54     ` Jagan Teki
       [not found]     ` <64c2a6cb-98f6-4cde-a615-ecd37a96b6ea@DB8EHSMHS012.ehs.local>
  1 sibling, 0 replies; 23+ messages in thread
From: Jagan Teki @ 2013-08-06 19:54 UTC (permalink / raw)
  To: u-boot

Hi Wolfgang Denk,

On Wed, Aug 7, 2013 at 1:19 AM, Wolfgang Denk <wd@denx.de> wrote:
> Dear Jagannadha Sutradharudu Teki,
>
> In message <90b1d9f1-4c63-43c6-989f-55a6571689c7@TX2EHSMHS011.ehs.local> you wrote:
>> Added S25FL* parts are which are avilable in spi_flash_probe_legacy.c.
>>
>> Updated the sector_size attributes as per the flash parts.
>> Looks fine for with this sector_size for computing the size
>> of flash.
>>
>> Signed-off-by: Jagannadha Sutradharudu Teki <jaganna@xilinx.com>
>> ---
>> Changes for v2:
>>       - Enable CONFIG_SPI_FLASH_SPANSION
>
> Checkpatch reports:
>
> WARNING: quoted string split across lines
> #194: FILE: drivers/mtd/spi/spi_flash_probe.c:155:
> +               printf("SF: Unsupported flash ID: manuf %02x, jedec %04x "
> +                      "ext_jedec %04x\n", idcode[0], jedec, ext_jedec);
>

Yes I knew this.
Any better way we handle " quoted string split across lines" w.r.t recent codes.
Request for suggestion.

--
Thanks,
Jagan.

^ permalink raw reply	[flat|nested] 23+ messages in thread

* [U-Boot] [RESEND PATCH v2 08/20] sf: probe: Add support for S25FL* flash parts
       [not found]     ` <64c2a6cb-98f6-4cde-a615-ecd37a96b6ea@DB8EHSMHS012.ehs.local>
@ 2013-08-06 20:05       ` Wolfgang Denk
  0 siblings, 0 replies; 23+ messages in thread
From: Wolfgang Denk @ 2013-08-06 20:05 UTC (permalink / raw)
  To: u-boot

Dear Jagan,

In message <64c2a6cb-98f6-4cde-a615-ecd37a96b6ea@DB8EHSMHS012.ehs.local> you wrote:
>
> > Checkpatch reports:
> >
> > WARNING: quoted string split across lines
> > #194: FILE: drivers/mtd/spi/spi_flash_probe.c:155:
> > +               printf("SF: Unsupported flash ID: manuf %02x, jedec %04x "
> > +                      "ext_jedec %04x\n", idcode[0], jedec, ext_jedec);
> 
> Yes I knew this.
> Any better way we handle " quoted string split across lines" w.r.t recent codes.
> Request for suggestion.

Well, do not split the string.

Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
Nobody goes to that restaurant anymore. It's too crowded.

^ permalink raw reply	[flat|nested] 23+ messages in thread

end of thread, other threads:[~2013-08-06 20:05 UTC | newest]

Thread overview: 23+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <1375805851-32163-1-git-send-email-jaganna@xilinx.com>
2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 01/20] sf: Divide spi_flash into multiple parts Jagannadha Sutradharudu Teki
2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 02/20] sf: probe: Add new spi_flash_probe support Jagannadha Sutradharudu Teki
2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 03/20] sf: probe: Add support for M25P* flash parts Jagannadha Sutradharudu Teki
2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 04/20] sf: probe: Add support for EN25Q* " Jagannadha Sutradharudu Teki
2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 05/20] sf: probe: Add support for GD25* " Jagannadha Sutradharudu Teki
2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 06/20] sf: probe: Add support for MX25L* " Jagannadha Sutradharudu Teki
2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 07/20] sf: probe: Add support for W25* " Jagannadha Sutradharudu Teki
2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 08/20] sf: probe: Add support for S25FL* " Jagannadha Sutradharudu Teki
2013-08-06 19:49   ` Wolfgang Denk
2013-08-06 19:54     ` Jagan Teki
     [not found]     ` <64c2a6cb-98f6-4cde-a615-ecd37a96b6ea@DB8EHSMHS012.ehs.local>
2013-08-06 20:05       ` Wolfgang Denk
2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 09/20] sf: probe: Add support for SST25* " Jagannadha Sutradharudu Teki
2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 10/20] sf: probe: Add support for AT45DB* " Jagannadha Sutradharudu Teki
2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 11/20] sf: probe: Give proper spacing on flash table params Jagannadha Sutradharudu Teki
2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 12/20] sf: probe: Add support for SST_WP Jagannadha Sutradharudu Teki
2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 13/20] sf: probe: Add support to clear flash BP# bits Jagannadha Sutradharudu Teki
2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 14/20] sf: probe: Add support for erase sector selection flag Jagannadha Sutradharudu Teki
2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 15/20] sf: probe: Add support for flag status polling Jagannadha Sutradharudu Teki
2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 16/20] sf: probe: Move BAR config to spi_flash_validate_ids Jagannadha Sutradharudu Teki
2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 17/20] sf: Add proper comment style on spi_flash structure Jagannadha Sutradharudu Teki
2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 18/20] sf: ramtron: Add support for separate flash driver Jagannadha Sutradharudu Teki
2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 19/20] sf: Remove unneeded flash drivers files Jagannadha Sutradharudu Teki
2013-08-06 16:17 ` [U-Boot] [RESEND PATCH v2 20/20] sf: probe: Add support for EN25Q64 Jagannadha Sutradharudu Teki

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox