em28xx-video.c 48.5 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/mutex.h>
37

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

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

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

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

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

60
static LIST_HEAD(em28xx_devlist);
61

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

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

76 77 78
/* Bitmask marking allocated devices from 0 to EM28XX_MAXBOARDS */
static unsigned long em28xx_devused;

79
/* supported controls */
80
/* Common to all boards */
81
static struct v4l2_queryctrl em28xx_qctrl[] = {
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
	{
		.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,
	}
};

103
static struct usb_driver em28xx_usb_driver;
104 105 106 107 108


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

/*
109
 * em28xx_config()
110 111
 * inits registers with sane defaults
 */
112
static int em28xx_config(struct em28xx *dev)
113 114 115
{

	/* Sets I2C speed to 100 KHz */
116 117
	if (!dev->is_em2800)
		em28xx_write_regs_req(dev, 0x00, 0x06, "\x40", 1);
118 119

	/* enable vbi capturing */
120

121 122
/*	em28xx_write_regs_req(dev,0x00,0x0e,"\xC0",1); audio register */
/*	em28xx_write_regs_req(dev,0x00,0x0f,"\x80",1); clk register */
123 124
	em28xx_write_regs_req(dev,0x00,0x11,"\x51",1);

125 126
	dev->mute = 1;		/* maybe not the right place... */
	dev->volume = 0x1f;
127

128 129 130
	em28xx_outfmt_set_yuv422(dev);
	em28xx_colorlevels_set_default(dev);
	em28xx_compression_disable(dev);
131 132 133 134 135

	return 0;
}

/*
136
 * em28xx_config_i2c()
137 138
 * configure i2c attached devices
 */
139
static void em28xx_config_i2c(struct em28xx *dev)
140
{
141 142 143 144
	struct v4l2_routing route;

	route.input = INPUT(dev->ctl_input)->vmux;
	route.output = 0;
A
Al Viro 已提交
145
	em28xx_i2c_call_clients(dev, VIDIOC_INT_RESET, NULL);
146
	em28xx_i2c_call_clients(dev, VIDIOC_INT_S_VIDEO_ROUTING, &route);
147
	em28xx_i2c_call_clients(dev, VIDIOC_STREAMON, NULL);
148 149 150
}

/*
151
 * em28xx_empty_framequeues()
152 153
 * prepare queues for incoming and outgoing frames
 */
154
static void em28xx_empty_framequeues(struct em28xx *dev)
155 156 157 158 159 160
{
	u32 i;

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

161
	for (i = 0; i < EM28XX_NUM_FRAMES; i++) {
162 163 164 165 166
		dev->frame[i].state = F_UNUSED;
		dev->frame[i].buf.bytesused = 0;
	}
}

167 168
static void video_mux(struct em28xx *dev, int index)
{
169
	struct v4l2_routing route;
170

171 172
	route.input = INPUT(index)->vmux;
	route.output = 0;
173 174 175
	dev->ctl_input = index;
	dev->ctl_ainput = INPUT(index)->amux;

176
	em28xx_i2c_call_clients(dev, VIDIOC_INT_S_VIDEO_ROUTING, &route);
177 178

	if (dev->has_msp34xx) {
179 180
		if (dev->i2s_speed)
			em28xx_i2c_call_clients(dev, VIDIOC_INT_I2S_CLOCK_FREQ, &dev->i2s_speed);
181
		route.input = dev->ctl_ainput;
182
		route.output = MSP_OUTPUT(MSP_SC_IN_DSP_SCART1);
183 184
		/* Note: this is msp3400 specific */
		em28xx_i2c_call_clients(dev, VIDIOC_INT_S_AUDIO_ROUTING, &route);
185
	}
186 187

	em28xx_set_audio_source(dev);
188 189
}

190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227
/* Usage lock check functions */
static int res_get(struct em28xx_fh *fh)
{
	struct em28xx    *dev = fh->dev;
	int		 rc   = 0;

	/* This instance already has stream_on */
	if (fh->stream_on)
		return rc;

	mutex_lock(&dev->lock);

	if (dev->stream_on)
		rc = -EINVAL;
	else {
		dev->stream_on = 1;
		fh->stream_on  = 1;
	}

	mutex_unlock(&dev->lock);
	return rc;
}

static int res_check(struct em28xx_fh *fh)
{
	return (fh->stream_on);
}

static void res_free(struct em28xx_fh *fh)
{
	struct em28xx    *dev = fh->dev;

	mutex_lock(&dev->lock);
	fh->stream_on = 0;
	dev->stream_on = 0;
	mutex_unlock(&dev->lock);
}

228
/*
229
 * em28xx_vm_open()
230
 */
231
static void em28xx_vm_open(struct vm_area_struct *vma)
232
{
233 234 235
	struct em28xx_frame_t *f = vma->vm_private_data;
	f->vma_use_count++;
}
236

237 238 239 240 241 242 243
/*
 * em28xx_vm_close()
 */
static void em28xx_vm_close(struct vm_area_struct *vma)
{
	/* NOTE: buffers are not freed here */
	struct em28xx_frame_t *f = vma->vm_private_data;
244

245 246 247
	if (f->vma_use_count)
		f->vma_use_count--;
}
248

249 250 251 252
static struct vm_operations_struct em28xx_vm_ops = {
	.open = em28xx_vm_open,
	.close = em28xx_vm_close,
};
253

254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269

/*
 * em28xx_get_ctrl()
 * return the current saturation, brightness or contrast, mute state
 */
static int em28xx_get_ctrl(struct em28xx *dev, struct v4l2_control *ctrl)
{
	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;
	default:
		return -EINVAL;
270
	}
271
}
272

273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292
/*
 * em28xx_set_ctrl()
 * mute or set new saturation, brightness or contrast
 */
static int em28xx_set_ctrl(struct em28xx *dev, const struct v4l2_control *ctrl)
{
	switch (ctrl->id) {
	case V4L2_CID_AUDIO_MUTE:
		if (ctrl->value != dev->mute) {
			dev->mute = ctrl->value;
			return em28xx_audio_analog_set(dev);
		}
		return 0;
	case V4L2_CID_AUDIO_VOLUME:
		dev->volume = ctrl->value;
		return em28xx_audio_analog_set(dev);
	default:
		return -EINVAL;
	}
}
293

294 295 296 297 298 299 300
/*
 * em28xx_stream_interrupt()
 * stops streaming
 */
static int em28xx_stream_interrupt(struct em28xx *dev)
{
	int rc = 0;
301

302
	/* stop reading from the device */
303

304 305 306 307 308
	dev->stream = STREAM_INTERRUPT;
	rc = wait_event_timeout(dev->wait_stream,
				(dev->stream == STREAM_OFF) ||
				(dev->state & DEV_DISCONNECTED),
				EM28XX_URB_TIMEOUT);
309

310 311 312 313 314 315 316
	if (rc) {
		dev->state |= DEV_MISCONFIGURED;
		em28xx_videodbg("device is misconfigured; close and "
			"open /dev/video%d again\n",
				dev->vdev->minor-MINOR_VFL_TYPE_GRABBER_MIN);
		return rc;
	}
317

318 319 320 321 322 323 324 325 326
	return 0;
}


static int check_dev(struct em28xx *dev)
{
	if (dev->state & DEV_DISCONNECTED) {
		em28xx_errdev("v4l2 ioctl: device not present\n");
		return -ENODEV;
327
	}
328

329 330 331 332 333 334 335
	if (dev->state & DEV_MISCONFIGURED) {
		em28xx_errdev("v4l2 ioctl: device is misconfigured; "
			      "close and open it again\n");
		return -EIO;
	}
	return 0;
}
336

337 338 339 340 341 342 343 344 345 346 347 348 349 350
static void get_scale(struct em28xx *dev,
			unsigned int width, unsigned int height,
			unsigned int *hscale, unsigned int *vscale)
{
	unsigned int          maxw   = norm_maxw(dev);
	unsigned int          maxh   = norm_maxh(dev);

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

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

353 354 355 356 357 358
/* ------------------------------------------------------------------
	IOCTL vidioc handling
   ------------------------------------------------------------------*/

static int vidioc_g_fmt_cap(struct file *file, void *priv,
					struct v4l2_format *f)
359
{
360 361
	struct em28xx_fh      *fh  = priv;
	struct em28xx         *dev = fh->dev;
362

363
	mutex_lock(&dev->lock);
364

365 366 367 368 369 370
	f->fmt.pix.width = dev->width;
	f->fmt.pix.height = dev->height;
	f->fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
	f->fmt.pix.bytesperline = dev->bytesperline;
	f->fmt.pix.sizeimage = dev->frame_size;
	f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
371

372 373 374
	/* FIXME: TOP? NONE? BOTTOM? ALTENATE? */
	f->fmt.pix.field = dev->interlaced ?
			   V4L2_FIELD_INTERLACED : V4L2_FIELD_TOP;
375

376 377
	mutex_unlock(&dev->lock);
	return 0;
378 379
}

380 381
static int vidioc_try_fmt_cap(struct file *file, void *priv,
			struct v4l2_format *f)
382
{
383 384 385 386 387 388 389 390 391 392 393 394
	struct em28xx_fh      *fh    = priv;
	struct em28xx         *dev   = fh->dev;
	int                   width  = f->fmt.pix.width;
	int                   height = f->fmt.pix.height;
	unsigned int          maxw   = norm_maxw(dev);
	unsigned int          maxh   = norm_maxh(dev);
	unsigned int          hscale, vscale;

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

396 397 398 399 400 401 402 403
	if (height < 32)
		height = 32;
	if (height > maxh)
		height = maxh;
	if (width < 48)
		width = 48;
	if (width > maxw)
		width = maxw;
404

405
	mutex_lock(&dev->lock);
406

407 408 409 410 411 412 413 414 415 416 417 418 419 420 421
	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;
	}
422

423
	get_scale(dev, width, height, &hscale, &vscale);
424

425 426
	width = (((unsigned long)maxw) << 12) / (hscale + 4096L);
	height = (((unsigned long)maxh) << 12) / (vscale + 4096L);
427

428 429 430 431 432 433 434
	f->fmt.pix.width = width;
	f->fmt.pix.height = height;
	f->fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
	f->fmt.pix.bytesperline = width * 2;
	f->fmt.pix.sizeimage = width * 2 * height;
	f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
	f->fmt.pix.field = V4L2_FIELD_INTERLACED;
435

436
	mutex_unlock(&dev->lock);
437 438 439
	return 0;
}

440 441
static int vidioc_s_fmt_cap(struct file *file, void *priv,
			struct v4l2_format *f)
442
{
443 444 445
	struct em28xx_fh      *fh  = priv;
	struct em28xx         *dev = fh->dev;
	int                   rc, i;
446

447 448 449
	rc = check_dev(dev);
	if (rc < 0)
		return rc;
450

451
	vidioc_try_fmt_cap(file, priv, f);
452

453 454
	mutex_lock(&dev->lock);

455 456 457 458 459 460
	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");
			rc = -EINVAL;
			goto err;
461
		}
462 463 464 465 466 467 468

	/* stop io in case it is already in progress */
	if (dev->stream == STREAM_ON) {
		em28xx_videodbg("VIDIOC_SET_FMT: interrupting stream\n");
		rc = em28xx_stream_interrupt(dev);
		if (rc < 0)
			goto err;
469 470
	}

471 472
	em28xx_release_buffers(dev);
	dev->io = IO_NONE;
473

474 475 476 477 478 479 480
	/* set new image size */
	dev->width = f->fmt.pix.width;
	dev->height = f->fmt.pix.height;
	dev->frame_size = dev->width * dev->height * 2;
	dev->field_size = dev->frame_size >> 1;
	dev->bytesperline = dev->width * 2;
	get_scale(dev, dev->width, dev->height, &dev->hscale, &dev->vscale);
481

482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508
	/* FIXME: This is really weird! Why capture is starting with
	   this ioctl ???
	 */
	em28xx_uninit_isoc(dev);
	em28xx_set_alternate(dev);
	em28xx_capture_start(dev, 1);
	em28xx_resolution_set(dev);
	em28xx_init_isoc(dev);
	rc = 0;

err:
	mutex_unlock(&dev->lock);
	return rc;
}

static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id *norm)
{
	struct em28xx_fh   *fh  = priv;
	struct em28xx      *dev = fh->dev;
	struct v4l2_format f;
	int                rc;

	rc = check_dev(dev);
	if (rc < 0)
		return rc;

	mutex_lock(&dev->lock);
509
	dev->norm = *norm;
510
	mutex_unlock(&dev->lock);
511

512 513 514 515
	/* Adjusts width/height, if needed */
	f.fmt.pix.width = dev->width;
	f.fmt.pix.height = dev->height;
	vidioc_try_fmt_cap(file, priv, &f);
516

517
	mutex_lock(&dev->lock);
518

519 520 521 522 523 524 525
	/* set new image size */
	dev->width = f.fmt.pix.width;
	dev->height = f.fmt.pix.height;
	dev->frame_size = dev->width * dev->height * 2;
	dev->field_size = dev->frame_size >> 1;
	dev->bytesperline = dev->width * 2;
	get_scale(dev, dev->width, dev->height, &dev->hscale, &dev->vscale);
526

527
	em28xx_resolution_set(dev);
528
	em28xx_i2c_call_clients(dev, VIDIOC_S_STD, &dev->norm);
529

530 531 532
	mutex_unlock(&dev->lock);
	return 0;
}
533

534 535 536 537 538 539 540 541 542 543 544
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",
};
545

546 547 548 549 550 551
static int vidioc_enum_input(struct file *file, void *priv,
				struct v4l2_input *i)
{
	struct em28xx_fh   *fh  = priv;
	struct em28xx      *dev = fh->dev;
	unsigned int       n;
552

553 554 555 556 557
	n = i->index;
	if (n >= MAX_EM28XX_INPUT)
		return -EINVAL;
	if (0 == INPUT(n)->type)
		return -EINVAL;
558

559 560
	i->index = n;
	i->type = V4L2_INPUT_TYPE_CAMERA;
561

562
	strcpy(i->name, iname[INPUT(n)->type]);
563

564 565 566 567
	if ((EM28XX_VMUX_TELEVISION == INPUT(n)->type) ||
		(EM28XX_VMUX_CABLE == INPUT(n)->type))
		i->type = V4L2_INPUT_TYPE_TUNER;

568
	i->std = dev->vdev->tvnorms;
569 570

	return 0;
571 572
}

573
static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
574
{
575 576
	struct em28xx_fh   *fh  = priv;
	struct em28xx      *dev = fh->dev;
577

578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596
	*i = dev->ctl_input;

	return 0;
}

static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
{
	struct em28xx_fh   *fh  = priv;
	struct em28xx      *dev = fh->dev;
	int                rc;

	rc = check_dev(dev);
	if (rc < 0)
		return rc;

	if (i >= MAX_EM28XX_INPUT)
		return -EINVAL;
	if (0 == INPUT(i)->type)
		return -EINVAL;
597

598
	mutex_lock(&dev->lock);
599

600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618
	video_mux(dev, i);

	mutex_unlock(&dev->lock);
	return 0;
}

static int vidioc_g_audio(struct file *file, void *priv, struct v4l2_audio *a)
{
	struct em28xx_fh   *fh    = priv;
	struct em28xx      *dev   = fh->dev;
	unsigned int        index = a->index;

	if (a->index > 1)
		return -EINVAL;

	index = dev->ctl_ainput;

	if (index == 0) {
		strcpy(a->name, "Television");
619
	} else {
620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660
		strcpy(a->name, "Line In");
	}
	a->capability = V4L2_AUDCAP_STEREO;
	a->index = index;

	return 0;
}

static int vidioc_s_audio(struct file *file, void *priv, struct v4l2_audio *a)
{
	struct em28xx_fh   *fh  = priv;
	struct em28xx      *dev = fh->dev;

	if (a->index != dev->ctl_ainput)
		return -EINVAL;

	return 0;
}

static int vidioc_queryctrl(struct file *file, void *priv,
				struct v4l2_queryctrl *qc)
{
	struct em28xx_fh      *fh  = priv;
	struct em28xx         *dev = fh->dev;
	int                   id  = qc->id;
	int                   i;
	int                   rc;

	rc = check_dev(dev);
	if (rc < 0)
		return rc;

	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));
				return 0;
661 662
			}
		}
663 664 665 666
	}
	mutex_lock(&dev->lock);
	em28xx_i2c_call_clients(dev, VIDIOC_QUERYCTRL, qc);
	mutex_unlock(&dev->lock);
667

668 669 670 671 672
	if (qc->type)
		return 0;
	else
		return -EINVAL;
}
673

674 675 676 677 678 679
static int vidioc_g_ctrl(struct file *file, void *priv,
				struct v4l2_control *ctrl)
{
	struct em28xx_fh      *fh  = priv;
	struct em28xx         *dev = fh->dev;
	int                   rc;
680

681 682 683 684
	rc = check_dev(dev);
	if (rc < 0)
		return rc;
	mutex_lock(&dev->lock);
685

686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728
	if (!dev->has_msp34xx)
		rc = em28xx_get_ctrl(dev, ctrl);
	else
		rc = -EINVAL;

	if (rc == -EINVAL) {
		em28xx_i2c_call_clients(dev, VIDIOC_G_CTRL, ctrl);
		rc = 0;
	}

	mutex_unlock(&dev->lock);
	return rc;
}

static int vidioc_s_ctrl(struct file *file, void *priv,
				struct v4l2_control *ctrl)
{
	struct em28xx_fh      *fh  = priv;
	struct em28xx         *dev = fh->dev;
	u8                    i;
	int                   rc;

	rc = check_dev(dev);
	if (rc < 0)
		return rc;

	mutex_lock(&dev->lock);

	if (dev->has_msp34xx)
		em28xx_i2c_call_clients(dev, VIDIOC_S_CTRL, ctrl);
	else {
		rc = 1;
		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) {
					rc = -ERANGE;
					break;
				}

				rc = em28xx_set_ctrl(dev, ctrl);
				break;
			}
729 730 731
		}
	}

732 733 734 735 736 737
	/* Control not found - try to send it to the attached devices */
	if (rc == 1) {
		em28xx_i2c_call_clients(dev, VIDIOC_S_CTRL, ctrl);
		rc = 0;
	}

738
	mutex_unlock(&dev->lock);
739
	return rc;
740 741
}

742 743
static int vidioc_g_tuner(struct file *file, void *priv,
				struct v4l2_tuner *t)
744
{
745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763
	struct em28xx_fh      *fh  = priv;
	struct em28xx         *dev = fh->dev;
	int                   rc;

	rc = check_dev(dev);
	if (rc < 0)
		return rc;

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

	strcpy(t->name, "Tuner");

	mutex_lock(&dev->lock);

	em28xx_i2c_call_clients(dev, VIDIOC_G_TUNER, t);

	mutex_unlock(&dev->lock);
	return 0;
764 765
}

766 767
static int vidioc_s_tuner(struct file *file, void *priv,
				struct v4l2_tuner *t)
768
{
769 770 771
	struct em28xx_fh      *fh  = priv;
	struct em28xx         *dev = fh->dev;
	int                   rc;
772

773 774 775 776 777 778 779 780 781 782 783 784 785
	rc = check_dev(dev);
	if (rc < 0)
		return rc;

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

	mutex_lock(&dev->lock);

	em28xx_i2c_call_clients(dev, VIDIOC_S_TUNER, t);

	mutex_unlock(&dev->lock);
	return 0;
786 787
}

788 789 790 791 792
static int vidioc_g_frequency(struct file *file, void *priv,
				struct v4l2_frequency *f)
{
	struct em28xx_fh      *fh  = priv;
	struct em28xx         *dev = fh->dev;
793

794 795 796 797 798 799 800 801
	f->type = V4L2_TUNER_ANALOG_TV;
	f->frequency = dev->ctl_freq;

	return 0;
}

static int vidioc_s_frequency(struct file *file, void *priv,
				struct v4l2_frequency *f)
802
{
803 804 805
	struct em28xx_fh      *fh  = priv;
	struct em28xx         *dev = fh->dev;
	int                   rc;
806

807 808 809 810 811 812 813 814 815
	rc = check_dev(dev);
	if (rc < 0)
		return rc;

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

	if (V4L2_TUNER_ANALOG_TV != f->type)
		return -EINVAL;
816 817

	mutex_lock(&dev->lock);
818

819 820
	dev->ctl_freq = f->frequency;
	em28xx_i2c_call_clients(dev, VIDIOC_S_FREQUENCY, f);
821

822 823 824
	mutex_unlock(&dev->lock);
	return 0;
}
825

826 827 828 829 830 831 832
static int vidioc_cropcap(struct file *file, void *priv,
					struct v4l2_cropcap *cc)
{
	struct em28xx_fh      *fh  = priv;
	struct em28xx         *dev = fh->dev;

	if (cc->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
833 834
		return -EINVAL;

835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857
	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;
}

static int vidioc_streamon(struct file *file, void *priv,
					enum v4l2_buf_type type)
{
	struct em28xx_fh      *fh  = priv;
	struct em28xx         *dev = fh->dev;
	int                   rc;

	rc = check_dev(dev);
	if (rc < 0)
		return rc;

	if (type != V4L2_BUF_TYPE_VIDEO_CAPTURE || dev->io != IO_MMAP)
858
		return -EINVAL;
859 860 861 862 863 864 865 866 867

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

	mutex_lock(&dev->lock);

	if (unlikely(res_get(fh) < 0)) {
		mutex_unlock(&dev->lock);
		return -EBUSY;
868 869
	}

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

872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895
	mutex_unlock(&dev->lock);
	return 0;
}

static int vidioc_streamoff(struct file *file, void *priv,
					enum v4l2_buf_type type)
{
	struct em28xx_fh      *fh  = priv;
	struct em28xx         *dev = fh->dev;
	int                   rc;

	rc = check_dev(dev);
	if (rc < 0)
		return rc;

	if (type != V4L2_BUF_TYPE_VIDEO_CAPTURE || dev->io != IO_MMAP)
		return -EINVAL;

	mutex_lock(&dev->lock);

	if (dev->stream == STREAM_ON) {
		em28xx_videodbg("VIDIOC_STREAMOFF: interrupting stream\n");
		rc = em28xx_stream_interrupt(dev);
		if (rc < 0) {
896
			mutex_unlock(&dev->lock);
897
			return rc;
898 899 900
		}
	}

901
	em28xx_empty_framequeues(dev);
902

903
	mutex_unlock(&dev->lock);
904 905 906
	return 0;
}

907 908
static int vidioc_querycap(struct file *file, void  *priv,
					struct v4l2_capability *cap)
909
{
910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928
	struct em28xx_fh      *fh  = priv;
	struct em28xx         *dev = fh->dev;

	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;
929 930
}

931 932
static int vidioc_enum_fmt_cap(struct file *file, void  *priv,
					struct v4l2_fmtdesc *fmtd)
933
{
934
	if (fmtd->index != 0)
935
		return -EINVAL;
936 937 938 939 940 941 942

	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;
943 944
}

945 946 947
/* Sliced VBI ioctls */
static int vidioc_g_fmt_vbi_capture(struct file *file, void *priv,
					struct v4l2_format *f)
948
{
949 950 951
	struct em28xx_fh      *fh  = priv;
	struct em28xx         *dev = fh->dev;
	int                   rc;
952

953 954 955
	rc = check_dev(dev);
	if (rc < 0)
		return rc;
956

957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986
	mutex_lock(&dev->lock);

	f->fmt.sliced.service_set = 0;

	em28xx_i2c_call_clients(dev, VIDIOC_G_FMT, f);

	if (f->fmt.sliced.service_set == 0)
		rc = -EINVAL;

	mutex_unlock(&dev->lock);
	return rc;
}

static int vidioc_try_set_vbi_capture(struct file *file, void *priv,
			struct v4l2_format *f)
{
	struct em28xx_fh      *fh  = priv;
	struct em28xx         *dev = fh->dev;
	int                   rc;

	rc = check_dev(dev);
	if (rc < 0)
		return rc;

	mutex_lock(&dev->lock);
	em28xx_i2c_call_clients(dev, VIDIOC_G_FMT, f);
	mutex_unlock(&dev->lock);

	if (f->fmt.sliced.service_set == 0)
		return -EINVAL;
987 988 989 990

	return 0;
}

991 992 993

static int vidioc_reqbufs(struct file *file, void *priv,
			  struct v4l2_requestbuffers *rb)
994
{
995 996 997 998
	struct em28xx_fh      *fh  = priv;
	struct em28xx         *dev = fh->dev;
	u32                   i;
	int                   rc;
999

1000 1001 1002
	rc = check_dev(dev);
	if (rc < 0)
		return rc;
1003

1004 1005 1006
	if (rb->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
		rb->memory != V4L2_MEMORY_MMAP)
		return -EINVAL;
1007

1008 1009 1010 1011 1012 1013
	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;
	}
1014

1015 1016 1017 1018 1019 1020
	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;
		}
1021

1022
	mutex_lock(&dev->lock);
1023

1024 1025 1026 1027 1028 1029 1030 1031
	if (dev->stream == STREAM_ON) {
		em28xx_videodbg("VIDIOC_REQBUFS: interrupting stream\n");
		rc = em28xx_stream_interrupt(dev);
		if (rc < 0) {
			mutex_unlock(&dev->lock);
			return rc;
		}
	}
1032

1033 1034 1035 1036 1037 1038 1039 1040
	em28xx_empty_framequeues(dev);

	em28xx_release_buffers(dev);
	if (rb->count)
		rb->count = em28xx_request_buffers(dev, rb->count);

	dev->frame_current = NULL;
	dev->io = rb->count ? IO_MMAP : IO_NONE;
1041

1042
	mutex_unlock(&dev->lock);
1043 1044 1045
	return 0;
}

1046 1047
static int vidioc_querybuf(struct file *file, void *priv,
			   struct v4l2_buffer *b)
1048
{
1049 1050 1051
	struct em28xx_fh      *fh  = priv;
	struct em28xx         *dev = fh->dev;
	int                   rc;
1052

1053 1054 1055
	rc = check_dev(dev);
	if (rc < 0)
		return rc;
1056

1057 1058 1059
	if (b->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
		b->index >= dev->num_frames || dev->io != IO_MMAP)
		return -EINVAL;
1060

1061
	mutex_lock(&dev->lock);
1062

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

1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089
	if (dev->frame[b->index].vma_use_count)
		b->flags |= V4L2_BUF_FLAG_MAPPED;

	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;

	mutex_unlock(&dev->lock);
	return 0;
}

static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *b)
{
	struct em28xx_fh      *fh  = priv;
	struct em28xx         *dev = fh->dev;
	unsigned long         lock_flags;
	int                   rc;

	rc = check_dev(dev);
	if (rc < 0)
		return rc;

	if (b->type != V4L2_BUF_TYPE_VIDEO_CAPTURE  || dev->io != IO_MMAP ||
						b->index >= dev->num_frames)
1090
		return -EINVAL;
1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102

	if (dev->frame[b->index].state != F_UNUSED)
		return -EAGAIN;

	dev->frame[b->index].state = F_QUEUED;

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

	return 0;
1103 1104
}

1105
static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b)
1106
{
1107 1108 1109 1110 1111 1112 1113 1114 1115
	struct em28xx_fh      *fh  = priv;
	struct em28xx         *dev = fh->dev;
	int                   rc;
	struct em28xx_frame_t *f;
	unsigned long         lock_flags;

	rc = check_dev(dev);
	if (rc < 0)
		return rc;
1116

1117 1118
	if (b->type != V4L2_BUF_TYPE_VIDEO_CAPTURE || dev->io != IO_MMAP)
		return -EINVAL;
1119

1120 1121 1122
	if (list_empty(&dev->outqueue)) {
		if (dev->stream == STREAM_OFF)
			return -EINVAL;
1123

1124 1125
		if (file->f_flags & O_NONBLOCK)
			return -EAGAIN;
1126

1127 1128 1129 1130 1131
		rc = wait_event_interruptible(dev->wait_frame,
					(!list_empty(&dev->outqueue)) ||
					(dev->state & DEV_DISCONNECTED));
		if (rc)
			return rc;
1132

1133 1134
		if (dev->state & DEV_DISCONNECTED)
			return -ENODEV;
1135 1136
	}

1137 1138 1139 1140
	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);
1141

1142 1143
	f->state = F_UNUSED;
	memcpy(b, &f->buf, sizeof(*b));
1144

1145 1146
	if (f->vma_use_count)
		b->flags |= V4L2_BUF_FLAG_MAPPED;
1147

1148 1149
	return 0;
}
1150

1151 1152 1153 1154 1155 1156 1157 1158 1159 1160
/*
 * em28xx_v4l2_open()
 * inits the device and starts isoc transfer
 */
static int em28xx_v4l2_open(struct inode *inode, struct file *filp)
{
	int minor = iminor(inode);
	int errCode = 0;
	struct em28xx *h,*dev = NULL;
	struct em28xx_fh *fh;
1161

1162 1163 1164 1165 1166 1167 1168 1169 1170
	list_for_each_entry(h, &em28xx_devlist, devlist) {
		if (h->vdev->minor == minor) {
			dev  = h;
			dev->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
		}
		if (h->vbi_dev->minor == minor) {
			dev  = h;
			dev->type = V4L2_BUF_TYPE_VBI_CAPTURE;
		}
1171
	}
1172 1173
	if (NULL == dev)
		return -ENODEV;
1174

1175 1176
	em28xx_videodbg("open minor=%d type=%s users=%d\n",
				minor,v4l2_type_names[dev->type],dev->users);
1177

1178
	fh = kzalloc(sizeof(struct em28xx_fh), GFP_KERNEL);
1179

1180 1181 1182 1183 1184 1185 1186
	if (!fh) {
		em28xx_errdev("em28xx-video.c: Out of memory?!\n");
		return -ENOMEM;
	}
	mutex_lock(&dev->lock);
	fh->dev = dev;
	filp->private_data = fh;
1187

1188 1189
	if (dev->type == V4L2_BUF_TYPE_VIDEO_CAPTURE && dev->users == 0) {
		em28xx_set_alternate(dev);
1190

1191 1192 1193 1194 1195 1196 1197
		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;
1198

1199 1200
		em28xx_capture_start(dev, 1);
		em28xx_resolution_set(dev);
1201 1202


1203 1204 1205 1206
		/* start the transfer */
		errCode = em28xx_init_isoc(dev);
		if (errCode)
			goto err;
1207

1208
		em28xx_empty_framequeues(dev);
1209 1210
	}

1211
	dev->users++;
1212

1213 1214 1215
err:
	mutex_unlock(&dev->lock);
	return errCode;
1216
}
1217

1218
/*
1219 1220 1221 1222 1223
 * em28xx_realease_resources()
 * unregisters the v4l2,i2c and usb devices
 * called when the device gets disconected or at module unload
*/
static void em28xx_release_resources(struct em28xx *dev)
1224 1225
{

1226
	/*FIXME: I2C IR should be disconnected */
1227

1228 1229 1230 1231 1232 1233 1234 1235
	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);
	list_del(&dev->devlist);
	video_unregister_device(dev->vdev);
	video_unregister_device(dev->vbi_dev);
	em28xx_i2c_unregister(dev);
	usb_put_dev(dev->udev);
1236 1237


1238 1239 1240
	/* Mark device as unused */
	em28xx_devused&=~(1<<dev->devno);
}
1241

1242 1243 1244 1245 1246 1247 1248 1249 1250
/*
 * em28xx_v4l2_close()
 * stops streaming and deallocates all resources allocated by the v4l2 calls and ioctls
 */
static int em28xx_v4l2_close(struct inode *inode, struct file *filp)
{
	struct em28xx_fh *fh  = filp->private_data;
	struct em28xx    *dev = fh->dev;
	int              errCode;
1251

1252
	em28xx_videodbg("users=%d\n", dev->users);
1253 1254


1255 1256
	if (res_check(fh))
		res_free(fh);
1257

1258
	mutex_lock(&dev->lock);
1259

1260 1261 1262 1263
	if (dev->users == 1) {
		em28xx_uninit_isoc(dev);
		em28xx_release_buffers(dev);
		dev->io = IO_NONE;
1264

1265 1266 1267 1268 1269 1270 1271 1272
		/* the device is already disconnect,
		   free the remaining resources */
		if (dev->state & DEV_DISCONNECTED) {
			em28xx_release_resources(dev);
			mutex_unlock(&dev->lock);
			kfree(dev);
			return 0;
		}
1273

1274 1275 1276 1277 1278 1279 1280 1281
		/* set alternate 0 */
		dev->alt = 0;
		em28xx_videodbg("setting alternate 0\n");
		errCode = usb_set_interface(dev->udev, 0, 0);
		if (errCode < 0) {
			em28xx_errdev("cannot change alternate number to "
					"0 (error=%i)\n", errCode);
		}
1282
	}
1283 1284 1285 1286 1287 1288
	kfree(fh);
	dev->users--;
	wake_up_interruptible_nr(&dev->open, 1);
	mutex_unlock(&dev->lock);
	return 0;
}
1289

1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302
/*
 * em28xx_v4l2_read()
 * will allocate buffers when called for the first time
 */
static ssize_t
em28xx_v4l2_read(struct file *filp, char __user * buf, size_t count,
		 loff_t * f_pos)
{
	struct em28xx_frame_t *f, *i;
	unsigned long lock_flags;
	int ret = 0;
	struct em28xx_fh *fh = filp->private_data;
	struct em28xx *dev = fh->dev;
1303

1304 1305 1306
	/* FIXME: read() is not prepared to allow changing the video
	   resolution while streaming. Seems a bug at em28xx_set_fmt
	 */
1307

1308 1309
	if (unlikely(res_get(fh) < 0))
		return -EBUSY;
1310

1311
	mutex_lock(&dev->lock);
1312

1313 1314 1315 1316 1317 1318 1319 1320 1321
	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)) {
			mutex_unlock(&dev->lock);
			return -EFAULT;
1322
		}
1323
		mutex_unlock(&dev->lock);
1324
		return (1);
1325
	}
1326 1327 1328 1329
	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)) {
1330
			mutex_unlock(&dev->lock);
1331
			return -EFAULT;
1332
		}
1333
		mutex_unlock(&dev->lock);
1334
		return (1);
1335
	}
1336

1337 1338 1339 1340 1341
	if (dev->state & DEV_DISCONNECTED) {
		em28xx_videodbg("device not present\n");
		mutex_unlock(&dev->lock);
		return -ENODEV;
	}
1342

1343 1344
	if (dev->state & DEV_MISCONFIGURED) {
		em28xx_videodbg("device misconfigured; close and open it again\n");
1345
		mutex_unlock(&dev->lock);
1346
		return -EIO;
1347
	}
1348

1349 1350 1351
	if (dev->io == IO_MMAP) {
		em28xx_videodbg ("IO method is set to mmap; close and open"
				" the device again to choose the read method\n");
1352
		mutex_unlock(&dev->lock);
1353
		return -EINVAL;
1354
	}
1355

1356 1357 1358 1359 1360 1361 1362 1363 1364
	if (dev->io == IO_NONE) {
		if (!em28xx_request_buffers(dev, EM28XX_NUM_READ_FRAMES)) {
			em28xx_errdev("read failed, not enough memory\n");
			mutex_unlock(&dev->lock);
			return -ENOMEM;
		}
		dev->io = IO_READ;
		dev->stream = STREAM_ON;
		em28xx_queue_unusedframes(dev);
1365
	}
1366

1367
	if (!count) {
1368
		mutex_unlock(&dev->lock);
1369 1370
		return 0;
	}
1371

1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389
	if (list_empty(&dev->outqueue)) {
		if (filp->f_flags & O_NONBLOCK) {
			mutex_unlock(&dev->lock);
			return -EAGAIN;
		}
		ret = wait_event_interruptible
		    (dev->wait_frame,
		     (!list_empty(&dev->outqueue)) ||
		     (dev->state & DEV_DISCONNECTED));
		if (ret) {
			mutex_unlock(&dev->lock);
			return ret;
		}
		if (dev->state & DEV_DISCONNECTED) {
			mutex_unlock(&dev->lock);
			return -ENODEV;
		}
		dev->video_bytesread = 0;
1390
	}
1391

1392
	f = list_entry(dev->outqueue.prev, struct em28xx_frame_t, frame);
1393

1394
	em28xx_queue_unusedframes(dev);
1395

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

1399 1400
	if ((dev->video_bytesread + count) > dev->frame_size)
		count = dev->frame_size - dev->video_bytesread;
1401

1402 1403 1404
	if (copy_to_user(buf, f->bufmem+dev->video_bytesread, count)) {
		em28xx_err("Error while copying to user\n");
		return -EFAULT;
1405
	}
1406
	dev->video_bytesread += count;
1407

1408 1409 1410 1411 1412 1413
	if (dev->video_bytesread == dev->frame_size) {
		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);
1414

1415 1416 1417
		em28xx_queue_unusedframes(dev);
		dev->video_bytesread = 0;
	}
1418

1419
	*f_pos += count;
1420

1421 1422 1423
	mutex_unlock(&dev->lock);

	return count;
1424 1425 1426
}

/*
1427 1428
 * em28xx_v4l2_poll()
 * will allocate buffers when called for the first time
1429
 */
1430
static unsigned int em28xx_v4l2_poll(struct file *filp, poll_table * wait)
1431
{
1432
	unsigned int mask = 0;
1433
	struct em28xx_fh *fh = filp->private_data;
1434
	struct em28xx *dev = fh->dev;
1435

1436 1437
	if (unlikely(res_get(fh) < 0))
		return POLLERR;
1438

1439
	mutex_lock(&dev->lock);
1440

1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455
	if (dev->state & DEV_DISCONNECTED) {
		em28xx_videodbg("device not present\n");
	} else if (dev->state & DEV_MISCONFIGURED) {
		em28xx_videodbg("device is misconfigured; close and open it again\n");
	} else {
		if (dev->io == IO_NONE) {
			if (!em28xx_request_buffers
			    (dev, EM28XX_NUM_READ_FRAMES)) {
				em28xx_warn
				    ("poll() failed, not enough memory\n");
			} else {
				dev->io = IO_READ;
				dev->stream = STREAM_ON;
			}
		}
1456

1457 1458 1459
		if (dev->io == IO_READ) {
			em28xx_queue_unusedframes(dev);
			poll_wait(filp, &dev->wait_frame, wait);
1460

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

1464
			mutex_unlock(&dev->lock);
1465

1466
			return mask;
1467
		}
1468
	}
1469

1470 1471 1472
	mutex_unlock(&dev->lock);
	return POLLERR;
}
1473

1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484
/*
 * em28xx_v4l2_mmap()
 */
static int em28xx_v4l2_mmap(struct file *filp, struct vm_area_struct *vma)
{
	struct em28xx_fh *fh    = filp->private_data;
	struct em28xx	 *dev   = fh->dev;
	unsigned long	 size   = vma->vm_end - vma->vm_start;
	unsigned long	 start  = vma->vm_start;
	void 		 *pos;
	u32		 i;
1485

1486 1487
	if (unlikely(res_get(fh) < 0))
		return -EBUSY;
1488

1489
	mutex_lock(&dev->lock);
1490

1491 1492
	if (dev->state & DEV_DISCONNECTED) {
		em28xx_videodbg("mmap: device not present\n");
1493
		mutex_unlock(&dev->lock);
1494
		return -ENODEV;
1495
	}
1496

1497 1498 1499 1500 1501
	if (dev->state & DEV_MISCONFIGURED) {
		em28xx_videodbg ("mmap: Device is misconfigured; close and "
						"open it again\n");
		mutex_unlock(&dev->lock);
		return -EIO;
1502
	}
1503

1504 1505 1506
	if (dev->io != IO_MMAP || !(vma->vm_flags & VM_WRITE)) {
		mutex_unlock(&dev->lock);
		return -EINVAL;
1507
	}
1508

1509 1510
	if (size > PAGE_ALIGN(dev->frame[0].buf.length))
		size = PAGE_ALIGN(dev->frame[0].buf.length);
1511

1512 1513 1514
	for (i = 0; i < dev->num_frames; i++) {
		if ((dev->frame[i].buf.m.offset >> PAGE_SHIFT) == vma->vm_pgoff)
			break;
1515
	}
1516 1517 1518 1519
	if (i == dev->num_frames) {
		em28xx_videodbg("mmap: user supplied mapping address is out of range\n");
		mutex_unlock(&dev->lock);
		return -EINVAL;
1520 1521
	}

1522 1523 1524
	/* 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 */
1525

1526 1527 1528 1529 1530 1531 1532 1533 1534 1535
	pos = dev->frame[i].bufmem;
	while (size > 0) {	/* size is page-aligned */
		if (vm_insert_page(vma, start, vmalloc_to_page(pos))) {
			em28xx_videodbg("mmap: vm_insert_page failed\n");
			mutex_unlock(&dev->lock);
			return -EAGAIN;
		}
		start += PAGE_SIZE;
		pos += PAGE_SIZE;
		size -= PAGE_SIZE;
1536 1537
	}

1538 1539
	vma->vm_ops = &em28xx_vm_ops;
	vma->vm_private_data = &dev->frame[i];
1540

1541 1542 1543
	em28xx_vm_open(vma);
	mutex_unlock(&dev->lock);
	return 0;
1544 1545
}

1546
static const struct file_operations em28xx_v4l_fops = {
1547 1548 1549 1550 1551 1552 1553 1554 1555 1556
	.owner         = THIS_MODULE,
	.open          = em28xx_v4l2_open,
	.release       = em28xx_v4l2_close,
	.read          = em28xx_v4l2_read,
	.poll          = em28xx_v4l2_poll,
	.mmap          = em28xx_v4l2_mmap,
	.ioctl	       = video_ioctl2,
	.llseek        = no_llseek,
	.compat_ioctl  = v4l_compat_ioctl32,
};
1557

1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594
static const struct video_device em28xx_video_template = {
	.fops                       = &em28xx_v4l_fops,
	.release                    = video_device_release,

	.minor                      = -1,
	.vidioc_querycap            = vidioc_querycap,
	.vidioc_enum_fmt_cap        = vidioc_enum_fmt_cap,
	.vidioc_g_fmt_cap           = vidioc_g_fmt_cap,
	.vidioc_try_fmt_cap         = vidioc_try_fmt_cap,
	.vidioc_s_fmt_cap           = vidioc_s_fmt_cap,
	.vidioc_g_audio             = vidioc_g_audio,
	.vidioc_s_audio             = vidioc_s_audio,
	.vidioc_cropcap             = vidioc_cropcap,

	.vidioc_g_fmt_vbi_capture   = vidioc_g_fmt_vbi_capture,
	.vidioc_try_fmt_vbi_capture = vidioc_try_set_vbi_capture,
	.vidioc_s_fmt_vbi_capture   = vidioc_try_set_vbi_capture,

	.vidioc_reqbufs             = vidioc_reqbufs,
	.vidioc_querybuf            = vidioc_querybuf,
	.vidioc_qbuf                = vidioc_qbuf,
	.vidioc_dqbuf               = vidioc_dqbuf,
	.vidioc_s_std               = vidioc_s_std,
	.vidioc_enum_input          = vidioc_enum_input,
	.vidioc_g_input             = vidioc_g_input,
	.vidioc_s_input             = vidioc_s_input,
	.vidioc_queryctrl           = vidioc_queryctrl,
	.vidioc_g_ctrl              = vidioc_g_ctrl,
	.vidioc_s_ctrl              = vidioc_s_ctrl,
	.vidioc_streamon            = vidioc_streamon,
	.vidioc_streamoff           = vidioc_streamoff,
	.vidioc_g_tuner             = vidioc_g_tuner,
	.vidioc_s_tuner             = vidioc_s_tuner,
	.vidioc_g_frequency         = vidioc_g_frequency,
	.vidioc_s_frequency         = vidioc_s_frequency,

	.tvnorms                    = V4L2_STD_ALL,
1595
	.current_norm               = V4L2_STD_PAL,
1596 1597 1598 1599
};

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

1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639

static LIST_HEAD(em28xx_extension_devlist);
static DEFINE_MUTEX(em28xx_extension_devlist_lock);

int em28xx_register_extension(struct em28xx_ops *ops)
{
	struct em28xx *h, *dev = NULL;

	list_for_each_entry(h, &em28xx_devlist, devlist)
		dev = h;

	mutex_lock(&em28xx_extension_devlist_lock);
	list_add_tail(&ops->next, &em28xx_extension_devlist);
	if (dev)
		ops->init(dev);

	printk(KERN_INFO "Em28xx: Initialized (%s) extension\n", ops->name);
	mutex_unlock(&em28xx_extension_devlist_lock);

	return 0;
}
EXPORT_SYMBOL(em28xx_register_extension);

void em28xx_unregister_extension(struct em28xx_ops *ops)
{
	struct em28xx *h, *dev = NULL;

	list_for_each_entry(h, &em28xx_devlist, devlist)
		dev = h;

	if (dev)
		ops->fini(dev);

	mutex_lock(&em28xx_extension_devlist_lock);
	printk(KERN_INFO "Em28xx: Removed (%s) extension\n", ops->name);
	list_del(&ops->next);
	mutex_unlock(&em28xx_extension_devlist_lock);
}
EXPORT_SYMBOL(em28xx_unregister_extension);

1640
/*
1641
 * em28xx_init_dev()
1642 1643
 * allocates and inits the device structs, registers i2c bus and v4l device
 */
1644
static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev,
1645
			   int minor)
1646
{
1647
	struct em28xx_ops *ops = NULL;
1648
	struct em28xx *dev = *devhandle;
1649
	int retval = -ENOMEM;
1650
	int errCode;
1651 1652 1653
	unsigned int maxh, maxw;

	dev->udev = udev;
1654
	mutex_init(&dev->lock);
1655
	spin_lock_init(&dev->queue_lock);
1656
	init_waitqueue_head(&dev->open);
1657 1658
	init_waitqueue_head(&dev->wait_frame);
	init_waitqueue_head(&dev->wait_stream);
1659

1660 1661 1662 1663 1664
	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;
1665
	dev->is_em2800 = em28xx_boards[dev->model].is_em2800;
1666

1667 1668 1669 1670
	errCode = em28xx_read_reg(dev, CHIPID_REG);
	if (errCode >= 0)
		em28xx_info("em28xx chip ID = %d\n", errCode);

1671
	em28xx_pre_card_setup(dev);
1672

1673
	errCode = em28xx_config(dev);
1674
	if (errCode) {
1675
		em28xx_errdev("error configuring device\n");
1676
		em28xx_devused &= ~(1<<dev->devno);
1677
		kfree(dev);
1678 1679 1680 1681
		return -ENOMEM;
	}

	/* register i2c bus */
1682
	em28xx_i2c_register(dev);
1683 1684

	/* Do board specific init and eeprom reading */
1685
	em28xx_card_setup(dev);
1686

1687 1688 1689
	/* Configure audio */
	em28xx_audio_analog_set(dev);

1690
	/* configure the device */
1691
	em28xx_config_i2c(dev);
1692

1693 1694
	/* set default norm */
	dev->norm = em28xx_video_template.current_norm;
1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710

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

	/* set default image size */
	dev->width = maxw;
	dev->height = maxh;
	dev->interlaced = EM28XX_INTERLACED_DEFAULT;
	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;

1711
	errCode = em28xx_config(dev);
1712

1713
	/* allocate and fill video video_device struct */
1714 1715
	dev->vdev = video_device_alloc();
	if (NULL == dev->vdev) {
1716
		em28xx_errdev("cannot allocate video_device.\n");
1717
		em28xx_devused&=~(1<<dev->devno);
1718
		kfree(dev);
1719 1720
		return -ENOMEM;
	}
1721 1722 1723 1724 1725 1726 1727 1728
	memcpy(dev->vdev, &em28xx_video_template,
					sizeof(em28xx_video_template));
	dev->vdev->type = VID_TYPE_CAPTURE;
	if (dev->has_tuner)
		dev->vdev->type |= VID_TYPE_TUNER;
	dev->vdev->dev = &dev->udev->dev;
	snprintf(dev->vdev->name, sizeof(dev->vbi_dev->name),
		 "%s#%d %s", "em28xx", dev->devno, "video");
1729

1730
	/* Allocate and fill vbi video_device struct */
1731 1732 1733 1734 1735
	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);
1736
		kfree(dev);
1737 1738
		return -ENOMEM;
	}
1739 1740
	memcpy(dev->vbi_dev, &em28xx_video_template,
					sizeof(em28xx_video_template));
1741 1742
	dev->vbi_dev->type = VFL_TYPE_VBI;
	dev->vbi_dev->dev = &dev->udev->dev;
1743 1744
	snprintf(dev->vbi_dev->name, sizeof(dev->vbi_dev->name),
				"%s#%d %s", "em28xx", dev->devno, "vbi");
1745

1746
	list_add_tail(&dev->devlist,&em28xx_devlist);
1747

1748 1749 1750 1751 1752 1753 1754
	if (dev->has_msp34xx) {
		/* Send a reset to other chips via gpio */
		em28xx_write_regs_req(dev, 0x00, 0x08, "\xf7", 1);
		msleep(3);
		em28xx_write_regs_req(dev, 0x00, 0x08, "\xff", 1);
		msleep(3);
	}
1755

1756 1757
	video_mux(dev, 0);

1758
	/* register v4l2 video video_device */
1759 1760
	if ((retval = video_register_device(dev->vdev, VFL_TYPE_GRABBER,
					 video_nr[dev->devno]))) {
1761
		em28xx_errdev("unable to register video device (error=%i).\n",
1762
			      retval);
1763
		mutex_unlock(&dev->lock);
1764
		list_del(&dev->devlist);
1765
		video_device_release(dev->vdev);
1766
		em28xx_devused&=~(1<<dev->devno);
1767
		kfree(dev);
1768 1769
		return -ENODEV;
	}
1770

1771
	/* register v4l2 vbi video_device */
1772 1773 1774
	if (video_register_device(dev->vbi_dev, VFL_TYPE_VBI,
					vbi_nr[dev->devno]) < 0) {
		printk("unable to register vbi device\n");
1775
		mutex_unlock(&dev->lock);
1776 1777 1778 1779
		list_del(&dev->devlist);
		video_device_release(dev->vbi_dev);
		video_device_release(dev->vdev);
		em28xx_devused&=~(1<<dev->devno);
1780
		kfree(dev);
1781 1782 1783 1784 1785 1786
		return -ENODEV;
	}

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

1788 1789 1790 1791 1792 1793 1794 1795 1796
	mutex_lock(&em28xx_extension_devlist_lock);
	if (!list_empty(&em28xx_extension_devlist)) {
		list_for_each_entry(ops, &em28xx_extension_devlist, next) {
			if (ops->id)
				ops->init(dev);
		}
	}
	mutex_unlock(&em28xx_extension_devlist_lock);

1797 1798 1799
	return 0;
}

1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818
#if defined(CONFIG_MODULES) && defined(MODULE)
static void request_module_async(struct work_struct *work)
{
	struct em28xx *dev = container_of(work,
			     struct em28xx, request_module_wk);

	if (!dev->has_audio_class)
		request_module("em28xx-alsa");
}

static void request_modules(struct em28xx *dev)
{
	INIT_WORK(&dev->request_module_wk, request_module_async);
	schedule_work(&dev->request_module_wk);
}
#else
#define request_modules(dev)
#endif /* CONFIG_MODULES */

1819
/*
1820
 * em28xx_usb_probe()
1821 1822
 * checks for supported devices
 */
1823
static int em28xx_usb_probe(struct usb_interface *interface,
1824 1825 1826 1827
			    const struct usb_device_id *id)
{
	const struct usb_endpoint_descriptor *endpoint;
	struct usb_device *udev;
1828
	struct usb_interface *uif;
1829
	struct em28xx *dev = NULL;
1830
	int retval = -ENODEV;
1831
	int i, nr, ifnum;
1832 1833

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

1836 1837 1838
	/* Check to see next free device and mark as used */
	nr=find_first_zero_bit(&em28xx_devused,EM28XX_MAXBOARDS);
	em28xx_devused|=1<<nr;
1839

1840
	/* Don't register audio interfaces */
1841
	if (interface->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) {
1842
		em28xx_err(DRIVER_NAME " audio device (%04x:%04x): interface %i, class %i\n",
1843 1844 1845
				udev->descriptor.idVendor,udev->descriptor.idProduct,
				ifnum,
				interface->altsetting[0].desc.bInterfaceClass);
1846 1847

		em28xx_devused&=~(1<<nr);
1848
		return -ENODEV;
1849 1850
	}

1851
	em28xx_err(DRIVER_NAME " new video device (%04x:%04x): interface %i, class %i\n",
1852 1853 1854
			udev->descriptor.idVendor,udev->descriptor.idProduct,
			ifnum,
			interface->altsetting[0].desc.bInterfaceClass);
1855

1856 1857
	endpoint = &interface->cur_altsetting->endpoint[1].desc;

1858
	/* check if the device has the iso in endpoint at the correct place */
1859 1860
	if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) !=
	    USB_ENDPOINT_XFER_ISOC) {
1861
		em28xx_err(DRIVER_NAME " probing error: endpoint is non-ISO endpoint!\n");
1862
		em28xx_devused&=~(1<<nr);
1863 1864 1865
		return -ENODEV;
	}
	if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT) {
1866
		em28xx_err(DRIVER_NAME " probing error: endpoint is ISO OUT endpoint!\n");
1867
		em28xx_devused&=~(1<<nr);
1868 1869 1870
		return -ENODEV;
	}

1871
	if (nr >= EM28XX_MAXBOARDS) {
1872
		printk (DRIVER_NAME ": Supports only %i em28xx boards.\n",EM28XX_MAXBOARDS);
1873
		em28xx_devused&=~(1<<nr);
1874 1875 1876 1877
		return -ENOMEM;
	}

	/* allocate memory for our device state and initialize it */
P
 
Panagiotis Issaris 已提交
1878
	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
1879
	if (dev == NULL) {
1880
		em28xx_err(DRIVER_NAME ": out of memory!\n");
1881
		em28xx_devused&=~(1<<nr);
1882 1883 1884
		return -ENOMEM;
	}

1885
	snprintf(dev->name, 29, "em28xx #%d", nr);
1886 1887
	dev->devno = nr;
	dev->model = id->driver_info;
1888

1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900
	/* Checks if audio is provided by some interface */
	for (i = 0; i < udev->config->desc.bNumInterfaces; i++) {
		uif = udev->config->interface[i];
		if (uif->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) {
			dev->has_audio_class = 1;
			break;
		}
	}

	printk(KERN_INFO DRIVER_NAME " %s usb audio class\n",
		   dev->has_audio_class ? "Has" : "Doesn't have");

1901 1902 1903 1904
	/* compute alternate max packet sizes */
	uif = udev->actconfig->interface[0];

	dev->num_alt=uif->num_altsetting;
1905
	em28xx_info("Alternate settings: %i\n",dev->num_alt);
1906 1907 1908 1909
//	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) {
1910 1911
		em28xx_errdev("out of memory!\n");
		em28xx_devused&=~(1<<nr);
1912
		kfree(dev);
1913 1914 1915 1916 1917 1918 1919 1920
		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);
1921
		em28xx_info("Alternate setting %i, max size= %i\n",i,
1922 1923 1924
							dev->alt_max_pkt_size[i]);
	}

1925
	if ((card[nr]>=0)&&(card[nr]<em28xx_bcount))
1926
		dev->model = card[nr];
1927

1928
	/* allocate device struct */
1929
	retval = em28xx_init_dev(&dev, udev, nr);
1930 1931 1932
	if (retval)
		return retval;

1933
	em28xx_info("Found %s\n", em28xx_boards[dev->model].name);
1934 1935 1936

	/* save our data pointer in this interface device */
	usb_set_intfdata(interface, dev);
1937 1938 1939

	request_modules(dev);

1940 1941 1942 1943
	return 0;
}

/*
1944
 * em28xx_usb_disconnect()
1945 1946 1947
 * called when the device gets diconencted
 * video device will be unregistered on v4l2_close in case it is still open
 */
1948
static void em28xx_usb_disconnect(struct usb_interface *interface)
1949
{
1950
	struct em28xx *dev;
1951
	struct em28xx_ops *ops = NULL;
1952 1953

	dev = usb_get_intfdata(interface);
1954 1955 1956 1957 1958
	usb_set_intfdata(interface, NULL);

	if (!dev)
		return;

1959
	em28xx_info("disconnecting %s\n", dev->vdev->name);
1960

1961
	/* wait until all current v4l2 io is finished then deallocate resources */
1962
	mutex_lock(&dev->lock);
1963 1964 1965 1966

	wake_up_interruptible_all(&dev->open);

	if (dev->users) {
1967
		em28xx_warn
1968
		    ("device /dev/video%d is open! Deregistration and memory "
1969 1970 1971
		     "deallocation are deferred on close.\n",
				dev->vdev->minor-MINOR_VFL_TYPE_GRABBER_MIN);

1972
		dev->state |= DEV_MISCONFIGURED;
1973
		em28xx_uninit_isoc(dev);
1974 1975 1976 1977 1978
		dev->state |= DEV_DISCONNECTED;
		wake_up_interruptible(&dev->wait_frame);
		wake_up_interruptible(&dev->wait_stream);
	} else {
		dev->state |= DEV_DISCONNECTED;
1979
		em28xx_release_resources(dev);
1980
	}
1981
	mutex_unlock(&dev->lock);
1982

1983 1984 1985 1986 1987 1988 1989 1990
	mutex_lock(&em28xx_extension_devlist_lock);
	if (!list_empty(&em28xx_extension_devlist)) {
		list_for_each_entry(ops, &em28xx_extension_devlist, next) {
			ops->fini(dev);
		}
	}
	mutex_unlock(&em28xx_extension_devlist_lock);

1991 1992
	if (!dev->users) {
		kfree(dev->alt_max_pkt_size);
1993
		kfree(dev);
1994
	}
1995 1996
}

1997 1998 1999 2000 2001
static struct usb_driver em28xx_usb_driver = {
	.name = "em28xx",
	.probe = em28xx_usb_probe,
	.disconnect = em28xx_usb_disconnect,
	.id_table = em28xx_id_table,
2002 2003
};

2004
static int __init em28xx_module_init(void)
2005 2006 2007 2008
{
	int result;

	printk(KERN_INFO DRIVER_NAME " v4l2 driver version %d.%d.%d loaded\n",
2009 2010
	       (EM28XX_VERSION_CODE >> 16) & 0xff,
	       (EM28XX_VERSION_CODE >> 8) & 0xff, EM28XX_VERSION_CODE & 0xff);
2011 2012 2013 2014 2015 2016
#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 */
2017
	result = usb_register(&em28xx_usb_driver);
2018
	if (result)
2019
		em28xx_err(DRIVER_NAME
2020 2021 2022 2023 2024
			   " usb_register failed. Error number %d.\n", result);

	return result;
}

2025
static void __exit em28xx_module_exit(void)
2026 2027
{
	/* deregister this driver with the USB subsystem */
2028
	usb_deregister(&em28xx_usb_driver);
2029 2030
}

2031 2032
module_init(em28xx_module_init);
module_exit(em28xx_module_exit);