em28xx-core.c 21.5 KB
Newer Older
1
/*
2
   em28xx-core.c - driver for Empia EM2800/EM2820/2840 USB video capture devices
3

4 5
   Copyright (C) 2005 Ludovico Cavedon <cavedon@sssup.it>
		      Markus Rechberger <mrechberger@gmail.com>
6
		      Mauro Carvalho Chehab <mchehab@infradead.org>
7
		      Sascha Sommer <saschasommer@freenet.de>
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

#include <linux/init.h>
#include <linux/list.h>
#include <linux/module.h>
#include <linux/usb.h>
#include <linux/vmalloc.h>

30
#include "em28xx.h"
31 32 33

/* #define ENABLE_DEBUG_ISOC_FRAMES */

34
static unsigned int core_debug = 0;
35 36 37
module_param(core_debug,int,0644);
MODULE_PARM_DESC(core_debug,"enable debug messages [core]");

38
#define em28xx_coredbg(fmt, arg...) do {\
39 40
	if (core_debug) \
		printk(KERN_INFO "%s %s :"fmt, \
41
			 dev->name, __FUNCTION__ , ##arg); } while (0)
42

43
static unsigned int reg_debug = 0;
44 45 46
module_param(reg_debug,int,0644);
MODULE_PARM_DESC(reg_debug,"enable debug messages [URB reg]");

47
#define em28xx_regdbg(fmt, arg...) do {\
48 49
	if (reg_debug) \
		printk(KERN_INFO "%s %s :"fmt, \
50
			 dev->name, __FUNCTION__ , ##arg); } while (0)
51

52
static unsigned int isoc_debug = 0;
53
module_param(isoc_debug,int,0644);
54
MODULE_PARM_DESC(isoc_debug,"enable debug messages [isoc transfers]");
55

56
#define em28xx_isocdbg(fmt, arg...) do {\
57 58
	if (isoc_debug) \
		printk(KERN_INFO "%s %s :"fmt, \
59
			 dev->name, __FUNCTION__ , ##arg); } while (0)
60

61
static int alt = EM28XX_PINOUT;
62 63 64
module_param(alt, int, 0644);
MODULE_PARM_DESC(alt, "alternate setting to use for video endpoint");

65

66
/*
67
 * em28xx_request_buffers()
68 69
 * allocate a number of buffers
 */
70
u32 em28xx_request_buffers(struct em28xx *dev, u32 count)
71 72 73 74
{
	const size_t imagesize = PAGE_ALIGN(dev->frame_size);	/*needs to be page aligned cause the buffers can be mapped individually! */
	void *buff = NULL;
	u32 i;
75
	em28xx_coredbg("requested %i buffers with size %zi", count, imagesize);
76 77
	if (count > EM28XX_NUM_FRAMES)
		count = EM28XX_NUM_FRAMES;
78 79 80

	dev->num_frames = count;
	while (dev->num_frames > 0) {
81 82
		if ((buff = vmalloc_32(dev->num_frames * imagesize))) {
			memset(buff, 0, dev->num_frames * imagesize);
83
			break;
84
		}
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
		dev->num_frames--;
	}

	for (i = 0; i < dev->num_frames; i++) {
		dev->frame[i].bufmem = buff + i * imagesize;
		dev->frame[i].buf.index = i;
		dev->frame[i].buf.m.offset = i * imagesize;
		dev->frame[i].buf.length = dev->frame_size;
		dev->frame[i].buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
		dev->frame[i].buf.sequence = 0;
		dev->frame[i].buf.field = V4L2_FIELD_NONE;
		dev->frame[i].buf.memory = V4L2_MEMORY_MMAP;
		dev->frame[i].buf.flags = 0;
	}
	return dev->num_frames;
}

/*
103
 * em28xx_queue_unusedframes()
104 105
 * add all frames that are not currently in use to the inbuffer queue
 */
106
void em28xx_queue_unusedframes(struct em28xx *dev)
107 108 109 110 111 112 113 114 115 116 117 118 119 120
{
	unsigned long lock_flags;
	u32 i;

	for (i = 0; i < dev->num_frames; i++)
		if (dev->frame[i].state == F_UNUSED) {
			dev->frame[i].state = F_QUEUED;
			spin_lock_irqsave(&dev->queue_lock, lock_flags);
			list_add_tail(&dev->frame[i].frame, &dev->inqueue);
			spin_unlock_irqrestore(&dev->queue_lock, lock_flags);
		}
}

/*
121
 * em28xx_release_buffers()
122 123
 * free frame buffers
 */
124
void em28xx_release_buffers(struct em28xx *dev)
125 126
{
	if (dev->num_frames) {
127
		vfree(dev->frame[0].bufmem);
128 129 130 131 132
		dev->num_frames = 0;
	}
}

/*
133
 * em28xx_read_reg_req()
134 135
 * reads data from the usb device specifying bRequest
 */
136
int em28xx_read_reg_req_len(struct em28xx *dev, u8 req, u16 reg,
137 138 139 140
				   char *buf, int len)
{
	int ret, byte;

141 142 143
	if (dev->state & DEV_DISCONNECTED)
		return(-ENODEV);

144
	em28xx_regdbg("req=%02x, reg=%02x ", req, reg);
145 146 147 148 149 150 151 152

	ret = usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev, 0), req,
			      USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
			      0x0000, reg, buf, len, HZ);

	if (reg_debug){
		printk(ret < 0 ? " failed!\n" : "%02x values: ", ret);
		for (byte = 0; byte < len; byte++) {
153
			printk(" %02x", (unsigned char)buf[byte]);
154 155 156 157 158 159 160 161
		}
		printk("\n");
	}

	return ret;
}

/*
162
 * em28xx_read_reg_req()
163 164
 * reads data from the usb device specifying bRequest
 */
165
int em28xx_read_reg_req(struct em28xx *dev, u8 req, u16 reg)
166 167 168 169
{
	u8 val;
	int ret;

170 171 172
	if (dev->state & DEV_DISCONNECTED)
		return(-ENODEV);

173
	em28xx_regdbg("req=%02x, reg=%02x:", req, reg);
174 175 176 177 178 179

	ret = usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev, 0), req,
			      USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
			      0x0000, reg, &val, 1, HZ);

	if (reg_debug)
180 181
		printk(ret < 0 ? " failed!\n" :
				 "%02x\n", (unsigned char) val);
182 183 184 185 186 187 188

	if (ret < 0)
		return ret;

	return val;
}

189
int em28xx_read_reg(struct em28xx *dev, u16 reg)
190
{
191
	return em28xx_read_reg_req(dev, USB_REQ_GET_STATUS, reg);
192 193 194
}

/*
195
 * em28xx_write_regs_req()
196 197
 * sends data to the usb device, specifying bRequest
 */
198
int em28xx_write_regs_req(struct em28xx *dev, u8 req, u16 reg, char *buf,
199 200 201 202 203
				 int len)
{
	int ret;

	/*usb_control_msg seems to expect a kmalloced buffer */
204 205 206 207 208 209
	unsigned char *bufs;

	if (dev->state & DEV_DISCONNECTED)
		return(-ENODEV);

	bufs = kmalloc(len, GFP_KERNEL);
210

211
	em28xx_regdbg("req=%02x reg=%02x:", req, reg);
212 213 214 215 216 217 218 219 220 221 222 223 224 225

	if (reg_debug) {
		int i;
		for (i = 0; i < len; ++i)
			printk (" %02x", (unsigned char)buf[i]);
		printk ("\n");
	}

	if (!bufs)
		return -ENOMEM;
	memcpy(bufs, buf, len);
	ret = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0), req,
			      USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
			      0x0000, reg, bufs, len, HZ);
226
	msleep(5);		/* FIXME: magic number */
227 228 229 230
	kfree(bufs);
	return ret;
}

231
int em28xx_write_regs(struct em28xx *dev, u16 reg, char *buf, int len)
232
{
233
	return em28xx_write_regs_req(dev, USB_REQ_GET_STATUS, reg, buf, len);
234 235 236
}

/*
237
 * em28xx_write_reg_bits()
238 239 240
 * sets only some bits (specified by bitmask) of a register, by first reading
 * the actual value
 */
241
static int em28xx_write_reg_bits(struct em28xx *dev, u16 reg, u8 val,
242 243 244 245
				 u8 bitmask)
{
	int oldval;
	u8 newval;
246
	if ((oldval = em28xx_read_reg(dev, reg)) < 0)
247 248
		return oldval;
	newval = (((u8) oldval) & ~bitmask) | (val & bitmask);
249
	return em28xx_write_regs(dev, reg, &newval, 1);
250 251 252
}

/*
253
 * em28xx_write_ac97()
254 255
 * write a 16 bit value to the specified AC97 address (LSB first!)
 */
256
static int em28xx_write_ac97(struct em28xx *dev, u8 reg, u8 *val)
257
{
258
	int ret, i;
259
	u8 addr = reg & 0x7f;
260
	if ((ret = em28xx_write_regs(dev, AC97LSB_REG, val, 2)) < 0)
261
		return ret;
262
	if ((ret = em28xx_write_regs(dev, AC97ADDR_REG, &addr, 1)) < 0)
263
		return ret;
264 265 266 267 268 269 270 271

	/* Wait up to 50 ms for AC97 command to complete */
	for (i = 0; i < 10; i++) {
		if ((ret = em28xx_read_reg(dev, AC97BUSY_REG)) < 0)
			return ret;
		if (!((u8) ret) & 0x01)
			return 0;
		msleep(5);
272
	}
273
	em28xx_warn ("AC97 command still being executed: not handled properly!\n");
274 275 276
	return 0;
}

277
static int em28xx_set_audio_source(struct em28xx *dev)
278 279 280 281
{
	static char *enable  = "\x08\x08";
	static char *disable = "\x08\x88";
	char *video = enable, *line = disable;
282
	int ret;
283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319
	u8 input;

	if (dev->is_em2800) {
		if (dev->ctl_ainput)
			input = EM2800_AUDIO_SRC_LINE;
		else
			input = EM2800_AUDIO_SRC_TUNER;

		ret = em28xx_write_regs(dev, EM2800_AUDIOSRC_REG, &input, 1);
		if (ret < 0)
			return ret;
	}

	if (dev->has_msp34xx)
		input = EM28XX_AUDIO_SRC_TUNER;
	else {
		switch (dev->ctl_ainput) {
		case EM28XX_AMUX_VIDEO:
			input = EM28XX_AUDIO_SRC_TUNER;
			break;
		case EM28XX_AMUX_LINE_IN:
			input = EM28XX_AUDIO_SRC_LINE;
			break;
		case EM28XX_AMUX_AC97_VIDEO:
			input = EM28XX_AUDIO_SRC_LINE;
			break;
		case EM28XX_AMUX_AC97_LINE_IN:
			input = EM28XX_AUDIO_SRC_LINE;
			video = disable;
			line  = enable;
			break;
		}
	}

	ret = em28xx_write_reg_bits(dev, AUDIOSRC_REG, input, 0xc0);
	if (ret < 0)
		return ret;
320
	msleep(5);
321

322 323 324
	/* Sets AC97 mixer registers
	   This is seems to be needed, even for non-ac97 configs
	 */
325 326 327 328 329 330 331 332 333
	ret = em28xx_write_ac97(dev, VIDEO_AC97, video);
	if (ret < 0)
		return ret;

	ret = em28xx_write_ac97(dev, LINE_IN_AC97, line);

	return ret;
}

334
int em28xx_audio_analog_set(struct em28xx *dev)
335
{
336
	int ret;
337
	char s[2] = { 0x00, 0x00 };
338
	u8 xclk = 0x07;
339

340 341
	s[0] |= 0x1f - dev->volume;
	s[1] |= 0x1f - dev->volume;
342

343 344
	/* Mute */
	s[1] |= 0x80;
345
	ret = em28xx_write_ac97(dev, MASTER_AC97, s);
346

347 348 349
	if (ret < 0)
		return ret;

350 351 352 353 354 355 356
	if (dev->has_12mhz_i2s)
		xclk |= 0x20;

	if (!dev->mute)
		xclk |= 0x80;

	ret = em28xx_write_reg_bits(dev, XCLK_REG, xclk, 0xa7);
357 358
	if (ret < 0)
		return ret;
359
	msleep(10);
360 361 362

	/* Selects the proper audio input */
	ret = em28xx_set_audio_source(dev);
363

364 365 366 367 368
	/* Unmute device */
	if (!dev->mute)
		s[1] &= ~0x80;
	ret = em28xx_write_ac97(dev, MASTER_AC97, s);

369 370 371
	return ret;
}
EXPORT_SYMBOL_GPL(em28xx_audio_analog_set);
372

373
int em28xx_colorlevels_set_default(struct em28xx *dev)
374
{
375 376 377 378 379 380 381 382 383 384 385 386 387 388
	em28xx_write_regs(dev, YGAIN_REG, "\x10", 1);	/* contrast */
	em28xx_write_regs(dev, YOFFSET_REG, "\x00", 1);	/* brightness */
	em28xx_write_regs(dev, UVGAIN_REG, "\x10", 1);	/* saturation */
	em28xx_write_regs(dev, UOFFSET_REG, "\x00", 1);
	em28xx_write_regs(dev, VOFFSET_REG, "\x00", 1);
	em28xx_write_regs(dev, SHARPNESS_REG, "\x00", 1);

	em28xx_write_regs(dev, GAMMA_REG, "\x20", 1);
	em28xx_write_regs(dev, RGAIN_REG, "\x20", 1);
	em28xx_write_regs(dev, GGAIN_REG, "\x20", 1);
	em28xx_write_regs(dev, BGAIN_REG, "\x20", 1);
	em28xx_write_regs(dev, ROFFSET_REG, "\x00", 1);
	em28xx_write_regs(dev, GOFFSET_REG, "\x00", 1);
	return em28xx_write_regs(dev, BOFFSET_REG, "\x00", 1);
389 390
}

391
int em28xx_capture_start(struct em28xx *dev, int start)
392 393 394 395
{
	int ret;
	/* FIXME: which is the best order? */
	/* video registers are sampled by VREF */
396
	if ((ret = em28xx_write_reg_bits(dev, USBSUSP_REG, start ? 0x10 : 0x00,
397 398 399
					  0x10)) < 0)
		return ret;
	/* enable video capture */
400
	return em28xx_write_regs(dev, VINENABLE_REG, start ? "\x67" : "\x27", 1);
401 402
}

403
int em28xx_outfmt_set_yuv422(struct em28xx *dev)
404
{
405 406 407
	em28xx_write_regs(dev, OUTFMT_REG, "\x34", 1);
	em28xx_write_regs(dev, VINMODE_REG, "\x10", 1);
	return em28xx_write_regs(dev, VINCTRL_REG, "\x11", 1);
408 409
}

410 411
static int em28xx_accumulator_set(struct em28xx *dev, u8 xmin, u8 xmax,
				  u8 ymin, u8 ymax)
412
{
413
	em28xx_coredbg("em28xx Scale: (%d,%d)-(%d,%d)\n", xmin, ymin, xmax, ymax);
414

415 416 417 418
	em28xx_write_regs(dev, XMIN_REG, &xmin, 1);
	em28xx_write_regs(dev, XMAX_REG, &xmax, 1);
	em28xx_write_regs(dev, YMIN_REG, &ymin, 1);
	return em28xx_write_regs(dev, YMAX_REG, &ymax, 1);
419 420
}

421
static int em28xx_capture_area_set(struct em28xx *dev, u8 hstart, u8 vstart,
422 423 424 425 426 427
				   u16 width, u16 height)
{
	u8 cwidth = width;
	u8 cheight = height;
	u8 overflow = (height >> 7 & 0x02) | (width >> 8 & 0x01);

428
	em28xx_coredbg("em28xx Area Set: (%d,%d)\n", (width | (overflow & 2) << 7),
429 430
			(height | (overflow & 1) << 8));

431 432 433 434 435
	em28xx_write_regs(dev, HSTART_REG, &hstart, 1);
	em28xx_write_regs(dev, VSTART_REG, &vstart, 1);
	em28xx_write_regs(dev, CWIDTH_REG, &cwidth, 1);
	em28xx_write_regs(dev, CHEIGHT_REG, &cheight, 1);
	return em28xx_write_regs(dev, OFLOW_REG, &overflow, 1);
436 437
}

438
static int em28xx_scaler_set(struct em28xx *dev, u16 h, u16 v)
439
{
440 441 442 443 444 445 446 447
	u8 mode;
	/* the em2800 scaler only supports scaling down to 50% */
	if(dev->is_em2800)
		mode = (v ? 0x20 : 0x00) | (h ? 0x10 : 0x00);
	else {
		u8 buf[2];
		buf[0] = h;
		buf[1] = h >> 8;
448
		em28xx_write_regs(dev, HSCALELOW_REG, (char *)buf, 2);
449 450
		buf[0] = v;
		buf[1] = v >> 8;
451
		em28xx_write_regs(dev, VSCALELOW_REG, (char *)buf, 2);
452 453
		/* it seems that both H and V scalers must be active to work correctly */
		mode = (h || v)? 0x30: 0x00;
454
	}
455
	return em28xx_write_reg_bits(dev, COMPR_REG, mode, 0x30);
456 457 458
}

/* FIXME: this only function read values from dev */
459
int em28xx_resolution_set(struct em28xx *dev)
460 461 462 463 464
{
	int width, height;
	width = norm_maxw(dev);
	height = norm_maxh(dev) >> 1;

465 466 467 468
	em28xx_outfmt_set_yuv422(dev);
	em28xx_accumulator_set(dev, 1, (width - 4) >> 2, 1, (height - 4) >> 2);
	em28xx_capture_area_set(dev, 0, 0, width >> 2, height >> 2);
	return em28xx_scaler_set(dev, dev->hscale, dev->vscale);
469 470 471 472 473 474
}


/******************* isoc transfer handling ****************************/

#ifdef ENABLE_DEBUG_ISOC_FRAMES
475
static void em28xx_isoc_dump(struct urb *urb)
476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513
{
	int len = 0;
	int ntrans = 0;
	int i;

	printk(KERN_DEBUG "isocIrq: sf=%d np=%d ec=%x\n",
	       urb->start_frame, urb->number_of_packets,
	       urb->error_count);
	for (i = 0; i < urb->number_of_packets; i++) {
		unsigned char *buf =
				urb->transfer_buffer +
				urb->iso_frame_desc[i].offset;
		int alen = urb->iso_frame_desc[i].actual_length;
		if (alen > 0) {
			if (buf[0] == 0x88) {
				ntrans++;
				len += alen;
			} else if (buf[0] == 0x22) {
				printk(KERN_DEBUG
						"= l=%d nt=%d bpp=%d\n",
				len - 4 * ntrans, ntrans,
				ntrans == 0 ? 0 : len / ntrans);
				ntrans = 1;
				len = alen;
			} else
				printk(KERN_DEBUG "!\n");
		}
		printk(KERN_DEBUG "   n=%d s=%d al=%d %x\n", i,
		       urb->iso_frame_desc[i].status,
		       urb->iso_frame_desc[i].actual_length,
		       (unsigned int)
				       *((unsigned char *)(urb->transfer_buffer +
				       urb->iso_frame_desc[i].
				       offset)));
	}
}
#endif

514
static inline int em28xx_isoc_video(struct em28xx *dev,struct em28xx_frame_t **f,
515 516 517 518 519 520 521
				    unsigned long *lock_flags, unsigned char buf)
{
	if (!(buf & 0x01)) {
		if ((*f)->state == F_GRABBING) {
			/*previous frame is incomplete */
			if ((*f)->fieldbytesused < dev->field_size) {
				(*f)->state = F_ERROR;
522
				em28xx_isocdbg ("dropping incomplete bottom field (%i missing bytes)",
523 524 525 526 527 528 529 530 531 532 533 534
					 dev->field_size-(*f)->fieldbytesused);
			} else {
				(*f)->state = F_DONE;
				(*f)->buf.bytesused = dev->frame_size;
			}
		}
		if ((*f)->state == F_DONE || (*f)->state == F_ERROR) {
			/* move current frame to outqueue and get next free buffer from inqueue */
			spin_lock_irqsave(&dev-> queue_lock, *lock_flags);
			list_move_tail(&(*f)->frame, &dev->outqueue);
			if (!list_empty(&dev->inqueue))
				(*f) = list_entry(dev-> inqueue.next,
535
			struct em28xx_frame_t,frame);
536 537 538 539 540
			else
				(*f) = NULL;
			spin_unlock_irqrestore(&dev->queue_lock,*lock_flags);
		}
		if (!(*f)) {
541
			em28xx_isocdbg ("new frame but no buffer is free");
542 543 544 545 546 547 548 549 550 551 552 553 554 555
			return -1;
		}
		do_gettimeofday(&(*f)->buf.timestamp);
		(*f)->buf.sequence = ++dev->frame_count;
		(*f)->buf.field = V4L2_FIELD_INTERLACED;
		(*f)->state = F_GRABBING;
		(*f)->buf.bytesused = 0;
		(*f)->top_field = 1;
		(*f)->fieldbytesused = 0;
	} else {
					/* acquiring bottom field */
		if ((*f)->state == F_GRABBING) {
			if (!(*f)->top_field) {
				(*f)->state = F_ERROR;
556
				em28xx_isocdbg ("unexpected begin of bottom field; discarding it");
557 558
			} else if ((*f)-> fieldbytesused < dev->field_size - 172) {
				(*f)->state = F_ERROR;
559
				em28xx_isocdbg ("dropping incomplete top field (%i missing bytes)",
560 561 562 563 564 565 566 567 568 569
					 dev->field_size-(*f)->fieldbytesused);
			} else {
				(*f)->top_field = 0;
				(*f)->fieldbytesused = 0;
			}
		}
	}
	return (0);
}

570 571
static inline void em28xx_isoc_video_copy(struct em28xx *dev,
					  struct em28xx_frame_t **f, unsigned char *buf, int len)
572 573 574 575
{
	void *fieldstart, *startwrite, *startread;
	int linesdone, currlinedone, offset, lencopy,remain;

576
	if(dev->frame_size != (*f)->buf.length){
577
		em28xx_err("frame_size %i and buf.length %i are different!!!\n",dev->frame_size,(*f)->buf.length);
578 579 580
		return;
	}

581 582
	if ((*f)->fieldbytesused + len > dev->field_size)
		len =dev->field_size - (*f)->fieldbytesused;
583 584

	if (buf[0] != 0x88 && buf[0] != 0x22) {
585
		em28xx_isocdbg("frame is not complete\n");
586 587 588 589 590
		startread = buf;
		len+=4;
	} else
		startread = buf + 4;

591
	remain = len;
592

593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623
	if ((*f)->top_field)
		fieldstart = (*f)->bufmem;
	else
		fieldstart = (*f)->bufmem + dev->bytesperline;

	linesdone = (*f)->fieldbytesused / dev->bytesperline;
	currlinedone = (*f)->fieldbytesused % dev->bytesperline;
	offset = linesdone * dev->bytesperline * 2 + currlinedone;
	startwrite = fieldstart + offset;
	lencopy = dev->bytesperline - currlinedone;
	lencopy = lencopy > remain ? remain : lencopy;

	memcpy(startwrite, startread, lencopy);
	remain -= lencopy;

	while (remain > 0) {
		startwrite += lencopy + dev->bytesperline;
		startread += lencopy;
		if (dev->bytesperline > remain)
			lencopy = remain;
		else
			lencopy = dev->bytesperline;

		memcpy(startwrite, startread, lencopy);
		remain -= lencopy;
	}

	(*f)->fieldbytesused += len;
}

/*
624
 * em28xx_isoIrq()
625 626
 * handles the incoming isoc urbs and fills the frames from our inqueue
 */
627
static void em28xx_isocIrq(struct urb *urb)
628
{
629
	struct em28xx *dev = urb->context;
630
	int i, status;
631
	struct em28xx_frame_t **f;
632 633 634 635 636 637
	unsigned long lock_flags;

	if (!dev)
		return;
#ifdef ENABLE_DEBUG_ISOC_FRAMES
	if (isoc_debug>1)
638
		em28xx_isoc_dump(urb);
639 640 641 642 643 644 645 646 647 648 649
#endif

	if (urb->status == -ENOENT)
		return;

	f = &dev->frame_current;

	if (dev->stream == STREAM_INTERRUPT) {
		dev->stream = STREAM_OFF;
		if ((*f))
			(*f)->state = F_QUEUED;
650
		em28xx_isocdbg("stream interrupted");
651 652 653 654 655 656 657 658 659
		wake_up_interruptible(&dev->wait_stream);
	}

	if ((dev->state & DEV_DISCONNECTED) || (dev->state & DEV_MISCONFIGURED))
		return;

	if (dev->stream == STREAM_ON && !list_empty(&dev->inqueue)) {
		if (!(*f))
			(*f) = list_entry(dev->inqueue.next,
660
		struct em28xx_frame_t, frame);
661 662 663 664 665 666 667

		for (i = 0; i < urb->number_of_packets; i++) {
			unsigned char *buf = urb->transfer_buffer +
					urb->iso_frame_desc[i].offset;
			int len = urb->iso_frame_desc[i].actual_length - 4;

			if (urb->iso_frame_desc[i].status) {
668
				em28xx_isocdbg("data error: [%d] len=%d, status=%d", i,
669 670
					urb->iso_frame_desc[i].actual_length,
					urb->iso_frame_desc[i].status);
671 672
				if (urb->iso_frame_desc[i].status != -EPROTO)
					continue;
673 674
			}
			if (urb->iso_frame_desc[i].actual_length <= 0) {
675
				em28xx_isocdbg("packet %d is empty",i);
676 677 678 679
				continue;
			}
			if (urb->iso_frame_desc[i].actual_length >
						 dev->max_pkt_size) {
680
				em28xx_isocdbg("packet bigger than packet size");
681 682 683 684
				continue;
			}
			/*new frame */
			if (buf[0] == 0x22 && buf[1] == 0x5a) {
685
				em28xx_isocdbg("Video frame, length=%i!",len);
686

687
				if (em28xx_isoc_video(dev,f,&lock_flags,buf[2]))
688 689
				break;
			} else if (buf[0]==0x33 && buf[1]==0x95 && buf[2]==0x00) {
690
				em28xx_isocdbg("VBI HEADER!!!");
691 692 693 694
			}

			/* actual copying */
			if ((*f)->state == F_GRABBING) {
695
				em28xx_isoc_video_copy(dev,f,buf, len);
696 697 698 699 700 701 702 703 704 705 706
			}
		}
	}

	for (i = 0; i < urb->number_of_packets; i++) {
		urb->iso_frame_desc[i].status = 0;
		urb->iso_frame_desc[i].actual_length = 0;
	}

	urb->status = 0;
	if ((status = usb_submit_urb(urb, GFP_ATOMIC))) {
707
		em28xx_errdev("resubmit of urb failed (error=%i)\n", status);
708 709 710 711 712 713 714
		dev->state |= DEV_MISCONFIGURED;
	}
	wake_up_interruptible(&dev->wait_frame);
	return;
}

/*
715 716
 * em28xx_uninit_isoc()
 * deallocates the buffers and urbs allocated during em28xx_init_iosc()
717
 */
718
void em28xx_uninit_isoc(struct em28xx *dev)
719 720 721
{
	int i;

722
	for (i = 0; i < EM28XX_NUM_BUFS; i++) {
723 724
		if (dev->urb[i]) {
			usb_kill_urb(dev->urb[i]);
725
			if (dev->transfer_buffer[i]){
726
				usb_buffer_free(dev->udev,(EM28XX_NUM_PACKETS*dev->max_pkt_size),dev->transfer_buffer[i],dev->urb[i]->transfer_dma);
727
			}
728 729 730 731 732
			usb_free_urb(dev->urb[i]);
		}
		dev->urb[i] = NULL;
		dev->transfer_buffer[i] = NULL;
	}
733
	em28xx_capture_start(dev, 0);
734 735 736
}

/*
737
 * em28xx_init_isoc()
738 739
 * allocates transfer buffers and submits the urbs for isoc transfer
 */
740
int em28xx_init_isoc(struct em28xx *dev)
741
{
742
	/* change interface to 3 which allows the biggest packet sizes */
743
	int i, errCode;
744
	const int sb_size = EM28XX_NUM_PACKETS * dev->max_pkt_size;
745 746 747 748 749 750

	/* reset streaming vars */
	dev->frame_current = NULL;
	dev->frame_count = 0;

	/* allocate urbs */
751
	for (i = 0; i < EM28XX_NUM_BUFS; i++) {
752 753 754
		struct urb *urb;
		int j, k;
		/* allocate transfer buffer */
755
		urb = usb_alloc_urb(EM28XX_NUM_PACKETS, GFP_KERNEL);
756
		if (!urb){
757 758
			em28xx_errdev("cannot alloc urb %i\n", i);
			em28xx_uninit_isoc(dev);
759 760 761
			return -ENOMEM;
		}
		dev->transfer_buffer[i] = usb_buffer_alloc(dev->udev, sb_size, GFP_KERNEL,&urb->transfer_dma);
762
		if (!dev->transfer_buffer[i]) {
763
			em28xx_errdev
764 765
					("unable to allocate %i bytes for transfer buffer %i\n",
					 sb_size, i);
766
			em28xx_uninit_isoc(dev);
767
			usb_free_urb(urb);
768 769 770
			return -ENOMEM;
		}
		memset(dev->transfer_buffer[i], 0, sb_size);
771 772 773 774 775 776
		urb->dev = dev->udev;
		urb->context = dev;
		urb->pipe = usb_rcvisocpipe(dev->udev, 0x82);
		urb->transfer_flags = URB_ISO_ASAP;
		urb->interval = 1;
		urb->transfer_buffer = dev->transfer_buffer[i];
777 778
		urb->complete = em28xx_isocIrq;
		urb->number_of_packets = EM28XX_NUM_PACKETS;
779
		urb->transfer_buffer_length = sb_size;
780
		for (j = k = 0; j < EM28XX_NUM_PACKETS;
781 782 783 784
				j++, k += dev->max_pkt_size) {
			urb->iso_frame_desc[j].offset = k;
			urb->iso_frame_desc[j].length =
				dev->max_pkt_size;
785
		}
786
		dev->urb[i] = urb;
787 788 789
	}

	/* submit urbs */
790
	for (i = 0; i < EM28XX_NUM_BUFS; i++) {
791 792
		errCode = usb_submit_urb(dev->urb[i], GFP_KERNEL);
		if (errCode) {
793
			em28xx_errdev("submit of urb %i failed (error=%i)\n", i,
794
				      errCode);
795
			em28xx_uninit_isoc(dev);
796 797 798 799 800 801 802
			return errCode;
		}
	}

	return 0;
}

803
int em28xx_set_alternate(struct em28xx *dev)
804 805 806 807 808
{
	int errCode, prev_alt = dev->alt;
	dev->alt = alt;
	if (dev->alt == 0) {
		int i;
809
		for(i=0;i< dev->num_alt; i++)
810 811
			if(dev->alt_max_pkt_size[i]>dev->alt_max_pkt_size[dev->alt])
				dev->alt=i;
812 813 814 815
	}

	if (dev->alt != prev_alt) {
		dev->max_pkt_size = dev->alt_max_pkt_size[dev->alt];
816
		em28xx_coredbg("setting alternate %d with wMaxPacketSize=%u\n", dev->alt,
817 818 819
		       dev->max_pkt_size);
		errCode = usb_set_interface(dev->udev, 0, dev->alt);
		if (errCode < 0) {
820 821
			em28xx_errdev ("cannot change alternate number to %d (error=%i)\n",
							dev->alt, errCode);
822 823 824 825 826
			return errCode;
		}
	}
	return 0;
}