xref: /rk3399_rockchip-uboot/common/spl/spl_dfu.c (revision 52f2acc5e065b52499ee4a8e6baf886b8f5fa6da)
1*52f2acc5SB, Ravi /*
2*52f2acc5SB, Ravi  * (C) Copyright 2016
3*52f2acc5SB, Ravi  * Texas Instruments, <www.ti.com>
4*52f2acc5SB, Ravi  *
5*52f2acc5SB, Ravi  * Ravi B <ravibabu@ti.com>
6*52f2acc5SB, Ravi  *
7*52f2acc5SB, Ravi  * SPDX-License-Identifier:	GPL-2.0+
8*52f2acc5SB, Ravi  */
9*52f2acc5SB, Ravi #include <common.h>
10*52f2acc5SB, Ravi #include <spl.h>
11*52f2acc5SB, Ravi #include <linux/compiler.h>
12*52f2acc5SB, Ravi #include <errno.h>
13*52f2acc5SB, Ravi #include <watchdog.h>
14*52f2acc5SB, Ravi #include <console.h>
15*52f2acc5SB, Ravi #include <g_dnl.h>
16*52f2acc5SB, Ravi #include <usb.h>
17*52f2acc5SB, Ravi #include <dfu.h>
18*52f2acc5SB, Ravi #include <environment.h>
19*52f2acc5SB, Ravi 
20*52f2acc5SB, Ravi static int run_dfu(int usb_index, char *interface, char *devstring)
21*52f2acc5SB, Ravi {
22*52f2acc5SB, Ravi 	int ret;
23*52f2acc5SB, Ravi 
24*52f2acc5SB, Ravi 	ret = dfu_init_env_entities(interface, devstring);
25*52f2acc5SB, Ravi 	if (ret) {
26*52f2acc5SB, Ravi 		dfu_free_entities();
27*52f2acc5SB, Ravi 		goto exit;
28*52f2acc5SB, Ravi 	}
29*52f2acc5SB, Ravi 
30*52f2acc5SB, Ravi 	run_usb_dnl_gadget(usb_index, "usb_dnl_dfu");
31*52f2acc5SB, Ravi exit:
32*52f2acc5SB, Ravi 	dfu_free_entities();
33*52f2acc5SB, Ravi 	return ret;
34*52f2acc5SB, Ravi }
35*52f2acc5SB, Ravi 
36*52f2acc5SB, Ravi int spl_dfu_cmd(int usbctrl, char *dfu_alt_info, char *interface, char *devstr)
37*52f2acc5SB, Ravi {
38*52f2acc5SB, Ravi 	char *str_env;
39*52f2acc5SB, Ravi 	int ret;
40*52f2acc5SB, Ravi 
41*52f2acc5SB, Ravi 	/* set default environment */
42*52f2acc5SB, Ravi 	set_default_env(0);
43*52f2acc5SB, Ravi 	str_env = getenv(dfu_alt_info);
44*52f2acc5SB, Ravi 	if (!str_env) {
45*52f2acc5SB, Ravi 		error("\"dfu_alt_info\" env variable not defined!\n");
46*52f2acc5SB, Ravi 		return -EINVAL;
47*52f2acc5SB, Ravi 	}
48*52f2acc5SB, Ravi 
49*52f2acc5SB, Ravi 	ret = setenv("dfu_alt_info", str_env);
50*52f2acc5SB, Ravi 	if (ret) {
51*52f2acc5SB, Ravi 		error("unable to set env variable \"dfu_alt_info\"!\n");
52*52f2acc5SB, Ravi 		return -EINVAL;
53*52f2acc5SB, Ravi 	}
54*52f2acc5SB, Ravi 
55*52f2acc5SB, Ravi 	/* invoke dfu command */
56*52f2acc5SB, Ravi 	return run_dfu(usbctrl, interface, devstr);
57*52f2acc5SB, Ravi }
58