2 * (C) Copyright 2000-2002
3 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
5 * Copyright 2008, Network Appliance Inc.
6 * Jason McMullan <mcmullan@netapp.com>
8 * Copyright (C) 2004-2007 Freescale Semiconductor, Inc.
9 * TsiChung Liew (Tsi-Chung.Liew@freescale.com)
11 * SPDX-License-Identifier: GPL-2.0+
16 #include <spi_flash.h>
18 #include "spi_flash_internal.h"
20 /* M25Pxx-specific commands */
21 #define CMD_M25PXX_RES 0xab /* Release from DP, and Read Signature */
23 struct stmicro_spi_flash_params {
30 static const struct stmicro_spi_flash_params stmicro_spi_flash_table[] = {
33 .pages_per_sector = 128,
39 .pages_per_sector = 256,
45 .pages_per_sector = 256,
51 .pages_per_sector = 256,
57 .pages_per_sector = 256,
63 .pages_per_sector = 256,
69 .pages_per_sector = 256,
75 .pages_per_sector = 1024,
81 .pages_per_sector = 256,
87 .pages_per_sector = 256,
93 .pages_per_sector = 256,
99 .pages_per_sector = 256,
105 .pages_per_sector = 256,
111 .pages_per_sector = 256,
117 .pages_per_sector = 256,
123 .pages_per_sector = 256,
129 .pages_per_sector = 256,
135 .pages_per_sector = 256,
141 .pages_per_sector = 256,
147 .pages_per_sector = 256,
153 struct spi_flash *spi_flash_probe_stmicro(struct spi_slave *spi, u8 *idcode)
155 const struct stmicro_spi_flash_params *params;
156 struct spi_flash *flash;
160 if (idcode[0] == 0xff) {
161 i = spi_flash_cmd(spi, CMD_M25PXX_RES,
165 if ((idcode[3] & 0xf0) == 0x10) {
168 idcode[2] = idcode[3] + 1;
174 id = ((idcode[1] << 8) | idcode[2]);
176 for (i = 0; i < ARRAY_SIZE(stmicro_spi_flash_table); i++) {
177 params = &stmicro_spi_flash_table[i];
178 if (params->id == id)
182 if (i == ARRAY_SIZE(stmicro_spi_flash_table)) {
183 debug("SF: Unsupported STMicro ID %04x\n", id);
187 flash = spi_flash_alloc_base(spi, params->name);
189 debug("SF: Failed to allocate memory\n");
193 flash->page_size = 256;
194 flash->sector_size = 256 * params->pages_per_sector;
195 flash->size = flash->sector_size * params->nr_sectors;
197 /* for >= 512MiB flashes, use flag status instead of read_status */
198 if (flash->size >= 0x4000000)
199 flash->poll_cmd = CMD_FLAG_STATUS;