aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/media/v4l2-core/v4l2-compat-ioctl32.c32
-rw-r--r--drivers/media/v4l2-core/v4l2-dev.c2
-rw-r--r--drivers/media/v4l2-core/v4l2-ioctl.c16
-rw-r--r--drivers/media/v4l2-core/v4l2-subdev.c4
-rw-r--r--include/media/v4l2-ioctl.h2
-rw-r--r--include/media/v4l2-subdev.h4
6 files changed, 37 insertions, 23 deletions
diff --git a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c b/drivers/media/v4l2-core/v4l2-compat-ioctl32.c
index 7e23e1920cc7..872f1ca78861 100644
--- a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c
+++ b/drivers/media/v4l2-core/v4l2-compat-ioctl32.c
@@ -740,7 +740,7 @@ static int put_v4l2_event32(struct v4l2_event *kp, struct v4l2_event32 __user *u
740 return 0; 740 return 0;
741} 741}
742 742
743struct v4l2_subdev_edid32 { 743struct v4l2_edid32 {
744 __u32 pad; 744 __u32 pad;
745 __u32 start_block; 745 __u32 start_block;
746 __u32 blocks; 746 __u32 blocks;
@@ -748,11 +748,11 @@ struct v4l2_subdev_edid32 {
748 compat_caddr_t edid; 748 compat_caddr_t edid;
749}; 749};
750 750
751static int get_v4l2_subdev_edid32(struct v4l2_subdev_edid *kp, struct v4l2_subdev_edid32 __user *up) 751static int get_v4l2_edid32(struct v4l2_edid *kp, struct v4l2_edid32 __user *up)
752{ 752{
753 u32 tmp; 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 get_user(kp->pad, &up->pad) || 756 get_user(kp->pad, &up->pad) ||
757 get_user(kp->start_block, &up->start_block) || 757 get_user(kp->start_block, &up->start_block) ||
758 get_user(kp->blocks, &up->blocks) || 758 get_user(kp->blocks, &up->blocks) ||
@@ -763,11 +763,11 @@ static int get_v4l2_subdev_edid32(struct v4l2_subdev_edid *kp, struct v4l2_subde
763 return 0; 763 return 0;
764} 764}
765 765
766static int put_v4l2_subdev_edid32(struct v4l2_subdev_edid *kp, struct v4l2_subdev_edid32 __user *up) 766static int put_v4l2_edid32(struct v4l2_edid *kp, struct v4l2_edid32 __user *up)
767{ 767{
768 u32 tmp = (u32)((unsigned long)kp->edid); 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 put_user(kp->pad, &up->pad) || 771 put_user(kp->pad, &up->pad) ||
772 put_user(kp->start_block, &up->start_block) || 772 put_user(kp->start_block, &up->start_block) ||
773 put_user(kp->blocks, &up->blocks) || 773 put_user(kp->blocks, &up->blocks) ||
@@ -787,8 +787,8 @@ static int put_v4l2_subdev_edid32(struct v4l2_subdev_edid *kp, struct v4l2_subde
787#define VIDIOC_DQBUF32 _IOWR('V', 17, struct v4l2_buffer32) 787#define VIDIOC_DQBUF32 _IOWR('V', 17, struct v4l2_buffer32)
788#define VIDIOC_ENUMSTD32 _IOWR('V', 25, struct v4l2_standard32) 788#define VIDIOC_ENUMSTD32 _IOWR('V', 25, struct v4l2_standard32)
789#define VIDIOC_ENUMINPUT32 _IOWR('V', 26, struct v4l2_input32) 789#define VIDIOC_ENUMINPUT32 _IOWR('V', 26, struct v4l2_input32)
790#define VIDIOC_SUBDEV_G_EDID32 _IOWR('V', 40, struct v4l2_subdev_edid32) 790#define VIDIOC_G_EDID32 _IOWR('V', 40, struct v4l2_edid32)
791#define VIDIOC_SUBDEV_S_EDID32 _IOWR('V', 41, struct v4l2_subdev_edid32) 791#define VIDIOC_S_EDID32 _IOWR('V', 41, struct v4l2_edid32)
792#define VIDIOC_TRY_FMT32 _IOWR('V', 64, struct v4l2_format32) 792#define VIDIOC_TRY_FMT32 _IOWR('V', 64, struct v4l2_format32)
793#define VIDIOC_G_EXT_CTRLS32 _IOWR('V', 71, struct v4l2_ext_controls32) 793#define VIDIOC_G_EXT_CTRLS32 _IOWR('V', 71, struct v4l2_ext_controls32)
794#define VIDIOC_S_EXT_CTRLS32 _IOWR('V', 72, struct v4l2_ext_controls32) 794#define VIDIOC_S_EXT_CTRLS32 _IOWR('V', 72, struct v4l2_ext_controls32)
@@ -816,7 +816,7 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar
816 struct v4l2_ext_controls v2ecs; 816 struct v4l2_ext_controls v2ecs;
817 struct v4l2_event v2ev; 817 struct v4l2_event v2ev;
818 struct v4l2_create_buffers v2crt; 818 struct v4l2_create_buffers v2crt;
819 struct v4l2_subdev_edid v2edid; 819 struct v4l2_edid v2edid;
820 unsigned long vx; 820 unsigned long vx;
821 int vi; 821 int vi;
822 } karg; 822 } karg;
@@ -849,8 +849,8 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar
849 case VIDIOC_S_OUTPUT32: cmd = VIDIOC_S_OUTPUT; break; 849 case VIDIOC_S_OUTPUT32: cmd = VIDIOC_S_OUTPUT; break;
850 case VIDIOC_CREATE_BUFS32: cmd = VIDIOC_CREATE_BUFS; break; 850 case VIDIOC_CREATE_BUFS32: cmd = VIDIOC_CREATE_BUFS; break;
851 case VIDIOC_PREPARE_BUF32: cmd = VIDIOC_PREPARE_BUF; break; 851 case VIDIOC_PREPARE_BUF32: cmd = VIDIOC_PREPARE_BUF; break;
852 case VIDIOC_SUBDEV_G_EDID32: cmd = VIDIOC_SUBDEV_G_EDID; break; 852 case VIDIOC_G_EDID32: cmd = VIDIOC_G_EDID; break;
853 case VIDIOC_SUBDEV_S_EDID32: cmd = VIDIOC_SUBDEV_S_EDID; break; 853 case VIDIOC_S_EDID32: cmd = VIDIOC_S_EDID; break;
854 } 854 }
855 855
856 switch (cmd) { 856 switch (cmd) {
@@ -868,9 +868,9 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar
868 compatible_arg = 0; 868 compatible_arg = 0;
869 break; 869 break;
870 870
871 case VIDIOC_SUBDEV_G_EDID: 871 case VIDIOC_G_EDID:
872 case VIDIOC_SUBDEV_S_EDID: 872 case VIDIOC_S_EDID:
873 err = get_v4l2_subdev_edid32(&karg.v2edid, up); 873 err = get_v4l2_edid32(&karg.v2edid, up);
874 compatible_arg = 0; 874 compatible_arg = 0;
875 break; 875 break;
876 876
@@ -966,9 +966,9 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar
966 err = put_v4l2_event32(&karg.v2ev, up); 966 err = put_v4l2_event32(&karg.v2ev, up);
967 break; 967 break;
968 968
969 case VIDIOC_SUBDEV_G_EDID: 969 case VIDIOC_G_EDID:
970 case VIDIOC_SUBDEV_S_EDID: 970 case VIDIOC_S_EDID:
971 err = put_v4l2_subdev_edid32(&karg.v2edid, up); 971 err = put_v4l2_edid32(&karg.v2edid, up);
972 break; 972 break;
973 973
974 case VIDIOC_G_FMT: 974 case VIDIOC_G_FMT:
diff --git a/drivers/media/v4l2-core/v4l2-dev.c b/drivers/media/v4l2-core/v4l2-dev.c
index 95112f686ef0..634d863c05b4 100644
--- a/drivers/media/v4l2-core/v4l2-dev.c
+++ b/drivers/media/v4l2-core/v4l2-dev.c
@@ -701,6 +701,7 @@ static void determine_valid_ioctls(struct video_device *vdev)
701 SET_VALID_IOCTL(ops, VIDIOC_G_AUDIO, vidioc_g_audio); 701 SET_VALID_IOCTL(ops, VIDIOC_G_AUDIO, vidioc_g_audio);
702 SET_VALID_IOCTL(ops, VIDIOC_S_AUDIO, vidioc_s_audio); 702 SET_VALID_IOCTL(ops, VIDIOC_S_AUDIO, vidioc_s_audio);
703 SET_VALID_IOCTL(ops, VIDIOC_QUERY_DV_TIMINGS, vidioc_query_dv_timings); 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 if (is_tx) { 706 if (is_tx) {
706 SET_VALID_IOCTL(ops, VIDIOC_ENUMOUTPUT, vidioc_enum_output); 707 SET_VALID_IOCTL(ops, VIDIOC_ENUMOUTPUT, vidioc_enum_output);
@@ -726,6 +727,7 @@ static void determine_valid_ioctls(struct video_device *vdev)
726 SET_VALID_IOCTL(ops, VIDIOC_G_DV_TIMINGS, vidioc_g_dv_timings); 727 SET_VALID_IOCTL(ops, VIDIOC_G_DV_TIMINGS, vidioc_g_dv_timings);
727 SET_VALID_IOCTL(ops, VIDIOC_ENUM_DV_TIMINGS, vidioc_enum_dv_timings); 728 SET_VALID_IOCTL(ops, VIDIOC_ENUM_DV_TIMINGS, vidioc_enum_dv_timings);
728 SET_VALID_IOCTL(ops, VIDIOC_DV_TIMINGS_CAP, vidioc_dv_timings_cap); 729 SET_VALID_IOCTL(ops, VIDIOC_DV_TIMINGS_CAP, vidioc_dv_timings_cap);
730 SET_VALID_IOCTL(ops, VIDIOC_G_EDID, vidioc_g_edid);
729 } 731 }
730 if (is_tx && (is_radio || is_sdr)) { 732 if (is_tx && (is_radio || is_sdr)) {
731 /* radio transmitter only ioctls */ 733 /* radio transmitter only ioctls */
diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c
index 95dd4f15ab6e..6536e15c45e5 100644
--- a/drivers/media/v4l2-core/v4l2-ioctl.c
+++ b/drivers/media/v4l2-core/v4l2-ioctl.c
@@ -844,6 +844,14 @@ static void v4l_print_freq_band(const void *arg, bool write_only)
844 p->rangehigh, p->modulation); 844 p->rangehigh, p->modulation);
845} 845}
846 846
847static 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
847static void v4l_print_u32(const void *arg, bool write_only) 855static void v4l_print_u32(const void *arg, bool write_only)
848{ 856{
849 pr_cont("value=%u\n", *(const u32 *)arg); 857 pr_cont("value=%u\n", *(const u32 *)arg);
@@ -2062,6 +2070,8 @@ static struct v4l2_ioctl_info v4l2_ioctls[] = {
2062 IOCTL_INFO_FNC(VIDIOC_QUERYMENU, v4l_querymenu, v4l_print_querymenu, INFO_FL_CTRL | INFO_FL_CLEAR(v4l2_querymenu, index)), 2070 IOCTL_INFO_FNC(VIDIOC_QUERYMENU, v4l_querymenu, v4l_print_querymenu, INFO_FL_CTRL | INFO_FL_CLEAR(v4l2_querymenu, index)),
2063 IOCTL_INFO_STD(VIDIOC_G_INPUT, vidioc_g_input, v4l_print_u32, 0), 2071 IOCTL_INFO_STD(VIDIOC_G_INPUT, vidioc_g_input, v4l_print_u32, 0),
2064 IOCTL_INFO_FNC(VIDIOC_S_INPUT, v4l_s_input, v4l_print_u32, INFO_FL_PRIO), 2072 IOCTL_INFO_FNC(VIDIOC_S_INPUT, v4l_s_input, v4l_print_u32, INFO_FL_PRIO),
2073 IOCTL_INFO_STD(VIDIOC_G_EDID, vidioc_g_edid, v4l_print_edid, INFO_FL_CLEAR(v4l2_edid, edid)),
2074 IOCTL_INFO_STD(VIDIOC_S_EDID, vidioc_s_edid, v4l_print_edid, INFO_FL_PRIO | INFO_FL_CLEAR(v4l2_edid, edid)),
2065 IOCTL_INFO_STD(VIDIOC_G_OUTPUT, vidioc_g_output, v4l_print_u32, 0), 2075 IOCTL_INFO_STD(VIDIOC_G_OUTPUT, vidioc_g_output, v4l_print_u32, 0),
2066 IOCTL_INFO_FNC(VIDIOC_S_OUTPUT, v4l_s_output, v4l_print_u32, INFO_FL_PRIO), 2076 IOCTL_INFO_FNC(VIDIOC_S_OUTPUT, v4l_s_output, v4l_print_u32, INFO_FL_PRIO),
2067 IOCTL_INFO_FNC(VIDIOC_ENUMOUTPUT, v4l_enumoutput, v4l_print_enumoutput, INFO_FL_CLEAR(v4l2_output, index)), 2077 IOCTL_INFO_FNC(VIDIOC_ENUMOUTPUT, v4l_enumoutput, v4l_print_enumoutput, INFO_FL_CLEAR(v4l2_output, index)),
@@ -2274,9 +2284,9 @@ static int check_array_args(unsigned int cmd, void *parg, size_t *array_size,
2274 break; 2284 break;
2275 } 2285 }
2276 2286
2277 case VIDIOC_SUBDEV_G_EDID: 2287 case VIDIOC_G_EDID:
2278 case VIDIOC_SUBDEV_S_EDID: { 2288 case VIDIOC_S_EDID: {
2279 struct v4l2_subdev_edid *edid = parg; 2289 struct v4l2_edid *edid = parg;
2280 2290
2281 if (edid->blocks) { 2291 if (edid->blocks) {
2282 if (edid->blocks > 256) { 2292 if (edid->blocks > 256) {
diff --git a/drivers/media/v4l2-core/v4l2-subdev.c b/drivers/media/v4l2-core/v4l2-subdev.c
index 60d2550c9ac8..aea84ac5688a 100644
--- a/drivers/media/v4l2-core/v4l2-subdev.c
+++ b/drivers/media/v4l2-core/v4l2-subdev.c
@@ -349,10 +349,10 @@ static long subdev_do_ioctl(struct file *file, unsigned int cmd, void *arg)
349 sd, pad, set_selection, subdev_fh, sel); 349 sd, pad, set_selection, subdev_fh, sel);
350 } 350 }
351 351
352 case VIDIOC_SUBDEV_G_EDID: 352 case VIDIOC_G_EDID:
353 return v4l2_subdev_call(sd, pad, get_edid, arg); 353 return v4l2_subdev_call(sd, pad, get_edid, arg);
354 354
355 case VIDIOC_SUBDEV_S_EDID: 355 case VIDIOC_S_EDID:
356 return v4l2_subdev_call(sd, pad, set_edid, arg); 356 return v4l2_subdev_call(sd, pad, set_edid, arg);
357#endif 357#endif
358 default: 358 default:
diff --git a/include/media/v4l2-ioctl.h b/include/media/v4l2-ioctl.h
index 8be32f5824bf..50cf7c110a70 100644
--- a/include/media/v4l2-ioctl.h
+++ b/include/media/v4l2-ioctl.h
@@ -273,6 +273,8 @@ struct v4l2_ioctl_ops {
273 struct v4l2_enum_dv_timings *timings); 273 struct v4l2_enum_dv_timings *timings);
274 int (*vidioc_dv_timings_cap) (struct file *file, void *fh, 274 int (*vidioc_dv_timings_cap) (struct file *file, void *fh,
275 struct v4l2_dv_timings_cap *cap); 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 int (*vidioc_subscribe_event) (struct v4l2_fh *fh, 279 int (*vidioc_subscribe_event) (struct v4l2_fh *fh,
278 const struct v4l2_event_subscription *sub); 280 const struct v4l2_event_subscription *sub);
diff --git a/include/media/v4l2-subdev.h b/include/media/v4l2-subdev.h
index 1752530f69bc..855c928c29cd 100644
--- a/include/media/v4l2-subdev.h
+++ b/include/media/v4l2-subdev.h
@@ -507,8 +507,8 @@ struct v4l2_subdev_pad_ops {
507 struct v4l2_subdev_selection *sel); 507 struct v4l2_subdev_selection *sel);
508 int (*set_selection)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh, 508 int (*set_selection)(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
509 struct v4l2_subdev_selection *sel); 509 struct v4l2_subdev_selection *sel);
510 int (*get_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_subdev_edid *edid); 511 int (*set_edid)(struct v4l2_subdev *sd, struct v4l2_edid *edid);
512#ifdef CONFIG_MEDIA_CONTROLLER 512#ifdef CONFIG_MEDIA_CONTROLLER
513 int (*link_validate)(struct v4l2_subdev *sd, struct media_link *link, 513 int (*link_validate)(struct v4l2_subdev *sd, struct media_link *link,
514 struct v4l2_subdev_format *source_fmt, 514 struct v4l2_subdev_format *source_fmt,