sf: spi_flash_validate_params => spi_flash_scan
Rename spi_flash_validate_params to spi_flash_scan as this code not only deals with params setup but also configure all spi_flash attributes. And also moved all flash related code into spi_flash_scan for future functionality addition. Tested-by: Jagan Teki <jteki@openedev.com> Tested-by: Bin Meng <bmeng.cn@gmail.com> Reviewed-by: Bin Meng <bmeng.cn@gmail.com> Reviewed-by: Simon Glass <sjg@chromium.org> Signed-off-by: Jagan Teki <jteki@openedev.com>
This commit is contained in:
parent
8e4920e53e
commit
3a1adb621b
@ -130,13 +130,42 @@ bank_end:
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int spi_flash_validate_params(struct spi_slave *spi, u8 *idcode,
|
#if CONFIG_IS_ENABLED(OF_CONTROL)
|
||||||
struct spi_flash *flash)
|
int spi_flash_decode_fdt(const void *blob, struct spi_flash *flash)
|
||||||
|
{
|
||||||
|
fdt_addr_t addr;
|
||||||
|
fdt_size_t size;
|
||||||
|
int node;
|
||||||
|
|
||||||
|
/* If there is no node, do nothing */
|
||||||
|
node = fdtdec_next_compatible(blob, 0, COMPAT_GENERIC_SPI_FLASH);
|
||||||
|
if (node < 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
addr = fdtdec_get_addr_size(blob, node, "memory-map", &size);
|
||||||
|
if (addr == FDT_ADDR_T_NONE) {
|
||||||
|
debug("%s: Cannot decode address\n", __func__);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flash->size != size) {
|
||||||
|
debug("%s: Memory map must cover entire device\n", __func__);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
flash->memory_map = map_sysmem(addr, size);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_IS_ENABLED(OF_CONTROL) */
|
||||||
|
|
||||||
|
static int spi_flash_scan(struct spi_slave *spi, u8 *idcode,
|
||||||
|
struct spi_flash *flash)
|
||||||
{
|
{
|
||||||
const struct spi_flash_params *params;
|
const struct spi_flash_params *params;
|
||||||
u8 cmd;
|
u8 cmd;
|
||||||
u16 jedec = idcode[1] << 8 | idcode[2];
|
u16 jedec = idcode[1] << 8 | idcode[2];
|
||||||
u16 ext_jedec = idcode[3] << 8 | idcode[4];
|
u16 ext_jedec = idcode[3] << 8 | idcode[4];
|
||||||
|
int ret;
|
||||||
|
|
||||||
/* Validate params from spi_flash_params table */
|
/* Validate params from spi_flash_params table */
|
||||||
params = spi_flash_params_table;
|
params = spi_flash_params_table;
|
||||||
@ -158,6 +187,13 @@ static int spi_flash_validate_params(struct spi_slave *spi, u8 *idcode,
|
|||||||
return -EPROTONOSUPPORT;
|
return -EPROTONOSUPPORT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Flash powers up read-only, so clear BP# bits */
|
||||||
|
#if defined(CONFIG_SPI_FLASH_ATMEL) || \
|
||||||
|
defined(CONFIG_SPI_FLASH_MACRONIX) || \
|
||||||
|
defined(CONFIG_SPI_FLASH_SST)
|
||||||
|
spi_flash_cmd_write_status(flash, 0);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Assign spi data */
|
/* Assign spi data */
|
||||||
flash->spi = spi;
|
flash->spi = spi;
|
||||||
flash->name = params->name;
|
flash->name = params->name;
|
||||||
@ -253,6 +289,17 @@ static int spi_flash_validate_params(struct spi_slave *spi, u8 *idcode,
|
|||||||
/* Go for default supported write cmd */
|
/* Go for default supported write cmd */
|
||||||
flash->write_cmd = CMD_PAGE_PROGRAM;
|
flash->write_cmd = CMD_PAGE_PROGRAM;
|
||||||
|
|
||||||
|
/* Set the quad enable bit - only for quad commands */
|
||||||
|
if ((flash->read_cmd == CMD_READ_QUAD_OUTPUT_FAST) ||
|
||||||
|
(flash->read_cmd == CMD_READ_QUAD_IO_FAST) ||
|
||||||
|
(flash->write_cmd == CMD_QUAD_PAGE_PROGRAM)) {
|
||||||
|
ret = spi_flash_set_qeb(flash, idcode[0]);
|
||||||
|
if (ret) {
|
||||||
|
debug("SF: Fail to set QEB for %02x\n", idcode[0]);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Read dummy_byte: dummy byte is determined based on the
|
/* Read dummy_byte: dummy byte is determined based on the
|
||||||
* dummy cycles of a particular command.
|
* dummy cycles of a particular command.
|
||||||
* Fast commands - dummy_byte = dummy_cycles/8
|
* Fast commands - dummy_byte = dummy_cycles/8
|
||||||
@ -279,48 +326,41 @@ static int spi_flash_validate_params(struct spi_slave *spi, u8 *idcode,
|
|||||||
|
|
||||||
/* Configure the BAR - discover bank cmds and read current bank */
|
/* Configure the BAR - discover bank cmds and read current bank */
|
||||||
#ifdef CONFIG_SPI_FLASH_BAR
|
#ifdef CONFIG_SPI_FLASH_BAR
|
||||||
int ret = spi_flash_read_bank(flash, idcode[0]);
|
ret = spi_flash_read_bank(flash, idcode[0]);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Flash powers up read-only, so clear BP# bits */
|
#if CONFIG_IS_ENABLED(OF_CONTROL)
|
||||||
#if defined(CONFIG_SPI_FLASH_ATMEL) || \
|
ret = spi_flash_decode_fdt(gd->fdt_blob, flash);
|
||||||
defined(CONFIG_SPI_FLASH_MACRONIX) || \
|
if (ret) {
|
||||||
defined(CONFIG_SPI_FLASH_SST)
|
debug("SF: FDT decode error\n");
|
||||||
spi_flash_cmd_write_status(flash, 0);
|
return -EINVAL;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return 0;
|
#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, "");
|
||||||
|
if (flash->memory_map)
|
||||||
|
printf(", mapped at %p", flash->memory_map);
|
||||||
|
puts("\n");
|
||||||
|
#endif
|
||||||
|
|
||||||
#if CONFIG_IS_ENABLED(OF_CONTROL)
|
#ifndef CONFIG_SPI_FLASH_BAR
|
||||||
int spi_flash_decode_fdt(const void *blob, struct spi_flash *flash)
|
if (((flash->dual_flash == SF_SINGLE_FLASH) &&
|
||||||
{
|
(flash->size > SPI_FLASH_16MB_BOUN)) ||
|
||||||
fdt_addr_t addr;
|
((flash->dual_flash > SF_SINGLE_FLASH) &&
|
||||||
fdt_size_t size;
|
(flash->size > SPI_FLASH_16MB_BOUN << 1))) {
|
||||||
int node;
|
puts("SF: Warning - Only lower 16MiB accessible,");
|
||||||
|
puts(" Full access #define CONFIG_SPI_FLASH_BAR\n");
|
||||||
/* If there is no node, do nothing */
|
|
||||||
node = fdtdec_next_compatible(blob, 0, COMPAT_GENERIC_SPI_FLASH);
|
|
||||||
if (node < 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
addr = fdtdec_get_addr_size(blob, node, "memory-map", &size);
|
|
||||||
if (addr == FDT_ADDR_T_NONE) {
|
|
||||||
debug("%s: Cannot decode address\n", __func__);
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (flash->size != size) {
|
return ret;
|
||||||
debug("%s: Memory map must cover entire device\n", __func__);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
flash->memory_map = map_sysmem(addr, size);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_IS_ENABLED(OF_CONTROL) */
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* spi_flash_probe_slave() - Probe for a SPI flash device on a bus
|
* spi_flash_probe_slave() - Probe for a SPI flash device on a bus
|
||||||
@ -359,47 +399,12 @@ int spi_flash_probe_slave(struct spi_slave *spi, struct spi_flash *flash)
|
|||||||
print_buffer(0, idcode, 1, sizeof(idcode), 0);
|
print_buffer(0, idcode, 1, sizeof(idcode), 0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (spi_flash_validate_params(spi, idcode, flash)) {
|
ret = spi_flash_scan(spi, idcode, flash);
|
||||||
|
if (ret) {
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto err_read_id;
|
goto err_read_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set the quad enable bit - only for quad commands */
|
|
||||||
if ((flash->read_cmd == CMD_READ_QUAD_OUTPUT_FAST) ||
|
|
||||||
(flash->read_cmd == CMD_READ_QUAD_IO_FAST) ||
|
|
||||||
(flash->write_cmd == CMD_QUAD_PAGE_PROGRAM)) {
|
|
||||||
if (spi_flash_set_qeb(flash, idcode[0])) {
|
|
||||||
debug("SF: Fail to set QEB for %02x\n", idcode[0]);
|
|
||||||
ret = -EINVAL;
|
|
||||||
goto err_read_id;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#if CONFIG_IS_ENABLED(OF_CONTROL)
|
|
||||||
if (spi_flash_decode_fdt(gd->fdt_blob, flash)) {
|
|
||||||
debug("SF: FDT decode error\n");
|
|
||||||
ret = -EINVAL;
|
|
||||||
goto err_read_id;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#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, "");
|
|
||||||
if (flash->memory_map)
|
|
||||||
printf(", mapped at %p", flash->memory_map);
|
|
||||||
puts("\n");
|
|
||||||
#endif
|
|
||||||
#ifndef CONFIG_SPI_FLASH_BAR
|
|
||||||
if (((flash->dual_flash == SF_SINGLE_FLASH) &&
|
|
||||||
(flash->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");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_SPI_FLASH_MTD
|
#ifdef CONFIG_SPI_FLASH_MTD
|
||||||
ret = spi_flash_mtd_register(flash);
|
ret = spi_flash_mtd_register(flash);
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user