summaryrefslogtreecommitdiff
path: root/drivers/usb/gadget/f_sdp.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/gadget/f_sdp.c')
-rw-r--r--drivers/usb/gadget/f_sdp.c34
1 files changed, 31 insertions, 3 deletions
diff --git a/drivers/usb/gadget/f_sdp.c b/drivers/usb/gadget/f_sdp.c
index 43c5cfbb77..26345bbb5c 100644
--- a/drivers/usb/gadget/f_sdp.c
+++ b/drivers/usb/gadget/f_sdp.c
@@ -634,6 +634,14 @@ static u32 sdp_jump_imxheader(void *address)
return 0;
}
+static ulong sdp_spl_fit_read(struct spl_load_info *load, ulong sector,
+ ulong count, void *buf)
+{
+ memcpy(buf, (void *)sector, count);
+
+ return count;
+}
+
static void sdp_handle_in_ep(void)
{
u8 *data = sdp_func->in_req->buf;
@@ -686,10 +694,30 @@ static void sdp_handle_in_ep(void)
/* If imx header fails, try some U-Boot specific headers */
if (status) {
#ifdef CONFIG_SPL_BUILD
- /* In SPL, allow jumps to U-Boot images */
+ struct image_header *header;
struct spl_image_info spl_image = {};
- spl_parse_image_header(&spl_image,
- (struct image_header *)sdp_func->jmp_address);
+
+ header = (struct image_header *)(ulong)(sdp_func->jmp_address);
+
+ if (IS_ENABLED(CONFIG_SPL_LOAD_FIT) &&
+ image_get_magic(header) == FDT_MAGIC) {
+ struct spl_load_info load;
+
+ debug("Found FIT\n");
+ load.dev = NULL;
+ load.priv = NULL;
+ load.filename = NULL;
+ load.bl_len = 1;
+ load.read = sdp_spl_fit_read;
+ spl_load_simple_fit(&spl_image, &load,
+ sdp_func->jmp_address,
+ (void *)header);
+ } else {
+ /* In SPL, allow jumps to U-Boot images */
+ spl_parse_image_header(&spl_image,
+ (struct image_header *)(ulong)(sdp_func->jmp_address));
+ }
+
jump_to_image_no_args(&spl_image);
#else
/* In U-Boot, allow jumps to scripts */