]> git.ipfire.org Git - people/ms/u-boot.git/blame - drivers/mtd/spi/stmicro.c
sf: Fix code cleanups
[people/ms/u-boot.git] / drivers / mtd / spi / stmicro.c
CommitLineData
7b7a869a
TL
1/*
2 * (C) Copyright 2000-2002
3 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
4 *
5 * Copyright 2008, Network Appliance Inc.
6 * Jason McMullan <mcmullan@netapp.com>
7 *
8 * Copyright (C) 2004-2007 Freescale Semiconductor, Inc.
9 * TsiChung Liew (Tsi-Chung.Liew@freescale.com)
10 *
5928b9a8 11 * SPDX-License-Identifier: GPL-2.0+
7b7a869a
TL
12 */
13
14#include <common.h>
15#include <malloc.h>
16#include <spi_flash.h>
17
18#include "spi_flash_internal.h"
19
20/* M25Pxx-specific commands */
d0be616f 21#define CMD_M25PXX_RES 0xab /* Release from DP, and Read Signature */
7b7a869a 22
7b7a869a 23struct stmicro_spi_flash_params {
63ff6a66 24 u16 id;
7b7a869a
TL
25 u16 pages_per_sector;
26 u16 nr_sectors;
27 const char *name;
28};
29
7b7a869a 30static const struct stmicro_spi_flash_params stmicro_spi_flash_table[] = {
12c2e3bb 31 {
63ff6a66 32 .id = 0x2011,
12c2e3bb
TC
33 .pages_per_sector = 128,
34 .nr_sectors = 4,
35 .name = "M25P10",
36 },
7b7a869a 37 {
63ff6a66 38 .id = 0x2015,
7b7a869a
TL
39 .pages_per_sector = 256,
40 .nr_sectors = 32,
41 .name = "M25P16",
42 },
43 {
63ff6a66 44 .id = 0x2012,
7b7a869a
TL
45 .pages_per_sector = 256,
46 .nr_sectors = 4,
47 .name = "M25P20",
48 },
49 {
63ff6a66 50 .id = 0x2016,
7b7a869a
TL
51 .pages_per_sector = 256,
52 .nr_sectors = 64,
53 .name = "M25P32",
54 },
55 {
63ff6a66 56 .id = 0x2013,
7b7a869a
TL
57 .pages_per_sector = 256,
58 .nr_sectors = 8,
59 .name = "M25P40",
60 },
61 {
63ff6a66 62 .id = 0x2017,
7b7a869a
TL
63 .pages_per_sector = 256,
64 .nr_sectors = 128,
65 .name = "M25P64",
66 },
67 {
63ff6a66 68 .id = 0x2014,
7b7a869a
TL
69 .pages_per_sector = 256,
70 .nr_sectors = 16,
71 .name = "M25P80",
72 },
73 {
63ff6a66 74 .id = 0x2018,
7b7a869a
TL
75 .pages_per_sector = 1024,
76 .nr_sectors = 64,
77 .name = "M25P128",
78 },
c75c9212
JT
79 {
80 .id = 0xba16,
81 .pages_per_sector = 256,
82 .nr_sectors = 64,
83 .name = "N25Q32",
84 },
b1431dac
JT
85 {
86 .id = 0xbb16,
87 .pages_per_sector = 256,
88 .nr_sectors = 64,
89 .name = "N25Q32A",
90 },
3981d02e
JT
91 {
92 .id = 0xba17,
93 .pages_per_sector = 256,
94 .nr_sectors = 128,
95 .name = "N25Q064",
96 },
f785fcb6
JT
97 {
98 .id = 0xbb17,
99 .pages_per_sector = 256,
100 .nr_sectors = 128,
101 .name = "N25Q64A",
102 },
6ad6c6dc
SL
103 {
104 .id = 0xba18,
105 .pages_per_sector = 256,
106 .nr_sectors = 256,
107 .name = "N25Q128",
108 },
d945ce97
MS
109 {
110 .id = 0xbb18,
111 .pages_per_sector = 256,
112 .nr_sectors = 256,
113 .name = "N25Q128A",
114 },
b54d1f26 115 {
63ff6a66 116 .id = 0xba19,
b54d1f26
JC
117 .pages_per_sector = 256,
118 .nr_sectors = 512,
119 .name = "N25Q256",
120 },
d62ef561
JT
121 {
122 .id = 0xbb19,
123 .pages_per_sector = 256,
124 .nr_sectors = 512,
125 .name = "N25Q256A",
126 },
0569f3b9
JT
127 {
128 .id = 0xba20,
129 .pages_per_sector = 256,
130 .nr_sectors = 1024,
131 .name = "N25Q512",
132 },
fd60c0ac
JT
133 {
134 .id = 0xbb20,
135 .pages_per_sector = 256,
136 .nr_sectors = 1024,
137 .name = "N25Q512A",
138 },
221cb084
JT
139 {
140 .id = 0xba21,
141 .pages_per_sector = 256,
142 .nr_sectors = 2048,
143 .name = "N25Q1024",
144 },
4e290431
JT
145 {
146 .id = 0xbb21,
147 .pages_per_sector = 256,
148 .nr_sectors = 2048,
149 .name = "N25Q1024A",
150 },
7b7a869a
TL
151};
152
d0be616f 153struct spi_flash *spi_flash_probe_stmicro(struct spi_slave *spi, u8 *idcode)
7b7a869a
TL
154{
155 const struct stmicro_spi_flash_params *params;
b06afa75 156 struct spi_flash *flash;
7b7a869a 157 unsigned int i;
63ff6a66 158 u16 id;
7b7a869a 159
12c2e3bb
TC
160 if (idcode[0] == 0xff) {
161 i = spi_flash_cmd(spi, CMD_M25PXX_RES,
162 idcode, 4);
163 if (i)
164 return NULL;
165 if ((idcode[3] & 0xf0) == 0x10) {
166 idcode[0] = 0x20;
167 idcode[1] = 0x20;
168 idcode[2] = idcode[3] + 1;
5928b9a8 169 } else {
12c2e3bb 170 return NULL;
5928b9a8 171 }
12c2e3bb
TC
172 }
173
63ff6a66
SL
174 id = ((idcode[1] << 8) | idcode[2]);
175
7b7a869a
TL
176 for (i = 0; i < ARRAY_SIZE(stmicro_spi_flash_table); i++) {
177 params = &stmicro_spi_flash_table[i];
d0be616f 178 if (params->id == id)
7b7a869a 179 break;
7b7a869a
TL
180 }
181
182 if (i == ARRAY_SIZE(stmicro_spi_flash_table)) {
63ff6a66 183 debug("SF: Unsupported STMicro ID %04x\n", id);
7b7a869a
TL
184 return NULL;
185 }
186
c0f87dd4 187 flash = spi_flash_alloc_base(spi, params->name);
b06afa75 188 if (!flash) {
7b7a869a
TL
189 debug("SF: Failed to allocate memory\n");
190 return NULL;
191 }
192
a4ed3b65
MF
193 flash->page_size = 256;
194 flash->sector_size = 256 * params->pages_per_sector;
b06afa75 195 flash->size = flash->sector_size * params->nr_sectors;
7b7a869a 196
615a1561
JT
197 /* for >= 512MiB flashes, use flag status instead of read_status */
198 if (flash->size >= 0x4000000)
199 flash->poll_cmd = CMD_FLAG_STATUS;
200
b06afa75 201 return flash;
7b7a869a 202}