em28xx-video.c 46.3 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

	/* configure tda9887 */


193
/*	em28xx_i2c_call_clients(dev,VIDIOC_S_STD,&dev->tvnorm->id); */
194 195 196
}

/*
197
 * em28xx_empty_framequeues()
198 199
 * prepare queues for incoming and outgoing frames
 */
200
static void em28xx_empty_framequeues(struct em28xx *dev)
201 202 203 204 205 206
{
	u32 i;

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

207
	for (i = 0; i < EM28XX_NUM_FRAMES; i++) {
208 209 210 211 212
		dev->frame[i].state = F_UNUSED;
		dev->frame[i].buf.bytesused = 0;
	}
}

213 214
static void video_mux(struct em28xx *dev, int index)
{
215 216
	int ainput;
	struct v4l2_routing route;
217

218 219
	route.input = INPUT(index)->vmux;
	route.output = 0;
220 221 222
	dev->ctl_input = index;
	dev->ctl_ainput = INPUT(index)->amux;

223
	em28xx_i2c_call_clients(dev, VIDIOC_INT_S_VIDEO_ROUTING, &route);
224

225
	em28xx_videodbg("Setting input index=%d, vmux=%d, amux=%d\n",index,route.input,dev->ctl_ainput);
226 227

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

248
/*
249
 * em28xx_v4l2_open()
250 251
 * inits the device and starts isoc transfer
 */
252
static int em28xx_v4l2_open(struct inode *inode, struct file *filp)
253 254 255
{
	int minor = iminor(inode);
	int errCode = 0;
256
	struct em28xx *h,*dev = NULL;
257

258
	list_for_each_entry(h, &em28xx_devlist, devlist) {
259 260
		if (h->vdev->minor == minor) {
			dev  = h;
261 262 263 264 265
			dev->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
		}
		if (h->vbi_dev->minor == minor) {
			dev  = h;
			dev->type = V4L2_BUF_TYPE_VBI_CAPTURE;
266 267
		}
	}
268 269
	if (NULL == dev)
		return -ENODEV;
270

271 272
	em28xx_videodbg("open minor=%d type=%s users=%d\n",
				minor,v4l2_type_names[dev->type],dev->users);
273

274
	if (!down_read_trylock(&em28xx_disconnect))
275 276 277
		return -ERESTARTSYS;

	if (dev->users) {
278 279
		em28xx_warn("this driver can be opened only once\n");
		up_read(&em28xx_disconnect);
280 281 282
		return -EBUSY;
	}

283
	mutex_init(&dev->fileop_lock);	/* to 1 == available */
284 285 286 287
	spin_lock_init(&dev->queue_lock);
	init_waitqueue_head(&dev->wait_frame);
	init_waitqueue_head(&dev->wait_stream);

288
	mutex_lock(&dev->lock);
289

290 291
	if (dev->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
		em28xx_set_alternate(dev);
292

293 294 295 296 297 298 299
		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;
300

301 302
		em28xx_capture_start(dev, 1);
		em28xx_resolution_set(dev);
303

304 305 306
		/* device needs to be initialized before isoc transfer */
		video_mux(dev, 0);

307 308 309 310 311 312
		/* start the transfer */
		errCode = em28xx_init_isoc(dev);
		if (errCode)
			goto err;

	}
313 314 315 316 317 318 319 320

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

	/* prepare queues */
321
	em28xx_empty_framequeues(dev);
322 323 324

	dev->state |= DEV_INITIALIZED;

325 326
err:
	mutex_unlock(&dev->lock);
327
	up_read(&em28xx_disconnect);
328 329 330 331
	return errCode;
}

/*
332
 * em28xx_realease_resources()
333 334 335
 * unregisters the v4l2,i2c and usb devices
 * called when the device gets disconected or at module unload
*/
336
static void em28xx_release_resources(struct em28xx *dev)
337
{
338
	mutex_lock(&em28xx_sysfs_lock);
339

340 341 342 343 344
	/*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);
345
	list_del(&dev->devlist);
346
	video_unregister_device(dev->vdev);
347
	video_unregister_device(dev->vbi_dev);
348
	em28xx_i2c_unregister(dev);
349
	usb_put_dev(dev->udev);
350
	mutex_unlock(&em28xx_sysfs_lock);
351 352 353 354


	/* Mark device as unused */
	em28xx_devused&=~(1<<dev->devno);
355 356 357
}

/*
358
 * em28xx_v4l2_close()
359 360
 * stops streaming and deallocates all resources allocated by the v4l2 calls and ioctls
 */
361
static int em28xx_v4l2_close(struct inode *inode, struct file *filp)
362 363
{
	int errCode;
364
	struct em28xx *dev=filp->private_data;
365

366
	em28xx_videodbg("users=%d\n", dev->users);
367

368
	mutex_lock(&dev->lock);
369

370
	em28xx_uninit_isoc(dev);
371

372
	em28xx_release_buffers(dev);
373 374 375

	/* the device is already disconnect, free the remaining resources */
	if (dev->state & DEV_DISCONNECTED) {
376
		em28xx_release_resources(dev);
377
		mutex_unlock(&dev->lock);
378 379 380 381 382 383
		kfree(dev);
		return 0;
	}

	/* set alternate 0 */
	dev->alt = 0;
384
	em28xx_videodbg("setting alternate 0\n");
385 386
	errCode = usb_set_interface(dev->udev, 0, 0);
	if (errCode < 0) {
387
		em28xx_errdev ("cannot change alternate number to 0 (error=%i)\n",
388 389 390 391 392
		     errCode);
	}

	dev->users--;
	wake_up_interruptible_nr(&dev->open, 1);
393
	mutex_unlock(&dev->lock);
394 395 396 397
	return 0;
}

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

410 411 412 413 414 415 416
	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)) {
417
			mutex_unlock(&dev->fileop_lock);
418 419 420 421 422 423 424 425
			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)) {
426
			mutex_unlock(&dev->fileop_lock);
427 428 429 430 431
			return -EFAULT;
		}
		return (1);
	}

432
	if (mutex_lock_interruptible(&dev->fileop_lock))
433 434 435
		return -ERESTARTSYS;

	if (dev->state & DEV_DISCONNECTED) {
436
		em28xx_videodbg("device not present\n");
437
		mutex_unlock(&dev->fileop_lock);
438 439 440 441
		return -ENODEV;
	}

	if (dev->state & DEV_MISCONFIGURED) {
442
		em28xx_videodbg("device misconfigured; close and open it again\n");
443
		mutex_unlock(&dev->fileop_lock);
444 445 446 447
		return -EIO;
	}

	if (dev->io == IO_MMAP) {
448
		em28xx_videodbg ("IO method is set to mmap; close and open"
449
				" the device again to choose the read method\n");
450
		mutex_unlock(&dev->fileop_lock);
451 452 453 454
		return -EINVAL;
	}

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

	if (!count) {
466
		mutex_unlock(&dev->fileop_lock);
467 468 469 470 471
		return 0;
	}

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

489
	f = list_entry(dev->outqueue.prev, struct em28xx_frame_t, frame);
490 491 492 493 494 495 496

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

497
	em28xx_queue_unusedframes(dev);
498 499 500 501 502

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

	if (copy_to_user(buf, f->bufmem, count)) {
503
		mutex_unlock(&dev->fileop_lock);
504 505 506 507
		return -EFAULT;
	}
	*f_pos += count;

508
	mutex_unlock(&dev->fileop_lock);
509 510 511 512 513

	return count;
}

/*
514
 * em28xx_v4l2_poll()
515 516
 * will allocate buffers when called for the first time
 */
517
static unsigned int em28xx_v4l2_poll(struct file *filp, poll_table * wait)
518 519
{
	unsigned int mask = 0;
520
	struct em28xx *dev = filp->private_data;
521

522
	if (mutex_lock_interruptible(&dev->fileop_lock))
523 524 525
		return POLLERR;

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

		if (dev->io == IO_READ) {
542
			em28xx_queue_unusedframes(dev);
543 544 545 546 547
			poll_wait(filp, &dev->wait_frame, wait);

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

548
			mutex_unlock(&dev->fileop_lock);
549 550 551 552 553

			return mask;
		}
	}

554
	mutex_unlock(&dev->fileop_lock);
555 556 557 558
	return POLLERR;
}

/*
559
 * em28xx_vm_open()
560
 */
561
static void em28xx_vm_open(struct vm_area_struct *vma)
562
{
563
	struct em28xx_frame_t *f = vma->vm_private_data;
564 565 566 567
	f->vma_use_count++;
}

/*
568
 * em28xx_vm_close()
569
 */
570
static void em28xx_vm_close(struct vm_area_struct *vma)
571 572
{
	/* NOTE: buffers are not freed here */
573
	struct em28xx_frame_t *f = vma->vm_private_data;
574 575 576
	f->vma_use_count--;
}

577 578 579
static struct vm_operations_struct em28xx_vm_ops = {
	.open = em28xx_vm_open,
	.close = em28xx_vm_close,
580 581 582
};

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

592
	struct em28xx *dev = filp->private_data;
593

594
	if (mutex_lock_interruptible(&dev->fileop_lock))
595 596 597
		return -ERESTARTSYS;

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

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

	if (dev->io != IO_MMAP || !(vma->vm_flags & VM_WRITE) ||
	    size != PAGE_ALIGN(dev->frame[0].buf.length)) {
612
		mutex_unlock(&dev->fileop_lock);
613 614 615 616 617 618 619 620
		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) {
621
		em28xx_videodbg("mmap: user supplied mapping address is out of range\n");
622
		mutex_unlock(&dev->fileop_lock);
623 624 625 626 627 628 629
		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 */

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

642
	vma->vm_ops = &em28xx_vm_ops;
643 644
	vma->vm_private_data = &dev->frame[i];

645
	em28xx_vm_open(vma);
646
	mutex_unlock(&dev->fileop_lock);
647 648 649 650
	return 0;
}

/*
651
 * em28xx_get_ctrl()
652 653
 * return the current saturation, brightness or contrast, mute state
 */
654
static int em28xx_get_ctrl(struct em28xx *dev, struct v4l2_control *ctrl)
655 656 657 658 659 660 661 662
{
	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;
663 664 665 666 667
	default:
		return -EINVAL;
	}
}

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

690
/*
691
 * em28xx_stream_interrupt()
692 693
 * stops streaming
 */
694
static int em28xx_stream_interrupt(struct em28xx *dev)
695 696 697 698 699 700 701 702 703
{
	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),
704
				 EM28XX_URB_TIMEOUT);
705 706 707 708
	if (dev->state & DEV_DISCONNECTED)
		return -ENODEV;
	else if (ret) {
		dev->state |= DEV_MISCONFIGURED;
709
		em28xx_videodbg("device is misconfigured; close and "
710 711
			"open /dev/video%d again\n",
				dev->vdev->minor-MINOR_VFL_TYPE_GRABBER_MIN);
712 713 714 715 716 717
		return ret;
	}

	return 0;
}

718
static int em28xx_set_norm(struct em28xx *dev, int width, int height)
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 754 755 756
{
	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;

757
	em28xx_resolution_set(dev);
758 759 760 761

	return 0;
}

762 763 764 765 766 767 768 769 770 771 772
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");

773 774 775
	switch (format->type) {
	case V4L2_BUF_TYPE_VIDEO_CAPTURE:
	{
776 777 778 779 780 781 782 783 784 785
		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);
786
		break;
787 788
	}

789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804
	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);
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 874 875 876
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;
	}

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

880 881 882
	width = (((unsigned long)maxw) << 12) / (hscale + 4096L);

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

	height = (((unsigned long)maxh) << 12) / (vscale + 4096L);
886 887 888 889 890 891 892 893 894 895

	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",
896 897 898
		cmd == VIDIOC_TRY_FMT ?
		"VIDIOC_TRY_FMT" :"VIDIOC_S_FMT",
		format->fmt.pix.width, format->fmt.pix.height, hscale, vscale);
899 900 901 902 903 904 905 906 907 908 909 910 911

	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) {
912
		em28xx_videodbg("VIDIOC_SET_FMT: interrupting stream\n");
913 914 915 916 917 918 919 920 921 922 923
		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;
924
	dev->field_size = dev->frame_size >> 1;
925 926 927 928 929 930 931 932 933 934 935
	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;
}
936

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

	switch (cmd) {
		/* ---------- tv norms ---------- */
	case VIDIOC_ENUMSTD:
952 953 954
	{
		struct v4l2_standard *e = arg;
		unsigned int i;
955

956 957 958 959 960 961 962 963 964 965
		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;
	}
966
	case VIDIOC_G_STD:
967 968
	{
		v4l2_std_id *id = arg;
969

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

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

988
		mutex_lock(&dev->lock);
989
		dev->tvnorm = &tvnorms[i];
990

991
		em28xx_set_norm(dev, dev->width, dev->height);
992

993 994
		em28xx_i2c_call_clients(dev, VIDIOC_S_STD,
					&dev->tvnorm->id);
995

996
		mutex_unlock(&dev->lock);
997

998 999
		return 0;
	}
1000

1001
	/* ------ input switching ---------- */
1002
	case VIDIOC_ENUMINPUT:
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 1031 1032 1033
	{
		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;
	}
1034
	case VIDIOC_G_INPUT:
1035 1036 1037
	{
		int *i = arg;
		*i = dev->ctl_input;
1038

1039 1040
		return 0;
	}
1041
	case VIDIOC_S_INPUT:
1042 1043
	{
		int *index = arg;
1044

1045 1046 1047 1048
		if (*index >= MAX_EM28XX_INPUT)
			return -EINVAL;
		if (0 == INPUT(*index)->type)
			return -EINVAL;
1049

1050
		mutex_lock(&dev->lock);
1051
		video_mux(dev, *index);
1052
		mutex_unlock(&dev->lock);
1053

1054 1055
		return 0;
	}
1056
	case VIDIOC_G_AUDIO:
1057 1058 1059
	{
		struct v4l2_audio *a = arg;
		unsigned int index = a->index;
1060

1061 1062 1063 1064
		if (a->index > 1)
			return -EINVAL;
		memset(a, 0, sizeof(*a));
		index = dev->ctl_ainput;
1065

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

1079 1080 1081 1082 1083
		if (a->index != dev->ctl_ainput)
			return -EINVAL;

		return 0;
	}
1084

1085
	/* --- controls ---------------------------------------------- */
1086
	case VIDIOC_QUERYCTRL:
1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098
	{
		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));
1099 1100
					return 0;
				}
1101
			}
1102
		}
1103 1104 1105 1106 1107
		em28xx_i2c_call_clients(dev,cmd,qc);
		if (qc->type)
			return 0;
		else
			return -EINVAL;
1108
	}
1109
	case VIDIOC_G_CTRL:
1110 1111 1112
	{
		struct v4l2_control *ctrl = arg;
		int retval=-EINVAL;
1113

1114 1115 1116
		if (!dev->has_msp34xx)
			retval=em28xx_get_ctrl(dev, ctrl);
		if (retval==-EINVAL) {
1117 1118
			em28xx_i2c_call_clients(dev,cmd,arg);
			return 0;
1119 1120
		} else return retval;
	}
1121
	case VIDIOC_S_CTRL:
1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134
	{
		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);
1135 1136
				}
			}
1137
		}
1138

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

1147 1148
		if (0 != t->index)
			return -EINVAL;
1149

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

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

1176 1177 1178
		memset(f, 0, sizeof(*f));
		f->type = V4L2_TUNER_ANALOG_TV;
		f->frequency = dev->ctl_freq;
1179

1180 1181
		return 0;
	}
1182
	case VIDIOC_S_FREQUENCY:
1183 1184
	{
		struct v4l2_frequency *f = arg;
1185

1186 1187
		if (0 != f->tuner)
			return -EINVAL;
1188

1189 1190
		if (V4L2_TUNER_ANALOG_TV != f->type)
			return -EINVAL;
1191

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

1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212
		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;
	}
1213
	case VIDIOC_STREAMON:
1214 1215
	{
		int *type = arg;
1216

1217 1218 1219
		if (*type != V4L2_BUF_TYPE_VIDEO_CAPTURE
			|| dev->io != IO_MMAP)
			return -EINVAL;
1220

1221 1222
		if (list_empty(&dev->inqueue))
			return -EINVAL;
1223

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

1226
		em28xx_videodbg("VIDIOC_STREAMON: starting stream\n");
1227

1228 1229
		return 0;
	}
1230
	case VIDIOC_STREAMOFF:
1231 1232 1233
	{
		int *type = arg;
		int ret;
1234

1235 1236 1237
		if (*type != V4L2_BUF_TYPE_VIDEO_CAPTURE
			|| dev->io != IO_MMAP)
			return -EINVAL;
1238

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

		return 0;
	}
1248 1249 1250 1251 1252 1253 1254 1255
	default:
		return v4l_compat_translate_ioctl(inode, filp, cmd, arg,
						  driver_ioctl);
	}
	return 0;
}

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

	if (!dev)
		return -ENODEV;

	if (video_debug > 1)
1270
		v4l_print_ioctl(dev->name,cmd);
1271 1272 1273 1274 1275 1276

	switch (cmd) {

		/* --- capabilities ------------------------------------------ */
	case VIDIOC_QUERYCAP:
		{
1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295
		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 ---------------------------------------- */
1296
	case VIDIOC_ENUM_FMT:
1297 1298
	{
		struct v4l2_fmtdesc *fmtd = arg;
1299

1300 1301 1302 1303 1304 1305 1306 1307 1308
		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;
	}
1309
	case VIDIOC_G_FMT:
1310
		return em28xx_get_fmt(dev, (struct v4l2_format *) arg);
1311 1312 1313

	case VIDIOC_TRY_FMT:
	case VIDIOC_S_FMT:
1314
		return em28xx_set_fmt(dev, cmd, (struct v4l2_format *)arg);
1315 1316

	case VIDIOC_REQBUFS:
1317 1318 1319 1320
	{
		struct v4l2_requestbuffers *rb = arg;
		u32 i;
		int ret;
1321

1322 1323 1324
		if (rb->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
			rb->memory != V4L2_MEMORY_MMAP)
			return -EINVAL;
1325

1326 1327 1328 1329 1330 1331
		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;
		}
1332

1333 1334 1335 1336
		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;
1337 1338
			}

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

1345
		em28xx_empty_framequeues(dev);
1346

1347 1348 1349 1350
		em28xx_release_buffers(dev);
		if (rb->count)
			rb->count =
				em28xx_request_buffers(dev, rb->count);
1351

1352
		dev->frame_current = NULL;
1353

1354 1355 1356 1357 1358
		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;
	}
1359
	case VIDIOC_QUERYBUF:
1360 1361
	{
		struct v4l2_buffer *b = arg;
1362

1363 1364 1365
		if (b->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
			b->index >= dev->num_frames || dev->io != IO_MMAP)
			return -EINVAL;
1366

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

1369 1370
		if (dev->frame[b->index].vma_use_count) {
			b->flags |= V4L2_BUF_FLAG_MAPPED;
1371
		}
1372 1373 1374 1375 1376 1377
		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;
	}
1378
	case VIDIOC_QBUF:
1379 1380 1381
	{
		struct v4l2_buffer *b = arg;
		unsigned long lock_flags;
1382

1383 1384 1385 1386
		if (b->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
			b->index >= dev->num_frames || dev->io != IO_MMAP) {
			return -EINVAL;
		}
1387

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

1393 1394 1395 1396 1397
		/* 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);
1398

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

1408 1409 1410
		if (b->type != V4L2_BUF_TYPE_VIDEO_CAPTURE
			|| dev->io != IO_MMAP)
			return -EINVAL;
1411

1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425
		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;
		}
1426

1427 1428 1429 1430 1431
		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);
1432

1433 1434
		f->state = F_UNUSED;
		memcpy(b, &f->buf, sizeof(*b));
1435

1436 1437
		if (f->vma_use_count)
			b->flags |= V4L2_BUF_FLAG_MAPPED;
1438

1439 1440
		return 0;
	}
1441
	default:
1442 1443
		return em28xx_do_ioctl(inode, filp, dev, cmd, arg,
				       em28xx_video_do_ioctl);
1444 1445 1446 1447 1448
	}
	return 0;
}

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

1458
	if (mutex_lock_interruptible(&dev->fileop_lock))
1459 1460 1461
		return -ERESTARTSYS;

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

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

1474
	ret = video_usercopy(inode, filp, cmd, arg, em28xx_video_do_ioctl);
1475

1476
	mutex_unlock(&dev->fileop_lock);
1477 1478 1479 1480

	return ret;
}

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

1492 1493 1494 1495 1496
};

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

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

	dev->udev = udev;
	dev->model = model;
1510
	mutex_init(&dev->lock);
1511 1512
	init_waitqueue_head(&dev->open);

1513 1514 1515 1516 1517 1518 1519 1520 1521 1522
	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;
1523 1524 1525 1526

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

1529
	dev->video_inputs = em28xx_boards[model].vchannels;
1530 1531

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

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

1539
	em28xx_videodbg("tvnorm=%s\n", dev->tvnorm->name);
1540 1541 1542 1543 1544 1545 1546

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

	/* set default image size */
	dev->width = maxw;
	dev->height = maxh;
1547
	dev->interlaced = EM28XX_INTERLACED_DEFAULT;
1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565
	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;

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

1584
	mutex_lock(&dev->lock);
1585
	/* register i2c bus */
1586
	em28xx_i2c_register(dev);
1587 1588

	/* Do board specific init and eeprom reading */
1589
	em28xx_card_setup(dev);
1590 1591

	/* configure the device */
1592
	em28xx_config_i2c(dev);
1593

1594
	mutex_unlock(&dev->lock);
1595

1596
	errCode = em28xx_config(dev);
1597 1598 1599 1600 1601 1602 1603 1604

#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) {
1605
		em28xx_errdev("cannot allocate video_device.\n");
1606
		em28xx_devused&=~(1<<dev->devno);
1607
		kfree(dev);
1608 1609 1610 1611 1612 1613 1614 1615
		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);
1616
		kfree(dev);
1617 1618 1619
		return -ENOMEM;
	}

1620 1621 1622 1623 1624 1625 1626 1627 1628 1629
	/* 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 */
1630 1631 1632
	dev->vdev->type = VID_TYPE_CAPTURE;
	if (dev->has_tuner)
		dev->vdev->type |= VID_TYPE_TUNER;
1633
	dev->vdev->fops = &em28xx_v4l_fops;
1634 1635 1636
	dev->vdev->minor = -1;
	dev->vdev->dev = &dev->udev->dev;
	dev->vdev->release = video_device_release;
1637 1638 1639
	snprintf(dev->vdev->name, sizeof(dev->vbi_dev->name), "%s#%d %s",
							 "em28xx",dev->devno,"video");

1640
	list_add_tail(&dev->devlist,&em28xx_devlist);
1641 1642

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

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

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

	}
	video_mux(dev, 0);

1680
	mutex_unlock(&dev->lock);
1681

1682 1683 1684
	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);
1685 1686 1687 1688 1689

	return 0;
}

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

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

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

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

		em28xx_devused&=~(1<<nr);
1718
		return -ENODEV;
1719 1720
	}

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

1726 1727
	endpoint = &interface->cur_altsetting->endpoint[1].desc;

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

1741 1742
	model=id->driver_info;

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

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

1757 1758 1759
	snprintf(dev->name, 29, "em28xx #%d", nr);
	dev->devno=nr;

1760 1761 1762 1763
	/* compute alternate max packet sizes */
	uif = udev->actconfig->interface[0];

	dev->num_alt=uif->num_altsetting;
1764
	em28xx_info("Alternate settings: %i\n",dev->num_alt);
1765 1766 1767 1768
//	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) {
1769 1770
		em28xx_errdev("out of memory!\n");
		em28xx_devused&=~(1<<nr);
1771
		kfree(dev);
1772 1773 1774 1775 1776 1777 1778 1779
		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);
1780
		em28xx_info("Alternate setting %i, max size= %i\n",i,
1781 1782 1783
							dev->alt_max_pkt_size[i]);
	}

1784
	if ((card[nr]>=0)&&(card[nr]<em28xx_bcount))
1785 1786 1787
		model=card[nr];

	if ((model==EM2800_BOARD_UNKNOWN)||(model==EM2820_BOARD_UNKNOWN)) {
1788
		em28xx_errdev( "Your board has no eeprom inside it and thus can't\n"
1789 1790
			"%s: be autodetected.  Please pass card=<n> insmod option to\n"
			"%s: workaround that.  Redirect complaints to the vendor of\n"
1791 1792
			"%s: the TV card. Generic type will be used."
			"%s: Best regards,\n"
1793 1794
			"%s:         -- tux\n",
			dev->name,dev->name,dev->name,dev->name,dev->name);
1795
		em28xx_errdev("%s: Here is a list of valid choices for the card=<n> insmod option:\n",
1796
			dev->name);
1797
		for (i = 0; i < em28xx_bcount; i++) {
1798 1799
			em28xx_errdev("    card=%d -> %s\n", i,
							em28xx_boards[i].name);
1800 1801 1802
		}
	}

1803
	/* allocate device struct */
1804
	retval = em28xx_init_dev(&dev, udev, nr, model);
1805 1806 1807
	if (retval)
		return retval;

1808
	em28xx_info("Found %s\n", em28xx_boards[model].name);
1809 1810 1811 1812 1813 1814 1815

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

/*
1816
 * em28xx_usb_disconnect()
1817 1818 1819
 * called when the device gets diconencted
 * video device will be unregistered on v4l2_close in case it is still open
 */
1820
static void em28xx_usb_disconnect(struct usb_interface *interface)
1821
{
1822
	struct em28xx *dev = usb_get_intfdata(interface);
1823 1824 1825 1826 1827
	usb_set_intfdata(interface, NULL);

	if (!dev)
		return;

1828
	down_write(&em28xx_disconnect);
1829

1830
	mutex_lock(&dev->lock);
1831

1832
	em28xx_info("disconnecting %s\n", dev->vdev->name);
1833 1834 1835 1836

	wake_up_interruptible_all(&dev->open);

	if (dev->users) {
1837
		em28xx_warn
1838
		    ("device /dev/video%d is open! Deregistration and memory "
1839 1840 1841
		     "deallocation are deferred on close.\n",
				dev->vdev->minor-MINOR_VFL_TYPE_GRABBER_MIN);

1842
		dev->state |= DEV_MISCONFIGURED;
1843
		em28xx_uninit_isoc(dev);
1844 1845 1846 1847 1848
		dev->state |= DEV_DISCONNECTED;
		wake_up_interruptible(&dev->wait_frame);
		wake_up_interruptible(&dev->wait_stream);
	} else {
		dev->state |= DEV_DISCONNECTED;
1849
		em28xx_release_resources(dev);
1850 1851
	}

1852
	mutex_unlock(&dev->lock);
1853

1854 1855
	if (!dev->users) {
		kfree(dev->alt_max_pkt_size);
1856
		kfree(dev);
1857
	}
1858

1859
	up_write(&em28xx_disconnect);
1860 1861
}

1862 1863 1864 1865 1866
static struct usb_driver em28xx_usb_driver = {
	.name = "em28xx",
	.probe = em28xx_usb_probe,
	.disconnect = em28xx_usb_disconnect,
	.id_table = em28xx_id_table,
1867 1868
};

1869
static int __init em28xx_module_init(void)
1870 1871 1872 1873
{
	int result;

	printk(KERN_INFO DRIVER_NAME " v4l2 driver version %d.%d.%d loaded\n",
1874 1875
	       (EM28XX_VERSION_CODE >> 16) & 0xff,
	       (EM28XX_VERSION_CODE >> 8) & 0xff, EM28XX_VERSION_CODE & 0xff);
1876 1877 1878 1879 1880 1881
#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 */
1882
	result = usb_register(&em28xx_usb_driver);
1883
	if (result)
1884
		em28xx_err(DRIVER_NAME
1885 1886 1887 1888 1889
			   " usb_register failed. Error number %d.\n", result);

	return result;
}

1890
static void __exit em28xx_module_exit(void)
1891 1892
{
	/* deregister this driver with the USB subsystem */
1893
	usb_deregister(&em28xx_usb_driver);
1894 1895
}

1896 1897
module_init(em28xx_module_init);
module_exit(em28xx_module_exit);