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

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

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

12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

#include <linux/init.h>
#include <linux/list.h>
#include <linux/module.h>
#include <linux/kernel.h>
31
#include <linux/bitmap.h>
32 33
#include <linux/usb.h>
#include <linux/i2c.h>
34
#include <linux/version.h>
35
#include <linux/mm.h>
36
#include <linux/video_decoder.h>
37
#include <linux/mutex.h>
38

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

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

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

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

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

61
static LIST_HEAD(em28xx_devlist);
62

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

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

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

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

#define TVNORMS ARRAY_SIZE(tvnorms)

/* supported controls */
104
/* Common to all boards */
105
static struct v4l2_queryctrl em28xx_qctrl[] = {
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
	{
		.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,
	}
};

127
static struct usb_driver em28xx_usb_driver;
128 129 130 131 132


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

/*
133
 * em28xx_config()
134 135
 * inits registers with sane defaults
 */
136
static int em28xx_config(struct em28xx *dev)
137 138 139
{

	/* Sets I2C speed to 100 KHz */
140 141
	if (!dev->is_em2800)
		em28xx_write_regs_req(dev, 0x00, 0x06, "\x40", 1);
142 143

	/* enable vbi capturing */
144

145 146
/*	em28xx_write_regs_req(dev,0x00,0x0e,"\xC0",1); audio register */
/*	em28xx_write_regs_req(dev,0x00,0x0f,"\x80",1); clk register */
147 148
	em28xx_write_regs_req(dev,0x00,0x11,"\x51",1);

149
	em28xx_audio_usb_mute(dev, 1);
150 151
	dev->mute = 1;		/* maybe not the right place... */
	dev->volume = 0x1f;
152 153 154 155 156
	em28xx_audio_analog_set(dev);
	em28xx_audio_analog_setup(dev);
	em28xx_outfmt_set_yuv422(dev);
	em28xx_colorlevels_set_default(dev);
	em28xx_compression_disable(dev);
157 158 159 160 161

	return 0;
}

/*
162
 * em28xx_config_i2c()
163 164
 * configure i2c attached devices
 */
165
static void em28xx_config_i2c(struct em28xx *dev)
166
{
167 168 169 170
	struct v4l2_routing route;

	route.input = INPUT(dev->ctl_input)->vmux;
	route.output = 0;
A
Al Viro 已提交
171
	em28xx_i2c_call_clients(dev, VIDIOC_INT_RESET, NULL);
172
	em28xx_i2c_call_clients(dev, VIDIOC_INT_S_VIDEO_ROUTING, &route);
173
	em28xx_i2c_call_clients(dev, VIDIOC_STREAMON, NULL);
174 175 176
}

/*
177
 * em28xx_empty_framequeues()
178 179
 * prepare queues for incoming and outgoing frames
 */
180
static void em28xx_empty_framequeues(struct em28xx *dev)
181 182 183 184 185 186
{
	u32 i;

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

187
	for (i = 0; i < EM28XX_NUM_FRAMES; i++) {
188 189 190 191 192
		dev->frame[i].state = F_UNUSED;
		dev->frame[i].buf.bytesused = 0;
	}
}

193 194
static void video_mux(struct em28xx *dev, int index)
{
195 196
	int ainput;
	struct v4l2_routing route;
197

198 199
	route.input = INPUT(index)->vmux;
	route.output = 0;
200 201 202
	dev->ctl_input = index;
	dev->ctl_ainput = INPUT(index)->amux;

203
	em28xx_i2c_call_clients(dev, VIDIOC_INT_S_VIDEO_ROUTING, &route);
204

205
	em28xx_videodbg("Setting input index=%d, vmux=%d, amux=%d\n",index,route.input,dev->ctl_ainput);
206 207

	if (dev->has_msp34xx) {
208 209
		if (dev->i2s_speed)
			em28xx_i2c_call_clients(dev, VIDIOC_INT_I2S_CLOCK_FREQ, &dev->i2s_speed);
210
		route.input = dev->ctl_ainput;
211
		route.output = MSP_OUTPUT(MSP_SC_IN_DSP_SCART1);
212 213
		/* Note: this is msp3400 specific */
		em28xx_i2c_call_clients(dev, VIDIOC_INT_S_AUDIO_ROUTING, &route);
214 215 216 217
		ainput = EM28XX_AUDIO_SRC_TUNER;
		em28xx_audio_source(dev, ainput);
	} else {
		switch (dev->ctl_ainput) {
218 219 220 221 222
			case 0:
				ainput = EM28XX_AUDIO_SRC_TUNER;
				break;
			default:
				ainput = EM28XX_AUDIO_SRC_LINE;
223 224 225 226 227
		}
		em28xx_audio_source(dev, ainput);
	}
}

228
/*
229
 * em28xx_v4l2_open()
230 231
 * inits the device and starts isoc transfer
 */
232
static int em28xx_v4l2_open(struct inode *inode, struct file *filp)
233 234 235
{
	int minor = iminor(inode);
	int errCode = 0;
236
	struct em28xx *h,*dev = NULL;
237

238
	list_for_each_entry(h, &em28xx_devlist, devlist) {
239 240
		if (h->vdev->minor == minor) {
			dev  = h;
241 242 243 244 245
			dev->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
		}
		if (h->vbi_dev->minor == minor) {
			dev  = h;
			dev->type = V4L2_BUF_TYPE_VBI_CAPTURE;
246 247
		}
	}
248 249
	if (NULL == dev)
		return -ENODEV;
250

251 252
	em28xx_videodbg("open minor=%d type=%s users=%d\n",
				minor,v4l2_type_names[dev->type],dev->users);
253

254
	mutex_lock(&dev->lock);
255 256

	if (dev->users) {
257
		em28xx_warn("this driver can be opened only once\n");
258
		mutex_unlock(&dev->lock);
259 260 261 262 263 264 265
		return -EBUSY;
	}

	spin_lock_init(&dev->queue_lock);
	init_waitqueue_head(&dev->wait_frame);
	init_waitqueue_head(&dev->wait_stream);

266 267
	if (dev->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
		em28xx_set_alternate(dev);
268

269 270 271 272 273 274 275
		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;
276

277 278
		em28xx_capture_start(dev, 1);
		em28xx_resolution_set(dev);
279

280 281 282
		/* device needs to be initialized before isoc transfer */
		video_mux(dev, 0);

283 284 285 286 287 288
		/* start the transfer */
		errCode = em28xx_init_isoc(dev);
		if (errCode)
			goto err;

	}
289 290 291 292 293 294 295 296

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

	/* prepare queues */
297
	em28xx_empty_framequeues(dev);
298 299 300

	dev->state |= DEV_INITIALIZED;

301 302
err:
	mutex_unlock(&dev->lock);
303 304 305 306
	return errCode;
}

/*
307
 * em28xx_realease_resources()
308 309 310
 * unregisters the v4l2,i2c and usb devices
 * called when the device gets disconected or at module unload
*/
311
static void em28xx_release_resources(struct em28xx *dev)
312 313
{

314 315 316 317 318
	/*FIXME: I2C IR should be disconnected */

	em28xx_info("V4L2 devices /dev/video%d and /dev/vbi%d deregistered\n",
				dev->vdev->minor-MINOR_VFL_TYPE_GRABBER_MIN,
				dev->vbi_dev->minor-MINOR_VFL_TYPE_VBI_MIN);
319
	list_del(&dev->devlist);
320
	video_unregister_device(dev->vdev);
321
	video_unregister_device(dev->vbi_dev);
322
	em28xx_i2c_unregister(dev);
323
	usb_put_dev(dev->udev);
324 325 326 327


	/* Mark device as unused */
	em28xx_devused&=~(1<<dev->devno);
328 329 330
}

/*
331
 * em28xx_v4l2_close()
332 333
 * stops streaming and deallocates all resources allocated by the v4l2 calls and ioctls
 */
334
static int em28xx_v4l2_close(struct inode *inode, struct file *filp)
335 336
{
	int errCode;
337
	struct em28xx *dev=filp->private_data;
338

339
	em28xx_videodbg("users=%d\n", dev->users);
340

341
	mutex_lock(&dev->lock);
342

343
	em28xx_uninit_isoc(dev);
344

345
	em28xx_release_buffers(dev);
346 347 348

	/* the device is already disconnect, free the remaining resources */
	if (dev->state & DEV_DISCONNECTED) {
349
		em28xx_release_resources(dev);
350
		mutex_unlock(&dev->lock);
351 352 353 354 355 356
		kfree(dev);
		return 0;
	}

	/* set alternate 0 */
	dev->alt = 0;
357
	em28xx_videodbg("setting alternate 0\n");
358 359
	errCode = usb_set_interface(dev->udev, 0, 0);
	if (errCode < 0) {
360
		em28xx_errdev ("cannot change alternate number to 0 (error=%i)\n",
361 362 363 364 365
		     errCode);
	}

	dev->users--;
	wake_up_interruptible_nr(&dev->open, 1);
366
	mutex_unlock(&dev->lock);
367 368 369 370
	return 0;
}

/*
371
 * em28xx_v4l2_read()
372 373 374
 * will allocate buffers when called for the first time
 */
static ssize_t
375
em28xx_v4l2_read(struct file *filp, char __user * buf, size_t count,
376 377
		 loff_t * f_pos)
{
378
	struct em28xx_frame_t *f, *i;
379 380
	unsigned long lock_flags;
	int ret = 0;
381
	struct em28xx *dev = filp->private_data;
382

383 384
	mutex_lock(&dev->lock);

385 386 387 388 389 390 391
	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)) {
392
			mutex_unlock(&dev->lock);
393 394
			return -EFAULT;
		}
395
		mutex_unlock(&dev->lock);
396 397 398 399 400 401
		return (1);
	}
	if (dev->type == V4L2_BUF_TYPE_SLICED_VBI_CAPTURE) {
		em28xx_videodbg("V4L2_BUF_TYPE_SLICED_VBI_CAPTURE is set\n");
		em28xx_videodbg("not supported yet! ...\n");
		if (copy_to_user(buf, "", 1)) {
402
			mutex_unlock(&dev->lock);
403 404
			return -EFAULT;
		}
405
		mutex_unlock(&dev->lock);
406 407 408
		return (1);
	}

409
	if (dev->state & DEV_DISCONNECTED) {
410
		em28xx_videodbg("device not present\n");
411
		mutex_unlock(&dev->lock);
412 413 414 415
		return -ENODEV;
	}

	if (dev->state & DEV_MISCONFIGURED) {
416
		em28xx_videodbg("device misconfigured; close and open it again\n");
417
		mutex_unlock(&dev->lock);
418 419 420 421
		return -EIO;
	}

	if (dev->io == IO_MMAP) {
422
		em28xx_videodbg ("IO method is set to mmap; close and open"
423
				" the device again to choose the read method\n");
424
		mutex_unlock(&dev->lock);
425 426 427 428
		return -EINVAL;
	}

	if (dev->io == IO_NONE) {
429 430
		if (!em28xx_request_buffers(dev, EM28XX_NUM_READ_FRAMES)) {
			em28xx_errdev("read failed, not enough memory\n");
431
			mutex_unlock(&dev->lock);
432 433 434 435
			return -ENOMEM;
		}
		dev->io = IO_READ;
		dev->stream = STREAM_ON;
436
		em28xx_queue_unusedframes(dev);
437 438 439
	}

	if (!count) {
440
		mutex_unlock(&dev->lock);
441 442 443 444 445
		return 0;
	}

	if (list_empty(&dev->outqueue)) {
		if (filp->f_flags & O_NONBLOCK) {
446
			mutex_unlock(&dev->lock);
447 448 449 450 451 452 453
			return -EAGAIN;
		}
		ret = wait_event_interruptible
		    (dev->wait_frame,
		     (!list_empty(&dev->outqueue)) ||
		     (dev->state & DEV_DISCONNECTED));
		if (ret) {
454
			mutex_unlock(&dev->lock);
455 456 457
			return ret;
		}
		if (dev->state & DEV_DISCONNECTED) {
458
			mutex_unlock(&dev->lock);
459 460 461 462
			return -ENODEV;
		}
	}

463
	f = list_entry(dev->outqueue.prev, struct em28xx_frame_t, frame);
464 465 466 467 468 469 470

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

471
	em28xx_queue_unusedframes(dev);
472 473 474 475 476

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

	if (copy_to_user(buf, f->bufmem, count)) {
477
		mutex_unlock(&dev->lock);
478 479 480 481
		return -EFAULT;
	}
	*f_pos += count;

482
	mutex_unlock(&dev->lock);
483 484 485 486 487

	return count;
}

/*
488
 * em28xx_v4l2_poll()
489 490
 * will allocate buffers when called for the first time
 */
491
static unsigned int em28xx_v4l2_poll(struct file *filp, poll_table * wait)
492 493
{
	unsigned int mask = 0;
494
	struct em28xx *dev = filp->private_data;
495

496
	mutex_lock(&dev->lock);
497 498

	if (dev->state & DEV_DISCONNECTED) {
499
		em28xx_videodbg("device not present\n");
500
	} else if (dev->state & DEV_MISCONFIGURED) {
501
		em28xx_videodbg("device is misconfigured; close and open it again\n");
502 503
	} else {
		if (dev->io == IO_NONE) {
504 505 506
			if (!em28xx_request_buffers
			    (dev, EM28XX_NUM_READ_FRAMES)) {
				em28xx_warn
507 508 509 510 511 512 513 514
				    ("poll() failed, not enough memory\n");
			} else {
				dev->io = IO_READ;
				dev->stream = STREAM_ON;
			}
		}

		if (dev->io == IO_READ) {
515
			em28xx_queue_unusedframes(dev);
516 517 518 519 520
			poll_wait(filp, &dev->wait_frame, wait);

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

521
			mutex_unlock(&dev->lock);
522 523 524 525 526

			return mask;
		}
	}

527
	mutex_unlock(&dev->lock);
528 529 530 531
	return POLLERR;
}

/*
532
 * em28xx_vm_open()
533
 */
534
static void em28xx_vm_open(struct vm_area_struct *vma)
535
{
536
	struct em28xx_frame_t *f = vma->vm_private_data;
537 538 539 540
	f->vma_use_count++;
}

/*
541
 * em28xx_vm_close()
542
 */
543
static void em28xx_vm_close(struct vm_area_struct *vma)
544 545
{
	/* NOTE: buffers are not freed here */
546
	struct em28xx_frame_t *f = vma->vm_private_data;
547 548 549

	if (f->vma_use_count)
		f->vma_use_count--;
550 551
}

552 553 554
static struct vm_operations_struct em28xx_vm_ops = {
	.open = em28xx_vm_open,
	.close = em28xx_vm_close,
555 556 557
};

/*
558
 * em28xx_v4l2_mmap()
559
 */
560
static int em28xx_v4l2_mmap(struct file *filp, struct vm_area_struct *vma)
561 562
{
	unsigned long size = vma->vm_end - vma->vm_start,
563 564
	    start = vma->vm_start;
	void *pos;
565
	u32 i;
566

567
	struct em28xx *dev = filp->private_data;
568

569
	mutex_lock(&dev->lock);
570 571

	if (dev->state & DEV_DISCONNECTED) {
572
		em28xx_videodbg("mmap: device not present\n");
573
		mutex_unlock(&dev->lock);
574 575 576 577
		return -ENODEV;
	}

	if (dev->state & DEV_MISCONFIGURED) {
578
		em28xx_videodbg ("mmap: Device is misconfigured; close and "
579
						"open it again\n");
580
		mutex_unlock(&dev->lock);
581 582 583 584 585
		return -EIO;
	}

	if (dev->io != IO_MMAP || !(vma->vm_flags & VM_WRITE) ||
	    size != PAGE_ALIGN(dev->frame[0].buf.length)) {
586
		mutex_unlock(&dev->lock);
587 588 589 590 591 592 593 594
		return -EINVAL;
	}

	for (i = 0; i < dev->num_frames; i++) {
		if ((dev->frame[i].buf.m.offset >> PAGE_SHIFT) == vma->vm_pgoff)
			break;
	}
	if (i == dev->num_frames) {
595
		em28xx_videodbg("mmap: user supplied mapping address is out of range\n");
596
		mutex_unlock(&dev->lock);
597 598 599 600 601 602 603
		return -EINVAL;
	}

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

604
	pos = dev->frame[i].bufmem;
605
	while (size > 0) {	/* size is page-aligned */
606 607
		if (vm_insert_page(vma, start, vmalloc_to_page(pos))) {
			em28xx_videodbg("mmap: vm_insert_page failed\n");
608
			mutex_unlock(&dev->lock);
609 610 611 612 613 614 615
			return -EAGAIN;
		}
		start += PAGE_SIZE;
		pos += PAGE_SIZE;
		size -= PAGE_SIZE;
	}

616
	vma->vm_ops = &em28xx_vm_ops;
617 618
	vma->vm_private_data = &dev->frame[i];

619
	em28xx_vm_open(vma);
620
	mutex_unlock(&dev->lock);
621 622 623 624
	return 0;
}

/*
625
 * em28xx_get_ctrl()
626 627
 * return the current saturation, brightness or contrast, mute state
 */
628
static int em28xx_get_ctrl(struct em28xx *dev, struct v4l2_control *ctrl)
629 630 631 632 633 634 635 636
{
	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;
637 638 639 640 641
	default:
		return -EINVAL;
	}
}

642
/*
643
 * em28xx_set_ctrl()
644 645
 * mute or set new saturation, brightness or contrast
 */
646
static int em28xx_set_ctrl(struct em28xx *dev, const struct v4l2_control *ctrl)
647 648 649 650 651
{
	switch (ctrl->id) {
	case V4L2_CID_AUDIO_MUTE:
		if (ctrl->value != dev->mute) {
			dev->mute = ctrl->value;
652 653
			em28xx_audio_usb_mute(dev, ctrl->value);
			return em28xx_audio_analog_set(dev);
654 655 656 657
		}
		return 0;
	case V4L2_CID_AUDIO_VOLUME:
		dev->volume = ctrl->value;
658
		return em28xx_audio_analog_set(dev);
659 660 661 662 663
	default:
		return -EINVAL;
	}
}

664
/*
665
 * em28xx_stream_interrupt()
666 667
 * stops streaming
 */
668
static int em28xx_stream_interrupt(struct em28xx *dev)
669 670 671 672 673 674 675 676 677
{
	int ret = 0;

	/* stop reading from the device */

	dev->stream = STREAM_INTERRUPT;
	ret = wait_event_timeout(dev->wait_stream,
				 (dev->stream == STREAM_OFF) ||
				 (dev->state & DEV_DISCONNECTED),
678
				 EM28XX_URB_TIMEOUT);
679 680 681 682
	if (dev->state & DEV_DISCONNECTED)
		return -ENODEV;
	else if (ret) {
		dev->state |= DEV_MISCONFIGURED;
683
		em28xx_videodbg("device is misconfigured; close and "
684 685
			"open /dev/video%d again\n",
				dev->vdev->minor-MINOR_VFL_TYPE_GRABBER_MIN);
686 687 688 689 690 691
		return ret;
	}

	return 0;
}

692
static int em28xx_set_norm(struct em28xx *dev, int width, int height)
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 729 730
{
	unsigned int hscale, vscale;
	unsigned int maxh, maxw;

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

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

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

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

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

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

731
	em28xx_resolution_set(dev);
732 733 734 735

	return 0;
}

736 737 738 739 740 741 742 743 744 745 746
static int em28xx_get_fmt(struct em28xx *dev, struct v4l2_format *format)
{
	em28xx_videodbg("VIDIOC_G_FMT: type=%s\n",
		(format->type ==V4L2_BUF_TYPE_VIDEO_CAPTURE) ?
		"V4L2_BUF_TYPE_VIDEO_CAPTURE" :
		(format->type ==V4L2_BUF_TYPE_VBI_CAPTURE) ?
		"V4L2_BUF_TYPE_VBI_CAPTURE" :
		(format->type ==V4L2_CAP_SLICED_VBI_CAPTURE) ?
		"V4L2_BUF_TYPE_SLICED_VBI_CAPTURE " :
		"not supported");

747 748 749
	switch (format->type) {
	case V4L2_BUF_TYPE_VIDEO_CAPTURE:
	{
750 751 752 753 754 755 756 757 758 759
		format->fmt.pix.width = dev->width;
		format->fmt.pix.height = dev->height;
		format->fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
		format->fmt.pix.bytesperline = dev->bytesperline;
		format->fmt.pix.sizeimage = dev->frame_size;
		format->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
		format->fmt.pix.field = dev->interlaced ? V4L2_FIELD_INTERLACED : V4L2_FIELD_TOP;	/* FIXME: TOP? NONE? BOTTOM? ALTENATE? */

		em28xx_videodbg("VIDIOC_G_FMT: %dx%d\n", dev->width,
			dev->height);
760
		break;
761 762
	}

763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778
	case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
	{
		format->fmt.sliced.service_set=0;

		em28xx_i2c_call_clients(dev,VIDIOC_G_FMT,format);

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

		break;
	}

	default:
		return -EINVAL;
	}
	return (0);
779 780
}

781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850
static int em28xx_set_fmt(struct em28xx *dev, unsigned int cmd, struct v4l2_format *format)
{
	u32 i;
	int ret = 0;
	int width = format->fmt.pix.width;
	int height = format->fmt.pix.height;
	unsigned int hscale, vscale;
	unsigned int maxh, maxw;

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

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

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

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

		return 0;
	}


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

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

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

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

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

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

854 855 856
	width = (((unsigned long)maxw) << 12) / (hscale + 4096L);

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

	height = (((unsigned long)maxh) << 12) / (vscale + 4096L);
860 861 862 863 864 865 866 867 868 869

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

	em28xx_videodbg("%s: returned %dx%d (%d, %d)\n",
870 871 872
		cmd == VIDIOC_TRY_FMT ?
		"VIDIOC_TRY_FMT" :"VIDIOC_S_FMT",
		format->fmt.pix.width, format->fmt.pix.height, hscale, vscale);
873 874 875 876 877 878 879 880 881 882 883 884 885

	if (cmd == VIDIOC_TRY_FMT)
		return 0;

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

	/* stop io in case it is already in progress */
	if (dev->stream == STREAM_ON) {
886
		em28xx_videodbg("VIDIOC_SET_FMT: interrupting stream\n");
887 888 889 890 891 892 893 894 895 896 897
		if ((ret = em28xx_stream_interrupt(dev)))
			return ret;
	}

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

	/* set new image size */
	dev->width = width;
	dev->height = height;
	dev->frame_size = dev->width * dev->height * 2;
898
	dev->field_size = dev->frame_size >> 1;
899 900 901 902 903 904 905 906 907 908 909
	dev->bytesperline = dev->width * 2;
	dev->hscale = hscale;
	dev->vscale = vscale;
	em28xx_uninit_isoc(dev);
	em28xx_set_alternate(dev);
	em28xx_capture_start(dev, 1);
	em28xx_resolution_set(dev);
	em28xx_init_isoc(dev);

	return 0;
}
910

911
/*
912
 * em28xx_v4l2_do_ioctl()
913
 * This function is _not_ called directly, but from
914
 * em28xx_v4l2_ioctl. Userspace
915 916
 * copying is done already, arg is a kernel pointer.
 */
917 918
static int em28xx_do_ioctl(struct inode *inode, struct file *filp,
			   struct em28xx *dev, unsigned int cmd, void *arg,
919 920 921 922 923 924 925
			   v4l2_kioctl driver_ioctl)
{
	int ret;

	switch (cmd) {
		/* ---------- tv norms ---------- */
	case VIDIOC_ENUMSTD:
926 927 928
	{
		struct v4l2_standard *e = arg;
		unsigned int i;
929

930 931 932 933 934 935 936 937 938 939
		i = e->index;
		if (i >= TVNORMS)
			return -EINVAL;
		ret = v4l2_video_std_construct(e, tvnorms[e->index].id,
						tvnorms[e->index].name);
		e->index = i;
		if (ret < 0)
			return ret;
		return 0;
	}
940
	case VIDIOC_G_STD:
941 942
	{
		v4l2_std_id *id = arg;
943

944 945 946
		*id = dev->tvnorm->id;
		return 0;
	}
947
	case VIDIOC_S_STD:
948 949 950
	{
		v4l2_std_id *id = arg;
		unsigned int i;
951

952 953 954 955
		for (i = 0; i < TVNORMS; i++)
			if (*id == tvnorms[i].id)
				break;
		if (i == TVNORMS)
956
			for (i = 0; i < TVNORMS; i++)
957
				if (*id & tvnorms[i].id)
958
					break;
959 960
		if (i == TVNORMS)
			return -EINVAL;
961

962
		mutex_lock(&dev->lock);
963
		dev->tvnorm = &tvnorms[i];
964

965
		em28xx_set_norm(dev, dev->width, dev->height);
966

967 968
		em28xx_i2c_call_clients(dev, VIDIOC_S_STD,
					&dev->tvnorm->id);
969

970
		mutex_unlock(&dev->lock);
971

972 973
		return 0;
	}
974

975
	/* ------ input switching ---------- */
976
	case VIDIOC_ENUMINPUT:
977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007
	{
		struct v4l2_input *i = arg;
		unsigned int n;
		static const char *iname[] = {
			[EM28XX_VMUX_COMPOSITE1] = "Composite1",
			[EM28XX_VMUX_COMPOSITE2] = "Composite2",
			[EM28XX_VMUX_COMPOSITE3] = "Composite3",
			[EM28XX_VMUX_COMPOSITE4] = "Composite4",
			[EM28XX_VMUX_SVIDEO] = "S-Video",
			[EM28XX_VMUX_TELEVISION] = "Television",
			[EM28XX_VMUX_CABLE] = "Cable TV",
			[EM28XX_VMUX_DVB] = "DVB",
			[EM28XX_VMUX_DEBUG] = "for debug only",
		};

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

1013 1014
		return 0;
	}
1015
	case VIDIOC_S_INPUT:
1016 1017
	{
		int *index = arg;
1018

1019 1020 1021 1022
		if (*index >= MAX_EM28XX_INPUT)
			return -EINVAL;
		if (0 == INPUT(*index)->type)
			return -EINVAL;
1023

1024
		mutex_lock(&dev->lock);
1025
		video_mux(dev, *index);
1026
		mutex_unlock(&dev->lock);
1027

1028 1029
		return 0;
	}
1030
	case VIDIOC_G_AUDIO:
1031 1032 1033
	{
		struct v4l2_audio *a = arg;
		unsigned int index = a->index;
1034

1035 1036 1037 1038
		if (a->index > 1)
			return -EINVAL;
		memset(a, 0, sizeof(*a));
		index = dev->ctl_ainput;
1039

1040 1041 1042 1043
		if (index == 0) {
			strcpy(a->name, "Television");
		} else {
			strcpy(a->name, "Line In");
1044
		}
1045 1046 1047 1048
		a->capability = V4L2_AUDCAP_STEREO;
		a->index = index;
		return 0;
	}
1049
	case VIDIOC_S_AUDIO:
1050 1051
	{
		struct v4l2_audio *a = arg;
1052

1053 1054 1055 1056 1057
		if (a->index != dev->ctl_ainput)
			return -EINVAL;

		return 0;
	}
1058

1059
	/* --- controls ---------------------------------------------- */
1060
	case VIDIOC_QUERYCTRL:
1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072
	{
		struct v4l2_queryctrl *qc = arg;
		int i, id=qc->id;

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

		if (!dev->has_msp34xx) {
			for (i = 0; i < ARRAY_SIZE(em28xx_qctrl); i++) {
				if (qc->id && qc->id == em28xx_qctrl[i].id) {
					memcpy(qc, &(em28xx_qctrl[i]),
					sizeof(*qc));
1073 1074
					return 0;
				}
1075
			}
1076
		}
1077
		mutex_lock(&dev->lock);
1078
		em28xx_i2c_call_clients(dev,cmd,qc);
1079
		mutex_unlock(&dev->lock);
1080 1081 1082 1083
		if (qc->type)
			return 0;
		else
			return -EINVAL;
1084
	}
1085
	case VIDIOC_G_CTRL:
1086 1087 1088
	{
		struct v4l2_control *ctrl = arg;
		int retval=-EINVAL;
1089

1090 1091 1092
		if (!dev->has_msp34xx)
			retval=em28xx_get_ctrl(dev, ctrl);
		if (retval==-EINVAL) {
1093
			mutex_lock(&dev->lock);
1094
			em28xx_i2c_call_clients(dev,cmd,arg);
1095
			mutex_unlock(&dev->lock);
1096
			return 0;
1097 1098
		} else return retval;
	}
1099
	case VIDIOC_S_CTRL:
1100 1101 1102
	{
		struct v4l2_control *ctrl = arg;
		u8 i;
1103
		mutex_lock(&dev->lock);
1104 1105 1106 1107

		if (!dev->has_msp34xx){
			for (i = 0; i < ARRAY_SIZE(em28xx_qctrl); i++) {
				if (ctrl->id == em28xx_qctrl[i].id) {
1108
					int retval=-EINVAL;
1109 1110 1111 1112 1113
					if (ctrl->value <
					em28xx_qctrl[i].minimum
					|| ctrl->value >
					em28xx_qctrl[i].maximum)
						return -ERANGE;
1114 1115 1116
					retval = em28xx_set_ctrl(dev, ctrl);
					mutex_unlock(&dev->lock);
					return retval;
1117 1118
				}
			}
1119
		}
1120

1121
		em28xx_i2c_call_clients(dev,cmd,arg);
1122
		mutex_unlock(&dev->lock);
1123
		return 0;
1124 1125
	}
	/* --- tuner ioctls ------------------------------------------ */
1126
	case VIDIOC_G_TUNER:
1127 1128
	{
		struct v4l2_tuner *t = arg;
1129

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

1133 1134
		memset(t, 0, sizeof(*t));
		strcpy(t->name, "Tuner");
1135
		mutex_lock(&dev->lock);
1136 1137
		/* let clients fill in the remainder of this struct */
		em28xx_i2c_call_clients(dev, cmd, t);
1138
		mutex_unlock(&dev->lock);
1139 1140 1141 1142
		em28xx_videodbg("VIDIO_G_TUNER: signal=%x, afc=%x\n", t->signal,
				t->afc);
		return 0;
	}
1143
	case VIDIOC_S_TUNER:
1144 1145
	{
		struct v4l2_tuner *t = arg;
1146

1147 1148
		if (0 != t->index)
			return -EINVAL;
1149
		mutex_lock(&dev->lock);
1150 1151
		/* let clients handle this */
		em28xx_i2c_call_clients(dev, cmd, t);
1152
		mutex_unlock(&dev->lock);
1153 1154
		return 0;
	}
1155
	case VIDIOC_G_FREQUENCY:
1156 1157
	{
		struct v4l2_frequency *f = arg;
1158

1159 1160 1161
		memset(f, 0, sizeof(*f));
		f->type = V4L2_TUNER_ANALOG_TV;
		f->frequency = dev->ctl_freq;
1162

1163 1164
		return 0;
	}
1165
	case VIDIOC_S_FREQUENCY:
1166 1167
	{
		struct v4l2_frequency *f = arg;
1168

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

1172 1173
		if (V4L2_TUNER_ANALOG_TV != f->type)
			return -EINVAL;
1174

1175
		mutex_lock(&dev->lock);
1176 1177
		dev->ctl_freq = f->frequency;
		em28xx_i2c_call_clients(dev, VIDIOC_S_FREQUENCY, f);
1178
		mutex_unlock(&dev->lock);
1179 1180
		return 0;
	}
1181
	case VIDIOC_CROPCAP:
1182 1183
	{
		struct v4l2_cropcap *cc = arg;
1184

1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195
		if (cc->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
			return -EINVAL;
		cc->bounds.left = 0;
		cc->bounds.top = 0;
		cc->bounds.width = dev->width;
		cc->bounds.height = dev->height;
		cc->defrect = cc->bounds;
		cc->pixelaspect.numerator = 54;	/* 4:3 FIXME: remove magic numbers */
		cc->pixelaspect.denominator = 59;
		return 0;
	}
1196
	case VIDIOC_STREAMON:
1197 1198
	{
		int *type = arg;
1199

1200 1201 1202
		if (*type != V4L2_BUF_TYPE_VIDEO_CAPTURE
			|| dev->io != IO_MMAP)
			return -EINVAL;
1203

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

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

1209
		em28xx_videodbg("VIDIOC_STREAMON: starting stream\n");
1210

1211 1212
		return 0;
	}
1213
	case VIDIOC_STREAMOFF:
1214 1215 1216
	{
		int *type = arg;
		int ret;
1217

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

1222
		mutex_lock(&dev->lock);
1223 1224
		if (dev->stream == STREAM_ON) {
			em28xx_videodbg ("VIDIOC_STREAMOFF: interrupting stream\n");
1225 1226
			if ((ret = em28xx_stream_interrupt(dev))){
				mutex_unlock(&dev->lock);
1227
				return ret;
1228
			}
1229
		}
1230
		em28xx_empty_framequeues(dev);
1231
		mutex_unlock(&dev->lock);
1232 1233 1234

		return 0;
	}
1235 1236 1237 1238 1239 1240 1241 1242
	default:
		return v4l_compat_translate_ioctl(inode, filp, cmd, arg,
						  driver_ioctl);
	}
	return 0;
}

/*
1243
 * em28xx_v4l2_do_ioctl()
1244
 * This function is _not_ called directly, but from
1245
 * em28xx_v4l2_ioctl. Userspace
1246 1247
 * copying is done already, arg is a kernel pointer.
 */
1248
static int em28xx_video_do_ioctl(struct inode *inode, struct file *filp,
1249 1250
				 unsigned int cmd, void *arg)
{
1251
	struct em28xx *dev = filp->private_data;
1252 1253 1254 1255 1256

	if (!dev)
		return -ENODEV;

	if (video_debug > 1)
1257
		v4l_print_ioctl(dev->name,cmd);
1258 1259 1260 1261 1262 1263

	switch (cmd) {

		/* --- capabilities ------------------------------------------ */
	case VIDIOC_QUERYCAP:
		{
1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282
		struct v4l2_capability *cap = arg;

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

1287 1288 1289 1290 1291 1292 1293 1294 1295
		if (fmtd->index != 0)
			return -EINVAL;
		memset(fmtd, 0, sizeof(*fmtd));
		fmtd->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
		strcpy(fmtd->description, "Packed YUY2");
		fmtd->pixelformat = V4L2_PIX_FMT_YUYV;
		memset(fmtd->reserved, 0, sizeof(fmtd->reserved));
		return 0;
	}
1296
	case VIDIOC_G_FMT:
1297 1298 1299 1300 1301 1302
	{
		int retval;
		mutex_lock(&dev->lock);
		retval = em28xx_get_fmt(dev, (struct v4l2_format *) arg);
		mutex_unlock(&dev->lock);
		return retval;
1303

1304
	}
1305 1306
	case VIDIOC_TRY_FMT:
	case VIDIOC_S_FMT:
1307 1308 1309 1310 1311 1312 1313
	{
		int retval;
		mutex_lock(&dev->lock);
		retval = em28xx_set_fmt(dev, cmd, (struct v4l2_format *)arg);
		mutex_unlock(&dev->lock);
		return retval;
	}
1314 1315

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

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

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

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

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

1347
		em28xx_empty_framequeues(dev);
1348

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

1354
		dev->frame_current = NULL;
1355

1356 1357 1358
		em28xx_videodbg ("VIDIOC_REQBUFS: setting io method to mmap: num bufs %i\n",
						rb->count);
		dev->io = rb->count ? IO_MMAP : IO_NONE;
1359
		mutex_unlock(&dev->lock);
1360 1361
		return 0;
	}
1362
	case VIDIOC_QUERYBUF:
1363 1364
	{
		struct v4l2_buffer *b = arg;
1365

1366 1367 1368
		if (b->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
			b->index >= dev->num_frames || dev->io != IO_MMAP)
			return -EINVAL;
1369

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

1372 1373
		if (dev->frame[b->index].vma_use_count) {
			b->flags |= V4L2_BUF_FLAG_MAPPED;
1374
		}
1375 1376 1377 1378 1379 1380
		if (dev->frame[b->index].state == F_DONE)
			b->flags |= V4L2_BUF_FLAG_DONE;
		else if (dev->frame[b->index].state != F_UNUSED)
			b->flags |= V4L2_BUF_FLAG_QUEUED;
		return 0;
	}
1381
	case VIDIOC_QBUF:
1382 1383 1384
	{
		struct v4l2_buffer *b = arg;
		unsigned long lock_flags;
1385

1386 1387 1388 1389
		if (b->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
			b->index >= dev->num_frames || dev->io != IO_MMAP) {
			return -EINVAL;
		}
1390

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

1396 1397 1398 1399 1400
		/* 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);
1401

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

1411 1412 1413
		if (b->type != V4L2_BUF_TYPE_VIDEO_CAPTURE
			|| dev->io != IO_MMAP)
			return -EINVAL;
1414

1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428
		if (list_empty(&dev->outqueue)) {
			if (dev->stream == STREAM_OFF)
				return -EINVAL;
			if (filp->f_flags & O_NONBLOCK)
				return -EAGAIN;
			ret = wait_event_interruptible
				(dev->wait_frame,
				(!list_empty(&dev->outqueue)) ||
				(dev->state & DEV_DISCONNECTED));
			if (ret)
				return ret;
			if (dev->state & DEV_DISCONNECTED)
				return -ENODEV;
		}
1429

1430 1431 1432 1433 1434
		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);
1435

1436 1437
		f->state = F_UNUSED;
		memcpy(b, &f->buf, sizeof(*b));
1438

1439 1440
		if (f->vma_use_count)
			b->flags |= V4L2_BUF_FLAG_MAPPED;
1441

1442 1443
		return 0;
	}
1444
	default:
1445 1446
		return em28xx_do_ioctl(inode, filp, dev, cmd, arg,
				       em28xx_video_do_ioctl);
1447 1448 1449 1450 1451
	}
	return 0;
}

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

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

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

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

	return ret;
}

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

1488 1489 1490 1491 1492
};

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

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

	dev->udev = udev;
1505
	mutex_init(&dev->lock);
1506 1507
	init_waitqueue_head(&dev->open);

1508 1509 1510 1511 1512
	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;
1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523

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

1524
	em28xx_pre_card_setup(dev);
1525

1526
	errCode = em28xx_config(dev);
1527
	if (errCode) {
1528
		em28xx_errdev("error configuring device\n");
1529
		em28xx_devused &= ~(1<<dev->devno);
1530
		kfree(dev);
1531 1532 1533 1534
		return -ENOMEM;
	}

	/* register i2c bus */
1535
	em28xx_i2c_register(dev);
1536 1537

	/* Do board specific init and eeprom reading */
1538
	em28xx_card_setup(dev);
1539 1540

	/* configure the device */
1541
	em28xx_config_i2c(dev);
1542

1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567
	for (i = 0; i < TVNORMS; i++)
		if (em28xx_boards[dev->model].norm == tvnorms[i].mode)
			break;
	if (i == TVNORMS)
		i = 0;

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

	em28xx_videodbg("tvnorm=%s\n", dev->tvnorm->name);

	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;

1568
	errCode = em28xx_config(dev);
1569 1570 1571 1572

	/* allocate and fill v4l2 device struct */
	dev->vdev = video_device_alloc();
	if (NULL == dev->vdev) {
1573
		em28xx_errdev("cannot allocate video_device.\n");
1574
		em28xx_devused&=~(1<<dev->devno);
1575
		kfree(dev);
1576 1577 1578 1579 1580 1581 1582 1583
		return -ENOMEM;
	}

	dev->vbi_dev = video_device_alloc();
	if (NULL == dev->vbi_dev) {
		em28xx_errdev("cannot allocate video_device.\n");
		kfree(dev->vdev);
		em28xx_devused&=~(1<<dev->devno);
1584
		kfree(dev);
1585 1586 1587
		return -ENOMEM;
	}

1588 1589 1590 1591 1592 1593 1594 1595 1596 1597
	/* Fills VBI device info */
	dev->vbi_dev->type = VFL_TYPE_VBI;
	dev->vbi_dev->fops = &em28xx_v4l_fops;
	dev->vbi_dev->minor = -1;
	dev->vbi_dev->dev = &dev->udev->dev;
	dev->vbi_dev->release = video_device_release;
	snprintf(dev->vbi_dev->name, sizeof(dev->vbi_dev->name), "%s#%d %s",
							 "em28xx",dev->devno,"vbi");

	/* Fills CAPTURE device info */
1598 1599 1600
	dev->vdev->type = VID_TYPE_CAPTURE;
	if (dev->has_tuner)
		dev->vdev->type |= VID_TYPE_TUNER;
1601
	dev->vdev->fops = &em28xx_v4l_fops;
1602 1603 1604
	dev->vdev->minor = -1;
	dev->vdev->dev = &dev->udev->dev;
	dev->vdev->release = video_device_release;
1605 1606 1607
	snprintf(dev->vdev->name, sizeof(dev->vbi_dev->name), "%s#%d %s",
							 "em28xx",dev->devno,"video");

1608
	list_add_tail(&dev->devlist,&em28xx_devlist);
1609

1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620

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

	}
	video_mux(dev, 0);

1621
	/* register v4l2 device */
1622 1623
	if ((retval = video_register_device(dev->vdev, VFL_TYPE_GRABBER,
					 video_nr[dev->devno]))) {
1624
		em28xx_errdev("unable to register video device (error=%i).\n",
1625
			      retval);
1626
		mutex_unlock(&dev->lock);
1627
		list_del(&dev->devlist);
1628
		video_device_release(dev->vdev);
1629
		em28xx_devused&=~(1<<dev->devno);
1630
		kfree(dev);
1631 1632
		return -ENODEV;
	}
1633 1634 1635 1636

	if (video_register_device(dev->vbi_dev, VFL_TYPE_VBI,
					vbi_nr[dev->devno]) < 0) {
		printk("unable to register vbi device\n");
1637
		mutex_unlock(&dev->lock);
1638 1639 1640 1641
		list_del(&dev->devlist);
		video_device_release(dev->vbi_dev);
		video_device_release(dev->vdev);
		em28xx_devused&=~(1<<dev->devno);
1642
		kfree(dev);
1643 1644 1645 1646 1647 1648 1649 1650
		return -ENODEV;
	} else {
		printk("registered VBI\n");
	}

	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);
1651 1652 1653 1654 1655

	return 0;
}

/*
1656
 * em28xx_usb_probe()
1657 1658
 * checks for supported devices
 */
1659
static int em28xx_usb_probe(struct usb_interface *interface,
1660 1661 1662 1663
			    const struct usb_device_id *id)
{
	const struct usb_endpoint_descriptor *endpoint;
	struct usb_device *udev;
1664
	struct usb_interface *uif;
1665
	struct em28xx *dev = NULL;
1666
	int retval = -ENODEV;
1667
	int i, nr, ifnum;
1668 1669

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

1672 1673 1674
	/* Check to see next free device and mark as used */
	nr=find_first_zero_bit(&em28xx_devused,EM28XX_MAXBOARDS);
	em28xx_devused|=1<<nr;
1675

1676
	/* Don't register audio interfaces */
1677
	if (interface->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) {
1678
		em28xx_err(DRIVER_NAME " audio device (%04x:%04x): interface %i, class %i\n",
1679 1680 1681
				udev->descriptor.idVendor,udev->descriptor.idProduct,
				ifnum,
				interface->altsetting[0].desc.bInterfaceClass);
1682 1683

		em28xx_devused&=~(1<<nr);
1684
		return -ENODEV;
1685 1686
	}

1687
	em28xx_err(DRIVER_NAME " new video device (%04x:%04x): interface %i, class %i\n",
1688 1689 1690
			udev->descriptor.idVendor,udev->descriptor.idProduct,
			ifnum,
			interface->altsetting[0].desc.bInterfaceClass);
1691

1692 1693
	endpoint = &interface->cur_altsetting->endpoint[1].desc;

1694
	/* check if the device has the iso in endpoint at the correct place */
1695 1696
	if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) !=
	    USB_ENDPOINT_XFER_ISOC) {
1697
		em28xx_err(DRIVER_NAME " probing error: endpoint is non-ISO endpoint!\n");
1698
		em28xx_devused&=~(1<<nr);
1699 1700 1701
		return -ENODEV;
	}
	if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT) {
1702
		em28xx_err(DRIVER_NAME " probing error: endpoint is ISO OUT endpoint!\n");
1703
		em28xx_devused&=~(1<<nr);
1704 1705 1706
		return -ENODEV;
	}

1707
	if (nr >= EM28XX_MAXBOARDS) {
1708
		printk (DRIVER_NAME ": Supports only %i em28xx boards.\n",EM28XX_MAXBOARDS);
1709
		em28xx_devused&=~(1<<nr);
1710 1711 1712 1713
		return -ENOMEM;
	}

	/* allocate memory for our device state and initialize it */
P
 
Panagiotis Issaris 已提交
1714
	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
1715
	if (dev == NULL) {
1716
		em28xx_err(DRIVER_NAME ": out of memory!\n");
1717
		em28xx_devused&=~(1<<nr);
1718 1719 1720
		return -ENOMEM;
	}

1721
	snprintf(dev->name, 29, "em28xx #%d", nr);
1722 1723
	dev->devno = nr;
	dev->model = id->driver_info;
1724

1725 1726 1727 1728
	/* compute alternate max packet sizes */
	uif = udev->actconfig->interface[0];

	dev->num_alt=uif->num_altsetting;
1729
	em28xx_info("Alternate settings: %i\n",dev->num_alt);
1730 1731 1732 1733
//	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) {
1734 1735
		em28xx_errdev("out of memory!\n");
		em28xx_devused&=~(1<<nr);
1736
		kfree(dev);
1737 1738 1739 1740 1741 1742 1743 1744
		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);
1745
		em28xx_info("Alternate setting %i, max size= %i\n",i,
1746 1747 1748
							dev->alt_max_pkt_size[i]);
	}

1749
	if ((card[nr]>=0)&&(card[nr]<em28xx_bcount))
1750
		dev->model = card[nr];
1751

1752
	/* allocate device struct */
1753
	retval = em28xx_init_dev(&dev, udev, nr);
1754 1755 1756
	if (retval)
		return retval;

1757
	em28xx_info("Found %s\n", em28xx_boards[dev->model].name);
1758 1759 1760 1761 1762 1763 1764

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

/*
1765
 * em28xx_usb_disconnect()
1766 1767 1768
 * called when the device gets diconencted
 * video device will be unregistered on v4l2_close in case it is still open
 */
1769
static void em28xx_usb_disconnect(struct usb_interface *interface)
1770
{
1771 1772 1773
	struct em28xx *dev;

	dev = usb_get_intfdata(interface);
1774 1775 1776 1777 1778
	usb_set_intfdata(interface, NULL);

	if (!dev)
		return;

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

1781
	/* wait until all current v4l2 io is finished then deallocate resources */
1782
	mutex_lock(&dev->lock);
1783 1784 1785 1786

	wake_up_interruptible_all(&dev->open);

	if (dev->users) {
1787
		em28xx_warn
1788
		    ("device /dev/video%d is open! Deregistration and memory "
1789 1790 1791
		     "deallocation are deferred on close.\n",
				dev->vdev->minor-MINOR_VFL_TYPE_GRABBER_MIN);

1792
		dev->state |= DEV_MISCONFIGURED;
1793
		em28xx_uninit_isoc(dev);
1794 1795 1796 1797 1798
		dev->state |= DEV_DISCONNECTED;
		wake_up_interruptible(&dev->wait_frame);
		wake_up_interruptible(&dev->wait_stream);
	} else {
		dev->state |= DEV_DISCONNECTED;
1799
		em28xx_release_resources(dev);
1800 1801
	}

1802

1803
	mutex_unlock(&dev->lock);
1804

1805 1806
	if (!dev->users) {
		kfree(dev->alt_max_pkt_size);
1807
		kfree(dev);
1808
	}
1809 1810 1811

}

1812 1813 1814 1815 1816
static struct usb_driver em28xx_usb_driver = {
	.name = "em28xx",
	.probe = em28xx_usb_probe,
	.disconnect = em28xx_usb_disconnect,
	.id_table = em28xx_id_table,
1817 1818
};

1819
static int __init em28xx_module_init(void)
1820 1821 1822 1823
{
	int result;

	printk(KERN_INFO DRIVER_NAME " v4l2 driver version %d.%d.%d loaded\n",
1824 1825
	       (EM28XX_VERSION_CODE >> 16) & 0xff,
	       (EM28XX_VERSION_CODE >> 8) & 0xff, EM28XX_VERSION_CODE & 0xff);
1826 1827 1828 1829 1830 1831
#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 */
1832
	result = usb_register(&em28xx_usb_driver);
1833
	if (result)
1834
		em28xx_err(DRIVER_NAME
1835 1836 1837 1838 1839
			   " usb_register failed. Error number %d.\n", result);

	return result;
}

1840
static void __exit em28xx_module_exit(void)
1841 1842
{
	/* deregister this driver with the USB subsystem */
1843
	usb_deregister(&em28xx_usb_driver);
1844 1845
}

1846 1847
module_init(em28xx_module_init);
module_exit(em28xx_module_exit);