[U-Boot] [PATCH v8 01/14] sf: spi_flash_validate_params => spi_flash_scan

Jagan Teki
2015-12-10T15:16:47Z

On 10 December 2015 at 07:00, Bin Meng <bmeng.cn@gmail.com> wrote:
> On Mon, Dec 7, 2015 at 2:34 AM, Jagan Teki <jteki@openedev.com> wrote:
>> 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.
>>
>> Reviewed-by: Simon Glass <sjg@chromium.org>
>> Signed-off-by: Jagan Teki <jteki@openedev.com>
>> ---
>> drivers/mtd/spi/sf_probe.c | 145 +++++++++++++++++++++++----------------------
>> 1 file changed, 75 insertions(+), 70 deletions(-)
>>
>> diff --git a/drivers/mtd/spi/sf_probe.c b/drivers/mtd/spi/sf_probe.c
>> index a619182..0e20088 100644
>> --- a/drivers/mtd/spi/sf_probe.c
>> +++ b/drivers/mtd/spi/sf_probe.c
>> @@ -130,13 +130,42 @@ bank_end:
>> }
>> #endif
>>
>> -static int spi_flash_validate_params(struct spi_slave *spi, u8 *idcode,
>> +#if CONFIG_IS_ENABLED(OF_CONTROL)
>> +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)
>
> nits: please align above line to the left (

What is the reason, will it be an alignment issue.

static int spi_flash_scan(struct spi_slave *spi, u8 *idcode,
struct spi_flash *flash)
{

>
>> {
>> const struct spi_flash_params *params;
>> u8 cmd;
>> u16 jedec = idcode[1] << 8 | idcode[2];
>> u16 ext_jedec = idcode[3] << 8 | idcode[4];
>> + int ret;
>>
>> /* Validate params from 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;
>> }
>>
>> + /* 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 */
>> flash->spi = spi;
>> 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 */
>> 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
>> * dummy cycles of a particular command.
>> * 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 */
>> #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)
>> return ret;
>> #endif
>>
>> - /* 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
>> -
>> - return 0;
>> -}
>> -
>> #if CONFIG_IS_ENABLED(OF_CONTROL)
>> -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;
>> + ret = spi_flash_decode_fdt(gd->fdt_blob, flash);
>> + if (ret) {
>> + debug("SF: FDT decode error\n");
>> + return -EINVAL;
>> }
>> +#endif
>>
>> - if (flash->size != size) {
>> - debug("%s: Memory map must cover entire device\n", __func__);
>> - return -1;
>> +#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");
>> }
>> - flash->memory_map = map_sysmem(addr, size);
>> +#endif
>>
>> - return 0;
>> + return ret;
>> }
>> -#endif /* CONFIG_IS_ENABLED(OF_CONTROL) */
>>
>> /**
>> * 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);
>> #endif
>>
>> - if (spi_flash_validate_params(spi, idcode, flash)) {
>> + ret = spi_flash_scan(spi, idcode, flash);
>> + if (ret) {
>> ret = -EINVAL;
>> 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
>> ret = spi_flash_mtd_register(flash);
>> #endif
>> --
>
> Other than that,
>
> Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
> Tested-by: Bin Meng <bmeng.cn@gmail.com>

thanks!
--
Jagan.