spl: spi: Move the generic SPI loader into common/spl
All the other SPL loaders are in this directory, so move the SPI one in there too. There are two board-specific SPI loaders (fsl and sunxi). These remain in the drivers/mtd/spi directory, since they do not contain generic code. Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Tom Rini <trini@konsulko.com>
This commit is contained in:
@@ -25,4 +25,5 @@ obj-$(CONFIG_SPL_FAT_SUPPORT) += spl_fat.o
|
||||
obj-$(CONFIG_SPL_EXT_SUPPORT) += spl_ext.o
|
||||
obj-$(CONFIG_SPL_SATA_SUPPORT) += spl_sata.o
|
||||
obj-$(CONFIG_SPL_DFU_SUPPORT) += spl_dfu.o
|
||||
obj-$(CONFIG_SPL_SPI_LOAD) += spl_spi.o
|
||||
endif
|
||||
|
||||
123
common/spl/spl_spi.c
Normal file
123
common/spl/spl_spi.c
Normal file
@@ -0,0 +1,123 @@
|
||||
/*
|
||||
* Copyright (C) 2011 OMICRON electronics GmbH
|
||||
*
|
||||
* based on drivers/mtd/nand/nand_spl_load.c
|
||||
*
|
||||
* Copyright (C) 2011
|
||||
* Heiko Schocher, DENX Software Engineering, hs@denx.de.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <spi.h>
|
||||
#include <spi_flash.h>
|
||||
#include <errno.h>
|
||||
#include <spl.h>
|
||||
|
||||
#ifdef CONFIG_SPL_OS_BOOT
|
||||
/*
|
||||
* Load the kernel, check for a valid header we can parse, and if found load
|
||||
* the kernel and then device tree.
|
||||
*/
|
||||
static int spi_load_image_os(struct spi_flash *flash,
|
||||
struct image_header *header)
|
||||
{
|
||||
int err;
|
||||
|
||||
/* Read for a header, parse or error out. */
|
||||
spi_flash_read(flash, CONFIG_SYS_SPI_KERNEL_OFFS, 0x40,
|
||||
(void *)header);
|
||||
|
||||
if (image_get_magic(header) != IH_MAGIC)
|
||||
return -1;
|
||||
|
||||
err = spl_parse_image_header(&spl_image, header);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
spi_flash_read(flash, CONFIG_SYS_SPI_KERNEL_OFFS,
|
||||
spl_image.size, (void *)spl_image.load_addr);
|
||||
|
||||
/* Read device tree. */
|
||||
spi_flash_read(flash, CONFIG_SYS_SPI_ARGS_OFFS,
|
||||
CONFIG_SYS_SPI_ARGS_SIZE,
|
||||
(void *)CONFIG_SYS_SPL_ARGS_ADDR);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static ulong spl_spi_fit_read(struct spl_load_info *load, ulong sector,
|
||||
ulong count, void *buf)
|
||||
{
|
||||
struct spi_flash *flash = load->dev;
|
||||
ulong ret;
|
||||
|
||||
ret = spi_flash_read(flash, sector, count, buf);
|
||||
if (!ret)
|
||||
return count;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
/*
|
||||
* The main entry for SPI booting. It's necessary that SDRAM is already
|
||||
* configured and available since this code loads the main U-Boot image
|
||||
* from SPI into SDRAM and starts it from there.
|
||||
*/
|
||||
int spl_spi_load_image(struct spl_boot_device *bootdev)
|
||||
{
|
||||
int err = 0;
|
||||
struct spi_flash *flash;
|
||||
struct image_header *header;
|
||||
|
||||
/*
|
||||
* Load U-Boot image from SPI flash into RAM
|
||||
*/
|
||||
|
||||
flash = spi_flash_probe(CONFIG_SF_DEFAULT_BUS,
|
||||
CONFIG_SF_DEFAULT_CS,
|
||||
CONFIG_SF_DEFAULT_SPEED,
|
||||
CONFIG_SF_DEFAULT_MODE);
|
||||
if (!flash) {
|
||||
puts("SPI probe failed.\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/* use CONFIG_SYS_TEXT_BASE as temporary storage area */
|
||||
header = (struct image_header *)(CONFIG_SYS_TEXT_BASE);
|
||||
|
||||
#ifdef CONFIG_SPL_OS_BOOT
|
||||
if (spl_start_uboot() || spi_load_image_os(flash, header))
|
||||
#endif
|
||||
{
|
||||
/* Load u-boot, mkimage header is 64 bytes. */
|
||||
err = spi_flash_read(flash, CONFIG_SYS_SPI_U_BOOT_OFFS, 0x40,
|
||||
(void *)header);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (IS_ENABLED(CONFIG_SPL_LOAD_FIT)) {
|
||||
struct spl_load_info load;
|
||||
|
||||
debug("Found FIT\n");
|
||||
load.dev = flash;
|
||||
load.priv = NULL;
|
||||
load.filename = NULL;
|
||||
load.bl_len = 1;
|
||||
load.read = spl_spi_fit_read;
|
||||
err = spl_load_simple_fit(&load,
|
||||
CONFIG_SYS_SPI_U_BOOT_OFFS,
|
||||
header);
|
||||
} else {
|
||||
err = spl_parse_image_header(&spl_image, header);
|
||||
if (err)
|
||||
return err;
|
||||
err = spi_flash_read(flash, CONFIG_SYS_SPI_U_BOOT_OFFS,
|
||||
spl_image.size,
|
||||
(void *)spl_image.load_addr);
|
||||
}
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
Reference in New Issue
Block a user