libcamera: device_enumerator_udev: Update pending list in addUdevDevice
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 <laurent.pinchart@ideasonboard.com> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
parent
74c99b41e7
commit
e75ef59e02
2 changed files with 13 additions and 17 deletions
|
@ -81,7 +81,8 @@ int DeviceEnumeratorUdev::addUdevDevice(struct udev_device *dev)
|
||||||
if (!media)
|
if (!media)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
int ret = populateMediaDevice(media);
|
DependencyMap deps;
|
||||||
|
int ret = populateMediaDevice(media.get(), &deps);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
LOG(DeviceEnumerator, Warning)
|
LOG(DeviceEnumerator, Warning)
|
||||||
<< "Failed to populate media device "
|
<< "Failed to populate media device "
|
||||||
|
@ -90,10 +91,16 @@ int DeviceEnumeratorUdev::addUdevDevice(struct udev_device *dev)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret) {
|
if (!deps.empty()) {
|
||||||
LOG(DeviceEnumerator, Debug)
|
LOG(DeviceEnumerator, Debug)
|
||||||
<< "Defer media device " << media->deviceNode()
|
<< "Defer media device " << media->deviceNode()
|
||||||
<< " due to " << ret << " missing dependencies";
|
<< " 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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -185,10 +192,9 @@ done:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int DeviceEnumeratorUdev::populateMediaDevice(const std::shared_ptr<MediaDevice> &media)
|
int DeviceEnumeratorUdev::populateMediaDevice(MediaDevice *media, DependencyMap *deps)
|
||||||
{
|
{
|
||||||
std::set<dev_t> children;
|
std::set<dev_t> children;
|
||||||
DependencyMap deps;
|
|
||||||
|
|
||||||
/* Associate entities to device node paths. */
|
/* Associate entities to device node paths. */
|
||||||
for (MediaEntity *entity : media->entities()) {
|
for (MediaEntity *entity : media->entities()) {
|
||||||
|
@ -203,7 +209,7 @@ int DeviceEnumeratorUdev::populateMediaDevice(const std::shared_ptr<MediaDevice>
|
||||||
* dependencies.
|
* dependencies.
|
||||||
*/
|
*/
|
||||||
if (orphans_.find(devnum) == orphans_.end()) {
|
if (orphans_.find(devnum) == orphans_.end()) {
|
||||||
deps[devnum].push_back(entity);
|
(*deps)[devnum].push_back(entity);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -231,17 +237,7 @@ int DeviceEnumeratorUdev::populateMediaDevice(const std::shared_ptr<MediaDevice>
|
||||||
++it;
|
++it;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
return 0;
|
||||||
* 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();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -63,7 +63,7 @@ private:
|
||||||
std::map<dev_t, MediaDeviceDeps *> devMap_;
|
std::map<dev_t, MediaDeviceDeps *> devMap_;
|
||||||
|
|
||||||
int addUdevDevice(struct udev_device *dev);
|
int addUdevDevice(struct udev_device *dev);
|
||||||
int populateMediaDevice(const std::shared_ptr<MediaDevice> &media);
|
int populateMediaDevice(MediaDevice *media, DependencyMap *deps);
|
||||||
std::string lookupDeviceNode(dev_t devnum);
|
std::string lookupDeviceNode(dev_t devnum);
|
||||||
|
|
||||||
int addV4L2Device(dev_t devnum);
|
int addV4L2Device(dev_t devnum);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue