diff --git a/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp b/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp index de09431c..9550f546 100644 --- a/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp +++ b/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp @@ -117,6 +117,8 @@ protected: int queueRequestDevice(Camera *camera, Request *request) override; + bool acquireDevice(Camera *camera) override; + private: static constexpr Size kPreviewSize = { 1920, 1080 }; static constexpr Size kMinISISize = { 1, 1 }; @@ -143,6 +145,8 @@ private: std::unique_ptr crossbar_; std::vector pipes_; + + V4L2Subdevice::Routing routing_ = {}; }; /* ----------------------------------------------------------------------------- @@ -950,6 +954,19 @@ int PipelineHandlerISI::queueRequestDevice(Camera *camera, Request *request) return 0; } +bool PipelineHandlerISI::acquireDevice([[maybe_unused]] Camera *camera) +{ + if (useCount() > 0) + return true; + + /* Enable routing for all available sensors once */ + int ret = crossbar_->setRouting(&routing_, V4L2Subdevice::ActiveFormat); + if (ret) + return false; + + return true; +} + bool PipelineHandlerISI::match(DeviceEnumerator *enumerator) { DeviceMatch dm("mxc-isi"); @@ -1034,7 +1051,6 @@ bool PipelineHandlerISI::match(DeviceEnumerator *enumerator) unsigned int numSinks = 0; const unsigned int xbarFirstSource = crossbar_->entity()->pads().size() - pipes_.size(); const unsigned int maxStreams = pipes_.size() / cameraCount; - V4L2Subdevice::Routing routing = {}; for (MediaPad *pad : crossbar_->entity()->pads()) { unsigned int sink = numSinks; @@ -1104,7 +1120,7 @@ bool PipelineHandlerISI::match(DeviceEnumerator *enumerator) /* Add routes to the crossbar switch routing table. */ for (unsigned i = 0; i < data->streams_.size(); i++) { unsigned int sourcePad = xbarFirstSource + data->xbarSourceOffset_ + i; - routing.emplace_back(V4L2Subdevice::Stream{ data->xbarSink_, 0 }, + routing_.emplace_back(V4L2Subdevice::Stream{ data->xbarSink_, 0 }, V4L2Subdevice::Stream{ sourcePad, 0 }, V4L2_SUBDEV_ROUTE_FL_ACTIVE); } @@ -1116,10 +1132,6 @@ bool PipelineHandlerISI::match(DeviceEnumerator *enumerator) numCameras++; } - ret = crossbar_->setRouting(&routing, V4L2Subdevice::ActiveFormat); - if (ret) - return false; - return numCameras > 0; }