mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-25 06:00:43 +00:00
sf: add struct spi_flash.sector_size parameter
This patch adds a new member to struct spi_flash (u16 sector_size) and updates the spi flash drivers to start populating it. This parameter can be used by spi flash commands that need to round up units of operation to the flash's sector_size. Having this number in one place also allows duplicated code to be further collapsed into one common location (such as erase parameter and the detected message). Signed-off-by: Richard Retanubun <RichardRetanubun@RuggedCom.com> Signed-off-by: Mike Frysinger <vapier@gentoo.org>
This commit is contained in:
parent
cdb6a00fb8
commit
4e6a515899
11 changed files with 30 additions and 64 deletions
|
@ -522,14 +522,11 @@ struct spi_flash *spi_flash_probe_atmel(struct spi_slave *spi, u8 *idcode)
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
asf->flash.sector_size = page_size;
|
||||||
asf->flash.size = page_size * params->pages_per_block
|
asf->flash.size = page_size * params->pages_per_block
|
||||||
* params->blocks_per_sector
|
* params->blocks_per_sector
|
||||||
* params->nr_sectors;
|
* params->nr_sectors;
|
||||||
|
|
||||||
printf("SF: Detected %s with page size %u, total ",
|
|
||||||
params->name, page_size);
|
|
||||||
print_size(asf->flash.size, "\n");
|
|
||||||
|
|
||||||
return &asf->flash;
|
return &asf->flash;
|
||||||
|
|
||||||
err:
|
err:
|
||||||
|
|
|
@ -121,11 +121,7 @@ static int eon_write(struct spi_flash *flash,
|
||||||
|
|
||||||
int eon_erase(struct spi_flash *flash, u32 offset, size_t len)
|
int eon_erase(struct spi_flash *flash, u32 offset, size_t len)
|
||||||
{
|
{
|
||||||
struct eon_spi_flash *eon = to_eon_spi_flash(flash);
|
return spi_flash_cmd_erase(flash, CMD_EN25Q128_BE, offset, len);
|
||||||
return spi_flash_cmd_erase(flash, CMD_EN25Q128_BE,
|
|
||||||
eon->params->page_size * eon->params->pages_per_sector *
|
|
||||||
eon->params->sectors_per_block;
|
|
||||||
offset, len);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct spi_flash *spi_flash_probe_eon(struct spi_slave *spi, u8 *idcode)
|
struct spi_flash *spi_flash_probe_eon(struct spi_slave *spi, u8 *idcode)
|
||||||
|
@ -158,11 +154,10 @@ struct spi_flash *spi_flash_probe_eon(struct spi_slave *spi, u8 *idcode)
|
||||||
eon->flash.write = eon_write;
|
eon->flash.write = eon_write;
|
||||||
eon->flash.erase = eon_erase;
|
eon->flash.erase = eon_erase;
|
||||||
eon->flash.read = spi_flash_cmd_read_fast;
|
eon->flash.read = spi_flash_cmd_read_fast;
|
||||||
|
eon->flash.sector_size = params->page_size * params->pages_per_sector
|
||||||
|
* params->sectors_per_block;
|
||||||
eon->flash.size = params->page_size * params->pages_per_sector
|
eon->flash.size = params->page_size * params->pages_per_sector
|
||||||
* params->nr_sectors;
|
* params->nr_sectors;
|
||||||
|
|
||||||
debug("SF: Detected %s with page size %u, total %u bytes\n",
|
|
||||||
params->name, params->page_size, eon->flash.size);
|
|
||||||
|
|
||||||
return &eon->flash;
|
return &eon->flash;
|
||||||
}
|
}
|
||||||
|
|
|
@ -177,11 +177,7 @@ static int macronix_write(struct spi_flash *flash,
|
||||||
|
|
||||||
int macronix_erase(struct spi_flash *flash, u32 offset, size_t len)
|
int macronix_erase(struct spi_flash *flash, u32 offset, size_t len)
|
||||||
{
|
{
|
||||||
struct macronix_spi_flash *mcx = to_macronix_spi_flash(flash);
|
return spi_flash_cmd_erase(flash, CMD_MX25XX_BE, offset, len);
|
||||||
return spi_flash_cmd_erase(flash, CMD_MX25XX_BE,
|
|
||||||
mcx->params->page_size * mcx->params->pages_per_sector *
|
|
||||||
mcx->params->sectors_per_block,
|
|
||||||
offset, len);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct spi_flash *spi_flash_probe_macronix(struct spi_slave *spi, u8 *idcode)
|
struct spi_flash *spi_flash_probe_macronix(struct spi_slave *spi, u8 *idcode)
|
||||||
|
@ -215,12 +211,9 @@ struct spi_flash *spi_flash_probe_macronix(struct spi_slave *spi, u8 *idcode)
|
||||||
mcx->flash.write = macronix_write;
|
mcx->flash.write = macronix_write;
|
||||||
mcx->flash.erase = macronix_erase;
|
mcx->flash.erase = macronix_erase;
|
||||||
mcx->flash.read = spi_flash_cmd_read_fast;
|
mcx->flash.read = spi_flash_cmd_read_fast;
|
||||||
mcx->flash.size = params->page_size * params->pages_per_sector
|
mcx->flash.sector_size = params->page_size * params->pages_per_sector
|
||||||
* params->sectors_per_block * params->nr_blocks;
|
* params->sectors_per_block;
|
||||||
|
mcx->flash.size = mcx->flash.sector_size * params->nr_blocks;
|
||||||
printf("SF: Detected %s with page size %u, total ",
|
|
||||||
params->name, params->page_size);
|
|
||||||
print_size(mcx->flash.size, "\n");
|
|
||||||
|
|
||||||
return &mcx->flash;
|
return &mcx->flash;
|
||||||
}
|
}
|
||||||
|
|
|
@ -312,8 +312,5 @@ found:
|
||||||
sn->flash.erase = ramtron_erase;
|
sn->flash.erase = ramtron_erase;
|
||||||
sn->flash.size = params->size;
|
sn->flash.size = params->size;
|
||||||
|
|
||||||
printf("SF: Detected %s with size ", params->name);
|
|
||||||
print_size(sn->flash.size, "\n");
|
|
||||||
|
|
||||||
return &sn->flash;
|
return &sn->flash;
|
||||||
}
|
}
|
||||||
|
|
|
@ -198,10 +198,7 @@ static int spansion_write(struct spi_flash *flash,
|
||||||
|
|
||||||
int spansion_erase(struct spi_flash *flash, u32 offset, size_t len)
|
int spansion_erase(struct spi_flash *flash, u32 offset, size_t len)
|
||||||
{
|
{
|
||||||
struct spansion_spi_flash *spsn = to_spansion_spi_flash(flash);
|
return spi_flash_cmd_erase(flash, CMD_S25FLXX_SE, offset, len);
|
||||||
return spi_flash_cmd_erase(flash, CMD_S25FLXX_SE,
|
|
||||||
spsn->params->page_size * spsn->params->pages_per_sector,
|
|
||||||
offset, len);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct spi_flash *spi_flash_probe_spansion(struct spi_slave *spi, u8 *idcode)
|
struct spi_flash *spi_flash_probe_spansion(struct spi_slave *spi, u8 *idcode)
|
||||||
|
@ -240,12 +237,8 @@ struct spi_flash *spi_flash_probe_spansion(struct spi_slave *spi, u8 *idcode)
|
||||||
spsn->flash.write = spansion_write;
|
spsn->flash.write = spansion_write;
|
||||||
spsn->flash.erase = spansion_erase;
|
spsn->flash.erase = spansion_erase;
|
||||||
spsn->flash.read = spi_flash_cmd_read_fast;
|
spsn->flash.read = spi_flash_cmd_read_fast;
|
||||||
spsn->flash.size = params->page_size * params->pages_per_sector
|
spsn->flash.sector_size = params->page_size * params->pages_per_sector;
|
||||||
* params->nr_sectors;
|
spsn->flash.size = spsn->flash.sector_size * params->nr_sectors;
|
||||||
|
|
||||||
printf("SF: Detected %s with page size %u, total ",
|
|
||||||
params->name, params->page_size);
|
|
||||||
print_size(spsn->flash.size, "\n");
|
|
||||||
|
|
||||||
return &spsn->flash;
|
return &spsn->flash;
|
||||||
}
|
}
|
||||||
|
|
|
@ -131,12 +131,13 @@ int spi_flash_cmd_wait_ready(struct spi_flash *flash, unsigned long timeout)
|
||||||
}
|
}
|
||||||
|
|
||||||
int spi_flash_cmd_erase(struct spi_flash *flash, u8 erase_cmd,
|
int spi_flash_cmd_erase(struct spi_flash *flash, u8 erase_cmd,
|
||||||
u32 erase_size, u32 offset, size_t len)
|
u32 offset, size_t len)
|
||||||
{
|
{
|
||||||
u32 start, end;
|
u32 start, end, erase_size;
|
||||||
int ret;
|
int ret;
|
||||||
u8 cmd[4];
|
u8 cmd[4];
|
||||||
|
|
||||||
|
erase_size = flash->sector_size;
|
||||||
if (offset % erase_size || len % erase_size) {
|
if (offset % erase_size || len % erase_size) {
|
||||||
debug("SF: Erase offset/length not multiple of erase size\n");
|
debug("SF: Erase offset/length not multiple of erase size\n");
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -296,6 +297,10 @@ struct spi_flash *spi_flash_probe(unsigned int bus, unsigned int cs,
|
||||||
goto err_manufacturer_probe;
|
goto err_manufacturer_probe;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
printf("SF: Detected %s with page size %u, total ",
|
||||||
|
flash->name, flash->sector_size);
|
||||||
|
print_size(flash->size, "\n");
|
||||||
|
|
||||||
spi_release_bus(spi);
|
spi_release_bus(spi);
|
||||||
|
|
||||||
return flash;
|
return flash;
|
||||||
|
|
|
@ -64,7 +64,7 @@ int spi_flash_cmd_wait_ready(struct spi_flash *flash, unsigned long timeout);
|
||||||
|
|
||||||
/* Erase sectors. */
|
/* Erase sectors. */
|
||||||
int spi_flash_cmd_erase(struct spi_flash *flash, u8 erase_cmd,
|
int spi_flash_cmd_erase(struct spi_flash *flash, u8 erase_cmd,
|
||||||
u32 erase_size, u32 offset, size_t len);
|
u32 offset, size_t len);
|
||||||
|
|
||||||
/* Manufacturer-specific probe functions */
|
/* Manufacturer-specific probe functions */
|
||||||
struct spi_flash *spi_flash_probe_spansion(struct spi_slave *spi, u8 *idcode);
|
struct spi_flash *spi_flash_probe_spansion(struct spi_slave *spi, u8 *idcode);
|
||||||
|
|
|
@ -201,8 +201,7 @@ sst_write(struct spi_flash *flash, u32 offset, size_t len, const void *buf)
|
||||||
|
|
||||||
int sst_erase(struct spi_flash *flash, u32 offset, size_t len)
|
int sst_erase(struct spi_flash *flash, u32 offset, size_t len)
|
||||||
{
|
{
|
||||||
return spi_flash_cmd_erase(flash, CMD_SST_SE, SST_SECTOR_SIZE,
|
return spi_flash_cmd_erase(flash, CMD_SST_SE, offset, len);
|
||||||
offset, len);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -256,11 +255,8 @@ spi_flash_probe_sst(struct spi_slave *spi, u8 *idcode)
|
||||||
|
|
||||||
stm->flash.write = sst_write;
|
stm->flash.write = sst_write;
|
||||||
stm->flash.erase = sst_erase;
|
stm->flash.erase = sst_erase;
|
||||||
stm->flash.size = SST_SECTOR_SIZE * params->nr_sectors;
|
stm->flash.sector_size = SST_SECTOR_SIZE;
|
||||||
|
stm->flash.size = stm->flash.sector_size * params->nr_sectors;
|
||||||
printf("SF: Detected %s with page size %u, total ",
|
|
||||||
params->name, SST_SECTOR_SIZE);
|
|
||||||
print_size(stm->flash.size, "\n");
|
|
||||||
|
|
||||||
/* Flash powers up read-only, so clear BP# bits */
|
/* Flash powers up read-only, so clear BP# bits */
|
||||||
sst_unlock(&stm->flash);
|
sst_unlock(&stm->flash);
|
||||||
|
|
|
@ -199,10 +199,7 @@ static int stmicro_write(struct spi_flash *flash,
|
||||||
|
|
||||||
int stmicro_erase(struct spi_flash *flash, u32 offset, size_t len)
|
int stmicro_erase(struct spi_flash *flash, u32 offset, size_t len)
|
||||||
{
|
{
|
||||||
struct stmicro_spi_flash *stm = to_stmicro_spi_flash(flash);
|
return spi_flash_cmd_erase(flash, CMD_M25PXX_SE, offset, len);
|
||||||
return spi_flash_cmd_erase(flash, CMD_M25PXX_SE,
|
|
||||||
stm->params->page_size * stm->params->pages_per_sector,
|
|
||||||
offset, len);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct spi_flash *spi_flash_probe_stmicro(struct spi_slave *spi, u8 * idcode)
|
struct spi_flash *spi_flash_probe_stmicro(struct spi_slave *spi, u8 * idcode)
|
||||||
|
@ -249,12 +246,8 @@ struct spi_flash *spi_flash_probe_stmicro(struct spi_slave *spi, u8 * idcode)
|
||||||
stm->flash.write = stmicro_write;
|
stm->flash.write = stmicro_write;
|
||||||
stm->flash.erase = stmicro_erase;
|
stm->flash.erase = stmicro_erase;
|
||||||
stm->flash.read = spi_flash_cmd_read_fast;
|
stm->flash.read = spi_flash_cmd_read_fast;
|
||||||
stm->flash.size = params->page_size * params->pages_per_sector
|
stm->flash.sector_size = params->page_size * params->pages_per_sector;
|
||||||
* params->nr_sectors;
|
stm->flash.size = stm->flash.sector_size * params->nr_sectors;
|
||||||
|
|
||||||
printf("SF: Detected %s with page size %u, total ",
|
|
||||||
params->name, params->page_size);
|
|
||||||
print_size(stm->flash.size, "\n");
|
|
||||||
|
|
||||||
return &stm->flash;
|
return &stm->flash;
|
||||||
}
|
}
|
||||||
|
|
|
@ -172,10 +172,7 @@ out:
|
||||||
|
|
||||||
int winbond_erase(struct spi_flash *flash, u32 offset, size_t len)
|
int winbond_erase(struct spi_flash *flash, u32 offset, size_t len)
|
||||||
{
|
{
|
||||||
struct winbond_spi_flash *stm = to_winbond_spi_flash(flash);
|
return spi_flash_cmd_erase(flash, CMD_W25_SE, offset, len);
|
||||||
return spi_flash_cmd_erase(flash, CMD_W25_SE,
|
|
||||||
(1 << stm->params->l2_page_size) * stm->params->pages_per_sector,
|
|
||||||
offset, len);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct spi_flash *spi_flash_probe_winbond(struct spi_slave *spi, u8 *idcode)
|
struct spi_flash *spi_flash_probe_winbond(struct spi_slave *spi, u8 *idcode)
|
||||||
|
@ -213,13 +210,11 @@ struct spi_flash *spi_flash_probe_winbond(struct spi_slave *spi, u8 *idcode)
|
||||||
stm->flash.write = winbond_write;
|
stm->flash.write = winbond_write;
|
||||||
stm->flash.erase = winbond_erase;
|
stm->flash.erase = winbond_erase;
|
||||||
stm->flash.read = spi_flash_cmd_read_fast;
|
stm->flash.read = spi_flash_cmd_read_fast;
|
||||||
|
stm->flash.sector_size = (1 << stm->params->l2_page_size) *
|
||||||
|
stm->params->pages_per_sector;
|
||||||
stm->flash.size = page_size * params->pages_per_sector
|
stm->flash.size = page_size * params->pages_per_sector
|
||||||
* params->sectors_per_block
|
* params->sectors_per_block
|
||||||
* params->nr_blocks;
|
* params->nr_blocks;
|
||||||
|
|
||||||
printf("SF: Detected %s with page size %u, total ",
|
|
||||||
params->name, page_size);
|
|
||||||
print_size(stm->flash.size, "\n");
|
|
||||||
|
|
||||||
return &stm->flash;
|
return &stm->flash;
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,6 +33,8 @@ struct spi_flash {
|
||||||
|
|
||||||
u32 size;
|
u32 size;
|
||||||
|
|
||||||
|
u32 sector_size;
|
||||||
|
|
||||||
int (*read)(struct spi_flash *flash, u32 offset,
|
int (*read)(struct spi_flash *flash, u32 offset,
|
||||||
size_t len, void *buf);
|
size_t len, void *buf);
|
||||||
int (*write)(struct spi_flash *flash, u32 offset,
|
int (*write)(struct spi_flash *flash, u32 offset,
|
||||||
|
|
Loading…
Reference in a new issue