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