diff options
Diffstat (limited to 'include/media/v4l2-subdev.h')
| -rw-r--r-- | include/media/v4l2-subdev.h | 70 | 
1 files changed, 56 insertions, 14 deletions
diff --git a/include/media/v4l2-subdev.h b/include/media/v4l2-subdev.h index a9e6b8146279..e30c463d90e5 100644 --- a/include/media/v4l2-subdev.h +++ b/include/media/v4l2-subdev.h @@ -452,14 +452,6 @@ enum v4l2_subdev_pre_streamon_flags {   *   * @g_pixelaspect: callback to return the pixelaspect ratio.   * - * @s_dv_timings: Set custom dv timings in the sub device. This is used - *	when sub device is capable of setting detailed timing information - *	in the hardware to generate/detect the video signal. - * - * @g_dv_timings: Get custom dv timings in the sub device. - * - * @query_dv_timings: callback for VIDIOC_QUERY_DV_TIMINGS() ioctl handler code. - *   * @s_rx_buffer: set a host allocated memory buffer for the subdev. The subdev   *	can adjust @size to a lower value and must not write more data to the   *	buffer starting at @data than the original value of @size. @@ -490,12 +482,6 @@ struct v4l2_subdev_video_ops {  	int (*g_input_status)(struct v4l2_subdev *sd, u32 *status);  	int (*s_stream)(struct v4l2_subdev *sd, int enable);  	int (*g_pixelaspect)(struct v4l2_subdev *sd, struct v4l2_fract *aspect); -	int (*s_dv_timings)(struct v4l2_subdev *sd, -			struct v4l2_dv_timings *timings); -	int (*g_dv_timings)(struct v4l2_subdev *sd, -			struct v4l2_dv_timings *timings); -	int (*query_dv_timings)(struct v4l2_subdev *sd, -			struct v4l2_dv_timings *timings);  	int (*s_rx_buffer)(struct v4l2_subdev *sd, void *buf,  			   unsigned int *size);  	int (*pre_streamon)(struct v4l2_subdev *sd, u32 flags); @@ -728,12 +714,14 @@ struct v4l2_subdev_stream_configs {  /**   * struct v4l2_subdev_krouting - subdev routing table   * + * @len_routes: length of routes array, in routes   * @num_routes: number of routes   * @routes: &struct v4l2_subdev_route   *   * This structure contains the routing table for a subdev.   */  struct v4l2_subdev_krouting { +	unsigned int len_routes;  	unsigned int num_routes;  	struct v4l2_subdev_route *routes;  }; @@ -791,6 +779,14 @@ struct v4l2_subdev_state {   *   * @set_edid: callback for VIDIOC_SUBDEV_S_EDID() ioctl handler code.   * + * @s_dv_timings: Set custom dv timings in the sub device. This is used + *	when sub device is capable of setting detailed timing information + *	in the hardware to generate/detect the video signal. + * + * @g_dv_timings: Get custom dv timings in the sub device. + * + * @query_dv_timings: callback for VIDIOC_QUERY_DV_TIMINGS() ioctl handler code. + *   * @dv_timings_cap: callback for VIDIOC_SUBDEV_DV_TIMINGS_CAP() ioctl handler   *		    code.   * @@ -864,6 +860,12 @@ struct v4l2_subdev_pad_ops {  				  struct v4l2_subdev_frame_interval *interval);  	int (*get_edid)(struct v4l2_subdev *sd, struct v4l2_edid *edid);  	int (*set_edid)(struct v4l2_subdev *sd, struct v4l2_edid *edid); +	int (*s_dv_timings)(struct v4l2_subdev *sd, unsigned int pad, +			    struct v4l2_dv_timings *timings); +	int (*g_dv_timings)(struct v4l2_subdev *sd, unsigned int pad, +			    struct v4l2_dv_timings *timings); +	int (*query_dv_timings)(struct v4l2_subdev *sd, unsigned int pad, +				struct v4l2_dv_timings *timings);  	int (*dv_timings_cap)(struct v4l2_subdev *sd,  			      struct v4l2_dv_timings_cap *cap);  	int (*enum_dv_timings)(struct v4l2_subdev *sd, @@ -1725,6 +1727,46 @@ static inline void v4l2_subdev_unlock_state(struct v4l2_subdev_state *state)  }  /** + * v4l2_subdev_lock_states - Lock two sub-device states + * @state1: One subdevice state + * @state2: The other subdevice state + * + * Locks the state of two sub-devices. + * + * The states must be unlocked with v4l2_subdev_unlock_states() after use. + * + * This differs from calling v4l2_subdev_lock_state() on both states so that if + * the states share the same lock, the lock is acquired only once (so no + * deadlock occurs). The caller is responsible for ensuring the locks will + * always be acquired in the same order. + */ +static inline void v4l2_subdev_lock_states(struct v4l2_subdev_state *state1, +					   struct v4l2_subdev_state *state2) +{ +	mutex_lock(state1->lock); +	if (state1->lock != state2->lock) +		mutex_lock(state2->lock); +} + +/** + * v4l2_subdev_unlock_states() - Unlock two sub-device states + * @state1: One subdevice state + * @state2: The other subdevice state + * + * Unlocks the state of two sub-devices. + * + * This differs from calling v4l2_subdev_unlock_state() on both states so that + * if the states share the same lock, the lock is released only once. + */ +static inline void v4l2_subdev_unlock_states(struct v4l2_subdev_state *state1, +					     struct v4l2_subdev_state *state2) +{ +	mutex_unlock(state1->lock); +	if (state1->lock != state2->lock) +		mutex_unlock(state2->lock); +} + +/**   * v4l2_subdev_get_unlocked_active_state() - Checks that the active subdev state   *					     is unlocked and returns it   * @sd: The subdevice  |