diff mbox

[U-Boot,v9,01/14] sf: spi_flash_validate_params => spi_flash_scan

Message ID 1449843417-4189-1-git-send-email-jteki@openedev.com
State Superseded
Delegated to: Jagannadha Sutradharudu Teki
Headers show

Commit Message

Jagan Teki Dec. 11, 2015, 2:16 p.m. UTC
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>
---
Changes for v9:
	- Fixed nits pointed by Bin

 drivers/mtd/spi/sf_probe.c | 147 +++++++++++++++++++++++----------------------
 1 file changed, 76 insertions(+), 71 deletions(-)

Comments

Jagan Teki Dec. 11, 2015, 2:31 p.m. UTC | #1
Hi Bin,

On 11 December 2015 at 19:46, 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.
>
> 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>
> ---
> Changes for v9:
>         - Fixed nits pointed by Bin
>
>  drivers/mtd/spi/sf_probe.c | 147 +++++++++++++++++++++++----------------------
>  1 file changed, 76 insertions(+), 71 deletions(-)
>
> diff --git a/drivers/mtd/spi/sf_probe.c b/drivers/mtd/spi/sf_probe.c
> index a619182..d60c40e 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,
> -                                    struct spi_flash *flash)
> +#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)
>  {

Please let me know if your fine? I need to push this series asap
before the next released.

>         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
> --
> 1.9.1
>
Bin Meng Dec. 11, 2015, 3:06 p.m. UTC | #2
Hi Jagan,

On Fri, Dec 11, 2015 at 10:31 PM, Jagan Teki <jteki@openedev.com> wrote:
> Hi Bin,
>
> On 11 December 2015 at 19:46, 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.
>>
>> 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>
>> ---
>> Changes for v9:
>>         - Fixed nits pointed by Bin
>>
>>  drivers/mtd/spi/sf_probe.c | 147 +++++++++++++++++++++++----------------------
>>  1 file changed, 76 insertions(+), 71 deletions(-)
>>
>> diff --git a/drivers/mtd/spi/sf_probe.c b/drivers/mtd/spi/sf_probe.c
>> index a619182..d60c40e 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,
>> -                                    struct spi_flash *flash)
>> +#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)
>>  {
>
> Please let me know if your fine? I need to push this series asap
> before the next released.

Still looks not correct. See http://patchwork.ozlabs.org/patch/555780/.
I sent you a patch offline. Please check that.

>
>>         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
>> --

Regards,
Bin
diff mbox

Patch

diff --git a/drivers/mtd/spi/sf_probe.c b/drivers/mtd/spi/sf_probe.c
index a619182..d60c40e 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,
-				     struct spi_flash *flash)
+#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)
 {
 	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