em28xx-core.c 16.1 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;
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, __func__ , ##arg); } while (0)
42

43
static unsigned int reg_debug;
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, __func__ , ##arg); } while (0)
51

52
static int alt = EM28XX_PINOUT;
53 54 55
module_param(alt, int, 0644);
MODULE_PARM_DESC(alt, "alternate setting to use for video endpoint");

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

62
/*
63
 * em28xx_read_reg_req()
64 65
 * reads data from the usb device specifying bRequest
 */
66
int em28xx_read_reg_req_len(struct em28xx *dev, u8 req, u16 reg,
67 68 69 70
				   char *buf, int len)
{
	int ret, byte;

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

74
	em28xx_regdbg("req=%02x, reg=%02x ", req, reg);
75 76 77 78 79 80 81 82

	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++) {
83
			printk(" %02x", (unsigned char)buf[byte]);
84 85 86 87 88 89 90 91
		}
		printk("\n");
	}

	return ret;
}

/*
92
 * em28xx_read_reg_req()
93 94
 * reads data from the usb device specifying bRequest
 */
95
int em28xx_read_reg_req(struct em28xx *dev, u8 req, u16 reg)
96 97 98 99
{
	u8 val;
	int ret;

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

103
	em28xx_regdbg("req=%02x, reg=%02x:", req, reg);
104 105 106 107 108 109

	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)
110 111
		printk(ret < 0 ? " failed!\n" :
				 "%02x\n", (unsigned char) val);
112 113 114 115 116 117 118

	if (ret < 0)
		return ret;

	return val;
}

119
int em28xx_read_reg(struct em28xx *dev, u16 reg)
120
{
121
	return em28xx_read_reg_req(dev, USB_REQ_GET_STATUS, reg);
122 123 124
}

/*
125
 * em28xx_write_regs_req()
126 127
 * sends data to the usb device, specifying bRequest
 */
128
int em28xx_write_regs_req(struct em28xx *dev, u8 req, u16 reg, char *buf,
129 130 131 132 133
				 int len)
{
	int ret;

	/*usb_control_msg seems to expect a kmalloced buffer */
134 135 136 137 138 139
	unsigned char *bufs;

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

	bufs = kmalloc(len, GFP_KERNEL);
140

141
	em28xx_regdbg("req=%02x reg=%02x:", req, reg);
142 143 144 145 146 147 148 149 150 151 152 153 154 155

	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);
156
	msleep(5);		/* FIXME: magic number */
157 158 159 160
	kfree(bufs);
	return ret;
}

161
int em28xx_write_regs(struct em28xx *dev, u16 reg, char *buf, int len)
162
{
163
	return em28xx_write_regs_req(dev, USB_REQ_GET_STATUS, reg, buf, len);
164 165 166
}

/*
167
 * em28xx_write_reg_bits()
168 169 170
 * sets only some bits (specified by bitmask) of a register, by first reading
 * the actual value
 */
171
static int em28xx_write_reg_bits(struct em28xx *dev, u16 reg, u8 val,
172 173 174 175
				 u8 bitmask)
{
	int oldval;
	u8 newval;
176
	if ((oldval = em28xx_read_reg(dev, reg)) < 0)
177 178
		return oldval;
	newval = (((u8) oldval) & ~bitmask) | (val & bitmask);
179
	return em28xx_write_regs(dev, reg, &newval, 1);
180 181 182
}

/*
183
 * em28xx_write_ac97()
184 185
 * write a 16 bit value to the specified AC97 address (LSB first!)
 */
186
static int em28xx_write_ac97(struct em28xx *dev, u8 reg, u8 *val)
187
{
188
	int ret, i;
189
	u8 addr = reg & 0x7f;
190
	if ((ret = em28xx_write_regs(dev, AC97LSB_REG, val, 2)) < 0)
191
		return ret;
192
	if ((ret = em28xx_write_regs(dev, AC97ADDR_REG, &addr, 1)) < 0)
193
		return ret;
194 195 196 197 198

	/* 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;
199
		if (!(ret & 0x01))
200 201
			return 0;
		msleep(5);
202
	}
203
	em28xx_warn ("AC97 command still being executed: not handled properly!\n");
204 205 206
	return 0;
}

207
static int em28xx_set_audio_source(struct em28xx *dev)
208 209 210 211
{
	static char *enable  = "\x08\x08";
	static char *disable = "\x08\x88";
	char *video = enable, *line = disable;
212
	int ret;
213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249
	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;
250
	msleep(5);
251

252 253 254
	/* Sets AC97 mixer registers
	   This is seems to be needed, even for non-ac97 configs
	 */
255 256 257 258 259 260 261 262 263
	ret = em28xx_write_ac97(dev, VIDEO_AC97, video);
	if (ret < 0)
		return ret;

	ret = em28xx_write_ac97(dev, LINE_IN_AC97, line);

	return ret;
}

264
int em28xx_audio_analog_set(struct em28xx *dev)
265
{
266
	int ret;
267
	char s[2] = { 0x00, 0x00 };
268
	u8 xclk = 0x07;
269

270 271
	s[0] |= 0x1f - dev->volume;
	s[1] |= 0x1f - dev->volume;
272

273 274
	/* Mute */
	s[1] |= 0x80;
275
	ret = em28xx_write_ac97(dev, MASTER_AC97, s);
276

277 278 279
	if (ret < 0)
		return ret;

280 281 282 283 284 285 286
	if (dev->has_12mhz_i2s)
		xclk |= 0x20;

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

	ret = em28xx_write_reg_bits(dev, XCLK_REG, xclk, 0xa7);
287 288
	if (ret < 0)
		return ret;
289
	msleep(10);
290 291 292

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

294 295 296 297 298
	/* Unmute device */
	if (!dev->mute)
		s[1] &= ~0x80;
	ret = em28xx_write_ac97(dev, MASTER_AC97, s);

299 300 301
	return ret;
}
EXPORT_SYMBOL_GPL(em28xx_audio_analog_set);
302

303
int em28xx_colorlevels_set_default(struct em28xx *dev)
304
{
305 306 307 308 309 310 311 312 313 314 315 316 317 318
	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);
319 320
}

321
int em28xx_capture_start(struct em28xx *dev, int start)
322
{
323
	int rc;
324 325
	/* FIXME: which is the best order? */
	/* video registers are sampled by VREF */
326 327 328 329 330 331 332 333
	rc = em28xx_write_reg_bits(dev, USBSUSP_REG,
				   start ? 0x10 : 0x00, 0x10);
	if (rc < 0)
		return rc;

	if (!start) {
		/* disable video capture */
		rc = em28xx_write_regs(dev, VINENABLE_REG, "\x27", 1);
334
		return rc;
335 336
	}

337
	/* enable video capture */
338
	rc = em28xx_write_regs_req(dev, 0x00, 0x48, "\x00", 1);
339

340 341 342 343 344 345 346 347
	if (dev->mode == EM28XX_ANALOG_MODE)
		rc = em28xx_write_regs(dev, VINENABLE_REG,"\x67", 1);
	else
		rc = em28xx_write_regs(dev, VINENABLE_REG,"\x37", 1);

	msleep (6);

	return rc;
348 349
}

350
int em28xx_outfmt_set_yuv422(struct em28xx *dev)
351
{
352 353 354
	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);
355 356
}

357 358
static int em28xx_accumulator_set(struct em28xx *dev, u8 xmin, u8 xmax,
				  u8 ymin, u8 ymax)
359
{
360
	em28xx_coredbg("em28xx Scale: (%d,%d)-(%d,%d)\n", xmin, ymin, xmax, ymax);
361

362 363 364 365
	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);
366 367
}

368
static int em28xx_capture_area_set(struct em28xx *dev, u8 hstart, u8 vstart,
369 370 371 372 373 374
				   u16 width, u16 height)
{
	u8 cwidth = width;
	u8 cheight = height;
	u8 overflow = (height >> 7 & 0x02) | (width >> 8 & 0x01);

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

378 379 380 381 382
	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);
383 384
}

385
static int em28xx_scaler_set(struct em28xx *dev, u16 h, u16 v)
386
{
387 388 389 390 391 392 393 394
	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;
395
		em28xx_write_regs(dev, HSCALELOW_REG, (char *)buf, 2);
396 397
		buf[0] = v;
		buf[1] = v >> 8;
398
		em28xx_write_regs(dev, VSCALELOW_REG, (char *)buf, 2);
399 400
		/* it seems that both H and V scalers must be active to work correctly */
		mode = (h || v)? 0x30: 0x00;
401
	}
402
	return em28xx_write_reg_bits(dev, COMPR_REG, mode, 0x30);
403 404 405
}

/* FIXME: this only function read values from dev */
406
int em28xx_resolution_set(struct em28xx *dev)
407 408 409 410 411
{
	int width, height;
	width = norm_maxw(dev);
	height = norm_maxh(dev) >> 1;

412 413 414 415
	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);
416 417
}

418
int em28xx_set_alternate(struct em28xx *dev)
419 420
{
	int errCode, prev_alt = dev->alt;
421
	int i;
422
	unsigned int min_pkt_size = dev->width * 2 + 4;
423

424
	/* When image size is bigger than a certain value,
425 426 427
	   the frame size should be increased, otherwise, only
	   green screen will be received.
	 */
428
	if (dev->width * 2 * dev->height > 720 * 240 * 2)
429 430
		min_pkt_size *= 2;

431 432 433 434
	for (i = 0; i < dev->num_alt; i++) {
		/* stop when the selected alt setting offers enough bandwidth */
		if (dev->alt_max_pkt_size[i] >= min_pkt_size) {
			dev->alt = i;
435
			break;
436 437 438 439 440 441 442
		/* otherwise make sure that we end up with the maximum bandwidth
		   because the min_pkt_size equation might be wrong...
		*/
		} else if (dev->alt_max_pkt_size[i] >
			   dev->alt_max_pkt_size[dev->alt])
			dev->alt = i;
	}
443 444

	if (dev->alt != prev_alt) {
445 446
		em28xx_coredbg("minimum isoc packet size: %u (alt=%d)\n",
				min_pkt_size, dev->alt);
447
		dev->max_pkt_size = dev->alt_max_pkt_size[dev->alt];
448 449
		em28xx_coredbg("setting alternate %d with wMaxPacketSize=%u\n",
			       dev->alt, dev->max_pkt_size);
450 451
		errCode = usb_set_interface(dev->udev, 0, dev->alt);
		if (errCode < 0) {
452
			em28xx_errdev ("cannot change alternate number to %d (error=%i)\n",
453
					dev->alt, errCode);
454 455 456 457 458
			return errCode;
		}
	}
	return 0;
}
459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 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 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 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 624 625 626 627 628 629 630 631 632 633

/* ------------------------------------------------------------------
	URB control
   ------------------------------------------------------------------*/

/*
 * IRQ callback, called by URB callback
 */
static void em28xx_irq_callback(struct urb *urb)
{
	struct em28xx_dmaqueue  *dma_q = urb->context;
	struct em28xx *dev = container_of(dma_q, struct em28xx, vidq);
	int rc, i;

	/* Copy data from URB */
	spin_lock(&dev->slock);
	rc = dev->isoc_ctl.isoc_copy(dev, urb);
	spin_unlock(&dev->slock);

	/* Reset urb buffers */
	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;

	urb->status = usb_submit_urb(urb, GFP_ATOMIC);
	if (urb->status) {
		em28xx_err("urb resubmit failed (error=%i)\n",
			urb->status);
	}
}

/*
 * Stop and Deallocate URBs
 */
void em28xx_uninit_isoc(struct em28xx *dev)
{
	struct urb *urb;
	int i;

	em28xx_isocdbg("em28xx: called em28xx_uninit_isoc\n");

	dev->isoc_ctl.nfields = -1;
	for (i = 0; i < dev->isoc_ctl.num_bufs; i++) {
		urb = dev->isoc_ctl.urb[i];
		if (urb) {
			usb_kill_urb(urb);
			usb_unlink_urb(urb);
			if (dev->isoc_ctl.transfer_buffer[i]) {
				usb_buffer_free(dev->udev,
						urb->transfer_buffer_length,
						dev->isoc_ctl.transfer_buffer[i],
						urb->transfer_dma);
			}
			usb_free_urb(urb);
			dev->isoc_ctl.urb[i] = NULL;
		}
		dev->isoc_ctl.transfer_buffer[i] = NULL;
	}

	kfree(dev->isoc_ctl.urb);
	kfree(dev->isoc_ctl.transfer_buffer);

	dev->isoc_ctl.urb = NULL;
	dev->isoc_ctl.transfer_buffer = NULL;
	dev->isoc_ctl.num_bufs = 0;

	em28xx_capture_start(dev, 0);
}
EXPORT_SYMBOL_GPL(em28xx_uninit_isoc);

/*
 * Allocate URBs and start IRQ
 */
int em28xx_init_isoc(struct em28xx *dev, int max_packets,
		     int num_bufs, int max_pkt_size,
		     int (*isoc_copy) (struct em28xx *dev, struct urb *urb),
		     int cap_type)
{
	struct em28xx_dmaqueue *dma_q = &dev->vidq;
	int i;
	int sb_size, pipe;
	struct urb *urb;
	int j, k;
	int rc;

	em28xx_isocdbg("em28xx: called em28xx_prepare_isoc\n");

	/* De-allocates all pending stuff */
	em28xx_uninit_isoc(dev);

	dev->isoc_ctl.isoc_copy = isoc_copy;
	dev->isoc_ctl.num_bufs = num_bufs;

	dev->isoc_ctl.urb = kzalloc(sizeof(void *)*num_bufs,  GFP_KERNEL);
	if (!dev->isoc_ctl.urb) {
		em28xx_errdev("cannot alloc memory for usb buffers\n");
		return -ENOMEM;
	}

	dev->isoc_ctl.transfer_buffer = kzalloc(sizeof(void *)*num_bufs,
					      GFP_KERNEL);
	if (!dev->isoc_ctl.urb) {
		em28xx_errdev("cannot allocate memory for usbtransfer\n");
		kfree(dev->isoc_ctl.urb);
		return -ENOMEM;
	}

	dev->isoc_ctl.max_pkt_size = max_pkt_size;
	dev->isoc_ctl.buf = NULL;

	sb_size = max_packets * dev->isoc_ctl.max_pkt_size;

	/* allocate urbs and transfer buffers */
	for (i = 0; i < dev->isoc_ctl.num_bufs; i++) {
		urb = usb_alloc_urb(max_packets, GFP_KERNEL);
		if (!urb) {
			em28xx_err("cannot alloc isoc_ctl.urb %i\n", i);
			em28xx_uninit_isoc(dev);
			return -ENOMEM;
		}
		dev->isoc_ctl.urb[i] = urb;

		dev->isoc_ctl.transfer_buffer[i] = usb_buffer_alloc(dev->udev,
			sb_size, GFP_KERNEL, &urb->transfer_dma);
		if (!dev->isoc_ctl.transfer_buffer[i]) {
			em28xx_err("unable to allocate %i bytes for transfer"
					" buffer %i%s\n",
					sb_size, i,
					in_interrupt()?" while in int":"");
			em28xx_uninit_isoc(dev);
			return -ENOMEM;
		}
		memset(dev->isoc_ctl.transfer_buffer[i], 0, sb_size);

		/* FIXME: this is a hack - should be
			'desc.bEndpointAddress & USB_ENDPOINT_NUMBER_MASK'
			should also be using 'desc.bInterval'
		 */
		pipe = usb_rcvisocpipe(dev->udev, cap_type == EM28XX_ANALOG_CAPTURE ? 0x82 : 0x84);
		usb_fill_int_urb(urb, dev->udev, pipe,
				 dev->isoc_ctl.transfer_buffer[i], sb_size,
				 em28xx_irq_callback, dma_q, 1);

		urb->number_of_packets = max_packets;
		urb->transfer_flags = URB_ISO_ASAP;

		k = 0;
		for (j = 0; j < max_packets; j++) {
			urb->iso_frame_desc[j].offset = k;
			urb->iso_frame_desc[j].length =
						dev->isoc_ctl.max_pkt_size;
			k += dev->isoc_ctl.max_pkt_size;
		}
	}

	init_waitqueue_head(&dma_q->wq);

	em28xx_capture_start(dev, cap_type);

	/* submit urbs and enables IRQ */
	for (i = 0; i < dev->isoc_ctl.num_bufs; i++) {
		rc = usb_submit_urb(dev->isoc_ctl.urb[i], GFP_ATOMIC);
		if (rc) {
			em28xx_err("submit of urb %i failed (error=%i)\n", i,
				   rc);
			em28xx_uninit_isoc(dev);
			return rc;
		}
	}

	return 0;
}
EXPORT_SYMBOL_GPL(em28xx_init_isoc);