From patchwork Fri May 8 16:17:19 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: arash golgol X-Patchwork-Id: 2172 Return-Path: X-Original-To: noreply@patchwork.local Delivered-To: noreply@patchwork.local Received: from tor.lore.kernel.org (tor.lore.kernel.org [172.105.105.114]) by mxe881.netcup.net (Postfix) with ESMTPS id 62ACF1C0266 for ; Fri, 8 May 2026 18:19:17 +0200 (CEST) Authentication-Results: mxe881; dkim=pass header.d=gmail.com; spf=pass (sender IP is 172.105.105.114) smtp.mailfrom=linux-sunxi+bounces-23197-noreply=patchwork.local@lists.linux.dev smtp.helo=tor.lore.kernel.org Received-SPF: pass (mxe881: domain of lists.linux.dev designates 172.105.105.114 as permitted sender) client-ip=172.105.105.114; envelope-from=linux-sunxi+bounces-23197-noreply=patchwork.local@lists.linux.dev; helo=tor.lore.kernel.org; Received: from smtp.subspace.kernel.org (conduit.subspace.kernel.org [100.90.174.1]) by tor.lore.kernel.org (Postfix) with ESMTP id 46315300F968 for ; Fri, 8 May 2026 16:17:29 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 03C1B3A5434; Fri, 8 May 2026 16:17:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="kybQQdA1" X-Original-To: linux-sunxi@lists.linux.dev Received: from mail-wm1-f51.google.com (mail-wm1-f51.google.com [209.85.128.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 09A4737F8DF for ; Fri, 8 May 2026 16:17:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778257047; cv=none; b=gLsgOE2DQG6NIMLd4d4KbeOIPS5pKNwXqPPlFZbHw9zFM8oKiwivKKSTfo4gd2l6kQnhjS0df42WvwQ5vT0gwHsqqDbix78F7+XxKxsQMZ9AejXDKGhyTnI9MD0NAASQlJuQnIgbFst/I/VZSwfW1bf0CnJkLmCzEQ+/hcE8DUc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778257047; c=relaxed/simple; bh=R4+nLgoVAuFWhqHVtGCJNj7vWvD4oK/DuuOzcemREh0=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=srZzSvnjBZzM4+p9S6Vgr0Dv5fIsVJTE6A30/8jnDVGcWU8xxINjW9xHnvJgq5aHMCOrr95QhAEwl79A+z7Po/r+LTW+maRK4Gg25oshHG6jDy2GJMHfB93c9M9V8Z8BafsCqAgNpwfQZxFgIeEX4KSyX0EggSwSQiaskwIGRew= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=kybQQdA1; arc=none smtp.client-ip=209.85.128.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-wm1-f51.google.com with SMTP id 5b1f17b1804b1-4891b0786beso15311655e9.1 for ; Fri, 08 May 2026 09:17:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778257043; x=1778861843; darn=lists.linux.dev; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=S3XkqNiuObg+Eg83bTwhKKS4jJUDgRyEKJp/bfR24Wc=; b=kybQQdA1uRqY9J5pn4Udb6cqKgc04VxBR4oxpEa/rqfrsR6m5+G8xjEzf8BoBiK83/ RnG8mhjQHEKDY7I9hdUu1fQ2pxcAW7GdRKygVGXJLYa7ko9ahxN6Bg+IO0NpTWwRlTWR GE2SXxzyvj6491DmrJLvSLmnvZ32DLqSra8xtajYCNHgxMoZym5HVTFrt89CgQnqW3Yf PbzY1Bxv/mTkudL/+4xTippj61HZASe6EMpTioJu7MFn9amlRkXMAG7oZPuhq1bZ94XQ KWWlNuIZWUlgu5LasuCx0Uxt6pSx+KRCDRb+Q7qGs8/vtYVRUWC8n3HUIXIyRv6zIYq1 hGyg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778257043; x=1778861843; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=S3XkqNiuObg+Eg83bTwhKKS4jJUDgRyEKJp/bfR24Wc=; b=JNMyoVvjl2C9olAuzXileSnjOF4/KSpfN4QTAL+EOkP6oBylnZrIO3XTPJIsyMyMyl vr7x2Q/J7QHM93DsVpijLLuJ3tc/FaIh68ieR1uDajB0o95uofMwONwdKJKgN17C4bd9 U284rw5umdVOO1WhZaCPdsWUkOUvNfsA02R8oY03wNiEeyqMD4xfPXVJ5ALTzJ5p8LXV FfWwVp4cbIgFf/g48QcQPhhQNDRvA3anvCzyoefoq6rUrhMN33NPAesxWdNmBN6INBrT VeJ7MhelepR4zk2VLZX01n/FPym/YoE7JbWfhEghvFUgq9xtiiXym5oZoRaLPvCeKqu8 Yw5g== X-Forwarded-Encrypted: i=1; AFNElJ+VFTC0WuuLW7zlBd58t7kgVmOu+HGeeHjUwBCRqhYOservtXFf6Q76DuX/fZZugNS5g7t82KxXP9JZPg==@lists.linux.dev X-Gm-Message-State: AOJu0YzeFOVClIbfqLtgyV9DLoRf7fG4AJ0XQkP83k++Gdb9LF7scfky iJB4h+M+QOZ8iJ4waTFbDtaq2J0DsUvgqajYW68BCYLiXIEv8SzxkILx X-Gm-Gg: AeBDiesRUN4iERUUmADNRkcr1vC7OchwLTMO2/tcdg60wxV3CwCl01rHgo0IqxrLSch 3u9gFgBq2Qb1rkcUZ0zyKxAFgQDQWNUxOjQnFLgrmS9++hjeryiVyxNgkrtOTQPGfKeKoZsNpAs ZRG3qhwiQWOn4JP0rHD8k3A5FVTe+RIEd+2MXLbO7amnNrpd9GcNVzjSo1MjXDpE9bDsDmGeykR FrvGO3CbBppYO/i8R347G/ENCEkG2YQUN128EUWdn6aorOGU4xZgYo7w/Z1fx6060ZndNrzrsMQ vlVedC4EunPa+/g/Jo9bVlHpH4mhJRrpwXcIkUSzFDEfd4l2z5zhTCnwcsJxt+MMu0dPfalxC5T P5cn3wLCv3iqgXP7GPZ36fEtW37Wjz5EbJSf+Ug+ZtjnQU9yXM2PJOI3dTHrJglIj1Wq3UuZgtQ eDD6TYEgX8JGj1BQU27XGh+2AaLPB4sU1BZ1qGdPsz2v2LpsVNE/22cWalLWK0WUywmJ377rB5n yiGWvFYmg== X-Received: by 2002:a05:600c:8b65:b0:48a:53ea:140b with SMTP id 5b1f17b1804b1-48e51f4e5fdmr240134475e9.28.1778257043079; Fri, 08 May 2026 09:17:23 -0700 (PDT) Received: from thinkpad ([46.164.92.151]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-48e6db098e0sm2930305e9.17.2026.05.08.09.17.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 08 May 2026 09:17:22 -0700 (PDT) From: Arash Golgol To: linux-media@vger.kernel.org Cc: yong.deng@magewell.com, paulk@sys-base.io, mchehab@kernel.org, wens@kernel.org, jernej.skrabec@gmail.com, samuel@sholland.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, laurent.pinchart@ideasonboard.com, sakari.ailus@linux.intel.com, Arash Golgol Subject: [PATCH v2 1/3] media: sun6i-csi: bridge: Use V4L2 subdev active state Date: Fri, 8 May 2026 19:47:19 +0330 Message-Id: <20260508161721.94285-2-arash.golgol@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260508161721.94285-1-arash.golgol@gmail.com> References: <20260508161721.94285-1-arash.golgol@gmail.com> Precedence: bulk X-Mailing-List: linux-sunxi@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MORS-Enabled: yes X-MORS-DOMAIN: patchwork.local X-MORS-HOSTING: hosting172546 X-MORS-USER: hosting172546 X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= Use the V4L2 subdev active state API to store the active format. This simplifies the driver not only by dropping the bridge mbus_format field, but it also allows dropping the bridge lock, replaced with the state lock. Previously, capture accessed bridge private state directly. After moving to framework-managed state, resolve the format through the subdev pad API. The sun6i-csi-bridge hardware does not perform any format conversion. Enforce identical formats on the sink and source pads in the set_fmt() and init_state() callbacks. Signed-off-by: Arash Golgol Reviewed-by: Paul Kocialkowski Tested-by: Paul Kocialkowski Reviewed-by: Laurent Pinchart --- Changes in v2: - Fix indentation in link validation path - link to v1: https://patchwork.kernel.org/project/linux-media/patch/20260217064050.18388-2-arash.golgol@gmail.com/ .../sunxi/sun6i-csi/sun6i_csi_bridge.c | 154 ++++++++---------- .../sunxi/sun6i-csi/sun6i_csi_bridge.h | 9 - .../sunxi/sun6i-csi/sun6i_csi_capture.c | 27 ++- 3 files changed, 85 insertions(+), 105 deletions(-) diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_bridge.c b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_bridge.c index d006d9dd0170..4406b0f8c839 100644 --- a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_bridge.c +++ b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_bridge.c @@ -13,26 +13,6 @@ #include "sun6i_csi_bridge.h" #include "sun6i_csi_reg.h" -/* Helpers */ - -void sun6i_csi_bridge_dimensions(struct sun6i_csi_device *csi_dev, - unsigned int *width, unsigned int *height) -{ - if (width) - *width = csi_dev->bridge.mbus_format.width; - if (height) - *height = csi_dev->bridge.mbus_format.height; -} - -void sun6i_csi_bridge_format(struct sun6i_csi_device *csi_dev, - u32 *mbus_code, u32 *field) -{ - if (mbus_code) - *mbus_code = csi_dev->bridge.mbus_format.code; - if (field) - *field = csi_dev->bridge.mbus_format.field; -} - /* Format */ static const struct sun6i_csi_bridge_format sun6i_csi_bridge_formats[] = { @@ -226,7 +206,8 @@ static void sun6i_csi_bridge_disable(struct sun6i_csi_device *csi_dev) } static void -sun6i_csi_bridge_configure_parallel(struct sun6i_csi_device *csi_dev) +sun6i_csi_bridge_configure_parallel(struct sun6i_csi_device *csi_dev, + const struct v4l2_mbus_framefmt *mbus_format) { struct device *dev = csi_dev->dev; struct regmap *regmap = csi_dev->regmap; @@ -234,11 +215,9 @@ sun6i_csi_bridge_configure_parallel(struct sun6i_csi_device *csi_dev) &csi_dev->bridge.source_parallel.endpoint; unsigned char bus_width = endpoint->bus.parallel.bus_width; unsigned int flags = endpoint->bus.parallel.flags; - u32 field; + u32 field = mbus_format->field; u32 value = SUN6I_CSI_IF_CFG_IF_CSI; - sun6i_csi_bridge_format(csi_dev, NULL, &field); - if (field == V4L2_FIELD_INTERLACED || field == V4L2_FIELD_INTERLACED_TB || field == V4L2_FIELD_INTERLACED_BT) @@ -317,13 +296,12 @@ sun6i_csi_bridge_configure_parallel(struct sun6i_csi_device *csi_dev) } static void -sun6i_csi_bridge_configure_mipi_csi2(struct sun6i_csi_device *csi_dev) +sun6i_csi_bridge_configure_mipi_csi2(struct sun6i_csi_device *csi_dev, + const struct v4l2_mbus_framefmt *mbus_format) { struct regmap *regmap = csi_dev->regmap; u32 value = SUN6I_CSI_IF_CFG_IF_MIPI; - u32 field; - - sun6i_csi_bridge_format(csi_dev, NULL, &field); + u32 field = mbus_format->field; if (field == V4L2_FIELD_INTERLACED || field == V4L2_FIELD_INTERLACED_TB || @@ -335,19 +313,19 @@ sun6i_csi_bridge_configure_mipi_csi2(struct sun6i_csi_device *csi_dev) regmap_write(regmap, SUN6I_CSI_IF_CFG_REG, value); } -static void sun6i_csi_bridge_configure_format(struct sun6i_csi_device *csi_dev) +static void sun6i_csi_bridge_configure_format(struct sun6i_csi_device *csi_dev, + const struct v4l2_mbus_framefmt *mbus_format) { struct regmap *regmap = csi_dev->regmap; bool capture_streaming = csi_dev->capture.state.streaming; const struct sun6i_csi_bridge_format *bridge_format; const struct sun6i_csi_capture_format *capture_format; - u32 mbus_code, field, pixelformat; + u32 pixelformat; + u32 field = mbus_format->field; u8 input_format, input_yuv_seq, output_format; u32 value = 0; - sun6i_csi_bridge_format(csi_dev, &mbus_code, &field); - - bridge_format = sun6i_csi_bridge_format_find(mbus_code); + bridge_format = sun6i_csi_bridge_format_find(mbus_format->code); if (WARN_ON(!bridge_format)) return; @@ -391,16 +369,17 @@ static void sun6i_csi_bridge_configure_format(struct sun6i_csi_device *csi_dev) } static void sun6i_csi_bridge_configure(struct sun6i_csi_device *csi_dev, - struct sun6i_csi_bridge_source *source) + struct sun6i_csi_bridge_source *source, + const struct v4l2_mbus_framefmt *mbus_format) { struct sun6i_csi_bridge *bridge = &csi_dev->bridge; if (source == &bridge->source_parallel) - sun6i_csi_bridge_configure_parallel(csi_dev); + sun6i_csi_bridge_configure_parallel(csi_dev, mbus_format); else - sun6i_csi_bridge_configure_mipi_csi2(csi_dev); + sun6i_csi_bridge_configure_mipi_csi2(csi_dev, mbus_format); - sun6i_csi_bridge_configure_format(csi_dev); + sun6i_csi_bridge_configure_format(csi_dev, mbus_format); } /* V4L2 Subdev */ @@ -415,6 +394,8 @@ static int sun6i_csi_bridge_s_stream(struct v4l2_subdev *subdev, int on) struct sun6i_csi_bridge_source *source; struct v4l2_subdev *source_subdev; struct media_pad *remote_pad; + struct v4l2_subdev_state *state; + const struct v4l2_mbus_framefmt *mbus_format; int ret; /* Source */ @@ -433,6 +414,10 @@ static int sun6i_csi_bridge_s_stream(struct v4l2_subdev *subdev, int on) else source = &bridge->source_mipi_csi2; + /* Active State */ + + state = v4l2_subdev_lock_and_get_active_state(subdev); + if (!on) { v4l2_subdev_call(source_subdev, video, s_stream, 0); ret = 0; @@ -443,7 +428,7 @@ static int sun6i_csi_bridge_s_stream(struct v4l2_subdev *subdev, int on) ret = pm_runtime_resume_and_get(dev); if (ret < 0) - return ret; + goto unlock; /* Clear */ @@ -451,7 +436,9 @@ static int sun6i_csi_bridge_s_stream(struct v4l2_subdev *subdev, int on) /* Configure */ - sun6i_csi_bridge_configure(csi_dev, source); + mbus_format = v4l2_subdev_state_get_format(state, + SUN6I_CSI_BRIDGE_PAD_SINK); + sun6i_csi_bridge_configure(csi_dev, source, mbus_format); if (capture_streaming) sun6i_csi_capture_configure(csi_dev); @@ -472,7 +459,8 @@ static int sun6i_csi_bridge_s_stream(struct v4l2_subdev *subdev, int on) if (ret && ret != -ENOIOCTLCMD) goto disable; - return 0; + ret = 0; + goto unlock; disable: if (capture_streaming) @@ -482,6 +470,8 @@ static int sun6i_csi_bridge_s_stream(struct v4l2_subdev *subdev, int on) pm_runtime_put(dev); +unlock: + v4l2_subdev_unlock_state(state); return ret; } @@ -504,21 +494,23 @@ sun6i_csi_bridge_mbus_format_prepare(struct v4l2_mbus_framefmt *mbus_format) static int sun6i_csi_bridge_init_state(struct v4l2_subdev *subdev, struct v4l2_subdev_state *state) { - struct sun6i_csi_device *csi_dev = v4l2_get_subdevdata(subdev); - unsigned int pad = SUN6I_CSI_BRIDGE_PAD_SINK; - struct v4l2_mbus_framefmt *mbus_format = - v4l2_subdev_state_get_format(state, pad); - struct mutex *lock = &csi_dev->bridge.lock; + unsigned int pad; - mutex_lock(lock); + /* + * This subdev does not perform format conversion, + * initialize both pads identically. + */ + for (pad = 0; pad < subdev->entity.num_pads; pad++) { + struct v4l2_mbus_framefmt *mbus_format; - mbus_format->code = sun6i_csi_bridge_formats[0].mbus_code; - mbus_format->width = 1280; - mbus_format->height = 720; + mbus_format = v4l2_subdev_state_get_format(state, pad); - sun6i_csi_bridge_mbus_format_prepare(mbus_format); + mbus_format->code = sun6i_csi_bridge_formats[0].mbus_code; + mbus_format->width = 1280; + mbus_format->height = 720; - mutex_unlock(lock); + sun6i_csi_bridge_mbus_format_prepare(mbus_format); + } return 0; } @@ -536,53 +528,32 @@ sun6i_csi_bridge_enum_mbus_code(struct v4l2_subdev *subdev, return 0; } -static int sun6i_csi_bridge_get_fmt(struct v4l2_subdev *subdev, - struct v4l2_subdev_state *state, - struct v4l2_subdev_format *format) -{ - struct sun6i_csi_device *csi_dev = v4l2_get_subdevdata(subdev); - struct v4l2_mbus_framefmt *mbus_format = &format->format; - struct mutex *lock = &csi_dev->bridge.lock; - - mutex_lock(lock); - - if (format->which == V4L2_SUBDEV_FORMAT_TRY) - *mbus_format = *v4l2_subdev_state_get_format(state, - format->pad); - else - *mbus_format = csi_dev->bridge.mbus_format; - - mutex_unlock(lock); - - return 0; -} - static int sun6i_csi_bridge_set_fmt(struct v4l2_subdev *subdev, struct v4l2_subdev_state *state, struct v4l2_subdev_format *format) { - struct sun6i_csi_device *csi_dev = v4l2_get_subdevdata(subdev); - struct v4l2_mbus_framefmt *mbus_format = &format->format; - struct mutex *lock = &csi_dev->bridge.lock; + struct v4l2_mbus_framefmt *fmt; - mutex_lock(lock); + /* The format on the source pad always matches the sink pad. */ + if (format->pad != SUN6I_CSI_BRIDGE_PAD_SINK) + return v4l2_subdev_get_fmt(subdev, state, format); - sun6i_csi_bridge_mbus_format_prepare(mbus_format); + sun6i_csi_bridge_mbus_format_prepare(&format->format); - if (format->which == V4L2_SUBDEV_FORMAT_TRY) - *v4l2_subdev_state_get_format(state, format->pad) = - *mbus_format; - else - csi_dev->bridge.mbus_format = *mbus_format; + /* Set the format on the sink pad. */ + fmt = v4l2_subdev_state_get_format(state, format->pad); + *fmt = format->format; - mutex_unlock(lock); + /* Propagate the format to the source pad. */ + fmt = v4l2_subdev_state_get_format(state, SUN6I_CSI_BRIDGE_PAD_SOURCE); + *fmt = format->format; return 0; } static const struct v4l2_subdev_pad_ops sun6i_csi_bridge_pad_ops = { .enum_mbus_code = sun6i_csi_bridge_enum_mbus_code, - .get_fmt = sun6i_csi_bridge_get_fmt, + .get_fmt = v4l2_subdev_get_fmt, .set_fmt = sun6i_csi_bridge_set_fmt, }; @@ -780,8 +751,6 @@ int sun6i_csi_bridge_setup(struct sun6i_csi_device *csi_dev) }; int ret; - mutex_init(&bridge->lock); - /* V4L2 Subdev */ v4l2_subdev_init(subdev, &sun6i_csi_bridge_subdev_ops); @@ -809,6 +778,12 @@ int sun6i_csi_bridge_setup(struct sun6i_csi_device *csi_dev) if (ret < 0) return ret; + /* V4L2 Subdev finalize */ + + ret = v4l2_subdev_init_finalize(subdev); + if (ret < 0) + goto error_media_entity; + /* V4L2 Subdev */ if (csi_dev->isp_available) @@ -818,7 +793,7 @@ int sun6i_csi_bridge_setup(struct sun6i_csi_device *csi_dev) if (ret) { dev_err(dev, "failed to register v4l2 subdev: %d\n", ret); - goto error_media_entity; + goto error_subdev_finalize; } /* V4L2 Async */ @@ -852,6 +827,9 @@ int sun6i_csi_bridge_setup(struct sun6i_csi_device *csi_dev) else v4l2_device_unregister_subdev(subdev); +error_subdev_finalize: + v4l2_subdev_cleanup(subdev); + error_media_entity: media_entity_cleanup(&subdev->entity); @@ -868,5 +846,7 @@ void sun6i_csi_bridge_cleanup(struct sun6i_csi_device *csi_dev) v4l2_device_unregister_subdev(subdev); + v4l2_subdev_cleanup(subdev); + media_entity_cleanup(&subdev->entity); } diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_bridge.h b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_bridge.h index 44653b38f722..a5b0a6f064dd 100644 --- a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_bridge.h +++ b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_bridge.h @@ -42,20 +42,11 @@ struct sun6i_csi_bridge { struct v4l2_subdev subdev; struct v4l2_async_notifier notifier; struct media_pad pads[2]; - struct v4l2_mbus_framefmt mbus_format; - struct mutex lock; /* Mbus format lock. */ struct sun6i_csi_bridge_source source_parallel; struct sun6i_csi_bridge_source source_mipi_csi2; }; -/* Helpers */ - -void sun6i_csi_bridge_dimensions(struct sun6i_csi_device *csi_dev, - unsigned int *width, unsigned int *height); -void sun6i_csi_bridge_format(struct sun6i_csi_device *csi_dev, - u32 *mbus_code, u32 *field); - /* Format */ const struct sun6i_csi_bridge_format * diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c index 65879f4802c0..d90abba21309 100644 --- a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c +++ b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c @@ -888,14 +888,19 @@ static int sun6i_csi_capture_link_validate(struct media_link *link) media_entity_to_video_device(link->sink->entity); struct sun6i_csi_device *csi_dev = video_get_drvdata(video_dev); struct v4l2_device *v4l2_dev = csi_dev->v4l2_dev; + struct v4l2_subdev *src_subdev = + media_entity_to_v4l2_subdev(link->source->entity); const struct sun6i_csi_capture_format *capture_format; const struct sun6i_csi_bridge_format *bridge_format; unsigned int capture_width, capture_height; - unsigned int bridge_width, bridge_height; const struct v4l2_format_info *format_info; + struct v4l2_subdev_format src_fmt = { + .which = V4L2_SUBDEV_FORMAT_ACTIVE, + .pad = link->source->index + }; u32 pixelformat, capture_field; - u32 mbus_code, bridge_field; bool match; + int ret; sun6i_csi_capture_dimensions(csi_dev, &capture_width, &capture_height); @@ -904,19 +909,22 @@ static int sun6i_csi_capture_link_validate(struct media_link *link) if (WARN_ON(!capture_format)) return -EINVAL; - sun6i_csi_bridge_dimensions(csi_dev, &bridge_width, &bridge_height); + /* Resolve csi bridge format. */ + ret = v4l2_subdev_call(src_subdev, pad, get_fmt, NULL, &src_fmt); + if (ret) + return ret; - sun6i_csi_bridge_format(csi_dev, &mbus_code, &bridge_field); - bridge_format = sun6i_csi_bridge_format_find(mbus_code); + bridge_format = sun6i_csi_bridge_format_find(src_fmt.format.code); if (WARN_ON(!bridge_format)) return -EINVAL; /* No cropping/scaling is supported. */ - if (capture_width != bridge_width || capture_height != bridge_height) { + if (capture_width != src_fmt.format.width || + capture_height != src_fmt.format.height) { v4l2_err(v4l2_dev, "invalid input/output dimensions: %ux%u/%ux%u\n", - bridge_width, bridge_height, capture_width, - capture_height); + src_fmt.format.width, src_fmt.format.height, + capture_width, capture_height); return -EINVAL; } @@ -947,7 +955,8 @@ static int sun6i_csi_capture_link_validate(struct media_link *link) /* With raw input mode, we need a 1:1 match between input and output. */ if (bridge_format->input_format == SUN6I_CSI_INPUT_FMT_RAW || capture_format->input_format_raw) { - match = sun6i_csi_capture_format_match(pixelformat, mbus_code); + match = sun6i_csi_capture_format_match(pixelformat, + src_fmt.format.code); if (!match) goto invalid; } From patchwork Fri May 8 16:17:20 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: arash golgol X-Patchwork-Id: 2171 Return-Path: X-Original-To: noreply@patchwork.local Delivered-To: noreply@patchwork.local Received: from sea.lore.kernel.org (sea.lore.kernel.org [172.234.253.10]) by mxe881.netcup.net (Postfix) with ESMTPS id D57BB1C0266 for ; Fri, 8 May 2026 18:18:47 +0200 (CEST) Authentication-Results: mxe881; dkim=pass header.d=gmail.com; spf=pass (sender IP is 172.234.253.10) smtp.mailfrom=linux-sunxi+bounces-23198-noreply=patchwork.local@lists.linux.dev smtp.helo=sea.lore.kernel.org Received-SPF: pass (mxe881: domain of lists.linux.dev designates 172.234.253.10 as permitted sender) client-ip=172.234.253.10; envelope-from=linux-sunxi+bounces-23198-noreply=patchwork.local@lists.linux.dev; helo=sea.lore.kernel.org; Received: from smtp.subspace.kernel.org (conduit.subspace.kernel.org [100.90.174.1]) by sea.lore.kernel.org (Postfix) with ESMTP id B5F203037887 for ; Fri, 8 May 2026 16:17:41 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 290CA330B01; Fri, 8 May 2026 16:17:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="lw6OjcNo" X-Original-To: linux-sunxi@lists.linux.dev Received: from mail-wm1-f45.google.com (mail-wm1-f45.google.com [209.85.128.45]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9D77537702C for ; Fri, 8 May 2026 16:17:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778257061; cv=none; b=tDOU3HUm/cGD/RJ/dbF+oRMGwViQWZ64B761DLJgIhKUNuK864mbNP+KJXhEW/cMf9as8ZeS9urlbVMdV6OfeOMKnLUF4Usbh4G6Jd/nLK2qpXZ6+20YBpFcpomVj6WTjCQZFwz63h/1rVLr7pmtm8FMMrSCvDCb91O99XPtGSI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778257061; c=relaxed/simple; bh=+71xsN0zGjFdKKLBXrHVpGMS3qy0PWP98xKw22FV+fw=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=pDHBbjfY81RkGzlsis+VjX36zI9vz/c3Odl4y/RzEB0zqJgASm9eJ0RekCjCa9uhyoGemYi5e7V5XvdUjC231fjwn54UtD6gRT4IZvHHVl0MdfcgSuF0kLkQefe1hGjqHBW45AssdoFYEJ96/80ShLNZ8BiitgQz3vLI9NgSkMo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=lw6OjcNo; arc=none smtp.client-ip=209.85.128.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-wm1-f45.google.com with SMTP id 5b1f17b1804b1-48d102471a4so22060345e9.2 for ; Fri, 08 May 2026 09:17:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778257058; x=1778861858; darn=lists.linux.dev; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=H78OCHplUUKVx5qcGH4uj9YH7je8ck6bUjvltlSmym4=; b=lw6OjcNo7jJJJsUOyEuTMFbwNt8ZsPtj7B1yhVbIgoXMVkoeBFpaX9M4dw+nOuKL3y I17TBK/q0jrJkjBS56aI8sFYkJpASyLOYKMNOjtJh6o+WalJgrbBDmd07bGl4wWKxuMY 6LxFTjfAaAnoJSZJ+zdsgvoM1yfeKqFkTnxaF8utZv1Fl2WP3Y8ss1aoYZ9RlsIpIIzT conNJFa87Fre+CBzHbxGcaGeO1Rj5BsjcRZEio/Vj2fX5rAp4v/RXPuJ4XR9RXUHiArt xsE8gJMsG5AGTzIuFth0GSULljKEz9XgLrI4wMsmvLG5B125q+VVb8cSH7wEw4XFgJLy /LSg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778257058; x=1778861858; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=H78OCHplUUKVx5qcGH4uj9YH7je8ck6bUjvltlSmym4=; b=XRa8xuCtZ6Gs6oerpucoQWjrLQJK8Udnd700lPlMZmaYaS0t27CuLO/wSzBkTypshr KQVf6jxwFJzyzsibrl3ZguDGfBgV0M7NWOC7fBm+pA86mirboY/OeBSPbPnMc+XpCb0D mZifWxW4TCsd4sO09g/OlJQnJqtZHGLmHVaoKkUXm4RNiCI08pIo288a6KBJPIrE1jDN /z0IAiXOBW4ZswDeFT/iGy43Z2A6Ohew7B4Aj+mDz/R/2nJTsldYNHwM+EEMgApkHqpu SmT0pD0f1tcZyww5vz5FZE3Mcyf9sK+MvcDnD5mIcnCUVJ7ziGoY7U2yf1SNi85wJetu uQMA== X-Forwarded-Encrypted: i=1; AFNElJ9BoYVoCwdYngNnGpTS2cAqq+18kaY8E6ML726fpxAK9GtAJQQOazWnCoYXRDkn4HtW2bwyc2aiI/8NIg==@lists.linux.dev X-Gm-Message-State: AOJu0YzXTH3rkmoC0zFc7yvp8M3BOcc6Rjdd7hR9Wy1aktUZimnc5uf2 ebSk8hqyaCsvZfve5ICi7/5qme/swp5Krx6f/E1/IgtjtU+HKsZIz5Rr X-Gm-Gg: AeBDieu/if3DfGOL+GBG5XxDXkhqTuVn/a/QDta6PHa+Lfojk9fOq7Q5QlUfSQvgeq8 vHJEjVkBIn3whakh/dlllL/9HzrTK7OwblGf47Py1PP41xoiu+JBPs8g7IUF3sfjCc4vU90bmB/ A3r1FNEnFTArEnHQ9OwuE5XWQCNNtLqmfhfjNCyanWTuN12gfg6Uivaz9YqeROGNAP01pnCV+Xu qQ3oNynq09aQkdWOmCV4ZEiSHaq8s8djTJTf+twQyw20THffPqyvtof19KXr5SPum17kHsxizcY my3cJdijNZVVhK5U2KjSUUODEEoJrpLgY06rv+zWTTx5EE4fbpiFo/mgaNfbBiSrLglzzC0F1kI VLzEj94cs5SG5U+zIySaHmDsG1w+7RXpc6wRl1fDp0exMuOnrwT13DGrM+PGnco0Pq2xDtQLo8B 4Kbqfo4z+kojwAkeZT4ort1kCRJL+9YtydL2dLHj0q4AyWSCh7Mv1KOhLEsE369i+hVDrS5OTC3 4IoIUY5y/9kpaz2Y53n X-Received: by 2002:a05:600c:35d1:b0:48a:5821:5ff2 with SMTP id 5b1f17b1804b1-48e6767de04mr65948235e9.8.1778257057759; Fri, 08 May 2026 09:17:37 -0700 (PDT) Received: from thinkpad ([46.164.92.151]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4548e6a66bfsm4946697f8f.4.2026.05.08.09.17.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 08 May 2026 09:17:37 -0700 (PDT) From: Arash Golgol To: linux-media@vger.kernel.org Cc: yong.deng@magewell.com, paulk@sys-base.io, mchehab@kernel.org, wens@kernel.org, jernej.skrabec@gmail.com, samuel@sholland.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, laurent.pinchart@ideasonboard.com, sakari.ailus@linux.intel.com, Arash Golgol Subject: [PATCH v2 2/3] media: sun6i-csi: capture: Implement vidioc_enum_framesizes Date: Fri, 8 May 2026 19:47:20 +0330 Message-Id: <20260508161721.94285-3-arash.golgol@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260508161721.94285-1-arash.golgol@gmail.com> References: <20260508161721.94285-1-arash.golgol@gmail.com> Precedence: bulk X-Mailing-List: linux-sunxi@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Rspamd-Server: rspamd-worker-8404 X-Spamd-Result: default: False [-0.66 / 15.00]; BAYES_HAM(-5.50)[99.99%]; RBL_SENDERSCORE(2.00)[172.234.253.10:from]; SUSPICIOUS_RECIPS(1.50)[]; DMARC_POLICY_SOFTFAIL(1.00)[gmail.com : SPF not aligned (relaxed), No valid DKIM,none]; R_MISSING_CHARSET(0.50)[]; MAILLIST(-0.15)[generic]; MIME_GOOD(-0.10)[text/plain]; BAD_REP_POLICIES(0.10)[]; HAS_LIST_UNSUB(-0.01)[]; R_SPF_ALLOW(0.00)[+ip4:172.234.253.10]; TAGGED_RCPT(0.00)[]; RCPT_COUNT_TWELVE(0.00)[12]; DBL_BLOCKED_OPENRESOLVER(0.00)[sea.lore.kernel.org:rdns,sea.lore.kernel.org:helo,ideasonboard.com:email]; TO_DN_SOME(0.00)[]; FUZZY_BLOCKED(0.00)[rspamd.com]; FORGED_SENDER_MAILLIST(0.00)[]; FREEMAIL_CC(0.00)[magewell.com,sys-base.io,kernel.org,gmail.com,sholland.org,lists.infradead.org,lists.linux.dev,ideasonboard.com,linux.intel.com]; PRECEDENCE_BULK(0.00)[]; ARC_ALLOW(0.00)[subspace.kernel.org:s=arc-20240116:i=1]; FREEMAIL_FROM(0.00)[gmail.com]; RCVD_TLS_LAST(0.00)[]; MIME_TRACE(0.00)[0:+]; FORGED_RECIPIENTS_MAILLIST(0.00)[]; FROM_HAS_DN(0.00)[]; MID_RHS_MATCH_FROM(0.00)[]; ASN(0.00)[asn:63949, ipnet:172.234.224.0/19, country:SG]; TAGGED_FROM(0.00)[bounces-23198-noreply=patchwork.local]; RCVD_COUNT_FIVE(0.00)[6]; FROM_NEQ_ENVFROM(0.00)[arashgolgol@gmail.com,linux-sunxi@lists.linux.dev]; RCVD_VIA_SMTP_AUTH(0.00)[] X-Rspamd-Queue-Id: D57BB1C0266 X-MORS-Enabled: yes X-MORS-DOMAIN: patchwork.local X-MORS-HOSTING: hosting172546 X-MORS-USER: hosting172546 X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= Report the stepwise frame size range supported by the CSI capture hardware for the pixel formats exposed by the driver. The hardware does not perform scaling and accepts any even width and height within the reported limits. Signed-off-by: Arash Golgol Reviewed-by: Paul Kocialkowski Tested-by: Paul Kocialkowski Reviewed-by: Laurent Pinchart --- Changes in v2: - No change - Link to v1: https://patchwork.kernel.org/project/linux-media/patch/20260217064050.18388-3-arash.golgol@gmail.com/ .../sunxi/sun6i-csi/sun6i_csi_capture.c | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c index d90abba21309..375ea6745eed 100644 --- a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c +++ b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c @@ -738,6 +738,27 @@ static int sun6i_csi_capture_enum_fmt(struct file *file, void *priv, return 0; } +static int sun6i_csi_capture_enum_framesize(struct file *file, void *fh, + struct v4l2_frmsizeenum *fsize) +{ + if (fsize->index) + return -EINVAL; + + /* Only accept format in map table. */ + if (!sun6i_csi_capture_format_find(fsize->pixel_format)) + return -EINVAL; + + fsize->type = V4L2_FRMSIZE_TYPE_STEPWISE; + fsize->stepwise.min_width = SUN6I_CSI_CAPTURE_WIDTH_MIN; + fsize->stepwise.max_width = SUN6I_CSI_CAPTURE_WIDTH_MAX; + fsize->stepwise.min_height = SUN6I_CSI_CAPTURE_HEIGHT_MIN; + fsize->stepwise.max_height = SUN6I_CSI_CAPTURE_HEIGHT_MAX; + fsize->stepwise.step_width = 2; + fsize->stepwise.step_height = 2; + + return 0; +} + static int sun6i_csi_capture_g_fmt(struct file *file, void *priv, struct v4l2_format *format) { @@ -805,6 +826,7 @@ static const struct v4l2_ioctl_ops sun6i_csi_capture_ioctl_ops = { .vidioc_querycap = sun6i_csi_capture_querycap, .vidioc_enum_fmt_vid_cap = sun6i_csi_capture_enum_fmt, + .vidioc_enum_framesizes = sun6i_csi_capture_enum_framesize, .vidioc_g_fmt_vid_cap = sun6i_csi_capture_g_fmt, .vidioc_s_fmt_vid_cap = sun6i_csi_capture_s_fmt, .vidioc_try_fmt_vid_cap = sun6i_csi_capture_try_fmt, From patchwork Fri May 8 16:17:21 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: arash golgol X-Patchwork-Id: 2173 Return-Path: X-Original-To: noreply@patchwork.local Delivered-To: noreply@patchwork.local Received: from tor.lore.kernel.org (tor.lore.kernel.org [172.105.105.114]) by mxe881.netcup.net (Postfix) with ESMTPS id CA39B1C0266 for ; Fri, 8 May 2026 18:19:24 +0200 (CEST) Authentication-Results: mxe881; dkim=pass header.d=gmail.com; spf=pass (sender IP is 172.105.105.114) smtp.mailfrom=linux-sunxi+bounces-23199-noreply=patchwork.local@lists.linux.dev smtp.helo=tor.lore.kernel.org Received-SPF: pass (mxe881: domain of lists.linux.dev designates 172.105.105.114 as permitted sender) client-ip=172.105.105.114; envelope-from=linux-sunxi+bounces-23199-noreply=patchwork.local@lists.linux.dev; helo=tor.lore.kernel.org; Received: from smtp.subspace.kernel.org (conduit.subspace.kernel.org [100.90.174.1]) by tor.lore.kernel.org (Postfix) with ESMTP id 84AAF3012BD8 for ; Fri, 8 May 2026 16:17:48 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id E957B30F80C; Fri, 8 May 2026 16:17:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="QzwcVlkj" X-Original-To: linux-sunxi@lists.linux.dev Received: from mail-wr1-f43.google.com (mail-wr1-f43.google.com [209.85.221.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 801043101B9 for ; Fri, 8 May 2026 16:17:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778257067; cv=none; b=APoYLg6Z0kee3e99/JzPzFsT6agXaqSchcE5Hs+I3To/JKlHjyfMeevWWCXqVS3XtXz5bWRAyO3y0RBSti7Ig38YesFbGD/mWdsXHrDgW+TDetCqKH7AyP6Pni2pAdfPHKejZuUfLZQEd4KVMl1+WhiJM9nOJK5hTAg9Q1pvL0g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778257067; c=relaxed/simple; bh=/Eqe5iU44ry/gzPo+lsa36VWQqG8Zp8mFC8GsAoSEgs=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=p8CKcmQ/wC/DFKEmqlPptUHu+PhGvdtqq1l/yEExRkb1cvfrYI7GIRygOWZcecfs7KW0ay59tDRFYkNhBjeGpx+NyguKk34f5jlEA3hKtKqhkkQG4JsTC7CfKNLMTSaoTuj1LYdhh0LeXERDmNsRGtiLnPXOs1zuvkJHfxXWYfY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=QzwcVlkj; arc=none smtp.client-ip=209.85.221.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-wr1-f43.google.com with SMTP id ffacd0b85a97d-45297094718so1759914f8f.3 for ; Fri, 08 May 2026 09:17:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1778257065; x=1778861865; darn=lists.linux.dev; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=aFzpvNnAmypkJr1Nj81ekibmeUXSe5xhjPOVIP2fg5s=; b=QzwcVlkjqIiV4kQru413iK2JJhuYGH2yX8Re87CBPCg7w+AVnYgLlS+mQjTd0M/l8j h1QWlu2O9DCnaSBYCHdX3K7wxnY0fNwHZe47EwL0Qcrc6Bt8aIfc9rh+h06M9ygtihES OwfImaNhAPcIpePVzOw+Hvbn5Uq+clTPYPS1xbbEiFiC4Md2ViybCjegIwBLq1D9W3BB CHKdMXVojoF/jl/jUZmoz+X9Fejw1PVSrBzHIhd8cuVfHBxtqLn3RhjkMI6rhS/X6KlW mdpZUA9HE1+Dkh9gnKZsvbeBHB2uZv5elwL8SK8b2gk4QeVutLyXM5gOy3VB5MiB1gqY 6EnA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778257065; x=1778861865; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=aFzpvNnAmypkJr1Nj81ekibmeUXSe5xhjPOVIP2fg5s=; b=RH7RbC6kmCvXw7DE6EXsBiNiu407+FFRoO7D6h0U/2bkPL6Eeg3gVB+573bDe1viJR e/HR53Xf0u4J9/Gh2XCCUytbdtF9rL32+dfJ7wFZJHW73VHQlYwnyRiJmaHdtENTs/Bm 1HEfY/mO8eiSzvf11HTZSYqmumPPilUskit+tmcmtVeTf5Vmn8vNGz6bwaXtHSkAHKBq XeOR2UI21gRveupOXWAN2CcaHZ6H5X0fUS3wYif/NmFmylVFkvNTHoX+PH+ZhrSjkNKS 0H96/yCFKGaIa8d28ecA/boGsBUv+q3+jhfke/qoszg9EY2SO6gBiSgWS53iR6J85vvt FJgg== X-Forwarded-Encrypted: i=1; AFNElJ+NzS782GchMddJQKywM4pBHuYSwsGL2dgqlljYZgZPtQnVN0ACgKkzk0mfn6XfvVqdrvE5zAkUl4J8eQ==@lists.linux.dev X-Gm-Message-State: AOJu0YwCRx9CtjWg9qEr7qvQ24/BD0q0cAwZ46UzquyLSkuB5BtKjBD+ /DuqBAZk/HkNGKfasPjcUY6oSVEBo2KXc91mLkurzoPFyKxuilUc7Bc1 X-Gm-Gg: Acq92OGpv1lO1OiPihH9nIyfN2YNTIR0190rXjfN5Hqb8gvyaXbfyVyNqNfPPorEG/t 8l9AAq7ZuaFjcdw1xHYgLL28QtAq1myaRffuSvOtynzn7O7z886vlEbf2QwU4Kt3/FfDf7FXpCX kdjXpFjw1xiNinWbahBYhaOY0eXNfSlBokmtve0O0ARqXHHzxS4PV0dGT4EFVNnm2Q5p5K+6I/1 xxZ99GlvMxdHw4fCE45VHj0ZXshWuk7dG8+fJ+UD+FXuON8JjEuOBq1owzWB+3d1OpCIIlcj4eZ tG6/DkL6LAaBkZBSS+UQ2VKEmsBfiMxPLBB6W3R/mHnIQBn3plDw51KB8pXW+a5NDfd4hF+h0fV Ue4A2vYvS3oGgs0e92OlQfJyCZvMhfWjcI351dIs7tnfzmqbUi8Qs2FQE9J4rc2gK6fCy+0IZRU dYe4Jrlj5zhK58IIF5IncVf9W1wAT18dpXi4x8ynCCvM3ANy5eYDMohFCvOjeLT1WIrPR3DVy8w MELpiFa5w== X-Received: by 2002:a05:6000:186b:b0:43c:f1a5:56f6 with SMTP id ffacd0b85a97d-4515e245b31mr19758647f8f.43.1778257064705; Fri, 08 May 2026 09:17:44 -0700 (PDT) Received: from thinkpad ([46.164.92.151]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4548ec6b071sm5276653f8f.14.2026.05.08.09.17.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 08 May 2026 09:17:44 -0700 (PDT) From: Arash Golgol To: linux-media@vger.kernel.org Cc: yong.deng@magewell.com, paulk@sys-base.io, mchehab@kernel.org, wens@kernel.org, jernej.skrabec@gmail.com, samuel@sholland.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, laurent.pinchart@ideasonboard.com, sakari.ailus@linux.intel.com, Arash Golgol Subject: [PATCH v2 3/3] media: sun6i-csi: capture: Support MC-centric format enumeration Date: Fri, 8 May 2026 19:47:21 +0330 Message-Id: <20260508161721.94285-4-arash.golgol@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260508161721.94285-1-arash.golgol@gmail.com> References: <20260508161721.94285-1-arash.golgol@gmail.com> Precedence: bulk X-Mailing-List: linux-sunxi@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Rspamd-Server: rspamd-worker-8404 X-Spamd-Result: default: False [-0.66 / 15.00]; BAYES_HAM(-5.50)[100.00%]; RBL_SENDERSCORE(2.00)[172.105.105.114:from]; SUSPICIOUS_RECIPS(1.50)[]; DMARC_POLICY_SOFTFAIL(1.00)[gmail.com : SPF not aligned (relaxed), No valid DKIM,none]; R_MISSING_CHARSET(0.50)[]; MAILLIST(-0.15)[generic]; MIME_GOOD(-0.10)[text/plain]; BAD_REP_POLICIES(0.10)[]; HAS_LIST_UNSUB(-0.01)[]; R_SPF_ALLOW(0.00)[+ip4:172.105.105.114]; TAGGED_RCPT(0.00)[]; RCPT_COUNT_TWELVE(0.00)[12]; DBL_BLOCKED_OPENRESOLVER(0.00)[tor.lore.kernel.org:rdns,tor.lore.kernel.org:helo,ideasonboard.com:email]; TO_DN_SOME(0.00)[]; FUZZY_BLOCKED(0.00)[rspamd.com]; FORGED_SENDER_MAILLIST(0.00)[]; FREEMAIL_CC(0.00)[magewell.com,sys-base.io,kernel.org,gmail.com,sholland.org,lists.infradead.org,lists.linux.dev,ideasonboard.com,linux.intel.com]; PRECEDENCE_BULK(0.00)[]; ARC_ALLOW(0.00)[subspace.kernel.org:s=arc-20240116:i=1]; FREEMAIL_FROM(0.00)[gmail.com]; RCVD_TLS_LAST(0.00)[]; MIME_TRACE(0.00)[0:+]; FORGED_RECIPIENTS_MAILLIST(0.00)[]; FROM_HAS_DN(0.00)[]; MID_RHS_MATCH_FROM(0.00)[]; ASN(0.00)[asn:63949, ipnet:172.105.96.0/20, country:SG]; TAGGED_FROM(0.00)[bounces-23199-noreply=patchwork.local]; RCVD_COUNT_FIVE(0.00)[6]; FROM_NEQ_ENVFROM(0.00)[arashgolgol@gmail.com,linux-sunxi@lists.linux.dev]; RCVD_VIA_SMTP_AUTH(0.00)[] X-Rspamd-Queue-Id: CA39B1C0266 X-MORS-Enabled: yes X-MORS-DOMAIN: patchwork.local X-MORS-HOSTING: hosting172546 X-MORS-USER: hosting172546 X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= Extend vidioc_enum_fmt to support MC-centric enumeration by filtering pixel formats based on the provided mbus code. Advertise MC I/O support on the video device to reflect its intended usage within a media graph. Signed-off-by: Arash Golgol Reviewed-by: Laurent Pinchart --- Changes in v2: - Return pixelformat directly instead of a pointer - Link to v1: https://patchwork.kernel.org/project/linux-media/patch/20260217064050.18388-4-arash.golgol@gmail.com/ .../sunxi/sun6i-csi/sun6i_csi_capture.c | 39 +++++++++++++++++-- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c index 375ea6745eed..2db96ee19d8b 100644 --- a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c +++ b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c @@ -327,6 +327,22 @@ static bool sun6i_csi_capture_format_match(u32 pixelformat, u32 mbus_code) return false; } +static u32 sun6i_csi_capture_pixelformat_find(u32 mbus_code) +{ + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(sun6i_csi_capture_format_matches); i++) { + const struct sun6i_csi_capture_format_match *match = + &sun6i_csi_capture_format_matches[i]; + + if (match->mbus_code == mbus_code) + return match->pixelformat; + } + + /* Valid fourcc is non-zero. */ + return 0; +} + /* Capture */ static void @@ -729,11 +745,27 @@ static int sun6i_csi_capture_enum_fmt(struct file *file, void *priv, struct v4l2_fmtdesc *fmtdesc) { u32 index = fmtdesc->index; + u32 mbus_code = fmtdesc->mbus_code; + u32 pixelformat; + + /* MC-centric or Video-node-centric */ + if (mbus_code) { + /* There is only one pixelformat for a mbus_code. */ + if (index) + return -EINVAL; + + pixelformat = sun6i_csi_capture_pixelformat_find(mbus_code); + } else { + if (index >= ARRAY_SIZE(sun6i_csi_capture_formats)) + return -EINVAL; + + pixelformat = sun6i_csi_capture_formats[index].pixelformat; + } - if (index >= ARRAY_SIZE(sun6i_csi_capture_formats)) + if (!pixelformat) return -EINVAL; - fmtdesc->pixelformat = sun6i_csi_capture_formats[index].pixelformat; + fmtdesc->pixelformat = pixelformat; return 0; } @@ -1065,7 +1097,8 @@ int sun6i_csi_capture_setup(struct sun6i_csi_device *csi_dev) strscpy(video_dev->name, SUN6I_CSI_CAPTURE_NAME, sizeof(video_dev->name)); - video_dev->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; + video_dev->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING | + V4L2_CAP_IO_MC; video_dev->vfl_dir = VFL_DIR_RX; video_dev->release = video_device_release_empty; video_dev->fops = &sun6i_csi_capture_fops;