xref: /rk3399_rockchip-uboot/common/spl/spl_dfu.c (revision 90aa625c9a9e1fb7a2f001fd8e50099bacaf92b8)
152f2acc5SB, Ravi /*
252f2acc5SB, Ravi  * (C) Copyright 2016
352f2acc5SB, Ravi  * Texas Instruments, <www.ti.com>
452f2acc5SB, Ravi  *
552f2acc5SB, Ravi  * Ravi B <ravibabu@ti.com>
652f2acc5SB, Ravi  *
752f2acc5SB, Ravi  * SPDX-License-Identifier:	GPL-2.0+
852f2acc5SB, Ravi  */
952f2acc5SB, Ravi #include <common.h>
1052f2acc5SB, Ravi #include <spl.h>
1152f2acc5SB, Ravi #include <linux/compiler.h>
1252f2acc5SB, Ravi #include <errno.h>
1352f2acc5SB, Ravi #include <watchdog.h>
1452f2acc5SB, Ravi #include <console.h>
1552f2acc5SB, Ravi #include <g_dnl.h>
1652f2acc5SB, Ravi #include <usb.h>
1752f2acc5SB, Ravi #include <dfu.h>
1852f2acc5SB, Ravi #include <environment.h>
1952f2acc5SB, Ravi 
run_dfu(int usb_index,char * interface,char * devstring)2052f2acc5SB, Ravi static int run_dfu(int usb_index, char *interface, char *devstring)
2152f2acc5SB, Ravi {
2252f2acc5SB, Ravi 	int ret;
2352f2acc5SB, Ravi 
2452f2acc5SB, Ravi 	ret = dfu_init_env_entities(interface, devstring);
2552f2acc5SB, Ravi 	if (ret) {
2652f2acc5SB, Ravi 		dfu_free_entities();
2752f2acc5SB, Ravi 		goto exit;
2852f2acc5SB, Ravi 	}
2952f2acc5SB, Ravi 
3052f2acc5SB, Ravi 	run_usb_dnl_gadget(usb_index, "usb_dnl_dfu");
3152f2acc5SB, Ravi exit:
3252f2acc5SB, Ravi 	dfu_free_entities();
3352f2acc5SB, Ravi 	return ret;
3452f2acc5SB, Ravi }
3552f2acc5SB, Ravi 
spl_dfu_cmd(int usbctrl,char * dfu_alt_info,char * interface,char * devstr)3652f2acc5SB, Ravi int spl_dfu_cmd(int usbctrl, char *dfu_alt_info, char *interface, char *devstr)
3752f2acc5SB, Ravi {
3852f2acc5SB, Ravi 	char *str_env;
3952f2acc5SB, Ravi 	int ret;
4052f2acc5SB, Ravi 
4152f2acc5SB, Ravi 	/* set default environment */
4252f2acc5SB, Ravi 	set_default_env(0);
4300caae6dSSimon Glass 	str_env = env_get(dfu_alt_info);
4452f2acc5SB, Ravi 	if (!str_env) {
45*90aa625cSMasahiro Yamada 		pr_err("\"dfu_alt_info\" env variable not defined!\n");
4652f2acc5SB, Ravi 		return -EINVAL;
4752f2acc5SB, Ravi 	}
4852f2acc5SB, Ravi 
49382bee57SSimon Glass 	ret = env_set("dfu_alt_info", str_env);
5052f2acc5SB, Ravi 	if (ret) {
51*90aa625cSMasahiro Yamada 		pr_err("unable to set env variable \"dfu_alt_info\"!\n");
5252f2acc5SB, Ravi 		return -EINVAL;
5352f2acc5SB, Ravi 	}
5452f2acc5SB, Ravi 
5552f2acc5SB, Ravi 	/* invoke dfu command */
5652f2acc5SB, Ravi 	return run_dfu(usbctrl, interface, devstr);
5752f2acc5SB, Ravi }
58