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