diff options
Diffstat (limited to 'include/media/v4l2-subdev.h')
| -rw-r--r-- | include/media/v4l2-subdev.h | 419 | 
1 files changed, 208 insertions, 211 deletions
diff --git a/include/media/v4l2-subdev.h b/include/media/v4l2-subdev.h index c1f90c1223a7..a9e6b8146279 100644 --- a/include/media/v4l2-subdev.h +++ b/include/media/v4l2-subdev.h @@ -452,12 +452,6 @@ enum v4l2_subdev_pre_streamon_flags {   *   * @g_pixelaspect: callback to return the pixelaspect ratio.   * - * @g_frame_interval: callback for VIDIOC_SUBDEV_G_FRAME_INTERVAL() - *		      ioctl handler code. - * - * @s_frame_interval: callback for VIDIOC_SUBDEV_S_FRAME_INTERVAL() - *		      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. @@ -496,10 +490,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 (*g_frame_interval)(struct v4l2_subdev *sd, -				struct v4l2_subdev_frame_interval *interval); -	int (*s_frame_interval)(struct v4l2_subdev *sd, -				struct v4l2_subdev_frame_interval *interval);  	int (*s_dv_timings)(struct v4l2_subdev *sd,  			struct v4l2_dv_timings *timings);  	int (*g_dv_timings)(struct v4l2_subdev *sd, @@ -688,21 +678,16 @@ struct v4l2_subdev_ir_ops {  /**   * struct v4l2_subdev_pad_config - Used for storing subdev pad information.   * - * @try_fmt: &struct v4l2_mbus_framefmt - * @try_crop: &struct v4l2_rect to be used for crop - * @try_compose: &struct v4l2_rect to be used for compose - * - * This structure only needs to be passed to the pad op if the 'which' field - * of the main argument is set to %V4L2_SUBDEV_FORMAT_TRY. For - * %V4L2_SUBDEV_FORMAT_ACTIVE it is safe to pass %NULL. - * - * Note: This struct is also used in active state, and the 'try' prefix is - * historical and to be removed. + * @format: &struct v4l2_mbus_framefmt + * @crop: &struct v4l2_rect to be used for crop + * @compose: &struct v4l2_rect to be used for compose + * @interval: frame interval   */  struct v4l2_subdev_pad_config { -	struct v4l2_mbus_framefmt try_fmt; -	struct v4l2_rect try_crop; -	struct v4l2_rect try_compose; +	struct v4l2_mbus_framefmt format; +	struct v4l2_rect crop; +	struct v4l2_rect compose; +	struct v4l2_fract interval;  };  /** @@ -714,6 +699,7 @@ struct v4l2_subdev_pad_config {   * @fmt: &struct v4l2_mbus_framefmt   * @crop: &struct v4l2_rect to be used for crop   * @compose: &struct v4l2_rect to be used for compose + * @interval: frame interval   *   * This structure stores configuration for a stream.   */ @@ -725,6 +711,7 @@ struct v4l2_subdev_stream_config {  	struct v4l2_mbus_framefmt fmt;  	struct v4l2_rect crop;  	struct v4l2_rect compose; +	struct v4l2_fract interval;  };  /** @@ -756,6 +743,7 @@ struct v4l2_subdev_krouting {   *   * @_lock: default for 'lock'   * @lock: mutex for the state. May be replaced by the user. + * @sd: the sub-device which the state is related to   * @pads: &struct v4l2_subdev_pad_config array   * @routing: routing table for the subdev   * @stream_configs: stream configurations (only for V4L2_SUBDEV_FL_STREAMS) @@ -768,6 +756,7 @@ struct v4l2_subdev_state {  	/* lock for the struct v4l2_subdev_state fields */  	struct mutex _lock;  	struct mutex *lock; +	struct v4l2_subdev *sd;  	struct v4l2_subdev_pad_config *pads;  	struct v4l2_subdev_krouting routing;  	struct v4l2_subdev_stream_configs stream_configs; @@ -776,7 +765,6 @@ struct v4l2_subdev_state {  /**   * struct v4l2_subdev_pad_ops - v4l2-subdev pad level operations   * - * @init_cfg: initialize the pad config to default values   * @enum_mbus_code: callback for VIDIOC_SUBDEV_ENUM_MBUS_CODE() ioctl handler   *		    code.   * @enum_frame_size: callback for VIDIOC_SUBDEV_ENUM_FRAME_SIZE() ioctl handler @@ -793,6 +781,12 @@ struct v4l2_subdev_state {   *   * @set_selection: callback for VIDIOC_SUBDEV_S_SELECTION() ioctl handler code.   * + * @get_frame_interval: callback for VIDIOC_SUBDEV_G_FRAME_INTERVAL() + *			ioctl handler code. + * + * @set_frame_interval: callback for VIDIOC_SUBDEV_S_FRAME_INTERVAL() + *			ioctl handler code. + *   * @get_edid: callback for VIDIOC_SUBDEV_G_EDID() ioctl handler code.   *   * @set_edid: callback for VIDIOC_SUBDEV_S_EDID() ioctl handler code. @@ -841,8 +835,6 @@ struct v4l2_subdev_state {   *	directly, use v4l2_subdev_disable_streams() instead.   */  struct v4l2_subdev_pad_ops { -	int (*init_cfg)(struct v4l2_subdev *sd, -			struct v4l2_subdev_state *state);  	int (*enum_mbus_code)(struct v4l2_subdev *sd,  			      struct v4l2_subdev_state *state,  			      struct v4l2_subdev_mbus_code_enum *code); @@ -864,6 +856,12 @@ struct v4l2_subdev_pad_ops {  	int (*set_selection)(struct v4l2_subdev *sd,  			     struct v4l2_subdev_state *state,  			     struct v4l2_subdev_selection *sel); +	int (*get_frame_interval)(struct v4l2_subdev *sd, +				  struct v4l2_subdev_state *state, +				  struct v4l2_subdev_frame_interval *interval); +	int (*set_frame_interval)(struct v4l2_subdev *sd, +				  struct v4l2_subdev_state *state, +				  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 (*dv_timings_cap)(struct v4l2_subdev *sd, @@ -919,6 +917,8 @@ struct v4l2_subdev_ops {  /**   * struct v4l2_subdev_internal_ops - V4L2 subdev internal ops   * + * @init_state: initialize the subdev state to default values + *   * @registered: called when this subdev is registered. When called the v4l2_dev   *	field is set to the correct v4l2_device.   * @@ -944,6 +944,8 @@ struct v4l2_subdev_ops {   *	these ops.   */  struct v4l2_subdev_internal_ops { +	int (*init_state)(struct v4l2_subdev *sd, +			  struct v4l2_subdev_state *state);  	int (*registered)(struct v4l2_subdev *sd);  	void (*unregistered)(struct v4l2_subdev *sd);  	int (*open)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh); @@ -1142,83 +1144,6 @@ struct v4l2_subdev_fh {  #define to_v4l2_subdev_fh(fh)	\  	container_of(fh, struct v4l2_subdev_fh, vfh) -#if defined(CONFIG_VIDEO_V4L2_SUBDEV_API) - -/** - * v4l2_subdev_get_pad_format - ancillary routine to call - *	&struct v4l2_subdev_pad_config->try_fmt - * - * @sd: pointer to &struct v4l2_subdev - * @state: pointer to &struct v4l2_subdev_state - * @pad: index of the pad in the &struct v4l2_subdev_state->pads array - */ -static inline struct v4l2_mbus_framefmt * -v4l2_subdev_get_pad_format(struct v4l2_subdev *sd, -			   struct v4l2_subdev_state *state, -			   unsigned int pad) -{ -	if (WARN_ON(!state)) -		return NULL; -	if (WARN_ON(pad >= sd->entity.num_pads)) -		pad = 0; -	return &state->pads[pad].try_fmt; -} - -/** - * v4l2_subdev_get_pad_crop - ancillary routine to call - *	&struct v4l2_subdev_pad_config->try_crop - * - * @sd: pointer to &struct v4l2_subdev - * @state: pointer to &struct v4l2_subdev_state. - * @pad: index of the pad in the &struct v4l2_subdev_state->pads array. - */ -static inline struct v4l2_rect * -v4l2_subdev_get_pad_crop(struct v4l2_subdev *sd, -			 struct v4l2_subdev_state *state, -			 unsigned int pad) -{ -	if (WARN_ON(!state)) -		return NULL; -	if (WARN_ON(pad >= sd->entity.num_pads)) -		pad = 0; -	return &state->pads[pad].try_crop; -} - -/** - * v4l2_subdev_get_pad_compose - ancillary routine to call - *	&struct v4l2_subdev_pad_config->try_compose - * - * @sd: pointer to &struct v4l2_subdev - * @state: pointer to &struct v4l2_subdev_state. - * @pad: index of the pad in the &struct v4l2_subdev_state->pads array. - */ -static inline struct v4l2_rect * -v4l2_subdev_get_pad_compose(struct v4l2_subdev *sd, -			    struct v4l2_subdev_state *state, -			    unsigned int pad) -{ -	if (WARN_ON(!state)) -		return NULL; -	if (WARN_ON(pad >= sd->entity.num_pads)) -		pad = 0; -	return &state->pads[pad].try_compose; -} - -/* - * Temprary helpers until uses of v4l2_subdev_get_try_* functions have been - * renamed - */ -#define v4l2_subdev_get_try_format(sd, state, pad) \ -	v4l2_subdev_get_pad_format(sd, state, pad) - -#define v4l2_subdev_get_try_crop(sd, state, pad) \ -	v4l2_subdev_get_pad_crop(sd, state, pad) - -#define v4l2_subdev_get_try_compose(sd, state, pad) \ -	v4l2_subdev_get_pad_compose(sd, state, pad) - -#endif /* CONFIG_VIDEO_V4L2_SUBDEV_API */ -  extern const struct v4l2_file_operations v4l2_subdev_fops;  /** @@ -1392,88 +1317,105 @@ int __v4l2_subdev_init_finalize(struct v4l2_subdev *sd, const char *name,   */  void v4l2_subdev_cleanup(struct v4l2_subdev *sd); -/** - * v4l2_subdev_lock_state() - Locks the subdev state - * @state: The subdevice state - * - * Locks the given subdev state. - * - * The state must be unlocked with v4l2_subdev_unlock_state() after use. +/* + * A macro to generate the macro or function name for sub-devices state access + * wrapper macros below.   */ -static inline void v4l2_subdev_lock_state(struct v4l2_subdev_state *state) -{ -	mutex_lock(state->lock); -} +#define __v4l2_subdev_state_gen_call(NAME, _1, ARG, ...)	\ +	__v4l2_subdev_state_get_ ## NAME ## ARG  /** - * v4l2_subdev_unlock_state() - Unlocks the subdev state - * @state: The subdevice state + * v4l2_subdev_state_get_format() - Get pointer to a stream format + * @state: subdevice state + * @pad: pad id + * @...: stream id (optional argument)   * - * Unlocks the given subdev state. + * This returns a pointer to &struct v4l2_mbus_framefmt for the given pad + + * stream in the subdev state. + * + * For stream-unaware drivers the format for the corresponding pad is returned. + * If the pad does not exist, NULL is returned.   */ -static inline void v4l2_subdev_unlock_state(struct v4l2_subdev_state *state) -{ -	mutex_unlock(state->lock); -} +/* + * Wrap v4l2_subdev_state_get_format(), allowing the function to be called with + * two or three arguments. The purpose of the __v4l2_subdev_state_get_format() + * macro below is to come up with the name of the function or macro to call, + * using the last two arguments (_stream and _pad). The selected function or + * macro is then called using the arguments specified by the caller. A similar + * arrangement is used for v4l2_subdev_state_crop() and + * v4l2_subdev_state_compose() below. + */ +#define v4l2_subdev_state_get_format(state, pad, ...)			\ +	__v4l2_subdev_state_gen_call(format, ##__VA_ARGS__, , _pad)	\ +		(state, pad, ##__VA_ARGS__) +#define __v4l2_subdev_state_get_format_pad(state, pad)	\ +	__v4l2_subdev_state_get_format(state, pad, 0) +struct v4l2_mbus_framefmt * +__v4l2_subdev_state_get_format(struct v4l2_subdev_state *state, +			       unsigned int pad, u32 stream);  /** - * v4l2_subdev_get_unlocked_active_state() - Checks that the active subdev state - *					     is unlocked and returns it - * @sd: The subdevice + * v4l2_subdev_state_get_crop() - Get pointer to a stream crop rectangle + * @state: subdevice state + * @pad: pad id + * @...: stream id (optional argument)   * - * Returns the active state for the subdevice, or NULL if the subdev does not - * support active state. If the state is not NULL, calls - * lockdep_assert_not_held() to issue a warning if the state is locked. + * This returns a pointer to crop rectangle for the given pad + stream in the + * subdev state.   * - * This function is to be used e.g. when getting the active state for the sole - * purpose of passing it forward, without accessing the state fields. + * For stream-unaware drivers the crop rectangle for the corresponding pad is + * returned. If the pad does not exist, NULL is returned.   */ -static inline struct v4l2_subdev_state * -v4l2_subdev_get_unlocked_active_state(struct v4l2_subdev *sd) -{ -	if (sd->active_state) -		lockdep_assert_not_held(sd->active_state->lock); -	return sd->active_state; -} +#define v4l2_subdev_state_get_crop(state, pad, ...)			\ +	__v4l2_subdev_state_gen_call(crop, ##__VA_ARGS__, , _pad)	\ +		(state, pad, ##__VA_ARGS__) +#define __v4l2_subdev_state_get_crop_pad(state, pad)	\ +	__v4l2_subdev_state_get_crop(state, pad, 0) +struct v4l2_rect * +__v4l2_subdev_state_get_crop(struct v4l2_subdev_state *state, unsigned int pad, +			     u32 stream);  /** - * v4l2_subdev_get_locked_active_state() - Checks that the active subdev state - *					   is locked and returns it - * - * @sd: The subdevice + * v4l2_subdev_state_get_compose() - Get pointer to a stream compose rectangle + * @state: subdevice state + * @pad: pad id + * @...: stream id (optional argument)   * - * Returns the active state for the subdevice, or NULL if the subdev does not - * support active state. If the state is not NULL, calls lockdep_assert_held() - * to issue a warning if the state is not locked. + * This returns a pointer to compose rectangle for the given pad + stream in the + * subdev state.   * - * This function is to be used when the caller knows that the active state is - * already locked. + * For stream-unaware drivers the compose rectangle for the corresponding pad is + * returned. If the pad does not exist, NULL is returned.   */ -static inline struct v4l2_subdev_state * -v4l2_subdev_get_locked_active_state(struct v4l2_subdev *sd) -{ -	if (sd->active_state) -		lockdep_assert_held(sd->active_state->lock); -	return sd->active_state; -} +#define v4l2_subdev_state_get_compose(state, pad, ...)			\ +	__v4l2_subdev_state_gen_call(compose, ##__VA_ARGS__, , _pad)	\ +		(state, pad, ##__VA_ARGS__) +#define __v4l2_subdev_state_get_compose_pad(state, pad)	\ +	__v4l2_subdev_state_get_compose(state, pad, 0) +struct v4l2_rect * +__v4l2_subdev_state_get_compose(struct v4l2_subdev_state *state, +				unsigned int pad, u32 stream);  /** - * v4l2_subdev_lock_and_get_active_state() - Locks and returns the active subdev - *					     state for the subdevice - * @sd: The subdevice + * v4l2_subdev_state_get_interval() - Get pointer to a stream frame interval + * @state: subdevice state + * @pad: pad id + * @...: stream id (optional argument)   * - * Returns the locked active state for the subdevice, or NULL if the subdev - * does not support active state. + * This returns a pointer to the frame interval for the given pad + stream in + * the subdev state.   * - * The state must be unlocked with v4l2_subdev_unlock_state() after use. + * For stream-unaware drivers the frame interval for the corresponding pad is + * returned. If the pad does not exist, NULL is returned.   */ -static inline struct v4l2_subdev_state * -v4l2_subdev_lock_and_get_active_state(struct v4l2_subdev *sd) -{ -	if (sd->active_state) -		v4l2_subdev_lock_state(sd->active_state); -	return sd->active_state; -} +#define v4l2_subdev_state_get_interval(state, pad, ...)			\ +	__v4l2_subdev_state_gen_call(interval, ##__VA_ARGS__, , _pad)	\ +		(state, pad, ##__VA_ARGS__) +#define __v4l2_subdev_state_get_interval_pad(state, pad)	\ +	__v4l2_subdev_state_get_interval(state, pad, 0) +struct v4l2_fract * +__v4l2_subdev_state_get_interval(struct v4l2_subdev_state *state, +				 unsigned int pad, u32 stream);  #if defined(CONFIG_VIDEO_V4L2_SUBDEV_API) @@ -1495,6 +1437,24 @@ int v4l2_subdev_get_fmt(struct v4l2_subdev *sd, struct v4l2_subdev_state *state,  			struct v4l2_subdev_format *format);  /** + * v4l2_subdev_get_frame_interval() - Fill frame interval based on state + * @sd: subdevice + * @state: subdevice state + * @fi: pointer to &struct v4l2_subdev_frame_interval + * + * Fill @fi->interval field based on the information in the @fi struct. + * + * This function can be used by the subdev drivers which support active state to + * implement v4l2_subdev_pad_ops.get_frame_interval if the subdev driver does + * not need to do anything special in their get_frame_interval op. + * + * Returns 0 on success, error value otherwise. + */ +int v4l2_subdev_get_frame_interval(struct v4l2_subdev *sd, +				   struct v4l2_subdev_state *state, +				   struct v4l2_subdev_frame_interval *fi); + +/**   * v4l2_subdev_set_routing() - Set given routing to subdev state   * @sd: The subdevice   * @state: The subdevice state @@ -1540,52 +1500,6 @@ int v4l2_subdev_set_routing_with_fmt(struct v4l2_subdev *sd,  				     const struct v4l2_mbus_framefmt *fmt);  /** - * v4l2_subdev_state_get_stream_format() - Get pointer to a stream format - * @state: subdevice state - * @pad: pad id - * @stream: stream id - * - * This returns a pointer to &struct v4l2_mbus_framefmt for the given pad + - * stream in the subdev state. - * - * If the state does not contain the given pad + stream, NULL is returned. - */ -struct v4l2_mbus_framefmt * -v4l2_subdev_state_get_stream_format(struct v4l2_subdev_state *state, -				    unsigned int pad, u32 stream); - -/** - * v4l2_subdev_state_get_stream_crop() - Get pointer to a stream crop rectangle - * @state: subdevice state - * @pad: pad id - * @stream: stream id - * - * This returns a pointer to crop rectangle for the given pad + stream in the - * subdev state. - * - * If the state does not contain the given pad + stream, NULL is returned. - */ -struct v4l2_rect * -v4l2_subdev_state_get_stream_crop(struct v4l2_subdev_state *state, -				  unsigned int pad, u32 stream); - -/** - * v4l2_subdev_state_get_stream_compose() - Get pointer to a stream compose - *					    rectangle - * @state: subdevice state - * @pad: pad id - * @stream: stream id - * - * This returns a pointer to compose rectangle for the given pad + stream in the - * subdev state. - * - * If the state does not contain the given pad + stream, NULL is returned. - */ -struct v4l2_rect * -v4l2_subdev_state_get_stream_compose(struct v4l2_subdev_state *state, -				     unsigned int pad, u32 stream); - -/**   * v4l2_subdev_routing_find_opposite_end() - Find the opposite stream   * @routing: routing used to find the opposite side   * @pad: pad id @@ -1787,6 +1701,89 @@ int v4l2_subdev_s_stream_helper(struct v4l2_subdev *sd, int enable);  #endif /* CONFIG_MEDIA_CONTROLLER */  /** + * v4l2_subdev_lock_state() - Locks the subdev state + * @state: The subdevice state + * + * Locks the given subdev state. + * + * The state must be unlocked with v4l2_subdev_unlock_state() after use. + */ +static inline void v4l2_subdev_lock_state(struct v4l2_subdev_state *state) +{ +	mutex_lock(state->lock); +} + +/** + * v4l2_subdev_unlock_state() - Unlocks the subdev state + * @state: The subdevice state + * + * Unlocks the given subdev state. + */ +static inline void v4l2_subdev_unlock_state(struct v4l2_subdev_state *state) +{ +	mutex_unlock(state->lock); +} + +/** + * v4l2_subdev_get_unlocked_active_state() - Checks that the active subdev state + *					     is unlocked and returns it + * @sd: The subdevice + * + * Returns the active state for the subdevice, or NULL if the subdev does not + * support active state. If the state is not NULL, calls + * lockdep_assert_not_held() to issue a warning if the state is locked. + * + * This function is to be used e.g. when getting the active state for the sole + * purpose of passing it forward, without accessing the state fields. + */ +static inline struct v4l2_subdev_state * +v4l2_subdev_get_unlocked_active_state(struct v4l2_subdev *sd) +{ +	if (sd->active_state) +		lockdep_assert_not_held(sd->active_state->lock); +	return sd->active_state; +} + +/** + * v4l2_subdev_get_locked_active_state() - Checks that the active subdev state + *					   is locked and returns it + * + * @sd: The subdevice + * + * Returns the active state for the subdevice, or NULL if the subdev does not + * support active state. If the state is not NULL, calls lockdep_assert_held() + * to issue a warning if the state is not locked. + * + * This function is to be used when the caller knows that the active state is + * already locked. + */ +static inline struct v4l2_subdev_state * +v4l2_subdev_get_locked_active_state(struct v4l2_subdev *sd) +{ +	if (sd->active_state) +		lockdep_assert_held(sd->active_state->lock); +	return sd->active_state; +} + +/** + * v4l2_subdev_lock_and_get_active_state() - Locks and returns the active subdev + *					     state for the subdevice + * @sd: The subdevice + * + * Returns the locked active state for the subdevice, or NULL if the subdev + * does not support active state. + * + * The state must be unlocked with v4l2_subdev_unlock_state() after use. + */ +static inline struct v4l2_subdev_state * +v4l2_subdev_lock_and_get_active_state(struct v4l2_subdev *sd) +{ +	if (sd->active_state) +		v4l2_subdev_lock_state(sd->active_state); +	return sd->active_state; +} + +/**   * v4l2_subdev_init - initializes the sub-device struct   *   * @sd: pointer to the &struct v4l2_subdev to be initialized  |