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

static int do_fastboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
{
	int ret;

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

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

	g_dnl_unregister();
	g_dnl_clear_detach();
	return CMD_RET_SUCCESS;
}

U_BOOT_CMD(
	fastboot,	1,	0,	do_fastboot,
	"use USB Fastboot protocol",
	"\n"
	"    - run as a fastboot usb device"
);

__attribute__((weak)) bool force_fastboot_mode(void);
/*
 * Checks whether forced switching into fastboot mode is requested
 * Returns 0 if requested, 1 - otherwise.
 */
static int do_force_fastboot_mode(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
{
	if (force_fastboot_mode) {
		if (force_fastboot_mode()) {
			printf("Force Fastboot mode: on\n");
			return 0;
		}
		printf("Force Fastboot mode: off\n");
	} else {
		printf("Force Fastboot mode is not supported.\n");
	}

	return 1;
}

U_BOOT_CMD(
	force_fastboot_mode,	1,	0,	do_force_fastboot_mode,
	"check if USB Fastboot mode should be forced", ""
);
