From patchwork Thu Mar 12 23:16:14 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: 26280 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 51676BDCC1 for ; Thu, 12 Mar 2026 23:17:34 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 011026265F; Fri, 13 Mar 2026 00:17:33 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="Z95v1MAL"; dkim-atps=neutral Received: from mail-pj1-x1031.google.com (mail-pj1-x1031.google.com [IPv6:2607:f8b0:4864:20::1031]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 35A356261B for ; Fri, 13 Mar 2026 00:17:32 +0100 (CET) Received: by mail-pj1-x1031.google.com with SMTP id 98e67ed59e1d1-35a1826cb69so103325a91.3 for ; Thu, 12 Mar 2026 16:17:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773357451; x=1773962251; 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=Crj5/i72nEqbooeaF7oZTjBVdiKVVLm5IQ4dcnP9qgM=; b=Z95v1MALJN1mh/QrovurbdWDv6q7sCJl0BANG8KjHF9BAij3dfftDapD8NZ7bZeH3f Z5Tv5s2XDbzSd/WHDy/qx3bY1Fy+HvLsAalekh4uDIlTfkDmebhs6xrP5cHO3MS+nXw1 MM5S1dpOvd1kZCL1DDGf3t8DZ7A36DO5t7WLkBqG86Ykse92Ik5LDS0UOhQpuzG3gOkx pW9HYpkwkV2NIlvBy5z24rsC2gNIkinMZrRbMiSnxtOU7nQLY12nQECGaUpeiMjzi9L3 HNuUQRB6I2mIkix7d2RlDO+biS3QR434B7XiUn6oKy9aYD0EW5Lhx7ZsjDyR/GLlkyUm Xd4A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773357451; x=1773962251; 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=Crj5/i72nEqbooeaF7oZTjBVdiKVVLm5IQ4dcnP9qgM=; b=rIa739Zd/Go/vYr8667GX5C7eE0uSEJBuaqCWRKTBlNVlRYhMsLHk9siKQKL1Noeey 1UmofQ9w38+xmYIBPRhfaHOG5AxFQeknF3RdwspkP/yKRBOVBDZapiErCnlZRO5378CU 0nmBtJLov9iZjDc8kP4Qa8HHgX33De2VQJ2QQK2PTsc34UHAXrFAp6niqWCueogVPXGw bMhOngQI6P5iZgb40ghL2Si2kCZBkUaMeABPRKQewdVemaHS/wBms1b+mqmin1qAI38I /V5ZQEnqydPaRsCD6Uz8RtaCP+bbqwVScEH0lQSzpUOzwCFTt/P5NtMFRNxsYTKnAkd/ vMJQ== X-Forwarded-Encrypted: i=1; AJvYcCUqihqB5oaiT+x1n6YWtFrwHBtFnP8DLTkoHV0mUVrHRMwYKK9E8ho42kbqVycyaHqDKq53c4kUhTEYEQi3phk=@lists.libcamera.org X-Gm-Message-State: AOJu0YyGuuXHq00uorB9gawCLzhePHeVkErNxVyD0Pq8uRrNcfyqOr26 1dbCOsEY/3qsaGREMWZEjeG+vGdBpI9hMZSb+x8L/vFUM/Vp/21pEtwR X-Gm-Gg: ATEYQzx61vj5M8S1tiTreW6U38ECvEiWV4qKe+BjMP3tnNs/k6qrKlKqFGxWSGsAE1d 3SYB00vfXk6xzhV5L0inCzauVN2VqfRa6/+sLO+2JhUHqfpEyq7rpcac+w2Q5Ufj91MA4ThQkOb sC08NWqXKX3lIH7ovgwFA1X9SJOwQT7OALmitAIGj4XYdNkm8Op9qks0PE2hlciaaUFRVA7SSpx fEakNlNz8pHM/V7fud5W9FmduDWacDUtW+gwDXouaxKVhbxjZIkqOXn370fY+pnrEh5omp8dGai T8IAJYCLpDBavU7OHpp0Qf8OVkMgARxP3lReLVQTTpX2YBphewW60ipio4Ag+hbPmwKt6o/KL1m 2tlQELnYekk9iISG5A+4A7w/2M+EkKyVoy3AeaJE753xT9ewdvGtTGjMK0fpxxP68Zt7zRcqe6/ mpagxtqC7+TYY4suhQeFo3BTfdOvE+rdtbtipbiUTzK0VNC8pUO3eb8rw= X-Received: by 2002:a17:902:f546:b0:2ae:4f95:df56 with SMTP id d9443c01a7336-2aecaa3eb84mr7530795ad.3.1773357450767; Thu, 12 Mar 2026 16:17:30 -0700 (PDT) Received: from FAIZEL-KB.. ([2001:569:5b64:e100:3685:315:53bf:61fc]) by smtp.googlemail.com with ESMTPSA id d9443c01a7336-2aece81cde8sm619395ad.70.2026.03.12.16.17.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Mar 2026 16:17:30 -0700 (PDT) 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 RESEND v3 1/3] media: vimc: sensor: Move vimc_sensor_device to common header Date: Thu, 12 Mar 2026 16:16:14 -0700 Message-ID: <20260312231616.3590215-2-faizel.kb@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260312231616.3590215-1-faizel.kb@gmail.com> References: <20260312231616.3590215-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 69e714d4f228..4c64cdab8cda 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 Thu Mar 12 23:16:15 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: 26281 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 EB0FFBDCC1 for ; Thu, 12 Mar 2026 23:17:40 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 8E1D262675; Fri, 13 Mar 2026 00:17:40 +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="buzgabCd"; dkim-atps=neutral Received: from mail-pj1-x1032.google.com (mail-pj1-x1032.google.com [IPv6:2607:f8b0:4864:20::1032]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id A62F76261B for ; Fri, 13 Mar 2026 00:17:39 +0100 (CET) Received: by mail-pj1-x1032.google.com with SMTP id 98e67ed59e1d1-3538952a464so139353a91.2 for ; Thu, 12 Mar 2026 16:17:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773357458; x=1773962258; 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=dIaf3x8xjAlsrE68JYAsh8jSNNqCyGPC00OSVKpEMxc=; b=buzgabCd/ZDflvw7k/NSPm10S/SIs+T9+kNrSqNjIXGKyqYTRplOnGlR8mRKQOuZqR 1XSxAouGZt3vSqJNnu6B2KrEpLAX37cVXY5SuXVygITxTpXqqw+iGeFijPIS4buRV2yL ekeN9wV7izBc8SJhp5ANJhS4fn2CqYrhJ1dhNkyIlHOC4CyG0OpAEFwFOOZ5eFmRi/rP Se+Wut/7DUR2BclqH6RJXVl++sclLRjoUA6E1z+Dfi3RHqj6tbjuEs2scIQFpvRikHEP Hq8njNC6Q1ojapufA61i7bHnUlFxVU1BVJ3D7kaUGQNqPDq39Aj24uUMqMcyEFNRorlj LFww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773357458; x=1773962258; 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=dIaf3x8xjAlsrE68JYAsh8jSNNqCyGPC00OSVKpEMxc=; b=bTEDb/39FhJsE+Uojq+zfkpNn1itHZZxtJnuePhZLSnAp6KFbUfp4aHBi3yJy8HHW6 fJmZAM8IZa4LrkKDfJL+Id+Bl7HB/SbMmhPO7ENVMGAvvGrauW6SUJNyzW3za4Op9cpT 5lau6AcIKOt/g5rJkiPqJ9rO/yRroWkAmFHqh0lbVFNc1ax3zIcOiJ5TYRCZ/pHSeM6I 2eFS3iMn/rxFnwQ6Fda8Ix0eME88qwrAuC1iYaV2xB+nfBUHuBaSXip557jO0PB/u38Z eKlOA+dvv6giiakrI2lQuwxglCOzIAqz5ucV7dz8ewGscJhgfnd86lYimqJ4zvWkT5Er lnBQ== X-Forwarded-Encrypted: i=1; AJvYcCVn/8s5Yv/64ts80r6HkQjyCf/lb0jq5oyyk6gazBrGim3UIe0WitqRx1gT/cVBtNJ+CvfVsX7TkWlyNIWHrDI=@lists.libcamera.org X-Gm-Message-State: AOJu0YxToHhnuSp1ttqVgMoJLfboit5mAArBiIBkZ81fbjmnY7NgBIoz wSH+0Wy6MxhWDhnyJvsBryEpXUM01ivjCEyXdNJLWjDifxdE2Q97Oiby X-Gm-Gg: ATEYQzyLJuR5ZgThViJ5UTnPjW4YUOEtdeatLi+ZkQlMr8B28qDsYwm2XagNo1JwB+2 4322f2W2hRcm1vXl+bAgP4DQ/rTvYkPsLe4jn9S5zncATwvXCugTDAiuvNvRBY3LrLX8wHSK16j fDf6ySTRXHhmjdUMtg63BTIfEQcPOZp2xkxoinCWo49yFRj+De6iUMm0W/kCpsjWGDzfFwEIpZr 5JkxUCS/ECILKePExJWq3VD/K/vNL0glgg8ftpccGqqVwH8eyvjLj8rn2633jLke4ZKZ3B2Yc8d /YLlw7GFhH/t6sRPvDmi9Bz3xXw1A3wKHfBRxQizkydkm2qoQQ+gwIw3ePXRuLu/+NvJ/fKHiE/ nLgo1mNOy8qm/pThCSp1zlSVlJ8x7OG9xYKdiQ6S6gxCu7SpdfkANpockU95vRLOmbPG/leUGft rMyf0Iab/jv1P2cEEg+nFMMQhTUIaZNjDPELDEqzYubZMkySCV2gPfYQk= X-Received: by 2002:a17:902:e810:b0:2ae:44dd:3377 with SMTP id d9443c01a7336-2aeca90943bmr7406165ad.1.1773357458023; Thu, 12 Mar 2026 16:17:38 -0700 (PDT) Received: from FAIZEL-KB.. ([2001:569:5b64:e100:3685:315:53bf:61fc]) by smtp.googlemail.com with ESMTPSA id d9443c01a7336-2aece81cde8sm619395ad.70.2026.03.12.16.17.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Mar 2026 16:17:37 -0700 (PDT) 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 RESEND v3 2/3] media: vimc: sensor: Add pixel_rate, vblank and hblank configuration Date: Thu, 12 Mar 2026 16:16:15 -0700 Message-ID: <20260312231616.3590215-3-faizel.kb@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260312231616.3590215-1-faizel.kb@gmail.com> References: <20260312231616.3590215-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 | 88 +++++++++++++++++++ 2 files changed, 101 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 4c64cdab8cda..5deebcc78a33 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,24 @@ 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; + u64 vts; + + target_fps = (width * height <= VIMC_PIXELS_THRESHOLD_30FPS) ? 30 : 10; + + vts = (u64)pixel_rate; + do_div(vts, target_fps * hts); + + if (vts > height) + return clamp((u32)(vts - height), VIMC_VBLANK_MIN, VIMC_VBLANK_MAX); + + return VIMC_VBLANK_MIN; +} + static int vimc_sensor_set_fmt(struct v4l2_subdev *sd, struct v4l2_subdev_state *sd_state, struct v4l2_subdev_format *fmt) @@ -137,6 +180,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 +279,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 +352,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 +445,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 Thu Mar 12 23:16:16 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: 26282 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 92E82BDCC1 for ; Thu, 12 Mar 2026 23:17:48 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 444546267F; Fri, 13 Mar 2026 00:17:48 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="VRBcxwPT"; dkim-atps=neutral Received: from mail-pl1-x635.google.com (mail-pl1-x635.google.com [IPv6:2607:f8b0:4864:20::635]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 4BFB46265F for ; Fri, 13 Mar 2026 00:17:46 +0100 (CET) Received: by mail-pl1-x635.google.com with SMTP id d9443c01a7336-2a3e79fe2b8so1555135ad.1 for ; Thu, 12 Mar 2026 16:17:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773357465; x=1773962265; 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=VRBcxwPT6xayGCoBvjqB3g+tUn31KZM9aCd2yEvnbA/vK21MFer8ct4l6wIhjwDlgB VLsdkLBbo+ZvzHicWJjOXDvss1LfQG+A+5h/perxpaNR6m6m6AfsbnnTEml6w+zLDiZp H45AkRHSPMl0/XHZ4nIaxN3M08DSXYsPDcgVPl1bt2CFYkDQZtbitFotSksWwbbHy2gD B5UyBOLZ0EERjLuoASUwYctPffngebFEdSz7Xd76U7KLlbX6v5XDqx85MN6PmjX/iBYt suJDWCbkc2A5FqjteU2PzaP5cSir9cFs8lDtK83dqY07Y9xQhAb3MlivRuCBcdyNLcw3 xd9g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773357465; x=1773962265; 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=Da74RClYJpcSNiFrFcA7nTe6F92fTMI2oD1PcN86xK+nd0g/7BKFOjfgA0nQSO4ner LPe0RCKUwbur1X1b2kxwtRZynTU5ODEEBI8K186T8UFTgp0f8mkFQvpsvzHPAKKMDWyb aRficQlseoCK/sefi6FvNX3gZ4yOs3iL3OXff/T707TOqqsEcMUA9aZVVsI1YY3DKJig BrJWwjm76/BQeGjyx2Qs+XL+D9HTeHQbEYWc/PpqaR1HGLX7S6zCgvI+5q5XkE0nQZCC tyWqFYrgLnqHWoJjVtT80f5DlGEG2GdVD8WOvUq1FjqH4wB5QiwUi+PHTWHeybT9E53x 352Q== X-Forwarded-Encrypted: i=1; AJvYcCXVvTD1ju7aobuUkEnl3cwAa+wCGTJb1OhhNHuFZ/jPIew8QowroV5600SCLtmylcyL3PgZMN6O8uOBA7BSLuA=@lists.libcamera.org X-Gm-Message-State: AOJu0Yy2fRFHbgdKYubL6D/BafL7GIXNpXxvBSMiXTYEPB1grdl2rBAq 5AYjjRL+0aTvf2auX3xt6nrrSsRoEYoZYuwNxfNcXJkaqL10fgb2aF8unE/VjdwHUjE= X-Gm-Gg: ATEYQzz5IcPFRIWaZMvn1lxoCl2KOjJCK9xGgAz6mIT9lSBAQKzoPzu+2eKlnFbkld5 bNVunna0RDjh+r7+ustw7x+WgSMO6yCbX4kKRs7IdnEu6jT6lEUvsperU7Vt5qMHhlJk3GXbFsw DE9u+5dNQuQLOeruDY89jcUhEhXzUTTAtFd8ibHATEjQYTZnloWO9A0veTUTUYEqBK6KJQeEdW4 l5YEy5n7tg4sc+rnVzMpwGmllhosyxLcE4fbEzLPx/Sq01uYiDF8ypb+94OeRMJ2kjMOqy8TZb1 Poe1mTj9hCfFmxlINatxECTZZTp8Ytp2+Se7a2ZSNVaCIaqcAB50x0+R6w5jihMbfkcpKKduJrY jpYElbhfjjrHdLvZQSENj1Ylq9hlS1TyocDOe1rHMSzWadhbxMfmUoRW14h2qYXP5UN22AgvLPW RzQZ0tplb/hXqG93vHkxn6H7Z5E9WiH7o3uLpIq/77jMuQjl4onG/zT00j4yDutvXnuQ== X-Received: by 2002:a17:902:e550:b0:2ae:7ed6:7d19 with SMTP id d9443c01a7336-2aecaad2c12mr6749555ad.4.1773357464899; Thu, 12 Mar 2026 16:17:44 -0700 (PDT) Received: from FAIZEL-KB.. ([2001:569:5b64:e100:3685:315:53bf:61fc]) by smtp.googlemail.com with ESMTPSA id d9443c01a7336-2aece81cde8sm619395ad.70.2026.03.12.16.17.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Mar 2026 16:17:44 -0700 (PDT) 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 RESEND v3 3/3] media: vimc: streamer: Apply sensor frame rate in streamer thread Date: Thu, 12 Mar 2026 16:16:16 -0700 Message-ID: <20260312231616.3590215-4-faizel.kb@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260312231616.3590215-1-faizel.kb@gmail.com> References: <20260312231616.3590215-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;