cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

w996Xcf.c (18264B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * GSPCA sub driver for W996[78]CF JPEG USB Dual Mode Camera Chip.
      4 *
      5 * Copyright (C) 2009 Hans de Goede <hdegoede@redhat.com>
      6 *
      7 * This module is adapted from the in kernel v4l1 w9968cf driver:
      8 *
      9 * Copyright (C) 2002-2004 by Luca Risolia <luca.risolia@studio.unibo.it>
     10 */
     11
     12/* Note this is not a stand alone driver, it gets included in ov519.c, this
     13   is a bit of a hack, but it needs the driver code for a lot of different
     14   ov sensors which is already present in ov519.c (the old v4l1 driver used
     15   the ovchipcam framework). When we have the time we really should move
     16   the sensor drivers to v4l2 sub drivers, and properly split of this
     17   driver from ov519.c */
     18
     19#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
     20
     21#define W9968CF_I2C_BUS_DELAY    4 /* delay in us for I2C bit r/w operations */
     22
     23#define Y_QUANTABLE (&sd->jpeg_hdr[JPEG_QT0_OFFSET])
     24#define UV_QUANTABLE (&sd->jpeg_hdr[JPEG_QT1_OFFSET])
     25
     26static const struct v4l2_pix_format w9968cf_vga_mode[] = {
     27	{160, 120, V4L2_PIX_FMT_UYVY, V4L2_FIELD_NONE,
     28		.bytesperline = 160 * 2,
     29		.sizeimage = 160 * 120 * 2,
     30		.colorspace = V4L2_COLORSPACE_JPEG},
     31	{176, 144, V4L2_PIX_FMT_UYVY, V4L2_FIELD_NONE,
     32		.bytesperline = 176 * 2,
     33		.sizeimage = 176 * 144 * 2,
     34		.colorspace = V4L2_COLORSPACE_JPEG},
     35	{320, 240, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
     36		.bytesperline = 320 * 2,
     37		.sizeimage = 320 * 240 * 2,
     38		.colorspace = V4L2_COLORSPACE_JPEG},
     39	{352, 288, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
     40		.bytesperline = 352 * 2,
     41		.sizeimage = 352 * 288 * 2,
     42		.colorspace = V4L2_COLORSPACE_JPEG},
     43	{640, 480, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
     44		.bytesperline = 640 * 2,
     45		.sizeimage = 640 * 480 * 2,
     46		.colorspace = V4L2_COLORSPACE_JPEG},
     47};
     48
     49static void reg_w(struct sd *sd, u16 index, u16 value);
     50
     51/*--------------------------------------------------------------------------
     52  Write 64-bit data to the fast serial bus registers.
     53  Return 0 on success, -1 otherwise.
     54  --------------------------------------------------------------------------*/
     55static void w9968cf_write_fsb(struct sd *sd, u16* data)
     56{
     57	struct usb_device *udev = sd->gspca_dev.dev;
     58	u16 value;
     59	int ret;
     60
     61	if (sd->gspca_dev.usb_err < 0)
     62		return;
     63
     64	value = *data++;
     65	memcpy(sd->gspca_dev.usb_buf, data, 6);
     66
     67	/* Avoid things going to fast for the bridge with a xhci host */
     68	udelay(150);
     69	ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), 0,
     70			      USB_TYPE_VENDOR | USB_DIR_OUT | USB_RECIP_DEVICE,
     71			      value, 0x06, sd->gspca_dev.usb_buf, 6, 500);
     72	if (ret < 0) {
     73		pr_err("Write FSB registers failed (%d)\n", ret);
     74		sd->gspca_dev.usb_err = ret;
     75	}
     76}
     77
     78/*--------------------------------------------------------------------------
     79  Write data to the serial bus control register.
     80  Return 0 on success, a negative number otherwise.
     81  --------------------------------------------------------------------------*/
     82static void w9968cf_write_sb(struct sd *sd, u16 value)
     83{
     84	int ret;
     85
     86	if (sd->gspca_dev.usb_err < 0)
     87		return;
     88
     89	/* Avoid things going to fast for the bridge with a xhci host */
     90	udelay(150);
     91
     92	/* We don't use reg_w here, as that would cause all writes when
     93	   bitbanging i2c to be logged, making the logs impossible to read */
     94	ret = usb_control_msg(sd->gspca_dev.dev,
     95		usb_sndctrlpipe(sd->gspca_dev.dev, 0),
     96		0,
     97		USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
     98		value, 0x01, NULL, 0, 500);
     99
    100	udelay(W9968CF_I2C_BUS_DELAY);
    101
    102	if (ret < 0) {
    103		pr_err("Write SB reg [01] %04x failed\n", value);
    104		sd->gspca_dev.usb_err = ret;
    105	}
    106}
    107
    108/*--------------------------------------------------------------------------
    109  Read data from the serial bus control register.
    110  Return 0 on success, a negative number otherwise.
    111  --------------------------------------------------------------------------*/
    112static int w9968cf_read_sb(struct sd *sd)
    113{
    114	int ret;
    115
    116	if (sd->gspca_dev.usb_err < 0)
    117		return -1;
    118
    119	/* Avoid things going to fast for the bridge with a xhci host */
    120	udelay(150);
    121
    122	/* We don't use reg_r here, as the w9968cf is special and has 16
    123	   bit registers instead of 8 bit */
    124	ret = usb_control_msg(sd->gspca_dev.dev,
    125			usb_rcvctrlpipe(sd->gspca_dev.dev, 0),
    126			1,
    127			USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
    128			0, 0x01, sd->gspca_dev.usb_buf, 2, 500);
    129	if (ret >= 0) {
    130		ret = sd->gspca_dev.usb_buf[0] |
    131		      (sd->gspca_dev.usb_buf[1] << 8);
    132	} else {
    133		pr_err("Read SB reg [01] failed\n");
    134		sd->gspca_dev.usb_err = ret;
    135		/*
    136		 * Make sure the buffer is zeroed to avoid uninitialized
    137		 * values.
    138		 */
    139		memset(sd->gspca_dev.usb_buf, 0, 2);
    140	}
    141
    142	udelay(W9968CF_I2C_BUS_DELAY);
    143
    144	return ret;
    145}
    146
    147/*--------------------------------------------------------------------------
    148  Upload quantization tables for the JPEG compression.
    149  This function is called by w9968cf_start_transfer().
    150  Return 0 on success, a negative number otherwise.
    151  --------------------------------------------------------------------------*/
    152static void w9968cf_upload_quantizationtables(struct sd *sd)
    153{
    154	u16 a, b;
    155	int i, j;
    156
    157	reg_w(sd, 0x39, 0x0010); /* JPEG clock enable */
    158
    159	for (i = 0, j = 0; i < 32; i++, j += 2) {
    160		a = Y_QUANTABLE[j] | ((unsigned)(Y_QUANTABLE[j + 1]) << 8);
    161		b = UV_QUANTABLE[j] | ((unsigned)(UV_QUANTABLE[j + 1]) << 8);
    162		reg_w(sd, 0x40 + i, a);
    163		reg_w(sd, 0x60 + i, b);
    164	}
    165	reg_w(sd, 0x39, 0x0012); /* JPEG encoder enable */
    166}
    167
    168/****************************************************************************
    169 * Low-level I2C I/O functions.                                             *
    170 * The adapter supports the following I2C transfer functions:               *
    171 * i2c_adap_fastwrite_byte_data() (at 400 kHz bit frequency only)           *
    172 * i2c_adap_read_byte_data()                                                *
    173 * i2c_adap_read_byte()                                                     *
    174 ****************************************************************************/
    175
    176static void w9968cf_smbus_start(struct sd *sd)
    177{
    178	w9968cf_write_sb(sd, 0x0011); /* SDE=1, SDA=0, SCL=1 */
    179	w9968cf_write_sb(sd, 0x0010); /* SDE=1, SDA=0, SCL=0 */
    180}
    181
    182static void w9968cf_smbus_stop(struct sd *sd)
    183{
    184	w9968cf_write_sb(sd, 0x0010); /* SDE=1, SDA=0, SCL=0 */
    185	w9968cf_write_sb(sd, 0x0011); /* SDE=1, SDA=0, SCL=1 */
    186	w9968cf_write_sb(sd, 0x0013); /* SDE=1, SDA=1, SCL=1 */
    187}
    188
    189static void w9968cf_smbus_write_byte(struct sd *sd, u8 v)
    190{
    191	u8 bit;
    192	int sda;
    193
    194	for (bit = 0 ; bit < 8 ; bit++) {
    195		sda = (v & 0x80) ? 2 : 0;
    196		v <<= 1;
    197		/* SDE=1, SDA=sda, SCL=0 */
    198		w9968cf_write_sb(sd, 0x10 | sda);
    199		/* SDE=1, SDA=sda, SCL=1 */
    200		w9968cf_write_sb(sd, 0x11 | sda);
    201		/* SDE=1, SDA=sda, SCL=0 */
    202		w9968cf_write_sb(sd, 0x10 | sda);
    203	}
    204}
    205
    206static void w9968cf_smbus_read_byte(struct sd *sd, u8 *v)
    207{
    208	u8 bit;
    209
    210	/* No need to ensure SDA is high as we are always called after
    211	   read_ack which ends with SDA high */
    212	*v = 0;
    213	for (bit = 0 ; bit < 8 ; bit++) {
    214		*v <<= 1;
    215		/* SDE=1, SDA=1, SCL=1 */
    216		w9968cf_write_sb(sd, 0x0013);
    217		*v |= (w9968cf_read_sb(sd) & 0x0008) ? 1 : 0;
    218		/* SDE=1, SDA=1, SCL=0 */
    219		w9968cf_write_sb(sd, 0x0012);
    220	}
    221}
    222
    223static void w9968cf_smbus_write_nack(struct sd *sd)
    224{
    225	/* No need to ensure SDA is high as we are always called after
    226	   read_byte which ends with SDA high */
    227	w9968cf_write_sb(sd, 0x0013); /* SDE=1, SDA=1, SCL=1 */
    228	w9968cf_write_sb(sd, 0x0012); /* SDE=1, SDA=1, SCL=0 */
    229}
    230
    231static void w9968cf_smbus_read_ack(struct sd *sd)
    232{
    233	struct gspca_dev *gspca_dev = (struct gspca_dev *)sd;
    234	int sda;
    235
    236	/* Ensure SDA is high before raising clock to avoid a spurious stop */
    237	w9968cf_write_sb(sd, 0x0012); /* SDE=1, SDA=1, SCL=0 */
    238	w9968cf_write_sb(sd, 0x0013); /* SDE=1, SDA=1, SCL=1 */
    239	sda = w9968cf_read_sb(sd);
    240	w9968cf_write_sb(sd, 0x0012); /* SDE=1, SDA=1, SCL=0 */
    241	if (sda >= 0 && (sda & 0x08)) {
    242		gspca_dbg(gspca_dev, D_USBI, "Did not receive i2c ACK\n");
    243		sd->gspca_dev.usb_err = -EIO;
    244	}
    245}
    246
    247/* SMBus protocol: S Addr Wr [A] Subaddr [A] Value [A] P */
    248static void w9968cf_i2c_w(struct sd *sd, u8 reg, u8 value)
    249{
    250	struct gspca_dev *gspca_dev = (struct gspca_dev *)sd;
    251	u16* data = (u16 *)sd->gspca_dev.usb_buf;
    252
    253	data[0] = 0x082f | ((sd->sensor_addr & 0x80) ? 0x1500 : 0x0);
    254	data[0] |= (sd->sensor_addr & 0x40) ? 0x4000 : 0x0;
    255	data[1] = 0x2082 | ((sd->sensor_addr & 0x40) ? 0x0005 : 0x0);
    256	data[1] |= (sd->sensor_addr & 0x20) ? 0x0150 : 0x0;
    257	data[1] |= (sd->sensor_addr & 0x10) ? 0x5400 : 0x0;
    258	data[2] = 0x8208 | ((sd->sensor_addr & 0x08) ? 0x0015 : 0x0);
    259	data[2] |= (sd->sensor_addr & 0x04) ? 0x0540 : 0x0;
    260	data[2] |= (sd->sensor_addr & 0x02) ? 0x5000 : 0x0;
    261	data[3] = 0x1d20 | ((sd->sensor_addr & 0x02) ? 0x0001 : 0x0);
    262	data[3] |= (sd->sensor_addr & 0x01) ? 0x0054 : 0x0;
    263
    264	w9968cf_write_fsb(sd, data);
    265
    266	data[0] = 0x8208 | ((reg & 0x80) ? 0x0015 : 0x0);
    267	data[0] |= (reg & 0x40) ? 0x0540 : 0x0;
    268	data[0] |= (reg & 0x20) ? 0x5000 : 0x0;
    269	data[1] = 0x0820 | ((reg & 0x20) ? 0x0001 : 0x0);
    270	data[1] |= (reg & 0x10) ? 0x0054 : 0x0;
    271	data[1] |= (reg & 0x08) ? 0x1500 : 0x0;
    272	data[1] |= (reg & 0x04) ? 0x4000 : 0x0;
    273	data[2] = 0x2082 | ((reg & 0x04) ? 0x0005 : 0x0);
    274	data[2] |= (reg & 0x02) ? 0x0150 : 0x0;
    275	data[2] |= (reg & 0x01) ? 0x5400 : 0x0;
    276	data[3] = 0x001d;
    277
    278	w9968cf_write_fsb(sd, data);
    279
    280	data[0] = 0x8208 | ((value & 0x80) ? 0x0015 : 0x0);
    281	data[0] |= (value & 0x40) ? 0x0540 : 0x0;
    282	data[0] |= (value & 0x20) ? 0x5000 : 0x0;
    283	data[1] = 0x0820 | ((value & 0x20) ? 0x0001 : 0x0);
    284	data[1] |= (value & 0x10) ? 0x0054 : 0x0;
    285	data[1] |= (value & 0x08) ? 0x1500 : 0x0;
    286	data[1] |= (value & 0x04) ? 0x4000 : 0x0;
    287	data[2] = 0x2082 | ((value & 0x04) ? 0x0005 : 0x0);
    288	data[2] |= (value & 0x02) ? 0x0150 : 0x0;
    289	data[2] |= (value & 0x01) ? 0x5400 : 0x0;
    290	data[3] = 0xfe1d;
    291
    292	w9968cf_write_fsb(sd, data);
    293
    294	gspca_dbg(gspca_dev, D_USBO, "i2c 0x%02x -> [0x%02x]\n", value, reg);
    295}
    296
    297/* SMBus protocol: S Addr Wr [A] Subaddr [A] P S Addr+1 Rd [A] [Value] NA P */
    298static int w9968cf_i2c_r(struct sd *sd, u8 reg)
    299{
    300	struct gspca_dev *gspca_dev = (struct gspca_dev *)sd;
    301	int ret = 0;
    302	u8 value;
    303
    304	/* Fast serial bus data control disable */
    305	w9968cf_write_sb(sd, 0x0013); /* don't change ! */
    306
    307	w9968cf_smbus_start(sd);
    308	w9968cf_smbus_write_byte(sd, sd->sensor_addr);
    309	w9968cf_smbus_read_ack(sd);
    310	w9968cf_smbus_write_byte(sd, reg);
    311	w9968cf_smbus_read_ack(sd);
    312	w9968cf_smbus_stop(sd);
    313	w9968cf_smbus_start(sd);
    314	w9968cf_smbus_write_byte(sd, sd->sensor_addr + 1);
    315	w9968cf_smbus_read_ack(sd);
    316	w9968cf_smbus_read_byte(sd, &value);
    317	/* signal we don't want to read anymore, the v4l1 driver used to
    318	   send an ack here which is very wrong! (and then fixed
    319	   the issues this gave by retrying reads) */
    320	w9968cf_smbus_write_nack(sd);
    321	w9968cf_smbus_stop(sd);
    322
    323	/* Fast serial bus data control re-enable */
    324	w9968cf_write_sb(sd, 0x0030);
    325
    326	if (sd->gspca_dev.usb_err >= 0) {
    327		ret = value;
    328		gspca_dbg(gspca_dev, D_USBI, "i2c [0x%02X] -> 0x%02X\n",
    329			  reg, value);
    330	} else
    331		gspca_err(gspca_dev, "i2c read [0x%02x] failed\n", reg);
    332
    333	return ret;
    334}
    335
    336/*--------------------------------------------------------------------------
    337  Turn on the LED on some webcams. A beep should be heard too.
    338  Return 0 on success, a negative number otherwise.
    339  --------------------------------------------------------------------------*/
    340static void w9968cf_configure(struct sd *sd)
    341{
    342	reg_w(sd, 0x00, 0xff00); /* power-down */
    343	reg_w(sd, 0x00, 0xbf17); /* reset everything */
    344	reg_w(sd, 0x00, 0xbf10); /* normal operation */
    345	reg_w(sd, 0x01, 0x0010); /* serial bus, SDS high */
    346	reg_w(sd, 0x01, 0x0000); /* serial bus, SDS low */
    347	reg_w(sd, 0x01, 0x0010); /* ..high 'beep-beep' */
    348	reg_w(sd, 0x01, 0x0030); /* Set sda scl to FSB mode */
    349
    350	sd->stopped = 1;
    351}
    352
    353static void w9968cf_init(struct sd *sd)
    354{
    355	unsigned long hw_bufsize = sd->sif ? (352 * 288 * 2) : (640 * 480 * 2),
    356		      y0 = 0x0000,
    357		      u0 = y0 + hw_bufsize / 2,
    358		      v0 = u0 + hw_bufsize / 4,
    359		      y1 = v0 + hw_bufsize / 4,
    360		      u1 = y1 + hw_bufsize / 2,
    361		      v1 = u1 + hw_bufsize / 4;
    362
    363	reg_w(sd, 0x00, 0xff00); /* power off */
    364	reg_w(sd, 0x00, 0xbf10); /* power on */
    365
    366	reg_w(sd, 0x03, 0x405d); /* DRAM timings */
    367	reg_w(sd, 0x04, 0x0030); /* SDRAM timings */
    368
    369	reg_w(sd, 0x20, y0 & 0xffff); /* Y buf.0, low */
    370	reg_w(sd, 0x21, y0 >> 16);    /* Y buf.0, high */
    371	reg_w(sd, 0x24, u0 & 0xffff); /* U buf.0, low */
    372	reg_w(sd, 0x25, u0 >> 16);    /* U buf.0, high */
    373	reg_w(sd, 0x28, v0 & 0xffff); /* V buf.0, low */
    374	reg_w(sd, 0x29, v0 >> 16);    /* V buf.0, high */
    375
    376	reg_w(sd, 0x22, y1 & 0xffff); /* Y buf.1, low */
    377	reg_w(sd, 0x23, y1 >> 16);    /* Y buf.1, high */
    378	reg_w(sd, 0x26, u1 & 0xffff); /* U buf.1, low */
    379	reg_w(sd, 0x27, u1 >> 16);    /* U buf.1, high */
    380	reg_w(sd, 0x2a, v1 & 0xffff); /* V buf.1, low */
    381	reg_w(sd, 0x2b, v1 >> 16);    /* V buf.1, high */
    382
    383	reg_w(sd, 0x32, y1 & 0xffff); /* JPEG buf 0 low */
    384	reg_w(sd, 0x33, y1 >> 16);    /* JPEG buf 0 high */
    385
    386	reg_w(sd, 0x34, y1 & 0xffff); /* JPEG buf 1 low */
    387	reg_w(sd, 0x35, y1 >> 16);    /* JPEG bug 1 high */
    388
    389	reg_w(sd, 0x36, 0x0000);/* JPEG restart interval */
    390	reg_w(sd, 0x37, 0x0804);/*JPEG VLE FIFO threshold*/
    391	reg_w(sd, 0x38, 0x0000);/* disable hw up-scaling */
    392	reg_w(sd, 0x3f, 0x0000); /* JPEG/MCTL test data */
    393}
    394
    395static void w9968cf_set_crop_window(struct sd *sd)
    396{
    397	int start_cropx, start_cropy,  x, y, fw, fh, cw, ch,
    398	    max_width, max_height;
    399
    400	if (sd->sif) {
    401		max_width  = 352;
    402		max_height = 288;
    403	} else {
    404		max_width  = 640;
    405		max_height = 480;
    406	}
    407
    408	if (sd->sensor == SEN_OV7620) {
    409		/*
    410		 * Sigh, this is dependend on the clock / framerate changes
    411		 * made by the frequency control, sick.
    412		 *
    413		 * Note we cannot use v4l2_ctrl_g_ctrl here, as we get called
    414		 * from ov519.c:setfreq() with the ctrl lock held!
    415		 */
    416		if (sd->freq->val == 1) {
    417			start_cropx = 277;
    418			start_cropy = 37;
    419		} else {
    420			start_cropx = 105;
    421			start_cropy = 37;
    422		}
    423	} else {
    424		start_cropx = 320;
    425		start_cropy = 35;
    426	}
    427
    428	/* Work around to avoid FP arithmetic */
    429	#define SC(x) ((x) << 10)
    430
    431	/* Scaling factors */
    432	fw = SC(sd->gspca_dev.pixfmt.width) / max_width;
    433	fh = SC(sd->gspca_dev.pixfmt.height) / max_height;
    434
    435	cw = (fw >= fh) ? max_width : SC(sd->gspca_dev.pixfmt.width) / fh;
    436	ch = (fw >= fh) ? SC(sd->gspca_dev.pixfmt.height) / fw : max_height;
    437
    438	sd->sensor_width = max_width;
    439	sd->sensor_height = max_height;
    440
    441	x = (max_width - cw) / 2;
    442	y = (max_height - ch) / 2;
    443
    444	reg_w(sd, 0x10, start_cropx + x);
    445	reg_w(sd, 0x11, start_cropy + y);
    446	reg_w(sd, 0x12, start_cropx + x + cw);
    447	reg_w(sd, 0x13, start_cropy + y + ch);
    448}
    449
    450static void w9968cf_mode_init_regs(struct sd *sd)
    451{
    452	int val, vs_polarity, hs_polarity;
    453
    454	w9968cf_set_crop_window(sd);
    455
    456	reg_w(sd, 0x14, sd->gspca_dev.pixfmt.width);
    457	reg_w(sd, 0x15, sd->gspca_dev.pixfmt.height);
    458
    459	/* JPEG width & height */
    460	reg_w(sd, 0x30, sd->gspca_dev.pixfmt.width);
    461	reg_w(sd, 0x31, sd->gspca_dev.pixfmt.height);
    462
    463	/* Y & UV frame buffer strides (in WORD) */
    464	if (w9968cf_vga_mode[sd->gspca_dev.curr_mode].pixelformat ==
    465	    V4L2_PIX_FMT_JPEG) {
    466		reg_w(sd, 0x2c, sd->gspca_dev.pixfmt.width / 2);
    467		reg_w(sd, 0x2d, sd->gspca_dev.pixfmt.width / 4);
    468	} else
    469		reg_w(sd, 0x2c, sd->gspca_dev.pixfmt.width);
    470
    471	reg_w(sd, 0x00, 0xbf17); /* reset everything */
    472	reg_w(sd, 0x00, 0xbf10); /* normal operation */
    473
    474	/* Transfer size in WORDS (for UYVY format only) */
    475	val = sd->gspca_dev.pixfmt.width * sd->gspca_dev.pixfmt.height;
    476	reg_w(sd, 0x3d, val & 0xffff); /* low bits */
    477	reg_w(sd, 0x3e, val >> 16);    /* high bits */
    478
    479	if (w9968cf_vga_mode[sd->gspca_dev.curr_mode].pixelformat ==
    480	    V4L2_PIX_FMT_JPEG) {
    481		/* We may get called multiple times (usb isoc bw negotiat.) */
    482		jpeg_define(sd->jpeg_hdr, sd->gspca_dev.pixfmt.height,
    483			    sd->gspca_dev.pixfmt.width, 0x22); /* JPEG 420 */
    484		jpeg_set_qual(sd->jpeg_hdr, v4l2_ctrl_g_ctrl(sd->jpegqual));
    485		w9968cf_upload_quantizationtables(sd);
    486		v4l2_ctrl_grab(sd->jpegqual, true);
    487	}
    488
    489	/* Video Capture Control Register */
    490	if (sd->sensor == SEN_OV7620) {
    491		/* Seems to work around a bug in the image sensor */
    492		vs_polarity = 1;
    493		hs_polarity = 1;
    494	} else {
    495		vs_polarity = 1;
    496		hs_polarity = 0;
    497	}
    498
    499	val = (vs_polarity << 12) | (hs_polarity << 11);
    500
    501	/* NOTE: We may not have enough memory to do double buffering while
    502	   doing compression (amount of memory differs per model cam).
    503	   So we use the second image buffer also as jpeg stream buffer
    504	   (see w9968cf_init), and disable double buffering. */
    505	if (w9968cf_vga_mode[sd->gspca_dev.curr_mode].pixelformat ==
    506	    V4L2_PIX_FMT_JPEG) {
    507		/* val |= 0x0002; YUV422P */
    508		val |= 0x0003; /* YUV420P */
    509	} else
    510		val |= 0x0080; /* Enable HW double buffering */
    511
    512	/* val |= 0x0020; enable clamping */
    513	/* val |= 0x0008; enable (1-2-1) filter */
    514	/* val |= 0x000c; enable (2-3-6-3-2) filter */
    515
    516	val |= 0x8000; /* capt. enable */
    517
    518	reg_w(sd, 0x16, val);
    519
    520	sd->gspca_dev.empty_packet = 0;
    521}
    522
    523static void w9968cf_stop0(struct sd *sd)
    524{
    525	v4l2_ctrl_grab(sd->jpegqual, false);
    526	reg_w(sd, 0x39, 0x0000); /* disable JPEG encoder */
    527	reg_w(sd, 0x16, 0x0000); /* stop video capture */
    528}
    529
    530/* The w9968cf docs say that a 0 sized packet means EOF (and also SOF
    531   for the next frame). This seems to simply not be true when operating
    532   in JPEG mode, in this case there may be empty packets within the
    533   frame. So in JPEG mode use the JPEG SOI marker to detect SOF.
    534
    535   Note to make things even more interesting the w9968cf sends *PLANAR* jpeg,
    536   to be precise it sends: SOI, SOF, DRI, SOS, Y-data, SOS, U-data, SOS,
    537   V-data, EOI. */
    538static void w9968cf_pkt_scan(struct gspca_dev *gspca_dev,
    539			u8 *data,			/* isoc packet */
    540			int len)			/* iso packet length */
    541{
    542	struct sd *sd = (struct sd *) gspca_dev;
    543
    544	if (w9968cf_vga_mode[gspca_dev->curr_mode].pixelformat ==
    545	    V4L2_PIX_FMT_JPEG) {
    546		if (len >= 2 &&
    547		    data[0] == 0xff &&
    548		    data[1] == 0xd8) {
    549			gspca_frame_add(gspca_dev, LAST_PACKET,
    550					NULL, 0);
    551			gspca_frame_add(gspca_dev, FIRST_PACKET,
    552					sd->jpeg_hdr, JPEG_HDR_SZ);
    553			/* Strip the ff d8, our own header (which adds
    554			   huffman and quantization tables) already has this */
    555			len -= 2;
    556			data += 2;
    557		}
    558	} else {
    559		/* In UYVY mode an empty packet signals EOF */
    560		if (gspca_dev->empty_packet) {
    561			gspca_frame_add(gspca_dev, LAST_PACKET,
    562						NULL, 0);
    563			gspca_frame_add(gspca_dev, FIRST_PACKET,
    564					NULL, 0);
    565			gspca_dev->empty_packet = 0;
    566		}
    567	}
    568	gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
    569}