[U-Boot] [PATCH v2 10/15] sf: Enable FDT-based configuration and memory mapping
Simon Glass
sjg at chromium.org
Tue Apr 23 22:52:21 CEST 2013
Hi Jagan,
On Tue, Apr 23, 2013 at 1:49 PM, Jagan Teki <jagannadh.teki at gmail.com> wrote:
> 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.
Yes you are right, this should exit at this point - at present it is
reading twice. I will prepare a patch.
Regards,
Simon
>
> 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