em28xx-video.c 46.2 KB
Newer Older
1
/*
2
   em28xx-video.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
	Some parts based on SN9C10x PC Camera Controllers GPL driver made
		by Luca Risolia <luca.risolia@studio.unibo.it>

12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
   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/kernel.h>
31
#include <linux/bitmap.h>
32 33
#include <linux/usb.h>
#include <linux/i2c.h>
34
#include <linux/version.h>
35
#include <linux/mm.h>
36
#include <linux/video_decoder.h>
37
#include <linux/mutex.h>
38

39
#include "em28xx.h"
40
#include <media/tuner.h>
41
#include <media/v4l2-common.h>
42
#include <media/msp3400.h>
43

44 45
#define DRIVER_AUTHOR "Ludovico Cavedon <cavedon@sssup.it>, " \
		      "Markus Rechberger <mrechberger@gmail.com>, " \
46
		      "Mauro Carvalho Chehab <mchehab@infradead.org>, " \
47
		      "Sascha Sommer <saschasommer@freenet.de>"
48

49 50
#define DRIVER_NAME         "em28xx"
#define DRIVER_DESC         "Empia em28xx based USB video device driver"
51
#define EM28XX_VERSION_CODE  KERNEL_VERSION(0, 0, 1)
52

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

MODULE_AUTHOR(DRIVER_AUTHOR);
MODULE_DESCRIPTION(DRIVER_DESC);
MODULE_LICENSE("GPL");

62
static LIST_HEAD(em28xx_devlist);
63

64
static unsigned int card[]     = {[0 ... (EM28XX_MAXBOARDS - 1)] = UNSET };
65 66
static unsigned int video_nr[] = {[0 ... (EM28XX_MAXBOARDS - 1)] = UNSET };
static unsigned int vbi_nr[] = {[0 ... (EM28XX_MAXBOARDS - 1)] = UNSET };
67
module_param_array(card,  int, NULL, 0444);
68 69
module_param_array(video_nr, int, NULL, 0444);
module_param_array(vbi_nr, int, NULL, 0444);
70
MODULE_PARM_DESC(card,"card type");
71 72
MODULE_PARM_DESC(video_nr,"video device numbers");
MODULE_PARM_DESC(vbi_nr,"vbi device numbers");
73

74 75 76 77 78 79 80 81
static int tuner = -1;
module_param(tuner, int, 0444);
MODULE_PARM_DESC(tuner, "tuner type");

static unsigned int video_debug = 0;
module_param(video_debug,int,0644);
MODULE_PARM_DESC(video_debug,"enable debug messages [video]");

82 83 84
/* Bitmask marking allocated devices from 0 to EM28XX_MAXBOARDS */
static unsigned long em28xx_devused;

85
/* supported tv norms */
86
static struct em28xx_tvnorm tvnorms[] = {
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
	{
		.name = "PAL",
		.id = V4L2_STD_PAL,
		.mode = VIDEO_MODE_PAL,
	 }, {
		.name = "NTSC",
		.id = V4L2_STD_NTSC,
		.mode = VIDEO_MODE_NTSC,
	}, {
		 .name = "SECAM",
		 .id = V4L2_STD_SECAM,
		 .mode = VIDEO_MODE_SECAM,
	}, {
		.name = "PAL-M",
		.id = V4L2_STD_PAL_M,
		.mode = VIDEO_MODE_PAL,
	}
};

#define TVNORMS ARRAY_SIZE(tvnorms)

/* supported controls */
109
/* Common to all boards */
110
static struct v4l2_queryctrl em28xx_qctrl[] = {
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
	{
		.id = V4L2_CID_AUDIO_VOLUME,
		.type = V4L2_CTRL_TYPE_INTEGER,
		.name = "Volume",
		.minimum = 0x0,
		.maximum = 0x1f,
		.step = 0x1,
		.default_value = 0x1f,
		.flags = 0,
	},{
		.id = V4L2_CID_AUDIO_MUTE,
		.type = V4L2_CTRL_TYPE_BOOLEAN,
		.name = "Mute",
		.minimum = 0,
		.maximum = 1,
		.step = 1,
		.default_value = 1,
		.flags = 0,
	}
};

132
static struct usb_driver em28xx_usb_driver;
133

134
static DEFINE_MUTEX(em28xx_sysfs_lock);
135
static DECLARE_RWSEM(em28xx_disconnect);
136 137 138 139

/*********************  v4l2 interface  ******************************************/

/*
140
 * em28xx_config()
141 142
 * inits registers with sane defaults
 */
143
static int em28xx_config(struct em28xx *dev)
144 145 146
{

	/* Sets I2C speed to 100 KHz */
147 148
	if (!dev->is_em2800)
		em28xx_write_regs_req(dev, 0x00, 0x06, "\x40", 1);
149 150

	/* enable vbi capturing */
151

152 153
/*	em28xx_write_regs_req(dev,0x00,0x0e,"\xC0",1); audio register */
/*	em28xx_write_regs_req(dev,0x00,0x0f,"\x80",1); clk register */
154 155
	em28xx_write_regs_req(dev,0x00,0x11,"\x51",1);

156
	em28xx_audio_usb_mute(dev, 1);
157 158
	dev->mute = 1;		/* maybe not the right place... */
	dev->volume = 0x1f;
159 160 161 162 163
	em28xx_audio_analog_set(dev);
	em28xx_audio_analog_setup(dev);
	em28xx_outfmt_set_yuv422(dev);
	em28xx_colorlevels_set_default(dev);
	em28xx_compression_disable(dev);
164 165 166 167 168

	return 0;
}

/*
169
 * em28xx_config_i2c()
170 171
 * configure i2c attached devices
 */
172
static void em28xx_config_i2c(struct em28xx *dev)
173 174
{
	struct v4l2_frequency f;
175 176 177 178
	struct v4l2_routing route;

	route.input = INPUT(dev->ctl_input)->vmux;
	route.output = 0;
A
Al Viro 已提交
179
	em28xx_i2c_call_clients(dev, VIDIOC_INT_RESET, NULL);
180
	em28xx_i2c_call_clients(dev, VIDIOC_INT_S_VIDEO_ROUTING, &route);
181
	em28xx_i2c_call_clients(dev, VIDIOC_STREAMON, NULL);
182 183 184 185 186 187

	/* configure tuner */
	f.tuner = 0;
	f.type = V4L2_TUNER_ANALOG_TV;
	f.frequency = 9076;	/* FIXME:remove magic number */
	dev->ctl_freq = f.frequency;
188
	em28xx_i2c_call_clients(dev, VIDIOC_S_FREQUENCY, &f);
189 190 191
}

/*
192
 * em28xx_empty_framequeues()
193 194
 * prepare queues for incoming and outgoing frames
 */
195
static void em28xx_empty_framequeues(struct em28xx *dev)
196 197 198 199 200 201
{
	u32 i;

	INIT_LIST_HEAD(&dev->inqueue);
	INIT_LIST_HEAD(&dev->outqueue);

202
	for (i = 0; i < EM28XX_NUM_FRAMES; i++) {
203 204 205 206 207
		dev->frame[i].state = F_UNUSED;
		dev->frame[i].buf.bytesused = 0;
	}
}

208 209
static void video_mux(struct em28xx *dev, int index)
{
210 211
	int ainput;
	struct v4l2_routing route;
212

213 214
	route.input = INPUT(index)->vmux;
	route.output = 0;
215 216 217
	dev->ctl_input = index;
	dev->ctl_ainput = INPUT(index)->amux;

218
	em28xx_i2c_call_clients(dev, VIDIOC_INT_S_VIDEO_ROUTING, &route);
219

220
	em28xx_videodbg("Setting input index=%d, vmux=%d, amux=%d\n",index,route.input,dev->ctl_ainput);
221 222

	if (dev->has_msp34xx) {
223 224
		if (dev->i2s_speed)
			em28xx_i2c_call_clients(dev, VIDIOC_INT_I2S_CLOCK_FREQ, &dev->i2s_speed);
225
		route.input = dev->ctl_ainput;
226
		route.output = MSP_OUTPUT(MSP_SC_IN_DSP_SCART1);
227 228
		/* Note: this is msp3400 specific */
		em28xx_i2c_call_clients(dev, VIDIOC_INT_S_AUDIO_ROUTING, &route);
229 230 231 232
		ainput = EM28XX_AUDIO_SRC_TUNER;
		em28xx_audio_source(dev, ainput);
	} else {
		switch (dev->ctl_ainput) {
233 234 235 236 237
			case 0:
				ainput = EM28XX_AUDIO_SRC_TUNER;
				break;
			default:
				ainput = EM28XX_AUDIO_SRC_LINE;
238 239 240 241 242
		}
		em28xx_audio_source(dev, ainput);
	}
}

243
/*
244
 * em28xx_v4l2_open()
245 246
 * inits the device and starts isoc transfer
 */
247
static int em28xx_v4l2_open(struct inode *inode, struct file *filp)
248 249 250
{
	int minor = iminor(inode);
	int errCode = 0;
251
	struct em28xx *h,*dev = NULL;
252

253
	list_for_each_entry(h, &em28xx_devlist, devlist) {
254 255
		if (h->vdev->minor == minor) {
			dev  = h;
256 257 258 259 260
			dev->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
		}
		if (h->vbi_dev->minor == minor) {
			dev  = h;
			dev->type = V4L2_BUF_TYPE_VBI_CAPTURE;
261 262
		}
	}
263 264
	if (NULL == dev)
		return -ENODEV;
265

266 267
	em28xx_videodbg("open minor=%d type=%s users=%d\n",
				minor,v4l2_type_names[dev->type],dev->users);
268

269
	if (!down_read_trylock(&em28xx_disconnect))
270 271 272
		return -ERESTARTSYS;

	if (dev->users) {
273 274
		em28xx_warn("this driver can be opened only once\n");
		up_read(&em28xx_disconnect);
275 276 277
		return -EBUSY;
	}

278
	mutex_init(&dev->fileop_lock);	/* to 1 == available */
279 280 281 282
	spin_lock_init(&dev->queue_lock);
	init_waitqueue_head(&dev->wait_frame);
	init_waitqueue_head(&dev->wait_stream);

283
	mutex_lock(&dev->lock);
284

285 286
	if (dev->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
		em28xx_set_alternate(dev);
287

288 289 290 291 292 293 294
		dev->width = norm_maxw(dev);
		dev->height = norm_maxh(dev);
		dev->frame_size = dev->width * dev->height * 2;
		dev->field_size = dev->frame_size >> 1;	/*both_fileds ? dev->frame_size>>1 : dev->frame_size; */
		dev->bytesperline = dev->width * 2;
		dev->hscale = 0;
		dev->vscale = 0;
295

296 297
		em28xx_capture_start(dev, 1);
		em28xx_resolution_set(dev);
298

299 300 301
		/* device needs to be initialized before isoc transfer */
		video_mux(dev, 0);

302 303 304 305 306 307
		/* start the transfer */
		errCode = em28xx_init_isoc(dev);
		if (errCode)
			goto err;

	}
308 309 310 311 312 313 314 315

	dev->users++;
	filp->private_data = dev;
	dev->io = IO_NONE;
	dev->stream = STREAM_OFF;
	dev->num_frames = 0;

	/* prepare queues */
316
	em28xx_empty_framequeues(dev);
317 318 319

	dev->state |= DEV_INITIALIZED;

320 321
err:
	mutex_unlock(&dev->lock);
322
	up_read(&em28xx_disconnect);
323 324 325 326
	return errCode;
}

/*
327
 * em28xx_realease_resources()
328 329 330
 * unregisters the v4l2,i2c and usb devices
 * called when the device gets disconected or at module unload
*/
331
static void em28xx_release_resources(struct em28xx *dev)
332
{
333
	mutex_lock(&em28xx_sysfs_lock);
334

335 336 337 338 339
	/*FIXME: I2C IR should be disconnected */

	em28xx_info("V4L2 devices /dev/video%d and /dev/vbi%d deregistered\n",
				dev->vdev->minor-MINOR_VFL_TYPE_GRABBER_MIN,
				dev->vbi_dev->minor-MINOR_VFL_TYPE_VBI_MIN);
340
	list_del(&dev->devlist);
341
	video_unregister_device(dev->vdev);
342
	video_unregister_device(dev->vbi_dev);
343
	em28xx_i2c_unregister(dev);
344
	usb_put_dev(dev->udev);
345
	mutex_unlock(&em28xx_sysfs_lock);
346 347 348 349


	/* Mark device as unused */
	em28xx_devused&=~(1<<dev->devno);
350 351 352
}

/*
353
 * em28xx_v4l2_close()
354 355
 * stops streaming and deallocates all resources allocated by the v4l2 calls and ioctls
 */
356
static int em28xx_v4l2_close(struct inode *inode, struct file *filp)
357 358
{
	int errCode;
359
	struct em28xx *dev=filp->private_data;
360

361
	em28xx_videodbg("users=%d\n", dev->users);
362

363
	mutex_lock(&dev->lock);
364

365
	em28xx_uninit_isoc(dev);
366

367
	em28xx_release_buffers(dev);
368 369 370

	/* the device is already disconnect, free the remaining resources */
	if (dev->state & DEV_DISCONNECTED) {
371
		em28xx_release_resources(dev);
372
		mutex_unlock(&dev->lock);
373 374 375 376 377 378
		kfree(dev);
		return 0;
	}

	/* set alternate 0 */
	dev->alt = 0;
379
	em28xx_videodbg("setting alternate 0\n");
380 381
	errCode = usb_set_interface(dev->udev, 0, 0);
	if (errCode < 0) {
382
		em28xx_errdev ("cannot change alternate number to 0 (error=%i)\n",
383 384 385 386 387
		     errCode);
	}

	dev->users--;
	wake_up_interruptible_nr(&dev->open, 1);
388
	mutex_unlock(&dev->lock);
389 390 391 392
	return 0;
}

/*
393
 * em28xx_v4l2_read()
394 395 396
 * will allocate buffers when called for the first time
 */
static ssize_t
397
em28xx_v4l2_read(struct file *filp, char __user * buf, size_t count,
398 399
		 loff_t * f_pos)
{
400
	struct em28xx_frame_t *f, *i;
401 402
	unsigned long lock_flags;
	int ret = 0;
403
	struct em28xx *dev = filp->private_data;
404

405 406 407 408 409 410 411
	if (dev->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
		em28xx_videodbg("V4l2_Buf_type_videocapture is set\n");
	}
	if (dev->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
		em28xx_videodbg("V4L2_BUF_TYPE_VBI_CAPTURE is set\n");
		em28xx_videodbg("not supported yet! ...\n");
		if (copy_to_user(buf, "", 1)) {
412
			mutex_unlock(&dev->fileop_lock);
413 414 415 416 417 418 419 420
			return -EFAULT;
		}
		return (1);
	}
	if (dev->type == V4L2_BUF_TYPE_SLICED_VBI_CAPTURE) {
		em28xx_videodbg("V4L2_BUF_TYPE_SLICED_VBI_CAPTURE is set\n");
		em28xx_videodbg("not supported yet! ...\n");
		if (copy_to_user(buf, "", 1)) {
421
			mutex_unlock(&dev->fileop_lock);
422 423 424 425 426
			return -EFAULT;
		}
		return (1);
	}

427
	if (mutex_lock_interruptible(&dev->fileop_lock))
428 429 430
		return -ERESTARTSYS;

	if (dev->state & DEV_DISCONNECTED) {
431
		em28xx_videodbg("device not present\n");
432
		mutex_unlock(&dev->fileop_lock);
433 434 435 436
		return -ENODEV;
	}

	if (dev->state & DEV_MISCONFIGURED) {
437
		em28xx_videodbg("device misconfigured; close and open it again\n");
438
		mutex_unlock(&dev->fileop_lock);
439 440 441 442
		return -EIO;
	}

	if (dev->io == IO_MMAP) {
443
		em28xx_videodbg ("IO method is set to mmap; close and open"
444
				" the device again to choose the read method\n");
445
		mutex_unlock(&dev->fileop_lock);
446 447 448 449
		return -EINVAL;
	}

	if (dev->io == IO_NONE) {
450 451
		if (!em28xx_request_buffers(dev, EM28XX_NUM_READ_FRAMES)) {
			em28xx_errdev("read failed, not enough memory\n");
452
			mutex_unlock(&dev->fileop_lock);
453 454 455 456
			return -ENOMEM;
		}
		dev->io = IO_READ;
		dev->stream = STREAM_ON;
457
		em28xx_queue_unusedframes(dev);
458 459 460
	}

	if (!count) {
461
		mutex_unlock(&dev->fileop_lock);
462 463 464 465 466
		return 0;
	}

	if (list_empty(&dev->outqueue)) {
		if (filp->f_flags & O_NONBLOCK) {
467
			mutex_unlock(&dev->fileop_lock);
468 469 470 471 472 473 474
			return -EAGAIN;
		}
		ret = wait_event_interruptible
		    (dev->wait_frame,
		     (!list_empty(&dev->outqueue)) ||
		     (dev->state & DEV_DISCONNECTED));
		if (ret) {
475
			mutex_unlock(&dev->fileop_lock);
476 477 478
			return ret;
		}
		if (dev->state & DEV_DISCONNECTED) {
479
			mutex_unlock(&dev->fileop_lock);
480 481 482 483
			return -ENODEV;
		}
	}

484
	f = list_entry(dev->outqueue.prev, struct em28xx_frame_t, frame);
485 486 487 488 489 490 491

	spin_lock_irqsave(&dev->queue_lock, lock_flags);
	list_for_each_entry(i, &dev->outqueue, frame)
	    i->state = F_UNUSED;
	INIT_LIST_HEAD(&dev->outqueue);
	spin_unlock_irqrestore(&dev->queue_lock, lock_flags);

492
	em28xx_queue_unusedframes(dev);
493 494 495 496 497

	if (count > f->buf.length)
		count = f->buf.length;

	if (copy_to_user(buf, f->bufmem, count)) {
498
		mutex_unlock(&dev->fileop_lock);
499 500 501 502
		return -EFAULT;
	}
	*f_pos += count;

503
	mutex_unlock(&dev->fileop_lock);
504 505 506 507 508

	return count;
}

/*
509
 * em28xx_v4l2_poll()
510 511
 * will allocate buffers when called for the first time
 */
512
static unsigned int em28xx_v4l2_poll(struct file *filp, poll_table * wait)
513 514
{
	unsigned int mask = 0;
515
	struct em28xx *dev = filp->private_data;
516

517
	if (mutex_lock_interruptible(&dev->fileop_lock))
518 519 520
		return POLLERR;

	if (dev->state & DEV_DISCONNECTED) {
521
		em28xx_videodbg("device not present\n");
522
	} else if (dev->state & DEV_MISCONFIGURED) {
523
		em28xx_videodbg("device is misconfigured; close and open it again\n");
524 525
	} else {
		if (dev->io == IO_NONE) {
526 527 528
			if (!em28xx_request_buffers
			    (dev, EM28XX_NUM_READ_FRAMES)) {
				em28xx_warn
529 530 531 532 533 534 535 536
				    ("poll() failed, not enough memory\n");
			} else {
				dev->io = IO_READ;
				dev->stream = STREAM_ON;
			}
		}

		if (dev->io == IO_READ) {
537
			em28xx_queue_unusedframes(dev);
538 539 540 541 542
			poll_wait(filp, &dev->wait_frame, wait);

			if (!list_empty(&dev->outqueue))
				mask |= POLLIN | POLLRDNORM;

543
			mutex_unlock(&dev->fileop_lock);
544 545 546 547 548

			return mask;
		}
	}

549
	mutex_unlock(&dev->fileop_lock);
550 551 552 553
	return POLLERR;
}

/*
554
 * em28xx_vm_open()
555
 */
556
static void em28xx_vm_open(struct vm_area_struct *vma)
557
{
558
	struct em28xx_frame_t *f = vma->vm_private_data;
559 560 561 562
	f->vma_use_count++;
}

/*
563
 * em28xx_vm_close()
564
 */
565
static void em28xx_vm_close(struct vm_area_struct *vma)
566 567
{
	/* NOTE: buffers are not freed here */
568
	struct em28xx_frame_t *f = vma->vm_private_data;
569 570 571

	if (f->vma_use_count)
		f->vma_use_count--;
572 573
}

574 575 576
static struct vm_operations_struct em28xx_vm_ops = {
	.open = em28xx_vm_open,
	.close = em28xx_vm_close,
577 578 579
};

/*
580
 * em28xx_v4l2_mmap()
581
 */
582
static int em28xx_v4l2_mmap(struct file *filp, struct vm_area_struct *vma)
583 584
{
	unsigned long size = vma->vm_end - vma->vm_start,
585 586
	    start = vma->vm_start;
	void *pos;
587
	u32 i;
588

589
	struct em28xx *dev = filp->private_data;
590

591
	if (mutex_lock_interruptible(&dev->fileop_lock))
592 593 594
		return -ERESTARTSYS;

	if (dev->state & DEV_DISCONNECTED) {
595
		em28xx_videodbg("mmap: device not present\n");
596
		mutex_unlock(&dev->fileop_lock);
597 598 599 600
		return -ENODEV;
	}

	if (dev->state & DEV_MISCONFIGURED) {
601
		em28xx_videodbg ("mmap: Device is misconfigured; close and "
602
						"open it again\n");
603
		mutex_unlock(&dev->fileop_lock);
604 605 606 607 608
		return -EIO;
	}

	if (dev->io != IO_MMAP || !(vma->vm_flags & VM_WRITE) ||
	    size != PAGE_ALIGN(dev->frame[0].buf.length)) {
609
		mutex_unlock(&dev->fileop_lock);
610 611 612 613 614 615 616 617
		return -EINVAL;
	}

	for (i = 0; i < dev->num_frames; i++) {
		if ((dev->frame[i].buf.m.offset >> PAGE_SHIFT) == vma->vm_pgoff)
			break;
	}
	if (i == dev->num_frames) {
618
		em28xx_videodbg("mmap: user supplied mapping address is out of range\n");
619
		mutex_unlock(&dev->fileop_lock);
620 621 622 623 624 625 626
		return -EINVAL;
	}

	/* VM_IO is eventually going to replace PageReserved altogether */
	vma->vm_flags |= VM_IO;
	vma->vm_flags |= VM_RESERVED;	/* avoid to swap out this VMA */

627
	pos = dev->frame[i].bufmem;
628
	while (size > 0) {	/* size is page-aligned */
629 630
		if (vm_insert_page(vma, start, vmalloc_to_page(pos))) {
			em28xx_videodbg("mmap: vm_insert_page failed\n");
631
			mutex_unlock(&dev->fileop_lock);
632 633 634 635 636 637 638
			return -EAGAIN;
		}
		start += PAGE_SIZE;
		pos += PAGE_SIZE;
		size -= PAGE_SIZE;
	}

639
	vma->vm_ops = &em28xx_vm_ops;
640 641
	vma->vm_private_data = &dev->frame[i];

642
	em28xx_vm_open(vma);
643
	mutex_unlock(&dev->fileop_lock);
644 645 646 647
	return 0;
}

/*
648
 * em28xx_get_ctrl()
649 650
 * return the current saturation, brightness or contrast, mute state
 */
651
static int em28xx_get_ctrl(struct em28xx *dev, struct v4l2_control *ctrl)
652 653 654 655 656 657 658 659
{
	switch (ctrl->id) {
	case V4L2_CID_AUDIO_MUTE:
		ctrl->value = dev->mute;
		return 0;
	case V4L2_CID_AUDIO_VOLUME:
		ctrl->value = dev->volume;
		return 0;
660 661 662 663 664
	default:
		return -EINVAL;
	}
}

665
/*
666
 * em28xx_set_ctrl()
667 668
 * mute or set new saturation, brightness or contrast
 */
669
static int em28xx_set_ctrl(struct em28xx *dev, const struct v4l2_control *ctrl)
670 671 672 673 674
{
	switch (ctrl->id) {
	case V4L2_CID_AUDIO_MUTE:
		if (ctrl->value != dev->mute) {
			dev->mute = ctrl->value;
675 676
			em28xx_audio_usb_mute(dev, ctrl->value);
			return em28xx_audio_analog_set(dev);
677 678 679 680
		}
		return 0;
	case V4L2_CID_AUDIO_VOLUME:
		dev->volume = ctrl->value;
681
		return em28xx_audio_analog_set(dev);
682 683 684 685 686
	default:
		return -EINVAL;
	}
}

687
/*
688
 * em28xx_stream_interrupt()
689 690
 * stops streaming
 */
691
static int em28xx_stream_interrupt(struct em28xx *dev)
692 693 694 695 696 697 698 699 700
{
	int ret = 0;

	/* stop reading from the device */

	dev->stream = STREAM_INTERRUPT;
	ret = wait_event_timeout(dev->wait_stream,
				 (dev->stream == STREAM_OFF) ||
				 (dev->state & DEV_DISCONNECTED),
701
				 EM28XX_URB_TIMEOUT);
702 703 704 705
	if (dev->state & DEV_DISCONNECTED)
		return -ENODEV;
	else if (ret) {
		dev->state |= DEV_MISCONFIGURED;
706
		em28xx_videodbg("device is misconfigured; close and "
707 708
			"open /dev/video%d again\n",
				dev->vdev->minor-MINOR_VFL_TYPE_GRABBER_MIN);
709 710 711 712 713 714
		return ret;
	}

	return 0;
}

715
static int em28xx_set_norm(struct em28xx *dev, int width, int height)
716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753
{
	unsigned int hscale, vscale;
	unsigned int maxh, maxw;

	maxw = norm_maxw(dev);
	maxh = norm_maxh(dev);

	/* width must even because of the YUYV format */
	/* height must be even because of interlacing */
	height &= 0xfffe;
	width &= 0xfffe;

	if (height < 32)
		height = 32;
	if (height > maxh)
		height = maxh;
	if (width < 48)
		width = 48;
	if (width > maxw)
		width = maxw;

	if ((hscale = (((unsigned long)maxw) << 12) / width - 4096L) >= 0x4000)
		hscale = 0x3fff;
	width = (((unsigned long)maxw) << 12) / (hscale + 4096L);

	if ((vscale = (((unsigned long)maxh) << 12) / height - 4096L) >= 0x4000)
		vscale = 0x3fff;
	height = (((unsigned long)maxh) << 12) / (vscale + 4096L);

	/* set new image size */
	dev->width = width;
	dev->height = height;
	dev->frame_size = dev->width * dev->height * 2;
	dev->field_size = dev->frame_size >> 1;	/*both_fileds ? dev->frame_size>>1 : dev->frame_size; */
	dev->bytesperline = dev->width * 2;
	dev->hscale = hscale;
	dev->vscale = vscale;

754
	em28xx_resolution_set(dev);
755 756 757 758

	return 0;
}

759 760 761 762 763 764 765 766 767 768 769
static int em28xx_get_fmt(struct em28xx *dev, struct v4l2_format *format)
{
	em28xx_videodbg("VIDIOC_G_FMT: type=%s\n",
		(format->type ==V4L2_BUF_TYPE_VIDEO_CAPTURE) ?
		"V4L2_BUF_TYPE_VIDEO_CAPTURE" :
		(format->type ==V4L2_BUF_TYPE_VBI_CAPTURE) ?
		"V4L2_BUF_TYPE_VBI_CAPTURE" :
		(format->type ==V4L2_CAP_SLICED_VBI_CAPTURE) ?
		"V4L2_BUF_TYPE_SLICED_VBI_CAPTURE " :
		"not supported");

770 771 772
	switch (format->type) {
	case V4L2_BUF_TYPE_VIDEO_CAPTURE:
	{
773 774 775 776 777 778 779 780 781 782
		format->fmt.pix.width = dev->width;
		format->fmt.pix.height = dev->height;
		format->fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
		format->fmt.pix.bytesperline = dev->bytesperline;
		format->fmt.pix.sizeimage = dev->frame_size;
		format->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
		format->fmt.pix.field = dev->interlaced ? V4L2_FIELD_INTERLACED : V4L2_FIELD_TOP;	/* FIXME: TOP? NONE? BOTTOM? ALTENATE? */

		em28xx_videodbg("VIDIOC_G_FMT: %dx%d\n", dev->width,
			dev->height);
783
		break;
784 785
	}

786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801
	case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
	{
		format->fmt.sliced.service_set=0;

		em28xx_i2c_call_clients(dev,VIDIOC_G_FMT,format);

		if (format->fmt.sliced.service_set==0)
			return -EINVAL;

		break;
	}

	default:
		return -EINVAL;
	}
	return (0);
802 803
}

804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873
static int em28xx_set_fmt(struct em28xx *dev, unsigned int cmd, struct v4l2_format *format)
{
	u32 i;
	int ret = 0;
	int width = format->fmt.pix.width;
	int height = format->fmt.pix.height;
	unsigned int hscale, vscale;
	unsigned int maxh, maxw;

	maxw = norm_maxw(dev);
	maxh = norm_maxh(dev);

	em28xx_videodbg("%s: type=%s\n",
			cmd == VIDIOC_TRY_FMT ?
			"VIDIOC_TRY_FMT" : "VIDIOC_S_FMT",
			format->type == V4L2_BUF_TYPE_VIDEO_CAPTURE ?
			"V4L2_BUF_TYPE_VIDEO_CAPTURE" :
			format->type == V4L2_BUF_TYPE_VBI_CAPTURE ?
			"V4L2_BUF_TYPE_VBI_CAPTURE " :
			"not supported");

	if (format->type == V4L2_BUF_TYPE_SLICED_VBI_CAPTURE) {
		em28xx_i2c_call_clients(dev,VIDIOC_G_FMT,format);

		if (format->fmt.sliced.service_set==0)
			return -EINVAL;

		return 0;
	}


	if (format->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
		return -EINVAL;

	em28xx_videodbg("%s: requested %dx%d\n",
		cmd == VIDIOC_TRY_FMT ?
		"VIDIOC_TRY_FMT" : "VIDIOC_S_FMT",
		format->fmt.pix.width, format->fmt.pix.height);

	/* FIXME: Move some code away from here */
	/* width must even because of the YUYV format */
	/* height must be even because of interlacing */
	height &= 0xfffe;
	width &= 0xfffe;

	if (height < 32)
		height = 32;
	if (height > maxh)
		height = maxh;
	if (width < 48)
		width = 48;
	if (width > maxw)
		width = maxw;

	if(dev->is_em2800){
		/* the em2800 can only scale down to 50% */
		if(height % (maxh / 2))
			height=maxh;
		if(width % (maxw / 2))
			width=maxw;
		/* according to empiatech support */
		/* the MaxPacketSize is to small to support */
		/* framesizes larger than 640x480 @ 30 fps */
		/* or 640x576 @ 25 fps. As this would cut */
		/* of a part of the image we prefer */
		/* 360x576 or 360x480 for now */
		if(width == maxw && height == maxh)
			width /= 2;
	}

874
	if ((hscale = (((unsigned long)maxw) << 12) / width - 4096L) >= 0x4000)
875 876
		hscale = 0x3fff;

877 878 879
	width = (((unsigned long)maxw) << 12) / (hscale + 4096L);

	if ((vscale = (((unsigned long)maxh) << 12) / height - 4096L) >= 0x4000)
880
		vscale = 0x3fff;
881 882

	height = (((unsigned long)maxh) << 12) / (vscale + 4096L);
883 884 885 886 887 888 889 890 891 892

	format->fmt.pix.width = width;
	format->fmt.pix.height = height;
	format->fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
	format->fmt.pix.bytesperline = width * 2;
	format->fmt.pix.sizeimage = width * 2 * height;
	format->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
	format->fmt.pix.field = V4L2_FIELD_INTERLACED;

	em28xx_videodbg("%s: returned %dx%d (%d, %d)\n",
893 894 895
		cmd == VIDIOC_TRY_FMT ?
		"VIDIOC_TRY_FMT" :"VIDIOC_S_FMT",
		format->fmt.pix.width, format->fmt.pix.height, hscale, vscale);
896 897 898 899 900 901 902 903 904 905 906 907 908

	if (cmd == VIDIOC_TRY_FMT)
		return 0;

	for (i = 0; i < dev->num_frames; i++)
		if (dev->frame[i].vma_use_count) {
			em28xx_videodbg("VIDIOC_S_FMT failed. "
				"Unmap the buffers first.\n");
			return -EINVAL;
		}

	/* stop io in case it is already in progress */
	if (dev->stream == STREAM_ON) {
909
		em28xx_videodbg("VIDIOC_SET_FMT: interrupting stream\n");
910 911 912 913 914 915 916 917 918 919 920
		if ((ret = em28xx_stream_interrupt(dev)))
			return ret;
	}

	em28xx_release_buffers(dev);
	dev->io = IO_NONE;

	/* set new image size */
	dev->width = width;
	dev->height = height;
	dev->frame_size = dev->width * dev->height * 2;
921
	dev->field_size = dev->frame_size >> 1;
922 923 924 925 926 927 928 929 930 931 932
	dev->bytesperline = dev->width * 2;
	dev->hscale = hscale;
	dev->vscale = vscale;
	em28xx_uninit_isoc(dev);
	em28xx_set_alternate(dev);
	em28xx_capture_start(dev, 1);
	em28xx_resolution_set(dev);
	em28xx_init_isoc(dev);

	return 0;
}
933

934
/*
935
 * em28xx_v4l2_do_ioctl()
936
 * This function is _not_ called directly, but from
937
 * em28xx_v4l2_ioctl. Userspace
938 939
 * copying is done already, arg is a kernel pointer.
 */
940 941
static int em28xx_do_ioctl(struct inode *inode, struct file *filp,
			   struct em28xx *dev, unsigned int cmd, void *arg,
942 943 944 945 946 947 948
			   v4l2_kioctl driver_ioctl)
{
	int ret;

	switch (cmd) {
		/* ---------- tv norms ---------- */
	case VIDIOC_ENUMSTD:
949 950 951
	{
		struct v4l2_standard *e = arg;
		unsigned int i;
952

953 954 955 956 957 958 959 960 961 962
		i = e->index;
		if (i >= TVNORMS)
			return -EINVAL;
		ret = v4l2_video_std_construct(e, tvnorms[e->index].id,
						tvnorms[e->index].name);
		e->index = i;
		if (ret < 0)
			return ret;
		return 0;
	}
963
	case VIDIOC_G_STD:
964 965
	{
		v4l2_std_id *id = arg;
966

967 968 969
		*id = dev->tvnorm->id;
		return 0;
	}
970
	case VIDIOC_S_STD:
971 972 973
	{
		v4l2_std_id *id = arg;
		unsigned int i;
974

975 976 977 978
		for (i = 0; i < TVNORMS; i++)
			if (*id == tvnorms[i].id)
				break;
		if (i == TVNORMS)
979
			for (i = 0; i < TVNORMS; i++)
980
				if (*id & tvnorms[i].id)
981
					break;
982 983
		if (i == TVNORMS)
			return -EINVAL;
984

985
		mutex_lock(&dev->lock);
986
		dev->tvnorm = &tvnorms[i];
987

988
		em28xx_set_norm(dev, dev->width, dev->height);
989

990 991
		em28xx_i2c_call_clients(dev, VIDIOC_S_STD,
					&dev->tvnorm->id);
992

993
		mutex_unlock(&dev->lock);
994

995 996
		return 0;
	}
997

998
	/* ------ input switching ---------- */
999
	case VIDIOC_ENUMINPUT:
1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030
	{
		struct v4l2_input *i = arg;
		unsigned int n;
		static const char *iname[] = {
			[EM28XX_VMUX_COMPOSITE1] = "Composite1",
			[EM28XX_VMUX_COMPOSITE2] = "Composite2",
			[EM28XX_VMUX_COMPOSITE3] = "Composite3",
			[EM28XX_VMUX_COMPOSITE4] = "Composite4",
			[EM28XX_VMUX_SVIDEO] = "S-Video",
			[EM28XX_VMUX_TELEVISION] = "Television",
			[EM28XX_VMUX_CABLE] = "Cable TV",
			[EM28XX_VMUX_DVB] = "DVB",
			[EM28XX_VMUX_DEBUG] = "for debug only",
		};

		n = i->index;
		if (n >= MAX_EM28XX_INPUT)
			return -EINVAL;
		if (0 == INPUT(n)->type)
			return -EINVAL;
		memset(i, 0, sizeof(*i));
		i->index = n;
		i->type = V4L2_INPUT_TYPE_CAMERA;
		strcpy(i->name, iname[INPUT(n)->type]);
		if ((EM28XX_VMUX_TELEVISION == INPUT(n)->type) ||
			(EM28XX_VMUX_CABLE == INPUT(n)->type))
			i->type = V4L2_INPUT_TYPE_TUNER;
		for (n = 0; n < ARRAY_SIZE(tvnorms); n++)
			i->std |= tvnorms[n].id;
		return 0;
	}
1031
	case VIDIOC_G_INPUT:
1032 1033 1034
	{
		int *i = arg;
		*i = dev->ctl_input;
1035

1036 1037
		return 0;
	}
1038
	case VIDIOC_S_INPUT:
1039 1040
	{
		int *index = arg;
1041

1042 1043 1044 1045
		if (*index >= MAX_EM28XX_INPUT)
			return -EINVAL;
		if (0 == INPUT(*index)->type)
			return -EINVAL;
1046

1047
		mutex_lock(&dev->lock);
1048
		video_mux(dev, *index);
1049
		mutex_unlock(&dev->lock);
1050

1051 1052
		return 0;
	}
1053
	case VIDIOC_G_AUDIO:
1054 1055 1056
	{
		struct v4l2_audio *a = arg;
		unsigned int index = a->index;
1057

1058 1059 1060 1061
		if (a->index > 1)
			return -EINVAL;
		memset(a, 0, sizeof(*a));
		index = dev->ctl_ainput;
1062

1063 1064 1065 1066
		if (index == 0) {
			strcpy(a->name, "Television");
		} else {
			strcpy(a->name, "Line In");
1067
		}
1068 1069 1070 1071
		a->capability = V4L2_AUDCAP_STEREO;
		a->index = index;
		return 0;
	}
1072
	case VIDIOC_S_AUDIO:
1073 1074
	{
		struct v4l2_audio *a = arg;
1075

1076 1077 1078 1079 1080
		if (a->index != dev->ctl_ainput)
			return -EINVAL;

		return 0;
	}
1081

1082
	/* --- controls ---------------------------------------------- */
1083
	case VIDIOC_QUERYCTRL:
1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095
	{
		struct v4l2_queryctrl *qc = arg;
		int i, id=qc->id;

		memset(qc,0,sizeof(*qc));
		qc->id=id;

		if (!dev->has_msp34xx) {
			for (i = 0; i < ARRAY_SIZE(em28xx_qctrl); i++) {
				if (qc->id && qc->id == em28xx_qctrl[i].id) {
					memcpy(qc, &(em28xx_qctrl[i]),
					sizeof(*qc));
1096 1097
					return 0;
				}
1098
			}
1099
		}
1100 1101 1102 1103 1104
		em28xx_i2c_call_clients(dev,cmd,qc);
		if (qc->type)
			return 0;
		else
			return -EINVAL;
1105
	}
1106
	case VIDIOC_G_CTRL:
1107 1108 1109
	{
		struct v4l2_control *ctrl = arg;
		int retval=-EINVAL;
1110

1111 1112 1113
		if (!dev->has_msp34xx)
			retval=em28xx_get_ctrl(dev, ctrl);
		if (retval==-EINVAL) {
1114 1115
			em28xx_i2c_call_clients(dev,cmd,arg);
			return 0;
1116 1117
		} else return retval;
	}
1118
	case VIDIOC_S_CTRL:
1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131
	{
		struct v4l2_control *ctrl = arg;
		u8 i;

		if (!dev->has_msp34xx){
			for (i = 0; i < ARRAY_SIZE(em28xx_qctrl); i++) {
				if (ctrl->id == em28xx_qctrl[i].id) {
					if (ctrl->value <
					em28xx_qctrl[i].minimum
					|| ctrl->value >
					em28xx_qctrl[i].maximum)
						return -ERANGE;
					return em28xx_set_ctrl(dev, ctrl);
1132 1133
				}
			}
1134
		}
1135

1136 1137
		em28xx_i2c_call_clients(dev,cmd,arg);
		return 0;
1138 1139
	}
	/* --- tuner ioctls ------------------------------------------ */
1140
	case VIDIOC_G_TUNER:
1141 1142
	{
		struct v4l2_tuner *t = arg;
1143

1144 1145
		if (0 != t->index)
			return -EINVAL;
1146

1147 1148
		memset(t, 0, sizeof(*t));
		strcpy(t->name, "Tuner");
1149
		mutex_lock(&dev->lock);
1150 1151
		/* let clients fill in the remainder of this struct */
		em28xx_i2c_call_clients(dev, cmd, t);
1152
		mutex_unlock(&dev->lock);
1153 1154 1155 1156
		em28xx_videodbg("VIDIO_G_TUNER: signal=%x, afc=%x\n", t->signal,
				t->afc);
		return 0;
	}
1157
	case VIDIOC_S_TUNER:
1158 1159
	{
		struct v4l2_tuner *t = arg;
1160

1161 1162
		if (0 != t->index)
			return -EINVAL;
1163
		mutex_lock(&dev->lock);
1164 1165
		/* let clients handle this */
		em28xx_i2c_call_clients(dev, cmd, t);
1166
		mutex_unlock(&dev->lock);
1167 1168
		return 0;
	}
1169
	case VIDIOC_G_FREQUENCY:
1170 1171
	{
		struct v4l2_frequency *f = arg;
1172

1173 1174 1175
		memset(f, 0, sizeof(*f));
		f->type = V4L2_TUNER_ANALOG_TV;
		f->frequency = dev->ctl_freq;
1176

1177 1178
		return 0;
	}
1179
	case VIDIOC_S_FREQUENCY:
1180 1181
	{
		struct v4l2_frequency *f = arg;
1182

1183 1184
		if (0 != f->tuner)
			return -EINVAL;
1185

1186 1187
		if (V4L2_TUNER_ANALOG_TV != f->type)
			return -EINVAL;
1188

1189
		mutex_lock(&dev->lock);
1190 1191
		dev->ctl_freq = f->frequency;
		em28xx_i2c_call_clients(dev, VIDIOC_S_FREQUENCY, f);
1192
		mutex_unlock(&dev->lock);
1193 1194
		return 0;
	}
1195
	case VIDIOC_CROPCAP:
1196 1197
	{
		struct v4l2_cropcap *cc = arg;
1198

1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209
		if (cc->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
			return -EINVAL;
		cc->bounds.left = 0;
		cc->bounds.top = 0;
		cc->bounds.width = dev->width;
		cc->bounds.height = dev->height;
		cc->defrect = cc->bounds;
		cc->pixelaspect.numerator = 54;	/* 4:3 FIXME: remove magic numbers */
		cc->pixelaspect.denominator = 59;
		return 0;
	}
1210
	case VIDIOC_STREAMON:
1211 1212
	{
		int *type = arg;
1213

1214 1215 1216
		if (*type != V4L2_BUF_TYPE_VIDEO_CAPTURE
			|| dev->io != IO_MMAP)
			return -EINVAL;
1217

1218 1219
		if (list_empty(&dev->inqueue))
			return -EINVAL;
1220

1221
		dev->stream = STREAM_ON;	/* FIXME: Start video capture here? */
1222

1223
		em28xx_videodbg("VIDIOC_STREAMON: starting stream\n");
1224

1225 1226
		return 0;
	}
1227
	case VIDIOC_STREAMOFF:
1228 1229 1230
	{
		int *type = arg;
		int ret;
1231

1232 1233 1234
		if (*type != V4L2_BUF_TYPE_VIDEO_CAPTURE
			|| dev->io != IO_MMAP)
			return -EINVAL;
1235

1236 1237 1238 1239
		if (dev->stream == STREAM_ON) {
			em28xx_videodbg ("VIDIOC_STREAMOFF: interrupting stream\n");
			if ((ret = em28xx_stream_interrupt(dev)))
				return ret;
1240
		}
1241 1242 1243 1244
		em28xx_empty_framequeues(dev);

		return 0;
	}
1245 1246 1247 1248 1249 1250 1251 1252
	default:
		return v4l_compat_translate_ioctl(inode, filp, cmd, arg,
						  driver_ioctl);
	}
	return 0;
}

/*
1253
 * em28xx_v4l2_do_ioctl()
1254
 * This function is _not_ called directly, but from
1255
 * em28xx_v4l2_ioctl. Userspace
1256 1257
 * copying is done already, arg is a kernel pointer.
 */
1258
static int em28xx_video_do_ioctl(struct inode *inode, struct file *filp,
1259 1260
				 unsigned int cmd, void *arg)
{
1261
	struct em28xx *dev = filp->private_data;
1262 1263 1264 1265 1266

	if (!dev)
		return -ENODEV;

	if (video_debug > 1)
1267
		v4l_print_ioctl(dev->name,cmd);
1268 1269 1270 1271 1272 1273

	switch (cmd) {

		/* --- capabilities ------------------------------------------ */
	case VIDIOC_QUERYCAP:
		{
1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292
		struct v4l2_capability *cap = arg;

		memset(cap, 0, sizeof(*cap));
		strlcpy(cap->driver, "em28xx", sizeof(cap->driver));
		strlcpy(cap->card, em28xx_boards[dev->model].name,
			sizeof(cap->card));
		strlcpy(cap->bus_info, dev->udev->dev.bus_id,
			sizeof(cap->bus_info));
		cap->version = EM28XX_VERSION_CODE;
		cap->capabilities =
				V4L2_CAP_SLICED_VBI_CAPTURE |
				V4L2_CAP_VIDEO_CAPTURE |
				V4L2_CAP_AUDIO |
				V4L2_CAP_READWRITE | V4L2_CAP_STREAMING;
		if (dev->has_tuner)
			cap->capabilities |= V4L2_CAP_TUNER;
		return 0;
	}
	/* --- capture ioctls ---------------------------------------- */
1293
	case VIDIOC_ENUM_FMT:
1294 1295
	{
		struct v4l2_fmtdesc *fmtd = arg;
1296

1297 1298 1299 1300 1301 1302 1303 1304 1305
		if (fmtd->index != 0)
			return -EINVAL;
		memset(fmtd, 0, sizeof(*fmtd));
		fmtd->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
		strcpy(fmtd->description, "Packed YUY2");
		fmtd->pixelformat = V4L2_PIX_FMT_YUYV;
		memset(fmtd->reserved, 0, sizeof(fmtd->reserved));
		return 0;
	}
1306
	case VIDIOC_G_FMT:
1307
		return em28xx_get_fmt(dev, (struct v4l2_format *) arg);
1308 1309 1310

	case VIDIOC_TRY_FMT:
	case VIDIOC_S_FMT:
1311
		return em28xx_set_fmt(dev, cmd, (struct v4l2_format *)arg);
1312 1313

	case VIDIOC_REQBUFS:
1314 1315 1316 1317
	{
		struct v4l2_requestbuffers *rb = arg;
		u32 i;
		int ret;
1318

1319 1320 1321
		if (rb->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
			rb->memory != V4L2_MEMORY_MMAP)
			return -EINVAL;
1322

1323 1324 1325 1326 1327 1328
		if (dev->io == IO_READ) {
			em28xx_videodbg ("method is set to read;"
				" close and open the device again to"
				" choose the mmap I/O method\n");
			return -EINVAL;
		}
1329

1330 1331 1332 1333
		for (i = 0; i < dev->num_frames; i++)
			if (dev->frame[i].vma_use_count) {
				em28xx_videodbg ("VIDIOC_REQBUFS failed; previous buffers are still mapped\n");
				return -EINVAL;
1334 1335
			}

1336 1337 1338 1339 1340
		if (dev->stream == STREAM_ON) {
			em28xx_videodbg("VIDIOC_REQBUFS: interrupting stream\n");
			if ((ret = em28xx_stream_interrupt(dev)))
				return ret;
		}
1341

1342
		em28xx_empty_framequeues(dev);
1343

1344 1345 1346 1347
		em28xx_release_buffers(dev);
		if (rb->count)
			rb->count =
				em28xx_request_buffers(dev, rb->count);
1348

1349
		dev->frame_current = NULL;
1350

1351 1352 1353 1354 1355
		em28xx_videodbg ("VIDIOC_REQBUFS: setting io method to mmap: num bufs %i\n",
						rb->count);
		dev->io = rb->count ? IO_MMAP : IO_NONE;
		return 0;
	}
1356
	case VIDIOC_QUERYBUF:
1357 1358
	{
		struct v4l2_buffer *b = arg;
1359

1360 1361 1362
		if (b->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
			b->index >= dev->num_frames || dev->io != IO_MMAP)
			return -EINVAL;
1363

1364
		memcpy(b, &dev->frame[b->index].buf, sizeof(*b));
1365

1366 1367
		if (dev->frame[b->index].vma_use_count) {
			b->flags |= V4L2_BUF_FLAG_MAPPED;
1368
		}
1369 1370 1371 1372 1373 1374
		if (dev->frame[b->index].state == F_DONE)
			b->flags |= V4L2_BUF_FLAG_DONE;
		else if (dev->frame[b->index].state != F_UNUSED)
			b->flags |= V4L2_BUF_FLAG_QUEUED;
		return 0;
	}
1375
	case VIDIOC_QBUF:
1376 1377 1378
	{
		struct v4l2_buffer *b = arg;
		unsigned long lock_flags;
1379

1380 1381 1382 1383
		if (b->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
			b->index >= dev->num_frames || dev->io != IO_MMAP) {
			return -EINVAL;
		}
1384

1385 1386 1387 1388
		if (dev->frame[b->index].state != F_UNUSED) {
			return -EAGAIN;
		}
		dev->frame[b->index].state = F_QUEUED;
1389

1390 1391 1392 1393 1394
		/* add frame to fifo */
		spin_lock_irqsave(&dev->queue_lock, lock_flags);
		list_add_tail(&dev->frame[b->index].frame,
				&dev->inqueue);
		spin_unlock_irqrestore(&dev->queue_lock, lock_flags);
1395

1396 1397
		return 0;
	}
1398
	case VIDIOC_DQBUF:
1399 1400 1401 1402 1403
	{
		struct v4l2_buffer *b = arg;
		struct em28xx_frame_t *f;
		unsigned long lock_flags;
		int ret = 0;
1404

1405 1406 1407
		if (b->type != V4L2_BUF_TYPE_VIDEO_CAPTURE
			|| dev->io != IO_MMAP)
			return -EINVAL;
1408

1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422
		if (list_empty(&dev->outqueue)) {
			if (dev->stream == STREAM_OFF)
				return -EINVAL;
			if (filp->f_flags & O_NONBLOCK)
				return -EAGAIN;
			ret = wait_event_interruptible
				(dev->wait_frame,
				(!list_empty(&dev->outqueue)) ||
				(dev->state & DEV_DISCONNECTED));
			if (ret)
				return ret;
			if (dev->state & DEV_DISCONNECTED)
				return -ENODEV;
		}
1423

1424 1425 1426 1427 1428
		spin_lock_irqsave(&dev->queue_lock, lock_flags);
		f = list_entry(dev->outqueue.next,
				struct em28xx_frame_t, frame);
		list_del(dev->outqueue.next);
		spin_unlock_irqrestore(&dev->queue_lock, lock_flags);
1429

1430 1431
		f->state = F_UNUSED;
		memcpy(b, &f->buf, sizeof(*b));
1432

1433 1434
		if (f->vma_use_count)
			b->flags |= V4L2_BUF_FLAG_MAPPED;
1435

1436 1437
		return 0;
	}
1438
	default:
1439 1440
		return em28xx_do_ioctl(inode, filp, dev, cmd, arg,
				       em28xx_video_do_ioctl);
1441 1442 1443 1444 1445
	}
	return 0;
}

/*
1446 1447
 * em28xx_v4l2_ioctl()
 * handle v4l2 ioctl the main action happens in em28xx_v4l2_do_ioctl()
1448
 */
1449
static int em28xx_v4l2_ioctl(struct inode *inode, struct file *filp,
1450 1451 1452
			     unsigned int cmd, unsigned long arg)
{
	int ret = 0;
1453
	struct em28xx *dev = filp->private_data;
1454

1455
	if (mutex_lock_interruptible(&dev->fileop_lock))
1456 1457 1458
		return -ERESTARTSYS;

	if (dev->state & DEV_DISCONNECTED) {
1459
		em28xx_errdev("v4l2 ioctl: device not present\n");
1460
		mutex_unlock(&dev->fileop_lock);
1461 1462 1463 1464
		return -ENODEV;
	}

	if (dev->state & DEV_MISCONFIGURED) {
1465
		em28xx_errdev
1466
		    ("v4l2 ioctl: device is misconfigured; close and open it again\n");
1467
		mutex_unlock(&dev->fileop_lock);
1468 1469 1470
		return -EIO;
	}

1471
	ret = video_usercopy(inode, filp, cmd, arg, em28xx_video_do_ioctl);
1472

1473
	mutex_unlock(&dev->fileop_lock);
1474 1475 1476 1477

	return ret;
}

1478
static const struct file_operations em28xx_v4l_fops = {
1479
	.owner = THIS_MODULE,
1480 1481 1482 1483 1484 1485
	.open = em28xx_v4l2_open,
	.release = em28xx_v4l2_close,
	.ioctl = em28xx_v4l2_ioctl,
	.read = em28xx_v4l2_read,
	.poll = em28xx_v4l2_poll,
	.mmap = em28xx_v4l2_mmap,
1486
	.llseek = no_llseek,
1487 1488
	.compat_ioctl   = v4l_compat_ioctl32,

1489 1490 1491 1492 1493
};

/******************************** usb interface *****************************************/

/*
1494
 * em28xx_init_dev()
1495 1496
 * allocates and inits the device structs, registers i2c bus and v4l device
 */
1497
static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev,
1498 1499
			   int minor, int model)
{
1500
	struct em28xx *dev = *devhandle;
1501 1502 1503 1504 1505 1506
	int retval = -ENOMEM;
	int errCode, i;
	unsigned int maxh, maxw;

	dev->udev = udev;
	dev->model = model;
1507
	mutex_init(&dev->lock);
1508 1509
	init_waitqueue_head(&dev->open);

1510 1511 1512 1513 1514 1515 1516 1517 1518 1519
	dev->em28xx_write_regs = em28xx_write_regs;
	dev->em28xx_read_reg = em28xx_read_reg;
	dev->em28xx_read_reg_req_len = em28xx_read_reg_req_len;
	dev->em28xx_write_regs_req = em28xx_write_regs_req;
	dev->em28xx_read_reg_req = em28xx_read_reg_req;
	dev->is_em2800 = em28xx_boards[model].is_em2800;
	dev->has_tuner = em28xx_boards[model].has_tuner;
	dev->has_msp34xx = em28xx_boards[model].has_msp34xx;
	dev->tda9887_conf = em28xx_boards[model].tda9887_conf;
	dev->decoder = em28xx_boards[model].decoder;
1520 1521 1522 1523

	if (tuner >= 0)
		dev->tuner_type = tuner;
	else
1524
		dev->tuner_type = em28xx_boards[model].tuner_type;
1525

1526
	dev->video_inputs = em28xx_boards[model].vchannels;
1527 1528

	for (i = 0; i < TVNORMS; i++)
1529
		if (em28xx_boards[model].norm == tvnorms[i].mode)
1530 1531 1532 1533 1534 1535
			break;
	if (i == TVNORMS)
		i = 0;

	dev->tvnorm = &tvnorms[i];	/* set default norm */

1536
	em28xx_videodbg("tvnorm=%s\n", dev->tvnorm->name);
1537 1538 1539 1540 1541 1542 1543

	maxw = norm_maxw(dev);
	maxh = norm_maxh(dev);

	/* set default image size */
	dev->width = maxw;
	dev->height = maxh;
1544
	dev->interlaced = EM28XX_INTERLACED_DEFAULT;
1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562
	dev->field_size = dev->width * dev->height;
	dev->frame_size =
	    dev->interlaced ? dev->field_size << 1 : dev->field_size;
	dev->bytesperline = dev->width * 2;
	dev->hscale = 0;
	dev->vscale = 0;
	dev->ctl_input = 2;

	/* setup video picture settings for saa7113h */
	memset(&dev->vpic, 0, sizeof(dev->vpic));
	dev->vpic.colour = 128 << 8;
	dev->vpic.hue = 128 << 8;
	dev->vpic.brightness = 128 << 8;
	dev->vpic.contrast = 192 << 8;
	dev->vpic.whiteness = 128 << 8;	/* This one isn't used */
	dev->vpic.depth = 16;
	dev->vpic.palette = VIDEO_PALETTE_YUV422;

1563
	em28xx_pre_card_setup(dev);
1564 1565
#ifdef CONFIG_MODULES
	/* request some modules */
1566
	if (dev->decoder == EM28XX_SAA7113 || dev->decoder == EM28XX_SAA7114)
1567
		request_module("saa7115");
1568
	if (dev->decoder == EM28XX_TVP5150)
1569 1570 1571 1572
		request_module("tvp5150");
	if (dev->has_tuner)
		request_module("tuner");
#endif
1573
	errCode = em28xx_config(dev);
1574
	if (errCode) {
1575
		em28xx_errdev("error configuring device\n");
1576
		em28xx_devused&=~(1<<dev->devno);
1577
		kfree(dev);
1578 1579 1580
		return -ENOMEM;
	}

1581
	mutex_lock(&dev->lock);
1582
	/* register i2c bus */
1583
	em28xx_i2c_register(dev);
1584 1585

	/* Do board specific init and eeprom reading */
1586
	em28xx_card_setup(dev);
1587 1588

	/* configure the device */
1589
	em28xx_config_i2c(dev);
1590

1591
	mutex_unlock(&dev->lock);
1592

1593
	errCode = em28xx_config(dev);
1594 1595 1596 1597 1598 1599 1600 1601

#ifdef CONFIG_MODULES
	if (dev->has_msp34xx)
		request_module("msp3400");
#endif
	/* allocate and fill v4l2 device struct */
	dev->vdev = video_device_alloc();
	if (NULL == dev->vdev) {
1602
		em28xx_errdev("cannot allocate video_device.\n");
1603
		em28xx_devused&=~(1<<dev->devno);
1604
		kfree(dev);
1605 1606 1607 1608 1609 1610 1611 1612
		return -ENOMEM;
	}

	dev->vbi_dev = video_device_alloc();
	if (NULL == dev->vbi_dev) {
		em28xx_errdev("cannot allocate video_device.\n");
		kfree(dev->vdev);
		em28xx_devused&=~(1<<dev->devno);
1613
		kfree(dev);
1614 1615 1616
		return -ENOMEM;
	}

1617 1618 1619 1620 1621 1622 1623 1624 1625 1626
	/* Fills VBI device info */
	dev->vbi_dev->type = VFL_TYPE_VBI;
	dev->vbi_dev->fops = &em28xx_v4l_fops;
	dev->vbi_dev->minor = -1;
	dev->vbi_dev->dev = &dev->udev->dev;
	dev->vbi_dev->release = video_device_release;
	snprintf(dev->vbi_dev->name, sizeof(dev->vbi_dev->name), "%s#%d %s",
							 "em28xx",dev->devno,"vbi");

	/* Fills CAPTURE device info */
1627 1628 1629
	dev->vdev->type = VID_TYPE_CAPTURE;
	if (dev->has_tuner)
		dev->vdev->type |= VID_TYPE_TUNER;
1630
	dev->vdev->fops = &em28xx_v4l_fops;
1631 1632 1633
	dev->vdev->minor = -1;
	dev->vdev->dev = &dev->udev->dev;
	dev->vdev->release = video_device_release;
1634 1635 1636
	snprintf(dev->vdev->name, sizeof(dev->vbi_dev->name), "%s#%d %s",
							 "em28xx",dev->devno,"video");

1637
	list_add_tail(&dev->devlist,&em28xx_devlist);
1638 1639

	/* register v4l2 device */
1640
	mutex_lock(&dev->lock);
1641 1642
	if ((retval = video_register_device(dev->vdev, VFL_TYPE_GRABBER,
					 video_nr[dev->devno]))) {
1643
		em28xx_errdev("unable to register video device (error=%i).\n",
1644
			      retval);
1645
		mutex_unlock(&dev->lock);
1646
		list_del(&dev->devlist);
1647
		video_device_release(dev->vdev);
1648
		em28xx_devused&=~(1<<dev->devno);
1649
		kfree(dev);
1650 1651
		return -ENODEV;
	}
1652 1653 1654 1655

	if (video_register_device(dev->vbi_dev, VFL_TYPE_VBI,
					vbi_nr[dev->devno]) < 0) {
		printk("unable to register vbi device\n");
1656
		mutex_unlock(&dev->lock);
1657 1658 1659 1660
		list_del(&dev->devlist);
		video_device_release(dev->vbi_dev);
		video_device_release(dev->vdev);
		em28xx_devused&=~(1<<dev->devno);
1661
		kfree(dev);
1662 1663 1664 1665 1666
		return -ENODEV;
	} else {
		printk("registered VBI\n");
	}

1667 1668
	if (dev->has_msp34xx) {
		/* Send a reset to other chips via gpio */
1669
		em28xx_write_regs_req(dev, 0x00, 0x08, "\xf7", 1);
1670
		msleep(3);
1671
		em28xx_write_regs_req(dev, 0x00, 0x08, "\xff", 1);
1672
		msleep(3);
1673 1674 1675 1676

	}
	video_mux(dev, 0);

1677
	mutex_unlock(&dev->lock);
1678

1679 1680 1681
	em28xx_info("V4L2 device registered as /dev/video%d and /dev/vbi%d\n",
				dev->vdev->minor-MINOR_VFL_TYPE_GRABBER_MIN,
				dev->vbi_dev->minor-MINOR_VFL_TYPE_VBI_MIN);
1682 1683 1684 1685 1686

	return 0;
}

/*
1687
 * em28xx_usb_probe()
1688 1689
 * checks for supported devices
 */
1690
static int em28xx_usb_probe(struct usb_interface *interface,
1691 1692 1693 1694
			    const struct usb_device_id *id)
{
	const struct usb_endpoint_descriptor *endpoint;
	struct usb_device *udev;
1695
	struct usb_interface *uif;
1696
	struct em28xx *dev = NULL;
1697
	int retval = -ENODEV;
1698
	int model,i,nr,ifnum;
1699 1700

	udev = usb_get_dev(interface_to_usbdev(interface));
1701 1702
	ifnum = interface->altsetting[0].desc.bInterfaceNumber;

1703 1704 1705
	/* Check to see next free device and mark as used */
	nr=find_first_zero_bit(&em28xx_devused,EM28XX_MAXBOARDS);
	em28xx_devused|=1<<nr;
1706

1707
	/* Don't register audio interfaces */
1708
	if (interface->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) {
1709
		em28xx_err(DRIVER_NAME " audio device (%04x:%04x): interface %i, class %i\n",
1710 1711 1712
				udev->descriptor.idVendor,udev->descriptor.idProduct,
				ifnum,
				interface->altsetting[0].desc.bInterfaceClass);
1713 1714

		em28xx_devused&=~(1<<nr);
1715
		return -ENODEV;
1716 1717
	}

1718
	em28xx_err(DRIVER_NAME " new video device (%04x:%04x): interface %i, class %i\n",
1719 1720 1721
			udev->descriptor.idVendor,udev->descriptor.idProduct,
			ifnum,
			interface->altsetting[0].desc.bInterfaceClass);
1722

1723 1724
	endpoint = &interface->cur_altsetting->endpoint[1].desc;

1725
	/* check if the device has the iso in endpoint at the correct place */
1726 1727
	if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) !=
	    USB_ENDPOINT_XFER_ISOC) {
1728
		em28xx_err(DRIVER_NAME " probing error: endpoint is non-ISO endpoint!\n");
1729
		em28xx_devused&=~(1<<nr);
1730 1731 1732
		return -ENODEV;
	}
	if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT) {
1733
		em28xx_err(DRIVER_NAME " probing error: endpoint is ISO OUT endpoint!\n");
1734
		em28xx_devused&=~(1<<nr);
1735 1736 1737
		return -ENODEV;
	}

1738 1739
	model=id->driver_info;

1740
	if (nr >= EM28XX_MAXBOARDS) {
1741
		printk (DRIVER_NAME ": Supports only %i em28xx boards.\n",EM28XX_MAXBOARDS);
1742
		em28xx_devused&=~(1<<nr);
1743 1744 1745 1746
		return -ENOMEM;
	}

	/* allocate memory for our device state and initialize it */
P
 
Panagiotis Issaris 已提交
1747
	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
1748
	if (dev == NULL) {
1749
		em28xx_err(DRIVER_NAME ": out of memory!\n");
1750
		em28xx_devused&=~(1<<nr);
1751 1752 1753
		return -ENOMEM;
	}

1754 1755 1756
	snprintf(dev->name, 29, "em28xx #%d", nr);
	dev->devno=nr;

1757 1758 1759 1760
	/* compute alternate max packet sizes */
	uif = udev->actconfig->interface[0];

	dev->num_alt=uif->num_altsetting;
1761
	em28xx_info("Alternate settings: %i\n",dev->num_alt);
1762 1763 1764 1765
//	dev->alt_max_pkt_size = kmalloc(sizeof(*dev->alt_max_pkt_size)*
	dev->alt_max_pkt_size = kmalloc(32*
						dev->num_alt,GFP_KERNEL);
	if (dev->alt_max_pkt_size == NULL) {
1766 1767
		em28xx_errdev("out of memory!\n");
		em28xx_devused&=~(1<<nr);
1768
		kfree(dev);
1769 1770 1771 1772 1773 1774 1775 1776
		return -ENOMEM;
	}

	for (i = 0; i < dev->num_alt ; i++) {
		u16 tmp = le16_to_cpu(uif->altsetting[i].endpoint[1].desc.
							wMaxPacketSize);
		dev->alt_max_pkt_size[i] =
		    (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
1777
		em28xx_info("Alternate setting %i, max size= %i\n",i,
1778 1779 1780
							dev->alt_max_pkt_size[i]);
	}

1781
	if ((card[nr]>=0)&&(card[nr]<em28xx_bcount))
1782 1783 1784
		model=card[nr];

	if ((model==EM2800_BOARD_UNKNOWN)||(model==EM2820_BOARD_UNKNOWN)) {
1785 1786 1787 1788 1789
		em28xx_errdev("Your board has no unique USB ID and thus can't be autodetected.\n");
		em28xx_errdev("Please pass card=<n> insmod option to workaround that.\n");
		em28xx_errdev("If there isn't any card number for you, please send an email to:\n");
		em28xx_errdev("\tV4L Mailing List <video4linux-list@redhat.com>\n");
		em28xx_errdev("Here is a list of valid choices for the card=<n> insmod option:\n");
1790
		for (i = 0; i < em28xx_bcount; i++) {
1791 1792
			em28xx_errdev("    card=%d -> %s\n", i,
							em28xx_boards[i].name);
1793 1794 1795
		}
	}

1796
	/* allocate device struct */
1797
	retval = em28xx_init_dev(&dev, udev, nr, model);
1798 1799 1800
	if (retval)
		return retval;

1801
	em28xx_info("Found %s\n", em28xx_boards[model].name);
1802 1803 1804 1805 1806 1807 1808

	/* save our data pointer in this interface device */
	usb_set_intfdata(interface, dev);
	return 0;
}

/*
1809
 * em28xx_usb_disconnect()
1810 1811 1812
 * called when the device gets diconencted
 * video device will be unregistered on v4l2_close in case it is still open
 */
1813
static void em28xx_usb_disconnect(struct usb_interface *interface)
1814
{
1815
	struct em28xx *dev = usb_get_intfdata(interface);
1816 1817 1818 1819 1820
	usb_set_intfdata(interface, NULL);

	if (!dev)
		return;

1821
	down_write(&em28xx_disconnect);
1822

1823
	mutex_lock(&dev->lock);
1824

1825
	em28xx_info("disconnecting %s\n", dev->vdev->name);
1826 1827 1828 1829

	wake_up_interruptible_all(&dev->open);

	if (dev->users) {
1830
		em28xx_warn
1831
		    ("device /dev/video%d is open! Deregistration and memory "
1832 1833 1834
		     "deallocation are deferred on close.\n",
				dev->vdev->minor-MINOR_VFL_TYPE_GRABBER_MIN);

1835
		dev->state |= DEV_MISCONFIGURED;
1836
		em28xx_uninit_isoc(dev);
1837 1838 1839 1840 1841
		dev->state |= DEV_DISCONNECTED;
		wake_up_interruptible(&dev->wait_frame);
		wake_up_interruptible(&dev->wait_stream);
	} else {
		dev->state |= DEV_DISCONNECTED;
1842
		em28xx_release_resources(dev);
1843 1844
	}

1845
	mutex_unlock(&dev->lock);
1846

1847 1848
	if (!dev->users) {
		kfree(dev->alt_max_pkt_size);
1849
		kfree(dev);
1850
	}
1851

1852
	up_write(&em28xx_disconnect);
1853 1854
}

1855 1856 1857 1858 1859
static struct usb_driver em28xx_usb_driver = {
	.name = "em28xx",
	.probe = em28xx_usb_probe,
	.disconnect = em28xx_usb_disconnect,
	.id_table = em28xx_id_table,
1860 1861
};

1862
static int __init em28xx_module_init(void)
1863 1864 1865 1866
{
	int result;

	printk(KERN_INFO DRIVER_NAME " v4l2 driver version %d.%d.%d loaded\n",
1867 1868
	       (EM28XX_VERSION_CODE >> 16) & 0xff,
	       (EM28XX_VERSION_CODE >> 8) & 0xff, EM28XX_VERSION_CODE & 0xff);
1869 1870 1871 1872 1873 1874
#ifdef SNAPSHOT
	printk(KERN_INFO DRIVER_NAME " snapshot date %04d-%02d-%02d\n",
	       SNAPSHOT / 10000, (SNAPSHOT / 100) % 100, SNAPSHOT % 100);
#endif

	/* register this driver with the USB subsystem */
1875
	result = usb_register(&em28xx_usb_driver);
1876
	if (result)
1877
		em28xx_err(DRIVER_NAME
1878 1879 1880 1881 1882
			   " usb_register failed. Error number %d.\n", result);

	return result;
}

1883
static void __exit em28xx_module_exit(void)
1884 1885
{
	/* deregister this driver with the USB subsystem */
1886
	usb_deregister(&em28xx_usb_driver);
1887 1888
}

1889 1890
module_init(em28xx_module_init);
module_exit(em28xx_module_exit);