diff --git a/src/libcamera/device_enumerator.cpp b/src/libcamera/device_enumerator.cpp
index 58b81c354a706f03..6c08806d17dbfeec 100644
--- a/src/libcamera/device_enumerator.cpp
+++ b/src/libcamera/device_enumerator.cpp
@@ -212,11 +212,7 @@ int DeviceEnumerator::addDevice(const std::string &deviceNode)
 {
 	std::shared_ptr<MediaDevice> media = std::make_shared<MediaDevice>(deviceNode);
 
-	int ret = media->open();
-	if (ret < 0)
-		return ret;
-
-	ret = media->populate();
+	int ret = media->populate();
 	if (ret < 0) {
 		LOG(DeviceEnumerator, Info)
 			<< "Unable to populate media device " << deviceNode
@@ -243,8 +239,6 @@ int DeviceEnumerator::addDevice(const std::string &deviceNode)
 			return ret;
 	}
 
-	media->close();
-
 	LOG(DeviceEnumerator, Debug)
 		<< "Added device " << deviceNode << ": " << media->driver();
 
diff --git a/src/libcamera/media_device.cpp b/src/libcamera/media_device.cpp
index 1e9024bf97217bcf..ecb00a1d5abffe80 100644
--- a/src/libcamera/media_device.cpp
+++ b/src/libcamera/media_device.cpp
@@ -220,6 +220,10 @@ int MediaDevice::populate()
 
 	clear();
 
+	ret = open();
+	if (ret)
+		return ret;
+
 	/*
 	 * Keep calling G_TOPOLOGY until the version number stays stable.
 	 */
@@ -236,7 +240,7 @@ int MediaDevice::populate()
 			LOG(MediaDevice, Error)
 				<< "Failed to enumerate topology: "
 				<< strerror(-ret);
-			return ret;
+			goto err_out;
 		}
 
 		if (version == topology.topology_version)
@@ -260,6 +264,8 @@ int MediaDevice::populate()
 	    populatePads(topology) &&
 	    populateLinks(topology))
 		valid_ = true;
+err_out:
+	close();
 
 	delete[] ents;
 	delete[] interfaces;
@@ -268,7 +274,7 @@ int MediaDevice::populate()
 
 	if (!valid_) {
 		clear();
-		return -EINVAL;
+		return ret ? ret : -EINVAL;
 	}
 
 	return 0;
diff --git a/test/media_device/media_device_print_test.cpp b/test/media_device/media_device_print_test.cpp
index 3eef973939201b27..ceffd538e13fca73 100644
--- a/test/media_device/media_device_print_test.cpp
+++ b/test/media_device/media_device_print_test.cpp
@@ -124,10 +124,6 @@ int MediaDevicePrintTest::testMediaDevice(const string deviceNode)
 
 	dev.close();
 
-	ret = dev.open();
-	if (ret)
-		return ret;
-
 	ret = dev.populate();
 	if (ret)
 		return ret;
@@ -135,8 +131,6 @@ int MediaDevicePrintTest::testMediaDevice(const string deviceNode)
 	/* Print out the media graph. */
 	printMediaGraph(dev, cerr);
 
-	dev.close();
-
 	return 0;
 }
 
diff --git a/test/pipeline/ipu3/ipu3_pipeline_test.cpp b/test/pipeline/ipu3/ipu3_pipeline_test.cpp
index 953f0233cde485cb..1d4cc4d4950b8391 100644
--- a/test/pipeline/ipu3/ipu3_pipeline_test.cpp
+++ b/test/pipeline/ipu3/ipu3_pipeline_test.cpp
@@ -71,11 +71,6 @@ int IPU3PipelineTest::init()
 		return TestSkip;
 	}
 
-	if (cio2->open()) {
-		cerr << "Failed to open media device " << cio2->deviceNode() << endl;
-		return TestFail;
-	}
-
 	/*
 	 * Camera sensor are connected to the CIO2 unit.
 	 * Count how many sensors are connected in the system
