diff options
author | Hans Verkuil <hans.verkuil@cisco.com> | 2012-05-14 06:35:37 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2012-07-30 17:22:47 -0400 |
commit | 1bdee422cd9edea43a86f37a4ceb0081de6bd0bc (patch) | |
tree | c92965bc0c494db09e1833249d7ad7d9f542ca99 /drivers/media/video/gspca/konica.c | |
parent | bfaab899e7c8ded57afe93ebed234b3688d9a898 (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.c | 260 |
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 */ | ||
61 | static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val); | ||
62 | static int sd_getbrightness(struct gspca_dev *gspca_dev, __s32 *val); | ||
63 | static int sd_setcontrast(struct gspca_dev *gspca_dev, __s32 val); | ||
64 | static int sd_getcontrast(struct gspca_dev *gspca_dev, __s32 *val); | ||
65 | static int sd_setsaturation(struct gspca_dev *gspca_dev, __s32 val); | ||
66 | static int sd_getsaturation(struct gspca_dev *gspca_dev, __s32 *val); | ||
67 | static int sd_setwhitebal(struct gspca_dev *gspca_dev, __s32 val); | ||
68 | static int sd_getwhitebal(struct gspca_dev *gspca_dev, __s32 *val); | ||
69 | static int sd_setsharpness(struct gspca_dev *gspca_dev, __s32 val); | ||
70 | static int sd_getsharpness(struct gspca_dev *gspca_dev, __s32 *val); | ||
71 | |||
72 | static 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) | |||
242 | static int sd_config(struct gspca_dev *gspca_dev, | 143 | static 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 | ||
482 | static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val) | 369 | static 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 | |||
496 | static 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 | ||
505 | static 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 | |||
519 | static 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 | |||
528 | static 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 | |||
541 | static 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 | |||
550 | static 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 | |||
563 | static 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 | |||
572 | static 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 | ||
585 | static int sd_getsharpness(struct gspca_dev *gspca_dev, __s32 *val) | 409 | static 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 | ||
413 | static 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 */ |
595 | static const struct sd_desc sd_desc = { | 440 | static 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) |