From nobody Mon May 25 05:12:26 2026 Received: from leonov.paulk.fr (leonov.paulk.fr [185.233.101.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D8E8921FF25; Mon, 18 May 2026 10:26:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.233.101.22 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779099965; cv=none; b=joQwM/pJZEalKOZ6I6VvHcMlqeU7AwhJB74inDeDBVdpLww7CAc2u5Wzx7nFXAb1OenfTKMbzhUgPljvanAxgLh8Tj1KqiTiO5eeWgJfC7NKZQy8Zn9lDYVqB3nCWizeum4FhwqqWMfNM4yIu57dXd7RWFgGgcKr1L8i193Oxg0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779099965; c=relaxed/simple; bh=+rA7zRMyBIseG+w6aT0DbMLWFLONB8COOVqZA+GGd4I=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=QSmJ8u1EBMSJlseNzf2m4bC6dhzD8XbZYWYrenNLV3xaoLyI9QAy5MD1w6jZRLDp9UC5YKw4dj147z6cnl7D+ADR7Pu+VSr3F+k81UNLl9OGws6L78IPpaCFpr9H39kgdZRiWvvc+NGSmAD00iQJEX1xsvjN+KSbzDmgpWF6t5c= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=sys-base.io; spf=pass smtp.mailfrom=sys-base.io; arc=none smtp.client-ip=185.233.101.22 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=sys-base.io Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=sys-base.io Received: from laika.paulk.fr (12.234.24.109.rev.sfr.net [109.24.234.12]) by leonov.paulk.fr (Postfix) with ESMTPS id 288271F8004A; Mon, 18 May 2026 10:26:02 +0000 (UTC) Received: by laika.paulk.fr (Postfix, from userid 65534) id 96251B407ED; Mon, 18 May 2026 10:26:01 +0000 (UTC) X-Spam-Level: * Received: from collins (unknown [192.168.1.64]) by laika.paulk.fr (Postfix) with ESMTP id D38ECB407ED; Mon, 18 May 2026 10:24:52 +0000 (UTC) From: Paul Kocialkowski To: linux-media@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org, linux-staging@lists.linux.dev Cc: Paul Kocialkowski , Mauro Carvalho Chehab , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Greg Kroah-Hartman , Arash Golgol , Laurent Pinchart , Nicolas Dufresne Subject: [PATCH 01/16] media: sun6i-csi: bridge: Use V4L2 subdev active state Date: Mon, 18 May 2026 12:24:36 +0200 Message-ID: <20260518102451.417971-2-paulk@sys-base.io> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260518102451.417971-1-paulk@sys-base.io> References: <20260518102451.417971-1-paulk@sys-base.io> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Arash Golgol 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 --- .../sunxi/sun6i-csi/sun6i_csi_bridge.c | 155 ++++++++---------- .../sunxi/sun6i-csi/sun6i_csi_bridge.h | 9 - .../sunxi/sun6i-csi/sun6i_csi_capture.c | 27 ++- 3 files changed, 86 insertions(+), 105 deletions(-) diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_bridge.c b/dr= ivers/media/platform/sunxi/sun6i-csi/sun6i_csi_bridge.c index d006d9dd0170..43a85bcc2ba2 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" =20 -/* Helpers */ - -void sun6i_csi_bridge_dimensions(struct sun6i_csi_device *csi_dev, - unsigned int *width, unsigned int *height) -{ - if (width) - *width =3D csi_dev->bridge.mbus_format.width; - if (height) - *height =3D 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 =3D csi_dev->bridge.mbus_format.code; - if (field) - *field =3D csi_dev->bridge.mbus_format.field; -} - /* Format */ =20 static const struct sun6i_csi_bridge_format sun6i_csi_bridge_formats[] =3D= { @@ -226,7 +206,8 @@ static void sun6i_csi_bridge_disable(struct sun6i_csi_d= evice *csi_dev) } =20 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 =3D csi_dev->dev; struct regmap *regmap =3D csi_dev->regmap; @@ -234,11 +215,9 @@ sun6i_csi_bridge_configure_parallel(struct sun6i_csi_d= evice *csi_dev) &csi_dev->bridge.source_parallel.endpoint; unsigned char bus_width =3D endpoint->bus.parallel.bus_width; unsigned int flags =3D endpoint->bus.parallel.flags; - u32 field; + u32 field =3D mbus_format->field; u32 value =3D SUN6I_CSI_IF_CFG_IF_CSI; =20 - sun6i_csi_bridge_format(csi_dev, NULL, &field); - if (field =3D=3D V4L2_FIELD_INTERLACED || field =3D=3D V4L2_FIELD_INTERLACED_TB || field =3D=3D V4L2_FIELD_INTERLACED_BT) @@ -317,13 +296,12 @@ sun6i_csi_bridge_configure_parallel(struct sun6i_csi_= device *csi_dev) } =20 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 =3D csi_dev->regmap; u32 value =3D SUN6I_CSI_IF_CFG_IF_MIPI; - u32 field; - - sun6i_csi_bridge_format(csi_dev, NULL, &field); + u32 field =3D mbus_format->field; =20 if (field =3D=3D V4L2_FIELD_INTERLACED || field =3D=3D V4L2_FIELD_INTERLACED_TB || @@ -335,19 +313,20 @@ sun6i_csi_bridge_configure_mipi_csi2(struct sun6i_csi= _device *csi_dev) regmap_write(regmap, SUN6I_CSI_IF_CFG_REG, value); } =20 -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 =3D csi_dev->regmap; bool capture_streaming =3D 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 =3D mbus_format->field; u8 input_format, input_yuv_seq, output_format; u32 value =3D 0; =20 - sun6i_csi_bridge_format(csi_dev, &mbus_code, &field); - - bridge_format =3D sun6i_csi_bridge_format_find(mbus_code); + bridge_format =3D sun6i_csi_bridge_format_find(mbus_format->code); if (WARN_ON(!bridge_format)) return; =20 @@ -391,16 +370,17 @@ static void sun6i_csi_bridge_configure_format(struct = sun6i_csi_device *csi_dev) } =20 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 =3D &csi_dev->bridge; =20 if (source =3D=3D &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); =20 - sun6i_csi_bridge_configure_format(csi_dev); + sun6i_csi_bridge_configure_format(csi_dev, mbus_format); } =20 /* V4L2 Subdev */ @@ -415,6 +395,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; =20 /* Source */ @@ -433,6 +415,10 @@ static int sun6i_csi_bridge_s_stream(struct v4l2_subde= v *subdev, int on) else source =3D &bridge->source_mipi_csi2; =20 + /* Active State */ + + state =3D v4l2_subdev_lock_and_get_active_state(subdev); + if (!on) { v4l2_subdev_call(source_subdev, video, s_stream, 0); ret =3D 0; @@ -443,7 +429,7 @@ static int sun6i_csi_bridge_s_stream(struct v4l2_subdev= *subdev, int on) =20 ret =3D pm_runtime_resume_and_get(dev); if (ret < 0) - return ret; + goto unlock; =20 /* Clear */ =20 @@ -451,7 +437,9 @@ static int sun6i_csi_bridge_s_stream(struct v4l2_subdev= *subdev, int on) =20 /* Configure */ =20 - sun6i_csi_bridge_configure(csi_dev, source); + mbus_format =3D v4l2_subdev_state_get_format(state, + SUN6I_CSI_BRIDGE_PAD_SINK); + sun6i_csi_bridge_configure(csi_dev, source, mbus_format); =20 if (capture_streaming) sun6i_csi_capture_configure(csi_dev); @@ -472,7 +460,8 @@ static int sun6i_csi_bridge_s_stream(struct v4l2_subdev= *subdev, int on) if (ret && ret !=3D -ENOIOCTLCMD) goto disable; =20 - return 0; + ret =3D 0; + goto unlock; =20 disable: if (capture_streaming) @@ -482,6 +471,8 @@ static int sun6i_csi_bridge_s_stream(struct v4l2_subdev= *subdev, int on) =20 pm_runtime_put(dev); =20 +unlock: + v4l2_subdev_unlock_state(state); return ret; } =20 @@ -504,21 +495,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 =3D v4l2_get_subdevdata(subdev); - unsigned int pad =3D SUN6I_CSI_BRIDGE_PAD_SINK; - struct v4l2_mbus_framefmt *mbus_format =3D - v4l2_subdev_state_get_format(state, pad); - struct mutex *lock =3D &csi_dev->bridge.lock; + unsigned int pad; =20 - mutex_lock(lock); + /* + * This subdev does not perform format conversion, + * initialize both pads identically. + */ + for (pad =3D 0; pad < subdev->entity.num_pads; pad++) { + struct v4l2_mbus_framefmt *mbus_format; =20 - mbus_format->code =3D sun6i_csi_bridge_formats[0].mbus_code; - mbus_format->width =3D 1280; - mbus_format->height =3D 720; + mbus_format =3D v4l2_subdev_state_get_format(state, pad); =20 - sun6i_csi_bridge_mbus_format_prepare(mbus_format); + mbus_format->code =3D sun6i_csi_bridge_formats[0].mbus_code; + mbus_format->width =3D 1280; + mbus_format->height =3D 720; =20 - mutex_unlock(lock); + sun6i_csi_bridge_mbus_format_prepare(mbus_format); + } =20 return 0; } @@ -536,53 +529,32 @@ sun6i_csi_bridge_enum_mbus_code(struct v4l2_subdev *s= ubdev, return 0; } =20 -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 =3D v4l2_get_subdevdata(subdev); - struct v4l2_mbus_framefmt *mbus_format =3D &format->format; - struct mutex *lock =3D &csi_dev->bridge.lock; - - mutex_lock(lock); - - if (format->which =3D=3D V4L2_SUBDEV_FORMAT_TRY) - *mbus_format =3D *v4l2_subdev_state_get_format(state, - format->pad); - else - *mbus_format =3D 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 =3D v4l2_get_subdevdata(subdev); - struct v4l2_mbus_framefmt *mbus_format =3D &format->format; - struct mutex *lock =3D &csi_dev->bridge.lock; + struct v4l2_mbus_framefmt *fmt; =20 - mutex_lock(lock); + /* The format on the source pad always matches the sink pad. */ + if (format->pad !=3D SUN6I_CSI_BRIDGE_PAD_SINK) + return v4l2_subdev_get_fmt(subdev, state, format); =20 - sun6i_csi_bridge_mbus_format_prepare(mbus_format); + sun6i_csi_bridge_mbus_format_prepare(&format->format); =20 - if (format->which =3D=3D V4L2_SUBDEV_FORMAT_TRY) - *v4l2_subdev_state_get_format(state, format->pad) =3D - *mbus_format; - else - csi_dev->bridge.mbus_format =3D *mbus_format; + /* Set the format on the sink pad. */ + fmt =3D v4l2_subdev_state_get_format(state, format->pad); + *fmt =3D format->format; =20 - mutex_unlock(lock); + /* Propagate the format to the source pad. */ + fmt =3D v4l2_subdev_state_get_format(state, SUN6I_CSI_BRIDGE_PAD_SOURCE); + *fmt =3D format->format; =20 return 0; } =20 static const struct v4l2_subdev_pad_ops sun6i_csi_bridge_pad_ops =3D { .enum_mbus_code =3D sun6i_csi_bridge_enum_mbus_code, - .get_fmt =3D sun6i_csi_bridge_get_fmt, + .get_fmt =3D v4l2_subdev_get_fmt, .set_fmt =3D sun6i_csi_bridge_set_fmt, }; =20 @@ -780,8 +752,6 @@ int sun6i_csi_bridge_setup(struct sun6i_csi_device *csi= _dev) }; int ret; =20 - mutex_init(&bridge->lock); - /* V4L2 Subdev */ =20 v4l2_subdev_init(subdev, &sun6i_csi_bridge_subdev_ops); @@ -809,6 +779,12 @@ int sun6i_csi_bridge_setup(struct sun6i_csi_device *cs= i_dev) if (ret < 0) return ret; =20 + /* V4L2 Subdev finalize */ + + ret =3D v4l2_subdev_init_finalize(subdev); + if (ret < 0) + goto error_media_entity; + /* V4L2 Subdev */ =20 if (csi_dev->isp_available) @@ -818,7 +794,7 @@ int sun6i_csi_bridge_setup(struct sun6i_csi_device *csi= _dev) =20 if (ret) { dev_err(dev, "failed to register v4l2 subdev: %d\n", ret); - goto error_media_entity; + goto error_subdev_finalize; } =20 /* V4L2 Async */ @@ -852,6 +828,9 @@ int sun6i_csi_bridge_setup(struct sun6i_csi_device *csi= _dev) else v4l2_device_unregister_subdev(subdev); =20 +error_subdev_finalize: + v4l2_subdev_cleanup(subdev); + error_media_entity: media_entity_cleanup(&subdev->entity); =20 @@ -868,5 +847,7 @@ void sun6i_csi_bridge_cleanup(struct sun6i_csi_device *= csi_dev) =20 v4l2_device_unregister_subdev(subdev); =20 + v4l2_subdev_cleanup(subdev); + media_entity_cleanup(&subdev->entity); } diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_bridge.h b/dr= ivers/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. */ =20 struct sun6i_csi_bridge_source source_parallel; struct sun6i_csi_bridge_source source_mipi_csi2; }; =20 -/* 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 */ =20 const struct sun6i_csi_bridge_format * diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c b/d= rivers/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 med= ia_link *link) media_entity_to_video_device(link->sink->entity); struct sun6i_csi_device *csi_dev =3D video_get_drvdata(video_dev); struct v4l2_device *v4l2_dev =3D csi_dev->v4l2_dev; + struct v4l2_subdev *src_subdev =3D + 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 =3D { + .which =3D V4L2_SUBDEV_FORMAT_ACTIVE, + .pad =3D link->source->index + }; u32 pixelformat, capture_field; - u32 mbus_code, bridge_field; bool match; + int ret; =20 sun6i_csi_capture_dimensions(csi_dev, &capture_width, &capture_height); =20 @@ -904,19 +909,22 @@ static int sun6i_csi_capture_link_validate(struct med= ia_link *link) if (WARN_ON(!capture_format)) return -EINVAL; =20 - sun6i_csi_bridge_dimensions(csi_dev, &bridge_width, &bridge_height); + /* Resolve csi bridge format. */ + ret =3D v4l2_subdev_call(src_subdev, pad, get_fmt, NULL, &src_fmt); + if (ret) + return ret; =20 - sun6i_csi_bridge_format(csi_dev, &mbus_code, &bridge_field); - bridge_format =3D sun6i_csi_bridge_format_find(mbus_code); + bridge_format =3D sun6i_csi_bridge_format_find(src_fmt.format.code); if (WARN_ON(!bridge_format)) return -EINVAL; =20 /* No cropping/scaling is supported. */ - if (capture_width !=3D bridge_width || capture_height !=3D bridge_height)= { + if (capture_width !=3D src_fmt.format.width || + capture_height !=3D 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; } =20 @@ -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 =3D=3D SUN6I_CSI_INPUT_FMT_RAW || capture_format->input_format_raw) { - match =3D sun6i_csi_capture_format_match(pixelformat, mbus_code); + match =3D sun6i_csi_capture_format_match(pixelformat, + src_fmt.format.code); if (!match) goto invalid; } --=20 2.54.0 From nobody Mon May 25 05:12:26 2026 Received: from leonov.paulk.fr (leonov.paulk.fr [185.233.101.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 78618344024; Mon, 18 May 2026 10:26:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.233.101.22 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779099990; cv=none; b=Mm41NTlyzYJ45DtfeWUBNCH10w0/7+7OSOKuBskIOUF7uFeEENU7Y21u8UVxHX7AG/cQRlm5w92EGwXNb07VOOwDg2XcwSlqI8gauiK/jXOPhwdeY3r8Y5BAc09DhUKJwywNwtxkfT+cnAVkn6BhbIfMBBCxXN7XZf5ma4LXZ44= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779099990; c=relaxed/simple; bh=vXy7wGbCoWon8e0bM6D24f1MQwlaCnUDtj8yulvwCl0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=J5VVNv5CYQQO942UemG/k2knXNhu8ycrMTYZVJOdG+KLxkPi9AZhwIT+tGgm82KzNF0uy5v2OoRjO+AxY813GfGnb9JAe046EL/pqTALHsEcZmB1aQo9PiEaikRUoz9+g8HC98lzbHm51WQv0NCxMyibMK0M+zYdlpiMJIGtqWM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=sys-base.io; spf=pass smtp.mailfrom=sys-base.io; arc=none smtp.client-ip=185.233.101.22 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=sys-base.io Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=sys-base.io Received: from laika.paulk.fr (12.234.24.109.rev.sfr.net [109.24.234.12]) by leonov.paulk.fr (Postfix) with ESMTPS id 852A91F80041; Mon, 18 May 2026 10:26:27 +0000 (UTC) Received: by laika.paulk.fr (Postfix, from userid 65534) id 07D73B40802; Mon, 18 May 2026 10:26:26 +0000 (UTC) X-Spam-Level: * Received: from collins (unknown [192.168.1.64]) by laika.paulk.fr (Postfix) with ESMTP id C362EB407F0; Mon, 18 May 2026 10:24:53 +0000 (UTC) From: Paul Kocialkowski To: linux-media@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org, linux-staging@lists.linux.dev Cc: Paul Kocialkowski , Mauro Carvalho Chehab , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Greg Kroah-Hartman , Arash Golgol , Laurent Pinchart , Nicolas Dufresne Subject: [PATCH 02/16] media: sun6i-csi: capture: Implement vidioc_enum_framesizes Date: Mon, 18 May 2026 12:24:37 +0200 Message-ID: <20260518102451.417971-3-paulk@sys-base.io> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260518102451.417971-1-paulk@sys-base.io> References: <20260518102451.417971-1-paulk@sys-base.io> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Arash Golgol 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 --- .../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/d= rivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c index d90abba21309..f788b4234673 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 *fil= e, void *priv, return 0; } =20 +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 =3D V4L2_FRMSIZE_TYPE_STEPWISE; + fsize->stepwise.min_width =3D SUN6I_CSI_CAPTURE_WIDTH_MIN; + fsize->stepwise.max_width =3D SUN6I_CSI_CAPTURE_WIDTH_MAX; + fsize->stepwise.min_height =3D SUN6I_CSI_CAPTURE_HEIGHT_MIN; + fsize->stepwise.max_height =3D SUN6I_CSI_CAPTURE_HEIGHT_MAX; + fsize->stepwise.step_width =3D 2; + fsize->stepwise.step_height =3D 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_io= ctl_ops =3D { .vidioc_querycap =3D sun6i_csi_capture_querycap, =20 .vidioc_enum_fmt_vid_cap =3D sun6i_csi_capture_enum_fmt, + .vidioc_enum_framesizes =3D sun6i_csi_capture_enum_framesize, .vidioc_g_fmt_vid_cap =3D sun6i_csi_capture_g_fmt, .vidioc_s_fmt_vid_cap =3D sun6i_csi_capture_s_fmt, .vidioc_try_fmt_vid_cap =3D sun6i_csi_capture_try_fmt, --=20 2.54.0 From nobody Mon May 25 05:12:26 2026 Received: from leonov.paulk.fr (leonov.paulk.fr [185.233.101.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 197B930FF1D; Mon, 18 May 2026 10:26:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.233.101.22 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779100023; cv=none; b=k28gO3py2/GMJSbBiqXH9VR492XDqtAZAQfBpycZ881AtKjoKhh4GJm98htexf9CYZErHM7x/n17kWW1JSi/xkXK4l3j/94D2uXcns2aGpgDpZ85XYa4so8zGN957/5orWhfuOA7j89afLBHqCYbP/xoLdxbSpDrh0zi2OdDmrg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779100023; c=relaxed/simple; bh=Tbz0Fq2B2eUEXo8eCeEVL3h9wLwJpFw6jFs2iijEFBw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=m1a7fTF2Dl3uQzPBsDO5AZKqPZG7AVL1HiwOu0uGFWtzBka531L8hzaZ5R9d1i52prxAoReFtnLt+prCZu58cakclD7Z4eo3pwW/HrElGBoXuFjp+GI8MMdPFP3a0JfsHF99Qwjb3PIksSdRaUTI6Dbz1pydjj5/zyQrrLu74iE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=sys-base.io; spf=pass smtp.mailfrom=sys-base.io; arc=none smtp.client-ip=185.233.101.22 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=sys-base.io Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=sys-base.io Received: from laika.paulk.fr (12.234.24.109.rev.sfr.net [109.24.234.12]) by leonov.paulk.fr (Postfix) with ESMTPS id 577211F80044; Mon, 18 May 2026 10:26:53 +0000 (UTC) Received: by laika.paulk.fr (Postfix, from userid 65534) id D9834B407EF; Mon, 18 May 2026 10:26:52 +0000 (UTC) X-Spam-Level: * Received: from collins (unknown [192.168.1.64]) by laika.paulk.fr (Postfix) with ESMTP id 18CA6B407EF; Mon, 18 May 2026 10:24:54 +0000 (UTC) From: Paul Kocialkowski To: linux-media@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org, linux-staging@lists.linux.dev Cc: Paul Kocialkowski , Mauro Carvalho Chehab , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Greg Kroah-Hartman , Arash Golgol , Laurent Pinchart , Nicolas Dufresne Subject: [PATCH 03/16] media: sun6i-mipi-csi2: Use V4L2 subdev active state Date: Mon, 18 May 2026 12:24:38 +0200 Message-ID: <20260518102451.417971-4-paulk@sys-base.io> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260518102451.417971-1-paulk@sys-base.io> References: <20260518102451.417971-1-paulk@sys-base.io> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Arash Golgol 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. The sun6i-mipi-csi2 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: Laurent Pinchart --- .../sunxi/sun6i-mipi-csi2/sun6i_mipi_csi2.c | 107 +++++++++--------- .../sunxi/sun6i-mipi-csi2/sun6i_mipi_csi2.h | 2 - 2 files changed, 53 insertions(+), 56 deletions(-) diff --git a/drivers/media/platform/sunxi/sun6i-mipi-csi2/sun6i_mipi_csi2.c= b/drivers/media/platform/sunxi/sun6i-mipi-csi2/sun6i_mipi_csi2.c index b06cb73015cd..682bdd82098c 100644 --- a/drivers/media/platform/sunxi/sun6i-mipi-csi2/sun6i_mipi_csi2.c +++ b/drivers/media/platform/sunxi/sun6i-mipi-csi2/sun6i_mipi_csi2.c @@ -95,12 +95,12 @@ static void sun6i_mipi_csi2_disable(struct sun6i_mipi_c= si2_device *csi2_dev) SUN6I_MIPI_CSI2_CTL_EN, 0); } =20 -static void sun6i_mipi_csi2_configure(struct sun6i_mipi_csi2_device *csi2_= dev) +static void sun6i_mipi_csi2_configure(struct sun6i_mipi_csi2_device *csi2_= dev, + const struct v4l2_mbus_framefmt *mbus_format) { struct regmap *regmap =3D csi2_dev->regmap; unsigned int lanes_count =3D csi2_dev->bridge.endpoint.bus.mipi_csi2.num_data_lanes; - struct v4l2_mbus_framefmt *mbus_format =3D &csi2_dev->bridge.mbus_format; const struct sun6i_mipi_csi2_format *format; struct device *dev =3D csi2_dev->dev; u32 version =3D 0; @@ -173,7 +173,8 @@ static int sun6i_mipi_csi2_s_stream(struct v4l2_subdev = *subdev, int on) struct v4l2_subdev *source_subdev =3D csi2_dev->bridge.source_subdev; union phy_configure_opts dphy_opts =3D { 0 }; struct phy_configure_opts_mipi_dphy *dphy_cfg =3D &dphy_opts.mipi_dphy; - struct v4l2_mbus_framefmt *mbus_format =3D &csi2_dev->bridge.mbus_format; + struct v4l2_subdev_state *state; + const struct v4l2_mbus_framefmt *mbus_format; const struct sun6i_mipi_csi2_format *format; struct phy *dphy =3D csi2_dev->dphy; struct device *dev =3D csi2_dev->dev; @@ -183,8 +184,12 @@ static int sun6i_mipi_csi2_s_stream(struct v4l2_subdev= *subdev, int on) unsigned long pixel_rate; int ret; =20 - if (!source_subdev) - return -ENODEV; + state =3D v4l2_subdev_lock_and_get_active_state(subdev); + + if (!source_subdev) { + ret =3D -ENODEV; + goto unlock; + } =20 if (!on) { v4l2_subdev_call(source_subdev, video, s_stream, 0); @@ -196,7 +201,7 @@ static int sun6i_mipi_csi2_s_stream(struct v4l2_subdev = *subdev, int on) =20 ret =3D pm_runtime_resume_and_get(dev); if (ret < 0) - return ret; + goto unlock; =20 /* Sensor Pixel Rate */ =20 @@ -222,6 +227,8 @@ static int sun6i_mipi_csi2_s_stream(struct v4l2_subdev = *subdev, int on) goto error_pm; } =20 + mbus_format =3D v4l2_subdev_state_get_format(state, + SUN6I_MIPI_CSI2_PAD_SINK); format =3D sun6i_mipi_csi2_format_find(mbus_format->code); if (WARN_ON(!format)) { ret =3D -ENODEV; @@ -260,7 +267,7 @@ static int sun6i_mipi_csi2_s_stream(struct v4l2_subdev = *subdev, int on) =20 /* Controller */ =20 - sun6i_mipi_csi2_configure(csi2_dev); + sun6i_mipi_csi2_configure(csi2_dev, mbus_format); sun6i_mipi_csi2_enable(csi2_dev); =20 /* D-PHY */ @@ -277,7 +284,8 @@ static int sun6i_mipi_csi2_s_stream(struct v4l2_subdev = *subdev, int on) if (ret && ret !=3D -ENOIOCTLCMD) goto disable; =20 - return 0; + ret =3D 0; + goto unlock; =20 disable: phy_power_off(dphy); @@ -286,6 +294,8 @@ static int sun6i_mipi_csi2_s_stream(struct v4l2_subdev = *subdev, int on) error_pm: pm_runtime_put(dev); =20 +unlock: + v4l2_subdev_unlock_state(state); return ret; } =20 @@ -308,21 +318,23 @@ sun6i_mipi_csi2_mbus_format_prepare(struct v4l2_mbus_= framefmt *mbus_format) static int sun6i_mipi_csi2_init_state(struct v4l2_subdev *subdev, struct v4l2_subdev_state *state) { - struct sun6i_mipi_csi2_device *csi2_dev =3D v4l2_get_subdevdata(subdev); - unsigned int pad =3D SUN6I_MIPI_CSI2_PAD_SINK; - struct v4l2_mbus_framefmt *mbus_format =3D - v4l2_subdev_state_get_format(state, pad); - struct mutex *lock =3D &csi2_dev->bridge.lock; + unsigned int pad; =20 - mutex_lock(lock); + /* + * This subdev does not perform format conversion, + * initialize both pads identically. + */ + for (pad =3D 0; pad < subdev->entity.num_pads; pad++) { + struct v4l2_mbus_framefmt *mbus_format; =20 - mbus_format->code =3D sun6i_mipi_csi2_formats[0].mbus_code; - mbus_format->width =3D 640; - mbus_format->height =3D 480; + mbus_format =3D v4l2_subdev_state_get_format(state, pad); =20 - sun6i_mipi_csi2_mbus_format_prepare(mbus_format); + mbus_format->code =3D sun6i_mipi_csi2_formats[0].mbus_code; + mbus_format->width =3D 640; + mbus_format->height =3D 480; =20 - mutex_unlock(lock); + sun6i_mipi_csi2_mbus_format_prepare(mbus_format); + } =20 return 0; } @@ -340,53 +352,32 @@ sun6i_mipi_csi2_enum_mbus_code(struct v4l2_subdev *su= bdev, return 0; } =20 -static int sun6i_mipi_csi2_get_fmt(struct v4l2_subdev *subdev, - struct v4l2_subdev_state *state, - struct v4l2_subdev_format *format) -{ - struct sun6i_mipi_csi2_device *csi2_dev =3D v4l2_get_subdevdata(subdev); - struct v4l2_mbus_framefmt *mbus_format =3D &format->format; - struct mutex *lock =3D &csi2_dev->bridge.lock; - - mutex_lock(lock); - - if (format->which =3D=3D V4L2_SUBDEV_FORMAT_TRY) - *mbus_format =3D *v4l2_subdev_state_get_format(state, - format->pad); - else - *mbus_format =3D csi2_dev->bridge.mbus_format; - - mutex_unlock(lock); - - return 0; -} - static int sun6i_mipi_csi2_set_fmt(struct v4l2_subdev *subdev, struct v4l2_subdev_state *state, struct v4l2_subdev_format *format) { - struct sun6i_mipi_csi2_device *csi2_dev =3D v4l2_get_subdevdata(subdev); - struct v4l2_mbus_framefmt *mbus_format =3D &format->format; - struct mutex *lock =3D &csi2_dev->bridge.lock; + struct v4l2_mbus_framefmt *fmt; =20 - mutex_lock(lock); + /* The format on the source pad always matches the sink pad. */ + if (format->pad !=3D SUN6I_MIPI_CSI2_PAD_SINK) + return v4l2_subdev_get_fmt(subdev, state, format); =20 - sun6i_mipi_csi2_mbus_format_prepare(mbus_format); + sun6i_mipi_csi2_mbus_format_prepare(&format->format); =20 - if (format->which =3D=3D V4L2_SUBDEV_FORMAT_TRY) - *v4l2_subdev_state_get_format(state, format->pad) =3D - *mbus_format; - else - csi2_dev->bridge.mbus_format =3D *mbus_format; + /* Set the format on the sink pad. */ + fmt =3D v4l2_subdev_state_get_format(state, format->pad); + *fmt =3D format->format; =20 - mutex_unlock(lock); + /* Propagate the format to the source pad. */ + fmt =3D v4l2_subdev_state_get_format(state, SUN6I_MIPI_CSI2_PAD_SOURCE); + *fmt =3D format->format; =20 return 0; } =20 static const struct v4l2_subdev_pad_ops sun6i_mipi_csi2_pad_ops =3D { .enum_mbus_code =3D sun6i_mipi_csi2_enum_mbus_code, - .get_fmt =3D sun6i_mipi_csi2_get_fmt, + .get_fmt =3D v4l2_subdev_get_fmt, .set_fmt =3D sun6i_mipi_csi2_set_fmt, }; =20 @@ -502,8 +493,6 @@ static int sun6i_mipi_csi2_bridge_setup(struct sun6i_mi= pi_csi2_device *csi2_dev) bool notifier_registered =3D false; int ret; =20 - mutex_init(&bridge->lock); - /* V4L2 Subdev */ =20 v4l2_subdev_init(subdev, &sun6i_mipi_csi2_subdev_ops); @@ -532,6 +521,12 @@ static int sun6i_mipi_csi2_bridge_setup(struct sun6i_m= ipi_csi2_device *csi2_dev) if (ret) return ret; =20 + /* V4L2 Subdev finalize */ + + ret =3D v4l2_subdev_init_finalize(subdev); + if (ret < 0) + goto error_media_entity_cleanup; + /* V4L2 Async */ =20 v4l2_async_subdev_nf_init(notifier, subdev); @@ -565,6 +560,9 @@ static int sun6i_mipi_csi2_bridge_setup(struct sun6i_mi= pi_csi2_device *csi2_dev) error_v4l2_notifier_cleanup: v4l2_async_nf_cleanup(notifier); =20 + v4l2_subdev_cleanup(subdev); + +error_media_entity_cleanup: media_entity_cleanup(&subdev->entity); =20 return ret; @@ -579,6 +577,7 @@ sun6i_mipi_csi2_bridge_cleanup(struct sun6i_mipi_csi2_d= evice *csi2_dev) v4l2_async_unregister_subdev(subdev); v4l2_async_nf_unregister(notifier); v4l2_async_nf_cleanup(notifier); + v4l2_subdev_cleanup(subdev); media_entity_cleanup(&subdev->entity); } =20 diff --git a/drivers/media/platform/sunxi/sun6i-mipi-csi2/sun6i_mipi_csi2.h= b/drivers/media/platform/sunxi/sun6i-mipi-csi2/sun6i_mipi_csi2.h index 24b15e34b5e8..d72dfbd6a993 100644 --- a/drivers/media/platform/sunxi/sun6i-mipi-csi2/sun6i_mipi_csi2.h +++ b/drivers/media/platform/sunxi/sun6i-mipi-csi2/sun6i_mipi_csi2.h @@ -32,8 +32,6 @@ struct sun6i_mipi_csi2_bridge { struct media_pad pads[SUN6I_MIPI_CSI2_PAD_COUNT]; struct v4l2_fwnode_endpoint endpoint; struct v4l2_async_notifier notifier; - struct v4l2_mbus_framefmt mbus_format; - struct mutex lock; /* Mbus format lock. */ =20 struct v4l2_subdev *source_subdev; }; --=20 2.54.0 From nobody Mon May 25 05:12:26 2026 Received: from leonov.paulk.fr (leonov.paulk.fr [185.233.101.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1D97D3E8351; Mon, 18 May 2026 10:27:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.233.101.22 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779100058; cv=none; b=bpDR8yUG3p15ZGlU42rXl5zm+s9scrW3gdzynsT02LQaXcBpCG5hmiSrQgP58nvBP2a1wZYHy/aVJpo8N/aa4rhnh/J5kffjmgs1I7xecPV54vfXHenM4GqXw3YGOhkTHFOz1alvYFQSBIc7gyKgo+/6WJ8m5owUDFl1cOFrA0E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779100058; c=relaxed/simple; bh=v9/oHB00j+2MpFeubgCrn6YeImJ75HNm2yALCtXVeeA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=EMofuyFj7uv6ialPuFK/FhZbipJlJGg5Nl6rcBEys+PurUvp0YnW9YSW10TrnsOZMGg9wWpbuSgvdawLYHYtz2veRa+l5H4+78yfydS4dvso26YXg473cLEbQ1EaiXTdnBSvhYj8ENzwbe+a2wX0z3fLs+2ql9POJ7LvSXcEHUY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=sys-base.io; spf=pass smtp.mailfrom=sys-base.io; arc=none smtp.client-ip=185.233.101.22 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=sys-base.io Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=sys-base.io Received: from laika.paulk.fr (12.234.24.109.rev.sfr.net [109.24.234.12]) by leonov.paulk.fr (Postfix) with ESMTPS id BC5481F8004D; Mon, 18 May 2026 10:27:27 +0000 (UTC) Received: by laika.paulk.fr (Postfix, from userid 65534) id 3E5D7B4080A; Mon, 18 May 2026 10:27:27 +0000 (UTC) X-Spam-Level: * Received: from collins (unknown [192.168.1.64]) by laika.paulk.fr (Postfix) with ESMTP id 5F82AB407F1; Mon, 18 May 2026 10:24:54 +0000 (UTC) From: Paul Kocialkowski To: linux-media@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org, linux-staging@lists.linux.dev Cc: Paul Kocialkowski , Mauro Carvalho Chehab , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Greg Kroah-Hartman , Arash Golgol , Laurent Pinchart , Nicolas Dufresne Subject: [PATCH 04/16] media: sun8i-a83t-mipi-csi2: Use V4L2 subdev active state Date: Mon, 18 May 2026 12:24:39 +0200 Message-ID: <20260518102451.417971-5-paulk@sys-base.io> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260518102451.417971-1-paulk@sys-base.io> References: <20260518102451.417971-1-paulk@sys-base.io> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Arash Golgol 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. The sun8i-a83t-mipi-csi2 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 --- .../sun8i_a83t_mipi_csi2.c | 113 +++++++++--------- .../sun8i_a83t_mipi_csi2.h | 2 - 2 files changed, 56 insertions(+), 59 deletions(-) diff --git a/drivers/media/platform/sunxi/sun8i-a83t-mipi-csi2/sun8i_a83t_m= ipi_csi2.c b/drivers/media/platform/sunxi/sun8i-a83t-mipi-csi2/sun8i_a83t_m= ipi_csi2.c index dbc51daa4fe3..2b7635f3952d 100644 --- a/drivers/media/platform/sunxi/sun8i-a83t-mipi-csi2/sun8i_a83t_mipi_csi= 2.c +++ b/drivers/media/platform/sunxi/sun8i-a83t-mipi-csi2/sun8i_a83t_mipi_csi= 2.c @@ -144,12 +144,12 @@ sun8i_a83t_mipi_csi2_disable(struct sun8i_a83t_mipi_c= si2_device *csi2_dev) } =20 static void -sun8i_a83t_mipi_csi2_configure(struct sun8i_a83t_mipi_csi2_device *csi2_de= v) +sun8i_a83t_mipi_csi2_configure(struct sun8i_a83t_mipi_csi2_device *csi2_de= v, + const struct v4l2_mbus_framefmt *mbus_format) { struct regmap *regmap =3D csi2_dev->regmap; unsigned int lanes_count =3D csi2_dev->bridge.endpoint.bus.mipi_csi2.num_data_lanes; - struct v4l2_mbus_framefmt *mbus_format =3D &csi2_dev->bridge.mbus_format; const struct sun8i_a83t_mipi_csi2_format *format; struct device *dev =3D csi2_dev->dev; u32 version =3D 0; @@ -205,7 +205,8 @@ static int sun8i_a83t_mipi_csi2_s_stream(struct v4l2_su= bdev *subdev, int on) struct v4l2_subdev *source_subdev =3D csi2_dev->bridge.source_subdev; union phy_configure_opts dphy_opts =3D { 0 }; struct phy_configure_opts_mipi_dphy *dphy_cfg =3D &dphy_opts.mipi_dphy; - struct v4l2_mbus_framefmt *mbus_format =3D &csi2_dev->bridge.mbus_format; + struct v4l2_subdev_state *state; + const struct v4l2_mbus_framefmt *mbus_format; const struct sun8i_a83t_mipi_csi2_format *format; struct phy *dphy =3D csi2_dev->dphy; struct device *dev =3D csi2_dev->dev; @@ -215,8 +216,12 @@ static int sun8i_a83t_mipi_csi2_s_stream(struct v4l2_s= ubdev *subdev, int on) unsigned long pixel_rate; int ret; =20 - if (!source_subdev) - return -ENODEV; + state =3D v4l2_subdev_lock_and_get_active_state(subdev); + + if (!source_subdev) { + ret =3D -ENODEV; + goto unlock; + } =20 if (!on) { v4l2_subdev_call(source_subdev, video, s_stream, 0); @@ -228,7 +233,7 @@ static int sun8i_a83t_mipi_csi2_s_stream(struct v4l2_su= bdev *subdev, int on) =20 ret =3D pm_runtime_resume_and_get(dev); if (ret < 0) - return ret; + goto unlock; =20 /* Sensor pixel rate */ =20 @@ -254,6 +259,9 @@ static int sun8i_a83t_mipi_csi2_s_stream(struct v4l2_su= bdev *subdev, int on) goto error_pm; } =20 + mbus_format =3D + v4l2_subdev_state_get_format(state, + SUN8I_A83T_MIPI_CSI2_PAD_SINK); format =3D sun8i_a83t_mipi_csi2_format_find(mbus_format->code); if (WARN_ON(!format)) { ret =3D -ENODEV; @@ -292,7 +300,7 @@ static int sun8i_a83t_mipi_csi2_s_stream(struct v4l2_su= bdev *subdev, int on) =20 /* Controller */ =20 - sun8i_a83t_mipi_csi2_configure(csi2_dev); + sun8i_a83t_mipi_csi2_configure(csi2_dev, mbus_format); sun8i_a83t_mipi_csi2_enable(csi2_dev); =20 /* D-PHY */ @@ -309,7 +317,8 @@ static int sun8i_a83t_mipi_csi2_s_stream(struct v4l2_su= bdev *subdev, int on) if (ret && ret !=3D -ENOIOCTLCMD) goto disable; =20 - return 0; + ret =3D 0; + goto unlock; =20 disable: phy_power_off(dphy); @@ -318,6 +327,8 @@ static int sun8i_a83t_mipi_csi2_s_stream(struct v4l2_su= bdev *subdev, int on) error_pm: pm_runtime_put(dev); =20 +unlock: + v4l2_subdev_unlock_state(state); return ret; } =20 @@ -341,22 +352,24 @@ sun8i_a83t_mipi_csi2_mbus_format_prepare(struct v4l2_= mbus_framefmt *mbus_format) static int sun8i_a83t_mipi_csi2_init_state(struct v4l2_subdev *subdev, struct v4l2_subdev_state *state) { - struct sun8i_a83t_mipi_csi2_device *csi2_dev =3D - v4l2_get_subdevdata(subdev); - unsigned int pad =3D SUN8I_A83T_MIPI_CSI2_PAD_SINK; - struct v4l2_mbus_framefmt *mbus_format =3D - v4l2_subdev_state_get_format(state, pad); - struct mutex *lock =3D &csi2_dev->bridge.lock; + unsigned int pad; =20 - mutex_lock(lock); + /* + * This subdev does not perform format conversion, + * initialize both pads identically. + */ + for (pad =3D 0; pad < subdev->entity.num_pads; pad++) { + struct v4l2_mbus_framefmt *mbus_format; =20 - mbus_format->code =3D sun8i_a83t_mipi_csi2_formats[0].mbus_code; - mbus_format->width =3D 640; - mbus_format->height =3D 480; + mbus_format =3D v4l2_subdev_state_get_format(state, pad); + + mbus_format->code =3D sun8i_a83t_mipi_csi2_formats[0].mbus_code; + mbus_format->width =3D 640; + mbus_format->height =3D 480; =20 - sun8i_a83t_mipi_csi2_mbus_format_prepare(mbus_format); + sun8i_a83t_mipi_csi2_mbus_format_prepare(mbus_format); + } =20 - mutex_unlock(lock); =20 return 0; } @@ -375,55 +388,33 @@ sun8i_a83t_mipi_csi2_enum_mbus_code(struct v4l2_subde= v *subdev, return 0; } =20 -static int sun8i_a83t_mipi_csi2_get_fmt(struct v4l2_subdev *subdev, - struct v4l2_subdev_state *state, - struct v4l2_subdev_format *format) -{ - struct sun8i_a83t_mipi_csi2_device *csi2_dev =3D - v4l2_get_subdevdata(subdev); - struct v4l2_mbus_framefmt *mbus_format =3D &format->format; - struct mutex *lock =3D &csi2_dev->bridge.lock; - - mutex_lock(lock); - - if (format->which =3D=3D V4L2_SUBDEV_FORMAT_TRY) - *mbus_format =3D *v4l2_subdev_state_get_format(state, - format->pad); - else - *mbus_format =3D csi2_dev->bridge.mbus_format; - - mutex_unlock(lock); - - return 0; -} - static int sun8i_a83t_mipi_csi2_set_fmt(struct v4l2_subdev *subdev, struct v4l2_subdev_state *state, struct v4l2_subdev_format *format) { - struct sun8i_a83t_mipi_csi2_device *csi2_dev =3D - v4l2_get_subdevdata(subdev); - struct v4l2_mbus_framefmt *mbus_format =3D &format->format; - struct mutex *lock =3D &csi2_dev->bridge.lock; + struct v4l2_mbus_framefmt *fmt; =20 - mutex_lock(lock); + /* The format on the source pad always matches the sink pad. */ + if (format->pad !=3D SUN8I_A83T_MIPI_CSI2_PAD_SINK) + return v4l2_subdev_get_fmt(subdev, state, format); =20 - sun8i_a83t_mipi_csi2_mbus_format_prepare(mbus_format); + sun8i_a83t_mipi_csi2_mbus_format_prepare(&format->format); =20 - if (format->which =3D=3D V4L2_SUBDEV_FORMAT_TRY) - *v4l2_subdev_state_get_format(state, format->pad) =3D - *mbus_format; - else - csi2_dev->bridge.mbus_format =3D *mbus_format; + /* Set the format on the sink pad. */ + fmt =3D v4l2_subdev_state_get_format(state, format->pad); + *fmt =3D format->format; =20 - mutex_unlock(lock); + /* Propagate the format to the source pad. */ + fmt =3D v4l2_subdev_state_get_format(state, + SUN8I_A83T_MIPI_CSI2_PAD_SOURCE); + *fmt =3D format->format; =20 return 0; } =20 static const struct v4l2_subdev_pad_ops sun8i_a83t_mipi_csi2_pad_ops =3D { .enum_mbus_code =3D sun8i_a83t_mipi_csi2_enum_mbus_code, - .get_fmt =3D sun8i_a83t_mipi_csi2_get_fmt, + .get_fmt =3D v4l2_subdev_get_fmt, .set_fmt =3D sun8i_a83t_mipi_csi2_set_fmt, }; =20 @@ -540,8 +531,6 @@ sun8i_a83t_mipi_csi2_bridge_setup(struct sun8i_a83t_mip= i_csi2_device *csi2_dev) bool notifier_registered =3D false; int ret; =20 - mutex_init(&bridge->lock); - /* V4L2 Subdev */ =20 v4l2_subdev_init(subdev, &sun8i_a83t_mipi_csi2_subdev_ops); @@ -570,6 +559,12 @@ sun8i_a83t_mipi_csi2_bridge_setup(struct sun8i_a83t_mi= pi_csi2_device *csi2_dev) if (ret) return ret; =20 + /* V4L2 Subdev finalize */ + + ret =3D v4l2_subdev_init_finalize(subdev); + if (ret < 0) + goto error_media_entity_cleanup; + /* V4L2 Async */ =20 v4l2_async_subdev_nf_init(notifier, subdev); @@ -603,6 +598,9 @@ sun8i_a83t_mipi_csi2_bridge_setup(struct sun8i_a83t_mip= i_csi2_device *csi2_dev) error_v4l2_notifier_cleanup: v4l2_async_nf_cleanup(notifier); =20 + v4l2_subdev_cleanup(subdev); + +error_media_entity_cleanup: media_entity_cleanup(&subdev->entity); =20 return ret; @@ -617,6 +615,7 @@ sun8i_a83t_mipi_csi2_bridge_cleanup(struct sun8i_a83t_m= ipi_csi2_device *csi2_dev v4l2_async_unregister_subdev(subdev); v4l2_async_nf_unregister(notifier); v4l2_async_nf_cleanup(notifier); + v4l2_subdev_cleanup(subdev); media_entity_cleanup(&subdev->entity); } =20 diff --git a/drivers/media/platform/sunxi/sun8i-a83t-mipi-csi2/sun8i_a83t_m= ipi_csi2.h b/drivers/media/platform/sunxi/sun8i-a83t-mipi-csi2/sun8i_a83t_m= ipi_csi2.h index f1e64c53434c..819527bcd64d 100644 --- a/drivers/media/platform/sunxi/sun8i-a83t-mipi-csi2/sun8i_a83t_mipi_csi= 2.h +++ b/drivers/media/platform/sunxi/sun8i-a83t-mipi-csi2/sun8i_a83t_mipi_csi= 2.h @@ -33,8 +33,6 @@ struct sun8i_a83t_mipi_csi2_bridge { struct media_pad pads[SUN8I_A83T_MIPI_CSI2_PAD_COUNT]; struct v4l2_fwnode_endpoint endpoint; struct v4l2_async_notifier notifier; - struct v4l2_mbus_framefmt mbus_format; - struct mutex lock; /* Mbus format lock. */ =20 struct v4l2_subdev *source_subdev; }; --=20 2.54.0 From nobody Mon May 25 05:12:26 2026 Received: from leonov.paulk.fr (leonov.paulk.fr [185.233.101.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1E76C3E835B; Mon, 18 May 2026 10:27:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.233.101.22 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779100084; cv=none; b=Zl3UBUopHZgsgP3aLMLciTH0i65wdLIg+HEbeaHc6Jn7haOWWbZEqwC8QDaKVnDl5ZFD7oXPZK3izj7egoGLAzKlNnGVOTrqKfsfjUT/xXKiDbMtf9AUHMsK9iAIlnOghzMtiK8V2g+igODcZ1IQ7OzYF7ZJ14vriS5QW/fGdHw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779100084; c=relaxed/simple; bh=rOPLs8ziQTXtf4yGzefCGTBcEtcsiUtr3cFFKYF7g8A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=lSPPIHjlauYNoychdQ2mu7x+Dndk+7S6zwG5by9avMEf08/3NhtA/EXykyKKhwdcDLLSyvFq6XqeaevBPFPA/9J7e4czIgtRuKf6wckoLgUqfOpBsqcITt9MvNMc33zJ/cKhd1uVV+yjra+6jN3fhASvvxesyywV6U6rMURalBo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=sys-base.io; spf=pass smtp.mailfrom=sys-base.io; arc=none smtp.client-ip=185.233.101.22 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=sys-base.io Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=sys-base.io Received: from laika.paulk.fr (12.234.24.109.rev.sfr.net [109.24.234.12]) by leonov.paulk.fr (Postfix) with ESMTPS id 5F3001F8004A; Mon, 18 May 2026 10:27:53 +0000 (UTC) Received: by laika.paulk.fr (Postfix, from userid 65534) id D4E0CB4080D; Mon, 18 May 2026 10:27:52 +0000 (UTC) X-Spam-Level: * Received: from collins (unknown [192.168.1.64]) by laika.paulk.fr (Postfix) with ESMTP id A3E79B407F2; Mon, 18 May 2026 10:24:54 +0000 (UTC) From: Paul Kocialkowski To: linux-media@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org, linux-staging@lists.linux.dev Cc: Paul Kocialkowski , Mauro Carvalho Chehab , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Greg Kroah-Hartman , Arash Golgol , Laurent Pinchart , Nicolas Dufresne Subject: [PATCH 05/16] media: v4l2-common: Fix NV15_4L4 format info block height Date: Mon, 18 May 2026 12:24:40 +0200 Message-ID: <20260518102451.417971-6-paulk@sys-base.io> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260518102451.417971-1-paulk@sys-base.io> References: <20260518102451.417971-1-paulk@sys-base.io> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The NV15_4L4 format is specified as a 4x4 format, not 4x1. In addition the block size should not take subsampling in account, so specify it as 4x4 for both luma and chroma. Signed-off-by: Paul Kocialkowski --- drivers/media/v4l2-core/v4l2-common.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/media/v4l2-core/v4l2-common.c b/drivers/media/v4l2-cor= e/v4l2-common.c index 554c591e1113..77a0daa92c2b 100644 --- a/drivers/media/v4l2-core/v4l2-common.c +++ b/drivers/media/v4l2-core/v4l2-common.c @@ -309,7 +309,7 @@ const struct v4l2_format_info *v4l2_format_info(u32 for= mat) /* Tiled YUV formats */ { .format =3D V4L2_PIX_FMT_NV12_4L4, .pixel_enc =3D V4L2_PIXEL_ENC_YUV, = .mem_planes =3D 1, .comp_planes =3D 2, .bpp =3D { 1, 2, 0, 0 }, .bpp_div = =3D { 1, 1, 1, 1 }, .hdiv =3D 2, .vdiv =3D 2 }, { .format =3D V4L2_PIX_FMT_NV15_4L4, .pixel_enc =3D V4L2_PIXEL_ENC_YUV, = .mem_planes =3D 1, .comp_planes =3D 2, .bpp =3D { 5, 10, 0, 0 }, .bpp_div = =3D { 4, 4, 1, 1 }, .hdiv =3D 2, .vdiv =3D 2, - .block_w =3D { 4, 2, 0, 0 }, .block_h =3D { 1, 1, 0, 0 }}, + .block_w =3D { 4, 4, 0, 0 }, .block_h =3D { 4, 4, 0, 0 }}, { .format =3D V4L2_PIX_FMT_P010_4L4, .pixel_enc =3D V4L2_PIXEL_ENC_YUV, = .mem_planes =3D 1, .comp_planes =3D 2, .bpp =3D { 2, 4, 0, 0 }, .bpp_div = =3D { 1, 1, 1, 1 }, .hdiv =3D 2, .vdiv =3D 2 }, =20 /* YUV planar formats, non contiguous variant */ --=20 2.54.0 From nobody Mon May 25 05:12:26 2026 Received: from leonov.paulk.fr (leonov.paulk.fr [185.233.101.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 48E9B3EB7FA; Mon, 18 May 2026 10:28:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.233.101.22 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779100118; cv=none; b=cIa0pU5Ls4rrIy+3ompSo3e1fzDgGiMAjPwLmK3zvbX5UE+dsUaUcbHWRyvBnJzBURPmRpGSLFe7W8WQ7pFw7ix+pIhV2BHXYzkL+WS07WpgdsLGNxQe+J4/CXqpjbU2LKyK2ehn2y2B/mVYNBatCHFogIX+qaqsz6Fgz+CK724= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779100118; c=relaxed/simple; bh=RJtv2gx1tUEfFVw7z5+P1pqG0yHksAvNV2U0eiZ7RLk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=TDg+eGzKW1z6r45c4e4x6rLctJebDXdBC1ZrZPpLqLTLtWwRitcuN5P3WaLox7FHPRXgilcsyg1sRaOixFKTTZ5mxOfX2iXTXLwgUBF6Hw+1MmcW2Oyngjq3D6QzG9+jGaBr9z6zK2DQC/wJ6xdjTI4FZ42dLeSXp+9JfeK/G9E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=sys-base.io; spf=pass smtp.mailfrom=sys-base.io; arc=none smtp.client-ip=185.233.101.22 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=sys-base.io Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=sys-base.io Received: from laika.paulk.fr (12.234.24.109.rev.sfr.net [109.24.234.12]) by leonov.paulk.fr (Postfix) with ESMTPS id 973D41F80044; Mon, 18 May 2026 10:28:27 +0000 (UTC) Received: by laika.paulk.fr (Postfix, from userid 65534) id 174ECB40810; Mon, 18 May 2026 10:28:27 +0000 (UTC) X-Spam-Level: * Received: from collins (unknown [192.168.1.64]) by laika.paulk.fr (Postfix) with ESMTP id 082B1B407F3; Mon, 18 May 2026 10:24:55 +0000 (UTC) From: Paul Kocialkowski To: linux-media@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org, linux-staging@lists.linux.dev Cc: Paul Kocialkowski , Mauro Carvalho Chehab , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Greg Kroah-Hartman , Arash Golgol , Laurent Pinchart , Nicolas Dufresne Subject: [PATCH 06/16] media: v4l2-common: Add missing tiled format info block sizes Date: Mon, 18 May 2026 12:24:41 +0200 Message-ID: <20260518102451.417971-7-paulk@sys-base.io> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260518102451.417971-1-paulk@sys-base.io> References: <20260518102451.417971-1-paulk@sys-base.io> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Some YUV420 tiled format info definitions are missing block sizes. Add the missing block sizes (they are all 4x4). Signed-off-by: Paul Kocialkowski --- drivers/media/v4l2-core/v4l2-common.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/media/v4l2-core/v4l2-common.c b/drivers/media/v4l2-cor= e/v4l2-common.c index 77a0daa92c2b..e142d40c71b9 100644 --- a/drivers/media/v4l2-core/v4l2-common.c +++ b/drivers/media/v4l2-core/v4l2-common.c @@ -307,10 +307,12 @@ const struct v4l2_format_info *v4l2_format_info(u32 f= ormat) { .format =3D V4L2_PIX_FMT_GREY, .pixel_enc =3D V4L2_PIXEL_ENC_YUV, .= mem_planes =3D 1, .comp_planes =3D 1, .bpp =3D { 1, 0, 0, 0 }, .bpp_div =3D= { 1, 1, 1, 1 }, .hdiv =3D 1, .vdiv =3D 1 }, =20 /* Tiled YUV formats */ - { .format =3D V4L2_PIX_FMT_NV12_4L4, .pixel_enc =3D V4L2_PIXEL_ENC_YUV, = .mem_planes =3D 1, .comp_planes =3D 2, .bpp =3D { 1, 2, 0, 0 }, .bpp_div = =3D { 1, 1, 1, 1 }, .hdiv =3D 2, .vdiv =3D 2 }, + { .format =3D V4L2_PIX_FMT_NV12_4L4, .pixel_enc =3D V4L2_PIXEL_ENC_YUV, = .mem_planes =3D 1, .comp_planes =3D 2, .bpp =3D { 1, 2, 0, 0 }, .bpp_div = =3D { 1, 1, 1, 1 }, .hdiv =3D 2, .vdiv =3D 2, + .block_w =3D { 4, 4, 0, 0 }, .block_h =3D { 4, 4, 0, 0 }}, { .format =3D V4L2_PIX_FMT_NV15_4L4, .pixel_enc =3D V4L2_PIXEL_ENC_YUV, = .mem_planes =3D 1, .comp_planes =3D 2, .bpp =3D { 5, 10, 0, 0 }, .bpp_div = =3D { 4, 4, 1, 1 }, .hdiv =3D 2, .vdiv =3D 2, .block_w =3D { 4, 4, 0, 0 }, .block_h =3D { 4, 4, 0, 0 }}, - { .format =3D V4L2_PIX_FMT_P010_4L4, .pixel_enc =3D V4L2_PIXEL_ENC_YUV, = .mem_planes =3D 1, .comp_planes =3D 2, .bpp =3D { 2, 4, 0, 0 }, .bpp_div = =3D { 1, 1, 1, 1 }, .hdiv =3D 2, .vdiv =3D 2 }, + { .format =3D V4L2_PIX_FMT_P010_4L4, .pixel_enc =3D V4L2_PIXEL_ENC_YUV, = .mem_planes =3D 1, .comp_planes =3D 2, .bpp =3D { 2, 4, 0, 0 }, .bpp_div = =3D { 1, 1, 1, 1 }, .hdiv =3D 2, .vdiv =3D 2, + .block_w =3D { 4, 4, 0, 0 }, .block_h =3D { 4, 4, 0, 0 }}, =20 /* YUV planar formats, non contiguous variant */ { .format =3D V4L2_PIX_FMT_YUV420M, .pixel_enc =3D V4L2_PIXEL_ENC_YUV, .= mem_planes =3D 3, .comp_planes =3D 3, .bpp =3D { 1, 1, 1, 0 }, .bpp_div =3D= { 1, 1, 1, 1 }, .hdiv =3D 2, .vdiv =3D 2 }, --=20 2.54.0 From nobody Mon May 25 05:12:26 2026 Received: from leonov.paulk.fr (leonov.paulk.fr [185.233.101.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D677C3E833E; Mon, 18 May 2026 10:28:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.233.101.22 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779100145; cv=none; b=gKbF0p1U9EtRj6mCeTLqMsopE+ItFR8wuIxufzIhTjk2Ngo5VskQqFCJ+Ty1wes/U2is7u3FnzeQGwE/QjTAJsQDhrpziEMwl9CeqvwXsbcDYqt6II5qtvEXQ4zCukvvYZLeruUv8NvMaaf2mXFNDPs0nEsLHOhnLSEFC3Nxhvk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779100145; c=relaxed/simple; bh=ERMR5eeWA11hRqZdNI29e1YB2rlq2P5j6QMS8CIQNgM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=G6Rd2fF+BpVzCD3B2P8VaMXhgQ9PN8RtYMs/tEOoHoZUZQJ5PypUql4VhlwX3+6Y2mzR8vdwb2ipwYNcGiJqNsBbnB2zFLLlo/ECfkvPgrp9jrz+FWWvVcjx+thQlB8ddqggl2seI3BH5LvrWycfIBfbn0UosVu604LPaDbgLWs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=sys-base.io; spf=pass smtp.mailfrom=sys-base.io; arc=none smtp.client-ip=185.233.101.22 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=sys-base.io Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=sys-base.io Received: from laika.paulk.fr (12.234.24.109.rev.sfr.net [109.24.234.12]) by leonov.paulk.fr (Postfix) with ESMTPS id 293901F8004A; Mon, 18 May 2026 10:28:53 +0000 (UTC) Received: by laika.paulk.fr (Postfix, from userid 65534) id A6E97B40815; Mon, 18 May 2026 10:28:52 +0000 (UTC) X-Spam-Level: * Received: from collins (unknown [192.168.1.64]) by laika.paulk.fr (Postfix) with ESMTP id 4CE81B407F4; Mon, 18 May 2026 10:24:55 +0000 (UTC) From: Paul Kocialkowski To: linux-media@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org, linux-staging@lists.linux.dev Cc: Paul Kocialkowski , Mauro Carvalho Chehab , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Greg Kroah-Hartman , Arash Golgol , Laurent Pinchart , Nicolas Dufresne Subject: [PATCH 07/16] media: v4l2-common: Add NV12_16L16 pixel format to v4l2 format info Date: Mon, 18 May 2026 12:24:42 +0200 Message-ID: <20260518102451.417971-8-paulk@sys-base.io> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260518102451.417971-1-paulk@sys-base.io> References: <20260518102451.417971-1-paulk@sys-base.io> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Represent the NV12_16L16 pixel format in the v4l2 format info table. This is a 16x16 tiled version of NV12. Signed-off-by: Paul Kocialkowski --- drivers/media/v4l2-core/v4l2-common.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/media/v4l2-core/v4l2-common.c b/drivers/media/v4l2-cor= e/v4l2-common.c index e142d40c71b9..6194d6eb9c56 100644 --- a/drivers/media/v4l2-core/v4l2-common.c +++ b/drivers/media/v4l2-core/v4l2-common.c @@ -313,6 +313,8 @@ const struct v4l2_format_info *v4l2_format_info(u32 for= mat) .block_w =3D { 4, 4, 0, 0 }, .block_h =3D { 4, 4, 0, 0 }}, { .format =3D V4L2_PIX_FMT_P010_4L4, .pixel_enc =3D V4L2_PIXEL_ENC_YUV, = .mem_planes =3D 1, .comp_planes =3D 2, .bpp =3D { 2, 4, 0, 0 }, .bpp_div = =3D { 1, 1, 1, 1 }, .hdiv =3D 2, .vdiv =3D 2, .block_w =3D { 4, 4, 0, 0 }, .block_h =3D { 4, 4, 0, 0 }}, + { .format =3D V4L2_PIX_FMT_NV12_16L16, .pixel_enc =3D V4L2_PIXEL_ENC_YUV= , .mem_planes =3D 1, .comp_planes =3D 2, .bpp =3D { 1, 2, 0, 0 }, .bpp_div = =3D { 1, 1, 1, 1 }, .hdiv =3D 2, .vdiv =3D 2, + .block_w =3D { 16, 16, 0, 0 }, .block_h =3D { 16, 16, 0, 0 }}, =20 /* YUV planar formats, non contiguous variant */ { .format =3D V4L2_PIX_FMT_YUV420M, .pixel_enc =3D V4L2_PIXEL_ENC_YUV, .= mem_planes =3D 3, .comp_planes =3D 3, .bpp =3D { 1, 1, 1, 0 }, .bpp_div =3D= { 1, 1, 1, 1 }, .hdiv =3D 2, .vdiv =3D 2 }, --=20 2.54.0 From nobody Mon May 25 05:12:26 2026 Received: from leonov.paulk.fr (leonov.paulk.fr [185.233.101.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 124113E3DB6; Mon, 18 May 2026 10:29:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.233.101.22 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779100178; cv=none; b=qqgHFtDuEsnCoRu+76tfqi7N1DVJZUT1p6goFFw4cS0/r+bzHe+OpYo5iPQ+/+oo9Y58kTWOQJwZk8iGZ0Z6nawn/YMM8SpbXacI7yvvZyWM2Yj8zGM3YUzmFE9PEg6cmNzMEY7lwHKSDECDCMmAJLkcsrOAuExrTOuQ6jNfdwc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779100178; c=relaxed/simple; bh=eCvQTJjp2h8EORPuvx4oGznSj4EQT6vruXMeoKz4qjs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=AcDUiLfNC2aRPrjSrsK6AtSNs20HSrR3ZPIcXYOXvTDBSTHs4C1GfzetGkso+yYelrV/3btgC2DIIswD3XIfTMwOR1ROsyTIXWMGrGTTt5pnYBlXYZw/FJx+PKES36sFQYgrd5EPn/66OryrmX5DvnD2BACJwwub+//SyMTwHSg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=sys-base.io; spf=pass smtp.mailfrom=sys-base.io; arc=none smtp.client-ip=185.233.101.22 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=sys-base.io Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=sys-base.io Received: from laika.paulk.fr (12.234.24.109.rev.sfr.net [109.24.234.12]) by leonov.paulk.fr (Postfix) with ESMTPS id 66F961F80041; Mon, 18 May 2026 10:29:27 +0000 (UTC) Received: by laika.paulk.fr (Postfix, from userid 65534) id CEC13B40816; Mon, 18 May 2026 10:29:26 +0000 (UTC) X-Spam-Level: * Received: from collins (unknown [192.168.1.64]) by laika.paulk.fr (Postfix) with ESMTP id A0656B407F5; Mon, 18 May 2026 10:24:55 +0000 (UTC) From: Paul Kocialkowski To: linux-media@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org, linux-staging@lists.linux.dev Cc: Paul Kocialkowski , Mauro Carvalho Chehab , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Greg Kroah-Hartman , Arash Golgol , Laurent Pinchart , Nicolas Dufresne Subject: [PATCH 08/16] media: v4l2-common: Add NV12_32L32 pixel format to v4l2 format info Date: Mon, 18 May 2026 12:24:43 +0200 Message-ID: <20260518102451.417971-9-paulk@sys-base.io> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260518102451.417971-1-paulk@sys-base.io> References: <20260518102451.417971-1-paulk@sys-base.io> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Represent the NV12_32L32 pixel format in the v4l2 format info table. This is a 32x32 tiled version of NV12. Signed-off-by: Paul Kocialkowski --- drivers/media/v4l2-core/v4l2-common.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/media/v4l2-core/v4l2-common.c b/drivers/media/v4l2-cor= e/v4l2-common.c index 6194d6eb9c56..fe7141883ec5 100644 --- a/drivers/media/v4l2-core/v4l2-common.c +++ b/drivers/media/v4l2-core/v4l2-common.c @@ -315,6 +315,8 @@ const struct v4l2_format_info *v4l2_format_info(u32 for= mat) .block_w =3D { 4, 4, 0, 0 }, .block_h =3D { 4, 4, 0, 0 }}, { .format =3D V4L2_PIX_FMT_NV12_16L16, .pixel_enc =3D V4L2_PIXEL_ENC_YUV= , .mem_planes =3D 1, .comp_planes =3D 2, .bpp =3D { 1, 2, 0, 0 }, .bpp_div = =3D { 1, 1, 1, 1 }, .hdiv =3D 2, .vdiv =3D 2, .block_w =3D { 16, 16, 0, 0 }, .block_h =3D { 16, 16, 0, 0 }}, + { .format =3D V4L2_PIX_FMT_NV12_32L32, .pixel_enc =3D V4L2_PIXEL_ENC_YUV= , .mem_planes =3D 1, .comp_planes =3D 2, .bpp =3D { 1, 2, 0, 0 }, .bpp_div = =3D { 1, 1, 1, 1 }, .hdiv =3D 2, .vdiv =3D 2, + .block_w =3D { 32, 32, 0, 0 }, .block_h =3D { 32, 32, 0, 0 }}, =20 /* YUV planar formats, non contiguous variant */ { .format =3D V4L2_PIX_FMT_YUV420M, .pixel_enc =3D V4L2_PIXEL_ENC_YUV, .= mem_planes =3D 3, .comp_planes =3D 3, .bpp =3D { 1, 1, 1, 0 }, .bpp_div =3D= { 1, 1, 1, 1 }, .hdiv =3D 2, .vdiv =3D 2 }, --=20 2.54.0 From nobody Mon May 25 05:12:26 2026 Received: from leonov.paulk.fr (leonov.paulk.fr [185.233.101.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2A7313ECBD4; Mon, 18 May 2026 10:29:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.233.101.22 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779100204; cv=none; b=fqtNnQigghn5JvdlzqQyZ/4Q64XMXlLRDwQLRFALd7cOrmaZ20UD59UkFWRzQcrgw3lRl86uQZRQZyaH65axd3nPFt8rNfJTmS9o7+JkBBzoai7nKi0NNAUp9sROlf4VHZNG6qKg98jOeSV+rnljHyLC4IZIsULm16ul+3w3rl4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779100204; c=relaxed/simple; bh=N6jBm7mjftN6RyzhLYEDB/ctTHQIpMFcWgaVKSlq3IY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BR9YFIAjf/IkWx1wVV7sfm66zRXr5GskDFYy3ARSBk10ZIBrDgUWxHum3fd7YqOgtQDkyQhLEhoaUlXcQZsAtSL30Ag3iY65dfkYqh0mDDPYfGXLIwR2zpcKObSO6EbyU1h1VC58yqbumBW+TYb5ohbfele7OYRbv6+znpmmIUU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=sys-base.io; spf=pass smtp.mailfrom=sys-base.io; arc=none smtp.client-ip=185.233.101.22 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=sys-base.io Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=sys-base.io Received: from laika.paulk.fr (12.234.24.109.rev.sfr.net [109.24.234.12]) by leonov.paulk.fr (Postfix) with ESMTPS id 2659F1F8004A; Mon, 18 May 2026 10:29:53 +0000 (UTC) Received: by laika.paulk.fr (Postfix, from userid 65534) id 9DEC6B407F6; Mon, 18 May 2026 10:29:52 +0000 (UTC) X-Spam-Level: * Received: from collins (unknown [192.168.1.64]) by laika.paulk.fr (Postfix) with ESMTP id 0C8EBB407F6; Mon, 18 May 2026 10:24:56 +0000 (UTC) From: Paul Kocialkowski To: linux-media@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org, linux-staging@lists.linux.dev Cc: Paul Kocialkowski , Mauro Carvalho Chehab , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Greg Kroah-Hartman , Arash Golgol , Laurent Pinchart , Nicolas Dufresne Subject: [PATCH 09/16] media: sun6i-csi: Split format validation to a dedicated helper Date: Mon, 18 May 2026 12:24:44 +0200 Message-ID: <20260518102451.417971-10-paulk@sys-base.io> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260518102451.417971-1-paulk@sys-base.io> References: <20260518102451.417971-1-paulk@sys-base.io> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Introduce a new sun6i_csi_capture_format_check helper based on the link_validate code, which will be reused to implement MC-style pixelformat enumeration. Formats not listed in v4l2_format_info are now checked via sun6i_csi_capture_format_check (which only concerns raw formats) instead of blindly allowing them. Also fix a comment in the raw format table. Signed-off-by: Paul Kocialkowski --- .../sunxi/sun6i-csi/sun6i_csi_capture.c | 87 +++++++++++-------- 1 file changed, 49 insertions(+), 38 deletions(-) diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c b/d= rivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c index f788b4234673..a836fa7f081a 100644 --- a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c +++ b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c @@ -213,7 +213,7 @@ struct sun6i_csi_capture_format *sun6i_csi_capture_form= at_find(u32 pixelformat) /* RAW formats need an exact match between pixel and mbus formats. */ static const struct sun6i_csi_capture_format_match sun6i_csi_capture_format_matches[] = =3D { - /* YUV420 */ + /* YUV422 */ { .pixelformat =3D V4L2_PIX_FMT_YUYV, .mbus_code =3D MEDIA_BUS_FMT_YUYV8_2X8, @@ -327,6 +327,51 @@ static bool sun6i_csi_capture_format_match(u32 pixelfo= rmat, u32 mbus_code) return false; } =20 +static bool +sun6i_csi_capture_format_check(const struct sun6i_csi_capture_format *capt= ure_format, + const struct sun6i_csi_bridge_format *bridge_format) +{ + const struct v4l2_format_info *format_info; + u32 pixelformat =3D capture_format->pixelformat; + u32 mbus_code =3D bridge_format->mbus_code; + bool match; + + format_info =3D v4l2_format_info(pixelformat); + + /* Some raw formats like JPEG are not listed: try a direct match. */ + if (!format_info) + return sun6i_csi_capture_format_match(pixelformat, mbus_code); + + if (format_info->pixel_enc =3D=3D V4L2_PIXEL_ENC_BAYER && + bridge_format->input_format !=3D SUN6I_CSI_INPUT_FMT_RAW) + return false; + + if (format_info->pixel_enc =3D=3D V4L2_PIXEL_ENC_RGB && + bridge_format->input_format !=3D SUN6I_CSI_INPUT_FMT_RAW) + return false; + + if (format_info->pixel_enc =3D=3D V4L2_PIXEL_ENC_YUV) { + if (bridge_format->input_format !=3D SUN6I_CSI_INPUT_FMT_YUV420 && + bridge_format->input_format !=3D SUN6I_CSI_INPUT_FMT_YUV422) + return false; + + /* YUV420 input can't produce YUV422 output. */ + if (bridge_format->input_format =3D=3D SUN6I_CSI_INPUT_FMT_YUV420 && + format_info->vdiv =3D=3D 1) + return false; + } + + /* With raw input mode, we need a 1:1 match between input and output. */ + if (bridge_format->input_format =3D=3D SUN6I_CSI_INPUT_FMT_RAW || + capture_format->input_format_raw) { + match =3D sun6i_csi_capture_format_match(pixelformat, mbus_code); + if (!match) + return false; + } + + return true; +} + /* Capture */ =20 static void @@ -915,13 +960,11 @@ static int sun6i_csi_capture_link_validate(struct med= ia_link *link) const struct sun6i_csi_capture_format *capture_format; const struct sun6i_csi_bridge_format *bridge_format; unsigned int capture_width, capture_height; - const struct v4l2_format_info *format_info; struct v4l2_subdev_format src_fmt =3D { .which =3D V4L2_SUBDEV_FORMAT_ACTIVE, .pad =3D link->source->index }; u32 pixelformat, capture_field; - bool match; int ret; =20 sun6i_csi_capture_dimensions(csi_dev, &capture_width, &capture_height); @@ -950,44 +993,12 @@ static int sun6i_csi_capture_link_validate(struct med= ia_link *link) return -EINVAL; } =20 - format_info =3D v4l2_format_info(pixelformat); - /* Some formats are not listed. */ - if (!format_info) - return 0; - - if (format_info->pixel_enc =3D=3D V4L2_PIXEL_ENC_BAYER && - bridge_format->input_format !=3D SUN6I_CSI_INPUT_FMT_RAW) - goto invalid; - - if (format_info->pixel_enc =3D=3D V4L2_PIXEL_ENC_RGB && - bridge_format->input_format !=3D SUN6I_CSI_INPUT_FMT_RAW) - goto invalid; - - if (format_info->pixel_enc =3D=3D V4L2_PIXEL_ENC_YUV) { - if (bridge_format->input_format !=3D SUN6I_CSI_INPUT_FMT_YUV420 && - bridge_format->input_format !=3D SUN6I_CSI_INPUT_FMT_YUV422) - goto invalid; - - /* YUV420 input can't produce YUV422 output. */ - if (bridge_format->input_format =3D=3D SUN6I_CSI_INPUT_FMT_YUV420 && - format_info->vdiv =3D=3D 1) - goto invalid; - } - - /* With raw input mode, we need a 1:1 match between input and output. */ - if (bridge_format->input_format =3D=3D SUN6I_CSI_INPUT_FMT_RAW || - capture_format->input_format_raw) { - match =3D sun6i_csi_capture_format_match(pixelformat, - src_fmt.format.code); - if (!match) - goto invalid; + if (!sun6i_csi_capture_format_check(capture_format, bridge_format)) { + v4l2_err(v4l2_dev, "invalid input/output format combination\n"); + return -EINVAL; } =20 return 0; - -invalid: - v4l2_err(v4l2_dev, "invalid input/output format combination\n"); - return -EINVAL; } =20 static const struct media_entity_operations sun6i_csi_capture_media_ops = =3D { --=20 2.54.0 From nobody Mon May 25 05:12:26 2026 Received: from leonov.paulk.fr (leonov.paulk.fr [185.233.101.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0BD153EC2F7; Mon, 18 May 2026 10:30:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.233.101.22 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779100258; cv=none; b=hQX/9ggB0laEUcfYZtpIH90aumqdjn1uCDKnY1hANi9kLBhTbgzDP5m2YB8P4cwUjm+afcVnrx1ubRT5bP+wSxq29wKcNcutFyvMJ3vTFLWgy29l7eOt/aQaq0iHW3n2NXG3c7i7uyLkwokf9K3J/rKZswbM9/wz64RvRqbeRvA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779100258; c=relaxed/simple; bh=a94F18r5g+FvBqZBmEeOdOnNuIqh/W6Oyf8UGJe6Jgw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=uetNDeDhgqmU5qfPRVfmCOYiTy+TehQD8FWJ1O3sctc/1rcdaayAbyfRo+gMdeTH0TAP2fQrdsDTqytdq6YqTMoNDRnjhZyHMClO8yx5CKxgwznP8Eyrrbhx+OrlaPnsJRCbsu8M2v0iKo4zVJU6LH2Em/BB0nI8pm+nxBxvWZo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=sys-base.io; spf=pass smtp.mailfrom=sys-base.io; arc=none smtp.client-ip=185.233.101.22 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=sys-base.io Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=sys-base.io Received: from laika.paulk.fr (12.234.24.109.rev.sfr.net [109.24.234.12]) by leonov.paulk.fr (Postfix) with ESMTPS id 10DDF1F80044; Mon, 18 May 2026 10:30:28 +0000 (UTC) Received: by laika.paulk.fr (Postfix, from userid 65534) id E28B0B4081A; Mon, 18 May 2026 10:30:26 +0000 (UTC) X-Spam-Level: * Received: from collins (unknown [192.168.1.64]) by laika.paulk.fr (Postfix) with ESMTP id 5C629B407F7; Mon, 18 May 2026 10:25:00 +0000 (UTC) From: Paul Kocialkowski To: linux-media@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org, linux-staging@lists.linux.dev Cc: Paul Kocialkowski , Mauro Carvalho Chehab , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Greg Kroah-Hartman , Arash Golgol , Laurent Pinchart , Nicolas Dufresne Subject: [PATCH 10/16] media: sun6i-csi: Add support for MC-centric format enumeration Date: Mon, 18 May 2026 12:24:45 +0200 Message-ID: <20260518102451.417971-11-paulk@sys-base.io> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260518102451.417971-1-paulk@sys-base.io> References: <20260518102451.417971-1-paulk@sys-base.io> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Use the dedicated helper to check possible pixelformats against the provided mbus code in order to support MC-centric format enumeration. Note that multiple pixelformats may be returned for a given mbus code. Signed-off-by: Paul Kocialkowski --- .../sunxi/sun6i-csi/sun6i_csi_capture.c | 38 +++++++++++++++++-- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c b/d= rivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c index a836fa7f081a..409c28621093 100644 --- a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c +++ b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c @@ -773,14 +773,43 @@ static int sun6i_csi_capture_querycap(struct file *fi= le, void *priv, static int sun6i_csi_capture_enum_fmt(struct file *file, void *priv, struct v4l2_fmtdesc *fmtdesc) { + const struct sun6i_csi_capture_format *capture_format; + const struct sun6i_csi_bridge_format *bridge_format; + u32 mbus_code =3D fmtdesc->mbus_code; u32 index =3D fmtdesc->index; + unsigned int index_valid =3D 0; + unsigned int i; + + /* Video-node-centric enumeration. */ + if (!mbus_code) { + if (index >=3D ARRAY_SIZE(sun6i_csi_capture_formats)) + return -EINVAL; + + fmtdesc->pixelformat =3D + sun6i_csi_capture_formats[index].pixelformat; + return 0; + } =20 - if (index >=3D ARRAY_SIZE(sun6i_csi_capture_formats)) + bridge_format =3D sun6i_csi_bridge_format_find(mbus_code); + if (!bridge_format) return -EINVAL; =20 - fmtdesc->pixelformat =3D sun6i_csi_capture_formats[index].pixelformat; + for (i =3D 0; i < ARRAY_SIZE(sun6i_csi_capture_formats); i++) { + capture_format =3D &sun6i_csi_capture_formats[i]; =20 - return 0; + if (!sun6i_csi_capture_format_check(capture_format, + bridge_format)) + continue; + + if (index_valid =3D=3D index) { + fmtdesc->pixelformat =3D capture_format->pixelformat; + return 0; + } + + index_valid++; + } + + return -EINVAL; } =20 static int sun6i_csi_capture_enum_framesize(struct file *file, void *fh, @@ -1076,7 +1105,8 @@ int sun6i_csi_capture_setup(struct sun6i_csi_device *= csi_dev) =20 strscpy(video_dev->name, SUN6I_CSI_CAPTURE_NAME, sizeof(video_dev->name)); - video_dev->device_caps =3D V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; + video_dev->device_caps =3D V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING | + V4L2_CAP_IO_MC; video_dev->vfl_dir =3D VFL_DIR_RX; video_dev->release =3D video_device_release_empty; video_dev->fops =3D &sun6i_csi_capture_fops; --=20 2.54.0 From nobody Mon May 25 05:12:26 2026 Received: from leonov.paulk.fr (leonov.paulk.fr [185.233.101.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E42EF3ED5B6; Mon, 18 May 2026 10:30:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.233.101.22 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779100270; cv=none; b=hNPb3g+2BF4r1Hb01zzmSNk1FiyzAgNpommSuEz9KIoX+4IX2PFlTxBv/pZDDi9C5LHIjt0q1qoDo+I2337OohFnFIzrTjcQKHAsdaa7OAXdTUZTyJ5O7tpw8N8/VbnK2S8lfWs48tx/YsNKnS7minRNCdzWak/+OCo5dFztU2k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779100270; c=relaxed/simple; bh=pGb0topKOndkQgyiZuK5FBJvTqlPd3JBn9MwPx7o0Wc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Zu/15aTAo+HwiokJ76lA3UM0eQ34jRH3Y9TG6/XK75K5qJzjVRyv1qbtn19sO/KqapG2QSNSJJWclvWpdwrS0jVViPOjVvx3VkxWyCXxY4DnPez+XnTP2LSIyyymLP5thUHTga18wWP7L7v6lZ+ePKy69tTBy5ZLh3FxgpaYVkc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=sys-base.io; spf=pass smtp.mailfrom=sys-base.io; arc=none smtp.client-ip=185.233.101.22 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=sys-base.io Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=sys-base.io Received: from laika.paulk.fr (12.234.24.109.rev.sfr.net [109.24.234.12]) by leonov.paulk.fr (Postfix) with ESMTPS id 63B3A1F8004A; Mon, 18 May 2026 10:30:54 +0000 (UTC) Received: by laika.paulk.fr (Postfix, from userid 65534) id A99F1B40821; Mon, 18 May 2026 10:30:53 +0000 (UTC) X-Spam-Level: * Received: from collins (unknown [192.168.1.64]) by laika.paulk.fr (Postfix) with ESMTP id A5E0BB407F8; Mon, 18 May 2026 10:25:00 +0000 (UTC) From: Paul Kocialkowski To: linux-media@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org, linux-staging@lists.linux.dev Cc: Paul Kocialkowski , Mauro Carvalho Chehab , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Greg Kroah-Hartman , Arash Golgol , Laurent Pinchart , Nicolas Dufresne Subject: [PATCH 11/16] media: sun6i-csi: Tidy up and unify coding style Date: Mon, 18 May 2026 12:24:46 +0200 Message-ID: <20260518102451.417971-12-paulk@sys-base.io> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260518102451.417971-1-paulk@sys-base.io> References: <20260518102451.417971-1-paulk@sys-base.io> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Bring recent changes to the same coding style as the rest of the driver. This is purely cosmetic and no functional change is intended. Signed-off-by: Paul Kocialkowski --- .../sunxi/sun6i-csi/sun6i_csi_bridge.c | 16 ++--- .../sunxi/sun6i-csi/sun6i_csi_capture.c | 72 ++++++++++--------- 2 files changed, 46 insertions(+), 42 deletions(-) diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_bridge.c b/dr= ivers/media/platform/sunxi/sun6i-csi/sun6i_csi_bridge.c index 43a85bcc2ba2..18f79075d3ad 100644 --- a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_bridge.c +++ b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_bridge.c @@ -473,6 +473,7 @@ static int sun6i_csi_bridge_s_stream(struct v4l2_subdev= *subdev, int on) =20 unlock: v4l2_subdev_unlock_state(state); + return ret; } =20 @@ -533,7 +534,7 @@ static int sun6i_csi_bridge_set_fmt(struct v4l2_subdev = *subdev, struct v4l2_subdev_state *state, struct v4l2_subdev_format *format) { - struct v4l2_mbus_framefmt *fmt; + struct v4l2_mbus_framefmt *mbus_format; =20 /* The format on the source pad always matches the sink pad. */ if (format->pad !=3D SUN6I_CSI_BRIDGE_PAD_SINK) @@ -542,12 +543,12 @@ static int sun6i_csi_bridge_set_fmt(struct v4l2_subde= v *subdev, sun6i_csi_bridge_mbus_format_prepare(&format->format); =20 /* Set the format on the sink pad. */ - fmt =3D v4l2_subdev_state_get_format(state, format->pad); - *fmt =3D format->format; + mbus_format =3D v4l2_subdev_state_get_format(state, format->pad); + *mbus_format =3D format->format; =20 /* Propagate the format to the source pad. */ - fmt =3D v4l2_subdev_state_get_format(state, SUN6I_CSI_BRIDGE_PAD_SOURCE); - *fmt =3D format->format; + mbus_format =3D v4l2_subdev_state_get_format(state, SUN6I_CSI_BRIDGE_PAD_= SOURCE); + *mbus_format =3D format->format; =20 return 0; } @@ -779,14 +780,12 @@ int sun6i_csi_bridge_setup(struct sun6i_csi_device *c= si_dev) if (ret < 0) return ret; =20 - /* V4L2 Subdev finalize */ + /* V4L2 Subdev */ =20 ret =3D v4l2_subdev_init_finalize(subdev); if (ret < 0) goto error_media_entity; =20 - /* V4L2 Subdev */ - if (csi_dev->isp_available) ret =3D v4l2_async_register_subdev(subdev); else @@ -846,7 +845,6 @@ void sun6i_csi_bridge_cleanup(struct sun6i_csi_device *= csi_dev) v4l2_async_nf_cleanup(notifier); =20 v4l2_device_unregister_subdev(subdev); - v4l2_subdev_cleanup(subdev); =20 media_entity_cleanup(&subdev->entity); diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c b/d= rivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c index 409c28621093..eea682f47eea 100644 --- a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c +++ b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi_capture.c @@ -812,27 +812,6 @@ static int sun6i_csi_capture_enum_fmt(struct file *fil= e, void *priv, return -EINVAL; } =20 -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 =3D V4L2_FRMSIZE_TYPE_STEPWISE; - fsize->stepwise.min_width =3D SUN6I_CSI_CAPTURE_WIDTH_MIN; - fsize->stepwise.max_width =3D SUN6I_CSI_CAPTURE_WIDTH_MAX; - fsize->stepwise.min_height =3D SUN6I_CSI_CAPTURE_HEIGHT_MIN; - fsize->stepwise.max_height =3D SUN6I_CSI_CAPTURE_HEIGHT_MAX; - fsize->stepwise.step_width =3D 2; - fsize->stepwise.step_height =3D 2; - - return 0; -} - static int sun6i_csi_capture_g_fmt(struct file *file, void *priv, struct v4l2_format *format) { @@ -867,6 +846,27 @@ static int sun6i_csi_capture_try_fmt(struct file *file= , void *priv, return 0; } =20 +static int sun6i_csi_capture_enum_framesizes(struct file *file, void *fh, + struct v4l2_frmsizeenum *frmsize) +{ + if (frmsize->index) + return -EINVAL; + + /* Only accept format in map table. */ + if (!sun6i_csi_capture_format_find(frmsize->pixel_format)) + return -EINVAL; + + frmsize->type =3D V4L2_FRMSIZE_TYPE_STEPWISE; + frmsize->stepwise.min_width =3D SUN6I_CSI_CAPTURE_WIDTH_MIN; + frmsize->stepwise.max_width =3D SUN6I_CSI_CAPTURE_WIDTH_MAX; + frmsize->stepwise.min_height =3D SUN6I_CSI_CAPTURE_HEIGHT_MIN; + frmsize->stepwise.max_height =3D SUN6I_CSI_CAPTURE_HEIGHT_MAX; + frmsize->stepwise.step_width =3D 2; + frmsize->stepwise.step_height =3D 2; + + return 0; +} + static int sun6i_csi_capture_enum_input(struct file *file, void *priv, struct v4l2_input *input) { @@ -900,11 +900,12 @@ static const struct v4l2_ioctl_ops sun6i_csi_capture_= ioctl_ops =3D { .vidioc_querycap =3D sun6i_csi_capture_querycap, =20 .vidioc_enum_fmt_vid_cap =3D sun6i_csi_capture_enum_fmt, - .vidioc_enum_framesizes =3D sun6i_csi_capture_enum_framesize, .vidioc_g_fmt_vid_cap =3D sun6i_csi_capture_g_fmt, .vidioc_s_fmt_vid_cap =3D sun6i_csi_capture_s_fmt, .vidioc_try_fmt_vid_cap =3D sun6i_csi_capture_try_fmt, =20 + .vidioc_enum_framesizes =3D sun6i_csi_capture_enum_framesizes, + .vidioc_enum_input =3D sun6i_csi_capture_enum_input, .vidioc_g_input =3D sun6i_csi_capture_g_input, .vidioc_s_input =3D sun6i_csi_capture_s_input, @@ -984,16 +985,17 @@ static int sun6i_csi_capture_link_validate(struct med= ia_link *link) media_entity_to_video_device(link->sink->entity); struct sun6i_csi_device *csi_dev =3D video_get_drvdata(video_dev); struct v4l2_device *v4l2_dev =3D csi_dev->v4l2_dev; - struct v4l2_subdev *src_subdev =3D + struct v4l2_subdev *bridge_subdev =3D 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; - struct v4l2_subdev_format src_fmt =3D { - .which =3D V4L2_SUBDEV_FORMAT_ACTIVE, - .pad =3D link->source->index + unsigned int bridge_width, bridge_height; + struct v4l2_subdev_format bridge_subdev_format =3D { + .which =3D V4L2_SUBDEV_FORMAT_ACTIVE, + .pad =3D link->source->index, }; - u32 pixelformat, capture_field; + u32 pixelformat, capture_field, mbus_code; int ret; =20 sun6i_csi_capture_dimensions(csi_dev, &capture_width, &capture_height); @@ -1004,21 +1006,25 @@ static int sun6i_csi_capture_link_validate(struct m= edia_link *link) return -EINVAL; =20 /* Resolve csi bridge format. */ - ret =3D v4l2_subdev_call(src_subdev, pad, get_fmt, NULL, &src_fmt); + ret =3D v4l2_subdev_call(bridge_subdev, pad, get_fmt, NULL, + &bridge_subdev_format); if (ret) return ret; =20 - bridge_format =3D sun6i_csi_bridge_format_find(src_fmt.format.code); + bridge_width =3D bridge_subdev_format.format.width; + bridge_height =3D bridge_subdev_format.format.height; + mbus_code =3D bridge_subdev_format.format.code; + + bridge_format =3D sun6i_csi_bridge_format_find(mbus_code); if (WARN_ON(!bridge_format)) return -EINVAL; =20 /* No cropping/scaling is supported. */ - if (capture_width !=3D src_fmt.format.width || - capture_height !=3D src_fmt.format.height) { + if (capture_width !=3D bridge_width || capture_height !=3D bridge_height)= { v4l2_err(v4l2_dev, "invalid input/output dimensions: %ux%u/%ux%u\n", - src_fmt.format.width, src_fmt.format.height, - capture_width, capture_height); + bridge_width, bridge_height, capture_width, + capture_height); return -EINVAL; } =20 --=20 2.54.0 From nobody Mon May 25 05:12:26 2026 Received: from leonov.paulk.fr (leonov.paulk.fr [185.233.101.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 96C143E8359; Mon, 18 May 2026 10:31:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.233.101.22 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779100317; cv=none; b=I4AkcMBhU2b+WK4IzjOj/dGf0aVXXPmwH1nwbewYqzsEfsv5QM2HyFp50Ak7dxvuuxu9vTOdw8o7Qd9lohnVVRLttW7om3uZ1u/C+dPCxPfnDVyDXohqScTYSq+UHbxmo45c0QW/wrNTbT6EfXhyqCNRl2w0JaPkdos9V0ZKY20= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779100317; c=relaxed/simple; bh=3KX5OyYkwJhiTbzQdQdOc5p3BV7xGqdUpy50KYOtY0g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=OW2cy1Bdg8ZSv88gGc77k1EYGiC+M4vcUH1VgPAjjRY3HXUwuEkCdXgmW/VYJ7k6h0eVncmkdG2WcDLjjLqFNL+PY5URNvp80pHaUzVfivUp8dTLyGx9xlUhReZ9R+lEAr3aV18laJm6v96sWQ4ivI3CYzFnWTctbFhHCdwXkfI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=sys-base.io; spf=pass smtp.mailfrom=sys-base.io; arc=none smtp.client-ip=185.233.101.22 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=sys-base.io Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=sys-base.io Received: from laika.paulk.fr (12.234.24.109.rev.sfr.net [109.24.234.12]) by leonov.paulk.fr (Postfix) with ESMTPS id 547FB1F80044; Mon, 18 May 2026 10:31:27 +0000 (UTC) Received: by laika.paulk.fr (Postfix, from userid 65534) id DAA2CB407F9; Mon, 18 May 2026 10:31:26 +0000 (UTC) X-Spam-Level: * Received: from collins (unknown [192.168.1.64]) by laika.paulk.fr (Postfix) with ESMTP id ECF89B407F9; Mon, 18 May 2026 10:25:00 +0000 (UTC) From: Paul Kocialkowski To: linux-media@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org, linux-staging@lists.linux.dev Cc: Paul Kocialkowski , Mauro Carvalho Chehab , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Greg Kroah-Hartman , Arash Golgol , Laurent Pinchart , Nicolas Dufresne Subject: [PATCH 12/16] media: sun6i-mipi-csi2: Fix parenthesis alignment Date: Mon, 18 May 2026 12:24:47 +0200 Message-ID: <20260518102451.417971-13-paulk@sys-base.io> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260518102451.417971-1-paulk@sys-base.io> References: <20260518102451.417971-1-paulk@sys-base.io> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This is purely cosmetic, no functional change intended. Signed-off-by: Paul Kocialkowski --- drivers/media/platform/sunxi/sun6i-mipi-csi2/sun6i_mipi_csi2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/media/platform/sunxi/sun6i-mipi-csi2/sun6i_mipi_csi2.c= b/drivers/media/platform/sunxi/sun6i-mipi-csi2/sun6i_mipi_csi2.c index 682bdd82098c..17a9a215a98a 100644 --- a/drivers/media/platform/sunxi/sun6i-mipi-csi2/sun6i_mipi_csi2.c +++ b/drivers/media/platform/sunxi/sun6i-mipi-csi2/sun6i_mipi_csi2.c @@ -96,7 +96,7 @@ static void sun6i_mipi_csi2_disable(struct sun6i_mipi_csi= 2_device *csi2_dev) } =20 static void sun6i_mipi_csi2_configure(struct sun6i_mipi_csi2_device *csi2_= dev, - const struct v4l2_mbus_framefmt *mbus_format) + const struct v4l2_mbus_framefmt *mbus_format) { struct regmap *regmap =3D csi2_dev->regmap; unsigned int lanes_count =3D --=20 2.54.0 From nobody Mon May 25 05:12:26 2026 Received: from leonov.paulk.fr (leonov.paulk.fr [185.233.101.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5FEBD3E6DDB; Mon, 18 May 2026 10:31:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.233.101.22 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779100330; cv=none; b=A2Z6i53533aLQ8bdwPXLpw0xd98//c8n/G5jaRM5pjSiHi/7Ut3wrSd1iNPGuhyuHf5mU9xQn8ntxNyeRXD0BmfLAdHdqAh9w5tMOmvuB9oEpHabgWD8s5OjMMUSo1GNwsZRvXDnw6oodUpUSOqeojYbomo+BYnHmaGIfHSibMQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779100330; c=relaxed/simple; bh=y79apGl6OKDANYCmmE5+PZLLyf9iwNGUT3KnWbPd0gQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=stP4+1OUIEWDIcI3trNWsUXSVREEM8rjrEva9M1B7cQdJZ0bJAkFXB/0dJKsLspIfbzpEPt9SLez3GsP+TPT0BnPG7QzdjfJ3zSuhMuUYpcrsynUjl/SiCVFUL08Wlr5Mx2Fn7AwfDdWHXrnWi900LcDenvPgWTyaLAXSFd2Abc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=sys-base.io; spf=pass smtp.mailfrom=sys-base.io; arc=none smtp.client-ip=185.233.101.22 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=sys-base.io Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=sys-base.io Received: from laika.paulk.fr (12.234.24.109.rev.sfr.net [109.24.234.12]) by leonov.paulk.fr (Postfix) with ESMTPS id ED4611F8004A; Mon, 18 May 2026 10:31:52 +0000 (UTC) Received: by laika.paulk.fr (Postfix, from userid 65534) id 708B1B40828; Mon, 18 May 2026 10:31:52 +0000 (UTC) X-Spam-Level: * Received: from collins (unknown [192.168.1.64]) by laika.paulk.fr (Postfix) with ESMTP id 6F206B407FB; Mon, 18 May 2026 10:25:01 +0000 (UTC) From: Paul Kocialkowski To: linux-media@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org, linux-staging@lists.linux.dev Cc: Paul Kocialkowski , Mauro Carvalho Chehab , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Greg Kroah-Hartman , Arash Golgol , Laurent Pinchart , Nicolas Dufresne Subject: [PATCH 13/16] media: sun6i-isp: Add dummy params link_validate implementation Date: Mon, 18 May 2026 12:24:48 +0200 Message-ID: <20260518102451.417971-14-paulk@sys-base.io> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260518102451.417971-1-paulk@sys-base.io> References: <20260518102451.417971-1-paulk@sys-base.io> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" There isn't anything configurable about the params video device link, but the v4l2 core complains that no op is provided so implement a dummy one to make it happy. Signed-off-by: Paul Kocialkowski Tested-by: Arash Golgol --- .../media/sunxi/sun6i-isp/sun6i_isp_params.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_params.c b/dri= vers/staging/media/sunxi/sun6i-isp/sun6i_isp_params.c index 77c2d06c0436..b7ef33fa2b13 100644 --- a/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_params.c +++ b/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_params.c @@ -450,6 +450,18 @@ static const struct v4l2_file_operations sun6i_isp_par= ams_fops =3D { .poll =3D vb2_fop_poll, }; =20 +/* Media Entity */ + +static int sun6i_isp_params_link_validate(struct media_link *link) +{ + /* Nothing to validate here. */ + return 0; +} + +static const struct media_entity_operations sun6i_isp_params_entity_ops = =3D { + .link_validate =3D sun6i_isp_params_link_validate, +}; + /* Params */ =20 int sun6i_isp_params_setup(struct sun6i_isp_device *isp_dev) @@ -470,6 +482,10 @@ int sun6i_isp_params_setup(struct sun6i_isp_device *is= p_dev) INIT_LIST_HEAD(&state->queue); spin_lock_init(&state->lock); =20 + /* Media Entity */ + + video_dev->entity.ops =3D &sun6i_isp_params_entity_ops; + /* Media Pads */ =20 pad->flags =3D MEDIA_PAD_FL_SOURCE | MEDIA_PAD_FL_MUST_CONNECT; --=20 2.54.0 From nobody Mon May 25 05:12:26 2026 Received: from leonov.paulk.fr (leonov.paulk.fr [185.233.101.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3234C3ED114; Mon, 18 May 2026 10:32:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.233.101.22 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779100371; cv=none; b=qZ5Z0GHEvuScdNDv1l/W52pBW5CFej6DRGBOGXllC2atpgHZ5mnNoIj9m+RqxDsARjibjtXrHgdriS05td2RDIF0COfKOSXCHWTLApERebj6A7V8RvFoOOXeNlknpZvKujPQaNqsgT7nQwOnf1Fbtul2t0QEbL5IK6cVEhumB6c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779100371; c=relaxed/simple; bh=fmifNF4wHadqQlP/a3pXW+27pHqSFgjDfb4aMBlUX9c=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Qyze0mrOBZuyFk9i+19ZrhAtY4D09AsPpV8XKpIEhdSrz/aEPoBmUoHfcX4nt47v0cO/6rHM7cH0XFEpx9u5r2p1VvRRnpAi5KJ7fNeU64xpf2JJnIdY+86UJGNEYNSQ5lKpGK/FE9XR1Ttnjr2BDC+m59iwawm9n1B0q5mcWSE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=sys-base.io; spf=pass smtp.mailfrom=sys-base.io; arc=none smtp.client-ip=185.233.101.22 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=sys-base.io Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=sys-base.io Received: from laika.paulk.fr (12.234.24.109.rev.sfr.net [109.24.234.12]) by leonov.paulk.fr (Postfix) with ESMTPS id 111EF1F8004D; Mon, 18 May 2026 10:32:20 +0000 (UTC) Received: by laika.paulk.fr (Postfix, from userid 65534) id 89F43B4082B; Mon, 18 May 2026 10:32:19 +0000 (UTC) X-Spam-Level: * Received: from collins (unknown [192.168.1.64]) by laika.paulk.fr (Postfix) with ESMTP id B68C1B407FD; Mon, 18 May 2026 10:25:01 +0000 (UTC) From: Paul Kocialkowski To: linux-media@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org, linux-staging@lists.linux.dev Cc: Paul Kocialkowski , Mauro Carvalho Chehab , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Greg Kroah-Hartman , Arash Golgol , Laurent Pinchart , Nicolas Dufresne Subject: [PATCH 14/16] media: sun6i-isp: Use V4L2 subdev active state Date: Mon, 18 May 2026 12:24:49 +0200 Message-ID: <20260518102451.417971-15-paulk@sys-base.io> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260518102451.417971-1-paulk@sys-base.io> References: <20260518102451.417971-1-paulk@sys-base.io> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Store the active format using the common V4L2 subdev active state instead of our local copy of it. Signed-off-by: Paul Kocialkowski Reviewed-by tag, a lot of this work is very similar to what you did for Reviewed-by: Arash Golgol Tested-by: Arash Golgol --- .../media/sunxi/sun6i-isp/sun6i_isp_capture.c | 16 ++- .../media/sunxi/sun6i-isp/sun6i_isp_params.c | 18 ++- .../media/sunxi/sun6i-isp/sun6i_isp_params.h | 4 +- .../media/sunxi/sun6i-isp/sun6i_isp_proc.c | 117 ++++++++---------- .../media/sunxi/sun6i-isp/sun6i_isp_proc.h | 7 -- 5 files changed, 82 insertions(+), 80 deletions(-) diff --git a/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_capture.c b/dr= ivers/staging/media/sunxi/sun6i-isp/sun6i_isp_capture.c index e7b99cee63d6..24e731bcabe9 100644 --- a/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_capture.c +++ b/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_capture.c @@ -595,11 +595,25 @@ static int sun6i_isp_capture_link_validate(struct med= ia_link *link) media_entity_to_video_device(link->sink->entity); struct sun6i_isp_device *isp_dev =3D video_get_drvdata(video_dev); struct v4l2_device *v4l2_dev =3D &isp_dev->v4l2.v4l2_dev; + struct v4l2_subdev *proc_subdev =3D + media_entity_to_v4l2_subdev(link->source->entity); unsigned int capture_width, capture_height; unsigned int proc_width, proc_height; + struct v4l2_subdev_format proc_subdev_format =3D { + .which =3D V4L2_SUBDEV_FORMAT_ACTIVE, + .pad =3D link->source->index, + }; + int ret; =20 sun6i_isp_capture_dimensions(isp_dev, &capture_width, &capture_height); - sun6i_isp_proc_dimensions(isp_dev, &proc_width, &proc_height); + + ret =3D v4l2_subdev_call(proc_subdev, pad, get_fmt, NULL, + &proc_subdev_format); + if (ret) + return ret; + + proc_width =3D proc_subdev_format.format.width; + proc_height =3D proc_subdev_format.format.height; =20 /* No cropping/scaling is supported (yet). */ if (capture_width !=3D proc_width || capture_height !=3D proc_height) { diff --git a/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_params.c b/dri= vers/staging/media/sunxi/sun6i-isp/sun6i_isp_params.c index b7ef33fa2b13..0cc48e2bc8c6 100644 --- a/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_params.c +++ b/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_params.c @@ -43,11 +43,14 @@ static const struct sun6i_isp_params_config sun6i_isp_p= arams_config_default =3D { }, }; =20 -static void sun6i_isp_params_configure_ob(struct sun6i_isp_device *isp_dev) +static void +sun6i_isp_params_configure_ob(struct sun6i_isp_device *isp_dev, + const struct v4l2_mbus_framefmt *mbus_format) { unsigned int width, height; =20 - sun6i_isp_proc_dimensions(isp_dev, &width, &height); + width =3D mbus_format->width; + height =3D mbus_format->height; =20 sun6i_isp_load_write(isp_dev, SUN6I_ISP_OB_SIZE_REG, SUN6I_ISP_OB_SIZE_WIDTH(width) | @@ -112,10 +115,12 @@ static void sun6i_isp_params_configure_wb(struct sun6= i_isp_device *isp_dev) SUN6I_ISP_WB_CFG_CLIP(0xfff)); } =20 -static void sun6i_isp_params_configure_base(struct sun6i_isp_device *isp_d= ev) +static void +sun6i_isp_params_configure_base(struct sun6i_isp_device *isp_dev, + const struct v4l2_mbus_framefmt *mbus_format) { sun6i_isp_params_configure_ae(isp_dev); - sun6i_isp_params_configure_ob(isp_dev); + sun6i_isp_params_configure_ob(isp_dev, mbus_format); sun6i_isp_params_configure_wb(isp_dev); } =20 @@ -170,14 +175,15 @@ sun6i_isp_params_configure_modules(struct sun6i_isp_d= evice *isp_dev, sun6i_isp_load_write(isp_dev, SUN6I_ISP_MODULE_EN_REG, value); } =20 -void sun6i_isp_params_configure(struct sun6i_isp_device *isp_dev) +void sun6i_isp_params_configure(struct sun6i_isp_device *isp_dev, + const struct v4l2_mbus_framefmt *mbus_format) { struct sun6i_isp_params_state *state =3D &isp_dev->params.state; unsigned long flags; =20 spin_lock_irqsave(&state->lock, flags); =20 - sun6i_isp_params_configure_base(isp_dev); + sun6i_isp_params_configure_base(isp_dev, mbus_format); =20 /* Default config is only applied at the very first stream start. */ if (state->configured) diff --git a/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_params.h b/dri= vers/staging/media/sunxi/sun6i-isp/sun6i_isp_params.h index 50f10f879c42..c0d6cff95d54 100644 --- a/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_params.h +++ b/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_params.h @@ -36,8 +36,8 @@ struct sun6i_isp_params { =20 /* Params */ =20 -void sun6i_isp_params_configure(struct sun6i_isp_device *isp_dev); - +void sun6i_isp_params_configure(struct sun6i_isp_device *isp_dev, + const struct v4l2_mbus_framefmt *mbus_format); /* State */ =20 void sun6i_isp_params_state_update(struct sun6i_isp_device *isp_dev, diff --git a/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_proc.c b/drive= rs/staging/media/sunxi/sun6i-isp/sun6i_isp_proc.c index 46a334b602f1..9073a7f3f8c8 100644 --- a/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_proc.c +++ b/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_proc.c @@ -15,17 +15,6 @@ #include "sun6i_isp_proc.h" #include "sun6i_isp_reg.h" =20 -/* Helpers */ - -void sun6i_isp_proc_dimensions(struct sun6i_isp_device *isp_dev, - unsigned int *width, unsigned int *height) -{ - if (width) - *width =3D isp_dev->proc.mbus_format.width; - if (height) - *height =3D isp_dev->proc.mbus_format.height; -} - /* Format */ =20 static const struct sun6i_isp_proc_format sun6i_isp_proc_formats[] =3D { @@ -137,9 +126,10 @@ static void sun6i_isp_proc_disable(struct sun6i_isp_de= vice *isp_dev) regmap_write(regmap, SUN6I_ISP_FE_CFG_REG, 0); } =20 -static void sun6i_isp_proc_configure(struct sun6i_isp_device *isp_dev) +static void +sun6i_isp_proc_configure(struct sun6i_isp_device *isp_dev, + const struct v4l2_mbus_framefmt *mbus_format) { - struct v4l2_mbus_framefmt *mbus_format =3D &isp_dev->proc.mbus_format; const struct sun6i_isp_proc_format *format; u32 value; =20 @@ -173,6 +163,8 @@ static int sun6i_isp_proc_s_stream(struct v4l2_subdev *= subdev, int on) struct sun6i_isp_proc_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; =20 /* Source */ @@ -191,6 +183,10 @@ static int sun6i_isp_proc_s_stream(struct v4l2_subdev = *subdev, int on) else source =3D &proc->source_csi1; =20 + /* Active State */ + + state =3D v4l2_subdev_lock_and_get_active_state(subdev); + if (!on) { sun6i_isp_proc_irq_disable(isp_dev); v4l2_subdev_call(source_subdev, video, s_stream, 0); @@ -202,7 +198,7 @@ static int sun6i_isp_proc_s_stream(struct v4l2_subdev *= subdev, int on) =20 ret =3D pm_runtime_resume_and_get(dev); if (ret < 0) - return ret; + goto unlock; =20 /* Clear */ =20 @@ -210,9 +206,12 @@ static int sun6i_isp_proc_s_stream(struct v4l2_subdev = *subdev, int on) =20 /* Configure */ =20 + mbus_format =3D v4l2_subdev_state_get_format(state, + SUN6I_ISP_PROC_PAD_SINK_CSI); + sun6i_isp_tables_configure(isp_dev); - sun6i_isp_params_configure(isp_dev); - sun6i_isp_proc_configure(isp_dev); + sun6i_isp_params_configure(isp_dev, mbus_format); + sun6i_isp_proc_configure(isp_dev, mbus_format); sun6i_isp_capture_configure(isp_dev); =20 /* State Update */ @@ -230,13 +229,17 @@ static int sun6i_isp_proc_s_stream(struct v4l2_subdev= *subdev, int on) goto disable; } =20 - return 0; + ret =3D 0; + goto unlock; =20 disable: sun6i_isp_proc_disable(isp_dev); =20 pm_runtime_put(dev); =20 +unlock: + v4l2_subdev_unlock_state(state); + return ret; } =20 @@ -259,21 +262,22 @@ sun6i_isp_proc_mbus_format_prepare(struct v4l2_mbus_f= ramefmt *mbus_format) static int sun6i_isp_proc_init_state(struct v4l2_subdev *subdev, struct v4l2_subdev_state *state) { - struct sun6i_isp_device *isp_dev =3D v4l2_get_subdevdata(subdev); - unsigned int pad =3D SUN6I_ISP_PROC_PAD_SINK_CSI; - struct v4l2_mbus_framefmt *mbus_format =3D - v4l2_subdev_state_get_format(state, pad); - struct mutex *lock =3D &isp_dev->proc.lock; + unsigned int pad; =20 - mutex_lock(lock); + for (pad =3D 0; pad < subdev->entity.num_pads; pad++) { + struct v4l2_mbus_framefmt *mbus_format; =20 - mbus_format->code =3D sun6i_isp_proc_formats[0].mbus_code; - mbus_format->width =3D 1280; - mbus_format->height =3D 720; + if (pad =3D=3D SUN6I_ISP_PROC_PAD_SINK_PARAMS) + continue; =20 - sun6i_isp_proc_mbus_format_prepare(mbus_format); + mbus_format =3D v4l2_subdev_state_get_format(state, pad); =20 - mutex_unlock(lock); + mbus_format->code =3D sun6i_isp_proc_formats[0].mbus_code; + mbus_format->width =3D 1280; + mbus_format->height =3D 720; + + sun6i_isp_proc_mbus_format_prepare(mbus_format); + } =20 return 0; } @@ -291,53 +295,31 @@ sun6i_isp_proc_enum_mbus_code(struct v4l2_subdev *sub= dev, return 0; } =20 -static int sun6i_isp_proc_get_fmt(struct v4l2_subdev *subdev, - struct v4l2_subdev_state *state, - struct v4l2_subdev_format *format) -{ - struct sun6i_isp_device *isp_dev =3D v4l2_get_subdevdata(subdev); - struct v4l2_mbus_framefmt *mbus_format =3D &format->format; - struct mutex *lock =3D &isp_dev->proc.lock; - - mutex_lock(lock); - - if (format->which =3D=3D V4L2_SUBDEV_FORMAT_TRY) - *mbus_format =3D *v4l2_subdev_state_get_format(state, - format->pad); - else - *mbus_format =3D isp_dev->proc.mbus_format; - - mutex_unlock(lock); - - return 0; -} - static int sun6i_isp_proc_set_fmt(struct v4l2_subdev *subdev, struct v4l2_subdev_state *state, struct v4l2_subdev_format *format) { - struct sun6i_isp_device *isp_dev =3D v4l2_get_subdevdata(subdev); - struct v4l2_mbus_framefmt *mbus_format =3D &format->format; - struct mutex *lock =3D &isp_dev->proc.lock; + struct v4l2_mbus_framefmt *mbus_format; =20 - mutex_lock(lock); + if (format->pad !=3D SUN6I_ISP_PROC_PAD_SINK_CSI) + return v4l2_subdev_get_fmt(subdev, state, format); =20 - sun6i_isp_proc_mbus_format_prepare(mbus_format); + sun6i_isp_proc_mbus_format_prepare(&format->format); =20 - if (format->which =3D=3D V4L2_SUBDEV_FORMAT_TRY) - *v4l2_subdev_state_get_format(state, format->pad) =3D - *mbus_format; - else - isp_dev->proc.mbus_format =3D *mbus_format; + mbus_format =3D v4l2_subdev_state_get_format(state, format->pad); + *mbus_format =3D format->format; =20 - mutex_unlock(lock); + /* Propagate the format to the source pad. */ + mbus_format =3D v4l2_subdev_state_get_format(state, + SUN6I_ISP_PROC_PAD_SOURCE); + *mbus_format =3D format->format; =20 return 0; } =20 static const struct v4l2_subdev_pad_ops sun6i_isp_proc_pad_ops =3D { .enum_mbus_code =3D sun6i_isp_proc_enum_mbus_code, - .get_fmt =3D sun6i_isp_proc_get_fmt, + .get_fmt =3D v4l2_subdev_get_fmt, .set_fmt =3D sun6i_isp_proc_set_fmt, }; =20 @@ -499,8 +481,6 @@ int sun6i_isp_proc_setup(struct sun6i_isp_device *isp_d= ev) struct media_pad *pads =3D proc->pads; int ret; =20 - mutex_init(&proc->lock); - /* V4L2 Subdev */ =20 v4l2_subdev_init(subdev, &sun6i_isp_proc_subdev_ops); @@ -532,10 +512,14 @@ int sun6i_isp_proc_setup(struct sun6i_isp_device *isp= _dev) =20 /* V4L2 Subdev */ =20 + ret =3D v4l2_subdev_init_finalize(subdev); + if (ret < 0) + goto error_media_entity; + ret =3D v4l2_device_register_subdev(v4l2_dev, subdev); if (ret < 0) { v4l2_err(v4l2_dev, "failed to register v4l2 subdev: %d\n", ret); - goto error_media_entity; + goto error_subdev_finalize; } =20 /* V4L2 Async */ @@ -562,6 +546,9 @@ int sun6i_isp_proc_setup(struct sun6i_isp_device *isp_d= ev) =20 v4l2_device_unregister_subdev(subdev); =20 +error_subdev_finalize: + v4l2_subdev_cleanup(subdev); + error_media_entity: media_entity_cleanup(&subdev->entity); =20 @@ -577,5 +564,7 @@ void sun6i_isp_proc_cleanup(struct sun6i_isp_device *is= p_dev) v4l2_async_nf_cleanup(notifier); =20 v4l2_device_unregister_subdev(subdev); + v4l2_subdev_cleanup(subdev); + media_entity_cleanup(&subdev->entity); } diff --git a/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_proc.h b/drive= rs/staging/media/sunxi/sun6i-isp/sun6i_isp_proc.h index db6738a39147..26c4327c5ed7 100644 --- a/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_proc.h +++ b/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_proc.h @@ -42,18 +42,11 @@ struct sun6i_isp_proc { struct v4l2_subdev subdev; struct media_pad pads[3]; struct v4l2_async_notifier notifier; - struct v4l2_mbus_framefmt mbus_format; - struct mutex lock; /* Mbus format lock. */ =20 struct sun6i_isp_proc_source source_csi0; struct sun6i_isp_proc_source source_csi1; }; =20 -/* Helpers */ - -void sun6i_isp_proc_dimensions(struct sun6i_isp_device *isp_dev, - unsigned int *width, unsigned int *height); - /* Format */ =20 const struct sun6i_isp_proc_format *sun6i_isp_proc_format_find(u32 mbus_co= de); --=20 2.54.0 From nobody Mon May 25 05:12:26 2026 Received: from leonov.paulk.fr (leonov.paulk.fr [185.233.101.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9901C3EFFAD; Mon, 18 May 2026 10:32:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.233.101.22 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779100400; cv=none; b=PrONikM8N/O5CokpQv9qakv9r+ax9rC1vcUiGQ36mneEO0u0ttijrWItnFrkuLBlcjfKK2/qVy0SZ705pVZxJ0HcKDa8FN2+YEIknWTyhsHb6MShjtjJrP8KOfaFjJiXOvQvRjHLB5ynX4bMB6mcW5YRQa6WyjNTXQPWccyqKDE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779100400; c=relaxed/simple; bh=2ryYcYdMDv3PHd8raqE/i1so2/ppAY539lB4WGhZSA4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=XOMcdfz8yYCXRu3iQjJuDNmYHIamh/LpO4ogm2UMcLiSx39/OkKoYqFOLqhgvhWl1R11pGOsFExLUUG3KyZ2pMNfP4rJF0ZLthK4zejXZN54G4fr9A5eaiP7+2T/0JTZ//WwA3XKRveP8e8PLsz2ERAqAiYZxGg4B24JCP0tlB0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=sys-base.io; spf=pass smtp.mailfrom=sys-base.io; arc=none smtp.client-ip=185.233.101.22 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=sys-base.io Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=sys-base.io Received: from laika.paulk.fr (12.234.24.109.rev.sfr.net [109.24.234.12]) by leonov.paulk.fr (Postfix) with ESMTPS id 000331F8004A; Mon, 18 May 2026 10:32:52 +0000 (UTC) Received: by laika.paulk.fr (Postfix, from userid 65534) id 7FCC9B407FE; Mon, 18 May 2026 10:32:52 +0000 (UTC) X-Spam-Level: * Received: from collins (unknown [192.168.1.64]) by laika.paulk.fr (Postfix) with ESMTP id 0912DB407FE; Mon, 18 May 2026 10:25:02 +0000 (UTC) From: Paul Kocialkowski To: linux-media@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org, linux-staging@lists.linux.dev Cc: Paul Kocialkowski , Mauro Carvalho Chehab , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Greg Kroah-Hartman , Arash Golgol , Laurent Pinchart , Nicolas Dufresne Subject: [PATCH 15/16] media: sun6i-isp: Add support for MC-centric format enumeration Date: Mon, 18 May 2026 12:24:50 +0200 Message-ID: <20260518102451.417971-16-paulk@sys-base.io> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260518102451.417971-1-paulk@sys-base.io> References: <20260518102451.417971-1-paulk@sys-base.io> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Just make sure the provided mbus code is supported and carry on with the existing implementation since the pixelformat is independent from the mbus code. The params video node only supports a single format and does not care about the mbus format, but we can still report MC-centric support. Signed-off-by: Paul Kocialkowski --- .../staging/media/sunxi/sun6i-isp/sun6i_isp_capture.c | 9 ++++++++- drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_params.c | 3 ++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_capture.c b/dr= ivers/staging/media/sunxi/sun6i-isp/sun6i_isp_capture.c index 24e731bcabe9..372b9331bd6d 100644 --- a/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_capture.c +++ b/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_capture.c @@ -436,8 +436,14 @@ static int sun6i_isp_capture_querycap(struct file *fil= e, void *priv, static int sun6i_isp_capture_enum_fmt(struct file *file, void *priv, struct v4l2_fmtdesc *fmtdesc) { + u32 mbus_code =3D fmtdesc->mbus_code; u32 index =3D fmtdesc->index; =20 + if (mbus_code && !sun6i_isp_proc_format_find(mbus_code)) + return -EINVAL; + + /* Capture format is independent from proc format. */ + if (index >=3D ARRAY_SIZE(sun6i_isp_capture_formats)) return -EINVAL; =20 @@ -697,7 +703,8 @@ int sun6i_isp_capture_setup(struct sun6i_isp_device *is= p_dev) =20 strscpy(video_dev->name, SUN6I_ISP_CAPTURE_NAME, sizeof(video_dev->name)); - video_dev->device_caps =3D V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; + video_dev->device_caps =3D V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING | + V4L2_CAP_IO_MC; video_dev->vfl_dir =3D VFL_DIR_RX; video_dev->release =3D video_device_release_empty; video_dev->fops =3D &sun6i_isp_capture_fops; diff --git a/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_params.c b/dri= vers/staging/media/sunxi/sun6i-isp/sun6i_isp_params.c index 0cc48e2bc8c6..2622e5a07817 100644 --- a/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_params.c +++ b/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_params.c @@ -531,7 +531,8 @@ int sun6i_isp_params_setup(struct sun6i_isp_device *isp= _dev) =20 strscpy(video_dev->name, SUN6I_ISP_PARAMS_NAME, sizeof(video_dev->name)); - video_dev->device_caps =3D V4L2_CAP_META_OUTPUT | V4L2_CAP_STREAMING; + video_dev->device_caps =3D V4L2_CAP_META_OUTPUT | V4L2_CAP_STREAMING | + V4L2_CAP_IO_MC; video_dev->vfl_dir =3D VFL_DIR_TX; video_dev->release =3D video_device_release_empty; video_dev->fops =3D &sun6i_isp_params_fops; --=20 2.54.0 From nobody Mon May 25 05:12:26 2026 Received: from leonov.paulk.fr (leonov.paulk.fr [185.233.101.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D2D143EEAFB; Mon, 18 May 2026 10:33:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.233.101.22 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779100410; cv=none; b=A0wB66ShHo4nb8gmDaIM5ioIvVG48JDKzbq4Tlq5oMPGSIYmtdmHQfaLPgO4HxeQsIDDzU9iPNEyAuKwY85ez60CqByrZWc2+o1Q3EjVuhAmG5iOh0t/pJ64wwYzWNFGrnpSxEr2fBewVQMYb3zEsq+QBnlZiAPHrkvTepLCF58= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779100410; c=relaxed/simple; bh=SgJOt2lJqQBSvcUOjOlop7PuiMEzx9YAgYU411aMNBA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=QmisROGWJkEAuPvOUfe7+nftDYlTEwpNTnjLqPAG7U9MTqaAUjZsP8DhpxDfAPyy7NC0Xq2Nvvwr//K4t6WqxX9RW0N0i5gdHo9xSmVUsIGR/rlB0HnIuoJATGU4uzo6NI3STObzxTj+0pcSNBD2XcFioob7wCKEBRopUwsZesc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=sys-base.io; spf=pass smtp.mailfrom=sys-base.io; arc=none smtp.client-ip=185.233.101.22 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=sys-base.io Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=sys-base.io Received: from laika.paulk.fr (12.234.24.109.rev.sfr.net [109.24.234.12]) by leonov.paulk.fr (Postfix) with ESMTPS id 228DF1F80044; Mon, 18 May 2026 10:33:19 +0000 (UTC) Received: by laika.paulk.fr (Postfix, from userid 65534) id A4CBAB407FF; Mon, 18 May 2026 10:33:17 +0000 (UTC) X-Spam-Level: * Received: from collins (unknown [192.168.1.64]) by laika.paulk.fr (Postfix) with ESMTP id 52A59B407FF; Mon, 18 May 2026 10:25:02 +0000 (UTC) From: Paul Kocialkowski To: linux-media@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org, linux-staging@lists.linux.dev Cc: Paul Kocialkowski , Mauro Carvalho Chehab , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Greg Kroah-Hartman , Arash Golgol , Laurent Pinchart , Nicolas Dufresne Subject: [PATCH 16/16] media: sun6i-isp: Add support for frame size enumeration Date: Mon, 18 May 2026 12:24:51 +0200 Message-ID: <20260518102451.417971-17-paulk@sys-base.io> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260518102451.417971-1-paulk@sys-base.io> References: <20260518102451.417971-1-paulk@sys-base.io> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This implements the enum_framesizes operation, which reports support for even sizes. Signed-off-by: Paul Kocialkowski Reviewed-by: Arash Golgol Tested-by: Arash Golgol --- .../media/sunxi/sun6i-isp/sun6i_isp_capture.c | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_capture.c b/dr= ivers/staging/media/sunxi/sun6i-isp/sun6i_isp_capture.c index 372b9331bd6d..e638ec32c7cd 100644 --- a/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_capture.c +++ b/drivers/staging/media/sunxi/sun6i-isp/sun6i_isp_capture.c @@ -452,6 +452,26 @@ static int sun6i_isp_capture_enum_fmt(struct file *fil= e, void *priv, return 0; } =20 +static int sun6i_isp_capture_enum_framesizes(struct file *file, void *fh, + struct v4l2_frmsizeenum *frmsize) +{ + if (frmsize->index) + return -EINVAL; + + if (!sun6i_isp_capture_format_find(frmsize->pixel_format)) + return -EINVAL; + + frmsize->type =3D V4L2_FRMSIZE_TYPE_STEPWISE; + frmsize->stepwise.min_width =3D SUN6I_ISP_CAPTURE_WIDTH_MIN; + frmsize->stepwise.max_width =3D SUN6I_ISP_CAPTURE_WIDTH_MAX; + frmsize->stepwise.min_height =3D SUN6I_ISP_CAPTURE_HEIGHT_MIN; + frmsize->stepwise.max_height =3D SUN6I_ISP_CAPTURE_HEIGHT_MAX; + frmsize->stepwise.step_width =3D 2; + frmsize->stepwise.step_height =3D 2; + + return 0; +} + static int sun6i_isp_capture_g_fmt(struct file *file, void *priv, struct v4l2_format *format) { @@ -522,6 +542,8 @@ static const struct v4l2_ioctl_ops sun6i_isp_capture_io= ctl_ops =3D { .vidioc_s_fmt_vid_cap =3D sun6i_isp_capture_s_fmt, .vidioc_try_fmt_vid_cap =3D sun6i_isp_capture_try_fmt, =20 + .vidioc_enum_framesizes =3D sun6i_isp_capture_enum_framesizes, + .vidioc_enum_input =3D sun6i_isp_capture_enum_input, .vidioc_g_input =3D sun6i_isp_capture_g_input, .vidioc_s_input =3D sun6i_isp_capture_s_input, --=20 2.54.0