diff --git a/drivers/virtio/virtio-uclass.c b/drivers/virtio/virtio-uclass.c
index 86a5d8af66b..207002bd910 100644
--- a/drivers/virtio/virtio-uclass.c
+++ b/drivers/virtio/virtio-uclass.c
@@ -105,6 +105,13 @@ int virtio_reset(struct udevice *vdev)
 	return ops->reset(vdev->parent);
 }
 
+int virtio_remove(struct udevice *vdev)
+{
+	virtio_del_vqs(vdev);
+
+	return virtio_reset(vdev);
+}
+
 int virtio_get_features(struct udevice *vdev, u64 *features)
 {
 	struct dm_virtio_ops *ops;
diff --git a/drivers/virtio/virtio_blk.c b/drivers/virtio/virtio_blk.c
index 3dd0cf36268..236f807480e 100644
--- a/drivers/virtio/virtio_blk.c
+++ b/drivers/virtio/virtio_blk.c
@@ -222,7 +222,7 @@ U_BOOT_DRIVER(virtio_blk) = {
 	.ops	= &virtio_blk_ops,
 	.bind	= virtio_blk_bind,
 	.probe	= virtio_blk_probe,
-	.remove	= virtio_reset,
+	.remove	= virtio_remove,
 	.priv_auto	= sizeof(struct virtio_blk_priv),
 	.flags	= DM_FLAG_ACTIVE_DMA,
 };
diff --git a/drivers/virtio/virtio_net.c b/drivers/virtio/virtio_net.c
index 7a94c8a528f..d49dab3a6ed 100644
--- a/drivers/virtio/virtio_net.c
+++ b/drivers/virtio/virtio_net.c
@@ -233,7 +233,7 @@ U_BOOT_DRIVER(virtio_net) = {
 	.id	= UCLASS_ETH,
 	.bind	= virtio_net_bind,
 	.probe	= virtio_net_probe,
-	.remove = virtio_reset,
+	.remove = virtio_remove,
 	.ops	= &virtio_net_ops,
 	.priv_auto	= sizeof(struct virtio_net_priv),
 	.plat_auto	= sizeof(struct eth_pdata),
diff --git a/drivers/virtio/virtio_rng.c b/drivers/virtio/virtio_rng.c
index 90a371a59cc..35e88266cb6 100644
--- a/drivers/virtio/virtio_rng.c
+++ b/drivers/virtio/virtio_rng.c
@@ -89,7 +89,7 @@ U_BOOT_DRIVER(virtio_rng) = {
 	.id	= UCLASS_RNG,
 	.bind	= virtio_rng_bind,
 	.probe	= virtio_rng_probe,
-	.remove = virtio_reset,
+	.remove = virtio_remove,
 	.ops	= &virtio_rng_ops,
 	.priv_auto	= sizeof(struct virtio_rng_priv),
 	.flags	= DM_FLAG_ACTIVE_DMA,
diff --git a/drivers/virtio/virtio_scsi.c b/drivers/virtio/virtio_scsi.c
index ee54f1c7449..185081640a7 100644
--- a/drivers/virtio/virtio_scsi.c
+++ b/drivers/virtio/virtio_scsi.c
@@ -243,7 +243,7 @@ U_BOOT_DRIVER(virtio_scsi) = {
 	.priv_auto	= sizeof(struct virtio_scsi_priv),
 	.ops		= &virtio_scsi_ops,
 	.probe		= virtio_scsi_probe,
-	.remove		= virtio_reset,
+	.remove		= virtio_remove,
 	.bind		= virtio_scsi_bind,
 	.flags		= DM_FLAG_ACTIVE_DMA,
 };
diff --git a/include/virtio.h b/include/virtio.h
index ecbd16a98a7..b58ef880b4f 100644
--- a/include/virtio.h
+++ b/include/virtio.h
@@ -294,6 +294,14 @@ int virtio_set_status(struct udevice *vdev, u8 status);
  */
 int virtio_reset(struct udevice *vdev);
 
+/**
+ * virtio_remove() - remove a virtio device by deleting its vqs and resetting it
+ *
+ * @vdev:	the real virtio device
+ * Return: 0 if OK, -ve on error
+ */
+int virtio_remove(struct udevice *vdev);
+
 /**
  * virtio_get_features() - get the array of feature bits for this device
  *
