[U-Boot] [PATCH 1/8] sf: Add MTD support to spi_flash

This patch adds mtd_info support to spi_flash layer, MTD has proven core for flash operations so adding MTD to spi_flash will extends more functionality.
Signed-off-by: Jagan Teki jteki@openedev.com --- drivers/mtd/spi/sf_ops.c | 45 +++++++++++++++++++++++++-------------------- drivers/mtd/spi/sf_probe.c | 26 ++++++++++++++++++-------- include/spi_flash.h | 9 +++++---- 3 files changed, 48 insertions(+), 32 deletions(-)
diff --git a/drivers/mtd/spi/sf_ops.c b/drivers/mtd/spi/sf_ops.c index 703099f..f5ee376 100644 --- a/drivers/mtd/spi/sf_ops.c +++ b/drivers/mtd/spi/sf_ops.c @@ -146,7 +146,7 @@ static int spi_flash_read_bar(struct spi_flash *flash, u8 idcode0) u8 curr_bank = 0; int ret;
- if (flash->size <= SPI_FLASH_16MB_BOUN) + if (flash->mtd->size <= SPI_FLASH_16MB_BOUN) goto bank_end;
switch (idcode0) { @@ -176,8 +176,8 @@ static void spi_flash_dual(struct spi_flash *flash, u32 *addr) { switch (flash->dual_flash) { case SF_DUAL_STACKED_FLASH: - if (*addr >= (flash->size >> 1)) { - *addr -= flash->size >> 1; + if (*addr >= (flash->mtd->size >> 1)) { + *addr -= flash->mtd->size >> 1; flash->spi->flags |= SPI_XFER_U_PAGE; } else { flash->spi->flags &= ~SPI_XFER_U_PAGE; @@ -303,7 +303,7 @@ static int spi_flash_cmd_erase_ops(struct spi_flash *flash, u32 offset, u8 cmd[SPI_FLASH_CMD_LEN]; int ret = -1;
- erase_size = flash->erase_size; + erase_size = mtd->erasesize; if (offset % erase_size || len % erase_size) { debug("SF: Erase offset/length not multiple of erase size\n"); return -1; @@ -693,7 +693,7 @@ int spi_flash_decode_fdt(const void *blob, struct spi_flash *flash) return 0; }
- if (flash->size != size) { + if (flash->mtd->size != size) { debug("%s: Memory map must cover entire device\n", __func__); return -1; } @@ -705,6 +705,7 @@ int spi_flash_decode_fdt(const void *blob, struct spi_flash *flash)
int spi_flash_scan(struct spi_flash *flash) { + struct mtd_info *mtd = flash->mtd; const struct spi_flash_params *params; u16 jedec, ext_jedec; u8 idcode[5]; @@ -754,24 +755,27 @@ int spi_flash_scan(struct spi_flash *flash)
/* Assign spi data */ flash->name = params->name; + mtd->type = MTD_NORFLASH; + mtd->writesize = 1; + mtd->flags = MTD_CAP_NORFLASH; flash->memory_map = flash->spi->memory_map; flash->dual_flash = flash->spi->option;
/* Assign spi_flash ops */ - flash->write = spi_flash_cmd_write_ops; + mtd->_write = spi_flash_cmd_write_ops; #if defined(CONFIG_SPI_FLASH_SST) if (params->flags & SST_WR) flash->flags |= SNOR_F_SST_WR;
if (params->flags & SNOR_F_SST_WR) { if (flash->spi->op_mode_tx & SPI_OPM_TX_BP) - flash->write = sst_write_bp; + mtd->_write = sst_write_bp; else - flash->write = sst_write_wp; + mtd->_write = sst_write_wp; } #endif - flash->erase = spi_flash_cmd_erase_ops; - flash->read = spi_flash_cmd_read_ops; + mtd->_erase = spi_flash_cmd_erase_ops; + mtd->_read = spi_flash_cmd_read_ops;
/* Compute the flash size */ flash->shift = (flash->dual_flash & SF_DUAL_PARALLEL_FLASH) ? 1 : 0; @@ -790,27 +794,28 @@ int spi_flash_scan(struct spi_flash *flash) flash->page_size = 256; } flash->page_size <<= flash->shift; + mtd->writebufsize = flash->page_size; flash->sector_size = params->sector_size << flash->shift; - flash->size = flash->sector_size * params->nr_sectors << flash->shift; + mtd->size = flash->sector_size * params->nr_sectors << flash->shift; #ifdef CONFIG_SF_DUAL_FLASH if (flash->dual_flash & SF_DUAL_STACKED_FLASH) - flash->size <<= 1; + mtd->size <<= 1; #endif
/* Compute erase sector and command */ if (params->flags & SECT_4K) { flash->erase_cmd = CMD_ERASE_4K; - flash->erase_size = 4096 << flash->shift; + mtd->erasesize = 4096 << flash->shift; } else if (params->flags & SECT_32K) { flash->erase_cmd = CMD_ERASE_32K; - flash->erase_size = 32768 << flash->shift; + mtd->erasesize = 32768 << flash->shift; } else { flash->erase_cmd = CMD_ERASE_64K; - flash->erase_size = flash->sector_size; + mtd->erasesize = flash->sector_size; }
/* Now erase size becomes valid sector size */ - flash->sector_size = flash->erase_size; + flash->sector_size = mtd->erasesize;
/* Look for the fastest read cmd */ cmd = fls(params->e_rd_cmd & flash->spi->op_mode_rx); @@ -882,8 +887,8 @@ int spi_flash_scan(struct spi_flash *flash) #ifndef CONFIG_SPL_BUILD printf("SF: Detected %s with page size ", flash->name); print_size(flash->page_size, ", erase size "); - print_size(flash->erase_size, ", total "); - print_size(flash->size, ""); + print_size(mtd->erasesize, ", total "); + print_size(mtd->size, ""); if (flash->memory_map) printf(", mapped at %p", flash->memory_map); puts("\n"); @@ -891,9 +896,9 @@ int spi_flash_scan(struct spi_flash *flash)
#ifndef CONFIG_SPI_FLASH_BAR if (((flash->dual_flash == SF_SINGLE_FLASH) && - (flash->size > SPI_FLASH_16MB_BOUN)) || + (mtd->size > SPI_FLASH_16MB_BOUN)) || ((flash->dual_flash > SF_SINGLE_FLASH) && - (flash->size > SPI_FLASH_16MB_BOUN << 1))) { + (mtd->size > SPI_FLASH_16MB_BOUN << 1))) { puts("SF: Warning - Only lower 16MiB accessible,"); puts(" Full access #define CONFIG_SPI_FLASH_BAR\n"); } diff --git a/drivers/mtd/spi/sf_probe.c b/drivers/mtd/spi/sf_probe.c index 87ac33e..b8704e2 100644 --- a/drivers/mtd/spi/sf_probe.c +++ b/drivers/mtd/spi/sf_probe.c @@ -14,9 +14,15 @@ #include <malloc.h> #include <spi.h> #include <spi_flash.h> +#include <linux/mtd/mtd.h>
#include "sf_internal.h"
+struct spi_flash_priv { + struct spi_flash flash; + struct mtd_info mtd; +}; + #ifndef CONFIG_DM_SPI_FLASH struct spi_flash *spi_flash_probe_tail(struct spi_slave *bus) { @@ -123,12 +129,19 @@ int spi_flash_std_erase(struct udevice *dev, u32 offset, size_t len)
int spi_flash_std_probe(struct udevice *dev) { - struct spi_flash *flash = dev_get_uclass_priv(dev); + struct spi_flash_priv *priv = dev_get_uclass_priv(dev); struct spi_slave *slave = dev_get_parentdata(dev); + struct spi_flash *flash; int ret;
- flash->dev = dev; + flash = &priv->flash; + flash->mtd = &priv->mtd; + flash->spi = slave; + flash->priv = priv; + + priv->mtd.priv = flash; + flash->dev = dev;
/* Claim spi bus */ ret = spi_claim_bus(slave); @@ -143,19 +156,16 @@ int spi_flash_std_probe(struct udevice *dev) goto err_scan; }
-#ifdef CONFIG_SPI_FLASH_MTD - ret = spi_flash_mtd_register(flash); + ret = add_mtd_device(&priv->mtd); if (ret) { printf("SF: failed to register mtd device: %d\n", ret); goto err_mtd; } -#endif + return ret;
-#ifdef CONFIG_SPI_FLASH_MTD err_mtd: spi_free_slave(slave); -#endif err_scan: spi_release_bus(slave); return ret; @@ -177,7 +187,7 @@ U_BOOT_DRIVER(spi_flash_std) = { .id = UCLASS_SPI_FLASH, .of_match = spi_flash_std_ids, .probe = spi_flash_std_probe, - .priv_auto_alloc_size = sizeof(struct spi_flash), + .priv_auto_alloc_size = sizeof(struct spi_flash_priv), .ops = &spi_flash_std_ops, };
diff --git a/include/spi_flash.h b/include/spi_flash.h index 0732172..d0af8d3 100644 --- a/include/spi_flash.h +++ b/include/spi_flash.h @@ -17,6 +17,7 @@
#include <dm.h> /* Because we dereference struct udevice here */ #include <linux/types.h> +#include <linux/mtd/mtd.h>
#ifndef CONFIG_SF_DEFAULT_SPEED # define CONFIG_SF_DEFAULT_SPEED 1000000 @@ -36,16 +37,15 @@ struct spi_slave; /** * struct spi_flash - SPI flash structure * + * @mtd: point to a mtd_info 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 @@ -54,6 +54,7 @@ struct spi_slave; * @write_cmd: Write cmd - page and quad program. * @dummy_byte: Dummy cycles for read operation. * @memory_map: Address of read-only SPI flash access + * @priv: the private data * @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 @@ -63,6 +64,7 @@ struct spi_slave; * return 0 - Success, 1 - Failure */ struct spi_flash { + struct mtd_info *mtd; struct spi_slave *spi; #ifdef CONFIG_DM_SPI_FLASH struct udevice *dev; @@ -72,10 +74,8 @@ struct spi_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; @@ -87,6 +87,7 @@ struct spi_flash { u8 dummy_byte;
void *memory_map; + void *priv; 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);

Since MTD support is added in spi_flash layer, this patch uses mtd_info operations instead of legacy spi_flash operations.
Signed-off-by: Jagan Teki jteki@openedev.com --- drivers/mtd/spi/sf_ops.c | 66 ++++++++++++++++++++++++++++-------------------- include/spi_flash.h | 24 ++++++++---------- 2 files changed, 49 insertions(+), 41 deletions(-)
diff --git a/drivers/mtd/spi/sf_ops.c b/drivers/mtd/spi/sf_ops.c index f5ee376..d10ca45 100644 --- a/drivers/mtd/spi/sf_ops.c +++ b/drivers/mtd/spi/sf_ops.c @@ -296,18 +296,16 @@ int spi_flash_write_common(struct spi_flash *flash, const u8 *cmd, return ret; }
-static int spi_flash_cmd_erase_ops(struct spi_flash *flash, u32 offset, - size_t len) +static int spi_flash_cmd_erase_ops(struct mtd_info *mtd, + struct erase_info *instr) { - u32 erase_size, erase_addr; + struct spi_flash *flash = mtd->priv; + u32 offset, len, erase_addr; u8 cmd[SPI_FLASH_CMD_LEN]; int ret = -1;
- erase_size = mtd->erasesize; - if (offset % erase_size || len % erase_size) { - debug("SF: Erase offset/length not multiple of erase size\n"); - return -1; - } + offset = instr->addr; + len = instr->len;
cmd[0] = flash->erase_cmd; while (len) { @@ -330,19 +328,24 @@ static int spi_flash_cmd_erase_ops(struct spi_flash *flash, u32 offset, ret = spi_flash_write_common(flash, cmd, sizeof(cmd), NULL, 0); if (ret < 0) { debug("SF: erase failed\n"); - break; + goto erase_err; }
- offset += erase_size; - len -= erase_size; + offset += mtd->erasesize; + len -= mtd->erasesize; }
return ret; + +erase_err: + instr->state = MTD_ERASE_FAILED; + return ret; }
-static int spi_flash_cmd_write_ops(struct spi_flash *flash, u32 offset, - size_t len, const void *buf) +static int spi_flash_cmd_write_ops(struct mtd_info *mtd, loff_t offset, + size_t len, size_t *retlen, const u_char *buf) { + struct spi_flash *flash = mtd->priv; unsigned long byte_addr, page_size; u32 write_addr; size_t chunk_len, actual; @@ -384,6 +387,7 @@ static int spi_flash_cmd_write_ops(struct spi_flash *flash, u32 offset, }
offset += chunk_len; + *retlen += chunk_len; }
return ret; @@ -417,11 +421,12 @@ void __weak spi_flash_copy_mmap(void *data, void *offset, size_t len) memcpy(data, offset, len); }
-static int spi_flash_cmd_read_ops(struct spi_flash *flash, u32 offset, - size_t len, void *data) +static int spi_flash_cmd_read_ops(struct mtd_info *mtd, loff_t offset, + size_t len, size_t *retlen, u_char *data) { - u8 *cmd, cmdsz; + struct spi_flash *flash = mtd->priv; u32 remain_len, read_len, read_addr; + u8 *cmd, cmdsz; int bank_sel = 0; int ret = -1;
@@ -478,6 +483,7 @@ static int spi_flash_cmd_read_ops(struct spi_flash *flash, u32 offset, offset += read_len; len -= read_len; data += read_len; + *retlen += read_len; }
free(cmd); @@ -485,7 +491,8 @@ static int spi_flash_cmd_read_ops(struct spi_flash *flash, u32 offset, }
#ifdef CONFIG_SPI_FLASH_SST -static int sst_byte_write(struct spi_flash *flash, u32 offset, const void *buf) +static int sst_byte_write(struct spi_flash *flash, u32 offset, + const void *buf, size_t *retlen) { int ret; u8 cmd[4] = { @@ -506,12 +513,15 @@ static int sst_byte_write(struct spi_flash *flash, u32 offset, const void *buf) if (ret) return ret;
+ *retlen += 1; + return spi_flash_cmd_wait_ready(flash, SPI_FLASH_PROG_TIMEOUT); }
-static int sst_write_wp(struct spi_flash *flash, u32 offset, size_t len, - const void *buf) +static int sst_write_wp(struct mtd_info *mtd, loff_t offset, size_t len, + size_t *retlen, const u_char *buf) { + struct spi_flash *flash = mtd->priv; size_t actual, cmd_len; int ret; u8 cmd[4]; @@ -525,7 +535,7 @@ static int sst_write_wp(struct spi_flash *flash, u32 offset, size_t len, /* If the data is not word aligned, write out leading single byte */ actual = offset % 2; if (actual) { - ret = sst_byte_write(flash, offset, buf); + ret = sst_byte_write(flash, offset, buf, retlen); if (ret) goto done; } @@ -542,7 +552,7 @@ static int sst_write_wp(struct spi_flash *flash, u32 offset, size_t len, cmd[3] = offset;
for (; actual < len - 1; actual += 2) { - debug("WP[%02x]: 0x%p => cmd = { 0x%02x 0x%06x }\n", + debug("WP[%02x]: 0x%p => cmd = { 0x%02x 0x%06llx }\n", spi_w8r8(flash->spi, CMD_READ_STATUS), buf + actual, cmd[0], offset);
@@ -559,6 +569,7 @@ static int sst_write_wp(struct spi_flash *flash, u32 offset, size_t len,
cmd_len = 1; offset += 2; + *retlen += 2; }
if (!ret) @@ -566,19 +577,20 @@ static int sst_write_wp(struct spi_flash *flash, u32 offset, size_t len,
/* If there is a single trailing byte, write it out */ if (!ret && actual != len) - ret = sst_byte_write(flash, offset, buf + actual); + ret = sst_byte_write(flash, offset, buf + actual, retlen);
done: - debug("SF: sst: program %s %zu bytes @ 0x%zx\n", + debug("SF: sst: program %s %zu bytes @ 0x%llx\n", ret ? "failure" : "success", len, offset - actual);
spi_release_bus(flash->spi); return ret; }
-static int sst_write_bp(struct spi_flash *flash, u32 offset, size_t len, - const void *buf) +static int sst_write_bp(struct mtd_info *mtd, loff_t offset, size_t len, + size_t *retlen, const u_char *buf) { + struct spi_flash *flash = mtd->priv; size_t actual; int ret;
@@ -589,7 +601,7 @@ static int sst_write_bp(struct spi_flash *flash, u32 offset, size_t len, }
for (actual = 0; actual < len; actual++) { - ret = sst_byte_write(flash, offset, buf + actual); + ret = sst_byte_write(flash, offset, buf + actual, retlen); if (ret) { debug("SF: sst byte program failed\n"); break; @@ -600,7 +612,7 @@ static int sst_write_bp(struct spi_flash *flash, u32 offset, size_t len, if (!ret) ret = spi_flash_cmd_write_disable(flash);
- debug("SF: sst: program %s %zu bytes @ 0x%zx\n", + debug("SF: sst: program %s %zu bytes @ 0x%llx\n", ret ? "failure" : "success", len, offset - actual);
spi_release_bus(flash->spi); diff --git a/include/spi_flash.h b/include/spi_flash.h index d0af8d3..fe03b8d 100644 --- a/include/spi_flash.h +++ b/include/spi_flash.h @@ -55,13 +55,6 @@ struct spi_slave; * @dummy_byte: Dummy cycles for read operation. * @memory_map: Address of read-only SPI flash access * @priv: the private data - * @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 mtd_info *mtd; @@ -88,10 +81,6 @@ struct spi_flash {
void *memory_map; void *priv; - 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); };
struct dm_spi_flash_ops { @@ -156,19 +145,26 @@ int spi_flash_remove(struct udevice *flash); static inline int spi_flash_read(struct spi_flash *flash, u32 offset, size_t len, void *buf) { - return spi_flash_read_dm(flash->dev, offset, len, buf); + return mtd_read(flash->mtd, offset, len, &len, (u_char *)buf); }
static inline int spi_flash_write(struct spi_flash *flash, u32 offset, size_t len, const void *buf) { - return spi_flash_write_dm(flash->dev, offset, len, buf); + return mtd_write(flash->mtd, offset, len, &len, (u_char *)buf); }
static inline int spi_flash_erase(struct spi_flash *flash, u32 offset, size_t len) { - return spi_flash_erase_dm(flash->dev, offset, len); + struct erase_info instr; + + instr.mtd = flash->mtd; + instr.addr = offset; + instr.len = len; + instr.callback = 0; + + return mtd_erase(flash->mtd, &instr); }
struct sandbox_state;

Hello Jagan,
Am 12.10.2015 um 21:54 schrieb Jagan Teki:
Since MTD support is added in spi_flash layer, this patch uses mtd_info operations instead of legacy spi_flash operations.
Signed-off-by: Jagan Teki jteki@openedev.com
drivers/mtd/spi/sf_ops.c | 66 ++++++++++++++++++++++++++++-------------------- include/spi_flash.h | 24 ++++++++---------- 2 files changed, 49 insertions(+), 41 deletions(-)
Reviewed-by: Heiko Schocher hs@denx.de
bye, Heiko
diff --git a/drivers/mtd/spi/sf_ops.c b/drivers/mtd/spi/sf_ops.c index f5ee376..d10ca45 100644 --- a/drivers/mtd/spi/sf_ops.c +++ b/drivers/mtd/spi/sf_ops.c @@ -296,18 +296,16 @@ int spi_flash_write_common(struct spi_flash *flash, const u8 *cmd, return ret; }
-static int spi_flash_cmd_erase_ops(struct spi_flash *flash, u32 offset,
size_t len)
+static int spi_flash_cmd_erase_ops(struct mtd_info *mtd,
{struct erase_info *instr)
- u32 erase_size, erase_addr;
- struct spi_flash *flash = mtd->priv;
- u32 offset, len, erase_addr; u8 cmd[SPI_FLASH_CMD_LEN]; int ret = -1;
- erase_size = mtd->erasesize;
- if (offset % erase_size || len % erase_size) {
debug("SF: Erase offset/length not multiple of erase size\n");
return -1;
- }
offset = instr->addr;
len = instr->len;
cmd[0] = flash->erase_cmd; while (len) {
@@ -330,19 +328,24 @@ static int spi_flash_cmd_erase_ops(struct spi_flash *flash, u32 offset, ret = spi_flash_write_common(flash, cmd, sizeof(cmd), NULL, 0); if (ret < 0) { debug("SF: erase failed\n");
break;
}goto erase_err;
offset += erase_size;
len -= erase_size;
offset += mtd->erasesize;
len -= mtd->erasesize;
}
return ret;
+erase_err:
- instr->state = MTD_ERASE_FAILED;
- return ret; }
-static int spi_flash_cmd_write_ops(struct spi_flash *flash, u32 offset,
size_t len, const void *buf)
+static int spi_flash_cmd_write_ops(struct mtd_info *mtd, loff_t offset,
{size_t len, size_t *retlen, const u_char *buf)
- struct spi_flash *flash = mtd->priv; unsigned long byte_addr, page_size; u32 write_addr; size_t chunk_len, actual;
@@ -384,6 +387,7 @@ static int spi_flash_cmd_write_ops(struct spi_flash *flash, u32 offset, }
offset += chunk_len;
*retlen += chunk_len;
}
return ret;
@@ -417,11 +421,12 @@ void __weak spi_flash_copy_mmap(void *data, void *offset, size_t len) memcpy(data, offset, len); }
-static int spi_flash_cmd_read_ops(struct spi_flash *flash, u32 offset,
size_t len, void *data)
+static int spi_flash_cmd_read_ops(struct mtd_info *mtd, loff_t offset,
{size_t len, size_t *retlen, u_char *data)
- u8 *cmd, cmdsz;
- struct spi_flash *flash = mtd->priv; u32 remain_len, read_len, read_addr;
- u8 *cmd, cmdsz; int bank_sel = 0; int ret = -1;
@@ -478,6 +483,7 @@ static int spi_flash_cmd_read_ops(struct spi_flash *flash, u32 offset, offset += read_len; len -= read_len; data += read_len;
*retlen += read_len;
}
free(cmd);
@@ -485,7 +491,8 @@ static int spi_flash_cmd_read_ops(struct spi_flash *flash, u32 offset, }
#ifdef CONFIG_SPI_FLASH_SST -static int sst_byte_write(struct spi_flash *flash, u32 offset, const void *buf) +static int sst_byte_write(struct spi_flash *flash, u32 offset,
{ int ret; u8 cmd[4] = {const void *buf, size_t *retlen)
@@ -506,12 +513,15 @@ static int sst_byte_write(struct spi_flash *flash, u32 offset, const void *buf) if (ret) return ret;
- *retlen += 1;
- return spi_flash_cmd_wait_ready(flash, SPI_FLASH_PROG_TIMEOUT); }
-static int sst_write_wp(struct spi_flash *flash, u32 offset, size_t len,
const void *buf)
+static int sst_write_wp(struct mtd_info *mtd, loff_t offset, size_t len,
{size_t *retlen, const u_char *buf)
- struct spi_flash *flash = mtd->priv; size_t actual, cmd_len; int ret; u8 cmd[4];
@@ -525,7 +535,7 @@ static int sst_write_wp(struct spi_flash *flash, u32 offset, size_t len, /* If the data is not word aligned, write out leading single byte */ actual = offset % 2; if (actual) {
ret = sst_byte_write(flash, offset, buf);
if (ret) goto done; }ret = sst_byte_write(flash, offset, buf, retlen);
@@ -542,7 +552,7 @@ static int sst_write_wp(struct spi_flash *flash, u32 offset, size_t len, cmd[3] = offset;
for (; actual < len - 1; actual += 2) {
debug("WP[%02x]: 0x%p => cmd = { 0x%02x 0x%06x }\n",
debug("WP[%02x]: 0x%p => cmd = { 0x%02x 0x%06llx }\n", spi_w8r8(flash->spi, CMD_READ_STATUS), buf + actual, cmd[0], offset);
@@ -559,6 +569,7 @@ static int sst_write_wp(struct spi_flash *flash, u32 offset, size_t len,
cmd_len = 1; offset += 2;
*retlen += 2;
}
if (!ret)
@@ -566,19 +577,20 @@ static int sst_write_wp(struct spi_flash *flash, u32 offset, size_t len,
/* If there is a single trailing byte, write it out */ if (!ret && actual != len)
ret = sst_byte_write(flash, offset, buf + actual);
ret = sst_byte_write(flash, offset, buf + actual, retlen);
done:
- debug("SF: sst: program %s %zu bytes @ 0x%zx\n",
debug("SF: sst: program %s %zu bytes @ 0x%llx\n", ret ? "failure" : "success", len, offset - actual);
spi_release_bus(flash->spi); return ret; }
-static int sst_write_bp(struct spi_flash *flash, u32 offset, size_t len,
const void *buf)
+static int sst_write_bp(struct mtd_info *mtd, loff_t offset, size_t len,
{size_t *retlen, const u_char *buf)
- struct spi_flash *flash = mtd->priv; size_t actual; int ret;
@@ -589,7 +601,7 @@ static int sst_write_bp(struct spi_flash *flash, u32 offset, size_t len, }
for (actual = 0; actual < len; actual++) {
ret = sst_byte_write(flash, offset, buf + actual);
if (ret) { debug("SF: sst byte program failed\n"); break;ret = sst_byte_write(flash, offset, buf + actual, retlen);
@@ -600,7 +612,7 @@ static int sst_write_bp(struct spi_flash *flash, u32 offset, size_t len, if (!ret) ret = spi_flash_cmd_write_disable(flash);
- debug("SF: sst: program %s %zu bytes @ 0x%zx\n",
debug("SF: sst: program %s %zu bytes @ 0x%llx\n", ret ? "failure" : "success", len, offset - actual);
spi_release_bus(flash->spi);
diff --git a/include/spi_flash.h b/include/spi_flash.h index d0af8d3..fe03b8d 100644 --- a/include/spi_flash.h +++ b/include/spi_flash.h @@ -55,13 +55,6 @@ struct spi_slave;
- @dummy_byte: Dummy cycles for read operation.
- @memory_map: Address of read-only SPI flash access
- @priv: the private data
- @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
*/ struct spi_flash { struct mtd_info *mtd;
- return 0 - Success, 1 - Failure
@@ -88,10 +81,6 @@ struct spi_flash {
void *memory_map; void *priv;
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); };
struct dm_spi_flash_ops {
@@ -156,19 +145,26 @@ int spi_flash_remove(struct udevice *flash); static inline int spi_flash_read(struct spi_flash *flash, u32 offset, size_t len, void *buf) {
- return spi_flash_read_dm(flash->dev, offset, len, buf);
return mtd_read(flash->mtd, offset, len, &len, (u_char *)buf); }
static inline int spi_flash_write(struct spi_flash *flash, u32 offset, size_t len, const void *buf) {
- return spi_flash_write_dm(flash->dev, offset, len, buf);
return mtd_write(flash->mtd, offset, len, &len, (u_char *)buf); }
static inline int spi_flash_erase(struct spi_flash *flash, u32 offset, size_t len) {
- return spi_flash_erase_dm(flash->dev, offset, len);
struct erase_info instr;
instr.mtd = flash->mtd;
instr.addr = offset;
instr.len = len;
instr.callback = 0;
return mtd_erase(flash->mtd, &instr); }
struct sandbox_state;

Since mtd got added, replace flash->size with mtd->size.
Signed-off-by: Jagan Teki jteki@openedev.com --- common/cmd_sf.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/common/cmd_sf.c b/common/cmd_sf.c index ac7f5df..a501376 100644 --- a/common/cmd_sf.c +++ b/common/cmd_sf.c @@ -275,13 +275,13 @@ static int do_spi_flash_read_write(int argc, char * const argv[]) return -1;
if (mtd_arg_off_size(argc - 2, &argv[2], &dev, &offset, &len, - &maxsize, MTD_DEV_TYPE_NOR, flash->size)) + &maxsize, MTD_DEV_TYPE_NOR, flash->mtd->size)) return -1;
/* Consistency checking */ - if (offset + len > flash->size) { - printf("ERROR: attempting %s past flash size (%#x)\n", - argv[0], flash->size); + if (offset + len > flash->mtd->size) { + printf("ERROR: attempting %s past flash size (0x%llx)\n", + argv[0], flash->mtd->size); return 1; }
@@ -327,7 +327,7 @@ static int do_spi_flash_erase(int argc, char * const argv[]) return -1;
if (mtd_arg_off(argv[1], &dev, &offset, &len, &maxsize, - MTD_DEV_TYPE_NOR, flash->size)) + MTD_DEV_TYPE_NOR, flash->mtd->size)) return -1;
ret = sf_parse_len_arg(argv[2], &size); @@ -335,9 +335,9 @@ static int do_spi_flash_erase(int argc, char * const argv[]) return -1;
/* Consistency checking */ - if (offset + size > flash->size) { - printf("ERROR: attempting %s past flash size (%#x)\n", - argv[0], flash->size); + if (offset + size > flash->mtd->size) { + printf("ERROR: attempting %s past flash size (0x%llx)\n", + argv[0], flash->mtd->size); return 1; }

Hello Jagan,
Am 12.10.2015 um 21:54 schrieb Jagan Teki:
Since mtd got added, replace flash->size with mtd->size.
Signed-off-by: Jagan Teki jteki@openedev.com
common/cmd_sf.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
Reviewed-by: Heiko Schocher hs@denx.de
bye, Heiko
diff --git a/common/cmd_sf.c b/common/cmd_sf.c index ac7f5df..a501376 100644 --- a/common/cmd_sf.c +++ b/common/cmd_sf.c @@ -275,13 +275,13 @@ static int do_spi_flash_read_write(int argc, char * const argv[]) return -1;
if (mtd_arg_off_size(argc - 2, &argv[2], &dev, &offset, &len,
&maxsize, MTD_DEV_TYPE_NOR, flash->size))
&maxsize, MTD_DEV_TYPE_NOR, flash->mtd->size))
return -1;
/* Consistency checking */
- if (offset + len > flash->size) {
printf("ERROR: attempting %s past flash size (%#x)\n",
argv[0], flash->size);
- if (offset + len > flash->mtd->size) {
printf("ERROR: attempting %s past flash size (0x%llx)\n",
return 1; }argv[0], flash->mtd->size);
@@ -327,7 +327,7 @@ static int do_spi_flash_erase(int argc, char * const argv[]) return -1;
if (mtd_arg_off(argv[1], &dev, &offset, &len, &maxsize,
MTD_DEV_TYPE_NOR, flash->size))
MTD_DEV_TYPE_NOR, flash->mtd->size))
return -1;
ret = sf_parse_len_arg(argv[2], &size);
@@ -335,9 +335,9 @@ static int do_spi_flash_erase(int argc, char * const argv[]) return -1;
/* Consistency checking */
- if (offset + size > flash->size) {
printf("ERROR: attempting %s past flash size (%#x)\n",
argv[0], flash->size);
- if (offset + size > flash->mtd->size) {
printf("ERROR: attempting %s past flash size (0x%llx)\n",
return 1; }argv[0], flash->mtd->size);

Since mtd_info ops got introduced, just drop the unneeded dm_spi_flash operations.
Signed-off-by: Jagan Teki jteki@openedev.com --- drivers/mtd/spi/sf-uclass.c | 16 -------- drivers/mtd/spi/sf_probe.c | 30 --------------- include/spi_flash.h | 91 +++++++-------------------------------------- 3 files changed, 14 insertions(+), 123 deletions(-)
diff --git a/drivers/mtd/spi/sf-uclass.c b/drivers/mtd/spi/sf-uclass.c index 350e21a..5cdbd1b 100644 --- a/drivers/mtd/spi/sf-uclass.c +++ b/drivers/mtd/spi/sf-uclass.c @@ -11,22 +11,6 @@ #include <dm/device-internal.h> #include "sf_internal.h"
-int spi_flash_read_dm(struct udevice *dev, u32 offset, size_t len, void *buf) -{ - return sf_get_ops(dev)->read(dev, offset, len, buf); -} - -int spi_flash_write_dm(struct udevice *dev, u32 offset, size_t len, - const void *buf) -{ - return sf_get_ops(dev)->write(dev, offset, len, buf); -} - -int spi_flash_erase_dm(struct udevice *dev, u32 offset, size_t len) -{ - return sf_get_ops(dev)->erase(dev, offset, len); -} - /* * TODO(sjg@chromium.org): This is an old-style function. We should remove * it when all SPI flash drivers use dm diff --git a/drivers/mtd/spi/sf_probe.c b/drivers/mtd/spi/sf_probe.c index b8704e2..5e314e2 100644 --- a/drivers/mtd/spi/sf_probe.c +++ b/drivers/mtd/spi/sf_probe.c @@ -104,29 +104,6 @@ void spi_flash_free(struct spi_flash *flash)
#else /* defined CONFIG_DM_SPI_FLASH */
-static int spi_flash_std_read(struct udevice *dev, u32 offset, size_t len, - void *buf) -{ - struct spi_flash *flash = dev_get_uclass_priv(dev); - - return flash->read(flash, offset, len, buf); -} - -int spi_flash_std_write(struct udevice *dev, u32 offset, size_t len, - const void *buf) -{ - struct spi_flash *flash = dev_get_uclass_priv(dev); - - return flash->write(flash, offset, len, buf); -} - -int spi_flash_std_erase(struct udevice *dev, u32 offset, size_t len) -{ - struct spi_flash *flash = dev_get_uclass_priv(dev); - - return flash->erase(flash, offset, len); -} - int spi_flash_std_probe(struct udevice *dev) { struct spi_flash_priv *priv = dev_get_uclass_priv(dev); @@ -171,12 +148,6 @@ err_scan: return ret; }
-static const struct dm_spi_flash_ops spi_flash_std_ops = { - .read = spi_flash_std_read, - .write = spi_flash_std_write, - .erase = spi_flash_std_erase, -}; - static const struct udevice_id spi_flash_std_ids[] = { { .compatible = "spi-flash" }, { } @@ -188,7 +159,6 @@ U_BOOT_DRIVER(spi_flash_std) = { .of_match = spi_flash_std_ids, .probe = spi_flash_std_probe, .priv_auto_alloc_size = sizeof(struct spi_flash_priv), - .ops = &spi_flash_std_ops, };
#endif /* CONFIG_DM_SPI_FLASH */ diff --git a/include/spi_flash.h b/include/spi_flash.h index fe03b8d..8dd000d 100644 --- a/include/spi_flash.h +++ b/include/spi_flash.h @@ -83,52 +83,7 @@ struct spi_flash { void *priv; };
-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); -}; - -/* 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 -/** - * 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); - int spi_flash_probe_bus_cs(unsigned int busnum, unsigned int cs, unsigned int max_hz, unsigned int spi_mode, struct udevice **devp); @@ -142,31 +97,6 @@ void spi_flash_free(struct spi_flash *flash);
int spi_flash_remove(struct udevice *flash);
-static inline int spi_flash_read(struct spi_flash *flash, u32 offset, - size_t len, void *buf) -{ - return mtd_read(flash->mtd, offset, len, &len, (u_char *)buf); -} - -static inline int spi_flash_write(struct spi_flash *flash, u32 offset, - size_t len, const void *buf) -{ - return mtd_write(flash->mtd, offset, len, &len, (u_char *)buf); -} - -static inline int spi_flash_erase(struct spi_flash *flash, u32 offset, - size_t len) -{ - struct erase_info instr; - - instr.mtd = flash->mtd; - instr.addr = offset; - instr.len = len; - instr.callback = 0; - - return mtd_erase(flash->mtd, &instr); -} - struct sandbox_state;
int sandbox_sf_bind_emul(struct sandbox_state *state, int busnum, int cs, @@ -191,25 +121,32 @@ struct spi_flash *spi_flash_probe_fdt(const void *blob, int slave_node, int spi_node);
void spi_flash_free(struct spi_flash *flash); +#endif
static inline int spi_flash_read(struct spi_flash *flash, u32 offset, - size_t len, void *buf) + size_t len, void *buf) { - return flash->read(flash, offset, len, buf); + return mtd_read(flash->mtd, offset, len, &len, (u_char *)buf); }
static inline int spi_flash_write(struct spi_flash *flash, u32 offset, - size_t len, const void *buf) + size_t len, const void *buf) { - return flash->write(flash, offset, len, buf); + return mtd_write(flash->mtd, offset, len, &len, (u_char *)buf); }
static inline int spi_flash_erase(struct spi_flash *flash, u32 offset, - size_t len) + size_t len) { - return flash->erase(flash, offset, len); + struct erase_info instr; + + instr.mtd = flash->mtd; + instr.addr = offset; + instr.len = len; + instr.callback = 0; + + return mtd_erase(flash->mtd, &instr); } -#endif
void spi_boot(void) __noreturn; void spi_spl_load_image(uint32_t offs, unsigned int size, void *vdst);

Hello Jagan,
Am 12.10.2015 um 21:54 schrieb Jagan Teki:
Since mtd_info ops got introduced, just drop the unneeded dm_spi_flash operations.
Signed-off-by: Jagan Teki jteki@openedev.com
drivers/mtd/spi/sf-uclass.c | 16 -------- drivers/mtd/spi/sf_probe.c | 30 --------------- include/spi_flash.h | 91 +++++++-------------------------------------- 3 files changed, 14 insertions(+), 123 deletions(-)
Does this not break: drivers/mtd/spi/sf-uclass.c ?
added simon to cc.
bye, Heiko
diff --git a/drivers/mtd/spi/sf-uclass.c b/drivers/mtd/spi/sf-uclass.c index 350e21a..5cdbd1b 100644 --- a/drivers/mtd/spi/sf-uclass.c +++ b/drivers/mtd/spi/sf-uclass.c @@ -11,22 +11,6 @@ #include <dm/device-internal.h> #include "sf_internal.h"
-int spi_flash_read_dm(struct udevice *dev, u32 offset, size_t len, void *buf) -{
- return sf_get_ops(dev)->read(dev, offset, len, buf);
-}
-int spi_flash_write_dm(struct udevice *dev, u32 offset, size_t len,
const void *buf)
-{
- return sf_get_ops(dev)->write(dev, offset, len, buf);
-}
-int spi_flash_erase_dm(struct udevice *dev, u32 offset, size_t len) -{
- return sf_get_ops(dev)->erase(dev, offset, len);
-}
- /*
- TODO(sjg@chromium.org): This is an old-style function. We should remove
- it when all SPI flash drivers use dm
diff --git a/drivers/mtd/spi/sf_probe.c b/drivers/mtd/spi/sf_probe.c index b8704e2..5e314e2 100644 --- a/drivers/mtd/spi/sf_probe.c +++ b/drivers/mtd/spi/sf_probe.c @@ -104,29 +104,6 @@ void spi_flash_free(struct spi_flash *flash)
#else /* defined CONFIG_DM_SPI_FLASH */
-static int spi_flash_std_read(struct udevice *dev, u32 offset, size_t len,
void *buf)
-{
- struct spi_flash *flash = dev_get_uclass_priv(dev);
- return flash->read(flash, offset, len, buf);
-}
-int spi_flash_std_write(struct udevice *dev, u32 offset, size_t len,
const void *buf)
-{
- struct spi_flash *flash = dev_get_uclass_priv(dev);
- return flash->write(flash, offset, len, buf);
-}
-int spi_flash_std_erase(struct udevice *dev, u32 offset, size_t len) -{
- struct spi_flash *flash = dev_get_uclass_priv(dev);
- return flash->erase(flash, offset, len);
-}
- int spi_flash_std_probe(struct udevice *dev) { struct spi_flash_priv *priv = dev_get_uclass_priv(dev);
@@ -171,12 +148,6 @@ err_scan: return ret; }
-static const struct dm_spi_flash_ops spi_flash_std_ops = {
- .read = spi_flash_std_read,
- .write = spi_flash_std_write,
- .erase = spi_flash_std_erase,
-};
- static const struct udevice_id spi_flash_std_ids[] = { { .compatible = "spi-flash" }, { }
@@ -188,7 +159,6 @@ U_BOOT_DRIVER(spi_flash_std) = { .of_match = spi_flash_std_ids, .probe = spi_flash_std_probe, .priv_auto_alloc_size = sizeof(struct spi_flash_priv),
.ops = &spi_flash_std_ops, };
#endif /* CONFIG_DM_SPI_FLASH */
diff --git a/include/spi_flash.h b/include/spi_flash.h index fe03b8d..8dd000d 100644 --- a/include/spi_flash.h +++ b/include/spi_flash.h @@ -83,52 +83,7 @@ struct spi_flash { void *priv; };
-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);
-};
-/* 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
-/**
- 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);
- int spi_flash_probe_bus_cs(unsigned int busnum, unsigned int cs, unsigned int max_hz, unsigned int spi_mode, struct udevice **devp);
@@ -142,31 +97,6 @@ void spi_flash_free(struct spi_flash *flash);
int spi_flash_remove(struct udevice *flash);
-static inline int spi_flash_read(struct spi_flash *flash, u32 offset,
size_t len, void *buf)
-{
- return mtd_read(flash->mtd, offset, len, &len, (u_char *)buf);
-}
-static inline int spi_flash_write(struct spi_flash *flash, u32 offset,
size_t len, const void *buf)
-{
- return mtd_write(flash->mtd, offset, len, &len, (u_char *)buf);
-}
-static inline int spi_flash_erase(struct spi_flash *flash, u32 offset,
size_t len)
-{
- struct erase_info instr;
- instr.mtd = flash->mtd;
- instr.addr = offset;
- instr.len = len;
- instr.callback = 0;
- return mtd_erase(flash->mtd, &instr);
-}
struct sandbox_state;
int sandbox_sf_bind_emul(struct sandbox_state *state, int busnum, int cs,
@@ -191,25 +121,32 @@ struct spi_flash *spi_flash_probe_fdt(const void *blob, int slave_node, int spi_node);
void spi_flash_free(struct spi_flash *flash); +#endif
static inline int spi_flash_read(struct spi_flash *flash, u32 offset,
size_t len, void *buf)
{size_t len, void *buf)
- return flash->read(flash, offset, len, buf);
return mtd_read(flash->mtd, offset, len, &len, (u_char *)buf); }
static inline int spi_flash_write(struct spi_flash *flash, u32 offset,
size_t len, const void *buf)
{size_t len, const void *buf)
- return flash->write(flash, offset, len, buf);
return mtd_write(flash->mtd, offset, len, &len, (u_char *)buf); }
static inline int spi_flash_erase(struct spi_flash *flash, u32 offset,
size_t len)
{size_t len)
- return flash->erase(flash, offset, len);
- struct erase_info instr;
- instr.mtd = flash->mtd;
- instr.addr = offset;
- instr.len = len;
- instr.callback = 0;
- return mtd_erase(flash->mtd, &instr); }
-#endif
void spi_boot(void) __noreturn; void spi_spl_load_image(uint32_t offs, unsigned int size, void *vdst);

Hi Heiko,
On 29 October 2015 at 12:05, Heiko Schocher hs@denx.de wrote:
Hello Jagan,
Am 12.10.2015 um 21:54 schrieb Jagan Teki:
Since mtd_info ops got introduced, just drop the unneeded dm_spi_flash operations.
Signed-off-by: Jagan Teki jteki@openedev.com
drivers/mtd/spi/sf-uclass.c | 16 -------- drivers/mtd/spi/sf_probe.c | 30 --------------- include/spi_flash.h | 91 +++++++-------------------------------------- 3 files changed, 14 insertions(+), 123 deletions(-)
Does this not break: drivers/mtd/spi/sf-uclass.c ?
This wouldn't break the dm because mtd_info ops are common to dm or non-dm spi-flash which I tuned in this series[1] That means the tuned sf series is prior to this MTD.
added simon to cc.
diff --git a/drivers/mtd/spi/sf-uclass.c b/drivers/mtd/spi/sf-uclass.c index 350e21a..5cdbd1b 100644 --- a/drivers/mtd/spi/sf-uclass.c +++ b/drivers/mtd/spi/sf-uclass.c @@ -11,22 +11,6 @@ #include <dm/device-internal.h> #include "sf_internal.h"
-int spi_flash_read_dm(struct udevice *dev, u32 offset, size_t len, void *buf) -{
return sf_get_ops(dev)->read(dev, offset, len, buf);
-}
-int spi_flash_write_dm(struct udevice *dev, u32 offset, size_t len,
const void *buf)
-{
return sf_get_ops(dev)->write(dev, offset, len, buf);
-}
-int spi_flash_erase_dm(struct udevice *dev, u32 offset, size_t len) -{
return sf_get_ops(dev)->erase(dev, offset, len);
-}
- /*
- TODO(sjg@chromium.org): This is an old-style function. We should
remove
- it when all SPI flash drivers use dm
diff --git a/drivers/mtd/spi/sf_probe.c b/drivers/mtd/spi/sf_probe.c index b8704e2..5e314e2 100644 --- a/drivers/mtd/spi/sf_probe.c +++ b/drivers/mtd/spi/sf_probe.c @@ -104,29 +104,6 @@ void spi_flash_free(struct spi_flash *flash)
#else /* defined CONFIG_DM_SPI_FLASH */
-static int spi_flash_std_read(struct udevice *dev, u32 offset, size_t len,
void *buf)
-{
struct spi_flash *flash = dev_get_uclass_priv(dev);
return flash->read(flash, offset, len, buf);
-}
-int spi_flash_std_write(struct udevice *dev, u32 offset, size_t len,
const void *buf)
-{
struct spi_flash *flash = dev_get_uclass_priv(dev);
return flash->write(flash, offset, len, buf);
-}
-int spi_flash_std_erase(struct udevice *dev, u32 offset, size_t len) -{
struct spi_flash *flash = dev_get_uclass_priv(dev);
return flash->erase(flash, offset, len);
-}
- int spi_flash_std_probe(struct udevice *dev) { struct spi_flash_priv *priv = dev_get_uclass_priv(dev);
@@ -171,12 +148,6 @@ err_scan: return ret; }
-static const struct dm_spi_flash_ops spi_flash_std_ops = {
.read = spi_flash_std_read,
.write = spi_flash_std_write,
.erase = spi_flash_std_erase,
-};
- static const struct udevice_id spi_flash_std_ids[] = { { .compatible = "spi-flash" }, { }
@@ -188,7 +159,6 @@ U_BOOT_DRIVER(spi_flash_std) = { .of_match = spi_flash_std_ids, .probe = spi_flash_std_probe, .priv_auto_alloc_size = sizeof(struct spi_flash_priv),
.ops = &spi_flash_std_ops,
};
#endif /* CONFIG_DM_SPI_FLASH */
diff --git a/include/spi_flash.h b/include/spi_flash.h index fe03b8d..8dd000d 100644 --- a/include/spi_flash.h +++ b/include/spi_flash.h @@ -83,52 +83,7 @@ struct spi_flash { void *priv; };
-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);
-};
-/* 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
-/**
- 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);
- int spi_flash_probe_bus_cs(unsigned int busnum, unsigned int cs, unsigned int max_hz, unsigned int spi_mode, struct udevice **devp);
@@ -142,31 +97,6 @@ void spi_flash_free(struct spi_flash *flash);
int spi_flash_remove(struct udevice *flash);
-static inline int spi_flash_read(struct spi_flash *flash, u32 offset,
size_t len, void *buf)
-{
return mtd_read(flash->mtd, offset, len, &len, (u_char *)buf);
-}
-static inline int spi_flash_write(struct spi_flash *flash, u32 offset,
size_t len, const void *buf)
-{
return mtd_write(flash->mtd, offset, len, &len, (u_char *)buf);
-}
-static inline int spi_flash_erase(struct spi_flash *flash, u32 offset,
size_t len)
-{
struct erase_info instr;
instr.mtd = flash->mtd;
instr.addr = offset;
instr.len = len;
instr.callback = 0;
return mtd_erase(flash->mtd, &instr);
-}
struct sandbox_state;
int sandbox_sf_bind_emul(struct sandbox_state *state, int busnum, int
cs, @@ -191,25 +121,32 @@ struct spi_flash *spi_flash_probe_fdt(const void *blob, int slave_node, int spi_node);
void spi_flash_free(struct spi_flash *flash); +#endif
static inline int spi_flash_read(struct spi_flash *flash, u32 offset,
size_t len, void *buf)
{size_t len, void *buf)
return flash->read(flash, offset, len, buf);
return mtd_read(flash->mtd, offset, len, &len, (u_char *)buf);
}
static inline int spi_flash_write(struct spi_flash *flash, u32 offset,
size_t len, const void *buf)
{size_t len, const void *buf)
return flash->write(flash, offset, len, buf);
return mtd_write(flash->mtd, offset, len, &len, (u_char *)buf);
}
static inline int spi_flash_erase(struct spi_flash *flash, u32 offset,
size_t len)
{size_t len)
return flash->erase(flash, offset, len);
struct erase_info instr;
instr.mtd = flash->mtd;
instr.addr = offset;
instr.len = len;
instr.callback = 0;
}return mtd_erase(flash->mtd, &instr);
-#endif
void spi_boot(void) __noreturn; void spi_spl_load_image(uint32_t offs, unsigned int size, void *vdst);
[1] https://www.mail-archive.com/u-boot@lists.denx.de/msg190086.html

Hi Jagan,
On 29 October 2015 at 07:11, Jagan Teki jteki@openedev.com wrote:
Hi Heiko,
On 29 October 2015 at 12:05, Heiko Schocher hs@denx.de wrote:
Hello Jagan,
Am 12.10.2015 um 21:54 schrieb Jagan Teki:
Since mtd_info ops got introduced, just drop the unneeded dm_spi_flash operations.
Signed-off-by: Jagan Teki jteki@openedev.com
drivers/mtd/spi/sf-uclass.c | 16 -------- drivers/mtd/spi/sf_probe.c | 30 --------------- include/spi_flash.h | 91 +++++++-------------------------------------- 3 files changed, 14 insertions(+), 123 deletions(-)
Does this not break: drivers/mtd/spi/sf-uclass.c ?
This wouldn't break the dm because mtd_info ops are common to dm or non-dm spi-flash which I tuned in this series[1] That means the tuned sf series is prior to this MTD.
added simon to cc.
diff --git a/drivers/mtd/spi/sf-uclass.c b/drivers/mtd/spi/sf-uclass.c index 350e21a..5cdbd1b 100644 --- a/drivers/mtd/spi/sf-uclass.c +++ b/drivers/mtd/spi/sf-uclass.c @@ -11,22 +11,6 @@ #include <dm/device-internal.h> #include "sf_internal.h"
-int spi_flash_read_dm(struct udevice *dev, u32 offset, size_t len, void *buf) -{
return sf_get_ops(dev)->read(dev, offset, len, buf);
-}
-int spi_flash_write_dm(struct udevice *dev, u32 offset, size_t len,
const void *buf)
-{
return sf_get_ops(dev)->write(dev, offset, len, buf);
-}
-int spi_flash_erase_dm(struct udevice *dev, u32 offset, size_t len) -{
return sf_get_ops(dev)->erase(dev, offset, len);
-}
These are the functions that we should keep. It is the the ones that don't take a struct udevice parameter which should be removed...
Regards, Simon

This patch adds MTD support to non-dm spi_flash interface code.
Signed-off-by: Jagan Teki jteki@openedev.com --- drivers/mtd/spi/sf_probe.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-)
diff --git a/drivers/mtd/spi/sf_probe.c b/drivers/mtd/spi/sf_probe.c index 5e314e2..60abaf2 100644 --- a/drivers/mtd/spi/sf_probe.c +++ b/drivers/mtd/spi/sf_probe.c @@ -26,17 +26,24 @@ struct spi_flash_priv { #ifndef CONFIG_DM_SPI_FLASH struct spi_flash *spi_flash_probe_tail(struct spi_slave *bus) { + struct spi_flash_priv *priv; struct spi_flash *flash; int ret;
- /* Allocate space if needed (not used by sf-uclass */ - flash = calloc(1, sizeof(*flash)); - if (!flash) { - debug("SF: Failed to allocate spi_flash\n"); + /* Allocate space if needed (not used by sf-uclass) */ + priv = calloc(1, sizeof(*priv)); + if (!priv) { + debug("SF: Failed to allocate spi_flash_priv\n"); return NULL; }
+ flash = &priv->flash; + flash->mtd = &priv->mtd; + flash->spi = bus; + flash->priv = priv; + + priv->mtd.priv = flash;
/* Claim spi bus */ ret = spi_claim_bus(bus); @@ -49,19 +56,16 @@ struct spi_flash *spi_flash_probe_tail(struct spi_slave *bus) if (ret) goto err_scan;
-#ifdef CONFIG_SPI_FLASH_MTD - ret = spi_flash_mtd_register(flash); + ret = add_mtd_device(&priv->mtd); if (ret) { printf("SF: failed to register mtd device: %d\n", ret); goto err_mtd; } -#endif + return flash;
-#ifdef CONFIG_SPI_FLASH_MTD err_mtd: spi_free_slave(bus); -#endif err_scan: spi_release_bus(bus); err_claim: @@ -95,9 +99,7 @@ struct spi_flash *spi_flash_probe_fdt(const void *blob, int slave_node,
void spi_flash_free(struct spi_flash *flash) { -#ifdef CONFIG_SPI_FLASH_MTD - spi_flash_mtd_unregister(); -#endif + del_mtd_device(flash->mtd); spi_free_slave(flash->spi); free(flash); }

Hello Jagan,
Am 12.10.2015 um 21:54 schrieb Jagan Teki:
This patch adds MTD support to non-dm spi_flash interface code.
Signed-off-by: Jagan Teki jteki@openedev.com
drivers/mtd/spi/sf_probe.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-)
Reviewed-by: Heiko Schocher hs@denx.de
bye, Heiko
diff --git a/drivers/mtd/spi/sf_probe.c b/drivers/mtd/spi/sf_probe.c index 5e314e2..60abaf2 100644 --- a/drivers/mtd/spi/sf_probe.c +++ b/drivers/mtd/spi/sf_probe.c @@ -26,17 +26,24 @@ struct spi_flash_priv { #ifndef CONFIG_DM_SPI_FLASH struct spi_flash *spi_flash_probe_tail(struct spi_slave *bus) {
- struct spi_flash_priv *priv; struct spi_flash *flash; int ret;
- /* Allocate space if needed (not used by sf-uclass */
- flash = calloc(1, sizeof(*flash));
- if (!flash) {
debug("SF: Failed to allocate spi_flash\n");
/* Allocate space if needed (not used by sf-uclass) */
priv = calloc(1, sizeof(*priv));
if (!priv) {
debug("SF: Failed to allocate spi_flash_priv\n");
return NULL; }
flash = &priv->flash;
flash->mtd = &priv->mtd;
flash->spi = bus;
flash->priv = priv;
priv->mtd.priv = flash;
/* Claim spi bus */ ret = spi_claim_bus(bus);
@@ -49,19 +56,16 @@ struct spi_flash *spi_flash_probe_tail(struct spi_slave *bus) if (ret) goto err_scan;
-#ifdef CONFIG_SPI_FLASH_MTD
- ret = spi_flash_mtd_register(flash);
- ret = add_mtd_device(&priv->mtd); if (ret) { printf("SF: failed to register mtd device: %d\n", ret); goto err_mtd; }
-#endif
- return flash;
-#ifdef CONFIG_SPI_FLASH_MTD err_mtd: spi_free_slave(bus); -#endif err_scan: spi_release_bus(bus); err_claim: @@ -95,9 +99,7 @@ struct spi_flash *spi_flash_probe_fdt(const void *blob, int slave_node,
void spi_flash_free(struct spi_flash *flash) { -#ifdef CONFIG_SPI_FLASH_MTD
- spi_flash_mtd_unregister();
-#endif
- del_mtd_device(flash->mtd); spi_free_slave(flash->spi); free(flash); }

- Use static for file-scope function - Remove unneeded header file - Use spi instead of slave notation for spi_slave {}
Signed-off-by: Jagan Teki jteki@openedev.com --- drivers/mtd/spi/sf_probe.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/drivers/mtd/spi/sf_probe.c b/drivers/mtd/spi/sf_probe.c index 60abaf2..112ab27 100644 --- a/drivers/mtd/spi/sf_probe.c +++ b/drivers/mtd/spi/sf_probe.c @@ -24,7 +24,7 @@ struct spi_flash_priv { };
#ifndef CONFIG_DM_SPI_FLASH -struct spi_flash *spi_flash_probe_tail(struct spi_slave *bus) +static struct spi_flash *spi_flash_probe_tail(struct spi_slave *bus) { struct spi_flash_priv *priv; struct spi_flash *flash; @@ -106,24 +106,24 @@ void spi_flash_free(struct spi_flash *flash)
#else /* defined CONFIG_DM_SPI_FLASH */
-int spi_flash_std_probe(struct udevice *dev) +static int spi_flash_std_probe(struct udevice *dev) { struct spi_flash_priv *priv = dev_get_uclass_priv(dev); - struct spi_slave *slave = dev_get_parentdata(dev); + struct spi_slave *spi = dev_get_parentdata(dev); struct spi_flash *flash; int ret;
flash = &priv->flash; flash->mtd = &priv->mtd;
- flash->spi = slave; + flash->spi = spi; flash->priv = priv;
priv->mtd.priv = flash; flash->dev = dev;
/* Claim spi bus */ - ret = spi_claim_bus(slave); + ret = spi_claim_bus(spi); if (ret) { debug("SF: Failed to claim SPI bus: %d\n", ret); return ret; @@ -144,9 +144,9 @@ int spi_flash_std_probe(struct udevice *dev) return ret;
err_mtd: - spi_free_slave(slave); + spi_free_slave(spi); err_scan: - spi_release_bus(slave); + spi_release_bus(spi); return ret; }

Hello Jagan,
Am 12.10.2015 um 21:54 schrieb Jagan Teki:
- Use static for file-scope function
- Remove unneeded header file
- Use spi instead of slave notation for spi_slave {}
Signed-off-by: Jagan Teki jteki@openedev.com
drivers/mtd/spi/sf_probe.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
Reviewed-by: Heiko Schocher hs@denx.de
bye, Heiko
diff --git a/drivers/mtd/spi/sf_probe.c b/drivers/mtd/spi/sf_probe.c index 60abaf2..112ab27 100644 --- a/drivers/mtd/spi/sf_probe.c +++ b/drivers/mtd/spi/sf_probe.c @@ -24,7 +24,7 @@ struct spi_flash_priv { };
#ifndef CONFIG_DM_SPI_FLASH -struct spi_flash *spi_flash_probe_tail(struct spi_slave *bus) +static struct spi_flash *spi_flash_probe_tail(struct spi_slave *bus) { struct spi_flash_priv *priv; struct spi_flash *flash; @@ -106,24 +106,24 @@ void spi_flash_free(struct spi_flash *flash)
#else /* defined CONFIG_DM_SPI_FLASH */
-int spi_flash_std_probe(struct udevice *dev) +static int spi_flash_std_probe(struct udevice *dev) { struct spi_flash_priv *priv = dev_get_uclass_priv(dev);
- struct spi_slave *slave = dev_get_parentdata(dev);
struct spi_slave *spi = dev_get_parentdata(dev); struct spi_flash *flash; int ret;
flash = &priv->flash; flash->mtd = &priv->mtd;
- flash->spi = slave;
flash->spi = spi; flash->priv = priv;
priv->mtd.priv = flash; flash->dev = dev;
/* Claim spi bus */
- ret = spi_claim_bus(slave);
- ret = spi_claim_bus(spi); if (ret) { debug("SF: Failed to claim SPI bus: %d\n", ret); return ret;
@@ -144,9 +144,9 @@ int spi_flash_std_probe(struct udevice *dev) return ret;
err_mtd:
- spi_free_slave(slave);
- spi_free_slave(spi); err_scan:
- spi_release_bus(slave);
- spi_release_bus(spi); return ret; }

Now MTD core has been added as part of spi-flash layer, so there is no need for explicit driver for handling mtd stuff, hence removed all neccessary code regarding SPI_FLASH_MTD driver.
Signed-off-by: Jagan Teki jteki@openedev.com Cc: Daniel Schwierzeck daniel.schwierzeck@gmail.com Cc: Heiko Schocher hs@denx.de --- drivers/mtd/spi/Kconfig | 12 ----- drivers/mtd/spi/Makefile | 1 - drivers/mtd/spi/sf_internal.h | 5 -- drivers/mtd/spi/sf_mtd.c | 104 ------------------------------------------ 4 files changed, 122 deletions(-) delete mode 100644 drivers/mtd/spi/sf_mtd.c
diff --git a/drivers/mtd/spi/Kconfig b/drivers/mtd/spi/Kconfig index 3f7433c..78932a4 100644 --- a/drivers/mtd/spi/Kconfig +++ b/drivers/mtd/spi/Kconfig @@ -116,16 +116,4 @@ config SPI_FLASH_DATAFLASH
If unsure, say N
-config SPI_FLASH_MTD - bool "SPI Flash MTD support" - depends on SPI_FLASH - help - Enable the MTD support for spi flash layer, this adapter is for - translating mtd_read/mtd_write commands into spi_flash_read/write - commands. It is not intended to use it within sf_cmd or the SPI - flash subsystem. Such an adapter is needed for subsystems like - UBI which can only operate on top of the MTD layer. - - If unsure, say N - endmenu # menu "SPI Flash Support" diff --git a/drivers/mtd/spi/Makefile b/drivers/mtd/spi/Makefile index 66c4424..1824261 100644 --- a/drivers/mtd/spi/Makefile +++ b/drivers/mtd/spi/Makefile @@ -14,6 +14,5 @@ endif
obj-$(CONFIG_SPI_FLASH) += sf_probe.o sf_ops.o sf_params.o sf.o obj-$(CONFIG_SPI_FLASH_DATAFLASH) += sf_dataflash.o -obj-$(CONFIG_SPI_FLASH_MTD) += sf_mtd.o obj-$(CONFIG_SPI_FLASH_SANDBOX) += sandbox.o obj-$(CONFIG_SPI_M95XXX) += eeprom_m95xxx.o diff --git a/drivers/mtd/spi/sf_internal.h b/drivers/mtd/spi/sf_internal.h index d74bc18..84afddf 100644 --- a/drivers/mtd/spi/sf_internal.h +++ b/drivers/mtd/spi/sf_internal.h @@ -191,11 +191,6 @@ int spi_flash_write_common(struct spi_flash *flash, const u8 *cmd, int spi_flash_read_common(struct spi_flash *flash, const u8 *cmd, size_t cmd_len, void *data, size_t data_len);
-#ifdef CONFIG_SPI_FLASH_MTD -int spi_flash_mtd_register(struct spi_flash *flash); -void spi_flash_mtd_unregister(void); -#endif - /** * spi_flash_scan - scan the SPI FLASH * @flash: the spi flash structure diff --git a/drivers/mtd/spi/sf_mtd.c b/drivers/mtd/spi/sf_mtd.c deleted file mode 100644 index 0b9cb62..0000000 --- a/drivers/mtd/spi/sf_mtd.c +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright (C) 2012-2014 Daniel Schwierzeck, daniel.schwierzeck@gmail.com - * - * SPDX-License-Identifier: GPL-2.0+ - */ - -#include <common.h> -#include <malloc.h> -#include <asm/errno.h> -#include <linux/mtd/mtd.h> -#include <spi_flash.h> - -static struct mtd_info sf_mtd_info; -static char sf_mtd_name[8]; - -static int spi_flash_mtd_erase(struct mtd_info *mtd, struct erase_info *instr) -{ - struct spi_flash *flash = mtd->priv; - int err; - - instr->state = MTD_ERASING; - - err = spi_flash_erase(flash, instr->addr, instr->len); - if (err) { - instr->state = MTD_ERASE_FAILED; - instr->fail_addr = MTD_FAIL_ADDR_UNKNOWN; - return -EIO; - } - - instr->state = MTD_ERASE_DONE; - mtd_erase_callback(instr); - - return 0; -} - -static int spi_flash_mtd_read(struct mtd_info *mtd, loff_t from, size_t len, - size_t *retlen, u_char *buf) -{ - struct spi_flash *flash = mtd->priv; - int err; - - err = spi_flash_read(flash, from, len, buf); - if (!err) - *retlen = len; - - return err; -} - -static int spi_flash_mtd_write(struct mtd_info *mtd, loff_t to, size_t len, - size_t *retlen, const u_char *buf) -{ - struct spi_flash *flash = mtd->priv; - int err; - - err = spi_flash_write(flash, to, len, buf); - if (!err) - *retlen = len; - - return err; -} - -static void spi_flash_mtd_sync(struct mtd_info *mtd) -{ -} - -static int spi_flash_mtd_number(void) -{ -#ifdef CONFIG_SYS_MAX_FLASH_BANKS - return CONFIG_SYS_MAX_FLASH_BANKS; -#else - return 0; -#endif -} - -int spi_flash_mtd_register(struct spi_flash *flash) -{ - memset(&sf_mtd_info, 0, sizeof(sf_mtd_info)); - sprintf(sf_mtd_name, "nor%d", spi_flash_mtd_number()); - - sf_mtd_info.name = sf_mtd_name; - sf_mtd_info.type = MTD_NORFLASH; - sf_mtd_info.flags = MTD_CAP_NORFLASH; - sf_mtd_info.writesize = 1; - sf_mtd_info.writebufsize = flash->page_size; - - sf_mtd_info._erase = spi_flash_mtd_erase; - sf_mtd_info._read = spi_flash_mtd_read; - sf_mtd_info._write = spi_flash_mtd_write; - sf_mtd_info._sync = spi_flash_mtd_sync; - - sf_mtd_info.size = flash->size; - sf_mtd_info.priv = flash; - - /* Only uniform flash devices for now */ - sf_mtd_info.numeraseregions = 0; - sf_mtd_info.erasesize = flash->sector_size; - - return add_mtd_device(&sf_mtd_info); -} - -void spi_flash_mtd_unregister(void) -{ - del_mtd_device(&sf_mtd_info); -}

No explict spi-flash mtd handling driver, it's been part of spi-flash layer iteself, hence removed it from board configs.
Signed-off-by: Jagan Teki jteki@openedev.com Cc: Daniel Schwierzeck daniel.schwierzeck@gmail.com Cc: Heiko Schocher hs@denx.de --- include/configs/aristainetos-common.h | 1 - include/configs/gw_ventana.h | 1 - include/configs/socfpga_common.h | 1 - 3 files changed, 3 deletions(-)
diff --git a/include/configs/aristainetos-common.h b/include/configs/aristainetos-common.h index f03297e..a7d938b 100644 --- a/include/configs/aristainetos-common.h +++ b/include/configs/aristainetos-common.h @@ -42,7 +42,6 @@ #define CONFIG_PHY_MICREL
#define CONFIG_CMD_SF -#define CONFIG_SPI_FLASH_MTD #define CONFIG_SPI_FLASH_STMICRO #define CONFIG_MXC_SPI #define CONFIG_SF_DEFAULT_SPEED 20000000 diff --git a/include/configs/gw_ventana.h b/include/configs/gw_ventana.h index 484d763..a63db66 100644 --- a/include/configs/gw_ventana.h +++ b/include/configs/gw_ventana.h @@ -69,7 +69,6 @@ #define CONFIG_CMD_SF #ifdef CONFIG_CMD_SF #define CONFIG_MXC_SPI - #define CONFIG_SPI_FLASH_MTD #define CONFIG_SPI_FLASH_BAR #define CONFIG_SPI_FLASH_WINBOND #define CONFIG_SF_DEFAULT_BUS 0 diff --git a/include/configs/socfpga_common.h b/include/configs/socfpga_common.h index cece095..f288350 100644 --- a/include/configs/socfpga_common.h +++ b/include/configs/socfpga_common.h @@ -196,7 +196,6 @@ unsigned int cm_get_l4_sp_clk_hz(void); #define CONFIG_SPI_FLASH_STMICRO /* Micron/Numonyx flash */ #define CONFIG_SPI_FLASH_SPANSION /* Spansion flash */ #ifndef CONFIG_SPL_BUILD -#define CONFIG_SPI_FLASH_MTD #define CONFIG_CMD_MTDPARTS #define CONFIG_MTD_DEVICE #define CONFIG_MTD_PARTITIONS

Hello Jgan,
Am 12.10.2015 um 21:54 schrieb Jagan Teki:
This patch adds mtd_info support to spi_flash layer, MTD has proven core for flash operations so adding MTD to spi_flash will extends more functionality.
Signed-off-by: Jagan Teki jteki@openedev.com
drivers/mtd/spi/sf_ops.c | 45 +++++++++++++++++++++++++-------------------- drivers/mtd/spi/sf_probe.c | 26 ++++++++++++++++++-------- include/spi_flash.h | 9 +++++---- 3 files changed, 48 insertions(+), 32 deletions(-)
Reviewed-by: Heiko Schocher hs@denx.de
bye, Heiko
diff --git a/drivers/mtd/spi/sf_ops.c b/drivers/mtd/spi/sf_ops.c index 703099f..f5ee376 100644 --- a/drivers/mtd/spi/sf_ops.c +++ b/drivers/mtd/spi/sf_ops.c @@ -146,7 +146,7 @@ static int spi_flash_read_bar(struct spi_flash *flash, u8 idcode0) u8 curr_bank = 0; int ret;
- if (flash->size <= SPI_FLASH_16MB_BOUN)
if (flash->mtd->size <= SPI_FLASH_16MB_BOUN) goto bank_end;
switch (idcode0) {
@@ -176,8 +176,8 @@ static void spi_flash_dual(struct spi_flash *flash, u32 *addr) { switch (flash->dual_flash) { case SF_DUAL_STACKED_FLASH:
if (*addr >= (flash->size >> 1)) {
*addr -= flash->size >> 1;
if (*addr >= (flash->mtd->size >> 1)) {
} else { flash->spi->flags &= ~SPI_XFER_U_PAGE;*addr -= flash->mtd->size >> 1; flash->spi->flags |= SPI_XFER_U_PAGE;
@@ -303,7 +303,7 @@ static int spi_flash_cmd_erase_ops(struct spi_flash *flash, u32 offset, u8 cmd[SPI_FLASH_CMD_LEN]; int ret = -1;
- erase_size = flash->erase_size;
- erase_size = mtd->erasesize; if (offset % erase_size || len % erase_size) { debug("SF: Erase offset/length not multiple of erase size\n"); return -1;
@@ -693,7 +693,7 @@ int spi_flash_decode_fdt(const void *blob, struct spi_flash *flash) return 0; }
- if (flash->size != size) {
- if (flash->mtd->size != size) { debug("%s: Memory map must cover entire device\n", __func__); return -1; }
@@ -705,6 +705,7 @@ int spi_flash_decode_fdt(const void *blob, struct spi_flash *flash)
int spi_flash_scan(struct spi_flash *flash) {
- struct mtd_info *mtd = flash->mtd; const struct spi_flash_params *params; u16 jedec, ext_jedec; u8 idcode[5];
@@ -754,24 +755,27 @@ int spi_flash_scan(struct spi_flash *flash)
/* Assign spi data */ flash->name = params->name;
mtd->type = MTD_NORFLASH;
mtd->writesize = 1;
mtd->flags = MTD_CAP_NORFLASH; flash->memory_map = flash->spi->memory_map; flash->dual_flash = flash->spi->option;
/* Assign spi_flash ops */
- flash->write = spi_flash_cmd_write_ops;
mtd->_write = spi_flash_cmd_write_ops; #if defined(CONFIG_SPI_FLASH_SST) if (params->flags & SST_WR) flash->flags |= SNOR_F_SST_WR;
if (params->flags & SNOR_F_SST_WR) { if (flash->spi->op_mode_tx & SPI_OPM_TX_BP)
flash->write = sst_write_bp;
elsemtd->_write = sst_write_bp;
flash->write = sst_write_wp;
} #endifmtd->_write = sst_write_wp;
- flash->erase = spi_flash_cmd_erase_ops;
- flash->read = spi_flash_cmd_read_ops;
mtd->_erase = spi_flash_cmd_erase_ops;
mtd->_read = spi_flash_cmd_read_ops;
/* Compute the flash size */ flash->shift = (flash->dual_flash & SF_DUAL_PARALLEL_FLASH) ? 1 : 0;
@@ -790,27 +794,28 @@ int spi_flash_scan(struct spi_flash *flash) flash->page_size = 256; } flash->page_size <<= flash->shift;
- mtd->writebufsize = flash->page_size; flash->sector_size = params->sector_size << flash->shift;
- flash->size = flash->sector_size * params->nr_sectors << flash->shift;
- mtd->size = flash->sector_size * params->nr_sectors << flash->shift; #ifdef CONFIG_SF_DUAL_FLASH if (flash->dual_flash & SF_DUAL_STACKED_FLASH)
flash->size <<= 1;
mtd->size <<= 1;
#endif
/* Compute erase sector and command */ if (params->flags & SECT_4K) { flash->erase_cmd = CMD_ERASE_4K;
flash->erase_size = 4096 << flash->shift;
} else if (params->flags & SECT_32K) { flash->erase_cmd = CMD_ERASE_32K;mtd->erasesize = 4096 << flash->shift;
flash->erase_size = 32768 << flash->shift;
} else { flash->erase_cmd = CMD_ERASE_64K;mtd->erasesize = 32768 << flash->shift;
flash->erase_size = flash->sector_size;
mtd->erasesize = flash->sector_size;
}
/* Now erase size becomes valid sector size */
- flash->sector_size = flash->erase_size;
flash->sector_size = mtd->erasesize;
/* Look for the fastest read cmd */ cmd = fls(params->e_rd_cmd & flash->spi->op_mode_rx);
@@ -882,8 +887,8 @@ int spi_flash_scan(struct spi_flash *flash) #ifndef CONFIG_SPL_BUILD printf("SF: Detected %s with page size ", flash->name); print_size(flash->page_size, ", erase size ");
- print_size(flash->erase_size, ", total ");
- print_size(flash->size, "");
- print_size(mtd->erasesize, ", total ");
- print_size(mtd->size, ""); if (flash->memory_map) printf(", mapped at %p", flash->memory_map); puts("\n");
@@ -891,9 +896,9 @@ int spi_flash_scan(struct spi_flash *flash)
#ifndef CONFIG_SPI_FLASH_BAR if (((flash->dual_flash == SF_SINGLE_FLASH) &&
(flash->size > SPI_FLASH_16MB_BOUN)) ||
(mtd->size > SPI_FLASH_16MB_BOUN)) || ((flash->dual_flash > SF_SINGLE_FLASH) &&
(flash->size > SPI_FLASH_16MB_BOUN << 1))) {
puts("SF: Warning - Only lower 16MiB accessible,"); puts(" Full access #define CONFIG_SPI_FLASH_BAR\n"); }(mtd->size > SPI_FLASH_16MB_BOUN << 1))) {
diff --git a/drivers/mtd/spi/sf_probe.c b/drivers/mtd/spi/sf_probe.c index 87ac33e..b8704e2 100644 --- a/drivers/mtd/spi/sf_probe.c +++ b/drivers/mtd/spi/sf_probe.c @@ -14,9 +14,15 @@ #include <malloc.h> #include <spi.h> #include <spi_flash.h> +#include <linux/mtd/mtd.h>
#include "sf_internal.h"
+struct spi_flash_priv {
- struct spi_flash flash;
- struct mtd_info mtd;
+};
- #ifndef CONFIG_DM_SPI_FLASH struct spi_flash *spi_flash_probe_tail(struct spi_slave *bus) {
@@ -123,12 +129,19 @@ int spi_flash_std_erase(struct udevice *dev, u32 offset, size_t len)
int spi_flash_std_probe(struct udevice *dev) {
- struct spi_flash *flash = dev_get_uclass_priv(dev);
- struct spi_flash_priv *priv = dev_get_uclass_priv(dev); struct spi_slave *slave = dev_get_parentdata(dev);
- struct spi_flash *flash; int ret;
- flash->dev = dev;
flash = &priv->flash;
flash->mtd = &priv->mtd;
flash->spi = slave;
flash->priv = priv;
priv->mtd.priv = flash;
flash->dev = dev;
/* Claim spi bus */ ret = spi_claim_bus(slave);
@@ -143,19 +156,16 @@ int spi_flash_std_probe(struct udevice *dev) goto err_scan; }
-#ifdef CONFIG_SPI_FLASH_MTD
- ret = spi_flash_mtd_register(flash);
- ret = add_mtd_device(&priv->mtd); if (ret) { printf("SF: failed to register mtd device: %d\n", ret); goto err_mtd; }
-#endif
- return ret;
-#ifdef CONFIG_SPI_FLASH_MTD err_mtd: spi_free_slave(slave); -#endif err_scan: spi_release_bus(slave); return ret; @@ -177,7 +187,7 @@ U_BOOT_DRIVER(spi_flash_std) = { .id = UCLASS_SPI_FLASH, .of_match = spi_flash_std_ids, .probe = spi_flash_std_probe,
- .priv_auto_alloc_size = sizeof(struct spi_flash),
- .priv_auto_alloc_size = sizeof(struct spi_flash_priv), .ops = &spi_flash_std_ops, };
diff --git a/include/spi_flash.h b/include/spi_flash.h index 0732172..d0af8d3 100644 --- a/include/spi_flash.h +++ b/include/spi_flash.h @@ -17,6 +17,7 @@
#include <dm.h> /* Because we dereference struct udevice here */ #include <linux/types.h> +#include <linux/mtd/mtd.h>
#ifndef CONFIG_SF_DEFAULT_SPEED # define CONFIG_SF_DEFAULT_SPEED 1000000 @@ -36,16 +37,15 @@ struct spi_slave; /**
- struct spi_flash - SPI flash structure
- @mtd: point to a mtd_info 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
@@ -54,6 +54,7 @@ struct spi_slave;
- @write_cmd: Write cmd - page and quad program.
- @dummy_byte: Dummy cycles for read operation.
- @memory_map: Address of read-only SPI flash access
- @priv: the private data
- @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
@@ -63,6 +64,7 @@ struct spi_slave;
- return 0 - Success, 1 - Failure
*/ struct spi_flash {
- struct mtd_info *mtd; struct spi_slave *spi; #ifdef CONFIG_DM_SPI_FLASH struct udevice *dev;
@@ -72,10 +74,8 @@ struct spi_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;
@@ -87,6 +87,7 @@ struct spi_flash { u8 dummy_byte;
void *memory_map;
- void *priv; 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);
participants (3)
-
Heiko Schocher
-
Jagan Teki
-
Simon Glass