1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Common SPI flash Interface 4 * 5 * Copyright (C) 2008 Atmel Corporation 6 * Copyright (C) 2013 Jagannadha Sutradharudu Teki, Xilinx Inc. 7 */ 8 9 #ifndef _SPI_FLASH_H_ 10 #define _SPI_FLASH_H_ 11 12 #include <dm.h> /* Because we dereference struct udevice here */ 13 #include <linux/types.h> 14 #include <linux/mtd/spi-nor.h> 15 16 #ifndef CONFIG_SF_DEFAULT_SPEED 17 # define CONFIG_SF_DEFAULT_SPEED 1000000 18 #endif 19 #ifndef CONFIG_SF_DEFAULT_MODE 20 # define CONFIG_SF_DEFAULT_MODE SPI_MODE_3 21 #endif 22 #ifndef CONFIG_SF_DEFAULT_CS 23 # define CONFIG_SF_DEFAULT_CS 0 24 #endif 25 #ifndef CONFIG_SF_DEFAULT_BUS 26 # define CONFIG_SF_DEFAULT_BUS 0 27 #endif 28 29 struct spi_slave; 30 31 struct dm_spi_flash_ops { 32 int (*read)(struct udevice *dev, u32 offset, size_t len, void *buf); 33 int (*write)(struct udevice *dev, u32 offset, size_t len, 34 const void *buf); 35 int (*erase)(struct udevice *dev, u32 offset, size_t len); 36 /** 37 * get_sw_write_prot() - Check state of software write-protect feature 38 * 39 * SPI flash chips can lock a region of the flash defined by a 40 * 'protected area'. This function checks if this protected area is 41 * defined. 42 * 43 * @dev: SPI flash device 44 * @return 0 if no region is write-protected, 1 if a region is 45 * write-protected, -ENOSYS if the driver does not implement this, 46 * other -ve value on error 47 */ 48 int (*get_sw_write_prot)(struct udevice *dev); 49 }; 50 51 /* Access the serial operations for a device */ 52 #define sf_get_ops(dev) ((struct dm_spi_flash_ops *)(dev)->driver->ops) 53 54 #ifdef CONFIG_DM_SPI_FLASH 55 /** 56 * spi_flash_read_dm() - Read data from SPI flash 57 * 58 * @dev: SPI flash device 59 * @offset: Offset into device in bytes to read from 60 * @len: Number of bytes to read 61 * @buf: Buffer to put the data that is read 62 * @return 0 if OK, -ve on error 63 */ 64 int spi_flash_read_dm(struct udevice *dev, u32 offset, size_t len, void *buf); 65 66 /** 67 * spi_flash_write_dm() - Write data to SPI flash 68 * 69 * @dev: SPI flash device 70 * @offset: Offset into device in bytes to write to 71 * @len: Number of bytes to write 72 * @buf: Buffer containing bytes to write 73 * @return 0 if OK, -ve on error 74 */ 75 int spi_flash_write_dm(struct udevice *dev, u32 offset, size_t len, 76 const void *buf); 77 78 /** 79 * spi_flash_erase_dm() - Erase blocks of the SPI flash 80 * 81 * Note that @len must be a muiltiple of the flash sector size. 82 * 83 * @dev: SPI flash device 84 * @offset: Offset into device in bytes to start erasing 85 * @len: Number of bytes to erase 86 * @return 0 if OK, -ve on error 87 */ 88 int spi_flash_erase_dm(struct udevice *dev, u32 offset, size_t len); 89 90 /** 91 * spl_flash_get_sw_write_prot() - Check state of software write-protect feature 92 * 93 * SPI flash chips can lock a region of the flash defined by a 94 * 'protected area'. This function checks if this protected area is 95 * defined. 96 * 97 * @dev: SPI flash device 98 * @return 0 if no region is write-protected, 1 if a region is 99 * write-protected, -ENOSYS if the driver does not implement this, 100 * other -ve value on error 101 */ 102 int spl_flash_get_sw_write_prot(struct udevice *dev); 103 104 int spi_flash_probe_bus_cs(unsigned int busnum, unsigned int cs, 105 unsigned int max_hz, unsigned int spi_mode, 106 struct udevice **devp); 107 108 /* Compatibility function - this is the old U-Boot API */ 109 struct spi_flash *spi_flash_probe(unsigned int bus, unsigned int cs, 110 unsigned int max_hz, unsigned int spi_mode); 111 112 /* Compatibility function - this is the old U-Boot API */ 113 void spi_flash_free(struct spi_flash *flash); 114 115 static inline int spi_flash_read(struct spi_flash *flash, u32 offset, 116 size_t len, void *buf) 117 { 118 return spi_flash_read_dm(flash->dev, offset, len, buf); 119 } 120 121 static inline int spi_flash_write(struct spi_flash *flash, u32 offset, 122 size_t len, const void *buf) 123 { 124 return spi_flash_write_dm(flash->dev, offset, len, buf); 125 } 126 127 static inline int spi_flash_erase(struct spi_flash *flash, u32 offset, 128 size_t len) 129 { 130 return spi_flash_erase_dm(flash->dev, offset, len); 131 } 132 133 struct sandbox_state; 134 135 int sandbox_sf_bind_emul(struct sandbox_state *state, int busnum, int cs, 136 struct udevice *bus, ofnode node, const char *spec); 137 138 void sandbox_sf_unbind_emul(struct sandbox_state *state, int busnum, int cs); 139 140 #else 141 struct spi_flash *spi_flash_probe(unsigned int bus, unsigned int cs, 142 unsigned int max_hz, unsigned int spi_mode); 143 144 void spi_flash_free(struct spi_flash *flash); 145 146 static inline int spi_flash_read(struct spi_flash *flash, u32 offset, 147 size_t len, void *buf) 148 { 149 struct mtd_info *mtd = &flash->mtd; 150 size_t retlen; 151 152 return mtd->_read(mtd, offset, len, &retlen, buf); 153 } 154 155 static inline int spi_flash_write(struct spi_flash *flash, u32 offset, 156 size_t len, const void *buf) 157 { 158 struct mtd_info *mtd = &flash->mtd; 159 size_t retlen; 160 161 return mtd->_write(mtd, offset, len, &retlen, buf); 162 } 163 164 static inline int spi_flash_erase(struct spi_flash *flash, u32 offset, 165 size_t len) 166 { 167 struct mtd_info *mtd = &flash->mtd; 168 struct erase_info instr; 169 170 if (offset % mtd->erasesize || len % mtd->erasesize) { 171 printf("SF: Erase offset/length not multiple of erase size\n"); 172 return -EINVAL; 173 } 174 175 memset(&instr, 0, sizeof(instr)); 176 instr.addr = offset; 177 instr.len = len; 178 179 return mtd->_erase(mtd, &instr); 180 } 181 #endif 182 183 static inline int spi_flash_protect(struct spi_flash *flash, u32 ofs, u32 len, 184 bool prot) 185 { 186 if (!flash->flash_lock || !flash->flash_unlock) 187 return -EOPNOTSUPP; 188 189 if (prot) 190 return flash->flash_lock(flash, ofs, len); 191 else 192 return flash->flash_unlock(flash, ofs, len); 193 } 194 195 #endif /* _SPI_FLASH_H_ */ 196