diff options
author | Hans Verkuil <hans.verkuil@cisco.com> | 2014-03-07 05:18:37 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <m.chehab@samsung.com> | 2014-03-11 09:06:53 -0400 |
commit | dd519bb34a09d86db720f8a65e7dee1a85b2e90f (patch) | |
tree | dc68633c2a98b9bb5015c5c39c230cc6f766f794 | |
parent | 254a47770163f9322333660ebdabf99ba49873da (diff) |
[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>
-rw-r--r-- | drivers/media/v4l2-core/v4l2-compat-ioctl32.c | 32 | ||||
-rw-r--r-- | drivers/media/v4l2-core/v4l2-dev.c | 2 | ||||
-rw-r--r-- | drivers/media/v4l2-core/v4l2-ioctl.c | 16 | ||||
-rw-r--r-- | drivers/media/v4l2-core/v4l2-subdev.c | 4 | ||||
-rw-r--r-- | include/media/v4l2-ioctl.h | 2 | ||||
-rw-r--r-- | include/media/v4l2-subdev.h | 4 |
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 | ||
743 | struct v4l2_subdev_edid32 { | 743 | struct 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 | ||
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 | 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 | ||
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 | 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 | ||
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 | static void v4l_print_u32(const void *arg, bool write_only) | 855 | static 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, |