diff --git a/board/amlogic/vim3/vim3.c b/board/amlogic/vim3/vim3.c
index fcd60ab1e058e53ceb0cd84e34cfacda3741a934..eb3052474b553037d28ba4082f6ce161f3878487 100644
--- a/board/amlogic/vim3/vim3.c
+++ b/board/amlogic/vim3/vim3.c
@@ -15,6 +15,8 @@
 #include <asm/arch/sm.h>
 #include <asm/global_data.h>
 #include <i2c.h>
+#include <linux/psci.h>
+#include <reset.h>
 #include "khadas-mcu.h"
 
 int mmc_get_env_dev(void)
@@ -188,3 +190,26 @@ int misc_init_r(void)
 
 	return 0;
 }
+
+void reset_misc(void)
+{
+	struct reset_ctl usb_reset;
+	struct udevice *dev;
+	ofnode node;
+	int ret;
+
+	node = ofnode_by_compatible(ofnode_null(), "amlogic,meson-g12a-usb-ctrl");
+	if (!ofnode_valid(node))
+		printf("vim3: cannot find amlogic,meson-g12a-usb-ctrl node\n");
+
+	ret = reset_get_by_index_nodev(node, 0, &usb_reset);
+	if (ret < 0)
+		printf("vim3: cannot find usb node reset property\n");
+
+	ret = reset_assert(&usb_reset);
+	if (ret < 0)
+		printf("vim3: cannot assert usb reset\n");
+
+	uclass_get_device_by_name(UCLASS_FIRMWARE, "psci", &dev);
+	invoke_psci_fn(PSCI_0_2_FN_SYSTEM_RESET, 0, 0, 0);
+}
diff --git a/configs/khadas-vim3l_android_defconfig b/configs/khadas-vim3l_android_defconfig
index 085919b9741ab567e98a30d6cc57b14069c85fc0..c16df76448a7180c6234d08f281739323198d5fd 100644
--- a/configs/khadas-vim3l_android_defconfig
+++ b/configs/khadas-vim3l_android_defconfig
@@ -1,6 +1,7 @@
 CONFIG_ARM=y
 CONFIG_SYS_BOARD="vim3"
 CONFIG_SYS_CONFIG_NAME="khadas-vim3l_android"
+CONFIG_ARM_SMCCC=y
 CONFIG_ARCH_MESON=y
 CONFIG_SYS_TEXT_BASE=0x01000000
 CONFIG_NR_DRAM_BANKS=1
@@ -11,6 +12,7 @@ CONFIG_MESON_G12A=y
 CONFIG_DEBUG_UART_BASE=0xff803000
 CONFIG_DEBUG_UART_CLOCK=24000000
 CONFIG_IDENT_STRING=" khadas-vim3l"
+# CONFIG_PSCI_RESET is not set
 CONFIG_DEBUG_UART=y
 CONFIG_REMAKE_ELF=y
 CONFIG_SYS_LOAD_ADDR=0x1000000