Merge git://git.denx.de/u-boot-sh
[oweals/u-boot.git] / common / dfu.c
index 546a1ab9b4c0db72963ab7f14a24d86c6b6f47c6..d23cf67f1942447b9f7f0842ca40623cbfb5db69 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * dfu.c -- dfu command
  *
@@ -7,11 +8,11 @@
  * Copyright (C) 2012 Samsung Electronics
  * authors: Andrzej Pietrasiewicz <andrzej.p@samsung.com>
  *         Lukasz Majewski <l.majewski@samsung.com>
- *
- * SPDX-License-Identifier:    GPL-2.0+
  */
 
 #include <common.h>
+#include <command.h>
+#include <log.h>
 #include <watchdog.h>
 #include <dfu.h>
 #include <console.h>
@@ -24,18 +25,22 @@ int run_usb_dnl_gadget(int usbctrl_index, char *usb_dnl_gadget)
        bool dfu_reset = false;
        int ret, i = 0;
 
-       ret = board_usb_init(usbctrl_index, USB_INIT_DEVICE);
+       ret = usb_gadget_initialize(usbctrl_index);
        if (ret) {
-               error("board usb init failed\n");
+               pr_err("usb_gadget_initialize failed\n");
                return CMD_RET_FAILURE;
        }
        g_dnl_clear_detach();
        ret = g_dnl_register(usb_dnl_gadget);
        if (ret) {
-               error("g_dnl_register failed");
+               pr_err("g_dnl_register failed");
                return CMD_RET_FAILURE;
        }
 
+#ifdef CONFIG_DFU_TIMEOUT
+       unsigned long start_time = get_timer(0);
+#endif
+
        while (1) {
                if (g_dnl_detach()) {
                        /*
@@ -75,17 +80,30 @@ int run_usb_dnl_gadget(int usbctrl_index, char *usb_dnl_gadget)
                        ret = dfu_flush(dfu_get_defer_flush(), NULL, 0, 0);
                        dfu_set_defer_flush(NULL);
                        if (ret) {
-                               error("Deferred dfu_flush() failed!");
+                               pr_err("Deferred dfu_flush() failed!");
+                               goto exit;
+                       }
+               }
+
+#ifdef CONFIG_DFU_TIMEOUT
+               unsigned long wait_time = dfu_get_timeout();
+
+               if (wait_time) {
+                       unsigned long current_time = get_timer(start_time);
+
+                       if (current_time > wait_time) {
+                               debug("Inactivity timeout, abort DFU\n");
                                goto exit;
                        }
                }
+#endif
 
                WATCHDOG_RESET();
                usb_gadget_handle_interrupts(usbctrl_index);
        }
 exit:
        g_dnl_unregister();
-       board_usb_cleanup(usbctrl_index, USB_INIT_DEVICE);
+       usb_gadget_release(usbctrl_index);
 
        if (dfu_reset)
                do_reset(NULL, 0, 0, NULL);