summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorSakari Ailus <sakari.ailus@linux.intel.com>2026-06-26 13:35:40 +0300
committerSakari Ailus <sakari.ailus@linux.intel.com>2026-09-26 21:21:21 +0300
commit58348f64125e9a3e44d3abb275ca7f4e6c9641e5 (patch)
tree4d51d853d1aa602311dcee7674e791ae61c47917 /drivers
parent74fe837e1f494e2e60f141779b110c7fe2f1e114 (diff)
downloadlinux-next-58348f64125e9a3e44d3abb275ca7f4e6c9641e5.tar.gz
linux-next-58348f64125e9a3e44d3abb275ca7f4e6c9641e5.zip
media: ipu6: Support upstream sub-devices without get_frame_desc()
Provide compatibility support for upstream sub-device drivers that do not implement get_frame_desc() pad op. Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com> Reviewed-by: Antti Laakso <antti.laakso@linux.intel.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c30
1 files changed, 26 insertions, 4 deletions
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c b/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
index 4a6c649489a6..0db6971d8d3e 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.c
@@ -16,6 +16,7 @@
#include <linux/string_choices.h>
#include <media/media-entity.h>
+#include <media/mipi-csi2.h>
#include <media/v4l2-ctrls.h>
#include <media/v4l2-device.h>
#include <media/v4l2-event.h>
@@ -591,6 +592,29 @@ static int ipu6_isys_csi2_streaming_change(struct ipu6_isys_subdev *asd,
return 0;
}
+static int ipu6_isys_get_frame_desc(struct v4l2_subdev *remote_sd,
+ unsigned int pad,
+ struct v4l2_mbus_frame_desc *desc)
+{
+ struct v4l2_subdev_format fmt = { .which = V4L2_SUBDEV_FORMAT_ACTIVE };
+ int ret;
+
+ ret = v4l2_subdev_call(remote_sd, pad, get_frame_desc, pad, desc);
+ if (!ret || ret != -ENOIOCTLCMD)
+ return ret;
+
+ ret = v4l2_subdev_call_state_active(remote_sd, pad, get_fmt, &fmt);
+ if (ret)
+ return ret;
+
+ desc->type = V4L2_MBUS_FRAME_DESC_TYPE_CSI2;
+ desc->num_entries = 1;
+ desc->entry[0].pixelcode = fmt.format.code;
+ desc->entry[0].bus.csi2.dt = ipu6_isys_mbus_code_to_mipi(fmt.format.code);
+
+ return 0;
+}
+
static int ipu6_isys_csi2_enable_streams(struct v4l2_subdev *sd,
struct v4l2_subdev_state *state,
u32 pad, u64 streams_mask)
@@ -614,8 +638,7 @@ static int ipu6_isys_csi2_enable_streams(struct v4l2_subdev *sd,
lockdep_assert_held(&csi2->isys->stream_mutex);
- ret = v4l2_subdev_call(remote_sd, pad, get_frame_desc,
- remote_pad->index, &desc);
+ ret = ipu6_isys_get_frame_desc(remote_sd, remote_pad->index, &desc);
if (ret)
return ret;
@@ -722,8 +745,7 @@ static int ipu6_isys_csi2_disable_streams(struct v4l2_subdev *sd,
lockdep_assert_held(&csi2->isys->stream_mutex);
- ret = v4l2_subdev_call(remote_sd, pad, get_frame_desc,
- remote_pad->index, &desc);
+ ret = ipu6_isys_get_frame_desc(remote_sd, remote_pad->index, &desc);
if (ret)
return ret;