[U-Boot] [PATCH v2 10/15] sf: Enable FDT-based configuration and memory mapping

Jagan Teki jagannadh.teki at gmail.com
Tue Apr 23 22:49:48 CEST 2013


Hi Simon,

On Mon, Mar 11, 2013 at 9:38 PM, Simon Glass <sjg at chromium.org> wrote:
> Enable device tree control of SPI flash, and use this to implement
> memory-mapped SPI flash, which is supported on Intel chips.
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
> Changes in v2: None
>
>  drivers/mtd/spi/spi_flash.c | 46 ++++++++++++++++++++++++++++++++++++++++++++-
>  include/fdtdec.h            |  1 +
>  include/spi_flash.h         |  1 +
>  lib/fdtdec.c                |  1 +
>  4 files changed, 48 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/mtd/spi/spi_flash.c b/drivers/mtd/spi/spi_flash.c
> index b82011d..111185a 100644
> --- a/drivers/mtd/spi/spi_flash.c
> +++ b/drivers/mtd/spi/spi_flash.c
> @@ -8,6 +8,7 @@
>   */
>
>  #include <common.h>
> +#include <fdtdec.h>
>  #include <malloc.h>
>  #include <spi.h>
>  #include <spi_flash.h>
> @@ -15,6 +16,8 @@
>
>  #include "spi_flash_internal.h"
>
> +DECLARE_GLOBAL_DATA_PTR;
> +
>  static void spi_flash_addr(u32 addr, u8 *cmd)
>  {
>         /* cmd[0] is actual command */
> @@ -146,6 +149,10 @@ int spi_flash_cmd_read_fast(struct spi_flash *flash, u32 offset,
>  {
>         u8 cmd[5];
>
> +       /* Handle memory-mapped SPI */
> +       if (flash->memory_map)
> +               memcpy(data, flash->memory_map + offset, len);
> +

What is this change implies, does this means for memory mapped
flashes, read can do directly through memcpy()
and no need for spi_flash_read_common().

I am thinking what exactly this req' is for as you read the
flash->memory_map + offset onto data and again your reading
FAST_READ on data using spi_flash_read_common().

Can you please explain.

Thanks,
Jagan.

>         cmd[0] = CMD_READ_ARRAY_FAST;
>         spi_flash_addr(offset, cmd);
>         cmd[4] = 0x00;
> @@ -275,6 +282,34 @@ int spi_flash_cmd_write_status(struct spi_flash *flash, u8 sr)
>         return 0;
>  }
>
> +#ifdef CONFIG_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 = (void *)addr;
> +
> +       return 0;
> +}
> +#endif /* CONFIG_OF_CONTROL */
> +
>  /*
>   * The following table holds all device probe functions
>   *
> @@ -391,9 +426,18 @@ struct spi_flash *spi_flash_probe(unsigned int bus, unsigned int cs,
>                 goto err_manufacturer_probe;
>         }
>
> +#ifdef CONFIG_OF_CONTROL
> +       if (spi_flash_decode_fdt(gd->fdt_blob, flash)) {
> +               debug("SF: FDT decode error\n");
> +               goto err_manufacturer_probe;
> +       }
> +#endif
>         printf("SF: Detected %s with page size ", flash->name);
>         print_size(flash->sector_size, ", total ");
> -       print_size(flash->size, "\n");
> +       print_size(flash->size, "");
> +       if (flash->memory_map)
> +               printf(", mapped at %p", flash->memory_map);
> +       puts("\n");
>
>         spi_release_bus(spi);
>
> diff --git a/include/fdtdec.h b/include/fdtdec.h
> index d86dbe2..a46e51c 100644
> --- a/include/fdtdec.h
> +++ b/include/fdtdec.h
> @@ -83,6 +83,7 @@ enum fdt_compat_id {
>         COMPAT_SAMSUNG_EXYNOS_EHCI,     /* Exynos EHCI controller */
>         COMPAT_SAMSUNG_EXYNOS_USB_PHY,  /* Exynos phy controller for usb2.0 */
>         COMPAT_MAXIM_MAX77686_PMIC,     /* MAX77686 PMIC */
> +       COMPAT_GENERIC_SPI_FLASH,       /* Generic SPI Flash chip */
>
>         COMPAT_COUNT,
>  };
> diff --git a/include/spi_flash.h b/include/spi_flash.h
> index 030d49c..3b6a44e 100644
> --- a/include/spi_flash.h
> +++ b/include/spi_flash.h
> @@ -39,6 +39,7 @@ struct spi_flash {
>         /* Erase (sector) size */
>         u32             sector_size;
>
> +       void *memory_map;       /* Address of read-only SPI flash access */
>         int             (*read)(struct spi_flash *flash, u32 offset,
>                                 size_t len, void *buf);
>         int             (*write)(struct spi_flash *flash, u32 offset,
> diff --git a/lib/fdtdec.c b/lib/fdtdec.c
> index e99a4b9..2145354 100644
> --- a/lib/fdtdec.c
> +++ b/lib/fdtdec.c
> @@ -56,6 +56,7 @@ static const char * const compat_names[COMPAT_COUNT] = {
>         COMPAT(SAMSUNG_EXYNOS_EHCI, "samsung,exynos-ehci"),
>         COMPAT(SAMSUNG_EXYNOS_USB_PHY, "samsung,exynos-usb-phy"),
>         COMPAT(MAXIM_MAX77686_PMIC, "maxim,max77686_pmic"),
> +       COMPAT(GENERIC_SPI_FLASH, "spi-flash"),
>  };
>
>  const char *fdtdec_get_compatible(enum fdt_compat_id id)
> --
> 1.8.1.3
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot


More information about the U-Boot mailing list