diff options
| -rw-r--r-- | drivers/media/v4l2-core/v4l2-subdev.c | 16 | ||||
| -rw-r--r-- | include/media/v4l2-subdev.h | 28 | 
2 files changed, 44 insertions, 0 deletions
| diff --git a/drivers/media/v4l2-core/v4l2-subdev.c b/drivers/media/v4l2-core/v4l2-subdev.c index 6b989fe5a0a9..a7d508e74d6b 100644 --- a/drivers/media/v4l2-core/v4l2-subdev.c +++ b/drivers/media/v4l2-core/v4l2-subdev.c @@ -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 = { diff --git a/include/media/v4l2-subdev.h b/include/media/v4l2-subdev.h index d4e3b44cf14c..4d7e7e5cf96d 100644 --- a/include/media/v4l2-subdev.h +++ b/include/media/v4l2-subdev.h @@ -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);  };  /** | 
