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

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

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

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

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

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

#include <linux/init.h>
#include <linux/list.h>
#include <linux/module.h>
#include <linux/kernel.h>
31
#include <linux/bitmap.h>
32 33
#include <linux/usb.h>
#include <linux/i2c.h>
34
#include <linux/version.h>
35
#include <linux/mm.h>
36
#include <linux/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
static DEFINE_MUTEX(em28xx_sysfs_lock);
130
static DECLARE_RWSEM(em28xx_disconnect);
131 132 133 134

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

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

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

	/* enable vbi capturing */
146

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

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

	return 0;
}

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

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

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

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

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

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

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

205
	em28xx_i2c_call_clients(dev, VIDIOC_INT_S_VIDEO_ROUTING, &route);
206

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

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

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

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

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

256
	if (!down_read_trylock(&em28xx_disconnect))
257 258 259
		return -ERESTARTSYS;

	if (dev->users) {
260 261
		em28xx_warn("this driver can be opened only once\n");
		up_read(&em28xx_disconnect);
262 263 264
		return -EBUSY;
	}

265
	mutex_init(&dev->fileop_lock);	/* to 1 == available */
266 267 268 269
	spin_lock_init(&dev->queue_lock);
	init_waitqueue_head(&dev->wait_frame);
	init_waitqueue_head(&dev->wait_stream);

270
	mutex_lock(&dev->lock);
271

272 273
	if (dev->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
		em28xx_set_alternate(dev);
274

275 276 277 278 279 280 281
		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;
282

283 284
		em28xx_capture_start(dev, 1);
		em28xx_resolution_set(dev);
285

286 287 288
		/* device needs to be initialized before isoc transfer */
		video_mux(dev, 0);

289 290 291 292 293 294
		/* start the transfer */
		errCode = em28xx_init_isoc(dev);
		if (errCode)
			goto err;

	}
295 296 297 298 299 300 301 302

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

	/* prepare queues */
303
	em28xx_empty_framequeues(dev);
304 305 306

	dev->state |= DEV_INITIALIZED;

307 308
err:
	mutex_unlock(&dev->lock);
309
	up_read(&em28xx_disconnect);
310 311 312 313
	return errCode;
}

/*
314
 * em28xx_realease_resources()
315 316 317
 * unregisters the v4l2,i2c and usb devices
 * called when the device gets disconected or at module unload
*/
318
static void em28xx_release_resources(struct em28xx *dev)
319
{
320
	mutex_lock(&em28xx_sysfs_lock);
321

322 323 324 325 326
	/*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);
327
	list_del(&dev->devlist);
328
	video_unregister_device(dev->vdev);
329
	video_unregister_device(dev->vbi_dev);
330
	em28xx_i2c_unregister(dev);
331
	usb_put_dev(dev->udev);
332
	mutex_unlock(&em28xx_sysfs_lock);
333 334 335 336


	/* Mark device as unused */
	em28xx_devused&=~(1<<dev->devno);
337 338 339
}

/*
340
 * em28xx_v4l2_close()
341 342
 * stops streaming and deallocates all resources allocated by the v4l2 calls and ioctls
 */
343
static int em28xx_v4l2_close(struct inode *inode, struct file *filp)
344 345
{
	int errCode;
346
	struct em28xx *dev=filp->private_data;
347

348
	em28xx_videodbg("users=%d\n", dev->users);
349

350
	mutex_lock(&dev->lock);
351

352
	em28xx_uninit_isoc(dev);
353

354
	em28xx_release_buffers(dev);
355 356 357

	/* the device is already disconnect, free the remaining resources */
	if (dev->state & DEV_DISCONNECTED) {
358
		em28xx_release_resources(dev);
359
		mutex_unlock(&dev->lock);
360 361 362 363 364 365
		kfree(dev);
		return 0;
	}

	/* set alternate 0 */
	dev->alt = 0;
366
	em28xx_videodbg("setting alternate 0\n");
367 368
	errCode = usb_set_interface(dev->udev, 0, 0);
	if (errCode < 0) {
369
		em28xx_errdev ("cannot change alternate number to 0 (error=%i)\n",
370 371 372 373 374
		     errCode);
	}

	dev->users--;
	wake_up_interruptible_nr(&dev->open, 1);
375
	mutex_unlock(&dev->lock);
376 377 378 379
	return 0;
}

/*
380
 * em28xx_v4l2_read()
381 382 383
 * will allocate buffers when called for the first time
 */
static ssize_t
384
em28xx_v4l2_read(struct file *filp, char __user * buf, size_t count,
385 386
		 loff_t * f_pos)
{
387
	struct em28xx_frame_t *f, *i;
388 389
	unsigned long lock_flags;
	int ret = 0;
390
	struct em28xx *dev = filp->private_data;
391

392 393 394 395 396 397 398
	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)) {
399
			mutex_unlock(&dev->fileop_lock);
400 401 402 403 404 405 406 407
			return -EFAULT;
		}
		return (1);
	}
	if (dev->type == V4L2_BUF_TYPE_SLICED_VBI_CAPTURE) {
		em28xx_videodbg("V4L2_BUF_TYPE_SLICED_VBI_CAPTURE is set\n");
		em28xx_videodbg("not supported yet! ...\n");
		if (copy_to_user(buf, "", 1)) {
408
			mutex_unlock(&dev->fileop_lock);
409 410 411 412 413
			return -EFAULT;
		}
		return (1);
	}

414
	if (mutex_lock_interruptible(&dev->fileop_lock))
415 416 417
		return -ERESTARTSYS;

	if (dev->state & DEV_DISCONNECTED) {
418
		em28xx_videodbg("device not present\n");
419
		mutex_unlock(&dev->fileop_lock);
420 421 422 423
		return -ENODEV;
	}

	if (dev->state & DEV_MISCONFIGURED) {
424
		em28xx_videodbg("device misconfigured; close and open it again\n");
425
		mutex_unlock(&dev->fileop_lock);
426 427 428 429
		return -EIO;
	}

	if (dev->io == IO_MMAP) {
430
		em28xx_videodbg ("IO method is set to mmap; close and open"
431
				" the device again to choose the read method\n");
432
		mutex_unlock(&dev->fileop_lock);
433 434 435 436
		return -EINVAL;
	}

	if (dev->io == IO_NONE) {
437 438
		if (!em28xx_request_buffers(dev, EM28XX_NUM_READ_FRAMES)) {
			em28xx_errdev("read failed, not enough memory\n");
439
			mutex_unlock(&dev->fileop_lock);
440 441 442 443
			return -ENOMEM;
		}
		dev->io = IO_READ;
		dev->stream = STREAM_ON;
444
		em28xx_queue_unusedframes(dev);
445 446 447
	}

	if (!count) {
448
		mutex_unlock(&dev->fileop_lock);
449 450 451 452 453
		return 0;
	}

	if (list_empty(&dev->outqueue)) {
		if (filp->f_flags & O_NONBLOCK) {
454
			mutex_unlock(&dev->fileop_lock);
455 456 457 458 459 460 461
			return -EAGAIN;
		}
		ret = wait_event_interruptible
		    (dev->wait_frame,
		     (!list_empty(&dev->outqueue)) ||
		     (dev->state & DEV_DISCONNECTED));
		if (ret) {
462
			mutex_unlock(&dev->fileop_lock);
463 464 465
			return ret;
		}
		if (dev->state & DEV_DISCONNECTED) {
466
			mutex_unlock(&dev->fileop_lock);
467 468 469 470
			return -ENODEV;
		}
	}

471
	f = list_entry(dev->outqueue.prev, struct em28xx_frame_t, frame);
472 473 474 475 476 477 478

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

479
	em28xx_queue_unusedframes(dev);
480 481 482 483 484

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

	if (copy_to_user(buf, f->bufmem, count)) {
485
		mutex_unlock(&dev->fileop_lock);
486 487 488 489
		return -EFAULT;
	}
	*f_pos += count;

490
	mutex_unlock(&dev->fileop_lock);
491 492 493 494 495

	return count;
}

/*
496
 * em28xx_v4l2_poll()
497 498
 * will allocate buffers when called for the first time
 */
499
static unsigned int em28xx_v4l2_poll(struct file *filp, poll_table * wait)
500 501
{
	unsigned int mask = 0;
502
	struct em28xx *dev = filp->private_data;
503

504
	if (mutex_lock_interruptible(&dev->fileop_lock))
505 506 507
		return POLLERR;

	if (dev->state & DEV_DISCONNECTED) {
508
		em28xx_videodbg("device not present\n");
509
	} else if (dev->state & DEV_MISCONFIGURED) {
510
		em28xx_videodbg("device is misconfigured; close and open it again\n");
511 512
	} else {
		if (dev->io == IO_NONE) {
513 514 515
			if (!em28xx_request_buffers
			    (dev, EM28XX_NUM_READ_FRAMES)) {
				em28xx_warn
516 517 518 519 520 521 522 523
				    ("poll() failed, not enough memory\n");
			} else {
				dev->io = IO_READ;
				dev->stream = STREAM_ON;
			}
		}

		if (dev->io == IO_READ) {
524
			em28xx_queue_unusedframes(dev);
525 526 527 528 529
			poll_wait(filp, &dev->wait_frame, wait);

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

530
			mutex_unlock(&dev->fileop_lock);
531 532 533 534 535

			return mask;
		}
	}

536
	mutex_unlock(&dev->fileop_lock);
537 538 539 540
	return POLLERR;
}

/*
541
 * em28xx_vm_open()
542
 */
543
static void em28xx_vm_open(struct vm_area_struct *vma)
544
{
545
	struct em28xx_frame_t *f = vma->vm_private_data;
546 547 548 549
	f->vma_use_count++;
}

/*
550
 * em28xx_vm_close()
551
 */
552
static void em28xx_vm_close(struct vm_area_struct *vma)
553 554
{
	/* NOTE: buffers are not freed here */
555
	struct em28xx_frame_t *f = vma->vm_private_data;
556 557 558

	if (f->vma_use_count)
		f->vma_use_count--;
559 560
}

561 562 563
static struct vm_operations_struct em28xx_vm_ops = {
	.open = em28xx_vm_open,
	.close = em28xx_vm_close,
564 565 566
};

/*
567
 * em28xx_v4l2_mmap()
568
 */
569
static int em28xx_v4l2_mmap(struct file *filp, struct vm_area_struct *vma)
570 571
{
	unsigned long size = vma->vm_end - vma->vm_start,
572 573
	    start = vma->vm_start;
	void *pos;
574
	u32 i;
575

576
	struct em28xx *dev = filp->private_data;
577

578
	if (mutex_lock_interruptible(&dev->fileop_lock))
579 580 581
		return -ERESTARTSYS;

	if (dev->state & DEV_DISCONNECTED) {
582
		em28xx_videodbg("mmap: device not present\n");
583
		mutex_unlock(&dev->fileop_lock);
584 585 586 587
		return -ENODEV;
	}

	if (dev->state & DEV_MISCONFIGURED) {
588
		em28xx_videodbg ("mmap: Device is misconfigured; close and "
589
						"open it again\n");
590
		mutex_unlock(&dev->fileop_lock);
591 592 593 594 595
		return -EIO;
	}

	if (dev->io != IO_MMAP || !(vma->vm_flags & VM_WRITE) ||
	    size != PAGE_ALIGN(dev->frame[0].buf.length)) {
596
		mutex_unlock(&dev->fileop_lock);
597 598 599 600 601 602 603 604
		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) {
605
		em28xx_videodbg("mmap: user supplied mapping address is out of range\n");
606
		mutex_unlock(&dev->fileop_lock);
607 608 609 610 611 612 613
		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 */

614
	pos = dev->frame[i].bufmem;
615
	while (size > 0) {	/* size is page-aligned */
616 617
		if (vm_insert_page(vma, start, vmalloc_to_page(pos))) {
			em28xx_videodbg("mmap: vm_insert_page failed\n");
618
			mutex_unlock(&dev->fileop_lock);
619 620 621 622 623 624 625
			return -EAGAIN;
		}
		start += PAGE_SIZE;
		pos += PAGE_SIZE;
		size -= PAGE_SIZE;
	}

626
	vma->vm_ops = &em28xx_vm_ops;
627 628
	vma->vm_private_data = &dev->frame[i];

629
	em28xx_vm_open(vma);
630
	mutex_unlock(&dev->fileop_lock);
631 632 633 634
	return 0;
}

/*
635
 * em28xx_get_ctrl()
636 637
 * return the current saturation, brightness or contrast, mute state
 */
638
static int em28xx_get_ctrl(struct em28xx *dev, struct v4l2_control *ctrl)
639 640 641 642 643 644 645 646
{
	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;
647 648 649 650 651
	default:
		return -EINVAL;
	}
}

652
/*
653
 * em28xx_set_ctrl()
654 655
 * mute or set new saturation, brightness or contrast
 */
656
static int em28xx_set_ctrl(struct em28xx *dev, const struct v4l2_control *ctrl)
657 658 659 660 661
{
	switch (ctrl->id) {
	case V4L2_CID_AUDIO_MUTE:
		if (ctrl->value != dev->mute) {
			dev->mute = ctrl->value;
662 663
			em28xx_audio_usb_mute(dev, ctrl->value);
			return em28xx_audio_analog_set(dev);
664 665 666 667
		}
		return 0;
	case V4L2_CID_AUDIO_VOLUME:
		dev->volume = ctrl->value;
668
		return em28xx_audio_analog_set(dev);
669 670 671 672 673
	default:
		return -EINVAL;
	}
}

674
/*
675
 * em28xx_stream_interrupt()
676 677
 * stops streaming
 */
678
static int em28xx_stream_interrupt(struct em28xx *dev)
679 680 681 682 683 684 685 686 687
{
	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),
688
				 EM28XX_URB_TIMEOUT);
689 690 691 692
	if (dev->state & DEV_DISCONNECTED)
		return -ENODEV;
	else if (ret) {
		dev->state |= DEV_MISCONFIGURED;
693
		em28xx_videodbg("device is misconfigured; close and "
694 695
			"open /dev/video%d again\n",
				dev->vdev->minor-MINOR_VFL_TYPE_GRABBER_MIN);
696 697 698 699 700 701
		return ret;
	}

	return 0;
}

702
static int em28xx_set_norm(struct em28xx *dev, int width, int height)
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 731 732 733 734 735 736 737 738 739 740
{
	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;

741
	em28xx_resolution_set(dev);
742 743 744 745

	return 0;
}

746 747 748 749 750 751 752 753 754 755 756
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");

757 758 759
	switch (format->type) {
	case V4L2_BUF_TYPE_VIDEO_CAPTURE:
	{
760 761 762 763 764 765 766 767 768 769
		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);
770
		break;
771 772
	}

773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788
	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);
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 851 852 853 854 855 856 857 858 859 860
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;
	}

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

864 865 866
	width = (((unsigned long)maxw) << 12) / (hscale + 4096L);

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

	height = (((unsigned long)maxh) << 12) / (vscale + 4096L);
870 871 872 873 874 875 876 877 878 879

	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",
880 881 882
		cmd == VIDIOC_TRY_FMT ?
		"VIDIOC_TRY_FMT" :"VIDIOC_S_FMT",
		format->fmt.pix.width, format->fmt.pix.height, hscale, vscale);
883 884 885 886 887 888 889 890 891 892 893 894 895

	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) {
896
		em28xx_videodbg("VIDIOC_SET_FMT: interrupting stream\n");
897 898 899 900 901 902 903 904 905 906 907
		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;
908
	dev->field_size = dev->frame_size >> 1;
909 910 911 912 913 914 915 916 917 918 919
	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;
}
920

921
/*
922
 * em28xx_v4l2_do_ioctl()
923
 * This function is _not_ called directly, but from
924
 * em28xx_v4l2_ioctl. Userspace
925 926
 * copying is done already, arg is a kernel pointer.
 */
927 928
static int em28xx_do_ioctl(struct inode *inode, struct file *filp,
			   struct em28xx *dev, unsigned int cmd, void *arg,
929 930 931 932 933 934 935
			   v4l2_kioctl driver_ioctl)
{
	int ret;

	switch (cmd) {
		/* ---------- tv norms ---------- */
	case VIDIOC_ENUMSTD:
936 937 938
	{
		struct v4l2_standard *e = arg;
		unsigned int i;
939

940 941 942 943 944 945 946 947 948 949
		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;
	}
950
	case VIDIOC_G_STD:
951 952
	{
		v4l2_std_id *id = arg;
953

954 955 956
		*id = dev->tvnorm->id;
		return 0;
	}
957
	case VIDIOC_S_STD:
958 959 960
	{
		v4l2_std_id *id = arg;
		unsigned int i;
961

962 963 964 965
		for (i = 0; i < TVNORMS; i++)
			if (*id == tvnorms[i].id)
				break;
		if (i == TVNORMS)
966
			for (i = 0; i < TVNORMS; i++)
967
				if (*id & tvnorms[i].id)
968
					break;
969 970
		if (i == TVNORMS)
			return -EINVAL;
971

972
		mutex_lock(&dev->lock);
973
		dev->tvnorm = &tvnorms[i];
974

975
		em28xx_set_norm(dev, dev->width, dev->height);
976

977 978
		em28xx_i2c_call_clients(dev, VIDIOC_S_STD,
					&dev->tvnorm->id);
979

980
		mutex_unlock(&dev->lock);
981

982 983
		return 0;
	}
984

985
	/* ------ input switching ---------- */
986
	case VIDIOC_ENUMINPUT:
987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017
	{
		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;
	}
1018
	case VIDIOC_G_INPUT:
1019 1020 1021
	{
		int *i = arg;
		*i = dev->ctl_input;
1022

1023 1024
		return 0;
	}
1025
	case VIDIOC_S_INPUT:
1026 1027
	{
		int *index = arg;
1028

1029 1030 1031 1032
		if (*index >= MAX_EM28XX_INPUT)
			return -EINVAL;
		if (0 == INPUT(*index)->type)
			return -EINVAL;
1033

1034
		mutex_lock(&dev->lock);
1035
		video_mux(dev, *index);
1036
		mutex_unlock(&dev->lock);
1037

1038 1039
		return 0;
	}
1040
	case VIDIOC_G_AUDIO:
1041 1042 1043
	{
		struct v4l2_audio *a = arg;
		unsigned int index = a->index;
1044

1045 1046 1047 1048
		if (a->index > 1)
			return -EINVAL;
		memset(a, 0, sizeof(*a));
		index = dev->ctl_ainput;
1049

1050 1051 1052 1053
		if (index == 0) {
			strcpy(a->name, "Television");
		} else {
			strcpy(a->name, "Line In");
1054
		}
1055 1056 1057 1058
		a->capability = V4L2_AUDCAP_STEREO;
		a->index = index;
		return 0;
	}
1059
	case VIDIOC_S_AUDIO:
1060 1061
	{
		struct v4l2_audio *a = arg;
1062

1063 1064 1065 1066 1067
		if (a->index != dev->ctl_ainput)
			return -EINVAL;

		return 0;
	}
1068

1069
	/* --- controls ---------------------------------------------- */
1070
	case VIDIOC_QUERYCTRL:
1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082
	{
		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));
1083 1084
					return 0;
				}
1085
			}
1086
		}
1087 1088 1089 1090 1091
		em28xx_i2c_call_clients(dev,cmd,qc);
		if (qc->type)
			return 0;
		else
			return -EINVAL;
1092
	}
1093
	case VIDIOC_G_CTRL:
1094 1095 1096
	{
		struct v4l2_control *ctrl = arg;
		int retval=-EINVAL;
1097

1098 1099 1100
		if (!dev->has_msp34xx)
			retval=em28xx_get_ctrl(dev, ctrl);
		if (retval==-EINVAL) {
1101 1102
			em28xx_i2c_call_clients(dev,cmd,arg);
			return 0;
1103 1104
		} else return retval;
	}
1105
	case VIDIOC_S_CTRL:
1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118
	{
		struct v4l2_control *ctrl = arg;
		u8 i;

		if (!dev->has_msp34xx){
			for (i = 0; i < ARRAY_SIZE(em28xx_qctrl); i++) {
				if (ctrl->id == em28xx_qctrl[i].id) {
					if (ctrl->value <
					em28xx_qctrl[i].minimum
					|| ctrl->value >
					em28xx_qctrl[i].maximum)
						return -ERANGE;
					return em28xx_set_ctrl(dev, ctrl);
1119 1120
				}
			}
1121
		}
1122

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

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

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

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

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

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

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

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

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

1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196
		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;
	}
1197
	case VIDIOC_STREAMON:
1198 1199
	{
		int *type = arg;
1200

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

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

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

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

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

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

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

		return 0;
	}
1232 1233 1234 1235 1236 1237 1238 1239
	default:
		return v4l_compat_translate_ioctl(inode, filp, cmd, arg,
						  driver_ioctl);
	}
	return 0;
}

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

	if (!dev)
		return -ENODEV;

	if (video_debug > 1)
1254
		v4l_print_ioctl(dev->name,cmd);
1255 1256 1257 1258 1259 1260

	switch (cmd) {

		/* --- capabilities ------------------------------------------ */
	case VIDIOC_QUERYCAP:
		{
1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279
		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 ---------------------------------------- */
1280
	case VIDIOC_ENUM_FMT:
1281 1282
	{
		struct v4l2_fmtdesc *fmtd = arg;
1283

1284 1285 1286 1287 1288 1289 1290 1291 1292
		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;
	}
1293
	case VIDIOC_G_FMT:
1294
		return em28xx_get_fmt(dev, (struct v4l2_format *) arg);
1295 1296 1297

	case VIDIOC_TRY_FMT:
	case VIDIOC_S_FMT:
1298
		return em28xx_set_fmt(dev, cmd, (struct v4l2_format *)arg);
1299 1300

	case VIDIOC_REQBUFS:
1301 1302 1303 1304
	{
		struct v4l2_requestbuffers *rb = arg;
		u32 i;
		int ret;
1305

1306 1307 1308
		if (rb->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
			rb->memory != V4L2_MEMORY_MMAP)
			return -EINVAL;
1309

1310 1311 1312 1313 1314 1315
		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;
		}
1316

1317 1318 1319 1320
		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;
1321 1322
			}

1323 1324 1325 1326 1327
		if (dev->stream == STREAM_ON) {
			em28xx_videodbg("VIDIOC_REQBUFS: interrupting stream\n");
			if ((ret = em28xx_stream_interrupt(dev)))
				return ret;
		}
1328

1329
		em28xx_empty_framequeues(dev);
1330

1331 1332 1333 1334
		em28xx_release_buffers(dev);
		if (rb->count)
			rb->count =
				em28xx_request_buffers(dev, rb->count);
1335

1336
		dev->frame_current = NULL;
1337

1338 1339 1340 1341 1342
		em28xx_videodbg ("VIDIOC_REQBUFS: setting io method to mmap: num bufs %i\n",
						rb->count);
		dev->io = rb->count ? IO_MMAP : IO_NONE;
		return 0;
	}
1343
	case VIDIOC_QUERYBUF:
1344 1345
	{
		struct v4l2_buffer *b = arg;
1346

1347 1348 1349
		if (b->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
			b->index >= dev->num_frames || dev->io != IO_MMAP)
			return -EINVAL;
1350

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

1353 1354
		if (dev->frame[b->index].vma_use_count) {
			b->flags |= V4L2_BUF_FLAG_MAPPED;
1355
		}
1356 1357 1358 1359 1360 1361
		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;
	}
1362
	case VIDIOC_QBUF:
1363 1364 1365
	{
		struct v4l2_buffer *b = arg;
		unsigned long lock_flags;
1366

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

1372 1373 1374 1375
		if (dev->frame[b->index].state != F_UNUSED) {
			return -EAGAIN;
		}
		dev->frame[b->index].state = F_QUEUED;
1376

1377 1378 1379 1380 1381
		/* 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);
1382

1383 1384
		return 0;
	}
1385
	case VIDIOC_DQBUF:
1386 1387 1388 1389 1390
	{
		struct v4l2_buffer *b = arg;
		struct em28xx_frame_t *f;
		unsigned long lock_flags;
		int ret = 0;
1391

1392 1393 1394
		if (b->type != V4L2_BUF_TYPE_VIDEO_CAPTURE
			|| dev->io != IO_MMAP)
			return -EINVAL;
1395

1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409
		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;
		}
1410

1411 1412 1413 1414 1415
		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);
1416

1417 1418
		f->state = F_UNUSED;
		memcpy(b, &f->buf, sizeof(*b));
1419

1420 1421
		if (f->vma_use_count)
			b->flags |= V4L2_BUF_FLAG_MAPPED;
1422

1423 1424
		return 0;
	}
1425
	default:
1426 1427
		return em28xx_do_ioctl(inode, filp, dev, cmd, arg,
				       em28xx_video_do_ioctl);
1428 1429 1430 1431 1432
	}
	return 0;
}

/*
1433 1434
 * em28xx_v4l2_ioctl()
 * handle v4l2 ioctl the main action happens in em28xx_v4l2_do_ioctl()
1435
 */
1436
static int em28xx_v4l2_ioctl(struct inode *inode, struct file *filp,
1437 1438 1439
			     unsigned int cmd, unsigned long arg)
{
	int ret = 0;
1440
	struct em28xx *dev = filp->private_data;
1441

1442
	if (mutex_lock_interruptible(&dev->fileop_lock))
1443 1444 1445
		return -ERESTARTSYS;

	if (dev->state & DEV_DISCONNECTED) {
1446
		em28xx_errdev("v4l2 ioctl: device not present\n");
1447
		mutex_unlock(&dev->fileop_lock);
1448 1449 1450 1451
		return -ENODEV;
	}

	if (dev->state & DEV_MISCONFIGURED) {
1452
		em28xx_errdev
1453
		    ("v4l2 ioctl: device is misconfigured; close and open it again\n");
1454
		mutex_unlock(&dev->fileop_lock);
1455 1456 1457
		return -EIO;
	}

1458
	ret = video_usercopy(inode, filp, cmd, arg, em28xx_video_do_ioctl);
1459

1460
	mutex_unlock(&dev->fileop_lock);
1461 1462 1463 1464

	return ret;
}

1465
static const struct file_operations em28xx_v4l_fops = {
1466
	.owner = THIS_MODULE,
1467 1468 1469 1470 1471 1472
	.open = em28xx_v4l2_open,
	.release = em28xx_v4l2_close,
	.ioctl = em28xx_v4l2_ioctl,
	.read = em28xx_v4l2_read,
	.poll = em28xx_v4l2_poll,
	.mmap = em28xx_v4l2_mmap,
1473
	.llseek = no_llseek,
1474 1475
	.compat_ioctl   = v4l_compat_ioctl32,

1476 1477 1478 1479 1480
};

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

/*
1481
 * em28xx_init_dev()
1482 1483
 * allocates and inits the device structs, registers i2c bus and v4l device
 */
1484
static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev,
1485
			   int minor)
1486
{
1487
	struct em28xx *dev = *devhandle;
1488 1489 1490 1491 1492
	int retval = -ENOMEM;
	int errCode, i;
	unsigned int maxh, maxw;

	dev->udev = udev;
1493
	mutex_init(&dev->lock);
1494 1495
	init_waitqueue_head(&dev->open);

1496 1497 1498 1499 1500
	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;
1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511

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

1512
	em28xx_pre_card_setup(dev);
1513

1514
	errCode = em28xx_config(dev);
1515
	if (errCode) {
1516
		em28xx_errdev("error configuring device\n");
1517
		em28xx_devused &= ~(1<<dev->devno);
1518
		kfree(dev);
1519 1520 1521
		return -ENOMEM;
	}

1522
	mutex_lock(&dev->lock);
1523

1524
	/* register i2c bus */
1525
	em28xx_i2c_register(dev);
1526 1527

	/* Do board specific init and eeprom reading */
1528
	em28xx_card_setup(dev);
1529 1530

	/* configure the device */
1531
	em28xx_config_i2c(dev);
1532

1533
	mutex_unlock(&dev->lock);
1534

1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559
	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;

1560
	errCode = em28xx_config(dev);
1561 1562 1563 1564

	/* allocate and fill v4l2 device struct */
	dev->vdev = video_device_alloc();
	if (NULL == dev->vdev) {
1565
		em28xx_errdev("cannot allocate video_device.\n");
1566
		em28xx_devused&=~(1<<dev->devno);
1567
		kfree(dev);
1568 1569 1570 1571 1572 1573 1574 1575
		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);
1576
		kfree(dev);
1577 1578 1579
		return -ENOMEM;
	}

1580 1581 1582 1583 1584 1585 1586 1587 1588 1589
	/* 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 */
1590 1591 1592
	dev->vdev->type = VID_TYPE_CAPTURE;
	if (dev->has_tuner)
		dev->vdev->type |= VID_TYPE_TUNER;
1593
	dev->vdev->fops = &em28xx_v4l_fops;
1594 1595 1596
	dev->vdev->minor = -1;
	dev->vdev->dev = &dev->udev->dev;
	dev->vdev->release = video_device_release;
1597 1598 1599
	snprintf(dev->vdev->name, sizeof(dev->vbi_dev->name), "%s#%d %s",
							 "em28xx",dev->devno,"video");

1600
	list_add_tail(&dev->devlist,&em28xx_devlist);
1601 1602

	/* register v4l2 device */
1603
	mutex_lock(&dev->lock);
1604 1605
	if ((retval = video_register_device(dev->vdev, VFL_TYPE_GRABBER,
					 video_nr[dev->devno]))) {
1606
		em28xx_errdev("unable to register video device (error=%i).\n",
1607
			      retval);
1608
		mutex_unlock(&dev->lock);
1609
		list_del(&dev->devlist);
1610
		video_device_release(dev->vdev);
1611
		em28xx_devused&=~(1<<dev->devno);
1612
		kfree(dev);
1613 1614
		return -ENODEV;
	}
1615 1616 1617 1618

	if (video_register_device(dev->vbi_dev, VFL_TYPE_VBI,
					vbi_nr[dev->devno]) < 0) {
		printk("unable to register vbi device\n");
1619
		mutex_unlock(&dev->lock);
1620 1621 1622 1623
		list_del(&dev->devlist);
		video_device_release(dev->vbi_dev);
		video_device_release(dev->vdev);
		em28xx_devused&=~(1<<dev->devno);
1624
		kfree(dev);
1625 1626 1627 1628 1629
		return -ENODEV;
	} else {
		printk("registered VBI\n");
	}

1630 1631
	if (dev->has_msp34xx) {
		/* Send a reset to other chips via gpio */
1632
		em28xx_write_regs_req(dev, 0x00, 0x08, "\xf7", 1);
1633
		msleep(3);
1634
		em28xx_write_regs_req(dev, 0x00, 0x08, "\xff", 1);
1635
		msleep(3);
1636 1637 1638 1639

	}
	video_mux(dev, 0);

1640
	mutex_unlock(&dev->lock);
1641

1642 1643 1644
	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);
1645 1646 1647 1648 1649

	return 0;
}

/*
1650
 * em28xx_usb_probe()
1651 1652
 * checks for supported devices
 */
1653
static int em28xx_usb_probe(struct usb_interface *interface,
1654 1655 1656 1657
			    const struct usb_device_id *id)
{
	const struct usb_endpoint_descriptor *endpoint;
	struct usb_device *udev;
1658
	struct usb_interface *uif;
1659
	struct em28xx *dev = NULL;
1660
	int retval = -ENODEV;
1661
	int i, nr, ifnum;
1662 1663

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

1666 1667 1668
	/* Check to see next free device and mark as used */
	nr=find_first_zero_bit(&em28xx_devused,EM28XX_MAXBOARDS);
	em28xx_devused|=1<<nr;
1669

1670
	/* Don't register audio interfaces */
1671
	if (interface->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) {
1672
		em28xx_err(DRIVER_NAME " audio device (%04x:%04x): interface %i, class %i\n",
1673 1674 1675
				udev->descriptor.idVendor,udev->descriptor.idProduct,
				ifnum,
				interface->altsetting[0].desc.bInterfaceClass);
1676 1677

		em28xx_devused&=~(1<<nr);
1678
		return -ENODEV;
1679 1680
	}

1681
	em28xx_err(DRIVER_NAME " new video device (%04x:%04x): interface %i, class %i\n",
1682 1683 1684
			udev->descriptor.idVendor,udev->descriptor.idProduct,
			ifnum,
			interface->altsetting[0].desc.bInterfaceClass);
1685

1686 1687
	endpoint = &interface->cur_altsetting->endpoint[1].desc;

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

1701
	if (nr >= EM28XX_MAXBOARDS) {
1702
		printk (DRIVER_NAME ": Supports only %i em28xx boards.\n",EM28XX_MAXBOARDS);
1703
		em28xx_devused&=~(1<<nr);
1704 1705 1706 1707
		return -ENOMEM;
	}

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

1715
	snprintf(dev->name, 29, "em28xx #%d", nr);
1716 1717
	dev->devno = nr;
	dev->model = id->driver_info;
1718

1719 1720 1721 1722
	/* compute alternate max packet sizes */
	uif = udev->actconfig->interface[0];

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

1743
	if ((card[nr]>=0)&&(card[nr]<em28xx_bcount))
1744
		dev->model = card[nr];
1745

1746
	/* allocate device struct */
1747
	retval = em28xx_init_dev(&dev, udev, nr);
1748 1749 1750
	if (retval)
		return retval;

1751
	em28xx_info("Found %s\n", em28xx_boards[dev->model].name);
1752 1753 1754 1755 1756 1757 1758

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

/*
1759
 * em28xx_usb_disconnect()
1760 1761 1762
 * called when the device gets diconencted
 * video device will be unregistered on v4l2_close in case it is still open
 */
1763
static void em28xx_usb_disconnect(struct usb_interface *interface)
1764
{
1765
	struct em28xx *dev = usb_get_intfdata(interface);
1766 1767 1768 1769 1770
	usb_set_intfdata(interface, NULL);

	if (!dev)
		return;

1771
	down_write(&em28xx_disconnect);
1772

1773
	mutex_lock(&dev->lock);
1774

1775
	em28xx_info("disconnecting %s\n", dev->vdev->name);
1776 1777 1778 1779

	wake_up_interruptible_all(&dev->open);

	if (dev->users) {
1780
		em28xx_warn
1781
		    ("device /dev/video%d is open! Deregistration and memory "
1782 1783 1784
		     "deallocation are deferred on close.\n",
				dev->vdev->minor-MINOR_VFL_TYPE_GRABBER_MIN);

1785
		dev->state |= DEV_MISCONFIGURED;
1786
		em28xx_uninit_isoc(dev);
1787 1788 1789 1790 1791
		dev->state |= DEV_DISCONNECTED;
		wake_up_interruptible(&dev->wait_frame);
		wake_up_interruptible(&dev->wait_stream);
	} else {
		dev->state |= DEV_DISCONNECTED;
1792
		em28xx_release_resources(dev);
1793 1794
	}

1795
	mutex_unlock(&dev->lock);
1796

1797 1798
	if (!dev->users) {
		kfree(dev->alt_max_pkt_size);
1799
		kfree(dev);
1800
	}
1801

1802
	up_write(&em28xx_disconnect);
1803 1804
}

1805 1806 1807 1808 1809
static struct usb_driver em28xx_usb_driver = {
	.name = "em28xx",
	.probe = em28xx_usb_probe,
	.disconnect = em28xx_usb_disconnect,
	.id_table = em28xx_id_table,
1810 1811
};

1812
static int __init em28xx_module_init(void)
1813 1814 1815 1816
{
	int result;

	printk(KERN_INFO DRIVER_NAME " v4l2 driver version %d.%d.%d loaded\n",
1817 1818
	       (EM28XX_VERSION_CODE >> 16) & 0xff,
	       (EM28XX_VERSION_CODE >> 8) & 0xff, EM28XX_VERSION_CODE & 0xff);
1819 1820 1821 1822 1823 1824
#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 */
1825
	result = usb_register(&em28xx_usb_driver);
1826
	if (result)
1827
		em28xx_err(DRIVER_NAME
1828 1829 1830 1831 1832
			   " usb_register failed. Error number %d.\n", result);

	return result;
}

1833
static void __exit em28xx_module_exit(void)
1834 1835
{
	/* deregister this driver with the USB subsystem */
1836
	usb_deregister(&em28xx_usb_driver);
1837 1838
}

1839 1840
module_init(em28xx_module_init);
module_exit(em28xx_module_exit);