From patchwork Wed Aug 20 13:23:15 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dan Scally X-Patchwork-Id: 24167 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 3371CC32BB for ; Wed, 20 Aug 2025 13:23:46 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 37A13692D9; Wed, 20 Aug 2025 15:23:42 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="EBk/ZxFY"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 3C1DF6924B for ; Wed, 20 Aug 2025 15:23:37 +0200 (CEST) Received: from mail.ideasonboard.com (cpc141996-chfd3-2-0-cust928.12-3.cable.virginm.net [86.13.91.161]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 7DDD31737; Wed, 20 Aug 2025 15:22:38 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1755696158; bh=m2QHDUqBxfNJb0lR2NwG9UP5ZK+3RlPaAs2vQu5hcoE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=EBk/ZxFYdjP2h5qQ91kUUpmrl6vasLNsV08rcSmweI7rptfiPQc6hcLWp1JGAMIdy q0gO3uhGAZjguLusJJ7w4YBb9I6BgpBnnB8VNmn+X+eV/h8saCF9R2vTndwLV9QIXc djvcV+rgUKhzzFmJlmfDg3QMoVNCBZkvMqj2i/2E= From: Daniel Scally To: libcamera-devel@lists.libcamera.org Cc: dan.scally@ideasonboard.com Subject: [PATCH 2/3] libcamera: device_enumerator_udev: Add initMediaDevice() Date: Wed, 20 Aug 2025 14:23:15 +0100 Message-ID: <20250820132316.1033443-3-dan.scally@ideasonboard.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250820132316.1033443-1-dan.scally@ideasonboard.com> References: <20250820132316.1033443-1-dan.scally@ideasonboard.com> MIME-Version: 1.0 X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" We will shortly be processing MediaDevices created by the device enumerator in two places if they're initially deferreed. Move the steps to a dedicated function so it can be called from multiple places. Signed-off-by: Daniel Scally --- .../internal/device_enumerator_udev.h | 1 + src/libcamera/device_enumerator_udev.cpp | 58 ++++++++++--------- 2 files changed, 33 insertions(+), 26 deletions(-) diff --git a/include/libcamera/internal/device_enumerator_udev.h b/include/libcamera/internal/device_enumerator_udev.h index 1378c1906..a5e5e6efe 100644 --- a/include/libcamera/internal/device_enumerator_udev.h +++ b/include/libcamera/internal/device_enumerator_udev.h @@ -56,6 +56,7 @@ private: int addUdevDevice(struct udev_device *dev); int populateMediaDevice(MediaDevice *media, DependencyMap *deps); + int initMediaDevice(std::unique_ptr media); std::string lookupDeviceNode(dev_t devnum); int addV4L2Device(dev_t devnum); diff --git a/src/libcamera/device_enumerator_udev.cpp b/src/libcamera/device_enumerator_udev.cpp index 4e20a3cc0..53b4fac80 100644 --- a/src/libcamera/device_enumerator_udev.cpp +++ b/src/libcamera/device_enumerator_udev.cpp @@ -82,32 +82,7 @@ int DeviceEnumeratorUdev::addUdevDevice(struct udev_device *dev) if (!media) return -ENODEV; - DependencyMap deps; - int ret = populateMediaDevice(media.get(), &deps); - if (ret < 0) { - LOG(DeviceEnumerator, Warning) - << "Failed to populate media device " - << media->deviceNode() - << " (" << media->driver() << "), skipping"; - return ret; - } - - if (!deps.empty()) { - LOG(DeviceEnumerator, Debug) - << "Defer media device " << media->deviceNode() - << " due to " << deps.size() - << " missing dependencies"; - - pending_.emplace_back(std::move(media), std::move(deps)); - MediaDeviceDeps *mediaDeps = &pending_.back(); - for (const auto &dep : mediaDeps->deps_) - devMap_[dep.first] = mediaDeps; - - return 0; - } - - addDevice(std::move(media)); - return 0; + return initMediaDevice(std::move(media)); } if (!strcmp(subsystem, "video4linux")) { @@ -194,6 +169,37 @@ done: return 0; } +int DeviceEnumeratorUdev::initMediaDevice(std::unique_ptr media) +{ + DependencyMap deps; + + int ret = populateMediaDevice(media.get(), &deps); + if (ret < 0) { + LOG(DeviceEnumerator, Warning) + << "Failed to populate media device " + << media->deviceNode() + << " (" << media->driver() << "), skipping"; + return ret; + } + + if (!deps.empty()) { + LOG(DeviceEnumerator, Debug) + << "Defer media device " << media->deviceNode() + << " due to " << deps.size() + << " missing dependencies"; + + pending_.emplace_back(std::move(media), std::move(deps)); + MediaDeviceDeps *mediaDeps = &pending_.back(); + for (const auto &dep : mediaDeps->deps_) + devMap_[dep.first] = mediaDeps; + + return 0; + } + + addDevice(std::move(media)); + return 0; +} + int DeviceEnumeratorUdev::populateMediaDevice(MediaDevice *media, DependencyMap *deps) { std::set children;