1 /* 2 * (C) Copyright 2014 3 * Texas Instruments, <www.ti.com> 4 * 5 * Dan Murphy <dmurphy@ti.com> 6 * 7 * SPDX-License-Identifier: GPL-2.0+ 8 * 9 * Derived work from spl_mmc.c 10 */ 11 12 #include <common.h> 13 #include <spl.h> 14 #include <asm/u-boot.h> 15 #include <errno.h> 16 #include <usb.h> 17 #include <fat.h> 18 19 #ifdef CONFIG_USB_STORAGE 20 static int usb_stor_curr_dev = -1; /* current device */ 21 #endif 22 23 static int spl_usb_load_image(struct spl_image_info *spl_image, 24 struct spl_boot_device *bootdev) 25 { 26 int err; 27 struct blk_desc *stor_dev; 28 29 usb_stop(); 30 err = usb_init(); 31 if (err) { 32 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT 33 printf("%s: usb init failed: err - %d\n", __func__, err); 34 #endif 35 return err; 36 } 37 38 #ifdef CONFIG_USB_STORAGE 39 /* try to recognize storage devices immediately */ 40 usb_stor_curr_dev = usb_stor_scan(1); 41 stor_dev = blk_get_devnum_by_type(IF_TYPE_USB, usb_stor_curr_dev); 42 if (!stor_dev) 43 return -ENODEV; 44 #endif 45 46 debug("boot mode - FAT\n"); 47 48 #ifdef CONFIG_SPL_OS_BOOT 49 if (spl_start_uboot() || 50 spl_load_image_fat_os(spl_image, stor_dev, 51 CONFIG_SYS_USB_FAT_BOOT_PARTITION)) 52 #endif 53 { 54 err = spl_load_image_fat(spl_image, stor_dev, 55 CONFIG_SYS_USB_FAT_BOOT_PARTITION, 56 CONFIG_SPL_FS_LOAD_PAYLOAD_NAME); 57 } 58 59 if (err) { 60 puts("Error loading from USB device\n"); 61 return err; 62 } 63 64 return 0; 65 } 66 SPL_LOAD_IMAGE_METHOD("USB", 0, BOOT_DEVICE_USB, spl_usb_load_image); 67