mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 04:18:39 +08:00
media: v4l: subdev: Always compile sub-device state access functions
Compile sub-device state information access functions v4l2_subdev_state_get_{format,crop,compose} unconditionally as they are now also used by plain V4L2 drivers. Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
This commit is contained in:
parent
791765b426
commit
981e0d4c72
@ -1531,6 +1531,132 @@ void v4l2_subdev_cleanup(struct v4l2_subdev *sd)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(v4l2_subdev_cleanup);
|
||||
|
||||
struct v4l2_mbus_framefmt *
|
||||
__v4l2_subdev_state_get_format(struct v4l2_subdev_state *state,
|
||||
unsigned int pad, u32 stream)
|
||||
{
|
||||
struct v4l2_subdev_stream_configs *stream_configs;
|
||||
unsigned int i;
|
||||
|
||||
if (WARN_ON_ONCE(!state))
|
||||
return NULL;
|
||||
|
||||
if (state->pads) {
|
||||
if (stream)
|
||||
return NULL;
|
||||
|
||||
/*
|
||||
* Set the pad to 0 on error as this is aligned with the
|
||||
* behaviour of the pad state information access functions. The
|
||||
* purpose of setting pad to 0 here is to avoid accessing memory
|
||||
* outside the pads array, but still issuing warning of the
|
||||
* invalid access while making the caller's error handling
|
||||
* easier.
|
||||
*/
|
||||
if (WARN_ON_ONCE(pad >= state->sd->entity.num_pads))
|
||||
pad = 0;
|
||||
|
||||
return &state->pads[pad].format;
|
||||
}
|
||||
|
||||
lockdep_assert_held(state->lock);
|
||||
|
||||
stream_configs = &state->stream_configs;
|
||||
|
||||
for (i = 0; i < stream_configs->num_configs; ++i) {
|
||||
if (stream_configs->configs[i].pad == pad &&
|
||||
stream_configs->configs[i].stream == stream)
|
||||
return &stream_configs->configs[i].fmt;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__v4l2_subdev_state_get_format);
|
||||
|
||||
struct v4l2_rect *
|
||||
__v4l2_subdev_state_get_crop(struct v4l2_subdev_state *state, unsigned int pad,
|
||||
u32 stream)
|
||||
{
|
||||
struct v4l2_subdev_stream_configs *stream_configs;
|
||||
unsigned int i;
|
||||
|
||||
if (WARN_ON_ONCE(!state))
|
||||
return NULL;
|
||||
|
||||
if (state->pads) {
|
||||
if (stream)
|
||||
return NULL;
|
||||
|
||||
/*
|
||||
* Set the pad to 0 on error as this is aligned with the
|
||||
* behaviour of the pad state information access functions. The
|
||||
* purpose of setting pad to 0 here is to avoid accessing memory
|
||||
* outside the pads array, but still issuing warning of the
|
||||
* invalid access while making the caller's error handling
|
||||
* easier.
|
||||
*/
|
||||
if (WARN_ON_ONCE(pad >= state->sd->entity.num_pads))
|
||||
pad = 0;
|
||||
|
||||
return &state->pads[pad].crop;
|
||||
}
|
||||
|
||||
lockdep_assert_held(state->lock);
|
||||
|
||||
stream_configs = &state->stream_configs;
|
||||
|
||||
for (i = 0; i < stream_configs->num_configs; ++i) {
|
||||
if (stream_configs->configs[i].pad == pad &&
|
||||
stream_configs->configs[i].stream == stream)
|
||||
return &stream_configs->configs[i].crop;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__v4l2_subdev_state_get_crop);
|
||||
|
||||
struct v4l2_rect *
|
||||
__v4l2_subdev_state_get_compose(struct v4l2_subdev_state *state,
|
||||
unsigned int pad, u32 stream)
|
||||
{
|
||||
struct v4l2_subdev_stream_configs *stream_configs;
|
||||
unsigned int i;
|
||||
|
||||
if (WARN_ON_ONCE(!state))
|
||||
return NULL;
|
||||
|
||||
if (state->pads) {
|
||||
if (stream)
|
||||
return NULL;
|
||||
|
||||
/*
|
||||
* Set the pad to 0 on error as this is aligned with the
|
||||
* behaviour of the pad state information access functions. The
|
||||
* purpose of setting pad to 0 here is to avoid accessing memory
|
||||
* outside the pads array, but still issuing warning of the
|
||||
* invalid access while making the caller's error handling
|
||||
* easier.
|
||||
*/
|
||||
if (WARN_ON_ONCE(pad >= state->sd->entity.num_pads))
|
||||
pad = 0;
|
||||
|
||||
return &state->pads[pad].compose;
|
||||
}
|
||||
|
||||
lockdep_assert_held(state->lock);
|
||||
|
||||
stream_configs = &state->stream_configs;
|
||||
|
||||
for (i = 0; i < stream_configs->num_configs; ++i) {
|
||||
if (stream_configs->configs[i].pad == pad &&
|
||||
stream_configs->configs[i].stream == stream)
|
||||
return &stream_configs->configs[i].compose;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__v4l2_subdev_state_get_compose);
|
||||
|
||||
#if defined(CONFIG_VIDEO_V4L2_SUBDEV_API)
|
||||
|
||||
static int
|
||||
@ -1677,132 +1803,6 @@ int v4l2_subdev_set_routing_with_fmt(struct v4l2_subdev *sd,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(v4l2_subdev_set_routing_with_fmt);
|
||||
|
||||
struct v4l2_mbus_framefmt *
|
||||
__v4l2_subdev_state_get_format(struct v4l2_subdev_state *state,
|
||||
unsigned int pad, u32 stream)
|
||||
{
|
||||
struct v4l2_subdev_stream_configs *stream_configs;
|
||||
unsigned int i;
|
||||
|
||||
if (WARN_ON_ONCE(!state))
|
||||
return NULL;
|
||||
|
||||
if (state->pads) {
|
||||
if (stream)
|
||||
return NULL;
|
||||
|
||||
/*
|
||||
* Set the pad to 0 on error as this is aligned with the
|
||||
* behaviour of the pad state information access functions. The
|
||||
* purpose of setting pad to 0 here is to avoid accessing memory
|
||||
* outside the pads array, but still issuing warning of the
|
||||
* invalid access while making the caller's error handling
|
||||
* easier.
|
||||
*/
|
||||
if (WARN_ON_ONCE(pad >= state->sd->entity.num_pads))
|
||||
pad = 0;
|
||||
|
||||
return &state->pads[pad].format;
|
||||
}
|
||||
|
||||
lockdep_assert_held(state->lock);
|
||||
|
||||
stream_configs = &state->stream_configs;
|
||||
|
||||
for (i = 0; i < stream_configs->num_configs; ++i) {
|
||||
if (stream_configs->configs[i].pad == pad &&
|
||||
stream_configs->configs[i].stream == stream)
|
||||
return &stream_configs->configs[i].fmt;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__v4l2_subdev_state_get_format);
|
||||
|
||||
struct v4l2_rect *
|
||||
__v4l2_subdev_state_get_crop(struct v4l2_subdev_state *state, unsigned int pad,
|
||||
u32 stream)
|
||||
{
|
||||
struct v4l2_subdev_stream_configs *stream_configs;
|
||||
unsigned int i;
|
||||
|
||||
if (WARN_ON_ONCE(!state))
|
||||
return NULL;
|
||||
|
||||
if (state->pads) {
|
||||
if (stream)
|
||||
return NULL;
|
||||
|
||||
/*
|
||||
* Set the pad to 0 on error as this is aligned with the
|
||||
* behaviour of the pad state information access functions. The
|
||||
* purpose of setting pad to 0 here is to avoid accessing memory
|
||||
* outside the pads array, but still issuing warning of the
|
||||
* invalid access while making the caller's error handling
|
||||
* easier.
|
||||
*/
|
||||
if (WARN_ON_ONCE(pad >= state->sd->entity.num_pads))
|
||||
pad = 0;
|
||||
|
||||
return &state->pads[pad].crop;
|
||||
}
|
||||
|
||||
lockdep_assert_held(state->lock);
|
||||
|
||||
stream_configs = &state->stream_configs;
|
||||
|
||||
for (i = 0; i < stream_configs->num_configs; ++i) {
|
||||
if (stream_configs->configs[i].pad == pad &&
|
||||
stream_configs->configs[i].stream == stream)
|
||||
return &stream_configs->configs[i].crop;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__v4l2_subdev_state_get_crop);
|
||||
|
||||
struct v4l2_rect *
|
||||
__v4l2_subdev_state_get_compose(struct v4l2_subdev_state *state,
|
||||
unsigned int pad, u32 stream)
|
||||
{
|
||||
struct v4l2_subdev_stream_configs *stream_configs;
|
||||
unsigned int i;
|
||||
|
||||
if (WARN_ON_ONCE(!state))
|
||||
return NULL;
|
||||
|
||||
if (state->pads) {
|
||||
if (stream)
|
||||
return NULL;
|
||||
|
||||
/*
|
||||
* Set the pad to 0 on error as this is aligned with the
|
||||
* behaviour of the pad state information access functions. The
|
||||
* purpose of setting pad to 0 here is to avoid accessing memory
|
||||
* outside the pads array, but still issuing warning of the
|
||||
* invalid access while making the caller's error handling
|
||||
* easier.
|
||||
*/
|
||||
if (WARN_ON_ONCE(pad >= state->sd->entity.num_pads))
|
||||
pad = 0;
|
||||
|
||||
return &state->pads[pad].compose;
|
||||
}
|
||||
|
||||
lockdep_assert_held(state->lock);
|
||||
|
||||
stream_configs = &state->stream_configs;
|
||||
|
||||
for (i = 0; i < stream_configs->num_configs; ++i) {
|
||||
if (stream_configs->configs[i].pad == pad &&
|
||||
stream_configs->configs[i].stream == stream)
|
||||
return &stream_configs->configs[i].compose;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__v4l2_subdev_state_get_compose);
|
||||
|
||||
int v4l2_subdev_routing_find_opposite_end(const struct v4l2_subdev_krouting *routing,
|
||||
u32 pad, u32 stream, u32 *other_pad,
|
||||
u32 *other_stream)
|
||||
|
@ -1470,70 +1470,6 @@ v4l2_subdev_lock_and_get_active_state(struct v4l2_subdev *sd)
|
||||
return sd->active_state;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_VIDEO_V4L2_SUBDEV_API)
|
||||
|
||||
/**
|
||||
* v4l2_subdev_get_fmt() - Fill format based on state
|
||||
* @sd: subdevice
|
||||
* @state: subdevice state
|
||||
* @format: pointer to &struct v4l2_subdev_format
|
||||
*
|
||||
* Fill @format->format field based on the information in the @format struct.
|
||||
*
|
||||
* This function can be used by the subdev drivers which support active state to
|
||||
* implement v4l2_subdev_pad_ops.get_fmt if the subdev driver does not need to
|
||||
* do anything special in their get_fmt op.
|
||||
*
|
||||
* Returns 0 on success, error value otherwise.
|
||||
*/
|
||||
int v4l2_subdev_get_fmt(struct v4l2_subdev *sd, struct v4l2_subdev_state *state,
|
||||
struct v4l2_subdev_format *format);
|
||||
|
||||
/**
|
||||
* v4l2_subdev_set_routing() - Set given routing to subdev state
|
||||
* @sd: The subdevice
|
||||
* @state: The subdevice state
|
||||
* @routing: Routing that will be copied to subdev state
|
||||
*
|
||||
* This will release old routing table (if any) from the state, allocate
|
||||
* enough space for the given routing, and copy the routing.
|
||||
*
|
||||
* This can be used from the subdev driver's set_routing op, after validating
|
||||
* the routing.
|
||||
*/
|
||||
int v4l2_subdev_set_routing(struct v4l2_subdev *sd,
|
||||
struct v4l2_subdev_state *state,
|
||||
const struct v4l2_subdev_krouting *routing);
|
||||
|
||||
struct v4l2_subdev_route *
|
||||
__v4l2_subdev_next_active_route(const struct v4l2_subdev_krouting *routing,
|
||||
struct v4l2_subdev_route *route);
|
||||
|
||||
/**
|
||||
* for_each_active_route - iterate on all active routes of a routing table
|
||||
* @routing: The routing table
|
||||
* @route: The route iterator
|
||||
*/
|
||||
#define for_each_active_route(routing, route) \
|
||||
for ((route) = NULL; \
|
||||
((route) = __v4l2_subdev_next_active_route((routing), (route)));)
|
||||
|
||||
/**
|
||||
* v4l2_subdev_set_routing_with_fmt() - Set given routing and format to subdev
|
||||
* state
|
||||
* @sd: The subdevice
|
||||
* @state: The subdevice state
|
||||
* @routing: Routing that will be copied to subdev state
|
||||
* @fmt: Format used to initialize all the streams
|
||||
*
|
||||
* This is the same as v4l2_subdev_set_routing, but additionally initializes
|
||||
* all the streams using the given format.
|
||||
*/
|
||||
int v4l2_subdev_set_routing_with_fmt(struct v4l2_subdev *sd,
|
||||
struct v4l2_subdev_state *state,
|
||||
const struct v4l2_subdev_krouting *routing,
|
||||
const struct v4l2_mbus_framefmt *fmt);
|
||||
|
||||
/*
|
||||
* A macro to generate the macro or function name for sub-devices state access
|
||||
* wrapper macros below.
|
||||
@ -1613,6 +1549,70 @@ struct v4l2_rect *
|
||||
__v4l2_subdev_state_get_compose(struct v4l2_subdev_state *state,
|
||||
unsigned int pad, u32 stream);
|
||||
|
||||
#if defined(CONFIG_VIDEO_V4L2_SUBDEV_API)
|
||||
|
||||
/**
|
||||
* v4l2_subdev_get_fmt() - Fill format based on state
|
||||
* @sd: subdevice
|
||||
* @state: subdevice state
|
||||
* @format: pointer to &struct v4l2_subdev_format
|
||||
*
|
||||
* Fill @format->format field based on the information in the @format struct.
|
||||
*
|
||||
* This function can be used by the subdev drivers which support active state to
|
||||
* implement v4l2_subdev_pad_ops.get_fmt if the subdev driver does not need to
|
||||
* do anything special in their get_fmt op.
|
||||
*
|
||||
* Returns 0 on success, error value otherwise.
|
||||
*/
|
||||
int v4l2_subdev_get_fmt(struct v4l2_subdev *sd, struct v4l2_subdev_state *state,
|
||||
struct v4l2_subdev_format *format);
|
||||
|
||||
/**
|
||||
* v4l2_subdev_set_routing() - Set given routing to subdev state
|
||||
* @sd: The subdevice
|
||||
* @state: The subdevice state
|
||||
* @routing: Routing that will be copied to subdev state
|
||||
*
|
||||
* This will release old routing table (if any) from the state, allocate
|
||||
* enough space for the given routing, and copy the routing.
|
||||
*
|
||||
* This can be used from the subdev driver's set_routing op, after validating
|
||||
* the routing.
|
||||
*/
|
||||
int v4l2_subdev_set_routing(struct v4l2_subdev *sd,
|
||||
struct v4l2_subdev_state *state,
|
||||
const struct v4l2_subdev_krouting *routing);
|
||||
|
||||
struct v4l2_subdev_route *
|
||||
__v4l2_subdev_next_active_route(const struct v4l2_subdev_krouting *routing,
|
||||
struct v4l2_subdev_route *route);
|
||||
|
||||
/**
|
||||
* for_each_active_route - iterate on all active routes of a routing table
|
||||
* @routing: The routing table
|
||||
* @route: The route iterator
|
||||
*/
|
||||
#define for_each_active_route(routing, route) \
|
||||
for ((route) = NULL; \
|
||||
((route) = __v4l2_subdev_next_active_route((routing), (route)));)
|
||||
|
||||
/**
|
||||
* v4l2_subdev_set_routing_with_fmt() - Set given routing and format to subdev
|
||||
* state
|
||||
* @sd: The subdevice
|
||||
* @state: The subdevice state
|
||||
* @routing: Routing that will be copied to subdev state
|
||||
* @fmt: Format used to initialize all the streams
|
||||
*
|
||||
* This is the same as v4l2_subdev_set_routing, but additionally initializes
|
||||
* all the streams using the given format.
|
||||
*/
|
||||
int v4l2_subdev_set_routing_with_fmt(struct v4l2_subdev *sd,
|
||||
struct v4l2_subdev_state *state,
|
||||
const struct v4l2_subdev_krouting *routing,
|
||||
const struct v4l2_mbus_framefmt *fmt);
|
||||
|
||||
/**
|
||||
* v4l2_subdev_routing_find_opposite_end() - Find the opposite stream
|
||||
* @routing: routing used to find the opposite side
|
||||
|
Loading…
Reference in New Issue
Block a user