Hi Tomi, Thanks for your work. On 2025-05-30 16:50:39 +0300, Tomi Valkeinen wrote: > Add v4l2_subdev_pad_ops.get_frame_desc() implementation. > > We also implement a fallback for the case where the upstream subdevice > does not implement .get_frame_desc. It assumes a single stream with VC = > 0 and DT based on the configured stream mbus format. > > Signed-off-by: Tomi Valkeinen <tomi.valkeinen+renesas@xxxxxxxxxxxxxxxx> > --- > drivers/media/platform/renesas/rcar-csi2.c | 56 ++++++++++++++++++++++++++++++ > 1 file changed, 56 insertions(+) > > diff --git a/drivers/media/platform/renesas/rcar-csi2.c b/drivers/media/platform/renesas/rcar-csi2.c > index 20bd44274bd2..65c7f3040696 100644 > --- a/drivers/media/platform/renesas/rcar-csi2.c > +++ b/drivers/media/platform/renesas/rcar-csi2.c > @@ -1676,12 +1676,68 @@ static int rcsi2_set_pad_format(struct v4l2_subdev *sd, > return 0; > } > > +static int rcsi2_get_frame_desc_fallback(struct v4l2_subdev *sd, > + unsigned int pad, > + struct v4l2_mbus_frame_desc *fd) > +{ > + const struct rcar_csi2_format *format; > + struct v4l2_subdev_state *state; > + struct v4l2_mbus_framefmt *fmt; > + int ret = 0; > + > + state = v4l2_subdev_lock_and_get_active_state(sd); > + > + fmt = v4l2_subdev_state_get_format(state, RCAR_CSI2_SINK, 0); > + if (!fmt) { > + ret = -EINVAL; > + goto out; > + } > + > + format = rcsi2_code_to_fmt(fmt->code); > + if (!format) { > + ret = -EINVAL; > + goto out; > + } > + > + fd->num_entries = 1; > + fd->type = V4L2_MBUS_FRAME_DESC_TYPE_CSI2; > + fd->entry[0].stream = 0; > + fd->entry[0].pixelcode = fmt->code; > + fd->entry[0].bus.csi2.vc = 0; > + fd->entry[0].bus.csi2.dt = format->datatype; > + > +out: > + v4l2_subdev_unlock_state(state); > + > + return ret; > +} > + > +static int rcsi2_get_frame_desc(struct v4l2_subdev *sd, unsigned int pad, > + struct v4l2_mbus_frame_desc *fd) > +{ > + struct rcar_csi2 *priv = sd_to_csi2(sd); > + int ret; > + > + if (WARN_ON(!priv->info->use_isp)) > + return -ENOTTY; This looks odd, why can't we support the frame descriptor and streams on Gen3 that do not use the ISP Channel Selector? > + > + if (WARN_ON(pad != RCAR_CSI2_SOURCE_VC0)) > + return -EINVAL; > + > + ret = v4l2_subdev_get_frame_desc_passthrough(sd, pad, fd); > + if (ret == -ENOIOCTLCMD) > + ret = rcsi2_get_frame_desc_fallback(sd, pad, fd); > + return ret; > +} > + > static const struct v4l2_subdev_pad_ops rcar_csi2_pad_ops = { > .enable_streams = rcsi2_enable_streams, > .disable_streams = rcsi2_disable_streams, > > .set_fmt = rcsi2_set_pad_format, > .get_fmt = v4l2_subdev_get_fmt, > + > + .get_frame_desc = rcsi2_get_frame_desc, > }; > > static const struct v4l2_subdev_ops rcar_csi2_subdev_ops = { > > -- > 2.43.0 > -- Kind Regards, Niklas Söderlund