diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/media/video/gspca/pac7311.c | 41 |
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) | |||
408 | static void setgain(struct gspca_dev *gspca_dev) | 408 | static 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) | |||
425 | static void setexposure(struct gspca_dev *gspca_dev) | 420 | static 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); |