From patchwork Wed May 8 15:18:23 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Niklas_S=C3=B6derlund?= X-Patchwork-Id: 1168 Return-Path: Received: from vsp-unauthed02.binero.net (vsp-unauthed02.binero.net [195.74.38.227]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 26BB760E52 for ; Wed, 8 May 2019 17:18:50 +0200 (CEST) X-Halon-ID: 93a21b8f-71a4-11e9-8fa2-005056917a89 Authorized-sender: niklas@soderlund.pp.se Received: from localhost.localdomain (unknown [79.138.136.66]) by bin-vsp-out-01.atm.binero.net (Halon) with ESMTPA id 93a21b8f-71a4-11e9-8fa2-005056917a89; Wed, 08 May 2019 17:18:48 +0200 (CEST) From: =?utf-8?q?Niklas_S=C3=B6derlund?= To: libcamera-devel@lists.libcamera.org Date: Wed, 8 May 2019 17:18:23 +0200 Message-Id: <20190508151831.12274-4-niklas.soderlund@ragnatech.se> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190508151831.12274-1-niklas.soderlund@ragnatech.se> References: <20190508151831.12274-1-niklas.soderlund@ragnatech.se> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 03/11] libcamera: media_device: Only read device information in populate() X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 08 May 2019 15:18:50 -0000 There is no reason to reread the MEDIA_IOC_DEVICE_INFO information every time the media device is opened. Move it populate() where it will be read once together the other information about the media device. Signed-off-by: Niklas Söderlund Reviewed-by: Kieran Bingham Reviewed-by: Laurent Pinchart --- src/libcamera/media_device.cpp | 51 +++++++++++++++------------------- 1 file changed, 22 insertions(+), 29 deletions(-) diff --git a/src/libcamera/media_device.cpp b/src/libcamera/media_device.cpp index 4b3b8f1fa3e6aaad..416a0d0c207ea72d 100644 --- a/src/libcamera/media_device.cpp +++ b/src/libcamera/media_device.cpp @@ -126,18 +126,11 @@ bool MediaDevice::acquire() */ /** - * \brief Open a media device and retrieve device information - * - * Before populating the media graph or performing any operation that interact - * with the device node associated with the media device, the device node must - * be opened. - * - * This function also retrieves media device information from the device node, - * which can be queried through driver(). - * - * If the device is already open the function returns -EBUSY. + * \brief Open the media device * * \return 0 on success or a negative error code otherwise + * \retval -EBUSY Media device already open + * \sa close() */ int MediaDevice::open() { @@ -156,20 +149,6 @@ int MediaDevice::open() } fd_ = ret; - struct media_device_info info = { }; - ret = ioctl(fd_, MEDIA_IOC_DEVICE_INFO, &info); - if (ret) { - ret = -errno; - LOG(MediaDevice, Error) - << "Failed to get media device info " - << ": " << strerror(-ret); - return ret; - } - - driver_ = info.driver; - model_ = info.model; - version_ = info.media_version; - return 0; } @@ -196,12 +175,13 @@ void MediaDevice::close() } /** - * \brief Populate the media graph with media objects + * \brief Populate the MediaDevice with device information and media objects * - * This function enumerates all media objects in the media device graph and - * creates their MediaObject representations. All entities, pads and links are - * stored as MediaEntity, MediaPad and MediaLink respectively, with cross- - * references between objects. Interfaces are not processed. + * This function retrieves the media device information and enumerates all + * media objects in the media device graph and creates their MediaObject + * representations. All entities, pads and links are stored as MediaEntity, + * MediaPad and MediaLink respectively, with cross-references between objects. + * Interfaces are not processed. * * Entities are stored in a separate list in the MediaDevice to ease lookup, * while pads are accessible from the entity they belong to and links from the @@ -225,6 +205,19 @@ int MediaDevice::populate() if (ret) return ret; + struct media_device_info info = {}; + ret = ioctl(fd_, MEDIA_IOC_DEVICE_INFO, &info); + if (ret) { + ret = -errno; + LOG(MediaDevice, Error) + << "Failed to get media device info " << strerror(-ret); + goto done; + } + + driver_ = info.driver; + model_ = info.model; + version_ = info.media_version; + /* * Keep calling G_TOPOLOGY until the version number stays stable. */