aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/gspca/konica.c
diff options
context:
space:
mode:
authorHans Verkuil <hans.verkuil@cisco.com>2012-05-14 06:35:37 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-07-30 17:22:47 -0400
commit1bdee422cd9edea43a86f37a4ceb0081de6bd0bc (patch)
treec92965bc0c494db09e1833249d7ad7d9f542ca99 /drivers/media/video/gspca/konica.c
parentbfaab899e7c8ded57afe93ebed234b3688d9a898 (diff)
[media] gspca-konica: 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/konica.c')
-rw-r--r--drivers/media/video/gspca/konica.c260
1 files changed, 52 insertions, 208 deletions
diff --git a/drivers/media/video/gspca/konica.c b/drivers/media/video/gspca/konica.c
index f0c0d74dfe92..5dcfed208c31 100644
--- a/drivers/media/video/gspca/konica.c
+++ b/drivers/media/video/gspca/konica.c
@@ -50,107 +50,8 @@ struct sd {
50 struct gspca_dev gspca_dev; /* !! must be the first item */ 50 struct gspca_dev gspca_dev; /* !! must be the first item */
51 struct urb *last_data_urb; 51 struct urb *last_data_urb;
52 u8 snapshot_pressed; 52 u8 snapshot_pressed;
53 u8 brightness;
54 u8 contrast;
55 u8 saturation;
56 u8 whitebal;
57 u8 sharpness;
58}; 53};
59 54
60/* V4L2 controls supported by the driver */
61static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val);
62static int sd_getbrightness(struct gspca_dev *gspca_dev, __s32 *val);
63static int sd_setcontrast(struct gspca_dev *gspca_dev, __s32 val);
64static int sd_getcontrast(struct gspca_dev *gspca_dev, __s32 *val);
65static int sd_setsaturation(struct gspca_dev *gspca_dev, __s32 val);
66static int sd_getsaturation(struct gspca_dev *gspca_dev, __s32 *val);
67static int sd_setwhitebal(struct gspca_dev *gspca_dev, __s32 val);
68static int sd_getwhitebal(struct gspca_dev *gspca_dev, __s32 *val);
69static int sd_setsharpness(struct gspca_dev *gspca_dev, __s32 val);
70static int sd_getsharpness(struct gspca_dev *gspca_dev, __s32 *val);
71
72static const struct ctrl sd_ctrls[] = {
73#define SD_BRIGHTNESS 0
74 {
75 {
76 .id = V4L2_CID_BRIGHTNESS,
77 .type = V4L2_CTRL_TYPE_INTEGER,
78 .name = "Brightness",
79 .minimum = 0,
80 .maximum = 9,
81 .step = 1,
82#define BRIGHTNESS_DEFAULT 4
83 .default_value = BRIGHTNESS_DEFAULT,
84 .flags = 0,
85 },
86 .set = sd_setbrightness,
87 .get = sd_getbrightness,
88 },
89#define SD_CONTRAST 1
90 {
91 {
92 .id = V4L2_CID_CONTRAST,
93 .type = V4L2_CTRL_TYPE_INTEGER,
94 .name = "Contrast",
95 .minimum = 0,
96 .maximum = 9,
97 .step = 4,
98#define CONTRAST_DEFAULT 10
99 .default_value = CONTRAST_DEFAULT,
100 .flags = 0,
101 },
102 .set = sd_setcontrast,
103 .get = sd_getcontrast,
104 },
105#define SD_SATURATION 2
106 {
107 {
108 .id = V4L2_CID_SATURATION,
109 .type = V4L2_CTRL_TYPE_INTEGER,
110 .name = "Saturation",
111 .minimum = 0,
112 .maximum = 9,
113 .step = 1,
114#define SATURATION_DEFAULT 4
115 .default_value = SATURATION_DEFAULT,
116 .flags = 0,
117 },
118 .set = sd_setsaturation,
119 .get = sd_getsaturation,
120 },
121#define SD_WHITEBAL 3
122 {
123 {
124 .id = V4L2_CID_WHITE_BALANCE_TEMPERATURE,
125 .type = V4L2_CTRL_TYPE_INTEGER,
126 .name = "White Balance",
127 .minimum = 0,
128 .maximum = 33,
129 .step = 1,
130#define WHITEBAL_DEFAULT 25
131 .default_value = WHITEBAL_DEFAULT,
132 .flags = 0,
133 },
134 .set = sd_setwhitebal,
135 .get = sd_getwhitebal,
136 },
137#define SD_SHARPNESS 4
138 {
139 {
140 .id = V4L2_CID_SHARPNESS,
141 .type = V4L2_CTRL_TYPE_INTEGER,
142 .name = "Sharpness",
143 .minimum = 0,
144 .maximum = 9,
145 .step = 1,
146#define SHARPNESS_DEFAULT 4
147 .default_value = SHARPNESS_DEFAULT,
148 .flags = 0,
149 },
150 .set = sd_setsharpness,
151 .get = sd_getsharpness,
152 },
153};
154 55
155/* .priv is what goes to register 8 for this mode, known working values: 56/* .priv is what goes to register 8 for this mode, known working values:
156 0x00 -> 176x144, cropped 57 0x00 -> 176x144, cropped
@@ -242,18 +143,10 @@ static void konica_stream_off(struct gspca_dev *gspca_dev)
242static int sd_config(struct gspca_dev *gspca_dev, 143static int sd_config(struct gspca_dev *gspca_dev,
243 const struct usb_device_id *id) 144 const struct usb_device_id *id)
244{ 145{
245 struct sd *sd = (struct sd *) gspca_dev;
246
247 gspca_dev->cam.cam_mode = vga_mode; 146 gspca_dev->cam.cam_mode = vga_mode;
248 gspca_dev->cam.nmodes = ARRAY_SIZE(vga_mode); 147 gspca_dev->cam.nmodes = ARRAY_SIZE(vga_mode);
249 gspca_dev->cam.no_urb_create = 1; 148 gspca_dev->cam.no_urb_create = 1;
250 149
251 sd->brightness = BRIGHTNESS_DEFAULT;
252 sd->contrast = CONTRAST_DEFAULT;
253 sd->saturation = SATURATION_DEFAULT;
254 sd->whitebal = WHITEBAL_DEFAULT;
255 sd->sharpness = SHARPNESS_DEFAULT;
256
257 return 0; 150 return 0;
258} 151}
259 152
@@ -289,12 +182,6 @@ static int sd_start(struct gspca_dev *gspca_dev)
289 182
290 packet_size = le16_to_cpu(alt->endpoint[0].desc.wMaxPacketSize); 183 packet_size = le16_to_cpu(alt->endpoint[0].desc.wMaxPacketSize);
291 184
292 reg_w(gspca_dev, sd->brightness, BRIGHTNESS_REG);
293 reg_w(gspca_dev, sd->whitebal, WHITEBAL_REG);
294 reg_w(gspca_dev, sd->contrast, CONTRAST_REG);
295 reg_w(gspca_dev, sd->saturation, SATURATION_REG);
296 reg_w(gspca_dev, sd->sharpness, SHARPNESS_REG);
297
298 n = gspca_dev->cam.cam_mode[gspca_dev->curr_mode].priv; 185 n = gspca_dev->cam.cam_mode[gspca_dev->curr_mode].priv;
299 reg_w(gspca_dev, n, 0x08); 186 reg_w(gspca_dev, n, 0x08);
300 187
@@ -479,125 +366,82 @@ resubmit:
479 pr_err("usb_submit_urb(status_urb) ret %d\n", st); 366 pr_err("usb_submit_urb(status_urb) ret %d\n", st);
480} 367}
481 368
482static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val) 369static int sd_s_ctrl(struct v4l2_ctrl *ctrl)
483{ 370{
484 struct sd *sd = (struct sd *) gspca_dev; 371 struct gspca_dev *gspca_dev =
485 372 container_of(ctrl->handler, struct gspca_dev, ctrl_handler);
486 sd->brightness = val;
487 if (gspca_dev->streaming) {
488 konica_stream_off(gspca_dev);
489 reg_w(gspca_dev, sd->brightness, BRIGHTNESS_REG);
490 konica_stream_on(gspca_dev);
491 }
492 373
493 return 0; 374 gspca_dev->usb_err = 0;
494}
495
496static int sd_getbrightness(struct gspca_dev *gspca_dev, __s32 *val)
497{
498 struct sd *sd = (struct sd *) gspca_dev;
499
500 *val = sd->brightness;
501
502 return 0;
503}
504 375
505static int sd_setcontrast(struct gspca_dev *gspca_dev, __s32 val) 376 if (!gspca_dev->streaming)
506{ 377 return 0;
507 struct sd *sd = (struct sd *) gspca_dev;
508 378
509 sd->contrast = val; 379 switch (ctrl->id) {
510 if (gspca_dev->streaming) { 380 case V4L2_CID_BRIGHTNESS:
511 konica_stream_off(gspca_dev); 381 konica_stream_off(gspca_dev);
512 reg_w(gspca_dev, sd->contrast, CONTRAST_REG); 382 reg_w(gspca_dev, ctrl->val, BRIGHTNESS_REG);
513 konica_stream_on(gspca_dev); 383 konica_stream_on(gspca_dev);
514 } 384 break;
515 385 case V4L2_CID_CONTRAST:
516 return 0;
517}
518
519static int sd_getcontrast(struct gspca_dev *gspca_dev, __s32 *val)
520{
521 struct sd *sd = (struct sd *) gspca_dev;
522
523 *val = sd->contrast;
524
525 return 0;
526}
527
528static int sd_setsaturation(struct gspca_dev *gspca_dev, __s32 val)
529{
530 struct sd *sd = (struct sd *) gspca_dev;
531
532 sd->saturation = val;
533 if (gspca_dev->streaming) {
534 konica_stream_off(gspca_dev); 386 konica_stream_off(gspca_dev);
535 reg_w(gspca_dev, sd->saturation, SATURATION_REG); 387 reg_w(gspca_dev, ctrl->val, CONTRAST_REG);
536 konica_stream_on(gspca_dev); 388 konica_stream_on(gspca_dev);
537 } 389 break;
538 return 0; 390 case V4L2_CID_SATURATION:
539}
540
541static int sd_getsaturation(struct gspca_dev *gspca_dev, __s32 *val)
542{
543 struct sd *sd = (struct sd *) gspca_dev;
544
545 *val = sd->saturation;
546
547 return 0;
548}
549
550static int sd_setwhitebal(struct gspca_dev *gspca_dev, __s32 val)
551{
552 struct sd *sd = (struct sd *) gspca_dev;
553
554 sd->whitebal = val;
555 if (gspca_dev->streaming) {
556 konica_stream_off(gspca_dev); 391 konica_stream_off(gspca_dev);
557 reg_w(gspca_dev, sd->whitebal, WHITEBAL_REG); 392 reg_w(gspca_dev, ctrl->val, SATURATION_REG);
558 konica_stream_on(gspca_dev); 393 konica_stream_on(gspca_dev);
559 } 394 break;
560 return 0; 395 case V4L2_CID_WHITE_BALANCE_TEMPERATURE:
561}
562
563static int sd_getwhitebal(struct gspca_dev *gspca_dev, __s32 *val)
564{
565 struct sd *sd = (struct sd *) gspca_dev;
566
567 *val = sd->whitebal;
568
569 return 0;
570}
571
572static int sd_setsharpness(struct gspca_dev *gspca_dev, __s32 val)
573{
574 struct sd *sd = (struct sd *) gspca_dev;
575
576 sd->sharpness = val;
577 if (gspca_dev->streaming) {
578 konica_stream_off(gspca_dev); 396 konica_stream_off(gspca_dev);
579 reg_w(gspca_dev, sd->sharpness, SHARPNESS_REG); 397 reg_w(gspca_dev, ctrl->val, WHITEBAL_REG);
580 konica_stream_on(gspca_dev); 398 konica_stream_on(gspca_dev);
399 break;
400 case V4L2_CID_SHARPNESS:
401 konica_stream_off(gspca_dev);
402 reg_w(gspca_dev, ctrl->val, SHARPNESS_REG);
403 konica_stream_on(gspca_dev);
404 break;
581 } 405 }
582 return 0; 406 return gspca_dev->usb_err;
583} 407}
584 408
585static int sd_getsharpness(struct gspca_dev *gspca_dev, __s32 *val) 409static const struct v4l2_ctrl_ops sd_ctrl_ops = {
586{ 410 .s_ctrl = sd_s_ctrl,
587 struct sd *sd = (struct sd *) gspca_dev; 411};
588
589 *val = sd->sharpness;
590 412
413static int sd_init_controls(struct gspca_dev *gspca_dev)
414{
415 struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler;
416
417 gspca_dev->vdev.ctrl_handler = hdl;
418 v4l2_ctrl_handler_init(hdl, 5);
419 v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
420 V4L2_CID_BRIGHTNESS, 0, 9, 1, 4);
421 /* Needs to be verified */
422 v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
423 V4L2_CID_CONTRAST, 0, 9, 1, 4);
424 v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
425 V4L2_CID_SATURATION, 0, 9, 1, 4);
426 v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
427 V4L2_CID_WHITE_BALANCE_TEMPERATURE,
428 0, 33, 1, 25);
429 v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
430 V4L2_CID_SHARPNESS, 0, 9, 1, 4);
431
432 if (hdl->error) {
433 pr_err("Could not initialize controls\n");
434 return hdl->error;
435 }
591 return 0; 436 return 0;
592} 437}
593 438
594/* sub-driver description */ 439/* sub-driver description */
595static const struct sd_desc sd_desc = { 440static const struct sd_desc sd_desc = {
596 .name = MODULE_NAME, 441 .name = MODULE_NAME,
597 .ctrls = sd_ctrls,
598 .nctrls = ARRAY_SIZE(sd_ctrls),
599 .config = sd_config, 442 .config = sd_config,
600 .init = sd_init, 443 .init = sd_init,
444 .init_controls = sd_init_controls,
601 .start = sd_start, 445 .start = sd_start,
602 .stopN = sd_stopN, 446 .stopN = sd_stopN,
603#if defined(CONFIG_INPUT) || defined(CONFIG_INPUT_MODULE) 447#if defined(CONFIG_INPUT) || defined(CONFIG_INPUT_MODULE)