media: ti: cal: Implement get_frame_desc for camera-rx
authorTomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Mon, 19 Jun 2023 11:40:07 +0000 (14:40 +0300)
committerHans Verkuil <hverkuil-cisco@xs4all.nl>
Tue, 25 Jul 2023 07:24:30 +0000 (09:24 +0200)
CAL uses get_frame_desc to get the VC and DT for the incoming CSI-2
stream, but does it in a bit hacky way. Clean this up by implementing
.get_frame_desc to camera-rx, and calling that from cal.c.

No functional change intended.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
drivers/media/platform/ti/cal/cal-camerarx.c
drivers/media/platform/ti/cal/cal.c
drivers/media/platform/ti/cal/cal.h

index bc09c3f1446d0238cdf0423219511167fb3c2d89..1a4273bbe75255a2e6ef9d9bd543303ec9226fb7 100644 (file)
@@ -589,33 +589,6 @@ done:
        return ret;
 }
 
-int cal_camerarx_get_remote_frame_desc(struct cal_camerarx *phy,
-                                      struct v4l2_mbus_frame_desc *desc)
-{
-       struct media_pad *pad;
-       int ret;
-
-       if (!phy->source)
-               return -EPIPE;
-
-       pad = media_pad_remote_pad_first(&phy->pads[CAL_CAMERARX_PAD_SINK]);
-       if (!pad)
-               return -EPIPE;
-
-       ret = v4l2_subdev_call(phy->source, pad, get_frame_desc, pad->index,
-                              desc);
-       if (ret)
-               return ret;
-
-       if (desc->type != V4L2_MBUS_FRAME_DESC_TYPE_CSI2) {
-               dev_err(phy->cal->dev,
-                       "Frame descriptor does not describe CSI-2 link");
-               return -EINVAL;
-       }
-
-       return 0;
-}
-
 /* ------------------------------------------------------------------
  *     V4L2 Subdev Operations
  * ------------------------------------------------------------------
@@ -772,6 +745,40 @@ static int cal_camerarx_sd_init_cfg(struct v4l2_subdev *sd,
        return cal_camerarx_sd_set_fmt(sd, state, &format);
 }
 
+static int cal_camerarx_get_frame_desc(struct v4l2_subdev *sd, unsigned int pad,
+                                      struct v4l2_mbus_frame_desc *fd)
+{
+       struct cal_camerarx *phy = to_cal_camerarx(sd);
+       struct v4l2_mbus_frame_desc remote_desc;
+       const struct media_pad *remote_pad;
+       int ret;
+
+       remote_pad = media_pad_remote_pad_first(&phy->pads[CAL_CAMERARX_PAD_SINK]);
+       if (!remote_pad)
+               return -EPIPE;
+
+       ret = v4l2_subdev_call(phy->source, pad, get_frame_desc,
+                              remote_pad->index, &remote_desc);
+       if (ret)
+               return ret;
+
+       if (remote_desc.type != V4L2_MBUS_FRAME_DESC_TYPE_CSI2) {
+               cal_err(phy->cal,
+                       "Frame descriptor does not describe CSI-2 link");
+               return -EINVAL;
+       }
+
+       if (remote_desc.num_entries > 1)
+               cal_err(phy->cal,
+                       "Multiple streams not supported in remote frame descriptor, using the first one\n");
+
+       fd->type = V4L2_MBUS_FRAME_DESC_TYPE_CSI2;
+       fd->num_entries = 1;
+       fd->entry[0] = remote_desc.entry[0];
+
+       return 0;
+}
+
 static const struct v4l2_subdev_video_ops cal_camerarx_video_ops = {
        .s_stream = cal_camerarx_sd_s_stream,
 };
@@ -782,6 +789,7 @@ static const struct v4l2_subdev_pad_ops cal_camerarx_pad_ops = {
        .enum_frame_size = cal_camerarx_sd_enum_frame_size,
        .get_fmt = v4l2_subdev_get_fmt,
        .set_fmt = cal_camerarx_sd_set_fmt,
+       .get_frame_desc = cal_camerarx_get_frame_desc,
 };
 
 static const struct v4l2_subdev_ops cal_camerarx_subdev_ops = {
index ee3bbba85e8a966f3e50ad8f81434d2ae67cfaa2..5d49c4435a0803827e0a61beb203767caaec9400 100644 (file)
@@ -446,30 +446,24 @@ static bool cal_ctx_wr_dma_stopped(struct cal_ctx *ctx)
 }
 
 static int
-cal_get_remote_frame_desc_entry(struct cal_camerarx *phy,
+cal_get_remote_frame_desc_entry(struct cal_ctx *ctx,
                                struct v4l2_mbus_frame_desc_entry *entry)
 {
        struct v4l2_mbus_frame_desc fd;
+       struct media_pad *phy_source_pad;
        int ret;
 
-       ret = cal_camerarx_get_remote_frame_desc(phy, &fd);
-       if (ret) {
-               if (ret != -ENOIOCTLCMD)
-                       dev_err(phy->cal->dev,
-                               "Failed to get remote frame desc: %d\n", ret);
-               return ret;
-       }
-
-       if (fd.num_entries == 0) {
-               dev_err(phy->cal->dev,
-                       "No streams found in the remote frame descriptor\n");
-
+       phy_source_pad = media_pad_remote_pad_first(&ctx->pad);
+       if (!phy_source_pad)
                return -ENODEV;
-       }
 
-       if (fd.num_entries > 1)
-               dev_dbg(phy->cal->dev,
-                       "Multiple streams not supported in remote frame descriptor, using the first one\n");
+       ret = v4l2_subdev_call(&ctx->phy->subdev, pad, get_frame_desc,
+                              phy_source_pad->index, &fd);
+       if (ret)
+               return ret;
+
+       if (fd.num_entries != 1)
+               return -EINVAL;
 
        *entry = fd.entry[0];
 
@@ -481,7 +475,7 @@ int cal_ctx_prepare(struct cal_ctx *ctx)
        struct v4l2_mbus_frame_desc_entry entry;
        int ret;
 
-       ret = cal_get_remote_frame_desc_entry(ctx->phy, &entry);
+       ret = cal_get_remote_frame_desc_entry(ctx, &entry);
 
        if (ret == -ENOIOCTLCMD) {
                ctx->vc = 0;
index 55d4736fed18456fe574d3e860d176743547c6b2..0856297adc0bb2d5876b9fbfd75ba1cdf9009796 100644 (file)
@@ -319,8 +319,6 @@ const struct cal_format_info *cal_format_by_code(u32 code);
 
 void cal_quickdump_regs(struct cal_dev *cal);
 
-int cal_camerarx_get_remote_frame_desc(struct cal_camerarx *phy,
-                                      struct v4l2_mbus_frame_desc *desc);
 void cal_camerarx_disable(struct cal_camerarx *phy);
 void cal_camerarx_i913_errata(struct cal_camerarx *phy);
 struct cal_camerarx *cal_camerarx_create(struct cal_dev *cal,