summaryrefslogtreecommitdiff
path: root/drivers/media/video/gspca/spca561.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2008-08-07 18:06:19 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2008-08-07 18:06:19 -0700
commitb80b601f0087391e55d3859e70f08278632b1185 (patch)
tree1fa138af8da80bf523a6f259c726e162fe387fb7 /drivers/media/video/gspca/spca561.c
parenta06dee41a31bff488a261dfc542776ffd2f24ff1 (diff)
parent04793dd041bbb88a39b768b714c725de2c339b51 (diff)
Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/v4l-dvb
* 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/v4l-dvb: (23 commits) V4L/DVB (8617): uvcvideo: don't use stack-based buffers for USB transfers. V4L/DVB (8616): uvcvideo: Add support for two Bison Electronics webcams V4L/DVB (8611): Add suspend/resume to pxa_camera driver V4L/DVB (8610): Add suspend/resume capabilities to soc_camera. V4L/DVB (8609): media: Clean up platform_driver_unregister() bogosity. V4L/DVB (8607): cxusb: fix OOPS and broken tuning regression on FusionHDTV Dual Digital 4 V4L/DVB (8605): gspca: Fix of gspca_zc3xx oops - 2.6.27-rc1 V4L/DVB (8604): gspca: Fix of "scheduling while atomic" crash. V4L/DVB (8602): gspca: Fix small bugs, simplify and cleanup ov519. V4L/DVB (8582): set mts_firmware for em2882 based Pinnacle Hybrid Pro V4L/DVB (8574): gspca: Bad bytesperlines of pixelformat in spca505/506/508 and vc023x. V4L/DVB (8573): gspca: Bad scan of frame in spca505/506/508. V4L/DVB (8572): gspca: Webcam 0c45:6143 in documentation. V4L/DVB (8571): gspca: Don't use CONFIG_VIDEO_ADV_DEBUG as a compile option. V4L/DVB (8569): gspca: Set back the old values of Sonix sn9c120 and cleanup source. V4L/DVB (8567): gspca: hflip and vflip controls added for ov519 - ov7670 plus init cleanup. V4L/DVB (8564): fix vino driver build error V4L/DVB (8563): fix drivers/media/video/arv.c compilation V4L/DVB (8562): DVB_DRX397XD: remove FW_LOADER select V4L/DVB (8558): media/video/Kconfig: fix a typo ...
Diffstat (limited to 'drivers/media/video/gspca/spca561.c')
-rw-r--r--drivers/media/video/gspca/spca561.c42
1 files changed, 26 insertions, 16 deletions
diff --git a/drivers/media/video/gspca/spca561.c b/drivers/media/video/gspca/spca561.c
index a26174508cb9..1073ac3d2ec6 100644
--- a/drivers/media/video/gspca/spca561.c
+++ b/drivers/media/video/gspca/spca561.c
@@ -644,6 +644,18 @@ static void setcontrast(struct gspca_dev *gspca_dev)
}
}
+static void setautogain(struct gspca_dev *gspca_dev)
+{
+ struct sd *sd = (struct sd *) gspca_dev;
+
+ if (sd->chip_revision == Rev072A) {
+ if (sd->autogain)
+ sd->ag_cnt = AG_CNT_START;
+ else
+ sd->ag_cnt = -1;
+ }
+}
+
static void sd_start(struct gspca_dev *gspca_dev)
{
struct sd *sd = (struct sd *) gspca_dev;
@@ -671,6 +683,7 @@ static void sd_start(struct gspca_dev *gspca_dev)
reg_w_val(dev, 0x8500, mode); /* mode */
reg_w_val(dev, 0x8700, Clck); /* 0x27 clock */
reg_w_val(dev, 0x8112, 0x10 | 0x20);
+ setautogain(gspca_dev);
break;
default:
/* case Rev012A: */
@@ -720,18 +733,24 @@ static void sd_close(struct gspca_dev *gspca_dev)
reg_w_val(gspca_dev->dev, 0x8114, 0);
}
-static void setautogain(struct gspca_dev *gspca_dev)
+static void do_autogain(struct gspca_dev *gspca_dev)
{
struct sd *sd = (struct sd *) gspca_dev;
- int expotimes = 0;
- int pixelclk = 0;
- int gainG = 0;
+ int expotimes;
+ int pixelclk;
+ int gainG;
__u8 R, Gr, Gb, B;
int y;
__u8 luma_mean = 110;
__u8 luma_delta = 20;
__u8 spring = 4;
+ if (sd->ag_cnt < 0)
+ return;
+ if (--sd->ag_cnt >= 0)
+ return;
+ sd->ag_cnt = AG_CNT_START;
+
switch (sd->chip_revision) {
case Rev072A:
reg_r(gspca_dev, 0x8621, 1);
@@ -795,18 +814,10 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
__u8 *data, /* isoc packet */
int len) /* iso packet length */
{
- struct sd *sd = (struct sd *) gspca_dev;
-
switch (data[0]) {
case 0: /* start of frame */
frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame,
data, 0);
- if (sd->ag_cnt >= 0) {
- if (--sd->ag_cnt < 0) {
- sd->ag_cnt = AG_CNT_START;
- setautogain(gspca_dev);
- }
- }
data += SPCA561_OFFSET_DATA;
len -= SPCA561_OFFSET_DATA;
if (data[1] & 0x10) {
@@ -944,10 +955,8 @@ static int sd_setautogain(struct gspca_dev *gspca_dev, __s32 val)
struct sd *sd = (struct sd *) gspca_dev;
sd->autogain = val;
- if (val)
- sd->ag_cnt = AG_CNT_START;
- else
- sd->ag_cnt = -1;
+ if (gspca_dev->streaming)
+ setautogain(gspca_dev);
return 0;
}
@@ -971,6 +980,7 @@ static const struct sd_desc sd_desc = {
.stop0 = sd_stop0,
.close = sd_close,
.pkt_scan = sd_pkt_scan,
+ .dq_callback = do_autogain,
};
/* -- module initialisation -- */