From patchwork Sat Mar 21 18:09:50 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 3236 Return-Path: Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 4921D60415 for ; Sat, 21 Mar 2020 19:10:03 +0100 (CET) Received: from pendragon.bb.dnainternet.fi (81-175-216-236.bb.dnainternet.fi [81.175.216.236]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id BFDCF308 for ; Sat, 21 Mar 2020 19:10:02 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1584814202; bh=roOAZQK5OOIObpv4aTNuCySoSwr8IvsYcY3GJ7Ktix8=; h=From:To:Subject:Date:From; b=TsBL7bb0ZPJ4a/JXyPmI9MeCcFzBbKrNjXdPvzLHtihMg353Hcun1AVN8KU9z/Y93 VUSa1Mkts1TtJI4pdYKs3eRaoWBFTdosqA7Lgdqke/95qa0kPlBn30V3wU7Ww/GWIJ hrO2NwUl+6TTmmaXAMD/RubSj2VnI1a1KHA/JLus= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Sat, 21 Mar 2020 20:09:50 +0200 Message-Id: <20200321180951.32685-1-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.24.1 MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 1/2] libcamera: device_enumerator_udev: Update pending list in addUdevDevice 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: , X-List-Received-Date: Sat, 21 Mar 2020 18:10:03 -0000 Media devices that have unmet dependencies are added to the pending list in populateMediaDevice(). Move the code to the caller, addUdevDevice(), as it logically belongs there. Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund Reviewed-by: Kieran Bingham --- src/libcamera/device_enumerator_udev.cpp | 28 ++++++++----------- .../include/device_enumerator_udev.h | 2 +- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/src/libcamera/device_enumerator_udev.cpp b/src/libcamera/device_enumerator_udev.cpp index e55350544feb..ea3f6b7c9ae0 100644 --- a/src/libcamera/device_enumerator_udev.cpp +++ b/src/libcamera/device_enumerator_udev.cpp @@ -81,7 +81,8 @@ int DeviceEnumeratorUdev::addUdevDevice(struct udev_device *dev) if (!media) return -ENODEV; - int ret = populateMediaDevice(media); + DependencyMap deps; + int ret = populateMediaDevice(media.get(), &deps); if (ret < 0) { LOG(DeviceEnumerator, Warning) << "Failed to populate media device " @@ -90,10 +91,16 @@ int DeviceEnumeratorUdev::addUdevDevice(struct udev_device *dev) return ret; } - if (ret) { + if (!deps.empty()) { LOG(DeviceEnumerator, Debug) << "Defer media device " << media->deviceNode() << " due to " << ret << " missing dependencies"; + + pending_.emplace_back(media, deps); + MediaDeviceDeps *mediaDeps = &pending_.back(); + for (const auto &dep : mediaDeps->deps_) + devMap_[dep.first] = mediaDeps; + return 0; } @@ -185,10 +192,9 @@ done: return 0; } -int DeviceEnumeratorUdev::populateMediaDevice(const std::shared_ptr &media) +int DeviceEnumeratorUdev::populateMediaDevice(MediaDevice *media, DependencyMap *deps) { std::set children; - DependencyMap deps; /* Associate entities to device node paths. */ for (MediaEntity *entity : media->entities()) { @@ -203,7 +209,7 @@ int DeviceEnumeratorUdev::populateMediaDevice(const std::shared_ptr * dependencies. */ if (orphans_.find(devnum) == orphans_.end()) { - deps[devnum].push_back(entity); + (*deps)[devnum].push_back(entity); continue; } @@ -231,17 +237,7 @@ int DeviceEnumeratorUdev::populateMediaDevice(const std::shared_ptr ++it; } - /* - * If the media device has unmet dependencies, add it to the pending - * list and update the devnum map accordingly. - */ - if (!deps.empty()) { - pending_.emplace_back(media, deps); - for (const auto &dep : deps) - devMap_[dep.first] = &pending_.back(); - } - - return deps.size(); + return 0; } /** diff --git a/src/libcamera/include/device_enumerator_udev.h b/src/libcamera/include/device_enumerator_udev.h index 6d8268620185..efaefe5dc4a3 100644 --- a/src/libcamera/include/device_enumerator_udev.h +++ b/src/libcamera/include/device_enumerator_udev.h @@ -63,7 +63,7 @@ private: std::map devMap_; int addUdevDevice(struct udev_device *dev); - int populateMediaDevice(const std::shared_ptr &media); + int populateMediaDevice(MediaDevice *media, DependencyMap *deps); std::string lookupDeviceNode(dev_t devnum); int addV4L2Device(dev_t devnum);