uboot/include/spi_flash.h
<<
>>
Prefs
   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 <linux/types.h>
  13#include <linux/mtd/spi-nor.h>
  14
  15struct udevice;
  16
  17/* by default ENV use the same parameters than SF command */
  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         * get_sw_write_prot() - Check state of software write-protect feature
  40         *
  41         * SPI flash chips can lock a region of the flash defined by a
  42         * 'protected area'. This function checks if this protected area is
  43         * defined.
  44         *
  45         * @dev:        SPI flash device
  46         * @return 0 if no region is write-protected, 1 if a region is
  47         *      write-protected, -ENOSYS if the driver does not implement this,
  48         *      other -ve value on error
  49         */
  50        int (*get_sw_write_prot)(struct udevice *dev);
  51};
  52
  53/* Access the serial operations for a device */
  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 * spi_flash_read_dm() - Read data from SPI flash
  59 *
  60 * @dev:        SPI flash device
  61 * @offset:     Offset into device in bytes to read from
  62 * @len:        Number of bytes to read
  63 * @buf:        Buffer to put the data that is read
  64 * @return 0 if OK, -ve on error
  65 */
  66int spi_flash_read_dm(struct udevice *dev, u32 offset, size_t len, void *buf);
  67
  68/**
  69 * spi_flash_write_dm() - Write data to SPI flash
  70 *
  71 * @dev:        SPI flash device
  72 * @offset:     Offset into device in bytes to write to
  73 * @len:        Number of bytes to write
  74 * @buf:        Buffer containing bytes to write
  75 * @return 0 if OK, -ve on error
  76 */
  77int spi_flash_write_dm(struct udevice *dev, u32 offset, size_t len,
  78                       const void *buf);
  79
  80/**
  81 * spi_flash_erase_dm() - Erase blocks of the SPI flash
  82 *
  83 * Note that @len must be a muiltiple of the flash sector size.
  84 *
  85 * @dev:        SPI flash device
  86 * @offset:     Offset into device in bytes to start erasing
  87 * @len:        Number of bytes to erase
  88 * @return 0 if OK, -ve on error
  89 */
  90int spi_flash_erase_dm(struct udevice *dev, u32 offset, size_t len);
  91
  92/**
  93 * spl_flash_get_sw_write_prot() - Check state of software write-protect feature
  94 *
  95 * SPI flash chips can lock a region of the flash defined by a
  96 * 'protected area'. This function checks if this protected area is
  97 * defined.
  98 *
  99 * @dev:        SPI flash device
 100 * @return 0 if no region is write-protected, 1 if a region is
 101 *      write-protected, -ENOSYS if the driver does not implement this,
 102 *      other -ve value on error
 103 */
 104int spl_flash_get_sw_write_prot(struct udevice *dev);
 105
 106/**
 107 * spi_flash_std_probe() - Probe a SPI flash device
 108 *
 109 * This is the standard internal method for probing a SPI flash device to
 110 * determine its type. It can be used in chip-specific drivers which need to
 111 * do this, typically with of-platdata
 112 *
 113 * @dev: SPI-flash device to probe
 114 * @return 0 if OK, -ve on error
 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/* Compatibility function - this is the old U-Boot API */
 123struct spi_flash *spi_flash_probe(unsigned int bus, unsigned int cs,
 124                                  unsigned int max_hz, unsigned int spi_mode);
 125
 126/* Compatibility function - this is the old U-Boot API */
 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 /* _SPI_FLASH_H_ */
 221