diff --git a/include/libcamera/internal/device_enumerator.h b/include/libcamera/internal/device_enumerator.h
index 1d6dbcb104b8..f4ee349906f2 100644
--- a/include/libcamera/internal/device_enumerator.h
+++ b/include/libcamera/internal/device_enumerator.h
@@ -31,6 +31,7 @@ public:
 	virtual int enumerate() = 0;
 
 	std::shared_ptr<MediaDevice> search(const MediaDeviceMatch &dm);
+	std::shared_ptr<USBDevice> search(const USBDeviceMatch &dm);
 
 	Signal<> devicesAdded;
 
diff --git a/src/libcamera/device_enumerator.cpp b/src/libcamera/device_enumerator.cpp
index 1fde7367cfa8..0d983032e2c6 100644
--- a/src/libcamera/device_enumerator.cpp
+++ b/src/libcamera/device_enumerator.cpp
@@ -271,4 +271,18 @@ std::shared_ptr<MediaDevice> DeviceEnumerator::search(const MediaDeviceMatch &dm
 	return nullptr;
 }
 
+std::shared_ptr<USBDevice> DeviceEnumerator::search(const USBDeviceMatch &dm)
+{
+	for (std::shared_ptr<USBDevice> &usb : usbDevices_) {
+		if (dm.match(usb.get())) {
+			LOG(DeviceEnumerator, Debug)
+				<< "Successful match for USB device "
+				<< usb->vid() << "-" << usb->pid();
+			return usb;
+		}
+	}
+
+	return nullptr;
+}
+
 } /* namespace libcamera */
