[{"id":37223,"web_url":"https://patchwork.libcamera.org/comment/37223/","msgid":"<5a253eca-1fe3-43bc-be13-8de5c91f4a71@ideasonboard.com>","date":"2025-12-08T09:48:40","subject":"Re: [PATCH 1/7] libcamera: mali-c55: Add RZG2LCRU class","submitter":{"id":216,"url":"https://patchwork.libcamera.org/api/people/216/","name":"Barnabás Pőcze","email":"barnabas.pocze@ideasonboard.com"},"content":"Hi\n\n2025. 12. 05. 15:52 keltezéssel, Jacopo Mondi írta:\n> From: Daniel Scally <dan.scally@ideasonboard.com>\n> \n> Add a class allowing us to control the RZ/G2L Camera Receiver Unit.\n> \n> The class is named after the media device it handles, which is called\n> \"rzg2l_cru\" but the CRU is actually found in other SoCs than the RZ/G2L\n> one, such as the RZ/V2H(P).\n> \n> The RZG2LCRU class models the CSI-2 receiver found on those SoCs and\n> allows to add support for memory-to-memory operations on the RZ/V2H(P)\n> SoC which integrates a Mali-C55 ISP and a specialized DMA engine named\n> IVC that feeds images from memory, where the CRU has saved them.\n> \n> Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com>\n> Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n> ---\n>   src/libcamera/pipeline/mali-c55/meson.build   |   3 +-\n>   src/libcamera/pipeline/mali-c55/rzg2l-cru.cpp | 261 ++++++++++++++++++++++++++\n>   src/libcamera/pipeline/mali-c55/rzg2l-cru.h   |  72 +++++++\n>   3 files changed, 335 insertions(+), 1 deletion(-)\n> \n> [...]\n> +\n> +void RZG2LCRU::cruReturnBuffer(FrameBuffer *buffer)\n> +{\n> +\tfor (const std::unique_ptr<FrameBuffer> &buf : buffers_) {\n> +\t\tif (buf.get() == buffer) {\n> +\t\t\tavailableBuffers_.push(buffer);\n> +\t\t\tbreak;\n> +\t\t}\n> +\t}\n\nI am bit confused by this. Is it expected that sometimes `buffer` will\nnot be in `buffers_`? Is that not an error case?\n\nIt would be a bit more clear to me like this:\n\n   auto it = std::find_if(buffers_.begin(), buffers_.end(), [&](const auto& b) { return b.get() == buffer; }); // or similar\n\n   // ASSERT(it != buffers_.end())\n   // if (it == buffers_.end()) return;\n   // etc.\n\n   availableBuffers_.push(buffer);\n\n\n> +}\n> [...]\n> +void RZG2LCRU::initCRUSizes()\n> +{\n> +\tSize maxCSI2Size;\n> +\n> +\t/*\n> +\t * Get the maximum supported size on the CSI-2 receiver. We need to\n> +\t * query the kernel interface as the size limits differ from RZ/G2L\n> +\t * (2800x4095) and RZ/V2H (4096x4096).\n> +\t */\n> +\tV4L2Subdevice::Formats csi2Formats = csi2_->formats(0);\n> +\tif (csi2Formats.empty())\n> +\t\treturn;\n> +\n> +\tfor (const auto &format : csi2Formats) {\n> +\t\tfor (const auto &range : format.second) {\n> +\t\t\tif (range.max > maxCSI2Size)\n> +\t\t\t\tmaxCSI2Size = range.max;\n> +\t\t}\n> +\t}\n> +\n> +\t/*\n> +\t * Enumerate the sensor supported resolutiond and filter out the ones\n\nresolutiond -> resolutions\n\n\n> +\t * largest than the maximum supported CSI-2 receiver input size.\n\nlargest -> larger\n\n\n> +\t */\n> +\tV4L2Subdevice::Formats formats = sensor_->device()->formats(0);\n> +\tif (formats.empty())\n> +\t\treturn;\n> +\n> +\tfor (const auto &format : formats) {\n> +\t\tfor (const auto &range : format.second) {\n> +\t\t\tconst Size &max = range.max;\n> +\n> +\t\t\tif (max.width > maxCSI2Size.width ||\n> +\t\t\t    max.height > maxCSI2Size.height)\n> +\t\t\t\tcontinue;\n> +\n> +\t\t\tcsi2Sizes_.push_back(max);\n> +\t\t}\n> +\t}\n> +\n> +\t/* Sort in increasing order and remove duplicates. */\n> +\tstd::sort(csi2Sizes_.begin(), csi2Sizes_.end());\n> +\tauto last = std::unique(csi2Sizes_.begin(), csi2Sizes_.end());\n> +\tcsi2Sizes_.erase(last, csi2Sizes_.end());\n> +\n> +\tcsi2Resolution_ = csi2Sizes_.back();\n> +}\n> +\n> +int RZG2LCRU::init(const MediaDevice *media)\n> +{\n> +\tint ret;\n> +\n> +\tcsi2_ = V4L2Subdevice::fromEntityName(media,\n> +\t\t\t\t\t      std::regex(\"csi-[0-9a-f]{8}.csi2\"));\n\nMaybe have `static const std::regex csi2Regex(\"...\");` somewhere?\n\n\n> +\tif (!csi2_)\n> +\t\treturn -ENODEV;\n> +\n> +\tret = csi2_->open();\n> +\tif (ret)\n> +\t\treturn ret;\n> +\n> +\tconst std::vector<MediaPad *> &pads = csi2_->entity()->pads();\n> +\tif (pads.empty())\n> +\t\treturn -ENODEV;\n> +\n> +\t/* The receiver has a single sink pad at index 0 */\n> +\tMediaPad *sink = pads[0];\n> +\tconst std::vector<MediaLink *> &links = sink->links();\n> +\tif (links.empty())\n> +\t\treturn -ENODEV;\n> +\n> +\tMediaLink *link = links[0];\n> +\tsensor_ = CameraSensorFactoryBase::create(link->source()->entity());\n> +\tif (!sensor_)\n> +\t\treturn -ENODEV;\n> +\n> +\tcru_ = V4L2Subdevice::fromEntityName(media,\n> +\t\t\t\t\t     std::regex(\"cru-ip-[0-9a-f]{8}.cru[0-9]\"));\n\nSame here.\n\n\n> +\tret = cru_->open();\n> +\tif (ret)\n> +\t\treturn ret;\n> +\n> +\toutput_ = V4L2VideoDevice::fromEntityName(media, \"CRU output\");\n> +\tret = output_->open();\n> +\tif (ret)\n> +\t\treturn ret;\n> +\n> +\tinitCRUSizes();\n> +\n> +\treturn 0;\n> +}\n> +\n> +} /* namespace libcamera */\n> diff --git a/src/libcamera/pipeline/mali-c55/rzg2l-cru.h b/src/libcamera/pipeline/mali-c55/rzg2l-cru.h\n> new file mode 100644\n> index 0000000000000000000000000000000000000000..9944e71cda82a494182619f01766f32f57a8b516\n> --- /dev/null\n> +++ b/src/libcamera/pipeline/mali-c55/rzg2l-cru.h\n> @@ -0,0 +1,72 @@\n> [...]\n> +class RZG2LCRU\n> +{\n> +public:\n> +\tstatic constexpr unsigned int kBufferCount = 4;\n> +\n> +\tRZG2LCRU() = default;\n> +\n> +\tconst std::vector<Size> &sizes() const\n> +\t{\n> +\t\treturn csi2Sizes_;\n> +\t}\n> +\n> +\tint init(const MediaDevice *media);\n> +\tconst Size &resolution() const\n> +\t{\n> +\t\treturn csi2Resolution_;\n> +\t}\n> +\n> +\tCameraSensor *sensor() const { return sensor_.get(); }\n> +\n> +\tint configure(V4L2SubdeviceFormat *subdevFormat, V4L2DeviceFormat *inputFormat);\n> +\tFrameBuffer *queueBuffer(Request *request);\n> +\tvoid cruReturnBuffer(FrameBuffer *buffer);\n> +\tV4L2VideoDevice *output() { return output_.get(); }\n> +\tint start();\n> +\tint stop();\n\nAn empty line is missing for me here.\n\n\nRegards,\nBarnabás Pőcze\n\n\n> +private:\n> +\tvoid freeBuffers();\n> +\n> [...]","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 6FE28C3257\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon,  8 Dec 2025 09:48:48 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 74981613F1;\n\tMon,  8 Dec 2025 10:48:47 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 27B8660C8A\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  8 Dec 2025 10:48:45 +0100 (CET)","from [192.168.33.35] (185.221.142.68.nat.pool.zt.hu\n\t[185.221.142.68])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id B6343316;\n\tMon,  8 Dec 2025 10:46:25 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"ZlkyKkC6\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1765187185;\n\tbh=9yl1EmeXmZeGfbT15lt7Dl8EhJ81m+HsQmwsWTRMz/4=;\n\th=Date:Subject:To:References:From:In-Reply-To:From;\n\tb=ZlkyKkC6PkDwdoZuRFXUg3kFVlGS7fZyZWqIAbCJRxhD3ovqBwvrV7cuBvU7iL3Hy\n\tak210G28Vk0uGz7x0M1cDPGjH3hRBZ7I6du4BchDXgkg0lgejfvCCKjltyTBA7OSBw\n\thP+aSv9uh2+o5kvNuyO/2+Yeo7BkcELU7wVBirlQ=","Message-ID":"<5a253eca-1fe3-43bc-be13-8de5c91f4a71@ideasonboard.com>","Date":"Mon, 8 Dec 2025 10:48:40 +0100","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH 1/7] libcamera: mali-c55: Add RZG2LCRU class","To":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>,\n\tDaniel Scally <dan.scally@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","References":"<20251205-mali-cru-v1-0-d81bb5ffe73a@ideasonboard.com>\n\t<kVlb_vH6JgsoqyV7OgcE9bUkuIUf-ofAmywS-jn5C9BKnY1C-VE9YD5hplkE8g1NObI4ff48asjps6xhdy5fjg==@protonmail.internalid>\n\t<20251205-mali-cru-v1-1-d81bb5ffe73a@ideasonboard.com>","From":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Content-Language":"en-US, hu-HU","In-Reply-To":"<20251205-mali-cru-v1-1-d81bb5ffe73a@ideasonboard.com>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"8bit","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":37242,"web_url":"https://patchwork.libcamera.org/comment/37242/","msgid":"<invuwwbxrqk5txqshlmzmoxi7gc3nyxn2dmo7jxlbesxirqfp6@bmsxn4zk5gde>","date":"2025-12-10T08:28:22","subject":"Re: [PATCH 1/7] libcamera: mali-c55: Add RZG2LCRU class","submitter":{"id":143,"url":"https://patchwork.libcamera.org/api/people/143/","name":"Jacopo Mondi","email":"jacopo.mondi@ideasonboard.com"},"content":"Hi Barnabás\n\nOn Mon, Dec 08, 2025 at 10:48:40AM +0100, Barnabás Pőcze wrote:\n> Hi\n>\n> 2025. 12. 05. 15:52 keltezéssel, Jacopo Mondi írta:\n> > From: Daniel Scally <dan.scally@ideasonboard.com>\n> >\n> > Add a class allowing us to control the RZ/G2L Camera Receiver Unit.\n> >\n> > The class is named after the media device it handles, which is called\n> > \"rzg2l_cru\" but the CRU is actually found in other SoCs than the RZ/G2L\n> > one, such as the RZ/V2H(P).\n> >\n> > The RZG2LCRU class models the CSI-2 receiver found on those SoCs and\n> > allows to add support for memory-to-memory operations on the RZ/V2H(P)\n> > SoC which integrates a Mali-C55 ISP and a specialized DMA engine named\n> > IVC that feeds images from memory, where the CRU has saved them.\n> >\n> > Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com>\n> > Signed-off-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n> > ---\n> >   src/libcamera/pipeline/mali-c55/meson.build   |   3 +-\n> >   src/libcamera/pipeline/mali-c55/rzg2l-cru.cpp | 261 ++++++++++++++++++++++++++\n> >   src/libcamera/pipeline/mali-c55/rzg2l-cru.h   |  72 +++++++\n> >   3 files changed, 335 insertions(+), 1 deletion(-)\n> >\n> > [...]\n> > +\n> > +void RZG2LCRU::cruReturnBuffer(FrameBuffer *buffer)\n> > +{\n> > +\tfor (const std::unique_ptr<FrameBuffer> &buf : buffers_) {\n> > +\t\tif (buf.get() == buffer) {\n> > +\t\t\tavailableBuffers_.push(buffer);\n> > +\t\t\tbreak;\n> > +\t\t}\n> > +\t}\n>\n> I am bit confused by this. Is it expected that sometimes `buffer` will\n> not be in `buffers_`? Is that not an error case?\n\nI don't see how it can happen, and if it happens is a programming\nmistake that's worth an assertion imho\n\n>\n> It would be a bit more clear to me like this:\n>\n>   auto it = std::find_if(buffers_.begin(), buffers_.end(), [&](const auto& b) { return b.get() == buffer; }); // or similar\n>\n>   // ASSERT(it != buffers_.end())\n\nyes!\n\n>   // if (it == buffers_.end()) return;\n>   // etc.\n>\n>   availableBuffers_.push(buffer);\n>\n>\n> > +}\n> > [...]\n> > +void RZG2LCRU::initCRUSizes()\n> > +{\n> > +\tSize maxCSI2Size;\n> > +\n> > +\t/*\n> > +\t * Get the maximum supported size on the CSI-2 receiver. We need to\n> > +\t * query the kernel interface as the size limits differ from RZ/G2L\n> > +\t * (2800x4095) and RZ/V2H (4096x4096).\n> > +\t */\n> > +\tV4L2Subdevice::Formats csi2Formats = csi2_->formats(0);\n> > +\tif (csi2Formats.empty())\n> > +\t\treturn;\n> > +\n> > +\tfor (const auto &format : csi2Formats) {\n> > +\t\tfor (const auto &range : format.second) {\n> > +\t\t\tif (range.max > maxCSI2Size)\n> > +\t\t\t\tmaxCSI2Size = range.max;\n> > +\t\t}\n> > +\t}\n> > +\n> > +\t/*\n> > +\t * Enumerate the sensor supported resolutiond and filter out the ones\n>\n> resolutiond -> resolutions\n>\n>\n> > +\t * largest than the maximum supported CSI-2 receiver input size.\n>\n> largest -> larger\n>\n\nThanks\n\n>\n> > +\t */\n> > +\tV4L2Subdevice::Formats formats = sensor_->device()->formats(0);\n> > +\tif (formats.empty())\n> > +\t\treturn;\n> > +\n> > +\tfor (const auto &format : formats) {\n> > +\t\tfor (const auto &range : format.second) {\n> > +\t\t\tconst Size &max = range.max;\n> > +\n> > +\t\t\tif (max.width > maxCSI2Size.width ||\n> > +\t\t\t    max.height > maxCSI2Size.height)\n> > +\t\t\t\tcontinue;\n> > +\n> > +\t\t\tcsi2Sizes_.push_back(max);\n> > +\t\t}\n> > +\t}\n> > +\n> > +\t/* Sort in increasing order and remove duplicates. */\n> > +\tstd::sort(csi2Sizes_.begin(), csi2Sizes_.end());\n> > +\tauto last = std::unique(csi2Sizes_.begin(), csi2Sizes_.end());\n> > +\tcsi2Sizes_.erase(last, csi2Sizes_.end());\n> > +\n> > +\tcsi2Resolution_ = csi2Sizes_.back();\n> > +}\n> > +\n> > +int RZG2LCRU::init(const MediaDevice *media)\n> > +{\n> > +\tint ret;\n> > +\n> > +\tcsi2_ = V4L2Subdevice::fromEntityName(media,\n> > +\t\t\t\t\t      std::regex(\"csi-[0-9a-f]{8}.csi2\"));\n>\n> Maybe have `static const std::regex csi2Regex(\"...\");` somewhere?\n>\n\nok\n>\n> > +\tif (!csi2_)\n> > +\t\treturn -ENODEV;\n> > +\n> > +\tret = csi2_->open();\n> > +\tif (ret)\n> > +\t\treturn ret;\n> > +\n> > +\tconst std::vector<MediaPad *> &pads = csi2_->entity()->pads();\n> > +\tif (pads.empty())\n> > +\t\treturn -ENODEV;\n> > +\n> > +\t/* The receiver has a single sink pad at index 0 */\n> > +\tMediaPad *sink = pads[0];\n> > +\tconst std::vector<MediaLink *> &links = sink->links();\n> > +\tif (links.empty())\n> > +\t\treturn -ENODEV;\n> > +\n> > +\tMediaLink *link = links[0];\n> > +\tsensor_ = CameraSensorFactoryBase::create(link->source()->entity());\n> > +\tif (!sensor_)\n> > +\t\treturn -ENODEV;\n> > +\n> > +\tcru_ = V4L2Subdevice::fromEntityName(media,\n> > +\t\t\t\t\t     std::regex(\"cru-ip-[0-9a-f]{8}.cru[0-9]\"));\n>\n> Same here.\n>\n>\n> > +\tret = cru_->open();\n> > +\tif (ret)\n> > +\t\treturn ret;\n> > +\n> > +\toutput_ = V4L2VideoDevice::fromEntityName(media, \"CRU output\");\n> > +\tret = output_->open();\n> > +\tif (ret)\n> > +\t\treturn ret;\n> > +\n> > +\tinitCRUSizes();\n> > +\n> > +\treturn 0;\n> > +}\n> > +\n> > +} /* namespace libcamera */\n> > diff --git a/src/libcamera/pipeline/mali-c55/rzg2l-cru.h b/src/libcamera/pipeline/mali-c55/rzg2l-cru.h\n> > new file mode 100644\n> > index 0000000000000000000000000000000000000000..9944e71cda82a494182619f01766f32f57a8b516\n> > --- /dev/null\n> > +++ b/src/libcamera/pipeline/mali-c55/rzg2l-cru.h\n> > @@ -0,0 +1,72 @@\n> > [...]\n> > +class RZG2LCRU\n> > +{\n> > +public:\n> > +\tstatic constexpr unsigned int kBufferCount = 4;\n> > +\n> > +\tRZG2LCRU() = default;\n> > +\n> > +\tconst std::vector<Size> &sizes() const\n> > +\t{\n> > +\t\treturn csi2Sizes_;\n> > +\t}\n> > +\n> > +\tint init(const MediaDevice *media);\n> > +\tconst Size &resolution() const\n> > +\t{\n> > +\t\treturn csi2Resolution_;\n> > +\t}\n> > +\n> > +\tCameraSensor *sensor() const { return sensor_.get(); }\n> > +\n> > +\tint configure(V4L2SubdeviceFormat *subdevFormat, V4L2DeviceFormat *inputFormat);\n> > +\tFrameBuffer *queueBuffer(Request *request);\n> > +\tvoid cruReturnBuffer(FrameBuffer *buffer);\n> > +\tV4L2VideoDevice *output() { return output_.get(); }\n> > +\tint start();\n> > +\tint stop();\n>\n> An empty line is missing for me here.\n\nyes it is! thanks\n\n>\n>\n> Regards,\n> Barnabás Pőcze\n>\n>\n> > +private:\n> > +\tvoid freeBuffers();\n> > +\n> > [...]\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 3604FBD1F1\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 10 Dec 2025 08:28:32 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 6E3026143E;\n\tWed, 10 Dec 2025 09:28:31 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id E86536142F\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 10 Dec 2025 09:28:28 +0100 (CET)","from ideasonboard.com (mob-5-90-63-16.net.vodafone.it [5.90.63.16])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id B46E9153F;\n\tWed, 10 Dec 2025 09:28:26 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"IW6c+EqU\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1765355307;\n\tbh=5QkUptKeNi8hu+fjuE+LTV6i74Z16BtHjQPVEPS7n1s=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=IW6c+EqUKtsdisePrLQvTuBFwSnedBf3pBsLWqjXdiO7oN6uUXtXHMPcPFixmhH0D\n\tDsCCUEE+9N3xFoVg7sUNnmM4h6ydjiS7l8+eIltMZ8Y6jxhihqxFjGYzGqadBrN9KS\n\t9ITJYT+BNecokGe7aIGsZcp+bT5epXe+ot7VJiJ4=","Date":"Wed, 10 Dec 2025 09:28:22 +0100","From":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","To":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Cc":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>, \n\tDaniel Scally <dan.scally@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH 1/7] libcamera: mali-c55: Add RZG2LCRU class","Message-ID":"<invuwwbxrqk5txqshlmzmoxi7gc3nyxn2dmo7jxlbesxirqfp6@bmsxn4zk5gde>","References":"<20251205-mali-cru-v1-0-d81bb5ffe73a@ideasonboard.com>\n\t<kVlb_vH6JgsoqyV7OgcE9bUkuIUf-ofAmywS-jn5C9BKnY1C-VE9YD5hplkE8g1NObI4ff48asjps6xhdy5fjg==@protonmail.internalid>\n\t<20251205-mali-cru-v1-1-d81bb5ffe73a@ideasonboard.com>\n\t<5a253eca-1fe3-43bc-be13-8de5c91f4a71@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<5a253eca-1fe3-43bc-be13-8de5c91f4a71@ideasonboard.com>","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]