aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/media/video/gspca/pac7311.c41
1 files changed, 13 insertions, 28 deletions
diff --git a/drivers/media/video/gspca/pac7311.c b/drivers/media/video/gspca/pac7311.c
index d12576365038..4efa110e6932 100644
--- a/drivers/media/video/gspca/pac7311.c
+++ b/drivers/media/video/gspca/pac7311.c
@@ -92,10 +92,10 @@ static const struct ctrl sd_ctrls[] = {
92 .type = V4L2_CTRL_TYPE_INTEGER, 92 .type = V4L2_CTRL_TYPE_INTEGER,
93 .name = "Contrast", 93 .name = "Contrast",
94 .minimum = 0, 94 .minimum = 0,
95#define CONTRAST_MAX 255 95#define CONTRAST_MAX 15
96 .maximum = CONTRAST_MAX, 96 .maximum = CONTRAST_MAX,
97 .step = 1, 97 .step = 1,
98#define CONTRAST_DEF 127 98#define CONTRAST_DEF 7
99 .default_value = CONTRAST_DEF, 99 .default_value = CONTRAST_DEF,
100 }, 100 },
101 .set = sd_setcontrast, 101 .set = sd_setcontrast,
@@ -107,11 +107,11 @@ static const struct ctrl sd_ctrls[] = {
107 .type = V4L2_CTRL_TYPE_INTEGER, 107 .type = V4L2_CTRL_TYPE_INTEGER,
108 .name = "Gain", 108 .name = "Gain",
109 .minimum = 0, 109 .minimum = 0,
110#define GAIN_MAX 255 110#define GAIN_MAX 244
111 .maximum = GAIN_MAX, 111 .maximum = GAIN_MAX,
112 .step = 1, 112 .step = 1,
113#define GAIN_DEF 127 113#define GAIN_DEF 122
114#define GAIN_KNEE 255 /* Gain seems to cause little noise on the pac73xx */ 114#define GAIN_KNEE GAIN_MAX /* Gain seems to cause little noise on the 7311 */
115 .default_value = GAIN_DEF, 115 .default_value = GAIN_DEF,
116 }, 116 },
117 .set = sd_setgain, 117 .set = sd_setgain,
@@ -122,12 +122,12 @@ static const struct ctrl sd_ctrls[] = {
122 .id = V4L2_CID_EXPOSURE, 122 .id = V4L2_CID_EXPOSURE,
123 .type = V4L2_CTRL_TYPE_INTEGER, 123 .type = V4L2_CTRL_TYPE_INTEGER,
124 .name = "Exposure", 124 .name = "Exposure",
125 .minimum = 0, 125 .minimum = 2,
126#define EXPOSURE_MAX 255 126#define EXPOSURE_MAX 63
127 .maximum = EXPOSURE_MAX, 127 .maximum = EXPOSURE_MAX,
128 .step = 1, 128 .step = 1,
129#define EXPOSURE_DEF 16 /* 32 ms / 30 fps */ 129#define EXPOSURE_DEF 2 /* 30 fps */
130#define EXPOSURE_KNEE 50 /* 100 ms / 10 fps */ 130#define EXPOSURE_KNEE 6 /* 10 fps */
131 .default_value = EXPOSURE_DEF, 131 .default_value = EXPOSURE_DEF,
132 }, 132 },
133 .set = sd_setexposure, 133 .set = sd_setexposure,
@@ -400,7 +400,7 @@ static void setcontrast(struct gspca_dev *gspca_dev)
400 struct sd *sd = (struct sd *) gspca_dev; 400 struct sd *sd = (struct sd *) gspca_dev;
401 401
402 reg_w(gspca_dev, 0xff, 0x04); 402 reg_w(gspca_dev, 0xff, 0x04);
403 reg_w(gspca_dev, 0x10, sd->contrast >> 4); 403 reg_w(gspca_dev, 0x10, sd->contrast);
404 /* load registers to sensor (Bit 0, auto clear) */ 404 /* load registers to sensor (Bit 0, auto clear) */
405 reg_w(gspca_dev, 0x11, 0x01); 405 reg_w(gspca_dev, 0x11, 0x01);
406} 406}
@@ -408,15 +408,10 @@ static void setcontrast(struct gspca_dev *gspca_dev)
408static void setgain(struct gspca_dev *gspca_dev) 408static void setgain(struct gspca_dev *gspca_dev)
409{ 409{
410 struct sd *sd = (struct sd *) gspca_dev; 410 struct sd *sd = (struct sd *) gspca_dev;
411 int gain = GAIN_MAX - sd->gain;
412 411
413 if (gain < 1)
414 gain = 1;
415 else if (gain > 245)
416 gain = 245;
417 reg_w(gspca_dev, 0xff, 0x04); /* page 4 */ 412 reg_w(gspca_dev, 0xff, 0x04); /* page 4 */
418 reg_w(gspca_dev, 0x0e, 0x00); 413 reg_w(gspca_dev, 0x0e, 0x00);
419 reg_w(gspca_dev, 0x0f, gain); 414 reg_w(gspca_dev, 0x0f, GAIN_MAX - sd->gain + 1);
420 415
421 /* load registers to sensor (Bit 0, auto clear) */ 416 /* load registers to sensor (Bit 0, auto clear) */
422 reg_w(gspca_dev, 0x11, 0x01); 417 reg_w(gspca_dev, 0x11, 0x01);
@@ -425,19 +420,9 @@ static void setgain(struct gspca_dev *gspca_dev)
425static void setexposure(struct gspca_dev *gspca_dev) 420static void setexposure(struct gspca_dev *gspca_dev)
426{ 421{
427 struct sd *sd = (struct sd *) gspca_dev; 422 struct sd *sd = (struct sd *) gspca_dev;
428 __u8 reg;
429
430 /* register 2 of page 4 contains the clock divider configuring the
431 no fps according to the formula: 60 / reg. sd->exposure is the
432 desired exposure time in ms. */
433 reg = 120 * sd->exposure / 1000;
434 if (reg < 2)
435 reg = 2;
436 else if (reg > 63)
437 reg = 63;
438 423
439 reg_w(gspca_dev, 0xff, 0x04); /* page 4 */ 424 reg_w(gspca_dev, 0xff, 0x04); /* page 4 */
440 reg_w(gspca_dev, 0x02, reg); 425 reg_w(gspca_dev, 0x02, sd->exposure);
441 426
442 /* load registers to sensor (Bit 0, auto clear) */ 427 /* load registers to sensor (Bit 0, auto clear) */
443 reg_w(gspca_dev, 0x11, 0x01); 428 reg_w(gspca_dev, 0x11, 0x01);
@@ -446,7 +431,7 @@ static void setexposure(struct gspca_dev *gspca_dev)
446 640x480 mode and page 4 reg 2 <= 3 then it must be 9 */ 431 640x480 mode and page 4 reg 2 <= 3 then it must be 9 */
447 reg_w(gspca_dev, 0xff, 0x01); 432 reg_w(gspca_dev, 0xff, 0x01);
448 if (gspca_dev->cam.cam_mode[(int)gspca_dev->curr_mode].priv && 433 if (gspca_dev->cam.cam_mode[(int)gspca_dev->curr_mode].priv &&
449 reg <= 3) { 434 sd->exposure <= 3) {
450 reg_w(gspca_dev, 0x08, 0x09); 435 reg_w(gspca_dev, 0x08, 0x09);
451 } else { 436 } else {
452 reg_w(gspca_dev, 0x08, 0x08); 437 reg_w(gspca_dev, 0x08, 0x08);