v4l2-ioctl: fix function types for IOCTL_INFO_STD

Bug: 67506682
Change-Id: I0bfdb4a198e8fb8719ac6aa884fd39e163dbf762
Signed-off-by: Sami Tolvanen <samitolvanen@google.com>
This commit is contained in:
Sami Tolvanen
2017-08-18 10:00:51 -07:00
parent cb214f0c4c
commit 7ce8d9fa08

View File

@@ -2455,11 +2455,8 @@ struct v4l2_ioctl_info {
unsigned int ioctl;
u32 flags;
const char * const name;
union {
u32 offset;
int (*func)(const struct v4l2_ioctl_ops *ops,
struct file *file, void *fh, void *p);
} u;
int (*func)(const struct v4l2_ioctl_ops *ops, struct file *file,
void *fh, void *p);
void (*debug)(const void *arg, bool write_only);
};
@@ -2467,25 +2464,21 @@ struct v4l2_ioctl_info {
#define INFO_FL_PRIO (1 << 0)
/* This control can be valid if the filehandle passes a control handler. */
#define INFO_FL_CTRL (1 << 1)
/* This is a standard ioctl, no need for special code */
#define INFO_FL_STD (1 << 2)
/* This is ioctl has its own function */
#define INFO_FL_FUNC (1 << 3)
#define INFO_FL_FUNC (1 << 2)
/* Queuing ioctl */
#define INFO_FL_QUEUE (1 << 4)
#define INFO_FL_QUEUE (1 << 3)
/* Zero struct from after the field to the end */
#define INFO_FL_CLEAR(v4l2_struct, field) \
((offsetof(struct v4l2_struct, field) + \
sizeof(((struct v4l2_struct *)0)->field)) << 16)
#define INFO_FL_CLEAR_MASK (_IOC_SIZEMASK << 16)
#define IOCTL_INFO_STD(_ioctl, _vidioc, _debug, _flags) \
[_IOC_NR(_ioctl)] = { \
.ioctl = _ioctl, \
.flags = _flags | INFO_FL_STD, \
.name = #_ioctl, \
.u.offset = offsetof(struct v4l2_ioctl_ops, _vidioc), \
.debug = _debug, \
#define DEFINE_IOCTL_STD_FNC(_vidioc) \
static int __v4l_ ## _vidioc ## _fnc( \
const struct v4l2_ioctl_ops *ops, \
struct file *file, void *fh, void *p) { \
return ops->_vidioc(file, fh, p); \
}
#define IOCTL_INFO_FNC(_ioctl, _func, _debug, _flags) \
@@ -2493,10 +2486,44 @@ struct v4l2_ioctl_info {
.ioctl = _ioctl, \
.flags = _flags | INFO_FL_FUNC, \
.name = #_ioctl, \
.u.func = _func, \
.func = _func, \
.debug = _debug, \
}
#define IOCTL_INFO_STD(_ioctl, _vidioc, _debug, _flags) \
IOCTL_INFO_FNC(_ioctl, __v4l_ ## _vidioc ## _fnc, _debug, _flags)
DEFINE_IOCTL_STD_FNC(vidioc_g_fbuf)
DEFINE_IOCTL_STD_FNC(vidioc_s_fbuf)
DEFINE_IOCTL_STD_FNC(vidioc_expbuf)
DEFINE_IOCTL_STD_FNC(vidioc_g_std)
DEFINE_IOCTL_STD_FNC(vidioc_g_audio)
DEFINE_IOCTL_STD_FNC(vidioc_s_audio)
DEFINE_IOCTL_STD_FNC(vidioc_g_input)
DEFINE_IOCTL_STD_FNC(vidioc_g_edid)
DEFINE_IOCTL_STD_FNC(vidioc_s_edid)
DEFINE_IOCTL_STD_FNC(vidioc_g_output)
DEFINE_IOCTL_STD_FNC(vidioc_g_audout)
DEFINE_IOCTL_STD_FNC(vidioc_s_audout)
DEFINE_IOCTL_STD_FNC(vidioc_g_selection)
DEFINE_IOCTL_STD_FNC(vidioc_s_selection)
DEFINE_IOCTL_STD_FNC(vidioc_g_jpegcomp)
DEFINE_IOCTL_STD_FNC(vidioc_s_jpegcomp)
DEFINE_IOCTL_STD_FNC(vidioc_enumaudio)
DEFINE_IOCTL_STD_FNC(vidioc_enumaudout)
DEFINE_IOCTL_STD_FNC(vidioc_enum_framesizes)
DEFINE_IOCTL_STD_FNC(vidioc_enum_frameintervals)
DEFINE_IOCTL_STD_FNC(vidioc_g_enc_index)
DEFINE_IOCTL_STD_FNC(vidioc_encoder_cmd)
DEFINE_IOCTL_STD_FNC(vidioc_try_encoder_cmd)
DEFINE_IOCTL_STD_FNC(vidioc_decoder_cmd)
DEFINE_IOCTL_STD_FNC(vidioc_try_decoder_cmd)
DEFINE_IOCTL_STD_FNC(vidioc_s_dv_timings)
DEFINE_IOCTL_STD_FNC(vidioc_g_dv_timings)
DEFINE_IOCTL_STD_FNC(vidioc_enum_dv_timings)
DEFINE_IOCTL_STD_FNC(vidioc_query_dv_timings)
DEFINE_IOCTL_STD_FNC(vidioc_dv_timings_cap)
static struct v4l2_ioctl_info v4l2_ioctls[] = {
IOCTL_INFO_FNC(VIDIOC_QUERYCAP, v4l_querycap, v4l_print_querycap, 0),
IOCTL_INFO_FNC(VIDIOC_ENUM_FMT, v4l_enum_fmt, v4l_print_fmtdesc, INFO_FL_CLEAR(v4l2_fmtdesc, type)),
@@ -2681,14 +2708,8 @@ static long __video_do_ioctl(struct file *file,
}
write_only = _IOC_DIR(cmd) == _IOC_WRITE;
if (info->flags & INFO_FL_STD) {
typedef int (*vidioc_op)(struct file *file, void *fh, void *p);
const void *p = vfd->ioctl_ops;
const vidioc_op *vidioc = p + info->u.offset;
ret = (*vidioc)(file, fh, arg);
} else if (info->flags & INFO_FL_FUNC) {
ret = info->u.func(ops, file, fh, arg);
if (info->flags & INFO_FL_FUNC) {
ret = info->func(ops, file, fh, arg);
} else if (!ops->vidioc_default) {
ret = -ENOTTY;
} else {