18cffe5bdSDan Murphy /* 28cffe5bdSDan Murphy * (C) Copyright 2014 38cffe5bdSDan Murphy * Texas Instruments, <www.ti.com> 48cffe5bdSDan Murphy * 58cffe5bdSDan Murphy * Dan Murphy <dmurphy@ti.com> 68cffe5bdSDan Murphy * 78cffe5bdSDan Murphy * SPDX-License-Identifier: GPL-2.0+ 88cffe5bdSDan Murphy * 98cffe5bdSDan Murphy * Derived work from spl_mmc.c 108cffe5bdSDan Murphy */ 118cffe5bdSDan Murphy 128cffe5bdSDan Murphy #include <common.h> 138cffe5bdSDan Murphy #include <spl.h> 148cffe5bdSDan Murphy #include <asm/u-boot.h> 1536afd451SNikita Kiryanov #include <errno.h> 168cffe5bdSDan Murphy #include <usb.h> 178cffe5bdSDan Murphy #include <fat.h> 188cffe5bdSDan Murphy 198cffe5bdSDan Murphy DECLARE_GLOBAL_DATA_PTR; 208cffe5bdSDan Murphy 218cffe5bdSDan Murphy #ifdef CONFIG_USB_STORAGE 228cffe5bdSDan Murphy static int usb_stor_curr_dev = -1; /* current device */ 238cffe5bdSDan Murphy #endif 248cffe5bdSDan Murphy 252a2ee2acSSimon Glass static int spl_usb_load_image(struct spl_image_info *spl_image, 262a2ee2acSSimon Glass struct spl_boot_device *bootdev) 278cffe5bdSDan Murphy { 288cffe5bdSDan Murphy int err; 294101f687SSimon Glass struct blk_desc *stor_dev; 308cffe5bdSDan Murphy 318cffe5bdSDan Murphy usb_stop(); 328cffe5bdSDan Murphy err = usb_init(); 338cffe5bdSDan Murphy if (err) { 348cffe5bdSDan Murphy #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT 358cffe5bdSDan Murphy printf("%s: usb init failed: err - %d\n", __func__, err); 368cffe5bdSDan Murphy #endif 3736afd451SNikita Kiryanov return err; 388cffe5bdSDan Murphy } 398cffe5bdSDan Murphy 408cffe5bdSDan Murphy #ifdef CONFIG_USB_STORAGE 418cffe5bdSDan Murphy /* try to recognize storage devices immediately */ 428cffe5bdSDan Murphy usb_stor_curr_dev = usb_stor_scan(1); 4357ebf67bSSimon Glass stor_dev = blk_get_devnum_by_type(IF_TYPE_USB, usb_stor_curr_dev); 4436afd451SNikita Kiryanov if (!stor_dev) 4536afd451SNikita Kiryanov return -ENODEV; 468cffe5bdSDan Murphy #endif 478cffe5bdSDan Murphy 488cffe5bdSDan Murphy debug("boot mode - FAT\n"); 498cffe5bdSDan Murphy 508cffe5bdSDan Murphy #ifdef CONFIG_SPL_OS_BOOT 51*710e9ca5SSimon Glass if (spl_start_uboot() || 52*710e9ca5SSimon Glass spl_load_image_fat_os(spl_image, stor_dev, 538cffe5bdSDan Murphy CONFIG_SYS_USB_FAT_BOOT_PARTITION)) 548cffe5bdSDan Murphy #endif 55*710e9ca5SSimon Glass { 56*710e9ca5SSimon Glass err = spl_load_image_fat(spl_image, stor_dev, 578cffe5bdSDan Murphy CONFIG_SYS_USB_FAT_BOOT_PARTITION, 58205b4f33SGuillaume GARDET CONFIG_SPL_FS_LOAD_PAYLOAD_NAME); 59*710e9ca5SSimon Glass } 608cffe5bdSDan Murphy 618cffe5bdSDan Murphy if (err) { 6236afd451SNikita Kiryanov puts("Error loading from USB device\n"); 6336afd451SNikita Kiryanov return err; 648cffe5bdSDan Murphy } 6536afd451SNikita Kiryanov 6636afd451SNikita Kiryanov return 0; 678cffe5bdSDan Murphy } 6856df4635SSimon Glass SPL_LOAD_IMAGE_METHOD(0, BOOT_DEVICE_USB, spl_usb_load_image); 69