Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[media] v4l2: add VIDIOC_G/S_EDID support to the v4l2 core

Support this ioctl as part of the v4l2 core. Use the new ioctl
name and struct v4l2_edid type in the existing core code.

Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>

authored by

Hans Verkuil and committed by
Mauro Carvalho Chehab
dd519bb3 254a4777

+37 -23
+16 -16
drivers/media/v4l2-core/v4l2-compat-ioctl32.c
··· 740 740 return 0; 741 741 } 742 742 743 - struct v4l2_subdev_edid32 { 743 + struct v4l2_edid32 { 744 744 __u32 pad; 745 745 __u32 start_block; 746 746 __u32 blocks; ··· 748 748 compat_caddr_t edid; 749 749 }; 750 750 751 - static int get_v4l2_subdev_edid32(struct v4l2_subdev_edid *kp, struct v4l2_subdev_edid32 __user *up) 751 + static int get_v4l2_edid32(struct v4l2_edid *kp, struct v4l2_edid32 __user *up) 752 752 { 753 753 u32 tmp; 754 754 755 - if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_subdev_edid32)) || 755 + if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_edid32)) || 756 756 get_user(kp->pad, &up->pad) || 757 757 get_user(kp->start_block, &up->start_block) || 758 758 get_user(kp->blocks, &up->blocks) || ··· 763 763 return 0; 764 764 } 765 765 766 - static int put_v4l2_subdev_edid32(struct v4l2_subdev_edid *kp, struct v4l2_subdev_edid32 __user *up) 766 + static int put_v4l2_edid32(struct v4l2_edid *kp, struct v4l2_edid32 __user *up) 767 767 { 768 768 u32 tmp = (u32)((unsigned long)kp->edid); 769 769 770 - if (!access_ok(VERIFY_WRITE, up, sizeof(struct v4l2_subdev_edid32)) || 770 + if (!access_ok(VERIFY_WRITE, up, sizeof(struct v4l2_edid32)) || 771 771 put_user(kp->pad, &up->pad) || 772 772 put_user(kp->start_block, &up->start_block) || 773 773 put_user(kp->blocks, &up->blocks) || ··· 787 787 #define VIDIOC_DQBUF32 _IOWR('V', 17, struct v4l2_buffer32) 788 788 #define VIDIOC_ENUMSTD32 _IOWR('V', 25, struct v4l2_standard32) 789 789 #define VIDIOC_ENUMINPUT32 _IOWR('V', 26, struct v4l2_input32) 790 - #define VIDIOC_SUBDEV_G_EDID32 _IOWR('V', 40, struct v4l2_subdev_edid32) 791 - #define VIDIOC_SUBDEV_S_EDID32 _IOWR('V', 41, struct v4l2_subdev_edid32) 790 + #define VIDIOC_G_EDID32 _IOWR('V', 40, struct v4l2_edid32) 791 + #define VIDIOC_S_EDID32 _IOWR('V', 41, struct v4l2_edid32) 792 792 #define VIDIOC_TRY_FMT32 _IOWR('V', 64, struct v4l2_format32) 793 793 #define VIDIOC_G_EXT_CTRLS32 _IOWR('V', 71, struct v4l2_ext_controls32) 794 794 #define VIDIOC_S_EXT_CTRLS32 _IOWR('V', 72, struct v4l2_ext_controls32) ··· 816 816 struct v4l2_ext_controls v2ecs; 817 817 struct v4l2_event v2ev; 818 818 struct v4l2_create_buffers v2crt; 819 - struct v4l2_subdev_edid v2edid; 819 + struct v4l2_edid v2edid; 820 820 unsigned long vx; 821 821 int vi; 822 822 } karg; ··· 849 849 case VIDIOC_S_OUTPUT32: cmd = VIDIOC_S_OUTPUT; break; 850 850 case VIDIOC_CREATE_BUFS32: cmd = VIDIOC_CREATE_BUFS; break; 851 851 case VIDIOC_PREPARE_BUF32: cmd = VIDIOC_PREPARE_BUF; break; 852 - case VIDIOC_SUBDEV_G_EDID32: cmd = VIDIOC_SUBDEV_G_EDID; break; 853 - case VIDIOC_SUBDEV_S_EDID32: cmd = VIDIOC_SUBDEV_S_EDID; break; 852 + case VIDIOC_G_EDID32: cmd = VIDIOC_G_EDID; break; 853 + case VIDIOC_S_EDID32: cmd = VIDIOC_S_EDID; break; 854 854 } 855 855 856 856 switch (cmd) { ··· 868 868 compatible_arg = 0; 869 869 break; 870 870 871 - case VIDIOC_SUBDEV_G_EDID: 872 - case VIDIOC_SUBDEV_S_EDID: 873 - err = get_v4l2_subdev_edid32(&karg.v2edid, up); 871 + case VIDIOC_G_EDID: 872 + case VIDIOC_S_EDID: 873 + err = get_v4l2_edid32(&karg.v2edid, up); 874 874 compatible_arg = 0; 875 875 break; 876 876 ··· 966 966 err = put_v4l2_event32(&karg.v2ev, up); 967 967 break; 968 968 969 - case VIDIOC_SUBDEV_G_EDID: 970 - case VIDIOC_SUBDEV_S_EDID: 971 - err = put_v4l2_subdev_edid32(&karg.v2edid, up); 969 + case VIDIOC_G_EDID: 970 + case VIDIOC_S_EDID: 971 + err = put_v4l2_edid32(&karg.v2edid, up); 972 972 break; 973 973 974 974 case VIDIOC_G_FMT:
+2
drivers/media/v4l2-core/v4l2-dev.c
··· 701 701 SET_VALID_IOCTL(ops, VIDIOC_G_AUDIO, vidioc_g_audio); 702 702 SET_VALID_IOCTL(ops, VIDIOC_S_AUDIO, vidioc_s_audio); 703 703 SET_VALID_IOCTL(ops, VIDIOC_QUERY_DV_TIMINGS, vidioc_query_dv_timings); 704 + SET_VALID_IOCTL(ops, VIDIOC_S_EDID, vidioc_s_edid); 704 705 } 705 706 if (is_tx) { 706 707 SET_VALID_IOCTL(ops, VIDIOC_ENUMOUTPUT, vidioc_enum_output); ··· 727 726 SET_VALID_IOCTL(ops, VIDIOC_G_DV_TIMINGS, vidioc_g_dv_timings); 728 727 SET_VALID_IOCTL(ops, VIDIOC_ENUM_DV_TIMINGS, vidioc_enum_dv_timings); 729 728 SET_VALID_IOCTL(ops, VIDIOC_DV_TIMINGS_CAP, vidioc_dv_timings_cap); 729 + SET_VALID_IOCTL(ops, VIDIOC_G_EDID, vidioc_g_edid); 730 730 } 731 731 if (is_tx && (is_radio || is_sdr)) { 732 732 /* radio transmitter only ioctls */
+13 -3
drivers/media/v4l2-core/v4l2-ioctl.c
··· 844 844 p->rangehigh, p->modulation); 845 845 } 846 846 847 + static void v4l_print_edid(const void *arg, bool write_only) 848 + { 849 + const struct v4l2_edid *p = arg; 850 + 851 + pr_cont("pad=%u, start_block=%u, blocks=%u\n", 852 + p->pad, p->start_block, p->blocks); 853 + } 854 + 847 855 static void v4l_print_u32(const void *arg, bool write_only) 848 856 { 849 857 pr_cont("value=%u\n", *(const u32 *)arg); ··· 2070 2062 IOCTL_INFO_FNC(VIDIOC_QUERYMENU, v4l_querymenu, v4l_print_querymenu, INFO_FL_CTRL | INFO_FL_CLEAR(v4l2_querymenu, index)), 2071 2063 IOCTL_INFO_STD(VIDIOC_G_INPUT, vidioc_g_input, v4l_print_u32, 0), 2072 2064 IOCTL_INFO_FNC(VIDIOC_S_INPUT, v4l_s_input, v4l_print_u32, INFO_FL_PRIO), 2065 + IOCTL_INFO_STD(VIDIOC_G_EDID, vidioc_g_edid, v4l_print_edid, INFO_FL_CLEAR(v4l2_edid, edid)), 2066 + IOCTL_INFO_STD(VIDIOC_S_EDID, vidioc_s_edid, v4l_print_edid, INFO_FL_PRIO | INFO_FL_CLEAR(v4l2_edid, edid)), 2073 2067 IOCTL_INFO_STD(VIDIOC_G_OUTPUT, vidioc_g_output, v4l_print_u32, 0), 2074 2068 IOCTL_INFO_FNC(VIDIOC_S_OUTPUT, v4l_s_output, v4l_print_u32, INFO_FL_PRIO), 2075 2069 IOCTL_INFO_FNC(VIDIOC_ENUMOUTPUT, v4l_enumoutput, v4l_print_enumoutput, INFO_FL_CLEAR(v4l2_output, index)), ··· 2284 2274 break; 2285 2275 } 2286 2276 2287 - case VIDIOC_SUBDEV_G_EDID: 2288 - case VIDIOC_SUBDEV_S_EDID: { 2289 - struct v4l2_subdev_edid *edid = parg; 2277 + case VIDIOC_G_EDID: 2278 + case VIDIOC_S_EDID: { 2279 + struct v4l2_edid *edid = parg; 2290 2280 2291 2281 if (edid->blocks) { 2292 2282 if (edid->blocks > 256) {
+2 -2
drivers/media/v4l2-core/v4l2-subdev.c
··· 349 349 sd, pad, set_selection, subdev_fh, sel); 350 350 } 351 351 352 - case VIDIOC_SUBDEV_G_EDID: 352 + case VIDIOC_G_EDID: 353 353 return v4l2_subdev_call(sd, pad, get_edid, arg); 354 354 355 - case VIDIOC_SUBDEV_S_EDID: 355 + case VIDIOC_S_EDID: 356 356 return v4l2_subdev_call(sd, pad, set_edid, arg); 357 357 #endif 358 358 default:
+2
include/media/v4l2-ioctl.h
··· 273 273 struct v4l2_enum_dv_timings *timings); 274 274 int (*vidioc_dv_timings_cap) (struct file *file, void *fh, 275 275 struct v4l2_dv_timings_cap *cap); 276 + int (*vidioc_g_edid) (struct file *file, void *fh, struct v4l2_edid *edid); 277 + int (*vidioc_s_edid) (struct file *file, void *fh, struct v4l2_edid *edid); 276 278 277 279 int (*vidioc_subscribe_event) (struct v4l2_fh *fh, 278 280 const struct v4l2_event_subscription *sub);
+2 -2
include/media/v4l2-subdev.h
··· 507 507 struct v4l2_subdev_selection *sel); 508 508 int (*set_selection)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh, 509 509 struct v4l2_subdev_selection *sel); 510 - int (*get_edid)(struct v4l2_subdev *sd, struct v4l2_subdev_edid *edid); 511 - int (*set_edid)(struct v4l2_subdev *sd, struct v4l2_subdev_edid *edid); 510 + int (*get_edid)(struct v4l2_subdev *sd, struct v4l2_edid *edid); 511 + int (*set_edid)(struct v4l2_subdev *sd, struct v4l2_edid *edid); 512 512 #ifdef CONFIG_MEDIA_CONTROLLER 513 513 int (*link_validate)(struct v4l2_subdev *sd, struct media_link *link, 514 514 struct v4l2_subdev_format *source_fmt,