mirror of
https://github.com/u-boot/u-boot.git
synced 2025-05-08 19:11:53 +00:00
mtd: spi: Switch to new SPI NOR framework
Switch spi_flash_* interfaces to call into new SPI NOR framework via MTD layer. Fix up sf_dataflash to work in legacy way. And update sandbox to use new interfaces/definitions Signed-off-by: Vignesh R <vigneshr@ti.com> Tested-by: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com> Tested-by: Stefan Roese <sr@denx.de> Tested-by: Horatiu Vultur <horatiu.vultur@microchip.com> Reviewed-by: Jagan Teki <jagan@openedev.com> Tested-by: Jagan Teki <jagan@amarulasolutions.com> #zynq-microzed
This commit is contained in:
parent
2ee6705be0
commit
c4e8862308
9 changed files with 113 additions and 365 deletions
|
@ -11,6 +11,7 @@
|
|||
|
||||
#include <dm.h> /* Because we dereference struct udevice here */
|
||||
#include <linux/types.h>
|
||||
#include <linux/mtd/spi-nor.h>
|
||||
|
||||
#ifndef CONFIG_SF_DEFAULT_SPEED
|
||||
# define CONFIG_SF_DEFAULT_SPEED 1000000
|
||||
|
@ -27,86 +28,6 @@
|
|||
|
||||
struct spi_slave;
|
||||
|
||||
/**
|
||||
* struct spi_flash - SPI flash structure
|
||||
*
|
||||
* @spi: SPI slave
|
||||
* @dev: SPI flash device
|
||||
* @name: Name of SPI flash
|
||||
* @dual_flash: Indicates dual flash memories - dual stacked, parallel
|
||||
* @shift: Flash shift useful in dual parallel
|
||||
* @flags: Indication of spi flash flags
|
||||
* @size: Total flash size
|
||||
* @page_size: Write (page) size
|
||||
* @sector_size: Sector size
|
||||
* @erase_size: Erase size
|
||||
* @bank_read_cmd: Bank read cmd
|
||||
* @bank_write_cmd: Bank write cmd
|
||||
* @bank_curr: Current flash bank
|
||||
* @erase_cmd: Erase cmd 4K, 32K, 64K
|
||||
* @read_cmd: Read cmd - Array Fast, Extn read and quad read.
|
||||
* @write_cmd: Write cmd - page and quad program.
|
||||
* @dummy_byte: Dummy cycles for read operation.
|
||||
* @memory_map: Address of read-only SPI flash access
|
||||
* @flash_lock: lock a region of the SPI Flash
|
||||
* @flash_unlock: unlock a region of the SPI Flash
|
||||
* @flash_is_locked: check if a region of the SPI Flash is completely locked
|
||||
* @read: Flash read ops: Read len bytes at offset into buf
|
||||
* Supported cmds: Fast Array Read
|
||||
* @write: Flash write ops: Write len bytes from buf into offset
|
||||
* Supported cmds: Page Program
|
||||
* @erase: Flash erase ops: Erase len bytes from offset
|
||||
* Supported cmds: Sector erase 4K, 32K, 64K
|
||||
* return 0 - Success, 1 - Failure
|
||||
*/
|
||||
struct spi_flash {
|
||||
struct spi_slave *spi;
|
||||
#ifdef CONFIG_DM_SPI_FLASH
|
||||
struct udevice *dev;
|
||||
#endif
|
||||
const char *name;
|
||||
u8 dual_flash;
|
||||
u8 shift;
|
||||
u16 flags;
|
||||
|
||||
u32 size;
|
||||
u32 page_size;
|
||||
u32 sector_size;
|
||||
u32 erase_size;
|
||||
#ifdef CONFIG_SPI_FLASH_BAR
|
||||
u8 bank_read_cmd;
|
||||
u8 bank_write_cmd;
|
||||
u8 bank_curr;
|
||||
#endif
|
||||
u8 erase_cmd;
|
||||
u8 read_cmd;
|
||||
u8 write_cmd;
|
||||
u8 dummy_byte;
|
||||
|
||||
void *memory_map;
|
||||
|
||||
int (*flash_lock)(struct spi_flash *flash, u32 ofs, size_t len);
|
||||
int (*flash_unlock)(struct spi_flash *flash, u32 ofs, size_t len);
|
||||
int (*flash_is_locked)(struct spi_flash *flash, u32 ofs, size_t len);
|
||||
#ifndef CONFIG_DM_SPI_FLASH
|
||||
/*
|
||||
* These are not strictly needed for driver model, but keep them here
|
||||
* while the transition is in progress.
|
||||
*
|
||||
* Normally each driver would provide its own operations, but for
|
||||
* SPI flash most chips use the same algorithms. One approach is
|
||||
* to create a 'common' SPI flash device which knows how to talk
|
||||
* to most devices, and then allow other drivers to be used instead
|
||||
* if required, perhaps with a way of scanning through the list to
|
||||
* find the driver that matches the device.
|
||||
*/
|
||||
int (*read)(struct spi_flash *flash, u32 offset, size_t len, void *buf);
|
||||
int (*write)(struct spi_flash *flash, u32 offset, size_t len,
|
||||
const void *buf);
|
||||
int (*erase)(struct spi_flash *flash, u32 offset, size_t len);
|
||||
#endif
|
||||
};
|
||||
|
||||
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,
|
||||
|
@ -225,19 +146,37 @@ 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)
|
||||
{
|
||||
return flash->read(flash, offset, len, buf);
|
||||
struct mtd_info *mtd = &flash->mtd;
|
||||
size_t retlen;
|
||||
|
||||
return mtd->_read(mtd, offset, len, &retlen, buf);
|
||||
}
|
||||
|
||||
static inline int spi_flash_write(struct spi_flash *flash, u32 offset,
|
||||
size_t len, const void *buf)
|
||||
{
|
||||
return flash->write(flash, offset, len, buf);
|
||||
struct mtd_info *mtd = &flash->mtd;
|
||||
size_t retlen;
|
||||
|
||||
return mtd->_write(mtd, offset, len, &retlen, buf);
|
||||
}
|
||||
|
||||
static inline int spi_flash_erase(struct spi_flash *flash, u32 offset,
|
||||
size_t len)
|
||||
{
|
||||
return flash->erase(flash, offset, len);
|
||||
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\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
memset(&instr, 0, sizeof(instr));
|
||||
instr.addr = offset;
|
||||
instr.len = len;
|
||||
|
||||
return mtd->_erase(mtd, &instr);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue