diff --git a/src/libcamera/pipeline/raspberrypi/dma_heaps.cpp b/src/libcamera/pipeline/raspberrypi/dma_heaps.cpp
index 6769c04640f1..739f05d3d4d8 100644
--- a/src/libcamera/pipeline/raspberrypi/dma_heaps.cpp
+++ b/src/libcamera/pipeline/raspberrypi/dma_heaps.cpp
@@ -32,20 +32,36 @@ LOG_DECLARE_CATEGORY(RPI)
 namespace RPi {
 
 DmaHeap::DmaHeap()
+	: dmaHeapHandle_(-1)
+{
+}
+
+DmaHeap::~DmaHeap()
+{
+	close();
+}
+
+int DmaHeap::open()
 {
 	dmaHeapHandle_ = ::open(DMA_HEAP_CMA_NAME, O_RDWR, 0);
 	if (dmaHeapHandle_ == -1) {
 		dmaHeapHandle_ = ::open(DMA_HEAP_CMA_ALT_NAME, O_RDWR, 0);
 		if (dmaHeapHandle_ == -1) {
 			LOG(RPI, Error) << "Could not open dmaHeap device";
+			return dmaHeapHandle_;
 		}
 	}
+
+	return 0;
 }
 
-DmaHeap::~DmaHeap()
+void DmaHeap::close()
 {
-	if (dmaHeapHandle_)
-		::close(dmaHeapHandle_);
+	if (dmaHeapHandle_ < 0)
+		return;
+
+	::close(dmaHeapHandle_);
+	dmaHeapHandle_ = -1;
 }
 
 FileDescriptor DmaHeap::alloc(const char *name, std::size_t size)
diff --git a/src/libcamera/pipeline/raspberrypi/dma_heaps.h b/src/libcamera/pipeline/raspberrypi/dma_heaps.h
index ae6be1135f17..3e17993097ef 100644
--- a/src/libcamera/pipeline/raspberrypi/dma_heaps.h
+++ b/src/libcamera/pipeline/raspberrypi/dma_heaps.h
@@ -18,6 +18,8 @@ class DmaHeap
 public:
 	DmaHeap();
 	~DmaHeap();
+	int open();
+	void close();
 	FileDescriptor alloc(const char *name, std::size_t size);
 
 private:
