1
2
3
4
5
6
7
8
9#ifndef _SPI_FLASH_H_
10#define _SPI_FLASH_H_
11
12#include <linux/types.h>
13#include <linux/mtd/spi-nor.h>
14
15struct udevice;
16
17
18#ifndef CONFIG_ENV_SPI_BUS
19# define CONFIG_ENV_SPI_BUS CONFIG_SF_DEFAULT_BUS
20#endif
21#ifndef CONFIG_ENV_SPI_CS
22# define CONFIG_ENV_SPI_CS CONFIG_SF_DEFAULT_CS
23#endif
24#ifndef CONFIG_ENV_SPI_MAX_HZ
25# define CONFIG_ENV_SPI_MAX_HZ CONFIG_SF_DEFAULT_SPEED
26#endif
27#ifndef CONFIG_ENV_SPI_MODE
28# define CONFIG_ENV_SPI_MODE CONFIG_SF_DEFAULT_MODE
29#endif
30
31struct spi_slave;
32
33struct dm_spi_flash_ops {
34 int (*read)(struct udevice *dev, u32 offset, size_t len, void *buf);
35 int (*write)(struct udevice *dev, u32 offset, size_t len,
36 const void *buf);
37 int (*erase)(struct udevice *dev, u32 offset, size_t len);
38
39
40
41
42
43
44
45
46
47
48
49
50 int (*get_sw_write_prot)(struct udevice *dev);
51};
52
53
54#define sf_get_ops(dev) ((struct dm_spi_flash_ops *)(dev)->driver->ops)
55
56#if CONFIG_IS_ENABLED(DM_SPI_FLASH)
57
58
59
60
61
62
63
64
65
66int spi_flash_read_dm(struct udevice *dev, u32 offset, size_t len, void *buf);
67
68
69
70
71
72
73
74
75
76
77int spi_flash_write_dm(struct udevice *dev, u32 offset, size_t len,
78 const void *buf);
79
80
81
82
83
84
85
86
87
88
89
90int spi_flash_erase_dm(struct udevice *dev, u32 offset, size_t len);
91
92
93
94
95
96
97
98
99
100
101
102
103
104int spl_flash_get_sw_write_prot(struct udevice *dev);
105
106
107
108
109
110
111
112
113
114
115
116int spi_flash_std_probe(struct udevice *dev);
117
118int spi_flash_probe_bus_cs(unsigned int busnum, unsigned int cs,
119 unsigned int max_hz, unsigned int spi_mode,
120 struct udevice **devp);
121
122
123struct spi_flash *spi_flash_probe(unsigned int bus, unsigned int cs,
124 unsigned int max_hz, unsigned int spi_mode);
125
126
127static inline void spi_flash_free(struct spi_flash *flash)
128{
129}
130
131static inline int spi_flash_read(struct spi_flash *flash, u32 offset,
132 size_t len, void *buf)
133{
134 return spi_flash_read_dm(flash->dev, offset, len, buf);
135}
136
137static inline int spi_flash_write(struct spi_flash *flash, u32 offset,
138 size_t len, const void *buf)
139{
140 return spi_flash_write_dm(flash->dev, offset, len, buf);
141}
142
143static inline int spi_flash_erase(struct spi_flash *flash, u32 offset,
144 size_t len)
145{
146 return spi_flash_erase_dm(flash->dev, offset, len);
147}
148
149struct sandbox_state;
150
151int sandbox_sf_bind_emul(struct sandbox_state *state, int busnum, int cs,
152 struct udevice *bus, ofnode node, const char *spec);
153
154void sandbox_sf_unbind_emul(struct sandbox_state *state, int busnum, int cs);
155
156#else
157struct spi_flash *spi_flash_probe(unsigned int bus, unsigned int cs,
158 unsigned int max_hz, unsigned int spi_mode);
159
160void spi_flash_free(struct spi_flash *flash);
161
162static inline int spi_flash_read(struct spi_flash *flash, u32 offset,
163 size_t len, void *buf)
164{
165 struct mtd_info *mtd = &flash->mtd;
166 size_t retlen;
167
168 if (!len)
169 return 0;
170
171 return mtd->_read(mtd, offset, len, &retlen, buf);
172}
173
174static inline int spi_flash_write(struct spi_flash *flash, u32 offset,
175 size_t len, const void *buf)
176{
177 struct mtd_info *mtd = &flash->mtd;
178 size_t retlen;
179
180 if (!len)
181 return 0;
182
183 return mtd->_write(mtd, offset, len, &retlen, buf);
184}
185
186static inline int spi_flash_erase(struct spi_flash *flash, u32 offset,
187 size_t len)
188{
189 struct mtd_info *mtd = &flash->mtd;
190 struct erase_info instr;
191
192 if (offset % mtd->erasesize || len % mtd->erasesize) {
193 printf("SF: Erase offset/length not multiple of erase size\n");
194 return -EINVAL;
195 }
196
197 if (!len)
198 return 0;
199
200 memset(&instr, 0, sizeof(instr));
201 instr.addr = offset;
202 instr.len = len;
203
204 return mtd->_erase(mtd, &instr);
205}
206#endif
207
208static inline int spi_flash_protect(struct spi_flash *flash, u32 ofs, u32 len,
209 bool prot)
210{
211 if (!flash->flash_lock || !flash->flash_unlock)
212 return -EOPNOTSUPP;
213
214 if (prot)
215 return flash->flash_lock(flash, ofs, len);
216 else
217 return flash->flash_unlock(flash, ofs, len);
218}
219
220#endif
221