diff options
author | Hans Verkuil <hans.verkuil@cisco.com> | 2012-05-16 06:29:00 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2012-07-30 17:27:05 -0400 |
commit | 9bf0c43eee72f677aecd892d0b97a3070e27cd51 (patch) | |
tree | 215e301c074d0b449b76c6ef7d86b894b1b1c798 /drivers/media/video/gspca | |
parent | 6e937b7fb7a028ca4bfa289d2ca8feb018ffed9b (diff) |
[media] spca500: convert to the control framework
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/gspca')
-rw-r--r-- | drivers/media/video/gspca/spca500.c | 198 |
1 files changed, 63 insertions, 135 deletions
diff --git a/drivers/media/video/gspca/spca500.c b/drivers/media/video/gspca/spca500.c index 103984708c77..621b8095b0eb 100644 --- a/drivers/media/video/gspca/spca500.c +++ b/drivers/media/video/gspca/spca500.c | |||
@@ -34,10 +34,7 @@ MODULE_LICENSE("GPL"); | |||
34 | struct sd { | 34 | struct sd { |
35 | struct gspca_dev gspca_dev; /* !! must be the first item */ | 35 | struct gspca_dev gspca_dev; /* !! must be the first item */ |
36 | 36 | ||
37 | unsigned char brightness; | 37 | struct v4l2_ctrl *jpegqual; |
38 | unsigned char contrast; | ||
39 | unsigned char colors; | ||
40 | u8 quality; | ||
41 | #define QUALITY_MIN 70 | 38 | #define QUALITY_MIN 70 |
42 | #define QUALITY_MAX 95 | 39 | #define QUALITY_MAX 95 |
43 | #define QUALITY_DEF 85 | 40 | #define QUALITY_DEF 85 |
@@ -62,59 +59,6 @@ struct sd { | |||
62 | u8 jpeg_hdr[JPEG_HDR_SZ]; | 59 | u8 jpeg_hdr[JPEG_HDR_SZ]; |
63 | }; | 60 | }; |
64 | 61 | ||
65 | /* V4L2 controls supported by the driver */ | ||
66 | static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val); | ||
67 | static int sd_getbrightness(struct gspca_dev *gspca_dev, __s32 *val); | ||
68 | static int sd_setcontrast(struct gspca_dev *gspca_dev, __s32 val); | ||
69 | static int sd_getcontrast(struct gspca_dev *gspca_dev, __s32 *val); | ||
70 | static int sd_setcolors(struct gspca_dev *gspca_dev, __s32 val); | ||
71 | static int sd_getcolors(struct gspca_dev *gspca_dev, __s32 *val); | ||
72 | |||
73 | static const struct ctrl sd_ctrls[] = { | ||
74 | { | ||
75 | { | ||
76 | .id = V4L2_CID_BRIGHTNESS, | ||
77 | .type = V4L2_CTRL_TYPE_INTEGER, | ||
78 | .name = "Brightness", | ||
79 | .minimum = 0, | ||
80 | .maximum = 255, | ||
81 | .step = 1, | ||
82 | #define BRIGHTNESS_DEF 127 | ||
83 | .default_value = BRIGHTNESS_DEF, | ||
84 | }, | ||
85 | .set = sd_setbrightness, | ||
86 | .get = sd_getbrightness, | ||
87 | }, | ||
88 | { | ||
89 | { | ||
90 | .id = V4L2_CID_CONTRAST, | ||
91 | .type = V4L2_CTRL_TYPE_INTEGER, | ||
92 | .name = "Contrast", | ||
93 | .minimum = 0, | ||
94 | .maximum = 63, | ||
95 | .step = 1, | ||
96 | #define CONTRAST_DEF 31 | ||
97 | .default_value = CONTRAST_DEF, | ||
98 | }, | ||
99 | .set = sd_setcontrast, | ||
100 | .get = sd_getcontrast, | ||
101 | }, | ||
102 | { | ||
103 | { | ||
104 | .id = V4L2_CID_SATURATION, | ||
105 | .type = V4L2_CTRL_TYPE_INTEGER, | ||
106 | .name = "Color", | ||
107 | .minimum = 0, | ||
108 | .maximum = 63, | ||
109 | .step = 1, | ||
110 | #define COLOR_DEF 31 | ||
111 | .default_value = COLOR_DEF, | ||
112 | }, | ||
113 | .set = sd_setcolors, | ||
114 | .get = sd_getcolors, | ||
115 | }, | ||
116 | }; | ||
117 | |||
118 | static const struct v4l2_pix_format vga_mode[] = { | 62 | static const struct v4l2_pix_format vga_mode[] = { |
119 | {320, 240, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE, | 63 | {320, 240, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE, |
120 | .bytesperline = 320, | 64 | .bytesperline = 320, |
@@ -641,10 +585,6 @@ static int sd_config(struct gspca_dev *gspca_dev, | |||
641 | cam->cam_mode = sif_mode; | 585 | cam->cam_mode = sif_mode; |
642 | cam->nmodes = ARRAY_SIZE(sif_mode); | 586 | cam->nmodes = ARRAY_SIZE(sif_mode); |
643 | } | 587 | } |
644 | sd->brightness = BRIGHTNESS_DEF; | ||
645 | sd->contrast = CONTRAST_DEF; | ||
646 | sd->colors = COLOR_DEF; | ||
647 | sd->quality = QUALITY_DEF; | ||
648 | return 0; | 588 | return 0; |
649 | } | 589 | } |
650 | 590 | ||
@@ -673,7 +613,7 @@ static int sd_start(struct gspca_dev *gspca_dev) | |||
673 | /* create the JPEG header */ | 613 | /* create the JPEG header */ |
674 | jpeg_define(sd->jpeg_hdr, gspca_dev->height, gspca_dev->width, | 614 | jpeg_define(sd->jpeg_hdr, gspca_dev->height, gspca_dev->width, |
675 | 0x22); /* JPEG 411 */ | 615 | 0x22); /* JPEG 411 */ |
676 | jpeg_set_qual(sd->jpeg_hdr, sd->quality); | 616 | jpeg_set_qual(sd->jpeg_hdr, v4l2_ctrl_g_ctrl(sd->jpegqual)); |
677 | 617 | ||
678 | if (sd->subtype == LogitechClickSmart310) { | 618 | if (sd->subtype == LogitechClickSmart310) { |
679 | xmult = 0x16; | 619 | xmult = 0x16; |
@@ -934,117 +874,105 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, | |||
934 | gspca_frame_add(gspca_dev, INTER_PACKET, data, len); | 874 | gspca_frame_add(gspca_dev, INTER_PACKET, data, len); |
935 | } | 875 | } |
936 | 876 | ||
937 | static void setbrightness(struct gspca_dev *gspca_dev) | 877 | static void setbrightness(struct gspca_dev *gspca_dev, s32 val) |
938 | { | 878 | { |
939 | struct sd *sd = (struct sd *) gspca_dev; | ||
940 | |||
941 | reg_w(gspca_dev, 0x00, 0x8167, | 879 | reg_w(gspca_dev, 0x00, 0x8167, |
942 | (__u8) (sd->brightness - 128)); | 880 | (__u8) (val - 128)); |
943 | } | ||
944 | |||
945 | static void setcontrast(struct gspca_dev *gspca_dev) | ||
946 | { | ||
947 | struct sd *sd = (struct sd *) gspca_dev; | ||
948 | |||
949 | reg_w(gspca_dev, 0x00, 0x8168, sd->contrast); | ||
950 | } | 881 | } |
951 | 882 | ||
952 | static void setcolors(struct gspca_dev *gspca_dev) | 883 | static void setcontrast(struct gspca_dev *gspca_dev, s32 val) |
953 | { | 884 | { |
954 | struct sd *sd = (struct sd *) gspca_dev; | 885 | reg_w(gspca_dev, 0x00, 0x8168, val); |
955 | |||
956 | reg_w(gspca_dev, 0x00, 0x8169, sd->colors); | ||
957 | } | 886 | } |
958 | 887 | ||
959 | static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val) | 888 | static void setcolors(struct gspca_dev *gspca_dev, s32 val) |
960 | { | 889 | { |
961 | struct sd *sd = (struct sd *) gspca_dev; | 890 | reg_w(gspca_dev, 0x00, 0x8169, val); |
962 | |||
963 | sd->brightness = val; | ||
964 | if (gspca_dev->streaming) | ||
965 | setbrightness(gspca_dev); | ||
966 | return 0; | ||
967 | } | 891 | } |
968 | 892 | ||
969 | static int sd_getbrightness(struct gspca_dev *gspca_dev, __s32 *val) | 893 | static int sd_set_jcomp(struct gspca_dev *gspca_dev, |
970 | { | 894 | struct v4l2_jpegcompression *jcomp) |
971 | struct sd *sd = (struct sd *) gspca_dev; | ||
972 | |||
973 | *val = sd->brightness; | ||
974 | return 0; | ||
975 | } | ||
976 | |||
977 | static int sd_setcontrast(struct gspca_dev *gspca_dev, __s32 val) | ||
978 | { | 895 | { |
979 | struct sd *sd = (struct sd *) gspca_dev; | 896 | struct sd *sd = (struct sd *) gspca_dev; |
980 | 897 | ||
981 | sd->contrast = val; | 898 | v4l2_ctrl_s_ctrl(sd->jpegqual, jcomp->quality); |
982 | if (gspca_dev->streaming) | ||
983 | setcontrast(gspca_dev); | ||
984 | return 0; | 899 | return 0; |
985 | } | 900 | } |
986 | 901 | ||
987 | static int sd_getcontrast(struct gspca_dev *gspca_dev, __s32 *val) | 902 | static int sd_get_jcomp(struct gspca_dev *gspca_dev, |
903 | struct v4l2_jpegcompression *jcomp) | ||
988 | { | 904 | { |
989 | struct sd *sd = (struct sd *) gspca_dev; | 905 | struct sd *sd = (struct sd *) gspca_dev; |
990 | 906 | ||
991 | *val = sd->contrast; | 907 | memset(jcomp, 0, sizeof *jcomp); |
908 | jcomp->quality = v4l2_ctrl_g_ctrl(sd->jpegqual); | ||
909 | jcomp->jpeg_markers = V4L2_JPEG_MARKER_DHT | ||
910 | | V4L2_JPEG_MARKER_DQT; | ||
992 | return 0; | 911 | return 0; |
993 | } | 912 | } |
994 | 913 | ||
995 | static int sd_setcolors(struct gspca_dev *gspca_dev, __s32 val) | 914 | static int sd_s_ctrl(struct v4l2_ctrl *ctrl) |
996 | { | 915 | { |
997 | struct sd *sd = (struct sd *) gspca_dev; | 916 | struct gspca_dev *gspca_dev = |
917 | container_of(ctrl->handler, struct gspca_dev, ctrl_handler); | ||
918 | struct sd *sd = (struct sd *)gspca_dev; | ||
998 | 919 | ||
999 | sd->colors = val; | 920 | gspca_dev->usb_err = 0; |
1000 | if (gspca_dev->streaming) | ||
1001 | setcolors(gspca_dev); | ||
1002 | return 0; | ||
1003 | } | ||
1004 | 921 | ||
1005 | static int sd_getcolors(struct gspca_dev *gspca_dev, __s32 *val) | 922 | if (!gspca_dev->streaming) |
1006 | { | 923 | return 0; |
1007 | struct sd *sd = (struct sd *) gspca_dev; | ||
1008 | 924 | ||
1009 | *val = sd->colors; | 925 | switch (ctrl->id) { |
1010 | return 0; | 926 | case V4L2_CID_BRIGHTNESS: |
927 | setbrightness(gspca_dev, ctrl->val); | ||
928 | break; | ||
929 | case V4L2_CID_CONTRAST: | ||
930 | setcontrast(gspca_dev, ctrl->val); | ||
931 | break; | ||
932 | case V4L2_CID_SATURATION: | ||
933 | setcolors(gspca_dev, ctrl->val); | ||
934 | break; | ||
935 | case V4L2_CID_JPEG_COMPRESSION_QUALITY: | ||
936 | jpeg_set_qual(sd->jpeg_hdr, ctrl->val); | ||
937 | break; | ||
938 | } | ||
939 | return gspca_dev->usb_err; | ||
1011 | } | 940 | } |
1012 | 941 | ||
1013 | static int sd_set_jcomp(struct gspca_dev *gspca_dev, | 942 | static const struct v4l2_ctrl_ops sd_ctrl_ops = { |
1014 | struct v4l2_jpegcompression *jcomp) | 943 | .s_ctrl = sd_s_ctrl, |
1015 | { | 944 | }; |
1016 | struct sd *sd = (struct sd *) gspca_dev; | ||
1017 | |||
1018 | if (jcomp->quality < QUALITY_MIN) | ||
1019 | sd->quality = QUALITY_MIN; | ||
1020 | else if (jcomp->quality > QUALITY_MAX) | ||
1021 | sd->quality = QUALITY_MAX; | ||
1022 | else | ||
1023 | sd->quality = jcomp->quality; | ||
1024 | if (gspca_dev->streaming) | ||
1025 | jpeg_set_qual(sd->jpeg_hdr, sd->quality); | ||
1026 | return 0; | ||
1027 | } | ||
1028 | 945 | ||
1029 | static int sd_get_jcomp(struct gspca_dev *gspca_dev, | 946 | static int sd_init_controls(struct gspca_dev *gspca_dev) |
1030 | struct v4l2_jpegcompression *jcomp) | ||
1031 | { | 947 | { |
1032 | struct sd *sd = (struct sd *) gspca_dev; | 948 | struct sd *sd = (struct sd *)gspca_dev; |
1033 | 949 | struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler; | |
1034 | memset(jcomp, 0, sizeof *jcomp); | 950 | |
1035 | jcomp->quality = sd->quality; | 951 | gspca_dev->vdev.ctrl_handler = hdl; |
1036 | jcomp->jpeg_markers = V4L2_JPEG_MARKER_DHT | 952 | v4l2_ctrl_handler_init(hdl, 4); |
1037 | | V4L2_JPEG_MARKER_DQT; | 953 | v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, |
954 | V4L2_CID_BRIGHTNESS, 0, 255, 1, 127); | ||
955 | v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, | ||
956 | V4L2_CID_CONTRAST, 0, 63, 1, 31); | ||
957 | v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, | ||
958 | V4L2_CID_SATURATION, 0, 63, 1, 31); | ||
959 | sd->jpegqual = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, | ||
960 | V4L2_CID_JPEG_COMPRESSION_QUALITY, | ||
961 | QUALITY_MIN, QUALITY_MAX, 1, QUALITY_DEF); | ||
962 | |||
963 | if (hdl->error) { | ||
964 | pr_err("Could not initialize controls\n"); | ||
965 | return hdl->error; | ||
966 | } | ||
1038 | return 0; | 967 | return 0; |
1039 | } | 968 | } |
1040 | 969 | ||
1041 | /* sub-driver description */ | 970 | /* sub-driver description */ |
1042 | static const struct sd_desc sd_desc = { | 971 | static const struct sd_desc sd_desc = { |
1043 | .name = MODULE_NAME, | 972 | .name = MODULE_NAME, |
1044 | .ctrls = sd_ctrls, | ||
1045 | .nctrls = ARRAY_SIZE(sd_ctrls), | ||
1046 | .config = sd_config, | 973 | .config = sd_config, |
1047 | .init = sd_init, | 974 | .init = sd_init, |
975 | .init_controls = sd_init_controls, | ||
1048 | .start = sd_start, | 976 | .start = sd_start, |
1049 | .stopN = sd_stopN, | 977 | .stopN = sd_stopN, |
1050 | .pkt_scan = sd_pkt_scan, | 978 | .pkt_scan = sd_pkt_scan, |