em28xx-core.c 16.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;
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
		for (byte = 0; byte < len; byte++)
83
			printk(" %02x", (unsigned char)buf[byte]);
84

85
		printk("\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(" %02x", (unsigned char)buf[i]);
		printk("\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 157 158
	if (dev->wait_after_write)
		msleep(dev->wait_after_write);

159 160 161 162
	kfree(bufs);
	return ret;
}

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

/*
169
 * em28xx_write_reg_bits()
170 171 172
 * sets only some bits (specified by bitmask) of a register, by first reading
 * the actual value
 */
173
static int em28xx_write_reg_bits(struct em28xx *dev, u16 reg, u8 val,
174 175 176 177
				 u8 bitmask)
{
	int oldval;
	u8 newval;
178 179 180 181

	oldval = em28xx_read_reg(dev, reg);

	if (oldval < 0)
182
		return oldval;
183

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

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

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

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

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

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

219
static int em28xx_set_audio_source(struct em28xx *dev)
220 221 222 223
{
	static char *enable  = "\x08\x08";
	static char *disable = "\x08\x88";
	char *video = enable, *line = disable;
224
	int ret;
225 226 227 228 229 230 231 232
	u8 input;

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

233
		ret = em28xx_write_regs(dev, EM2800_R08_AUDIOSRC, &input, 1);
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
		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;
		}
	}

259
	ret = em28xx_write_reg_bits(dev, EM28XX_R0E_AUDIOSRC, input, 0xc0);
260 261
	if (ret < 0)
		return ret;
262
	msleep(5);
263

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

271
	ret = em28xx_write_ac97(dev, EM28XX_R10_LINE_IN_AC97, line);
272 273 274 275

	return ret;
}

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

282 283
	s[0] |= 0x1f - dev->volume;
	s[1] |= 0x1f - dev->volume;
284

285 286
	/* Mute */
	s[1] |= 0x80;
287
	ret = em28xx_write_ac97(dev, EM28XX_R02_MASTER_AC97, s);
288

289 290 291
	if (ret < 0)
		return ret;

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

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

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

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

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

311 312 313
	return ret;
}
EXPORT_SYMBOL_GPL(em28xx_audio_analog_set);
314

315
int em28xx_colorlevels_set_default(struct em28xx *dev)
316
{
317 318 319 320 321 322 323 324 325 326 327 328 329 330
	em28xx_write_regs(dev, EM28XX_R20_YGAIN, "\x10", 1);	/* contrast */
	em28xx_write_regs(dev, EM28XX_R21_YOFFSET, "\x00", 1);	/* brightness */
	em28xx_write_regs(dev, EM28XX_R22_UVGAIN, "\x10", 1);	/* saturation */
	em28xx_write_regs(dev, EM28XX_R23_UOFFSET, "\x00", 1);
	em28xx_write_regs(dev, EM28XX_R24_VOFFSET, "\x00", 1);
	em28xx_write_regs(dev, EM28XX_R25_SHARPNESS, "\x00", 1);

	em28xx_write_regs(dev, EM28XX_R14_GAMMA, "\x20", 1);
	em28xx_write_regs(dev, EM28XX_R15_RGAIN, "\x20", 1);
	em28xx_write_regs(dev, EM28XX_R16_GGAIN, "\x20", 1);
	em28xx_write_regs(dev, EM28XX_R17_BGAIN, "\x20", 1);
	em28xx_write_regs(dev, EM28XX_R18_ROFFSET, "\x00", 1);
	em28xx_write_regs(dev, EM28XX_R19_GOFFSET, "\x00", 1);
	return em28xx_write_regs(dev, EM28XX_R1A_BOFFSET, "\x00", 1);
331 332
}

333
int em28xx_capture_start(struct em28xx *dev, int start)
334
{
335
	int rc;
336 337
	/* FIXME: which is the best order? */
	/* video registers are sampled by VREF */
338
	rc = em28xx_write_reg_bits(dev, EM28XX_R0C_USBSUSP,
339 340 341 342 343 344
				   start ? 0x10 : 0x00, 0x10);
	if (rc < 0)
		return rc;

	if (!start) {
		/* disable video capture */
345
		rc = em28xx_write_regs(dev, EM28XX_R12_VINENABLE, "\x27", 1);
346
		return rc;
347 348
	}

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

352
	if (dev->mode == EM28XX_ANALOG_MODE)
353
		rc = em28xx_write_regs(dev, EM28XX_R12_VINENABLE, "\x67", 1);
354
	else
355
		rc = em28xx_write_regs(dev, EM28XX_R12_VINENABLE, "\x37", 1);
356

357
	msleep(6);
358 359

	return rc;
360 361
}

362
int em28xx_outfmt_set_yuv422(struct em28xx *dev)
363
{
364 365 366
	em28xx_write_regs(dev, EM28XX_R27_OUTFMT, "\x34", 1);
	em28xx_write_regs(dev, EM28XX_R10_VINMODE, "\x10", 1);
	return em28xx_write_regs(dev, EM28XX_R11_VINCTRL, "\x11", 1);
367 368
}

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

375 376 377 378
	em28xx_write_regs(dev, EM28XX_R28_XMIN, &xmin, 1);
	em28xx_write_regs(dev, EM28XX_R29_XMAX, &xmax, 1);
	em28xx_write_regs(dev, EM28XX_R2A_YMIN, &ymin, 1);
	return em28xx_write_regs(dev, EM28XX_R2B_YMAX, &ymax, 1);
379 380
}

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

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

392 393 394 395 396
	em28xx_write_regs(dev, EM28XX_R1C_HSTART, &hstart, 1);
	em28xx_write_regs(dev, EM28XX_R1D_VSTART, &vstart, 1);
	em28xx_write_regs(dev, EM28XX_R1E_CWIDTH, &cwidth, 1);
	em28xx_write_regs(dev, EM28XX_R1F_CHEIGHT, &cheight, 1);
	return em28xx_write_regs(dev, EM28XX_R1B_OFLOW, &overflow, 1);
397 398
}

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

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

427 428 429 430
	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);
431 432
}

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

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

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

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

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

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