You need to sign in or sign up before continuing.
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
	em28xx_write_regs_req(dev, 0x00, 0x06, "\x40", 1);
148 149

	/* enable vbi capturing */
150

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

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

	return 0;
}

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

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

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

	/* configure tda9887 */


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

287
	mutex_lock(&dev->lock);
288

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

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

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

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

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

	}
312 313 314 315 316 317 318 319

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

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

	dev->state |= DEV_INITIALIZED;

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

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

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


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

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

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

367
	mutex_lock(&dev->lock);
368

369
	em28xx_uninit_isoc(dev);
370

371
	em28xx_release_buffers(dev);
372 373 374

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

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

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

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

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

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

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

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

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

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

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

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

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

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

496
	em28xx_queue_unusedframes(dev);
497 498 499 500 501

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

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

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

	return count;
}

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

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

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

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

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

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

			return mask;
		}
	}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	return 0;
}

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

756
	em28xx_resolution_set(dev);
757 758 759 760

	return 0;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

995
		mutex_unlock(&dev->lock);
996

997 998
		return 0;
	}
999

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

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

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

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

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

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

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

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

		return 0;
	}
1083

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	if (!dev)
		return -ENODEV;

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

	switch (cmd) {

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

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

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

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

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

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

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

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

1344
		em28xx_empty_framequeues(dev);
1345

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

1351
		dev->frame_current = NULL;
1352

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	return ret;
}

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

1491 1492 1493 1494 1495
};

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1593
	mutex_unlock(&dev->lock);
1594

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

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

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

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

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

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

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

	}
	video_mux(dev, 0);

1679
	mutex_unlock(&dev->lock);
1680

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

	return 0;
}

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

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

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

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

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

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

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

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

1740 1741
	model=id->driver_info;

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

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

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

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

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

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

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

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

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

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

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

	if (!dev)
		return;

1827
	down_write(&em28xx_disconnect);
1828

1829
	mutex_lock(&dev->lock);
1830

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

	wake_up_interruptible_all(&dev->open);

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

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

1851
	mutex_unlock(&dev->lock);
1852

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

1858
	up_write(&em28xx_disconnect);
1859 1860
}

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

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

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

	return result;
}

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

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