em28xx-video.c 55.1 KB
Newer Older
1
/*
2 3
   em28xx-video.c - driver for Empia EM2800/EM2820/2840 USB
		    video capture devices
4

5 6
   Copyright (C) 2005 Ludovico Cavedon <cavedon@sssup.it>
		      Markus Rechberger <mrechberger@gmail.com>
7
		      Mauro Carvalho Chehab <mchehab@infradead.org>
8
		      Sascha Sommer <saschasommer@freenet.de>
9

10 11 12
	Some parts based on SN9C10x PC Camera Controllers GPL driver made
		by Luca Risolia <luca.risolia@studio.unibo.it>

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

39
#include "em28xx.h"
40
#include <media/v4l2-common.h>
41
#include <media/msp3400.h>
42
#include <media/tuner.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, 1, 0)
52

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

58
static unsigned int isoc_debug;
59 60
module_param(isoc_debug, int, 0644);
MODULE_PARM_DESC(isoc_debug, "enable debug messages [isoc transfers]");
61

62 63 64
#define em28xx_isocdbg(fmt, arg...) \
do {\
	if (isoc_debug) { \
65
		printk(KERN_INFO "%s %s :"fmt, \
66 67 68
			 dev->name, __func__ , ##arg); \
	} \
  } while (0)
69

70 71 72 73
MODULE_AUTHOR(DRIVER_AUTHOR);
MODULE_DESCRIPTION(DRIVER_DESC);
MODULE_LICENSE("GPL");

74
static LIST_HEAD(em28xx_devlist);
75

76
static unsigned int card[]     = {[0 ... (EM28XX_MAXBOARDS - 1)] = UNSET };
77
static unsigned int video_nr[] = {[0 ... (EM28XX_MAXBOARDS - 1)] = UNSET };
78 79 80
static unsigned int vbi_nr[]   = {[0 ... (EM28XX_MAXBOARDS - 1)] = UNSET };
static unsigned int radio_nr[] = {[0 ... (EM28XX_MAXBOARDS - 1)] = UNSET };

81
module_param_array(card,  int, NULL, 0444);
82 83
module_param_array(video_nr, int, NULL, 0444);
module_param_array(vbi_nr, int, NULL, 0444);
84 85 86 87 88
module_param_array(radio_nr, int, NULL, 0444);
MODULE_PARM_DESC(card,     "card type");
MODULE_PARM_DESC(video_nr, "video device numbers");
MODULE_PARM_DESC(vbi_nr,   "vbi device numbers");
MODULE_PARM_DESC(radio_nr, "radio device numbers");
89

90
static unsigned int video_debug;
91 92
module_param(video_debug, int, 0644);
MODULE_PARM_DESC(video_debug, "enable debug messages [video]");
93

94 95 96
/* Bitmask marking allocated devices from 0 to EM28XX_MAXBOARDS */
static unsigned long em28xx_devused;

97
/* supported controls */
98
/* Common to all boards */
99
static struct v4l2_queryctrl em28xx_qctrl[] = {
100 101 102 103 104 105 106 107 108
	{
		.id = V4L2_CID_AUDIO_VOLUME,
		.type = V4L2_CTRL_TYPE_INTEGER,
		.name = "Volume",
		.minimum = 0x0,
		.maximum = 0x1f,
		.step = 0x1,
		.default_value = 0x1f,
		.flags = 0,
109
	}, {
110 111 112 113 114 115 116 117 118 119 120
		.id = V4L2_CID_AUDIO_MUTE,
		.type = V4L2_CTRL_TYPE_BOOLEAN,
		.name = "Mute",
		.minimum = 0,
		.maximum = 1,
		.step = 1,
		.default_value = 1,
		.flags = 0,
	}
};

121
static struct usb_driver em28xx_usb_driver;
122

123 124 125 126 127 128 129
/* ------------------------------------------------------------------
	DMA and thread functions
   ------------------------------------------------------------------*/

/*
 * Announces that a buffer were filled and request the next
 */
130
static inline void buffer_filled(struct em28xx *dev,
131 132 133 134 135 136 137 138 139
				  struct em28xx_dmaqueue *dma_q,
				  struct em28xx_buffer *buf)
{
	/* Advice that buffer was filled */
	em28xx_isocdbg("[%p/%d] wakeup\n", buf, buf->vb.i);
	buf->vb.state = VIDEOBUF_DONE;
	buf->vb.field_count++;
	do_gettimeofday(&buf->vb.ts);

140 141
	dev->isoc_ctl.buf = NULL;

142 143 144 145 146 147 148 149 150 151 152 153 154 155
	list_del(&buf->vb.queue);
	wake_up(&buf->vb.done);
}

/*
 * Identify the buffer header type and properly handles
 */
static void em28xx_copy_video(struct em28xx *dev,
			      struct em28xx_dmaqueue  *dma_q,
			      struct em28xx_buffer *buf,
			      unsigned char *p,
			      unsigned char *outp, unsigned long len)
{
	void *fieldstart, *startwrite, *startread;
156
	int  linesdone, currlinedone, offset, lencopy, remain;
157
	int bytesperline = dev->width << 1;
158 159 160 161

	if (dma_q->pos + len > buf->vb.size)
		len = buf->vb.size - dma_q->pos;

162
	if (p[0] != 0x88 && p[0] != 0x22) {
163 164 165
		em28xx_isocdbg("frame is not complete\n");
		len += 4;
	} else
166
		p += 4;
167 168 169 170 171 172 173 174

	startread = p;
	remain = len;

	/* Interlaces frame */
	if (buf->top_field)
		fieldstart = outp;
	else
175
		fieldstart = outp + bytesperline;
176

177 178 179
	linesdone = dma_q->pos / bytesperline;
	currlinedone = dma_q->pos % bytesperline;
	offset = linesdone * bytesperline * 2 + currlinedone;
180
	startwrite = fieldstart + offset;
181
	lencopy = bytesperline - currlinedone;
182 183
	lencopy = lencopy > remain ? remain : lencopy;

184
	if ((char *)startwrite + lencopy > (char *)outp + buf->vb.size) {
185
		em28xx_isocdbg("Overflow of %zi bytes past buffer end (1)\n",
186 187 188
			       ((char *)startwrite + lencopy) -
			       ((char *)outp + buf->vb.size));
		lencopy = remain = (char *)outp + buf->vb.size - (char *)startwrite;
189
	}
190 191
	if (lencopy <= 0)
		return;
192
	memcpy(startwrite, startread, lencopy);
193 194 195 196

	remain -= lencopy;

	while (remain > 0) {
197
		startwrite += lencopy + bytesperline;
198
		startread += lencopy;
199
		if (bytesperline > remain)
200 201
			lencopy = remain;
		else
202
			lencopy = bytesperline;
203

204
		if ((char *)startwrite + lencopy > (char *)outp + buf->vb.size) {
205
			em28xx_isocdbg("Overflow of %zi bytes past buffer end (2)\n",
206 207 208 209
				       ((char *)startwrite + lencopy) -
				       ((char *)outp + buf->vb.size));
			lencopy = remain = (char *)outp + buf->vb.size -
					   (char *)startwrite;
210
		}
211 212
		if (lencopy <= 0)
			break;
213 214

		memcpy(startwrite, startread, lencopy);
215 216 217 218 219 220 221

		remain -= lencopy;
	}

	dma_q->pos += len;
}

222
static inline void print_err_status(struct em28xx *dev,
223 224 225 226
				     int packet, int status)
{
	char *errmsg = "Unknown";

227
	switch (status) {
228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252
	case -ENOENT:
		errmsg = "unlinked synchronuously";
		break;
	case -ECONNRESET:
		errmsg = "unlinked asynchronuously";
		break;
	case -ENOSR:
		errmsg = "Buffer error (overrun)";
		break;
	case -EPIPE:
		errmsg = "Stalled (device not responding)";
		break;
	case -EOVERFLOW:
		errmsg = "Babble (bad cable?)";
		break;
	case -EPROTO:
		errmsg = "Bit-stuff error (bad cable?)";
		break;
	case -EILSEQ:
		errmsg = "CRC/Timeout (could be anything)";
		break;
	case -ETIME:
		errmsg = "Device does not respond";
		break;
	}
253
	if (packet < 0) {
254 255 256 257 258 259 260 261 262 263
		em28xx_isocdbg("URB status %d [%s].\n",	status, errmsg);
	} else {
		em28xx_isocdbg("URB packet %d, status %d [%s].\n",
			       packet, status, errmsg);
	}
}

/*
 * video-buf generic routine to get the next available buffer
 */
264
static inline void get_next_buf(struct em28xx_dmaqueue *dma_q,
265 266 267
					  struct em28xx_buffer **buf)
{
	struct em28xx *dev = container_of(dma_q, struct em28xx, vidq);
268
	char *outp;
269

270 271 272 273
	if (list_empty(&dma_q->active)) {
		em28xx_isocdbg("No active queue to serve\n");
		dev->isoc_ctl.buf = NULL;
		*buf = NULL;
274
		return;
275 276 277 278 279 280 281 282
	}

	/* Get the next buffer */
	*buf = list_entry(dma_q->active.next, struct em28xx_buffer, vb.queue);

	/* Cleans up buffer - Usefull for testing for frame/URB loss */
	outp = videobuf_to_vmalloc(&(*buf)->vb);
	memset(outp, 0, (*buf)->vb.size);
283 284 285

	dev->isoc_ctl.buf = *buf;

286
	return;
287 288 289 290 291
}

/*
 * Controls the isoc copy of each urb packet
 */
292
static inline int em28xx_isoc_copy(struct em28xx *dev, struct urb *urb)
293
{
294
	struct em28xx_buffer    *buf;
295
	struct em28xx_dmaqueue  *dma_q = urb->context;
296
	unsigned char *outp = NULL;
297
	int i, len = 0, rc = 1;
298
	unsigned char *p;
299 300 301 302 303 304 305

	if (!dev)
		return 0;

	if ((dev->state & DEV_DISCONNECTED) || (dev->state & DEV_MISCONFIGURED))
		return 0;

306 307
	if (urb->status < 0) {
		print_err_status(dev, -1, urb->status);
308 309 310 311
		if (urb->status == -ENOENT)
			return 0;
	}

312 313 314
	buf = dev->isoc_ctl.buf;
	if (buf != NULL)
		outp = videobuf_to_vmalloc(&buf->vb);
315

316 317 318
	for (i = 0; i < urb->number_of_packets; i++) {
		int status = urb->iso_frame_desc[i].status;

319 320
		if (status < 0) {
			print_err_status(dev, i, status);
321 322 323 324
			if (urb->iso_frame_desc[i].status != -EPROTO)
				continue;
		}

325
		len = urb->iso_frame_desc[i].actual_length - 4;
326 327

		if (urb->iso_frame_desc[i].actual_length <= 0) {
328
			/* em28xx_isocdbg("packet %d is empty",i); - spammy */
329 330 331 332 333 334 335 336 337 338 339 340 341
			continue;
		}
		if (urb->iso_frame_desc[i].actual_length >
						dev->max_pkt_size) {
			em28xx_isocdbg("packet bigger than packet size");
			continue;
		}

		p = urb->transfer_buffer + urb->iso_frame_desc[i].offset;

		/* FIXME: incomplete buffer checks where removed to make
		   logic simpler. Impacts of those changes should be evaluated
		 */
342 343 344 345 346
		if (p[0] == 0x33 && p[1] == 0x95 && p[2] == 0x00) {
			em28xx_isocdbg("VBI HEADER!!!\n");
			/* FIXME: Should add vbi copy */
			continue;
		}
347
		if (p[0] == 0x22 && p[1] == 0x5a) {
348 349
			em28xx_isocdbg("Video frame %d, length=%i, %s\n", p[2],
				       len, (p[2] & 1)? "odd" : "even");
350

351 352 353 354 355 356 357 358 359 360 361 362 363 364 365
			if (!(p[2] & 1)) {
				if (buf != NULL)
					buffer_filled(dev, dma_q, buf);
				get_next_buf(dma_q, &buf);
				if (buf == NULL)
					outp = NULL;
				else
					outp = videobuf_to_vmalloc(&buf->vb);
			}

			if (buf != NULL) {
				if (p[2] & 1)
					buf->top_field = 0;
				else
					buf->top_field = 1;
366
			}
367

368 369
			dma_q->pos = 0;
		}
370 371
		if (buf != NULL)
			em28xx_copy_video(dev, dma_q, buf, p, outp, len);
372 373 374 375 376 377 378 379 380 381 382 383
	}
	return rc;
}

/* ------------------------------------------------------------------
	Videobuf operations
   ------------------------------------------------------------------*/

static int
buffer_setup(struct videobuf_queue *vq, unsigned int *count, unsigned int *size)
{
	struct em28xx_fh *fh = vq->priv_data;
384 385
	struct em28xx        *dev = fh->dev;
	struct v4l2_frequency f;
386

387
	*size = 16 * fh->dev->width * fh->dev->height >> 3;
388 389 390
	if (0 == *count)
		*count = EM28XX_DEF_BUF;

391 392
	if (*count < EM28XX_MIN_BUF)
		*count = EM28XX_MIN_BUF;
393

394 395 396
	dev->mode = EM28XX_ANALOG_MODE;

	/* Ask tuner to go to analog mode */
397
	memset(&f, 0, sizeof(f));
398 399 400 401
	f.frequency = dev->ctl_freq;

	em28xx_i2c_call_clients(dev, VIDIOC_S_FREQUENCY, &f);

402 403 404
	return 0;
}

405
/* This is called *without* dev->slock held; please keep it that way */
406 407
static void free_buffer(struct videobuf_queue *vq, struct em28xx_buffer *buf)
{
408 409 410
	struct em28xx_fh     *fh  = vq->priv_data;
	struct em28xx        *dev = fh->dev;
	unsigned long flags = 0;
411 412 413
	if (in_interrupt())
		BUG();

414 415 416 417 418 419 420 421 422 423 424 425 426 427
	/* We used to wait for the buffer to finish here, but this didn't work
	   because, as we were keeping the state as VIDEOBUF_QUEUED,
	   videobuf_queue_cancel marked it as finished for us.
	   (Also, it could wedge forever if the hardware was misconfigured.)

	   This should be safe; by the time we get here, the buffer isn't
	   queued anymore. If we ever start marking the buffers as
	   VIDEOBUF_ACTIVE, it won't be, though.
	*/
	spin_lock_irqsave(&dev->slock, flags);
	if (dev->isoc_ctl.buf == buf)
		dev->isoc_ctl.buf = NULL;
	spin_unlock_irqrestore(&dev->slock, flags);

428 429 430 431 432 433 434 435 436
	videobuf_vmalloc_free(&buf->vb);
	buf->vb.state = VIDEOBUF_NEEDS_INIT;
}

static int
buffer_prepare(struct videobuf_queue *vq, struct videobuf_buffer *vb,
						enum v4l2_field field)
{
	struct em28xx_fh     *fh  = vq->priv_data;
437
	struct em28xx_buffer *buf = container_of(vb, struct em28xx_buffer, vb);
438 439 440 441 442
	struct em28xx        *dev = fh->dev;
	int                  rc = 0, urb_init = 0;

	/* FIXME: It assumes depth = 16 */
	/* The only currently supported format is 16 bits/pixel */
443
	buf->vb.size = 16 * dev->width * dev->height >> 3;
444 445 446 447

	if (0 != buf->vb.baddr  &&  buf->vb.bsize < buf->vb.size)
		return -EINVAL;

448 449 450
	buf->vb.width  = dev->width;
	buf->vb.height = dev->height;
	buf->vb.field  = field;
451 452

	if (VIDEOBUF_NEEDS_INIT == buf->vb.state) {
453 454
		rc = videobuf_iolock(vq, &buf->vb, NULL);
		if (rc < 0)
455 456 457 458
			goto fail;
	}

	if (!dev->isoc_ctl.num_bufs)
459
		urb_init = 1;
460 461

	if (urb_init) {
462 463 464
		rc = em28xx_init_isoc(dev, EM28XX_NUM_PACKETS,
				      EM28XX_NUM_BUFS, dev->max_pkt_size,
				      em28xx_isoc_copy, EM28XX_ANALOG_CAPTURE);
465
		if (rc < 0)
466 467 468 469 470 471 472
			goto fail;
	}

	buf->vb.state = VIDEOBUF_PREPARED;
	return 0;

fail:
473
	free_buffer(vq, buf);
474 475 476 477 478 479 480 481
	return rc;
}

static void
buffer_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb)
{
	struct em28xx_buffer    *buf     = container_of(vb, struct em28xx_buffer, vb);
	struct em28xx_fh        *fh      = vq->priv_data;
482
	struct em28xx           *dev     = fh->dev;
483 484
	struct em28xx_dmaqueue  *vidq    = &dev->vidq;

485 486 487
	buf->vb.state = VIDEOBUF_QUEUED;
	list_add_tail(&buf->vb.queue, &vidq->active);

488 489
}

490 491
static void buffer_release(struct videobuf_queue *vq,
				struct videobuf_buffer *vb)
492
{
493
	struct em28xx_buffer   *buf  = container_of(vb, struct em28xx_buffer, vb);
494
	struct em28xx_fh       *fh   = vq->priv_data;
495
	struct em28xx          *dev  = (struct em28xx *)fh->dev;
496

497
	em28xx_isocdbg("em28xx: called buffer_release\n");
498

499
	free_buffer(vq, buf);
500 501 502 503 504 505 506 507
}

static struct videobuf_queue_ops em28xx_video_qops = {
	.buf_setup      = buffer_setup,
	.buf_prepare    = buffer_prepare,
	.buf_queue      = buffer_queue,
	.buf_release    = buffer_release,
};
508

509
/*********************  v4l2 interface  **************************************/
510 511

/*
512
 * em28xx_config()
513 514
 * inits registers with sane defaults
 */
515
static int em28xx_config(struct em28xx *dev)
516 517 518
{

	/* Sets I2C speed to 100 KHz */
519 520
	if (!dev->is_em2800)
		em28xx_write_regs_req(dev, 0x00, 0x06, "\x40", 1);
521 522

	/* enable vbi capturing */
523

524 525 526
/*	em28xx_write_regs_req(dev, 0x00, 0x0e, "\xC0", 1); audio register */
/*	em28xx_write_regs_req(dev, 0x00, 0x0f, "\x80", 1); clk register */
	em28xx_write_regs_req(dev, 0x00, 0x11, "\x51", 1);
527

528 529
	dev->mute = 1;		/* maybe not the right place... */
	dev->volume = 0x1f;
530

531 532 533
	em28xx_outfmt_set_yuv422(dev);
	em28xx_colorlevels_set_default(dev);
	em28xx_compression_disable(dev);
534 535 536 537 538

	return 0;
}

/*
539
 * em28xx_config_i2c()
540 541
 * configure i2c attached devices
 */
542
static void em28xx_config_i2c(struct em28xx *dev)
543
{
544 545 546 547
	struct v4l2_routing route;

	route.input = INPUT(dev->ctl_input)->vmux;
	route.output = 0;
A
Al Viro 已提交
548
	em28xx_i2c_call_clients(dev, VIDIOC_INT_RESET, NULL);
549
	em28xx_i2c_call_clients(dev, VIDIOC_INT_S_VIDEO_ROUTING, &route);
550
	em28xx_i2c_call_clients(dev, VIDIOC_STREAMON, NULL);
551 552
}

553 554
static void video_mux(struct em28xx *dev, int index)
{
555
	struct v4l2_routing route;
556

557 558
	route.input = INPUT(index)->vmux;
	route.output = 0;
559 560 561
	dev->ctl_input = index;
	dev->ctl_ainput = INPUT(index)->amux;

562
	em28xx_i2c_call_clients(dev, VIDIOC_INT_S_VIDEO_ROUTING, &route);
563 564

	if (dev->has_msp34xx) {
565 566 567 568
		if (dev->i2s_speed) {
			em28xx_i2c_call_clients(dev, VIDIOC_INT_I2S_CLOCK_FREQ,
				&dev->i2s_speed);
		}
569
		route.input = dev->ctl_ainput;
570
		route.output = MSP_OUTPUT(MSP_SC_IN_DSP_SCART1);
571
		/* Note: this is msp3400 specific */
572 573
		em28xx_i2c_call_clients(dev, VIDIOC_INT_S_AUDIO_ROUTING,
			&route);
574
	}
575

576
	em28xx_audio_analog_set(dev);
577 578
}

579 580 581 582 583 584 585 586 587 588 589
/* 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;

	if (dev->stream_on)
590
		return -EINVAL;
591

592 593 594
	mutex_lock(&dev->lock);
	dev->stream_on = 1;
	fh->stream_on  = 1;
595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613
	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);
}

614 615 616 617 618 619 620 621 622 623 624 625 626 627 628
/*
 * 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;
629
	}
630
}
631

632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651
/*
 * 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;
	}
}
652

653 654 655 656 657
static int check_dev(struct em28xx *dev)
{
	if (dev->state & DEV_DISCONNECTED) {
		em28xx_errdev("v4l2 ioctl: device not present\n");
		return -ENODEV;
658
	}
659

660 661 662 663 664 665 666
	if (dev->state & DEV_MISCONFIGURED) {
		em28xx_errdev("v4l2 ioctl: device is misconfigured; "
			      "close and open it again\n");
		return -EIO;
	}
	return 0;
}
667

668 669 670 671 672 673 674 675 676 677 678 679 680 681
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;
682 683
}

684 685 686 687 688 689
/* ------------------------------------------------------------------
	IOCTL vidioc handling
   ------------------------------------------------------------------*/

static int vidioc_g_fmt_cap(struct file *file, void *priv,
					struct v4l2_format *f)
690
{
691 692
	struct em28xx_fh      *fh  = priv;
	struct em28xx         *dev = fh->dev;
693

694
	mutex_lock(&dev->lock);
695

696 697 698
	f->fmt.pix.width = dev->width;
	f->fmt.pix.height = dev->height;
	f->fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
699 700
	f->fmt.pix.bytesperline = dev->width * 2;
	f->fmt.pix.sizeimage = f->fmt.pix.bytesperline  * dev->height;
701
	f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
702

703 704 705
	/* FIXME: TOP? NONE? BOTTOM? ALTENATE? */
	f->fmt.pix.field = dev->interlaced ?
			   V4L2_FIELD_INTERLACED : V4L2_FIELD_TOP;
706

707 708
	mutex_unlock(&dev->lock);
	return 0;
709 710
}

711 712
static int vidioc_try_fmt_cap(struct file *file, void *priv,
			struct v4l2_format *f)
713
{
714 715 716 717 718 719 720 721 722 723 724 725
	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;
726

727 728 729 730 731 732 733 734
	if (height < 32)
		height = 32;
	if (height > maxh)
		height = maxh;
	if (width < 48)
		width = 48;
	if (width > maxw)
		width = maxw;
735

736
	mutex_lock(&dev->lock);
737

738 739 740 741 742 743 744 745 746 747 748 749 750 751 752
	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;
	}
753

754
	get_scale(dev, width, height, &hscale, &vscale);
755

756 757
	width = (((unsigned long)maxw) << 12) / (hscale + 4096L);
	height = (((unsigned long)maxh) << 12) / (vscale + 4096L);
758

759 760 761 762 763 764 765
	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;
766

767
	mutex_unlock(&dev->lock);
768 769 770
	return 0;
}

771 772
static int vidioc_s_fmt_cap(struct file *file, void *priv,
			struct v4l2_format *f)
773
{
774 775
	struct em28xx_fh      *fh  = priv;
	struct em28xx         *dev = fh->dev;
776
	int                   rc;
777

778 779 780
	rc = check_dev(dev);
	if (rc < 0)
		return rc;
781

782
	vidioc_try_fmt_cap(file, priv, f);
783

784 785
	mutex_lock(&dev->lock);

786 787 788 789 790 791
	if (videobuf_queue_is_busy(&fh->vb_vidq)) {
		em28xx_errdev("%s queue busy\n", __func__);
		rc = -EBUSY;
		goto out;
	}

792 793 794 795 796 797
	if (dev->stream_on && !fh->stream_on) {
		em28xx_errdev("%s device in use by another fh\n", __func__);
		rc = -EBUSY;
		goto out;
	}

798 799 800 801
	/* set new image size */
	dev->width = f->fmt.pix.width;
	dev->height = f->fmt.pix.height;
	get_scale(dev, dev->width, dev->height, &dev->hscale, &dev->vscale);
802

803 804 805
	em28xx_set_alternate(dev);
	em28xx_resolution_set(dev);

806 807 808
	rc = 0;

out:
809
	mutex_unlock(&dev->lock);
810
	return rc;
811 812
}

813
static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id * norm)
814 815 816 817 818 819 820 821 822 823 824
{
	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);
825
	dev->norm = *norm;
826
	mutex_unlock(&dev->lock);
827

828 829 830 831
	/* Adjusts width/height, if needed */
	f.fmt.pix.width = dev->width;
	f.fmt.pix.height = dev->height;
	vidioc_try_fmt_cap(file, priv, &f);
832

833
	mutex_lock(&dev->lock);
834

835 836 837 838
	/* set new image size */
	dev->width = f.fmt.pix.width;
	dev->height = f.fmt.pix.height;
	get_scale(dev, dev->width, dev->height, &dev->hscale, &dev->vscale);
839

840
	em28xx_resolution_set(dev);
841
	em28xx_i2c_call_clients(dev, VIDIOC_S_STD, &dev->norm);
842

843 844 845
	mutex_unlock(&dev->lock);
	return 0;
}
846

847 848 849 850 851 852 853 854 855 856 857
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",
};
858

859 860 861 862 863 864
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;
865

866 867 868 869 870
	n = i->index;
	if (n >= MAX_EM28XX_INPUT)
		return -EINVAL;
	if (0 == INPUT(n)->type)
		return -EINVAL;
871

872 873
	i->index = n;
	i->type = V4L2_INPUT_TYPE_CAMERA;
874

875
	strcpy(i->name, iname[INPUT(n)->type]);
876

877 878 879 880
	if ((EM28XX_VMUX_TELEVISION == INPUT(n)->type) ||
		(EM28XX_VMUX_CABLE == INPUT(n)->type))
		i->type = V4L2_INPUT_TYPE_TUNER;

881
	i->std = dev->vdev->tvnorms;
882 883

	return 0;
884 885
}

886
static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
887
{
888 889
	struct em28xx_fh   *fh  = priv;
	struct em28xx      *dev = fh->dev;
890

891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909
	*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;
910

911
	mutex_lock(&dev->lock);
912

913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929
	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;

930
	if (index == 0)
931
		strcpy(a->name, "Television");
932
	else
933
		strcpy(a->name, "Line In");
934

935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973
	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;
974 975
			}
		}
976 977 978 979
	}
	mutex_lock(&dev->lock);
	em28xx_i2c_call_clients(dev, VIDIOC_QUERYCTRL, qc);
	mutex_unlock(&dev->lock);
980

981 982 983 984 985
	if (qc->type)
		return 0;
	else
		return -EINVAL;
}
986

987 988 989 990 991 992
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;
993

994 995 996 997
	rc = check_dev(dev);
	if (rc < 0)
		return rc;
	mutex_lock(&dev->lock);
998

999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041
	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;
			}
1042 1043 1044
		}
	}

1045 1046 1047 1048 1049 1050
	/* 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;
	}

1051
	mutex_unlock(&dev->lock);
1052
	return rc;
1053 1054
}

1055 1056
static int vidioc_g_tuner(struct file *file, void *priv,
				struct v4l2_tuner *t)
1057
{
1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076
	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;
1077 1078
}

1079 1080
static int vidioc_s_tuner(struct file *file, void *priv,
				struct v4l2_tuner *t)
1081
{
1082 1083 1084
	struct em28xx_fh      *fh  = priv;
	struct em28xx         *dev = fh->dev;
	int                   rc;
1085

1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098
	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;
1099 1100
}

1101 1102 1103 1104 1105
static int vidioc_g_frequency(struct file *file, void *priv,
				struct v4l2_frequency *f)
{
	struct em28xx_fh      *fh  = priv;
	struct em28xx         *dev = fh->dev;
1106

1107
	f->type = fh->radio ? V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV;
1108 1109 1110 1111 1112 1113 1114
	f->frequency = dev->ctl_freq;

	return 0;
}

static int vidioc_s_frequency(struct file *file, void *priv,
				struct v4l2_frequency *f)
1115
{
1116 1117 1118
	struct em28xx_fh      *fh  = priv;
	struct em28xx         *dev = fh->dev;
	int                   rc;
1119

1120 1121 1122 1123 1124 1125 1126
	rc = check_dev(dev);
	if (rc < 0)
		return rc;

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

1127 1128 1129
	if (unlikely(0 == fh->radio && f->type != V4L2_TUNER_ANALOG_TV))
		return -EINVAL;
	if (unlikely(1 == fh->radio && f->type != V4L2_TUNER_RADIO))
1130
		return -EINVAL;
1131 1132

	mutex_lock(&dev->lock);
1133

1134 1135
	dev->ctl_freq = f->frequency;
	em28xx_i2c_call_clients(dev, VIDIOC_S_FREQUENCY, f);
1136

1137 1138 1139
	mutex_unlock(&dev->lock);
	return 0;
}
1140

1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170
#ifdef CONFIG_VIDEO_ADV_DEBUG
static int em28xx_reg_len(int reg)
{
	switch (reg) {
	case AC97LSB_REG:
	case HSCALELOW_REG:
	case VSCALELOW_REG:
		return 2;
	default:
		return 1;
	}
}

static int vidioc_g_register(struct file *file, void *priv,
			     struct v4l2_register *reg)
{
	struct em28xx_fh      *fh  = priv;
	struct em28xx         *dev = fh->dev;
	int ret;

	if (!v4l2_chip_match_host(reg->match_type, reg->match_chip))
		return -EINVAL;

	if (em28xx_reg_len(reg->reg) == 1) {
		ret = em28xx_read_reg(dev, reg->reg);
		if (ret < 0)
			return ret;

		reg->val = ret;
	} else {
1171
		u64 val = 0;
1172 1173 1174 1175 1176
		ret = em28xx_read_reg_req_len(dev, USB_REQ_GET_STATUS,
						   reg->reg, (char *)&val, 2);
		if (ret < 0)
			return ret;

1177
		reg->val = cpu_to_le64((__u64)val);
1178 1179 1180 1181 1182 1183 1184 1185 1186 1187
	}

	return 0;
}

static int vidioc_s_register(struct file *file, void *priv,
			     struct v4l2_register *reg)
{
	struct em28xx_fh      *fh  = priv;
	struct em28xx         *dev = fh->dev;
1188
	u64 buf;
1189

1190
	buf = le64_to_cpu((__u64)reg->val);
1191 1192 1193 1194 1195 1196 1197

	return em28xx_write_regs(dev, reg->reg, (char *)&buf,
				 em28xx_reg_len(reg->reg));
}
#endif


1198 1199 1200 1201 1202 1203 1204
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)
1205 1206
		return -EINVAL;

1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229
	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;


1230
	if (unlikely(res_get(fh) < 0))
1231
		return -EBUSY;
1232

1233
	return (videobuf_streamon(&fh->vb_vidq));
1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246
}

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;

1247 1248 1249
	if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
		return -EINVAL;
	if (type != fh->type)
1250 1251
		return -EINVAL;

1252 1253
	videobuf_streamoff(&fh->vb_vidq);
	res_free(fh);
1254 1255 1256 1257

	return 0;
}

1258 1259
static int vidioc_querycap(struct file *file, void  *priv,
					struct v4l2_capability *cap)
1260
{
1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275
	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;

1276
	if (dev->tuner_type != TUNER_ABSENT)
1277 1278 1279
		cap->capabilities |= V4L2_CAP_TUNER;

	return 0;
1280 1281
}

1282 1283
static int vidioc_enum_fmt_cap(struct file *file, void  *priv,
					struct v4l2_fmtdesc *fmtd)
1284
{
1285
	if (fmtd->index != 0)
1286
		return -EINVAL;
1287 1288 1289 1290 1291 1292 1293

	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;
1294 1295
}

1296 1297 1298
/* Sliced VBI ioctls */
static int vidioc_g_fmt_vbi_capture(struct file *file, void *priv,
					struct v4l2_format *f)
1299
{
1300 1301 1302
	struct em28xx_fh      *fh  = priv;
	struct em28xx         *dev = fh->dev;
	int                   rc;
1303

1304 1305 1306
	rc = check_dev(dev);
	if (rc < 0)
		return rc;
1307

1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337
	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;
1338 1339 1340 1341

	return 0;
}

1342 1343 1344

static int vidioc_reqbufs(struct file *file, void *priv,
			  struct v4l2_requestbuffers *rb)
1345
{
1346 1347 1348
	struct em28xx_fh      *fh  = priv;
	struct em28xx         *dev = fh->dev;
	int                   rc;
1349

1350 1351 1352
	rc = check_dev(dev);
	if (rc < 0)
		return rc;
1353

1354
	return (videobuf_reqbufs(&fh->vb_vidq, rb));
1355 1356
}

1357 1358
static int vidioc_querybuf(struct file *file, void *priv,
			   struct v4l2_buffer *b)
1359
{
1360 1361 1362
	struct em28xx_fh      *fh  = priv;
	struct em28xx         *dev = fh->dev;
	int                   rc;
1363

1364 1365 1366
	rc = check_dev(dev);
	if (rc < 0)
		return rc;
1367

1368
	return (videobuf_querybuf(&fh->vb_vidq, b));
1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380
}

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

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

1381
	return (videobuf_qbuf(&fh->vb_vidq, b));
1382 1383
}

1384
static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b)
1385
{
1386 1387 1388 1389 1390 1391 1392
	struct em28xx_fh      *fh  = priv;
	struct em28xx         *dev = fh->dev;
	int                   rc;

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

1394 1395 1396
	return (videobuf_dqbuf(&fh->vb_vidq, b,
				file->f_flags & O_NONBLOCK));
}
1397

1398
#ifdef CONFIG_VIDEO_V4L1_COMPAT
1399
static int vidiocgmbuf(struct file *file, void *priv, struct video_mbuf *mbuf)
1400
{
1401
	struct em28xx_fh  *fh = priv;
1402

1403
	return videobuf_cgmbuf(&fh->vb_vidq, mbuf, 8);
1404
}
1405 1406
#endif

1407

1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503
/* ----------------------------------------------------------- */
/* RADIO ESPECIFIC IOCTLS                                      */
/* ----------------------------------------------------------- */

static int radio_querycap(struct file *file, void  *priv,
			  struct v4l2_capability *cap)
{
	struct em28xx *dev = ((struct em28xx_fh *)priv)->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_TUNER;
	return 0;
}

static int radio_g_tuner(struct file *file, void *priv,
			 struct v4l2_tuner *t)
{
	struct em28xx *dev = ((struct em28xx_fh *)priv)->dev;

	if (unlikely(t->index > 0))
		return -EINVAL;

	strcpy(t->name, "Radio");
	t->type = V4L2_TUNER_RADIO;

	em28xx_i2c_call_clients(dev, VIDIOC_G_TUNER, t);
	return 0;
}

static int radio_enum_input(struct file *file, void *priv,
			    struct v4l2_input *i)
{
	if (i->index != 0)
		return -EINVAL;
	strcpy(i->name, "Radio");
	i->type = V4L2_INPUT_TYPE_TUNER;

	return 0;
}

static int radio_g_audio(struct file *file, void *priv, struct v4l2_audio *a)
{
	if (unlikely(a->index))
		return -EINVAL;

	strcpy(a->name, "Radio");
	return 0;
}

static int radio_s_tuner(struct file *file, void *priv,
			 struct v4l2_tuner *t)
{
	struct em28xx *dev = ((struct em28xx_fh *)priv)->dev;

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

	em28xx_i2c_call_clients(dev, VIDIOC_S_TUNER, t);

	return 0;
}

static int radio_s_audio(struct file *file, void *fh,
			 struct v4l2_audio *a)
{
	return 0;
}

static int radio_s_input(struct file *file, void *fh, unsigned int i)
{
	return 0;
}

static int radio_queryctrl(struct file *file, void *priv,
			   struct v4l2_queryctrl *qc)
{
	int i;

	if (qc->id <  V4L2_CID_BASE ||
		qc->id >= V4L2_CID_LASTP1)
		return -EINVAL;

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

	return -EINVAL;
}

1504 1505 1506 1507 1508 1509 1510
/*
 * 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);
1511
	int errCode = 0, radio = 0;
1512
	struct em28xx *h, *dev = NULL;
1513
	struct em28xx_fh *fh;
1514
	enum v4l2_buf_type fh_type = 0;
1515

1516 1517 1518
	list_for_each_entry(h, &em28xx_devlist, devlist) {
		if (h->vdev->minor == minor) {
			dev  = h;
1519
			fh_type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1520 1521 1522
		}
		if (h->vbi_dev->minor == minor) {
			dev  = h;
1523
			fh_type = V4L2_BUF_TYPE_VBI_CAPTURE;
1524
		}
1525 1526 1527 1528 1529
		if (h->radio_dev &&
		    h->radio_dev->minor == minor) {
			radio = 1;
			dev   = h;
		}
1530
	}
1531 1532
	if (NULL == dev)
		return -ENODEV;
1533

1534
	em28xx_videodbg("open minor=%d type=%s users=%d\n",
1535
				minor, v4l2_type_names[fh_type], dev->users);
1536

1537
	fh = kzalloc(sizeof(struct em28xx_fh), GFP_KERNEL);
1538

1539 1540 1541 1542 1543 1544
	if (!fh) {
		em28xx_errdev("em28xx-video.c: Out of memory?!\n");
		return -ENOMEM;
	}
	mutex_lock(&dev->lock);
	fh->dev = dev;
1545
	fh->radio = radio;
1546
	fh->type = fh_type;
1547
	filp->private_data = fh;
1548

1549
	if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE && dev->users == 0) {
1550 1551 1552 1553
		dev->width = norm_maxw(dev);
		dev->height = norm_maxh(dev);
		dev->hscale = 0;
		dev->vscale = 0;
1554

1555
		em28xx_set_alternate(dev);
1556
		em28xx_resolution_set(dev);
1557 1558

	}
1559 1560 1561 1562
	if (fh->radio) {
		em28xx_videodbg("video_open: setting radio device\n");
		em28xx_i2c_call_clients(dev, AUDC_SET_RADIO, NULL);
	}
1563

1564
	dev->users++;
1565

1566 1567 1568 1569
	videobuf_queue_vmalloc_init(&fh->vb_vidq, &em28xx_video_qops,
			NULL, &dev->slock, fh->type, V4L2_FIELD_INTERLACED,
			sizeof(struct em28xx_buffer), fh);

1570 1571
	mutex_unlock(&dev->lock);
	return errCode;
1572
}
1573

1574
/*
1575 1576 1577 1578 1579
 * 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)
1580 1581
{

1582
	/*FIXME: I2C IR should be disconnected */
1583

1584 1585 1586 1587
	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);
1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608
	if (dev->radio_dev) {
		if (-1 != dev->radio_dev->minor)
			video_unregister_device(dev->radio_dev);
		else
			video_device_release(dev->radio_dev);
		dev->radio_dev = NULL;
	}
	if (dev->vbi_dev) {
		if (-1 != dev->vbi_dev->minor)
			video_unregister_device(dev->vbi_dev);
		else
			video_device_release(dev->vbi_dev);
		dev->vbi_dev = NULL;
	}
	if (dev->vdev) {
		if (-1 != dev->vdev->minor)
			video_unregister_device(dev->vdev);
		else
			video_device_release(dev->vdev);
		dev->vdev = NULL;
	}
1609 1610
	em28xx_i2c_unregister(dev);
	usb_put_dev(dev->udev);
1611

1612
	/* Mark device as unused */
1613
	em28xx_devused &= ~(1<<dev->devno);
1614
}
1615

1616 1617
/*
 * em28xx_v4l2_close()
1618 1619
 * stops streaming and deallocates all resources allocated by the v4l2
 * calls and ioctls
1620 1621 1622 1623 1624 1625
 */
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;
1626

1627
	em28xx_videodbg("users=%d\n", dev->users);
1628 1629


1630 1631
	if (res_check(fh))
		res_free(fh);
1632

1633
	mutex_lock(&dev->lock);
1634

1635
	if (dev->users == 1) {
1636 1637
		videobuf_stop(&fh->vb_vidq);
		videobuf_mmap_free(&fh->vb_vidq);
1638

1639 1640 1641 1642 1643 1644 1645 1646
		/* 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;
		}
1647

1648 1649 1650
		/* do this before setting alternate! */
		em28xx_uninit_isoc(dev);

1651 1652 1653 1654 1655 1656 1657 1658
		/* 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);
		}
1659
	}
1660 1661 1662 1663 1664 1665
	kfree(fh);
	dev->users--;
	wake_up_interruptible_nr(&dev->open, 1);
	mutex_unlock(&dev->lock);
	return 0;
}
1666

1667 1668 1669 1670 1671
/*
 * em28xx_v4l2_read()
 * will allocate buffers when called for the first time
 */
static ssize_t
1672
em28xx_v4l2_read(struct file *filp, char __user *buf, size_t count,
1673
		 loff_t *pos)
1674 1675 1676
{
	struct em28xx_fh *fh = filp->private_data;
	struct em28xx *dev = fh->dev;
1677 1678 1679 1680 1681
	int rc;

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

1683 1684 1685
	/* FIXME: read() is not prepared to allow changing the video
	   resolution while streaming. Seems a bug at em28xx_set_fmt
	 */
1686

1687 1688 1689
	if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
		if (unlikely(res_get(fh)))
			return -EBUSY;
1690

1691 1692
		return videobuf_read_stream(&fh->vb_vidq, buf, count, pos, 0,
					filp->f_flags & O_NONBLOCK);
1693
	}
1694
	return 0;
1695 1696 1697
}

/*
1698 1699
 * em28xx_v4l2_poll()
 * will allocate buffers when called for the first time
1700
 */
1701
static unsigned int em28xx_v4l2_poll(struct file *filp, poll_table * wait)
1702
{
1703
	struct em28xx_fh *fh = filp->private_data;
1704
	struct em28xx *dev = fh->dev;
1705 1706 1707 1708 1709
	int rc;

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

1711 1712
	if (unlikely(res_get(fh) < 0))
		return POLLERR;
1713

1714 1715
	if (V4L2_BUF_TYPE_VIDEO_CAPTURE != fh->type)
		return POLLERR;
1716

1717
	return videobuf_poll_stream(filp, &fh->vb_vidq, wait);
1718
}
1719

1720 1721 1722 1723 1724 1725 1726
/*
 * 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;
1727
	int		 rc;
1728

1729 1730
	if (unlikely(res_get(fh) < 0))
		return -EBUSY;
1731

1732 1733 1734
	rc = check_dev(dev);
	if (rc < 0)
		return rc;
1735

1736
	rc = videobuf_mmap_mapper(&fh->vb_vidq, vma);
1737

1738 1739 1740 1741
	em28xx_videodbg("vma start=0x%08lx, size=%ld, ret=%d\n",
		(unsigned long)vma->vm_start,
		(unsigned long)vma->vm_end-(unsigned long)vma->vm_start,
		rc);
1742

1743
	return rc;
1744 1745
}

1746
static const struct file_operations em28xx_v4l_fops = {
1747 1748 1749 1750 1751 1752 1753 1754 1755 1756
	.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,
};
1757

1758 1759 1760 1761 1762 1763 1764 1765 1766
static const struct file_operations radio_fops = {
	.owner         = THIS_MODULE,
	.open          = em28xx_v4l2_open,
	.release       = em28xx_v4l2_close,
	.ioctl	       = video_ioctl2,
	.compat_ioctl  = v4l_compat_ioctl32,
	.llseek        = no_llseek,
};

1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801
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,
1802 1803 1804 1805
#ifdef CONFIG_VIDEO_ADV_DEBUG
	.vidioc_g_register          = vidioc_g_register,
	.vidioc_s_register          = vidioc_s_register,
#endif
1806 1807 1808
#ifdef CONFIG_VIDEO_V4L1_COMPAT
	.vidiocgmbuf                = vidiocgmbuf,
#endif
1809 1810

	.tvnorms                    = V4L2_STD_ALL,
1811
	.current_norm               = V4L2_STD_PAL,
1812 1813
};

1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830
static struct video_device em28xx_radio_template = {
	.name                 = "em28xx-radio",
	.type                 = VID_TYPE_TUNER,
	.fops                 = &radio_fops,
	.minor                = -1,
	.vidioc_querycap      = radio_querycap,
	.vidioc_g_tuner       = radio_g_tuner,
	.vidioc_enum_input    = radio_enum_input,
	.vidioc_g_audio       = radio_g_audio,
	.vidioc_s_tuner       = radio_s_tuner,
	.vidioc_s_audio       = radio_s_audio,
	.vidioc_s_input       = radio_s_input,
	.vidioc_queryctrl     = radio_queryctrl,
	.vidioc_g_ctrl        = vidioc_g_ctrl,
	.vidioc_s_ctrl        = vidioc_s_ctrl,
	.vidioc_g_frequency   = vidioc_g_frequency,
	.vidioc_s_frequency   = vidioc_s_frequency,
1831 1832 1833 1834
#ifdef CONFIG_VIDEO_ADV_DEBUG
	.vidioc_g_register    = vidioc_g_register,
	.vidioc_s_register    = vidioc_s_register,
#endif
1835 1836
};

1837
/******************************** usb interface ******************************/
1838

1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878

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

1879 1880 1881 1882
static struct video_device *em28xx_vdev_init(struct em28xx *dev,
					     const struct video_device *template,
					     const int type,
					     const char *type_name)
1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893
{
	struct video_device *vfd;

	vfd = video_device_alloc();
	if (NULL == vfd)
		return NULL;
	*vfd = *template;
	vfd->minor   = -1;
	vfd->dev = &dev->udev->dev;
	vfd->release = video_device_release;
	vfd->type = type;
1894
	vfd->debug = video_debug;
1895 1896 1897 1898 1899 1900 1901 1902

	snprintf(vfd->name, sizeof(vfd->name), "%s %s",
		 dev->name, type_name);

	return vfd;
}


1903
/*
1904
 * em28xx_init_dev()
1905 1906
 * allocates and inits the device structs, registers i2c bus and v4l device
 */
1907
static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev,
1908
			   int minor)
1909
{
1910
	struct em28xx_ops *ops = NULL;
1911
	struct em28xx *dev = *devhandle;
1912
	int retval = -ENOMEM;
1913
	int errCode;
1914 1915 1916
	unsigned int maxh, maxw;

	dev->udev = udev;
1917
	mutex_init(&dev->lock);
1918
	spin_lock_init(&dev->slock);
1919
	init_waitqueue_head(&dev->open);
1920 1921
	init_waitqueue_head(&dev->wait_frame);
	init_waitqueue_head(&dev->wait_stream);
1922

1923 1924 1925 1926 1927
	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;
1928
	dev->is_em2800 = em28xx_boards[dev->model].is_em2800;
1929

1930 1931 1932 1933
	errCode = em28xx_read_reg(dev, CHIPID_REG);
	if (errCode >= 0)
		em28xx_info("em28xx chip ID = %d\n", errCode);

1934
	em28xx_pre_card_setup(dev);
1935

1936
	errCode = em28xx_config(dev);
1937
	if (errCode) {
1938
		em28xx_errdev("error configuring device\n");
1939
		em28xx_devused &= ~(1<<dev->devno);
1940
		kfree(dev);
1941 1942 1943 1944
		return -ENOMEM;
	}

	/* register i2c bus */
1945
	em28xx_i2c_register(dev);
1946 1947

	/* Do board specific init and eeprom reading */
1948
	em28xx_card_setup(dev);
1949

1950 1951 1952
	/* Configure audio */
	em28xx_audio_analog_set(dev);

1953
	/* configure the device */
1954
	em28xx_config_i2c(dev);
1955

1956 1957
	/* set default norm */
	dev->norm = em28xx_video_template.current_norm;
1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969

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

	/* set default image size */
	dev->width = maxw;
	dev->height = maxh;
	dev->interlaced = EM28XX_INTERLACED_DEFAULT;
	dev->hscale = 0;
	dev->vscale = 0;
	dev->ctl_input = 2;

1970
	errCode = em28xx_config(dev);
1971

1972 1973
	list_add_tail(&dev->devlist, &em28xx_devlist);

1974
	/* allocate and fill video video_device struct */
1975 1976
	dev->vdev = em28xx_vdev_init(dev, &em28xx_video_template,
					  VID_TYPE_CAPTURE, "video");
1977
	if (NULL == dev->vdev) {
1978
		em28xx_errdev("cannot allocate video_device.\n");
1979
		goto fail_unreg;
1980
	}
1981
	if (dev->tuner_type != TUNER_ABSENT)
1982
		dev->vdev->type |= VID_TYPE_TUNER;
1983 1984 1985 1986 1987 1988 1989 1990 1991

	/* register v4l2 video video_device */
	retval = video_register_device(dev->vdev, VFL_TYPE_GRABBER,
				       video_nr[dev->devno]);
	if (retval) {
		em28xx_errdev("unable to register video device (error=%i).\n",
			      retval);
		goto fail_unreg;
	}
1992

1993
	/* Allocate and fill vbi video_device struct */
1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018
	dev->vbi_dev = em28xx_vdev_init(dev, &em28xx_video_template,
					  VFL_TYPE_VBI, "vbi");
	/* register v4l2 vbi video_device */
	if (video_register_device(dev->vbi_dev, VFL_TYPE_VBI,
					vbi_nr[dev->devno]) < 0) {
		em28xx_errdev("unable to register vbi device\n");
		retval = -ENODEV;
		goto fail_unreg;
	}

	if (em28xx_boards[dev->model].radio.type == EM28XX_RADIO) {
		dev->radio_dev = em28xx_vdev_init(dev, &em28xx_radio_template,
					VFL_TYPE_RADIO, "radio");
		if (NULL == dev->radio_dev) {
			em28xx_errdev("cannot allocate video_device.\n");
			goto fail_unreg;
		}
		retval = video_register_device(dev->radio_dev, VFL_TYPE_RADIO,
					    radio_nr[dev->devno]);
		if (retval < 0) {
			em28xx_errdev("can't register radio device\n");
			goto fail_unreg;
		}
		em28xx_info("Registered radio device as /dev/radio%d\n",
			    dev->radio_dev->minor & 0x1f);
2019
	}
2020

2021 2022 2023 2024
	/* init video dma queues */
	INIT_LIST_HEAD(&dev->vidq.active);
	INIT_LIST_HEAD(&dev->vidq.queued);

2025

2026 2027 2028 2029 2030 2031 2032
	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);
	}
2033

2034 2035
	video_mux(dev, 0);

2036 2037 2038
	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);
2039

2040 2041 2042 2043 2044 2045 2046 2047 2048
	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);

2049
	return 0;
2050 2051 2052 2053 2054 2055

fail_unreg:
	em28xx_release_resources(dev);
	mutex_unlock(&dev->lock);
	kfree(dev);
	return retval;
2056 2057
}

2058 2059 2060 2061 2062 2063
#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);

2064 2065 2066
	if (dev->has_audio_class)
		request_module("snd-usb-audio");
	else
2067
		request_module("em28xx-alsa");
2068 2069 2070

	if (dev->has_dvb)
		request_module("em28xx-dvb");
2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081
}

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

2082
/*
2083
 * em28xx_usb_probe()
2084 2085
 * checks for supported devices
 */
2086
static int em28xx_usb_probe(struct usb_interface *interface,
2087 2088 2089 2090
			    const struct usb_device_id *id)
{
	const struct usb_endpoint_descriptor *endpoint;
	struct usb_device *udev;
2091
	struct usb_interface *uif;
2092
	struct em28xx *dev = NULL;
2093
	int retval = -ENODEV;
2094
	int i, nr, ifnum;
2095 2096

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

2099
	/* Check to see next free device and mark as used */
2100 2101
	nr = find_first_zero_bit(&em28xx_devused, EM28XX_MAXBOARDS);
	em28xx_devused |= 1<<nr;
2102

2103
	/* Don't register audio interfaces */
2104
	if (interface->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) {
2105
		em28xx_err(DRIVER_NAME " audio device (%04x:%04x): interface %i, class %i\n",
2106 2107
				udev->descriptor.idVendor,
				udev->descriptor.idProduct,
2108 2109
				ifnum,
				interface->altsetting[0].desc.bInterfaceClass);
2110

2111
		em28xx_devused &= ~(1<<nr);
2112
		return -ENODEV;
2113 2114
	}

2115
	em28xx_err(DRIVER_NAME " new video device (%04x:%04x): interface %i, class %i\n",
2116 2117
			udev->descriptor.idVendor,
			udev->descriptor.idProduct,
2118 2119
			ifnum,
			interface->altsetting[0].desc.bInterfaceClass);
2120

2121 2122
	endpoint = &interface->cur_altsetting->endpoint[1].desc;

2123
	/* check if the device has the iso in endpoint at the correct place */
2124 2125
	if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) !=
	    USB_ENDPOINT_XFER_ISOC) {
2126
		em28xx_err(DRIVER_NAME " probing error: endpoint is non-ISO endpoint!\n");
2127
		em28xx_devused &= ~(1<<nr);
2128 2129 2130
		return -ENODEV;
	}
	if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT) {
2131
		em28xx_err(DRIVER_NAME " probing error: endpoint is ISO OUT endpoint!\n");
2132
		em28xx_devused &= ~(1<<nr);
2133 2134 2135
		return -ENODEV;
	}

2136
	if (nr >= EM28XX_MAXBOARDS) {
2137 2138 2139
		printk(DRIVER_NAME ": Supports only %i em28xx boards.\n",
				EM28XX_MAXBOARDS);
		em28xx_devused &= ~(1<<nr);
2140 2141 2142 2143
		return -ENOMEM;
	}

	/* allocate memory for our device state and initialize it */
P
 
Panagiotis Issaris 已提交
2144
	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
2145
	if (dev == NULL) {
2146
		em28xx_err(DRIVER_NAME ": out of memory!\n");
2147
		em28xx_devused &= ~(1<<nr);
2148 2149 2150
		return -ENOMEM;
	}

2151
	snprintf(dev->name, 29, "em28xx #%d", nr);
2152 2153
	dev->devno = nr;
	dev->model = id->driver_info;
2154
	dev->alt   = -1;
2155

2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167
	/* 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");

2168 2169 2170
	/* compute alternate max packet sizes */
	uif = udev->actconfig->interface[0];

2171 2172 2173 2174 2175
	dev->num_alt = uif->num_altsetting;
	em28xx_info("Alternate settings: %i\n", dev->num_alt);
/*	dev->alt_max_pkt_size = kmalloc(sizeof(*dev->alt_max_pkt_size)* */
	dev->alt_max_pkt_size = kmalloc(32 * dev->num_alt, GFP_KERNEL);

2176
	if (dev->alt_max_pkt_size == NULL) {
2177
		em28xx_errdev("out of memory!\n");
2178
		em28xx_devused &= ~(1<<nr);
2179
		kfree(dev);
2180 2181 2182 2183 2184 2185 2186 2187
		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);
2188 2189
		em28xx_info("Alternate setting %i, max size= %i\n", i,
						dev->alt_max_pkt_size[i]);
2190 2191
	}

2192
	if ((card[nr] >= 0) && (card[nr] < em28xx_bcount))
2193
		dev->model = card[nr];
2194

2195
	/* allocate device struct */
2196
	retval = em28xx_init_dev(&dev, udev, nr);
2197 2198 2199
	if (retval)
		return retval;

2200
	em28xx_info("Found %s\n", em28xx_boards[dev->model].name);
2201 2202 2203

	/* save our data pointer in this interface device */
	usb_set_intfdata(interface, dev);
2204 2205 2206

	request_modules(dev);

2207 2208 2209 2210
	return 0;
}

/*
2211
 * em28xx_usb_disconnect()
2212 2213 2214
 * called when the device gets diconencted
 * video device will be unregistered on v4l2_close in case it is still open
 */
2215
static void em28xx_usb_disconnect(struct usb_interface *interface)
2216
{
2217
	struct em28xx *dev;
2218
	struct em28xx_ops *ops = NULL;
2219 2220

	dev = usb_get_intfdata(interface);
2221 2222 2223 2224 2225
	usb_set_intfdata(interface, NULL);

	if (!dev)
		return;

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

2228 2229
	/* wait until all current v4l2 io is finished then deallocate
	   resources */
2230
	mutex_lock(&dev->lock);
2231 2232 2233 2234

	wake_up_interruptible_all(&dev->open);

	if (dev->users) {
2235
		em28xx_warn
2236
		    ("device /dev/video%d is open! Deregistration and memory "
2237 2238 2239
		     "deallocation are deferred on close.\n",
				dev->vdev->minor-MINOR_VFL_TYPE_GRABBER_MIN);

2240
		dev->state |= DEV_MISCONFIGURED;
2241
		em28xx_uninit_isoc(dev);
2242 2243 2244 2245 2246
		dev->state |= DEV_DISCONNECTED;
		wake_up_interruptible(&dev->wait_frame);
		wake_up_interruptible(&dev->wait_stream);
	} else {
		dev->state |= DEV_DISCONNECTED;
2247
		em28xx_release_resources(dev);
2248
	}
2249
	mutex_unlock(&dev->lock);
2250

2251 2252 2253 2254 2255 2256 2257 2258
	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);

2259 2260
	if (!dev->users) {
		kfree(dev->alt_max_pkt_size);
2261
		kfree(dev);
2262
	}
2263 2264
}

2265 2266 2267 2268 2269
static struct usb_driver em28xx_usb_driver = {
	.name = "em28xx",
	.probe = em28xx_usb_probe,
	.disconnect = em28xx_usb_disconnect,
	.id_table = em28xx_id_table,
2270 2271
};

2272
static int __init em28xx_module_init(void)
2273 2274 2275 2276
{
	int result;

	printk(KERN_INFO DRIVER_NAME " v4l2 driver version %d.%d.%d loaded\n",
2277 2278
	       (EM28XX_VERSION_CODE >> 16) & 0xff,
	       (EM28XX_VERSION_CODE >> 8) & 0xff, EM28XX_VERSION_CODE & 0xff);
2279 2280 2281 2282 2283 2284
#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 */
2285
	result = usb_register(&em28xx_usb_driver);
2286
	if (result)
2287
		em28xx_err(DRIVER_NAME
2288 2289 2290 2291 2292
			   " usb_register failed. Error number %d.\n", result);

	return result;
}

2293
static void __exit em28xx_module_exit(void)
2294 2295
{
	/* deregister this driver with the USB subsystem */
2296
	usb_deregister(&em28xx_usb_driver);
2297 2298
}

2299 2300
module_init(em28xx_module_init);
module_exit(em28xx_module_exit);