Blame view

include/spi_flash.h 5.83 KB
83d290c56   Tom Rini   SPDX: Convert all...
1
  /* SPDX-License-Identifier: GPL-2.0 */
d25ce7d24   Haavard Skinnemoen   SPI Flash subsystem
2
  /*
a5e8199a1   Jagannadha Sutradharudu Teki   sf: spi_flash cle...
3
   * Common SPI flash Interface
d25ce7d24   Haavard Skinnemoen   SPI Flash subsystem
4
5
   *
   * Copyright (C) 2008 Atmel Corporation
a5e8199a1   Jagannadha Sutradharudu Teki   sf: spi_flash cle...
6
   * Copyright (C) 2013 Jagannadha Sutradharudu Teki, Xilinx Inc.
d25ce7d24   Haavard Skinnemoen   SPI Flash subsystem
7
   */
a5e8199a1   Jagannadha Sutradharudu Teki   sf: spi_flash cle...
8

d25ce7d24   Haavard Skinnemoen   SPI Flash subsystem
9
10
  #ifndef _SPI_FLASH_H_
  #define _SPI_FLASH_H_
4c2dbefde   Simon Glass   dm: sf: Add a ucl...
11
  #include <dm.h>	/* Because we dereference struct udevice here */
e06ab6546   Mike Frysinger   spi_flash.h: pull...
12
  #include <linux/types.h>
c4e886230   Vignesh R   mtd: spi: Switch ...
13
  #include <linux/mtd/spi-nor.h>
d25ce7d24   Haavard Skinnemoen   SPI Flash subsystem
14

abe66b1b5   Patrick Delaunay   Convert CONFIG_EN...
15
16
17
18
19
20
21
22
23
24
25
26
27
  /* by default ENV use the same parameters than SF command */
  #ifndef CONFIG_ENV_SPI_BUS
  # define CONFIG_ENV_SPI_BUS	CONFIG_SF_DEFAULT_BUS
  #endif
  #ifndef CONFIG_ENV_SPI_CS
  # define CONFIG_ENV_SPI_CS	CONFIG_SF_DEFAULT_CS
  #endif
  #ifndef CONFIG_ENV_SPI_MAX_HZ
  # define CONFIG_ENV_SPI_MAX_HZ	CONFIG_SF_DEFAULT_SPEED
  #endif
  #ifndef CONFIG_ENV_SPI_MODE
  # define CONFIG_ENV_SPI_MODE	CONFIG_SF_DEFAULT_MODE
  #endif
ff0960f9a   Simon Glass   sf: Tidy up publi...
28
  struct spi_slave;
33adfb5f9   Jagannadha Sutradharudu Teki   sf: Separate the ...
29

4c2dbefde   Simon Glass   dm: sf: Add a ucl...
30
31
32
33
34
  struct dm_spi_flash_ops {
  	int (*read)(struct udevice *dev, u32 offset, size_t len, void *buf);
  	int (*write)(struct udevice *dev, u32 offset, size_t len,
  		     const void *buf);
  	int (*erase)(struct udevice *dev, u32 offset, size_t len);
a58986ca8   Simon Glass   sf: Add a method ...
35
36
37
38
39
40
41
42
43
44
45
46
47
  	/**
  	 * get_sw_write_prot() - Check state of software write-protect feature
  	 *
  	 * SPI flash chips can lock a region of the flash defined by a
  	 * 'protected area'. This function checks if this protected area is
  	 * defined.
  	 *
  	 * @dev:	SPI flash device
  	 * @return 0 if no region is write-protected, 1 if a region is
  	 *	write-protected, -ENOSYS if the driver does not implement this,
  	 *	other -ve value on error
  	 */
  	int (*get_sw_write_prot)(struct udevice *dev);
d25ce7d24   Haavard Skinnemoen   SPI Flash subsystem
48
  };
4c2dbefde   Simon Glass   dm: sf: Add a ucl...
49
50
51
52
  /* Access the serial operations for a device */
  #define sf_get_ops(dev) ((struct dm_spi_flash_ops *)(dev)->driver->ops)
  
  #ifdef CONFIG_DM_SPI_FLASH
8d987abc6   Simon Glass   dm: sf: Add drive...
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
  /**
   * spi_flash_read_dm() - Read data from SPI flash
   *
   * @dev:	SPI flash device
   * @offset:	Offset into device in bytes to read from
   * @len:	Number of bytes to read
   * @buf:	Buffer to put the data that is read
   * @return 0 if OK, -ve on error
   */
  int spi_flash_read_dm(struct udevice *dev, u32 offset, size_t len, void *buf);
  
  /**
   * spi_flash_write_dm() - Write data to SPI flash
   *
   * @dev:	SPI flash device
   * @offset:	Offset into device in bytes to write to
   * @len:	Number of bytes to write
   * @buf:	Buffer containing bytes to write
   * @return 0 if OK, -ve on error
   */
  int spi_flash_write_dm(struct udevice *dev, u32 offset, size_t len,
  		       const void *buf);
  
  /**
   * spi_flash_erase_dm() - Erase blocks of the SPI flash
   *
   * Note that @len must be a muiltiple of the flash sector size.
   *
   * @dev:	SPI flash device
   * @offset:	Offset into device in bytes to start erasing
   * @len:	Number of bytes to erase
   * @return 0 if OK, -ve on error
   */
  int spi_flash_erase_dm(struct udevice *dev, u32 offset, size_t len);
a58986ca8   Simon Glass   sf: Add a method ...
87
88
89
90
91
92
93
94
95
96
97
98
99
  /**
   * spl_flash_get_sw_write_prot() - Check state of software write-protect feature
   *
   * SPI flash chips can lock a region of the flash defined by a
   * 'protected area'. This function checks if this protected area is
   * defined.
   *
   * @dev:	SPI flash device
   * @return 0 if no region is write-protected, 1 if a region is
   *	write-protected, -ENOSYS if the driver does not implement this,
   *	other -ve value on error
   */
  int spl_flash_get_sw_write_prot(struct udevice *dev);
4806fcea1   Simon Glass   mtd: spi: Export ...
100
101
102
103
104
105
106
107
108
109
110
  /**
   * spi_flash_std_probe() - Probe a SPI flash device
   *
   * This is the standard internal method for probing a SPI flash device to
   * determine its type. It can be used in chip-specific drivers which need to
   * do this, typically with of-platdata
   *
   * @dev: SPI-flash device to probe
   * @return 0 if OK, -ve on error
   */
  int spi_flash_std_probe(struct udevice *dev);
4c2dbefde   Simon Glass   dm: sf: Add a ucl...
111
112
113
114
115
116
117
118
119
120
  int spi_flash_probe_bus_cs(unsigned int busnum, unsigned int cs,
  			   unsigned int max_hz, unsigned int spi_mode,
  			   struct udevice **devp);
  
  /* Compatibility function - this is the old U-Boot API */
  struct spi_flash *spi_flash_probe(unsigned int bus, unsigned int cs,
  				  unsigned int max_hz, unsigned int spi_mode);
  
  /* Compatibility function - this is the old U-Boot API */
  void spi_flash_free(struct spi_flash *flash);
4c2dbefde   Simon Glass   dm: sf: Add a ucl...
121
  static inline int spi_flash_read(struct spi_flash *flash, u32 offset,
8d987abc6   Simon Glass   dm: sf: Add drive...
122
  				 size_t len, void *buf)
4c2dbefde   Simon Glass   dm: sf: Add a ucl...
123
  {
8d987abc6   Simon Glass   dm: sf: Add drive...
124
  	return spi_flash_read_dm(flash->dev, offset, len, buf);
4c2dbefde   Simon Glass   dm: sf: Add a ucl...
125
126
127
  }
  
  static inline int spi_flash_write(struct spi_flash *flash, u32 offset,
8d987abc6   Simon Glass   dm: sf: Add drive...
128
  				  size_t len, const void *buf)
4c2dbefde   Simon Glass   dm: sf: Add a ucl...
129
  {
8d987abc6   Simon Glass   dm: sf: Add drive...
130
  	return spi_flash_write_dm(flash->dev, offset, len, buf);
4c2dbefde   Simon Glass   dm: sf: Add a ucl...
131
132
133
  }
  
  static inline int spi_flash_erase(struct spi_flash *flash, u32 offset,
8d987abc6   Simon Glass   dm: sf: Add drive...
134
  				  size_t len)
4c2dbefde   Simon Glass   dm: sf: Add a ucl...
135
  {
8d987abc6   Simon Glass   dm: sf: Add drive...
136
  	return spi_flash_erase_dm(flash->dev, offset, len);
4c2dbefde   Simon Glass   dm: sf: Add a ucl...
137
138
139
140
141
  }
  
  struct sandbox_state;
  
  int sandbox_sf_bind_emul(struct sandbox_state *state, int busnum, int cs,
008dcddf9   Simon Glass   dm: spi: Update s...
142
  			 struct udevice *bus, ofnode node, const char *spec);
4c2dbefde   Simon Glass   dm: sf: Add a ucl...
143
144
145
146
  
  void sandbox_sf_unbind_emul(struct sandbox_state *state, int busnum, int cs);
  
  #else
d25ce7d24   Haavard Skinnemoen   SPI Flash subsystem
147
148
  struct spi_flash *spi_flash_probe(unsigned int bus, unsigned int cs,
  		unsigned int max_hz, unsigned int spi_mode);
0efc02499   Simon Glass   spi_flash: Add sp...
149

d25ce7d24   Haavard Skinnemoen   SPI Flash subsystem
150
151
152
153
154
  void spi_flash_free(struct spi_flash *flash);
  
  static inline int spi_flash_read(struct spi_flash *flash, u32 offset,
  		size_t len, void *buf)
  {
c4e886230   Vignesh R   mtd: spi: Switch ...
155
156
157
158
  	struct mtd_info *mtd = &flash->mtd;
  	size_t retlen;
  
  	return mtd->_read(mtd, offset, len, &retlen, buf);
d25ce7d24   Haavard Skinnemoen   SPI Flash subsystem
159
160
161
162
163
  }
  
  static inline int spi_flash_write(struct spi_flash *flash, u32 offset,
  		size_t len, const void *buf)
  {
c4e886230   Vignesh R   mtd: spi: Switch ...
164
165
166
167
  	struct mtd_info *mtd = &flash->mtd;
  	size_t retlen;
  
  	return mtd->_write(mtd, offset, len, &retlen, buf);
d25ce7d24   Haavard Skinnemoen   SPI Flash subsystem
168
169
170
171
172
  }
  
  static inline int spi_flash_erase(struct spi_flash *flash, u32 offset,
  		size_t len)
  {
c4e886230   Vignesh R   mtd: spi: Switch ...
173
174
175
176
177
178
179
180
181
182
183
184
185
186
  	struct mtd_info *mtd = &flash->mtd;
  	struct erase_info instr;
  
  	if (offset % mtd->erasesize || len % mtd->erasesize) {
  		printf("SF: Erase offset/length not multiple of erase size
  ");
  		return -EINVAL;
  	}
  
  	memset(&instr, 0, sizeof(instr));
  	instr.addr = offset;
  	instr.len = len;
  
  	return mtd->_erase(mtd, &instr);
d25ce7d24   Haavard Skinnemoen   SPI Flash subsystem
187
  }
4c2dbefde   Simon Glass   dm: sf: Add a ucl...
188
  #endif
d25ce7d24   Haavard Skinnemoen   SPI Flash subsystem
189

c3c016cf7   Fabio Estevam   sf: Add SPI NOR p...
190
191
192
  static inline int spi_flash_protect(struct spi_flash *flash, u32 ofs, u32 len,
  					bool prot)
  {
439fcb9b4   Bin Meng   sf: Fix NULL poin...
193
  	if (!flash->flash_lock || !flash->flash_unlock)
c3c016cf7   Fabio Estevam   sf: Add SPI NOR p...
194
195
196
197
198
199
200
  		return -EOPNOTSUPP;
  
  	if (prot)
  		return flash->flash_lock(flash, ofs, len);
  	else
  		return flash->flash_unlock(flash, ofs, len);
  }
d25ce7d24   Haavard Skinnemoen   SPI Flash subsystem
201
  #endif /* _SPI_FLASH_H_ */