diff options
| -rw-r--r-- | drivers/mtd/spi/Makefile | 8 | ||||
| -rw-r--r-- | drivers/mtd/spi/atmel.c | 544 | ||||
| -rw-r--r-- | drivers/mtd/spi/eon.c | 60 | ||||
| -rw-r--r-- | drivers/mtd/spi/gigadevice.c | 65 | ||||
| -rw-r--r-- | drivers/mtd/spi/macronix.c | 98 | ||||
| -rw-r--r-- | drivers/mtd/spi/spansion.c | 141 | ||||
| -rw-r--r-- | drivers/mtd/spi/spi_flash_internal.h | 11 | ||||
| -rw-r--r-- | drivers/mtd/spi/sst.c | 238 | ||||
| -rw-r--r-- | drivers/mtd/spi/stmicro.c | 202 | ||||
| -rw-r--r-- | drivers/mtd/spi/winbond.c | 141 | 
10 files changed, 0 insertions, 1508 deletions
| diff --git a/drivers/mtd/spi/Makefile b/drivers/mtd/spi/Makefile index 2605e57e0..56781345b 100644 --- a/drivers/mtd/spi/Makefile +++ b/drivers/mtd/spi/Makefile @@ -18,14 +18,6 @@ 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_M95XXX) += eeprom_m95xxx.o diff --git a/drivers/mtd/spi/atmel.c b/drivers/mtd/spi/atmel.c deleted file mode 100644 index f34df43f5..000000000 --- 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 25cfc1252..000000000 --- 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 b42581a70..000000000 --- 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 70435eb5a..000000000 --- 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@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 = ¯onix_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/spansion.c b/drivers/mtd/spi/spansion.c deleted file mode 100644 index fa7ac8c93..000000000 --- a/drivers/mtd/spi/spansion.c +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright (C) 2009 Freescale Semiconductor, Inc. - * - * Author: Mingkai Hu (Mingkai.hu@freescale.com) - * Based on stmicro.c by Wolfgang Denk (wd@denx.de), - * TsiChung Liew (Tsi-Chung.Liew@freescale.com), - * and  Jason McMullan (mcmullan@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 61de2378f..86966f61e 100644 --- a/drivers/mtd/spi/spi_flash_internal.h +++ b/drivers/mtd/spi/spi_flash_internal.h @@ -124,14 +124,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_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/sst.c b/drivers/mtd/spi/sst.c deleted file mode 100644 index 256867c84..000000000 --- a/drivers/mtd/spi/sst.c +++ /dev/null @@ -1,238 +0,0 @@ -/* - * Driver for SST serial flashes - * - * (C) Copyright 2000-2002 - * Wolfgang Denk, DENX Software Engineering, wd@denx.de. - * Copyright 2008, Network Appliance Inc. - * Jason McMullan <mcmullan@netapp.com> - * Copyright (C) 2004-2007 Freescale Semiconductor, Inc. - * TsiChung Liew (Tsi-Chung.Liew@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", -	}, -	{ -		.idcode1 = 0x05, -		.flags = SST_FEAT_WP, -		.nr_sectors = 256, -		.name = "SST25WF080", -	}, -}; - -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 c5fa64e37..000000000 --- a/drivers/mtd/spi/stmicro.c +++ /dev/null @@ -1,202 +0,0 @@ -/* - * (C) Copyright 2000-2002 - * Wolfgang Denk, DENX Software Engineering, wd@denx.de. - * - * Copyright 2008, Network Appliance Inc. - * Jason McMullan <mcmullan@netapp.com> - * - * Copyright (C) 2004-2007 Freescale Semiconductor, Inc. - * TsiChung Liew (Tsi-Chung.Liew@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 b31911a40..000000000 --- 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; -} |