// SPDX-License-Identifier: GPL-2.0+
/*
 * Copyright 2008 - 2009 Windriver, <www.windriver.com>
 * Author: Tom Rix <Tom.Rix@windriver.com>
 *
 * (C) Copyright 2014 Linaro, Ltd.
 * Rob Herring <robh@kernel.org>
 */
#include <common.h>
#include <command.h>
#include <console.h>
#include <fastboot.h>
#include <g_dnl.h>
#include <usb.h>

static int do_fastboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
{
	int controller_index;
	char *usb_controller;
	int ret;
	unsigned long host_connect_timeout_ms = 0;

	if (argc < 2)
		return CMD_RET_USAGE;

	usb_controller = argv[1];
	controller_index = simple_strtoul(usb_controller, NULL, 0);

	/* Optional argv[2] is the timeout in ms. */
	if (argc >= 3) {
		host_connect_timeout_ms = simple_strtoul(argv[2], NULL, 0);
	}

	/*ret = board_usb_init(controller_index, USB_INIT_DEVICE);*/
	ret = 0;
	if (ret) {
		pr_err("USB init failed: %d", ret);
		return CMD_RET_FAILURE;
	}

	g_dnl_clear_detach();
	ret = g_dnl_register("usb_dnl_fastboot");
	if (ret)
		return ret;

	/* This doesn't seem to be hooked up on our board, so we can't rely
	 * on this to detect whether a host is connected or not. */
	if (!g_dnl_board_usb_cable_connected()) {
		puts("\rUSB cable not detected.\n" \
		     "Command exit.\n");
		ret = CMD_RET_FAILURE;
		goto exit;
	}

	unsigned long start_ticks = get_ticks();
	unsigned long wait_ticks = usec2ticks(host_connect_timeout_ms * 1000);

	while (1) {
		if (g_dnl_detach())
			break;
		if (ctrlc())
			break;
		usb_gadget_handle_interrupts(controller_index);

		if (host_connect_timeout_ms && !fastboot_host_connected &&
		    (get_ticks() - start_ticks) > wait_ticks) {
			printf("Host USB not detected, exiting fastboot\n");
			break;
		}
	}

	ret = CMD_RET_SUCCESS;

exit:
	g_dnl_unregister();
	g_dnl_clear_detach();
	board_usb_cleanup(controller_index, USB_INIT_DEVICE);

	return ret;
}

U_BOOT_CMD(
	fastboot, 3, 1, do_fastboot,
	"use USB Fastboot protocol",
	" <USB_controller> [<timeout_ms>]\n"
	"    - run as a fastboot usb device"
);
