em28xx-core.c 16.2 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

	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);

80
	if (reg_debug) {
81
		printk(ret < 0 ? " failed!\n" : "%02x values: ", ret);
82 83 84 85
		for (byte = 0; byte < len; byte++)
			printk(KERN_INFO " %02x", (unsigned char)buf[byte]);

		printk(KERN_INFO "\n");
86 87 88 89 90 91
	}

	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

	if (reg_debug) {
		int i;
		for (i = 0; i < len; ++i)
146 147
			printk(KERN_INFO " %02x", (unsigned char)buf[i]);
		printk(KERN_INFO "\n");
148 149 150 151 152 153 154 155
	}

	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 177 178 179

	oldval = em28xx_read_reg(dev, reg);

	if (oldval < 0)
180
		return oldval;
181

182
	newval = (((u8) oldval) & ~bitmask) | (val & bitmask);
183
	return em28xx_write_regs(dev, reg, &newval, 1);
184 185 186
}

/*
187
 * em28xx_write_ac97()
188 189
 * write a 16 bit value to the specified AC97 address (LSB first!)
 */
190
static int em28xx_write_ac97(struct em28xx *dev, u8 reg, u8 *val)
191
{
192
	int ret, i;
193
	u8 addr = reg & 0x7f;
194 195 196

	ret = em28xx_write_regs(dev, AC97LSB_REG, val, 2);
	if (ret < 0)
197
		return ret;
198 199 200

	ret = em28xx_write_regs(dev, AC97ADDR_REG, &addr, 1);
	if (ret < 0)
201
		return ret;
202 203 204

	/* Wait up to 50 ms for AC97 command to complete */
	for (i = 0; i < 10; i++) {
205 206
		ret = em28xx_read_reg(dev, AC97BUSY_REG);
		if (ret < 0)
207
			return ret;
208

209
		if (!(ret & 0x01))
210 211
			return 0;
		msleep(5);
212
	}
213
	em28xx_warn("AC97 command still being executed: not handled properly!\n");
214 215 216
	return 0;
}

217
static int em28xx_set_audio_source(struct em28xx *dev)
218 219 220 221
{
	static char *enable  = "\x08\x08";
	static char *disable = "\x08\x88";
	char *video = enable, *line = disable;
222
	int ret;
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 250 251 252 253 254 255 256 257 258 259
	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;
260
	msleep(5);
261

262 263 264
	/* Sets AC97 mixer registers
	   This is seems to be needed, even for non-ac97 configs
	 */
265 266 267 268 269 270 271 272 273
	ret = em28xx_write_ac97(dev, VIDEO_AC97, video);
	if (ret < 0)
		return ret;

	ret = em28xx_write_ac97(dev, LINE_IN_AC97, line);

	return ret;
}

274
int em28xx_audio_analog_set(struct em28xx *dev)
275
{
276
	int ret;
277
	char s[2] = { 0x00, 0x00 };
278
	u8 xclk = 0x07;
279

280 281
	s[0] |= 0x1f - dev->volume;
	s[1] |= 0x1f - dev->volume;
282

283 284
	/* Mute */
	s[1] |= 0x80;
285
	ret = em28xx_write_ac97(dev, MASTER_AC97, s);
286

287 288 289
	if (ret < 0)
		return ret;

290 291 292 293 294 295 296
	if (dev->has_12mhz_i2s)
		xclk |= 0x20;

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

	ret = em28xx_write_reg_bits(dev, XCLK_REG, xclk, 0xa7);
297 298
	if (ret < 0)
		return ret;
299
	msleep(10);
300 301 302

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

304 305 306 307 308
	/* Unmute device */
	if (!dev->mute)
		s[1] &= ~0x80;
	ret = em28xx_write_ac97(dev, MASTER_AC97, s);

309 310 311
	return ret;
}
EXPORT_SYMBOL_GPL(em28xx_audio_analog_set);
312

313
int em28xx_colorlevels_set_default(struct em28xx *dev)
314
{
315 316 317 318 319 320 321 322 323 324 325 326 327 328
	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);
329 330
}

331
int em28xx_capture_start(struct em28xx *dev, int start)
332
{
333
	int rc;
334 335
	/* FIXME: which is the best order? */
	/* video registers are sampled by VREF */
336 337 338 339 340 341 342 343
	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);
344
		return rc;
345 346
	}

347
	/* enable video capture */
348
	rc = em28xx_write_regs_req(dev, 0x00, 0x48, "\x00", 1);
349

350
	if (dev->mode == EM28XX_ANALOG_MODE)
351
		rc = em28xx_write_regs(dev, VINENABLE_REG, "\x67", 1);
352
	else
353
		rc = em28xx_write_regs(dev, VINENABLE_REG, "\x37", 1);
354

355
	msleep(6);
356 357

	return rc;
358 359
}

360
int em28xx_outfmt_set_yuv422(struct em28xx *dev)
361
{
362 363 364
	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);
365 366
}

367 368
static int em28xx_accumulator_set(struct em28xx *dev, u8 xmin, u8 xmax,
				  u8 ymin, u8 ymax)
369
{
370 371
	em28xx_coredbg("em28xx Scale: (%d,%d)-(%d,%d)\n",
			xmin, ymin, xmax, ymax);
372

373 374 375 376
	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);
377 378
}

379
static int em28xx_capture_area_set(struct em28xx *dev, u8 hstart, u8 vstart,
380 381 382 383 384 385
				   u16 width, u16 height)
{
	u8 cwidth = width;
	u8 cheight = height;
	u8 overflow = (height >> 7 & 0x02) | (width >> 8 & 0x01);

386 387
	em28xx_coredbg("em28xx Area Set: (%d,%d)\n",
			(width | (overflow & 2) << 7),
388 389
			(height | (overflow & 1) << 8));

390 391 392 393 394
	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);
395 396
}

397
static int em28xx_scaler_set(struct em28xx *dev, u16 h, u16 v)
398
{
399 400
	u8 mode;
	/* the em2800 scaler only supports scaling down to 50% */
401
	if (dev->is_em2800)
402 403 404 405 406
		mode = (v ? 0x20 : 0x00) | (h ? 0x10 : 0x00);
	else {
		u8 buf[2];
		buf[0] = h;
		buf[1] = h >> 8;
407
		em28xx_write_regs(dev, HSCALELOW_REG, (char *)buf, 2);
408 409
		buf[0] = v;
		buf[1] = v >> 8;
410
		em28xx_write_regs(dev, VSCALELOW_REG, (char *)buf, 2);
411 412
		/* it seems that both H and V scalers must be active
		   to work correctly */
413
		mode = (h || v)? 0x30: 0x00;
414
	}
415
	return em28xx_write_reg_bits(dev, COMPR_REG, mode, 0x30);
416 417 418
}

/* FIXME: this only function read values from dev */
419
int em28xx_resolution_set(struct em28xx *dev)
420 421 422 423 424
{
	int width, height;
	width = norm_maxw(dev);
	height = norm_maxh(dev) >> 1;

425 426 427 428
	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);
429 430
}

431
int em28xx_set_alternate(struct em28xx *dev)
432 433
{
	int errCode, prev_alt = dev->alt;
434
	int i;
435
	unsigned int min_pkt_size = dev->width * 2 + 4;
436

437
	/* When image size is bigger than a certain value,
438 439 440
	   the frame size should be increased, otherwise, only
	   green screen will be received.
	 */
441
	if (dev->width * 2 * dev->height > 720 * 240 * 2)
442 443
		min_pkt_size *= 2;

444 445 446 447
	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;
448
			break;
449 450 451 452 453 454 455
		/* 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;
	}
456 457

	if (dev->alt != prev_alt) {
458 459
		em28xx_coredbg("minimum isoc packet size: %u (alt=%d)\n",
				min_pkt_size, dev->alt);
460
		dev->max_pkt_size = dev->alt_max_pkt_size[dev->alt];
461 462
		em28xx_coredbg("setting alternate %d with wMaxPacketSize=%u\n",
			       dev->alt, dev->max_pkt_size);
463 464
		errCode = usb_set_interface(dev->udev, 0, dev->alt);
		if (errCode < 0) {
465
			em28xx_errdev("cannot change alternate number to %d (error=%i)\n",
466
					dev->alt, errCode);
467 468 469 470 471
			return errCode;
		}
	}
	return 0;
}
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

/* ------------------------------------------------------------------
	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,
523 524 525
					urb->transfer_buffer_length,
					dev->isoc_ctl.transfer_buffer[i],
					urb->transfer_dma);
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
			}
			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'
		 */
612 613 614
		pipe = usb_rcvisocpipe(dev->udev,
			cap_type == EM28XX_ANALOG_CAPTURE ? 0x82 : 0x84);

615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648
		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);