From nobody Fri Jun 19 08:14:05 2026 Received: from mail-qk1-f182.google.com (mail-qk1-f182.google.com [209.85.222.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1A0151F94F for ; Sun, 26 Apr 2026 00:27:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777163224; cv=none; b=NAcu+5bDNKfz3qL/XFDqMhPPghD8EdCi4AnqFwiVIrgygduMVHefyBGUSx4G30kOQ2J5zG6ZirIGsADOd1PJ+XMpEBtYxsJhbUM4a1nXWN3ZHp5Xtc7Vp70Xxx1TLiNm9yI2C8owFDNyFPGQgYcf9Ytc5X1Xkh7L7soVWVi201w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777163224; c=relaxed/simple; bh=YCLbslie3NiZPx9jQSuzjpl73nOvyJagEqFdIclfqOs=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=NbFEJKKag9WMQ/jrEctpbKTQ8+gRE6eq1YbcM0UwUPrZX+4Uk14epEh+CLaMXDJ0lauvLJExUM5CmCfFOF7RMxf6cuOC6yCJfDrurfgWCaPnbXhAicviDJzGmN/OSP9IHzNMX+4KPtBLJ6O23wttLH84ulouFrEFGPTWShMAus0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=GjeyABAb; arc=none smtp.client-ip=209.85.222.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="GjeyABAb" Received: by mail-qk1-f182.google.com with SMTP id af79cd13be357-8e8c0c2d2bcso485084885a.1 for ; Sat, 25 Apr 2026 17:27:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1777163222; x=1777768022; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=kFNy+gHycOTnjB6H7mfknpfmC1xnEHBgISXSIOKUt5I=; b=GjeyABAbd368JpYsErYDwm/CgpdmzNROjbi5aAbZ0KCw/HDkp9+BOx1jR1E6uQ7nqt CIE15gBDoncgHr313xcgA/NEauikSqv96LBYZLH72frm7wnf2EL0nOl3luBHE5vb6ePK F2RJ+oPE8FMh7iCS/c8OT5xTkqKiPtdpoBHuxRric+Dnm4SHEalh7J0IL9AvOowQqhie 45yNRn+Vzh1n0Nas58iyg8qeRqm2Qh62dAJnnGhnvtGZrweKESpnCNORuRgNP1vjA05v +BuLWmWruGHoXdIDiqhDgaa1cCH79I+ScofkYAUBYn6qk1wHngiZaJjNKF0AXPrQvIHz 3vTw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777163222; x=1777768022; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=kFNy+gHycOTnjB6H7mfknpfmC1xnEHBgISXSIOKUt5I=; b=E/IRdwKQzE74cCcsXZvmnaPk9kzq2K73X9HmOhc92Mum1fY4MjVS3jDKxopZ5m/AGW 6C6OxgGIX2dFmSadlLnsoAoOzBb1HfBuGhUfzLNyqMh19zIv6YkrQGL51HWUKr5abK7Y F0R9/OKtQXNsV3oNdB0sCNbCbxDmllV2zGaSlHUH9h1yj7umNk+kR4LGDXJmPtHMmXbx m3Jcbi8wkuW+7Ax0oiVc1nyJVwd2j4cotm9qIFjZE+VhjwHYsmfIOLLy84Rh/Ibym3Aj cCka8WFUgw+zKQpxtwL5gmOiE07yzkkUybS17nu1mgeV0uzazSnY+WeauNIgyh6FfE3r iXbA== X-Forwarded-Encrypted: i=1; AFNElJ/JnHuRhJlywbG0MQtyFF3HbI7bSJSjYCoVlQr8ypScCbvq9x39zU0pUP+E6Fx4lJ3mePzfuBmdji1bNjE=@vger.kernel.org X-Gm-Message-State: AOJu0YzRhdbrd7xcDl9+zv0kwuZBuA6XOH6FPvJrB3SS8oX1+bAvNfdl oPnFtUbCo+16V9432bVLw1+LoIDESQfyA/m6S2f6V9AXyxhe8d+4xtV2JJgN50IPwf3mQw== X-Gm-Gg: AeBDietKI5jDy2K9+ungailVN7lcDGuyMQhgMY6+fRl5hacB7r4Zwnw+lEPxvCWd3Tl QyJ6L6jel7IIWoFUV1AqsrWXb0arnFRHtER8mMbes62S+04ZMjb+ytdjxnkHNywnPTgyT9TLR1B 8z73TrMPWTNA9anbOOvB4INc3uW5fhhgqud1CXV9J3b3wjT/kmwt5bLffC12sGFGKt5fEKOX+B7 tr3e/Pcqa/nJBsdFC6Fgg7PGRiIr6dTO/XEN9sTfYBLN1VywUSJipN33RJSFhaUmzDgjBX5zXBp mktUB/QYaoBQz5nEKmySbK8qKQGZXGQWZ57NdPlls01oWZbH6X1/+jVMJZ9x1rYIUm1hMsYQNp5 Or7MtVW8uyadDfyPX9QVWdR7FCKwb4uq1WNnqeTb4rbQHQ6W6XzY7oinxHkhT9TpPTPV0e25AJ0 2zJVSo4bRs8mPNboZkjfcJgSA2bPHf/4nG6QVSygEJI811bAZe/JV+oPLt/VFhpOKvpsONNSzsP H9ySb1LLRagn//B6KlM4qkWzM+1Is3WG0dOWnVu+ba4mg== X-Received: by 2002:a05:620a:708d:b0:8ed:d906:a8da with SMTP id af79cd13be357-8edd906ac96mr3551973485a.18.1777163221955; Sat, 25 Apr 2026 17:27:01 -0700 (PDT) Received: from archlinux.tail090342.ts.net (h135-134-218-104.nwblwi.broadband.dynamic.tds.net. [135.134.218.104]) by smtp.gmail.com with ESMTPSA id af79cd13be357-8ef12122800sm1233988585a.18.2026.04.25.17.27.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 25 Apr 2026 17:27:01 -0700 (PDT) From: Vickram Kapoor To: slongerbeam@gmail.com Cc: p.zabel@pengutronix.de, mchehab@kernel.org, gregkh@linuxfoundation.org, linux-media@vger.kernel.org, linux-staging@lists.linux.dev, linux-kernel@vger.kernel.org, Vickram Kapoor Subject: [PATCH] media: imx: ic-prp: add FORMAT_TRY frame interval support Date: Sat, 25 Apr 2026 19:26:59 -0500 Message-ID: <20260426002659.119625-1-vickramk.207@gmail.com> X-Mailer: git-send-email 2.53.0 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" Implement frame interval handling for V4L2_SUBDEV_FORMAT_TRY by storing and retrieving per-pad intervals from the subdev state. Also add a PRP-specific init_state callback to initialize TRY intervals from the active default, and move default interval initialization to prp_init(). Signed-off-by: Vickram Kapoor --- drivers/staging/media/imx/imx-ic-prp.c | 89 +++++++++++++++++++------- 1 file changed, 66 insertions(+), 23 deletions(-) diff --git a/drivers/staging/media/imx/imx-ic-prp.c b/drivers/staging/media= /imx/imx-ic-prp.c index 2b80d54006b3..a5c17bd4f783 100644 --- a/drivers/staging/media/imx/imx-ic-prp.c +++ b/drivers/staging/media/imx/imx-ic-prp.c @@ -88,6 +88,18 @@ __prp_get_fmt(struct prp_priv *priv, struct v4l2_subdev_= state *sd_state, return &priv->format_mbus; } =20 +static struct v4l2_fract * +__prp_get_frame_interval(struct prp_priv *priv, + struct v4l2_subdev_state *sd_state, + unsigned int pad, + enum v4l2_subdev_format_whence which) +{ + if (which =3D=3D V4L2_SUBDEV_FORMAT_TRY) + return v4l2_subdev_state_get_interval(sd_state, pad); + + return &priv->frame_interval; +} + /* * V4L2 subdev operations. */ @@ -398,22 +410,26 @@ static int prp_get_frame_interval(struct v4l2_subdev = *sd, struct v4l2_subdev_frame_interval *fi) { struct prp_priv *priv =3D sd_to_priv(sd); - - /* - * FIXME: Implement support for V4L2_SUBDEV_FORMAT_TRY, using the V4L2 - * subdev active state API. - */ - if (fi->which !=3D V4L2_SUBDEV_FORMAT_ACTIVE) - return -EINVAL; + struct v4l2_fract *interval; + int ret =3D 0; =20 if (fi->pad >=3D PRP_NUM_PADS) return -EINVAL; =20 mutex_lock(&priv->lock); - fi->interval =3D priv->frame_interval; + + interval =3D __prp_get_frame_interval(priv, sd_state, fi->pad, + fi->which); + if (!interval) { + ret =3D -EINVAL; + goto out; + } + + fi->interval =3D *interval; +out: mutex_unlock(&priv->lock); =20 - return 0; + return ret; } =20 static int prp_set_frame_interval(struct v4l2_subdev *sd, @@ -421,24 +437,51 @@ static int prp_set_frame_interval(struct v4l2_subdev = *sd, struct v4l2_subdev_frame_interval *fi) { struct prp_priv *priv =3D sd_to_priv(sd); - - /* - * FIXME: Implement support for V4L2_SUBDEV_FORMAT_TRY, using the V4L2 - * subdev active state API. - */ - if (fi->which !=3D V4L2_SUBDEV_FORMAT_ACTIVE) - return -EINVAL; + struct v4l2_fract *interval; + int ret =3D 0; =20 if (fi->pad >=3D PRP_NUM_PADS) return -EINVAL; =20 mutex_lock(&priv->lock); =20 + interval =3D __prp_get_frame_interval(priv, sd_state, fi->pad, + fi->which); + if (!interval) { + ret =3D -EINVAL; + goto out; + } + /* No limits on valid frame intervals */ if (fi->interval.numerator =3D=3D 0 || fi->interval.denominator =3D=3D 0) - fi->interval =3D priv->frame_interval; + fi->interval =3D *interval; else - priv->frame_interval =3D fi->interval; + *interval =3D fi->interval; +out: + mutex_unlock(&priv->lock); + + return ret; +} + +static int prp_init_state(struct v4l2_subdev *sd, + struct v4l2_subdev_state *sd_state) +{ + struct prp_priv *priv =3D sd_to_priv(sd); + struct v4l2_fract *interval; + unsigned int pad; + int ret; + + ret =3D imx_media_init_state(sd, sd_state); + if (ret) + return ret; + + mutex_lock(&priv->lock); + + for (pad =3D 0; pad < PRP_NUM_PADS; pad++) { + interval =3D v4l2_subdev_state_get_interval(sd_state, pad); + if (interval) + *interval =3D priv->frame_interval; + } =20 mutex_unlock(&priv->lock); =20 @@ -450,10 +493,6 @@ static int prp_registered(struct v4l2_subdev *sd) struct prp_priv *priv =3D sd_to_priv(sd); u32 code; =20 - /* init default frame interval */ - priv->frame_interval.numerator =3D 1; - priv->frame_interval.denominator =3D 30; - /* set a default mbus format */ imx_media_enum_ipu_formats(&code, 0, PIXFMT_SEL_YUV); =20 @@ -487,7 +526,7 @@ static const struct v4l2_subdev_ops prp_subdev_ops =3D { }; =20 static const struct v4l2_subdev_internal_ops prp_internal_ops =3D { - .init_state =3D imx_media_init_state, + .init_state =3D prp_init_state, .registered =3D prp_registered, }; =20 @@ -504,6 +543,10 @@ static int prp_init(struct imx_ic_priv *ic_priv) ic_priv->task_priv =3D priv; priv->ic_priv =3D ic_priv; =20 + /* init default frame interval */ + priv->frame_interval.numerator =3D 1; + priv->frame_interval.denominator =3D 30; + for (i =3D 0; i < PRP_NUM_PADS; i++) priv->pad[i].flags =3D (i =3D=3D PRP_SINK_PAD) ? MEDIA_PAD_FL_SINK : MEDIA_PAD_FL_SOURCE; --=20 2.53.0