From patchwork Mon Feb 2 19:46:43 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Faizel K B X-Patchwork-Id: 26080 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 65F0CC3226 for ; Mon, 2 Feb 2026 19:47:08 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 146A762001; Mon, 2 Feb 2026 20:47:08 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="BtPJpIS4"; dkim-atps=neutral Received: from mail-pg1-x529.google.com (mail-pg1-x529.google.com [IPv6:2607:f8b0:4864:20::529]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 012E861FF6 for ; Mon, 2 Feb 2026 20:47:06 +0100 (CET) Received: by mail-pg1-x529.google.com with SMTP id 41be03b00d2f7-c634be422b2so304822a12.1 for ; Mon, 02 Feb 2026 11:47:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770061624; x=1770666424; darn=lists.libcamera.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=4RAohPMInpYRdZFPRVpri9RKwD42GbQUWynv/gE4tBc=; b=BtPJpIS4NQpdTjtAo5Gj0WNmOsyuXcWvZis2wV2lmLoaAoPLz+e9iHVLlxPiWJbET2 bp1ik/KYZhNlUmPKw9jXOz+0lQTVjVTTEzxt15kJLJHRsJW+LHjZWJwRN3ZJHxD95we5 yKJSkveseYKPAxCbOufsTCeAL4PBpCHhr437R9It8tDbmJ4+zpMZtU7J/aMy/21wlkSH 8BMBksOymfC7WgBcynznwP21ewJHwiEsjUvkSrnTOpUgIhWpTaXfk/Zj5GwcL2lXnbZZ LSDAL6iXuyAyB3Jzh0BIyQSO3+/oIvVDeQNaEpyQ5poKX0NdJ9JWuLjUjNA0SfYbkIMp zbxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770061624; x=1770666424; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=4RAohPMInpYRdZFPRVpri9RKwD42GbQUWynv/gE4tBc=; b=DuPbHi0OKdUKSvOTbt3K1FGe/S/Xpr2yrDBhiWVSVtdoaSJad6iiRBo+qw8x+5Qfi5 gdScYAfywRh5gxvwMJ57wbQtLZJNkybr40GYnLEGztTjbtoX5DGp2lMDRU/SvJz9/kfD ZIlhZWsKZyaJBGndYhVWwWMQXWDmWqExrc9I32UZW9kxmBb+JnbBMu1Cd8kWAfe+yRRn WltCMI+8D/7CBkqHSQY86LLG0xtrp3903sYwIW+pGTLWJUWfdVLx+j/KDp5pdrAb67Y4 4t8EXx+juBqHEUe7MFz+h1Q+74mvwmI+QErjH0mT55eixsGxs3QFSUnD+jmfjlH5mOSu 68yg== X-Forwarded-Encrypted: i=1; AJvYcCVAe2qeow5vTZ9YB/Rf0eVkBM01uOHhTGcC63wM1iOuf9N/E/4w2ep9DbKh1HWa5VTH5yxtRdlj18ZDpLbWuzI=@lists.libcamera.org X-Gm-Message-State: AOJu0YzGFl3iavpgFB8y2dC/zp2RKSvaOjDlcjhUiQqG6u7dBUfE52BF f6gPJ5ihjyV4zZcI7UDQpdvsnqB3k6V33VSphdnrg7418KKZan0bMYeb X-Gm-Gg: AZuq6aK9EsaIC3o7TYjbO+7aRKyY50Ji/cmlSjAgmpaMo2zVJJurq4DF2l4PVKwK/y9 zYQA84LU3a4iOTtnew+B9uSYyA06/n3e769RnS9RejjX0oU0wW9sSpEntMwiIu9smyPcsE3Egpu E7Qq6pCl79KTmMrAhOZnAZyVHXOuUNjaMIO36H9yHyyB6z8GNkfIiba9WCHTL3q0CoWA/xpX9hI v/5jUghcXqylWmhHdjfUMAXv95BbhP3ugHO0Yj2QXQszQ50x+HWToOdiwfZVzKkSwzvHLULlpxs qPQt4E4LeXkPoN7CkSU8FN65fty40n419hHQmpWe6E8SM5AZBywF82XvDGdUUrgZwtE4KG9wB21 ABC5a3fpTG0K/0rXjlK3PZhCfEHSNVYk9Bxvu9fuSCJqQ1AJ8LksltgC6EEffjwUyAS8bCalfpS wxXSd/Z3Z9oKVD+7WfCtv+xUTsIas+tJ8Fj587AYZu/v8= X-Received: by 2002:a05:6a00:3d4e:b0:808:434f:ba80 with SMTP id d2e1a72fcca58-823aa6ef828mr10305790b3a.3.1770061624631; Mon, 02 Feb 2026 11:47:04 -0800 (PST) Received: from FAIZEL-KB.. ([2001:569:5999:dc00:af0:4465:b482:1e01]) by smtp.googlemail.com with ESMTPSA id d2e1a72fcca58-82379b1bc68sm16667416b3a.2.2026.02.02.11.47.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Feb 2026 11:47:04 -0800 (PST) From: Faizel K B To: Shuah Khan , Laurent Pinchart , Kieran Bingham , linux-media@vger.kernel.org Cc: Mauro Carvalho Chehab , libcamera-devel@lists.libcamera.org, Faizel K B Subject: [PATCH v2 1/3] media: vimc: sensor: Move vimc_sensor_device to common header Date: Mon, 2 Feb 2026 11:46:43 -0800 Message-ID: <20260202194645.1287757-2-faizel.kb@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260202194645.1287757-1-faizel.kb@gmail.com> References: <20260202194645.1287757-1-faizel.kb@gmail.com> MIME-Version: 1.0 X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Move the vimc_sensor_device structure from vimc-sensor.c to vimc-common.h to make it accessible to the vimc-streamer component. Signed-off-by: Faizel K B --- drivers/media/test-drivers/vimc/vimc-common.h | 28 +++++++++++++++++++ drivers/media/test-drivers/vimc/vimc-sensor.c | 26 ----------------- 2 files changed, 28 insertions(+), 26 deletions(-) diff --git a/drivers/media/test-drivers/vimc/vimc-common.h b/drivers/media/test-drivers/vimc/vimc-common.h index 7a45a2117748..35789add6b4a 100644 --- a/drivers/media/test-drivers/vimc/vimc-common.h +++ b/drivers/media/test-drivers/vimc/vimc-common.h @@ -12,6 +12,8 @@ #include #include #include +#include +#include #define VIMC_PDEV_NAME "vimc" @@ -159,6 +161,32 @@ struct vimc_ent_config { const struct vimc_ent_type *type; }; +enum vimc_sensor_osd_mode { + VIMC_SENSOR_OSD_SHOW_ALL = 0, + VIMC_SENSOR_OSD_SHOW_COUNTERS = 1, + VIMC_SENSOR_OSD_SHOW_NONE = 2 +}; + +struct vimc_sensor_device { + struct vimc_ent_device ved; + struct v4l2_subdev sd; + struct tpg_data tpg; + struct v4l2_ctrl_handler hdl; + struct media_pad pad; + + u8 *frame; + + /* + * Virtual "hardware" configuration, filled when the stream starts or + * when controls are set. + */ + struct { + struct v4l2_area size; + enum vimc_sensor_osd_mode osd_value; + u64 start_stream_ts; + } hw; +}; + /** * vimc_is_source - returns true if the entity has only source pads * diff --git a/drivers/media/test-drivers/vimc/vimc-sensor.c b/drivers/media/test-drivers/vimc/vimc-sensor.c index 027767777763..2b07dc1f1278 100644 --- a/drivers/media/test-drivers/vimc/vimc-sensor.c +++ b/drivers/media/test-drivers/vimc/vimc-sensor.c @@ -14,32 +14,6 @@ #include "vimc-common.h" -enum vimc_sensor_osd_mode { - VIMC_SENSOR_OSD_SHOW_ALL = 0, - VIMC_SENSOR_OSD_SHOW_COUNTERS = 1, - VIMC_SENSOR_OSD_SHOW_NONE = 2 -}; - -struct vimc_sensor_device { - struct vimc_ent_device ved; - struct v4l2_subdev sd; - struct tpg_data tpg; - struct v4l2_ctrl_handler hdl; - struct media_pad pad; - - u8 *frame; - - /* - * Virtual "hardware" configuration, filled when the stream starts or - * when controls are set. - */ - struct { - struct v4l2_area size; - enum vimc_sensor_osd_mode osd_value; - u64 start_stream_ts; - } hw; -}; - static const struct v4l2_mbus_framefmt fmt_default = { .width = 640, .height = 480, From patchwork Mon Feb 2 19:46:44 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Faizel K B X-Patchwork-Id: 26081 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 1AF63C3226 for ; Mon, 2 Feb 2026 19:47:12 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id B62D562007; Mon, 2 Feb 2026 20:47:11 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="BnE7XNCs"; dkim-atps=neutral Received: from mail-pg1-x52c.google.com (mail-pg1-x52c.google.com [IPv6:2607:f8b0:4864:20::52c]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 3E9CA62000 for ; Mon, 2 Feb 2026 20:47:10 +0100 (CET) Received: by mail-pg1-x52c.google.com with SMTP id 41be03b00d2f7-c634be422b2so304832a12.1 for ; Mon, 02 Feb 2026 11:47:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770061629; x=1770666429; darn=lists.libcamera.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=BkX201pGc8zZ3+cPLNIedhLkaj9hw8wjTG/zVIPjTJE=; b=BnE7XNCsnCd1QsvwWzyIt83vDeoTKaEztJCdpo224RezJao6SIsYzpeyUOVQWIoFJK 0ZvJlCoFqMvBYoPaprHRSAMI3hjAjFX2SL8VvBpA70dHNE8ArT9TdVzjDxe1e4Rs0Kej exhEffIT9EdOIhh323WAcynkLnnvmyxwMLLQTBVQOM6AqVeQrPVJdWWkred+QDanIpRq 3zOGkPIKtfvIsIAccxpFRP7LUC8ev3qsCyEHWhNmUDuJMkM1l082+3R/0QUEIZFhc/vp irKT8OkBdGAG1W9amqmqi1fWpmQnEJ5V8qXE/vpSwJEjcKiFvHgzx9qx767sWqxrAxOP DKog== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770061629; x=1770666429; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=BkX201pGc8zZ3+cPLNIedhLkaj9hw8wjTG/zVIPjTJE=; b=gcwixGtNZrbw4t4K+b+MTFMqga1apVNbZzEmH/M0JUUi9kQJqg0lNHS/edxgwh901t 5KfTEFFzHtN9WDMZGcD/PAx7dshAAHpJUVc3CQAfn6LMUaTI5oQ34X1I6eSeRRW6lfpb LQKjSwea1j/PlRFUNXxeOnfKpnyYGPl+EV63dNWDdNwvk2FbnF/4gppIP10PLkiIP7oQ /aCm9EFaGHK3lfsc6YcatR1ST+qBNKwD+cYRTydKmKBKMk8clX1py8IEcMiX401IK1Fj 3hK458u0f6tzC8whD0n5eKxrhZ5YnxPt/J7XvDPG4aPNjTdIR4OJrHdv1LUsOli7eO0t JGeA== X-Forwarded-Encrypted: i=1; AJvYcCXcBLmsx5K2FkvUNtrrLvxsNa/fbiwFIfzUlRVve22c9t5ibyZj80SWDkTNXeqxITx7qAOkTpl8ZDWOwEYEMLQ=@lists.libcamera.org X-Gm-Message-State: AOJu0Yxdxf/YIc/BvRve26Fs2ZHV9SPt0COUyza7rOjDNG5BopuqUgC+ Bc04jBYU47L/GkiMAE2y4yBYN7esbcMUqytO2b/Yc2TtWJYgINoNMEcq X-Gm-Gg: AZuq6aLHHl7J1wlP7KdioGQLm07MwMhVGwZrPzx8ICj4eRyuY+SSY4Jey9UeWUfGjE+ mGqtSRs2+oaMAPEGwPByCe5fScbymtdI4dbE2ThZJMXAfIpvcdKNSzGsb+BhnrtCaYu6kYy6s/g PMWR0u4b1mP5jcXBsOzRG0KSEQDkUhavjmzHM8x+/XKMV/E1tQR0Ktyj+sv8obE53GJpAhZXiho ygmsP/VW390oBTDtqtjUYvd5SR7okpSVEcPminlikTcg6y1W3LaqIYnCT7EUvadqmJ1+2gNLcov WXvA3JMr41/AiIUKRhLcNuERCmW9ig3COvfQLgvXm9sDJfN+0Lj+yzwwd6tAbfCi7fVqXB06PrT ZuKmcLhBAaUWS/xGKLmnOJQB+vZR8m/H0rJpL68b5GtkdDJbjX+S/VBl+EQ4Go1x2HF6RR9a+5j DOt+pGr1Y2k8VjoY8SEpmGWOwjWkq6UBEPDWvHCevhtweM2wPZXM6EaQ== X-Received: by 2002:a05:6a20:734b:b0:38e:9a8b:248d with SMTP id adf61e73a8af0-392e0163a22mr9055261637.5.1770061628779; Mon, 02 Feb 2026 11:47:08 -0800 (PST) Received: from FAIZEL-KB.. ([2001:569:5999:dc00:af0:4465:b482:1e01]) by smtp.googlemail.com with ESMTPSA id d2e1a72fcca58-82379b1bc68sm16667416b3a.2.2026.02.02.11.47.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Feb 2026 11:47:08 -0800 (PST) From: Faizel K B To: Shuah Khan , Laurent Pinchart , Kieran Bingham , linux-media@vger.kernel.org Cc: Mauro Carvalho Chehab , libcamera-devel@lists.libcamera.org, Faizel K B Subject: [PATCH v2 2/3] media: vimc: sensor: Add pixel_rate, vblank and hblank configuration Date: Mon, 2 Feb 2026 11:46:44 -0800 Message-ID: <20260202194645.1287757-3-faizel.kb@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260202194645.1287757-1-faizel.kb@gmail.com> References: <20260202194645.1287757-1-faizel.kb@gmail.com> MIME-Version: 1.0 X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" pixel_rate and hblank as read only parameter. vblank can be configured to match the desired frame rate. Default values are, pixel_rate - 160 MHz, hblank - 800. vblank defaults to an equivalent value of 30 fps for resolutions less than or equal to 1920x1080 and 10 fps for higher resolutions. For higher resolutions, modify pixel_rate in the driver code. fps = pixel_rate / ((width + hblank) * (height + vblank)) minimum vblank - 4, maximum vblank - 65535 The configured fps delay is pre-calculated into jiffies and stored in the sensor's hw structure for efficient access by the streamer thread. Signed-off-by: Faizel K B --- drivers/media/test-drivers/vimc/vimc-common.h | 13 +++ drivers/media/test-drivers/vimc/vimc-sensor.c | 82 +++++++++++++++++++ 2 files changed, 95 insertions(+) diff --git a/drivers/media/test-drivers/vimc/vimc-common.h b/drivers/media/test-drivers/vimc/vimc-common.h index 35789add6b4a..861b334ffc65 100644 --- a/drivers/media/test-drivers/vimc/vimc-common.h +++ b/drivers/media/test-drivers/vimc/vimc-common.h @@ -29,6 +29,15 @@ #define VIMC_FRAME_MIN_WIDTH 16 #define VIMC_FRAME_MIN_HEIGHT 16 +#define VIMC_PIXEL_RATE_FIXED 160000000 /* 160 MHz */ +#define VIMC_HBLANK_FIXED 800 +/* VBLANK - vertical blanking (primary FPS control) */ +#define VIMC_VBLANK_MIN 4 +#define VIMC_VBLANK_MAX 65535 +#define VIMC_VBLANK_STEP 1 +#define VIMC_VBLANK_DEFAULT 3223 /* 30fps vga */ +#define VIMC_PIXELS_THRESHOLD_30FPS (1920 * 1080) /* 2073600 pixels */ + #define VIMC_FRAME_INDEX(lin, col, width, bpp) ((lin * width + col) * bpp) /* Source and sink pad checks */ @@ -173,6 +182,9 @@ struct vimc_sensor_device { struct tpg_data tpg; struct v4l2_ctrl_handler hdl; struct media_pad pad; + struct v4l2_ctrl *pixel_rate; + struct v4l2_ctrl *hblank; + struct v4l2_ctrl *vblank; u8 *frame; @@ -184,6 +196,7 @@ struct vimc_sensor_device { struct v4l2_area size; enum vimc_sensor_osd_mode osd_value; u64 start_stream_ts; + unsigned long fps_jiffies; } hw; }; diff --git a/drivers/media/test-drivers/vimc/vimc-sensor.c b/drivers/media/test-drivers/vimc/vimc-sensor.c index 2b07dc1f1278..84cef55b68f8 100644 --- a/drivers/media/test-drivers/vimc/vimc-sensor.c +++ b/drivers/media/test-drivers/vimc/vimc-sensor.c @@ -25,10 +25,15 @@ static const struct v4l2_mbus_framefmt fmt_default = { static int vimc_sensor_init_state(struct v4l2_subdev *sd, struct v4l2_subdev_state *sd_state) { + struct vimc_sensor_device *vsensor = + container_of(sd, struct vimc_sensor_device, sd); + struct v4l2_mbus_framefmt *mf; mf = v4l2_subdev_state_get_format(sd_state, 0); *mf = fmt_default; + vsensor->hw.size.width = fmt_default.width; + vsensor->hw.size.height = fmt_default.height; return 0; } @@ -87,6 +92,26 @@ static void vimc_sensor_tpg_s_format(struct vimc_sensor_device *vsensor, tpg_s_xfer_func(&vsensor->tpg, format->xfer_func); } +static int vimc_sensor_update_frame_timing(struct v4l2_subdev *sd, + u32 width, u32 height) +{ + struct vimc_sensor_device *vsensor = + container_of(sd, struct vimc_sensor_device, sd); + u64 pixel_rate = vsensor->pixel_rate->val; + u32 hts = width + vsensor->hblank->val; + u32 vts = height + vsensor->vblank->val; + u64 total_pixels = (u64)hts * vts; + u64 frame_interval_ns; + + frame_interval_ns = total_pixels * NSEC_PER_SEC; + do_div(frame_interval_ns, pixel_rate); + vsensor->hw.fps_jiffies = nsecs_to_jiffies(frame_interval_ns); + if (vsensor->hw.fps_jiffies == 0) + vsensor->hw.fps_jiffies = 1; + + return 0; +} + static void vimc_sensor_adjust_fmt(struct v4l2_mbus_framefmt *fmt) { const struct vimc_pix_map *vpix; @@ -108,6 +133,18 @@ static void vimc_sensor_adjust_fmt(struct v4l2_mbus_framefmt *fmt) vimc_colorimetry_clamp(fmt); } +static u32 vimc_calc_vblank(u32 width, u32 height, + s64 pixel_rate, s32 hblank) +{ + u32 hts = width + hblank; + u32 target_fps; + u32 vblank_def; + + target_fps = (width * height <= VIMC_PIXELS_THRESHOLD_30FPS) ? 30 : 10; + vblank_def = (pixel_rate / (target_fps * hts)) - height; + return clamp(vblank_def, VIMC_VBLANK_MIN, VIMC_VBLANK_MAX); +} + static int vimc_sensor_set_fmt(struct v4l2_subdev *sd, struct v4l2_subdev_state *sd_state, struct v4l2_subdev_format *fmt) @@ -137,6 +174,20 @@ static int vimc_sensor_set_fmt(struct v4l2_subdev *sd, fmt->format.xfer_func, fmt->format.ycbcr_enc); *mf = fmt->format; + if (fmt->which == V4L2_SUBDEV_FORMAT_ACTIVE) { + u32 vblank_def = vimc_calc_vblank(fmt->format.width, + fmt->format.height, + vsensor->pixel_rate->val, + vsensor->hblank->val); + vsensor->hw.size.width = fmt->format.width; + vsensor->hw.size.height = fmt->format.height; + __v4l2_ctrl_modify_range(vsensor->vblank, + VIMC_VBLANK_MIN, + VIMC_VBLANK_MAX, + VIMC_VBLANK_STEP, + vblank_def); + __v4l2_ctrl_s_ctrl(vsensor->vblank, vblank_def); + } return 0; } @@ -222,6 +273,8 @@ static int vimc_sensor_s_stream(struct v4l2_subdev *sd, int enable) vsensor->hw.size.width = format->width; vsensor->hw.size.height = format->height; + vimc_sensor_update_frame_timing(sd, format->width, + format->height); v4l2_subdev_unlock_state(state); @@ -293,6 +346,15 @@ static int vimc_sensor_s_ctrl(struct v4l2_ctrl *ctrl) case VIMC_CID_OSD_TEXT_MODE: vsensor->hw.osd_value = ctrl->val; break; + case V4L2_CID_PIXEL_RATE: + break; + case V4L2_CID_HBLANK: + break; + case V4L2_CID_VBLANK: + vimc_sensor_update_frame_timing(&vsensor->sd, + vsensor->hw.size.width, + vsensor->hw.size.height); + break; default: return -EINVAL; } @@ -377,6 +439,26 @@ static struct vimc_ent_device *vimc_sensor_add(struct vimc_device *vimc, V4L2_CID_HUE, -128, 127, 1, 0); v4l2_ctrl_new_std(&vsensor->hdl, &vimc_sensor_ctrl_ops, V4L2_CID_SATURATION, 0, 255, 1, 128); + /* Timing controls for frame interval configuration */ + vsensor->pixel_rate = v4l2_ctrl_new_std(&vsensor->hdl, &vimc_sensor_ctrl_ops, + V4L2_CID_PIXEL_RATE, + VIMC_PIXEL_RATE_FIXED, VIMC_PIXEL_RATE_FIXED, + 1, VIMC_PIXEL_RATE_FIXED); + if (vsensor->pixel_rate) + vsensor->pixel_rate->flags |= V4L2_CTRL_FLAG_READ_ONLY; + + vsensor->hblank = v4l2_ctrl_new_std(&vsensor->hdl, &vimc_sensor_ctrl_ops, + V4L2_CID_HBLANK, + VIMC_HBLANK_FIXED, VIMC_HBLANK_FIXED, + 1, VIMC_HBLANK_FIXED); + if (vsensor->hblank) + vsensor->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; + + vsensor->vblank = v4l2_ctrl_new_std(&vsensor->hdl, &vimc_sensor_ctrl_ops, + V4L2_CID_VBLANK, + VIMC_VBLANK_MIN, VIMC_VBLANK_MAX, + VIMC_VBLANK_STEP, VIMC_VBLANK_DEFAULT); + vsensor->sd.ctrl_handler = &vsensor->hdl; if (vsensor->hdl.error) { ret = vsensor->hdl.error; From patchwork Mon Feb 2 19:46:45 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Faizel K B X-Patchwork-Id: 26082 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id AE463C3226 for ; Mon, 2 Feb 2026 19:47:14 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 6459E62009; Mon, 2 Feb 2026 20:47:14 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="TUm1dZBM"; dkim-atps=neutral Received: from mail-pf1-x433.google.com (mail-pf1-x433.google.com [IPv6:2607:f8b0:4864:20::433]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id DC64362004 for ; Mon, 2 Feb 2026 20:47:12 +0100 (CET) Received: by mail-pf1-x433.google.com with SMTP id d2e1a72fcca58-81e931923b5so332213b3a.1 for ; Mon, 02 Feb 2026 11:47:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770061631; x=1770666431; darn=lists.libcamera.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=PvVwdLZlh8MPfXBeT9fb7vVP3darfYnE88ZGrjLridM=; b=TUm1dZBMqQhN+FKz5bfazgjKAK7m1cInb9V4H+Sw79AONNL+KNqCBBXm2rYI3cHWFi y6GSSe5znKVJNmHRENYLwugI9RsRn1PMlK9iekG/nR0lxHGAbJU/Lb4OlIEEutJEST6I 9/XSY6vkucWYk5EJY794IMnpzdK6GCj/R+NQ9XY3+qwDTdRR2kGhxGBGK1C7zqlN9+RP 3doOZnWsaMuw2FxNtGLsHUPwHnxKOmEiHJ0tqukArkcqVn93+ovfyyP5MgPC1Pz2HkTB qTrem1bbl97lGhYTuLp+UIUiaHRAT1ezim7sWRiX7zCdpUemt4uUNxYYzRCb3mzov7BJ TJ8g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770061631; x=1770666431; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=PvVwdLZlh8MPfXBeT9fb7vVP3darfYnE88ZGrjLridM=; b=QFD/W8h2o/IgoTgVdXZKxWbMWMZUWP/eC9Sb5ek14piqjiKKYCEQKVzUh8i2GTiPOm u0Sf3j51wqtiNtQ3Plv25iHVJs44BvAaCCwasThVi05DGWRrveyUX74XWIFI12QmFM+t C/4mzG3I9IQ5dKUXnaz5Gx8m7c6WZVkY7m/rn+nFlYOD1uxfpsdqRu1JC26rR0YMNxAZ v1Ob0K+GISQaRgBKwDuuPQP8PqJsuUc7U7zeEbsVnt6GLJ3Vn+0LlT0i7H3qgVHe3CNJ 7szHgnep+iavxavCUwK3lvA7Ac84jWtBKj4EBiIjFXGZzfFVZ15FOJxz+RYe60fDsi6T fzvA== X-Forwarded-Encrypted: i=1; AJvYcCUBQKAEXbCTQosDpSGydT9iwazVxXHReZN+ApRRxoUSoibnvFW5Gp7xD1mcaNCBulIGZRiFPqNMysxOCkd71ds=@lists.libcamera.org X-Gm-Message-State: AOJu0YxJKsLl8HMgVl9wIGObj65PXkngAtwbAuzurUhC146tpHBnc+Af hjR7xFlQnXR/sjO51QibNnEMg6faMoFet/kqFOj0/jXZpzhagD7DhRuL X-Gm-Gg: AZuq6aLWEMXU++lU/6loiO1/rThAd8b9BlcdfTK2R/Wu834JUI2glsnpmbxKXqFim3h WmDESLhAI6Bj1h7mTLWZGu8+pU0KOI6QQOWKfBbeGpQm9drmcJ054KAwaGJLHXz7w0IYsEdHFFA pe8nAOcCgK/AGWnlfUAcLGivlbd9FMRWYbWeZh8hyoGUCN/YzsNNydBckphrofBE59zz5UCk9ho r7o9LaVsapSglNupq+KjyzEGCT9gMfpad0ho6liR+fR591Ir6jWWCuqLN55b2ZVQ2udEEMiTl+M 80sTlOw9yMiMm8p93oyepur+imUk4BRw3Mb7e8KH8qRM2Jpg4Led8u5DBSocj7NfOY/T5StXyQL P7vVnpL/NKXrEL61dV09XHB1gX3I4soaN5qjz9fqvTfqgM1w0Sae7wAr2Rlxz0X2yAhFVG+KamT m9wf+L6fL2caC4oLhjMKZuB9qr1Ukif0RfkLRXA3FSJh8= X-Received: by 2002:a05:6a00:12d0:b0:81e:74a6:542d with SMTP id d2e1a72fcca58-823ab74b844mr7612034b3a.5.1770061631287; Mon, 02 Feb 2026 11:47:11 -0800 (PST) Received: from FAIZEL-KB.. ([2001:569:5999:dc00:af0:4465:b482:1e01]) by smtp.googlemail.com with ESMTPSA id d2e1a72fcca58-82379b1bc68sm16667416b3a.2.2026.02.02.11.47.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Feb 2026 11:47:10 -0800 (PST) From: Faizel K B To: Shuah Khan , Laurent Pinchart , Kieran Bingham , linux-media@vger.kernel.org Cc: Mauro Carvalho Chehab , libcamera-devel@lists.libcamera.org, Faizel K B Subject: [PATCH v2 3/3] media: vimc: streamer: Apply sensor frame rate in streamer thread Date: Mon, 2 Feb 2026 11:46:45 -0800 Message-ID: <20260202194645.1287757-4-faizel.kb@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260202194645.1287757-1-faizel.kb@gmail.com> References: <20260202194645.1287757-1-faizel.kb@gmail.com> MIME-Version: 1.0 X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Use the sensor's pre-calculated jiffies value to add appropriate delay between frames according to the configured timing value. The actual frame rate will vary depending on processing delays in other media pipeline components. Tested using yavta frame rate display with QCIF resolution: yavta --capture= Signed-off-by: Faizel K B --- .../media/test-drivers/vimc/vimc-streamer.c | 33 +++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/drivers/media/test-drivers/vimc/vimc-streamer.c b/drivers/media/test-drivers/vimc/vimc-streamer.c index 15d863f97cbf..3ebf5798fa3d 100644 --- a/drivers/media/test-drivers/vimc/vimc-streamer.c +++ b/drivers/media/test-drivers/vimc/vimc-streamer.c @@ -139,6 +139,29 @@ static int vimc_streamer_pipeline_init(struct vimc_stream *stream, return -EINVAL; } +/** + * vimc_streamer_get_sensor() - Get sensor from pipeline + * @stream: the pipeline + * + * Helper function to find the sensor device in the pipeline. + * Returns pointer to sensor device or NULL if not found. + */ +static struct vimc_sensor_device *vimc_streamer_get_sensor(struct vimc_stream *stream) +{ + int i; + + for (i = 0; i < stream->pipe_size; i++) { + struct vimc_ent_device *ved = stream->ved_pipeline[i]; + + if (ved && ved->ent && + ved->ent->function == MEDIA_ENT_F_CAM_SENSOR) { + return container_of(ved, struct vimc_sensor_device, ved); + } + } + + return NULL; +} + /** * vimc_streamer_thread - Process frames through the pipeline * @@ -154,25 +177,31 @@ static int vimc_streamer_pipeline_init(struct vimc_stream *stream, static int vimc_streamer_thread(void *data) { struct vimc_stream *stream = data; + struct vimc_sensor_device *vsensor; u8 *frame = NULL; int i; + unsigned long fps_jiffies; + const unsigned long default_jiffies = HZ / 30; set_freezable(); + vsensor = vimc_streamer_get_sensor(stream); for (;;) { try_to_freeze(); if (kthread_should_stop()) break; + /* Read from hardware configuration */ + fps_jiffies = vsensor ? vsensor->hw.fps_jiffies : default_jiffies; + for (i = stream->pipe_size - 1; i >= 0; i--) { frame = stream->ved_pipeline[i]->process_frame( stream->ved_pipeline[i], frame); if (!frame || IS_ERR(frame)) break; } - //wait for 60hz set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(HZ / 60); + schedule_timeout(fps_jiffies); } return 0;