]> git.ipfire.org Git - people/ms/u-boot.git/blame - drivers/mtd/spi/spansion.c
Add GPL-2.0+ SPDX-License-Identifier to source files
[people/ms/u-boot.git] / drivers / mtd / spi / spansion.c
CommitLineData
6805e4bf
MH
1/*
2 * Copyright (C) 2009 Freescale Semiconductor, Inc.
3 *
4 * Author: Mingkai Hu (Mingkai.hu@freescale.com)
5 * Based on stmicro.c by Wolfgang Denk (wd@denx.de),
6 * TsiChung Liew (Tsi-Chung.Liew@freescale.com),
7 * and Jason McMullan (mcmullan@netapp.com)
8 *
1a459660 9 * SPDX-License-Identifier: GPL-2.0+
6805e4bf
MH
10 */
11
12#include <common.h>
13#include <malloc.h>
14#include <spi_flash.h>
15
16#include "spi_flash_internal.h"
17
6805e4bf
MH
18struct spansion_spi_flash_params {
19 u16 idcode1;
20 u16 idcode2;
6805e4bf
MH
21 u16 pages_per_sector;
22 u16 nr_sectors;
23 const char *name;
24};
25
6805e4bf
MH
26static const struct spansion_spi_flash_params spansion_spi_flash_table[] = {
27 {
7d72b80a 28 .idcode1 = 0x0213,
6805e4bf 29 .idcode2 = 0,
6805e4bf
MH
30 .pages_per_sector = 256,
31 .nr_sectors = 16,
32 .name = "S25FL008A",
33 },
34 {
7d72b80a 35 .idcode1 = 0x0214,
6805e4bf 36 .idcode2 = 0,
6805e4bf
MH
37 .pages_per_sector = 256,
38 .nr_sectors = 32,
39 .name = "S25FL016A",
40 },
41 {
7d72b80a 42 .idcode1 = 0x0215,
6805e4bf 43 .idcode2 = 0,
6805e4bf
MH
44 .pages_per_sector = 256,
45 .nr_sectors = 64,
46 .name = "S25FL032A",
47 },
48 {
7d72b80a 49 .idcode1 = 0x0216,
6805e4bf 50 .idcode2 = 0,
6805e4bf
MH
51 .pages_per_sector = 256,
52 .nr_sectors = 128,
53 .name = "S25FL064A",
54 },
55 {
7d72b80a
MF
56 .idcode1 = 0x2018,
57 .idcode2 = 0x0301,
6805e4bf
MH
58 .pages_per_sector = 256,
59 .nr_sectors = 256,
60 .name = "S25FL128P_64K",
61 },
62 {
7d72b80a
MF
63 .idcode1 = 0x2018,
64 .idcode2 = 0x0300,
6805e4bf
MH
65 .pages_per_sector = 1024,
66 .nr_sectors = 64,
67 .name = "S25FL128P_256K",
68 },
ff0dc2c4 69 {
7d72b80a
MF
70 .idcode1 = 0x0215,
71 .idcode2 = 0x4d00,
ff0dc2c4
DJ
72 .pages_per_sector = 256,
73 .nr_sectors = 64,
74 .name = "S25FL032P",
75 },
e90f7bde
MV
76 {
77 .idcode1 = 0x0216,
78 .idcode2 = 0x4d00,
79 .pages_per_sector = 256,
80 .nr_sectors = 128,
81 .name = "S25FL064P",
82 },
9445ce08 83 {
7d72b80a
MF
84 .idcode1 = 0x2018,
85 .idcode2 = 0x4d01,
9445ce08
SX
86 .pages_per_sector = 256,
87 .nr_sectors = 256,
6fd10002 88 .name = "S25FL129P_64K/S25FL128S_64K",
9445ce08 89 },
4a4cb4e1 90 {
4e994c16 91 .idcode1 = 0x0219,
4a4cb4e1
MS
92 .idcode2 = 0x4d01,
93 .pages_per_sector = 256,
94 .nr_sectors = 512,
59120ca3 95 .name = "S25FL256S_64K",
4a4cb4e1 96 },
76e98d48
JT
97 {
98 .idcode1 = 0x0220,
99 .idcode2 = 0x4d01,
100 .pages_per_sector = 256,
101 .nr_sectors = 1024,
102 .name = "S25FL512S_64K",
103 },
6805e4bf
MH
104};
105
6805e4bf
MH
106struct spi_flash *spi_flash_probe_spansion(struct spi_slave *spi, u8 *idcode)
107{
108 const struct spansion_spi_flash_params *params;
b06afa75 109 struct spi_flash *flash;
6805e4bf
MH
110 unsigned int i;
111 unsigned short jedec, ext_jedec;
6805e4bf 112
0dcdbb17
MF
113 jedec = idcode[1] << 8 | idcode[2];
114 ext_jedec = idcode[3] << 8 | idcode[4];
6805e4bf
MH
115
116 for (i = 0; i < ARRAY_SIZE(spansion_spi_flash_table); i++) {
117 params = &spansion_spi_flash_table[i];
118 if (params->idcode1 == jedec) {
119 if (params->idcode2 == ext_jedec)
120 break;
121 }
122 }
123
124 if (i == ARRAY_SIZE(spansion_spi_flash_table)) {
125 debug("SF: Unsupported SPANSION ID %04x %04x\n", jedec, ext_jedec);
126 return NULL;
127 }
128
c0f87dd4 129 flash = spi_flash_alloc_base(spi, params->name);
b06afa75 130 if (!flash) {
6805e4bf
MH
131 debug("SF: Failed to allocate memory\n");
132 return NULL;
133 }
134
a4ed3b65
MF
135 flash->page_size = 256;
136 flash->sector_size = 256 * params->pages_per_sector;
b06afa75 137 flash->size = flash->sector_size * params->nr_sectors;
6805e4bf 138
b06afa75 139 return flash;
6805e4bf 140}