#include <dm/uclass.h>
#include <errno.h>
#include <asm/arch/sci/sci.h>
+#include <asm/arch/clock.h>
#include <power-domain.h>
#include <dm/device.h>
#include <dm/uclass-internal.h>
spl_boot_list[0] = BOOT_DEVICE_NOR;
}
}
+
+#ifdef CONFIG_USB_PORT_AUTO
+int board_usb_gadget_port_auto(void)
+{
+ int ret;
+ u32 usb2_data;
+ struct power_domain pd;
+ struct power_domain phy_pd;
+
+ if (!power_domain_lookup_name("conn_usb0", &pd)) {
+ ret = power_domain_on(&pd);
+ if (ret) {
+ printf("conn_usb0 Power up failed!\n");
+ return ret;
+ }
+
+ if (!power_domain_lookup_name("conn_usb0_phy", &phy_pd)) {
+ ret = power_domain_on(&phy_pd);
+ if (ret) {
+ printf("conn_usb0_phy Power up failed!\n");
+ return ret;
+ }
+ } else {
+ return -1;
+ }
+
+ enable_usboh3_clk(1);
+ usb2_data = readl(USB_BASE_ADDR + 0x154);
+
+ ret = power_domain_off(&phy_pd);
+ if (ret) {
+ printf("conn_usb0_phy Power off failed!\n");
+ return ret;
+ }
+ ret = power_domain_off(&pd);
+ if (ret) {
+ printf("conn_usb0 Power off failed!\n");
+ return ret;
+ }
+
+ if (!usb2_data)
+ return 1;
+ else
+ return 0;
+ }
+ return -1;
+}
+#endif
char *usb_controller;
char *endp;
int ret;
+ int index;
if (argc < 2)
return CMD_RET_USAGE;
- usb_controller = argv[1];
- controller_index = simple_strtoul(usb_controller, &endp, 0);
- if (*endp != '\0') {
- pr_err("Error: Wrong USB controller index format\n");
- return CMD_RET_FAILURE;
- }
+ if (!strcmp(argv[1], "auto")) {
+ index = board_usb_gadget_port_auto();
+ if (index >= 0)
+ controller_index = index;
+ else
+ return CMD_RET_USAGE;
+ } else {
+ usb_controller = argv[1];
+ controller_index = simple_strtoul(usb_controller, &endp, 0);
+ if (*endp != '\0') {
+ pr_err("Error: Wrong USB controller index format\n");
+ return CMD_RET_FAILURE;
+ }
#ifdef CONFIG_FASTBOOT_USB_DEV
- controller_index = CONFIG_FASTBOOT_USB_DEV;
+ controller_index = CONFIG_FASTBOOT_USB_DEV;
#endif
+ }
ret = usb_gadget_initialize(controller_index);
if (ret) {
struct spl_boot_device *bootdev)
{
int ret;
- const int controller_index = CONFIG_SPL_SDP_USB_DEV;
+ int index;
+ int controller_index = CONFIG_SPL_SDP_USB_DEV;
+
+ index = board_usb_gadget_port_auto();
+ if (index >= 0)
+ controller_index = index;
usb_gadget_initialize(controller_index);
{
usb_composite_unregister(&g_dnl_driver);
}
+
+int __weak board_usb_gadget_port_auto(void)
+{
+ return -1;
+}
#define MFG_BOOT_CMD "bootz "
#endif
+#ifdef CONFIG_USB_PORT_AUTO
+ #define FASTBOOT_CMD "echo \"Run fastboot ...\"; fastboot auto; "
+#else
+ #define FASTBOOT_CMD "echo \"Run fastboot ...\"; fastboot 0; "
+#endif
+
#define CONFIG_MFG_ENV_SETTINGS_DEFAULT \
"mfgtool_args=setenv bootargs console=${console},${baudrate} " \
"rdinit=/linuxrc " \
MFG_BOOT_CMD "${loadaddr} ${initrd_addr} ${fdt_addr}; " \
"fi; " \
"else " \
- "echo \"Run fastboot ...\"; fastboot 0; " \
+ FASTBOOT_CMD \
"fi;\0" \
#endif
void g_dnl_trigger_detach(void);
void g_dnl_clear_detach(void);
int run_usb_dnl_gadget(int usbctrl_index, char *usb_dnl_gadget);
+int board_usb_gadget_port_auto(void);
#endif /* __G_DOWNLOAD_H_ */