mirror of https://gitee.com/openkylin/linux.git
[media] v4l2-ioctl.c: use the new table for preset/timings ioctls
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
f16f77b019
commit
efc626b013
|
@ -655,29 +655,35 @@ static void v4l_print_dbg_register(const void *arg, bool write_only)
|
|||
p->reg, p->val);
|
||||
}
|
||||
|
||||
static void v4l_print_u32(const void *arg, bool write_only)
|
||||
static void v4l_print_dv_enum_presets(const void *arg, bool write_only)
|
||||
{
|
||||
pr_cont("value=%u\n", *(const u32 *)arg);
|
||||
const struct v4l2_dv_enum_preset *p = arg;
|
||||
|
||||
pr_cont("index=%u, preset=%u, name=%s, width=%u, height=%u\n",
|
||||
p->index, p->preset, p->name, p->width, p->height);
|
||||
}
|
||||
|
||||
static void v4l_print_newline(const void *arg, bool write_only)
|
||||
static void v4l_print_dv_preset(const void *arg, bool write_only)
|
||||
{
|
||||
pr_cont("\n");
|
||||
const struct v4l2_dv_preset *p = arg;
|
||||
|
||||
pr_cont("preset=%u\n", p->preset);
|
||||
}
|
||||
|
||||
static void dbgtimings(struct video_device *vfd,
|
||||
const struct v4l2_dv_timings *p)
|
||||
static void v4l_print_dv_timings(const void *arg, bool write_only)
|
||||
{
|
||||
const struct v4l2_dv_timings *p = arg;
|
||||
|
||||
switch (p->type) {
|
||||
case V4L2_DV_BT_656_1120:
|
||||
dbgarg2("bt-656/1120:interlaced=%d,"
|
||||
" pixelclock=%lld,"
|
||||
" width=%d, height=%d, polarities=%x,"
|
||||
" hfrontporch=%d, hsync=%d,"
|
||||
" hbackporch=%d, vfrontporch=%d,"
|
||||
" vsync=%d, vbackporch=%d,"
|
||||
" il_vfrontporch=%d, il_vsync=%d,"
|
||||
" il_vbackporch=%d, standards=%x, flags=%x\n",
|
||||
pr_cont("type=bt-656/1120, interlaced=%u, "
|
||||
"pixelclock=%llu, "
|
||||
"width=%u, height=%u, polarities=0x%x, "
|
||||
"hfrontporch=%u, hsync=%u, "
|
||||
"hbackporch=%u, vfrontporch=%u, "
|
||||
"vsync=%u, vbackporch=%u, "
|
||||
"il_vfrontporch=%u, il_vsync=%u, "
|
||||
"il_vbackporch=%u, standards=0x%x, flags=0x%x\n",
|
||||
p->bt.interlaced, p->bt.pixelclock,
|
||||
p->bt.width, p->bt.height,
|
||||
p->bt.polarities, p->bt.hfrontporch,
|
||||
|
@ -688,11 +694,48 @@ static void dbgtimings(struct video_device *vfd,
|
|||
p->bt.standards, p->bt.flags);
|
||||
break;
|
||||
default:
|
||||
dbgarg2("Unknown type %d!\n", p->type);
|
||||
pr_cont("type=%d\n", p->type);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void v4l_print_enum_dv_timings(const void *arg, bool write_only)
|
||||
{
|
||||
const struct v4l2_enum_dv_timings *p = arg;
|
||||
|
||||
pr_cont("index=%u, ", p->index);
|
||||
v4l_print_dv_timings(&p->timings, write_only);
|
||||
}
|
||||
|
||||
static void v4l_print_dv_timings_cap(const void *arg, bool write_only)
|
||||
{
|
||||
const struct v4l2_dv_timings_cap *p = arg;
|
||||
|
||||
switch (p->type) {
|
||||
case V4L2_DV_BT_656_1120:
|
||||
pr_cont("type=bt-656/1120, width=%u-%u, height=%u-%u, "
|
||||
"pixelclock=%llu-%llu, standards=0x%x, capabilities=0x%x\n",
|
||||
p->bt.min_width, p->bt.max_width,
|
||||
p->bt.min_height, p->bt.max_height,
|
||||
p->bt.min_pixelclock, p->bt.max_pixelclock,
|
||||
p->bt.standards, p->bt.capabilities);
|
||||
break;
|
||||
default:
|
||||
pr_cont("type=%u\n", p->type);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void v4l_print_u32(const void *arg, bool write_only)
|
||||
{
|
||||
pr_cont("value=%u\n", *(const u32 *)arg);
|
||||
}
|
||||
|
||||
static void v4l_print_newline(const void *arg, bool write_only)
|
||||
{
|
||||
pr_cont("\n");
|
||||
}
|
||||
|
||||
static int check_ext_ctrls(struct v4l2_ext_controls *c, int allow_priv)
|
||||
{
|
||||
__u32 i;
|
||||
|
@ -1740,20 +1783,20 @@ static struct v4l2_ioctl_info v4l2_ioctls[] = {
|
|||
IOCTL_INFO_FNC(VIDIOC_DBG_G_REGISTER, v4l_dbg_g_register, v4l_print_dbg_register, 0),
|
||||
IOCTL_INFO_FNC(VIDIOC_DBG_G_CHIP_IDENT, v4l_dbg_g_chip_ident, v4l_print_dbg_chip_ident, 0),
|
||||
IOCTL_INFO_FNC(VIDIOC_S_HW_FREQ_SEEK, v4l_s_hw_freq_seek, v4l_print_hw_freq_seek, INFO_FL_PRIO),
|
||||
IOCTL_INFO(VIDIOC_ENUM_DV_PRESETS, 0),
|
||||
IOCTL_INFO(VIDIOC_S_DV_PRESET, INFO_FL_PRIO),
|
||||
IOCTL_INFO(VIDIOC_G_DV_PRESET, 0),
|
||||
IOCTL_INFO(VIDIOC_QUERY_DV_PRESET, 0),
|
||||
IOCTL_INFO(VIDIOC_S_DV_TIMINGS, INFO_FL_PRIO),
|
||||
IOCTL_INFO(VIDIOC_G_DV_TIMINGS, 0),
|
||||
IOCTL_INFO_STD(VIDIOC_ENUM_DV_PRESETS, vidioc_enum_dv_presets, v4l_print_dv_enum_presets, 0),
|
||||
IOCTL_INFO_STD(VIDIOC_S_DV_PRESET, vidioc_s_dv_preset, v4l_print_dv_preset, INFO_FL_PRIO),
|
||||
IOCTL_INFO_STD(VIDIOC_G_DV_PRESET, vidioc_g_dv_preset, v4l_print_dv_preset, 0),
|
||||
IOCTL_INFO_STD(VIDIOC_QUERY_DV_PRESET, vidioc_query_dv_preset, v4l_print_dv_preset, 0),
|
||||
IOCTL_INFO_STD(VIDIOC_S_DV_TIMINGS, vidioc_s_dv_timings, v4l_print_dv_timings, INFO_FL_PRIO),
|
||||
IOCTL_INFO_STD(VIDIOC_G_DV_TIMINGS, vidioc_g_dv_timings, v4l_print_dv_timings, 0),
|
||||
IOCTL_INFO(VIDIOC_DQEVENT, 0),
|
||||
IOCTL_INFO(VIDIOC_SUBSCRIBE_EVENT, 0),
|
||||
IOCTL_INFO(VIDIOC_UNSUBSCRIBE_EVENT, 0),
|
||||
IOCTL_INFO_FNC(VIDIOC_CREATE_BUFS, v4l_create_bufs, v4l_print_create_buffers, INFO_FL_PRIO),
|
||||
IOCTL_INFO_FNC(VIDIOC_PREPARE_BUF, v4l_prepare_buf, v4l_print_buffer, 0),
|
||||
IOCTL_INFO(VIDIOC_ENUM_DV_TIMINGS, 0),
|
||||
IOCTL_INFO(VIDIOC_QUERY_DV_TIMINGS, 0),
|
||||
IOCTL_INFO(VIDIOC_DV_TIMINGS_CAP, 0),
|
||||
IOCTL_INFO_STD(VIDIOC_ENUM_DV_TIMINGS, vidioc_enum_dv_timings, v4l_print_enum_dv_timings, 0),
|
||||
IOCTL_INFO_STD(VIDIOC_QUERY_DV_TIMINGS, vidioc_query_dv_timings, v4l_print_dv_timings, 0),
|
||||
IOCTL_INFO_STD(VIDIOC_DV_TIMINGS_CAP, vidioc_dv_timings_cap, v4l_print_dv_timings_cap, 0),
|
||||
};
|
||||
#define V4L2_IOCTLS ARRAY_SIZE(v4l2_ioctls)
|
||||
|
||||
|
@ -1938,122 +1981,6 @@ static long __video_do_ioctl(struct file *file,
|
|||
}
|
||||
break;
|
||||
}
|
||||
case VIDIOC_ENUM_DV_PRESETS:
|
||||
{
|
||||
struct v4l2_dv_enum_preset *p = arg;
|
||||
|
||||
ret = ops->vidioc_enum_dv_presets(file, fh, p);
|
||||
if (!ret)
|
||||
dbgarg(cmd,
|
||||
"index=%d, preset=%d, name=%s, width=%d,"
|
||||
" height=%d ",
|
||||
p->index, p->preset, p->name, p->width,
|
||||
p->height);
|
||||
break;
|
||||
}
|
||||
case VIDIOC_S_DV_PRESET:
|
||||
{
|
||||
struct v4l2_dv_preset *p = arg;
|
||||
|
||||
dbgarg(cmd, "preset=%d\n", p->preset);
|
||||
ret = ops->vidioc_s_dv_preset(file, fh, p);
|
||||
break;
|
||||
}
|
||||
case VIDIOC_G_DV_PRESET:
|
||||
{
|
||||
struct v4l2_dv_preset *p = arg;
|
||||
|
||||
ret = ops->vidioc_g_dv_preset(file, fh, p);
|
||||
if (!ret)
|
||||
dbgarg(cmd, "preset=%d\n", p->preset);
|
||||
break;
|
||||
}
|
||||
case VIDIOC_QUERY_DV_PRESET:
|
||||
{
|
||||
struct v4l2_dv_preset *p = arg;
|
||||
|
||||
ret = ops->vidioc_query_dv_preset(file, fh, p);
|
||||
if (!ret)
|
||||
dbgarg(cmd, "preset=%d\n", p->preset);
|
||||
break;
|
||||
}
|
||||
case VIDIOC_S_DV_TIMINGS:
|
||||
{
|
||||
struct v4l2_dv_timings *p = arg;
|
||||
|
||||
dbgtimings(vfd, p);
|
||||
switch (p->type) {
|
||||
case V4L2_DV_BT_656_1120:
|
||||
ret = ops->vidioc_s_dv_timings(file, fh, p);
|
||||
break;
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case VIDIOC_G_DV_TIMINGS:
|
||||
{
|
||||
struct v4l2_dv_timings *p = arg;
|
||||
|
||||
ret = ops->vidioc_g_dv_timings(file, fh, p);
|
||||
if (!ret)
|
||||
dbgtimings(vfd, p);
|
||||
break;
|
||||
}
|
||||
case VIDIOC_ENUM_DV_TIMINGS:
|
||||
{
|
||||
struct v4l2_enum_dv_timings *p = arg;
|
||||
|
||||
if (!ops->vidioc_enum_dv_timings)
|
||||
break;
|
||||
|
||||
ret = ops->vidioc_enum_dv_timings(file, fh, p);
|
||||
if (!ret) {
|
||||
dbgarg(cmd, "index=%d: ", p->index);
|
||||
dbgtimings(vfd, &p->timings);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case VIDIOC_QUERY_DV_TIMINGS:
|
||||
{
|
||||
struct v4l2_dv_timings *p = arg;
|
||||
|
||||
if (!ops->vidioc_query_dv_timings)
|
||||
break;
|
||||
|
||||
ret = ops->vidioc_query_dv_timings(file, fh, p);
|
||||
if (!ret)
|
||||
dbgtimings(vfd, p);
|
||||
break;
|
||||
}
|
||||
case VIDIOC_DV_TIMINGS_CAP:
|
||||
{
|
||||
struct v4l2_dv_timings_cap *p = arg;
|
||||
|
||||
if (!ops->vidioc_dv_timings_cap)
|
||||
break;
|
||||
|
||||
ret = ops->vidioc_dv_timings_cap(file, fh, p);
|
||||
if (ret)
|
||||
break;
|
||||
switch (p->type) {
|
||||
case V4L2_DV_BT_656_1120:
|
||||
dbgarg(cmd,
|
||||
"type=%d, width=%u-%u, height=%u-%u, "
|
||||
"pixelclock=%llu-%llu, standards=%x, capabilities=%x ",
|
||||
p->type,
|
||||
p->bt.min_width, p->bt.max_width,
|
||||
p->bt.min_height, p->bt.max_height,
|
||||
p->bt.min_pixelclock, p->bt.max_pixelclock,
|
||||
p->bt.standards, p->bt.capabilities);
|
||||
break;
|
||||
default:
|
||||
dbgarg(cmd, "unknown type ");
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case VIDIOC_DQEVENT:
|
||||
{
|
||||
struct v4l2_event *ev = arg;
|
||||
|
|
Loading…
Reference in New Issue