Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8d106c4f authored by Sami Tolvanen's avatar Sami Tolvanen
Browse files

ANDROID: v4l2-ioctl: fix function types for IOCTL_INFO_STD



Bug: 67506682
Change-Id: I0bfdb4a198e8fb8719ac6aa884fd39e163dbf762
Signed-off-by: default avatarSami Tolvanen <samitolvanen@google.com>
parent a4b6b9aa
Loading
Loading
Loading
Loading
+45 −26
Original line number Diff line number Diff line
@@ -2480,11 +2480,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);
};

@@ -2492,27 +2489,23 @@ 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)
/* Always copy back result, even on error */
#define INFO_FL_ALWAYS_COPY	(1 << 5)
#define INFO_FL_ALWAYS_COPY	(1 << 4)
/* 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)			\
@@ -2520,10 +2513,42 @@ 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_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)),
@@ -2708,14 +2733,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 {