aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/gspca
diff options
context:
space:
mode:
authorHans Verkuil <hans.verkuil@cisco.com>2012-05-16 06:29:00 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-07-30 17:27:05 -0400
commit9bf0c43eee72f677aecd892d0b97a3070e27cd51 (patch)
tree215e301c074d0b449b76c6ef7d86b894b1b1c798 /drivers/media/video/gspca
parent6e937b7fb7a028ca4bfa289d2ca8feb018ffed9b (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.c198
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");
34struct sd { 34struct 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 */
66static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val);
67static int sd_getbrightness(struct gspca_dev *gspca_dev, __s32 *val);
68static int sd_setcontrast(struct gspca_dev *gspca_dev, __s32 val);
69static int sd_getcontrast(struct gspca_dev *gspca_dev, __s32 *val);
70static int sd_setcolors(struct gspca_dev *gspca_dev, __s32 val);
71static int sd_getcolors(struct gspca_dev *gspca_dev, __s32 *val);
72
73static 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
118static const struct v4l2_pix_format vga_mode[] = { 62static 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
937static void setbrightness(struct gspca_dev *gspca_dev) 877static 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
945static 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
952static void setcolors(struct gspca_dev *gspca_dev) 883static 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
959static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val) 888static 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
969static int sd_getbrightness(struct gspca_dev *gspca_dev, __s32 *val) 893static 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
977static 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
987static int sd_getcontrast(struct gspca_dev *gspca_dev, __s32 *val) 902static 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
995static int sd_setcolors(struct gspca_dev *gspca_dev, __s32 val) 914static 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
1005static 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
1013static int sd_set_jcomp(struct gspca_dev *gspca_dev, 942static 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
1029static int sd_get_jcomp(struct gspca_dev *gspca_dev, 946static 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 */
1042static const struct sd_desc sd_desc = { 971static 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,