blob: fcfd38f523ca613b4201dbf4eae9a277909b7ba5 [file] [log] [blame]
Tom Rini83d290c2018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Lukasz Majewski3402b052013-10-08 14:30:44 +02002/*
3 * cmd_thordown.c -- USB TIZEN "THOR" Downloader gadget
4 *
5 * Copyright (C) 2013 Lukasz Majewski <l.majewski@samsung.com>
6 * All rights reserved.
Lukasz Majewski3402b052013-10-08 14:30:44 +02007 */
8
9#include <common.h>
Simon Glass09140112020-05-10 11:40:03 -060010#include <command.h>
Lukasz Majewski3402b052013-10-08 14:30:44 +020011#include <thor.h>
12#include <dfu.h>
13#include <g_dnl.h>
14#include <usb.h>
15
Simon Glass09140112020-05-10 11:40:03 -060016int do_thor_down(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
Lukasz Majewski3402b052013-10-08 14:30:44 +020017{
Marek Vasut76dd4592023-09-01 11:49:53 +020018 char *interface, *devstring;
19 int controller_index;
Marek Vasut5b8c9d12023-09-01 11:49:59 +020020 struct udevice *udc;
Marek Vasut76dd4592023-09-01 11:49:53 +020021 int ret;
22
Lukasz Majewski3402b052013-10-08 14:30:44 +020023 if (argc < 4)
24 return CMD_RET_USAGE;
25
Lukasz Majewski3402b052013-10-08 14:30:44 +020026 puts("TIZEN \"THOR\" Downloader\n");
27
Marek Vasut76dd4592023-09-01 11:49:53 +020028 interface = argv[2];
29 devstring = argv[3];
30
Lukasz Majewski90fadb52014-06-23 09:39:16 +020031 ret = dfu_init_env_entities(interface, devstring);
Lukasz Majewski3402b052013-10-08 14:30:44 +020032 if (ret)
Lukasz Majewski90fadb52014-06-23 09:39:16 +020033 goto done;
Lukasz Majewski3402b052013-10-08 14:30:44 +020034
Marek Vasut76dd4592023-09-01 11:49:53 +020035 controller_index = simple_strtoul(argv[1], NULL, 0);
Marek Vasut5b8c9d12023-09-01 11:49:59 +020036 ret = udc_device_get_by_index(controller_index, &udc);
Lukasz Majewski3402b052013-10-08 14:30:44 +020037 if (ret) {
Seung-Woo Kim71002b52018-06-04 16:04:51 +090038 pr_err("USB init failed: %d\n", ret);
Lukasz Majewski3402b052013-10-08 14:30:44 +020039 ret = CMD_RET_FAILURE;
40 goto exit;
41 }
42
Marek Szyprowskied3a37a2019-06-21 15:39:29 +020043 ret = g_dnl_register("usb_dnl_thor");
44 if (ret) {
45 pr_err("g_dnl_register failed %d\n", ret);
Marek Szyprowski0896d2c2019-10-02 14:29:21 +020046 ret = CMD_RET_FAILURE;
47 goto exit;
Marek Szyprowskied3a37a2019-06-21 15:39:29 +020048 }
Lukasz Majewski3402b052013-10-08 14:30:44 +020049
Marek Vasut5b8c9d12023-09-01 11:49:59 +020050 ret = thor_init(udc);
Lukasz Majewski3402b052013-10-08 14:30:44 +020051 if (ret) {
Seung-Woo Kim71002b52018-06-04 16:04:51 +090052 pr_err("THOR DOWNLOAD failed: %d\n", ret);
Lukasz Majewski3402b052013-10-08 14:30:44 +020053 ret = CMD_RET_FAILURE;
54 goto exit;
55 }
56
Marek Szyprowskie47431a2020-12-22 11:32:24 +010057 do {
Marek Vasut5b8c9d12023-09-01 11:49:59 +020058 ret = thor_handle(udc);
Marek Szyprowskie47431a2020-12-22 11:32:24 +010059 if (ret == THOR_DFU_REINIT_NEEDED) {
60 dfu_free_entities();
61 ret = dfu_init_env_entities(interface, devstring);
62 }
63 if (ret) {
64 pr_err("THOR failed: %d\n", ret);
65 ret = CMD_RET_FAILURE;
66 goto exit;
67 }
68 } while (ret == 0);
Lukasz Majewski3402b052013-10-08 14:30:44 +020069exit:
70 g_dnl_unregister();
Marek Vasut5b8c9d12023-09-01 11:49:59 +020071 udc_device_put(udc);
Lukasz Majewski90fadb52014-06-23 09:39:16 +020072done:
Lukasz Majewski3402b052013-10-08 14:30:44 +020073 dfu_free_entities();
74
75 return ret;
76}
77
78U_BOOT_CMD(thordown, CONFIG_SYS_MAXARGS, 1, do_thor_down,
79 "TIZEN \"THOR\" downloader",
80 "<USB_controller> <interface> <dev>\n"
Vagrant Cascadianc8087f62019-03-05 22:52:14 -080081 " - device software upgrade via LTHOR TIZEN download\n"
Lukasz Majewski3402b052013-10-08 14:30:44 +020082 " program via <USB_controller> on device <dev>,\n"
83 " attached to interface <interface>\n"
84);