media: v4l2-subdev: Introduce [get|set]_mbus_config pad ops
authorJacopo Mondi <jacopo+renesas@jmondi.org>
Fri, 17 Jul 2020 14:53:15 +0000 (16:53 +0200)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Tue, 18 Aug 2020 13:34:22 +0000 (15:34 +0200)
Introduce two new pad operations to allow retrieving and configuring the
media bus parameters on a subdevice pad.

The newly introduced operations aims to replace the s/g_mbus_config video
operations, which have been on their way for deprecation since a long
time.

Signed-off-by: Jacopo Mondi <jacopo+renesas@jmondi.org>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/media/v4l2-core/v4l2-subdev.c
include/media/v4l2-subdev.h

index 6b989fe5a0a9ae970743d673d03463c59fd72437..a7d508e74d6b3bd62e19c7f319b9806052c6516c 100644 (file)
@@ -309,6 +309,20 @@ static int call_enum_dv_timings(struct v4l2_subdev *sd,
               sd->ops->pad->enum_dv_timings(sd, dvt);
 }
 
+static int call_get_mbus_config(struct v4l2_subdev *sd, unsigned int pad,
+                               struct v4l2_mbus_config *config)
+{
+       return check_pad(sd, pad) ? :
+              sd->ops->pad->get_mbus_config(sd, pad, config);
+}
+
+static int call_set_mbus_config(struct v4l2_subdev *sd, unsigned int pad,
+                               struct v4l2_mbus_config *config)
+{
+       return check_pad(sd, pad) ? :
+              sd->ops->pad->get_mbus_config(sd, pad, config);
+}
+
 static const struct v4l2_subdev_pad_ops v4l2_subdev_call_pad_wrappers = {
        .get_fmt                = call_get_fmt,
        .set_fmt                = call_set_fmt,
@@ -321,6 +335,8 @@ static const struct v4l2_subdev_pad_ops v4l2_subdev_call_pad_wrappers = {
        .set_edid               = call_set_edid,
        .dv_timings_cap         = call_dv_timings_cap,
        .enum_dv_timings        = call_enum_dv_timings,
+       .get_mbus_config        = call_get_mbus_config,
+       .set_mbus_config        = call_set_mbus_config,
 };
 
 static const struct v4l2_subdev_video_ops v4l2_subdev_call_video_wrappers = {
index d4e3b44cf14ceb7299763a4962b8fab195c39ba7..4d7e7e5cf96d9315088c1466c0e036fb0abb77ac 100644 (file)
@@ -670,6 +670,30 @@ struct v4l2_subdev_pad_config {
  *
  * @set_frame_desc: set the low level media bus frame parameters, @fd array
  *                  may be adjusted by the subdev driver to device capabilities.
+ *
+ * @get_mbus_config: get the media bus configuration of a remote sub-device.
+ *                  The media bus configuration is usually retrieved from the
+ *                  firmware interface at sub-device probe time, immediately
+ *                  applied to the hardware and eventually adjusted by the
+ *                  driver. Remote sub-devices (usually video receivers) shall
+ *                  use this operation to query the transmitting end bus
+ *                  configuration in order to adjust their own one accordingly.
+ *                  Callers should make sure they get the most up-to-date as
+ *                  possible configuration from the remote end, likely calling
+ *                  this operation as close as possible to stream on time. The
+ *                  operation shall fail if the pad index it has been called on
+ *                  is not valid or in case of unrecoverable failures.
+ *
+ * @set_mbus_config: set the media bus configuration of a remote sub-device.
+ *                  This operations is intended to allow, in combination with
+ *                  the get_mbus_config operation, the negotiation of media bus
+ *                  configuration parameters between media sub-devices. The
+ *                  operation shall not fail if the requested configuration is
+ *                  not supported, but the driver shall update the content of
+ *                  the %config argument to reflect what has been actually
+ *                  applied to the hardware. The operation shall fail if the
+ *                  pad index it has been called on is not valid or in case of
+ *                  unrecoverable failures.
  */
 struct v4l2_subdev_pad_ops {
        int (*init_cfg)(struct v4l2_subdev *sd,
@@ -710,6 +734,10 @@ struct v4l2_subdev_pad_ops {
                              struct v4l2_mbus_frame_desc *fd);
        int (*set_frame_desc)(struct v4l2_subdev *sd, unsigned int pad,
                              struct v4l2_mbus_frame_desc *fd);
+       int (*get_mbus_config)(struct v4l2_subdev *sd, unsigned int pad,
+                              struct v4l2_mbus_config *config);
+       int (*set_mbus_config)(struct v4l2_subdev *sd, unsigned int pad,
+                              struct v4l2_mbus_config *config);
 };
 
 /**