em28xx-video.c 45.0 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
	struct em28xx_fh *fh;
238

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

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

255
	fh = kzalloc(sizeof(struct em28xx_fh), GFP_KERNEL);
256

257 258 259
	if (!fh) {
		em28xx_errdev("em28xx-video.c: Out of memory?!\n");
		return -ENOMEM;
260
	}
261 262 263
	mutex_lock(&dev->lock);
	fh->dev = dev;
	filp->private_data = fh;
264

265
	if (dev->type == V4L2_BUF_TYPE_VIDEO_CAPTURE && dev->users == 0) {
266
		em28xx_set_alternate(dev);
267

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

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

279

280 281 282 283 284
		/* start the transfer */
		errCode = em28xx_init_isoc(dev);
		if (errCode)
			goto err;

285
		em28xx_empty_framequeues(dev);
286
	}
287 288 289

	dev->users++;

290 291
err:
	mutex_unlock(&dev->lock);
292 293 294 295
	return errCode;
}

/*
296
 * em28xx_realease_resources()
297 298 299
 * unregisters the v4l2,i2c and usb devices
 * called when the device gets disconected or at module unload
*/
300
static void em28xx_release_resources(struct em28xx *dev)
301 302
{

303 304 305 306 307
	/*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);
308
	list_del(&dev->devlist);
309
	video_unregister_device(dev->vdev);
310
	video_unregister_device(dev->vbi_dev);
311
	em28xx_i2c_unregister(dev);
312
	usb_put_dev(dev->udev);
313 314 315 316


	/* Mark device as unused */
	em28xx_devused&=~(1<<dev->devno);
317 318 319
}

/*
320
 * em28xx_v4l2_close()
321 322
 * stops streaming and deallocates all resources allocated by the v4l2 calls and ioctls
 */
323
static int em28xx_v4l2_close(struct inode *inode, struct file *filp)
324
{
325 326 327
	struct em28xx_fh *fh  = filp->private_data;
	struct em28xx    *dev = fh->dev;
	int              errCode;
328

329
	em28xx_videodbg("users=%d\n", dev->users);
330

331
	mutex_lock(&dev->lock);
332 333
	if (fh->reader == 1)
	       fh->reader = 0;
334

335 336
	if (dev->users == 1) {
		dev->reader = 0;
337

338 339
		em28xx_uninit_isoc(dev);
		em28xx_release_buffers(dev);
340

341 342 343 344 345 346 347 348
		/* the device is already disconnect,
		   free the remaining resources */
		if (dev->state & DEV_DISCONNECTED) {
			em28xx_release_resources(dev);
			mutex_unlock(&dev->lock);
			kfree(dev);
			return 0;
		}
349

350 351 352 353 354 355 356 357
		/* set alternate 0 */
		dev->alt = 0;
		em28xx_videodbg("setting alternate 0\n");
		errCode = usb_set_interface(dev->udev, 0, 0);
		if (errCode < 0) {
			em28xx_errdev("cannot change alternate number to "
					"0 (error=%i)\n", errCode);
		}
358
	}
359
	kfree(fh);
360 361
	dev->users--;
	wake_up_interruptible_nr(&dev->open, 1);
362
	mutex_unlock(&dev->lock);
363 364 365 366
	return 0;
}

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

380 381
	mutex_lock(&dev->lock);

382
	if (dev->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
383
		em28xx_videodbg("V4l2_Buf_type_videocapture is set\n");
384 385 386 387

	if (dev->reader > 0 && fh->reader == 0) {
		mutex_unlock(&dev->lock);
		return -EBUSY;
388
	}
389

390 391 392 393
	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)) {
394
			mutex_unlock(&dev->lock);
395 396
			return -EFAULT;
		}
397
		mutex_unlock(&dev->lock);
398 399 400 401 402 403
		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)) {
404
			mutex_unlock(&dev->lock);
405 406
			return -EFAULT;
		}
407
		mutex_unlock(&dev->lock);
408 409 410
		return (1);
	}

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

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

	if (dev->io == IO_MMAP) {
424
		em28xx_videodbg ("IO method is set to mmap; close and open"
425
				" the device again to choose the read method\n");
426
		mutex_unlock(&dev->lock);
427
		return -EINVAL;
428 429 430
	} else {
		dev->reader = 1;
		fh->reader = 1;
431 432 433
	}

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

	if (!count) {
445
		mutex_unlock(&dev->lock);
446 447 448 449 450
		return 0;
	}

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

468
	f = list_entry(dev->outqueue.prev, struct em28xx_frame_t, frame);
469 470 471 472 473 474 475

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

476
	em28xx_queue_unusedframes(dev);
477 478 479 480 481

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

	if (copy_to_user(buf, f->bufmem, count)) {
482
		mutex_unlock(&dev->lock);
483 484 485 486
		return -EFAULT;
	}
	*f_pos += count;

487
	mutex_unlock(&dev->lock);
488 489 490 491 492

	return count;
}

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

502
	mutex_lock(&dev->lock);
503 504

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

		if (dev->io == IO_READ) {
521
			em28xx_queue_unusedframes(dev);
522 523 524 525 526
			poll_wait(filp, &dev->wait_frame, wait);

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

527
			mutex_unlock(&dev->lock);
528 529 530 531 532

			return mask;
		}
	}

533
	mutex_unlock(&dev->lock);
534 535 536 537
	return POLLERR;
}

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

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

	if (f->vma_use_count)
		f->vma_use_count--;
556 557
}

558 559 560
static struct vm_operations_struct em28xx_vm_ops = {
	.open = em28xx_vm_open,
	.close = em28xx_vm_close,
561 562 563
};

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

575
	mutex_lock(&dev->lock);
576

577 578 579 580 581 582 583 584
	if (dev->reader > 0 && fh->reader == 0) {
		mutex_unlock(&dev->lock);
		return -EBUSY;
	} else {
		dev->reader = 1;
		fh->reader = 1;
	}

585
	if (dev->state & DEV_DISCONNECTED) {
586
		em28xx_videodbg("mmap: device not present\n");
587
		mutex_unlock(&dev->lock);
588 589 590 591
		return -ENODEV;
	}

	if (dev->state & DEV_MISCONFIGURED) {
592
		em28xx_videodbg ("mmap: Device is misconfigured; close and "
593
						"open it again\n");
594
		mutex_unlock(&dev->lock);
595 596 597 598 599
		return -EIO;
	}

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

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

630
	vma->vm_ops = &em28xx_vm_ops;
631 632
	vma->vm_private_data = &dev->frame[i];

633
	em28xx_vm_open(vma);
634
	mutex_unlock(&dev->lock);
635 636 637 638
	return 0;
}

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

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

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

	return 0;
}

706
static int em28xx_set_norm(struct em28xx *dev, int width, int height)
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 741 742 743 744
{
	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;

745
	em28xx_resolution_set(dev);
746 747 748 749

	return 0;
}

750 751 752 753 754 755 756 757 758 759 760
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");

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

777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792
	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);
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 861 862 863 864
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;
	}

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

868 869 870
	width = (((unsigned long)maxw) << 12) / (hscale + 4096L);

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

	height = (((unsigned long)maxh) << 12) / (vscale + 4096L);
874 875 876 877 878 879 880 881 882 883

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

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

925
/*
926
 * em28xx_v4l2_do_ioctl()
927
 * This function is _not_ called directly, but from
928
 * em28xx_v4l2_ioctl. Userspace
929 930
 * copying is done already, arg is a kernel pointer.
 */
931 932
static int em28xx_do_ioctl(struct inode *inode, struct file *filp,
			   struct em28xx *dev, unsigned int cmd, void *arg,
933 934
			   v4l2_kioctl driver_ioctl)
{
935
	struct em28xx_fh *fh = filp->private_data;
936 937 938 939 940
	int ret;

	switch (cmd) {
		/* ---------- tv norms ---------- */
	case VIDIOC_ENUMSTD:
941 942 943
	{
		struct v4l2_standard *e = arg;
		unsigned int i;
944

945 946 947 948 949 950 951 952 953 954
		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;
	}
955
	case VIDIOC_G_STD:
956 957
	{
		v4l2_std_id *id = arg;
958

959 960 961
		*id = dev->tvnorm->id;
		return 0;
	}
962
	case VIDIOC_S_STD:
963 964 965
	{
		v4l2_std_id *id = arg;
		unsigned int i;
966

967 968 969 970
		for (i = 0; i < TVNORMS; i++)
			if (*id == tvnorms[i].id)
				break;
		if (i == TVNORMS)
971
			for (i = 0; i < TVNORMS; i++)
972
				if (*id & tvnorms[i].id)
973
					break;
974 975
		if (i == TVNORMS)
			return -EINVAL;
976

977
		mutex_lock(&dev->lock);
978
		dev->tvnorm = &tvnorms[i];
979

980
		em28xx_set_norm(dev, dev->width, dev->height);
981

982 983
		em28xx_i2c_call_clients(dev, VIDIOC_S_STD,
					&dev->tvnorm->id);
984

985
		mutex_unlock(&dev->lock);
986

987 988
		return 0;
	}
989

990
	/* ------ input switching ---------- */
991
	case VIDIOC_ENUMINPUT:
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 1018 1019 1020 1021 1022
	{
		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;
	}
1023
	case VIDIOC_G_INPUT:
1024 1025 1026
	{
		int *i = arg;
		*i = dev->ctl_input;
1027

1028 1029
		return 0;
	}
1030
	case VIDIOC_S_INPUT:
1031 1032
	{
		int *index = arg;
1033

1034 1035 1036 1037
		if (*index >= MAX_EM28XX_INPUT)
			return -EINVAL;
		if (0 == INPUT(*index)->type)
			return -EINVAL;
1038

1039
		mutex_lock(&dev->lock);
1040
		video_mux(dev, *index);
1041
		mutex_unlock(&dev->lock);
1042

1043 1044
		return 0;
	}
1045
	case VIDIOC_G_AUDIO:
1046 1047 1048
	{
		struct v4l2_audio *a = arg;
		unsigned int index = a->index;
1049

1050 1051 1052 1053
		if (a->index > 1)
			return -EINVAL;
		memset(a, 0, sizeof(*a));
		index = dev->ctl_ainput;
1054

1055 1056 1057 1058
		if (index == 0) {
			strcpy(a->name, "Television");
		} else {
			strcpy(a->name, "Line In");
1059
		}
1060 1061 1062 1063
		a->capability = V4L2_AUDCAP_STEREO;
		a->index = index;
		return 0;
	}
1064
	case VIDIOC_S_AUDIO:
1065 1066
	{
		struct v4l2_audio *a = arg;
1067

1068 1069 1070 1071 1072
		if (a->index != dev->ctl_ainput)
			return -EINVAL;

		return 0;
	}
1073

1074
	/* --- controls ---------------------------------------------- */
1075
	case VIDIOC_QUERYCTRL:
1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087
	{
		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));
1088 1089
					return 0;
				}
1090
			}
1091
		}
1092
		mutex_lock(&dev->lock);
1093
		em28xx_i2c_call_clients(dev,cmd,qc);
1094
		mutex_unlock(&dev->lock);
1095 1096 1097 1098
		if (qc->type)
			return 0;
		else
			return -EINVAL;
1099
	}
1100
	case VIDIOC_G_CTRL:
1101 1102 1103
	{
		struct v4l2_control *ctrl = arg;
		int retval=-EINVAL;
1104

1105 1106 1107
		if (!dev->has_msp34xx)
			retval=em28xx_get_ctrl(dev, ctrl);
		if (retval==-EINVAL) {
1108
			mutex_lock(&dev->lock);
1109
			em28xx_i2c_call_clients(dev,cmd,arg);
1110
			mutex_unlock(&dev->lock);
1111
			return 0;
1112 1113
		} else return retval;
	}
1114
	case VIDIOC_S_CTRL:
1115 1116 1117
	{
		struct v4l2_control *ctrl = arg;
		u8 i;
1118
		mutex_lock(&dev->lock);
1119 1120 1121 1122

		if (!dev->has_msp34xx){
			for (i = 0; i < ARRAY_SIZE(em28xx_qctrl); i++) {
				if (ctrl->id == em28xx_qctrl[i].id) {
1123
					int retval=-EINVAL;
1124 1125 1126 1127 1128
					if (ctrl->value <
					em28xx_qctrl[i].minimum
					|| ctrl->value >
					em28xx_qctrl[i].maximum)
						return -ERANGE;
1129 1130 1131
					retval = em28xx_set_ctrl(dev, ctrl);
					mutex_unlock(&dev->lock);
					return retval;
1132 1133
				}
			}
1134
		}
1135

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

		fh->reader = 0;
1247
		em28xx_empty_framequeues(dev);
1248
		mutex_unlock(&dev->lock);
1249 1250 1251

		return 0;
	}
1252 1253 1254 1255 1256 1257 1258 1259
	default:
		return v4l_compat_translate_ioctl(inode, filp, cmd, arg,
						  driver_ioctl);
	}
	return 0;
}

/*
1260
 * em28xx_v4l2_do_ioctl()
1261
 * This function is _not_ called directly, but from
1262
 * em28xx_v4l2_ioctl. Userspace
1263 1264
 * copying is done already, arg is a kernel pointer.
 */
1265
static int em28xx_video_do_ioctl(struct inode *inode, struct file *filp,
1266 1267
				 unsigned int cmd, void *arg)
{
1268 1269
	struct em28xx_fh *fh = filp->private_data;
	struct em28xx *dev   = fh->dev;
1270 1271 1272 1273 1274

	if (!dev)
		return -ENODEV;

	if (video_debug > 1)
1275
		v4l_print_ioctl(dev->name,cmd);
1276 1277 1278 1279 1280 1281

	switch (cmd) {

		/* --- capabilities ------------------------------------------ */
	case VIDIOC_QUERYCAP:
		{
1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300
		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 ---------------------------------------- */
1301
	case VIDIOC_ENUM_FMT:
1302 1303
	{
		struct v4l2_fmtdesc *fmtd = arg;
1304

1305 1306 1307 1308 1309 1310 1311 1312 1313
		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;
	}
1314
	case VIDIOC_G_FMT:
1315 1316 1317 1318 1319 1320
	{
		int retval;
		mutex_lock(&dev->lock);
		retval = em28xx_get_fmt(dev, (struct v4l2_format *) arg);
		mutex_unlock(&dev->lock);
		return retval;
1321

1322
	}
1323 1324
	case VIDIOC_TRY_FMT:
	case VIDIOC_S_FMT:
1325 1326 1327 1328 1329 1330 1331
	{
		int retval;
		mutex_lock(&dev->lock);
		retval = em28xx_set_fmt(dev, cmd, (struct v4l2_format *)arg);
		mutex_unlock(&dev->lock);
		return retval;
	}
1332 1333

	case VIDIOC_REQBUFS:
1334 1335 1336 1337
	{
		struct v4l2_requestbuffers *rb = arg;
		u32 i;
		int ret;
1338

1339 1340 1341
		if (rb->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
			rb->memory != V4L2_MEMORY_MMAP)
			return -EINVAL;
1342

1343 1344 1345 1346 1347 1348
		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;
		}
1349

1350 1351 1352 1353
		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;
1354 1355
			}

1356
		mutex_lock(&dev->lock);
1357 1358
		if (dev->stream == STREAM_ON) {
			em28xx_videodbg("VIDIOC_REQBUFS: interrupting stream\n");
1359 1360
			if ((ret = em28xx_stream_interrupt(dev))){
				mutex_unlock(&dev->lock);
1361
				return ret;
1362
			}
1363
		}
1364

1365
		em28xx_empty_framequeues(dev);
1366

1367 1368 1369 1370
		em28xx_release_buffers(dev);
		if (rb->count)
			rb->count =
				em28xx_request_buffers(dev, rb->count);
1371

1372
		dev->frame_current = NULL;
1373

1374 1375 1376
		em28xx_videodbg ("VIDIOC_REQBUFS: setting io method to mmap: num bufs %i\n",
						rb->count);
		dev->io = rb->count ? IO_MMAP : IO_NONE;
1377
		mutex_unlock(&dev->lock);
1378 1379
		return 0;
	}
1380
	case VIDIOC_QUERYBUF:
1381 1382
	{
		struct v4l2_buffer *b = arg;
1383

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

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

1390 1391
		if (dev->frame[b->index].vma_use_count) {
			b->flags |= V4L2_BUF_FLAG_MAPPED;
1392
		}
1393 1394 1395 1396 1397 1398
		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;
	}
1399
	case VIDIOC_QBUF:
1400 1401 1402
	{
		struct v4l2_buffer *b = arg;
		unsigned long lock_flags;
1403

1404 1405 1406 1407
		if (b->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
			b->index >= dev->num_frames || dev->io != IO_MMAP) {
			return -EINVAL;
		}
1408

1409 1410 1411 1412
		if (dev->frame[b->index].state != F_UNUSED) {
			return -EAGAIN;
		}
		dev->frame[b->index].state = F_QUEUED;
1413

1414 1415 1416 1417 1418
		/* 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);
1419

1420 1421
		return 0;
	}
1422
	case VIDIOC_DQBUF:
1423 1424 1425 1426 1427
	{
		struct v4l2_buffer *b = arg;
		struct em28xx_frame_t *f;
		unsigned long lock_flags;
		int ret = 0;
1428

1429 1430 1431
		if (b->type != V4L2_BUF_TYPE_VIDEO_CAPTURE
			|| dev->io != IO_MMAP)
			return -EINVAL;
1432

1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446
		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;
		}
1447

1448 1449 1450 1451 1452
		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);
1453

1454 1455
		f->state = F_UNUSED;
		memcpy(b, &f->buf, sizeof(*b));
1456

1457 1458
		if (f->vma_use_count)
			b->flags |= V4L2_BUF_FLAG_MAPPED;
1459

1460 1461
		return 0;
	}
1462
	default:
1463 1464
		return em28xx_do_ioctl(inode, filp, dev, cmd, arg,
				       em28xx_video_do_ioctl);
1465 1466 1467 1468 1469
	}
	return 0;
}

/*
1470 1471
 * em28xx_v4l2_ioctl()
 * handle v4l2 ioctl the main action happens in em28xx_v4l2_do_ioctl()
1472
 */
1473
static int em28xx_v4l2_ioctl(struct inode *inode, struct file *filp,
1474 1475 1476
			     unsigned int cmd, unsigned long arg)
{
	int ret = 0;
1477 1478
	struct em28xx_fh *fh = filp->private_data;
	struct em28xx *dev   = fh->dev;
1479 1480

	if (dev->state & DEV_DISCONNECTED) {
1481
		em28xx_errdev("v4l2 ioctl: device not present\n");
1482 1483 1484 1485
		return -ENODEV;
	}

	if (dev->state & DEV_MISCONFIGURED) {
1486
		em28xx_errdev
1487 1488 1489 1490
		    ("v4l2 ioctl: device is misconfigured; close and open it again\n");
		return -EIO;
	}

1491
	ret = video_usercopy(inode, filp, cmd, arg, em28xx_video_do_ioctl);
1492 1493 1494 1495

	return ret;
}

1496
static const struct file_operations em28xx_v4l_fops = {
1497
	.owner = THIS_MODULE,
1498 1499 1500 1501 1502 1503
	.open = em28xx_v4l2_open,
	.release = em28xx_v4l2_close,
	.ioctl = em28xx_v4l2_ioctl,
	.read = em28xx_v4l2_read,
	.poll = em28xx_v4l2_poll,
	.mmap = em28xx_v4l2_mmap,
1504
	.llseek = no_llseek,
1505 1506
	.compat_ioctl   = v4l_compat_ioctl32,

1507 1508 1509 1510 1511
};

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

/*
1512
 * em28xx_init_dev()
1513 1514
 * allocates and inits the device structs, registers i2c bus and v4l device
 */
1515
static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev,
1516
			   int minor)
1517
{
1518
	struct em28xx *dev = *devhandle;
1519 1520 1521 1522 1523
	int retval = -ENOMEM;
	int errCode, i;
	unsigned int maxh, maxw;

	dev->udev = udev;
1524
	mutex_init(&dev->lock);
1525
	spin_lock_init(&dev->queue_lock);
1526
	init_waitqueue_head(&dev->open);
1527 1528
	init_waitqueue_head(&dev->wait_frame);
	init_waitqueue_head(&dev->wait_stream);
1529

1530 1531 1532 1533 1534
	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;
1535
	dev->is_em2800 = em28xx_boards[dev->model].is_em2800;
1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546

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

1547
	em28xx_pre_card_setup(dev);
1548

1549
	errCode = em28xx_config(dev);
1550
	if (errCode) {
1551
		em28xx_errdev("error configuring device\n");
1552
		em28xx_devused &= ~(1<<dev->devno);
1553
		kfree(dev);
1554 1555 1556 1557
		return -ENOMEM;
	}

	/* register i2c bus */
1558
	em28xx_i2c_register(dev);
1559 1560

	/* Do board specific init and eeprom reading */
1561
	em28xx_card_setup(dev);
1562 1563

	/* configure the device */
1564
	em28xx_config_i2c(dev);
1565

1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590
	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;

1591
	errCode = em28xx_config(dev);
1592 1593 1594 1595

	/* allocate and fill v4l2 device struct */
	dev->vdev = video_device_alloc();
	if (NULL == dev->vdev) {
1596
		em28xx_errdev("cannot allocate video_device.\n");
1597
		em28xx_devused&=~(1<<dev->devno);
1598
		kfree(dev);
1599 1600 1601 1602 1603 1604 1605 1606
		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);
1607
		kfree(dev);
1608 1609 1610
		return -ENOMEM;
	}

1611 1612 1613 1614 1615 1616 1617 1618 1619 1620
	/* 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 */
1621 1622 1623
	dev->vdev->type = VID_TYPE_CAPTURE;
	if (dev->has_tuner)
		dev->vdev->type |= VID_TYPE_TUNER;
1624
	dev->vdev->fops = &em28xx_v4l_fops;
1625 1626 1627
	dev->vdev->minor = -1;
	dev->vdev->dev = &dev->udev->dev;
	dev->vdev->release = video_device_release;
1628 1629 1630
	snprintf(dev->vdev->name, sizeof(dev->vbi_dev->name), "%s#%d %s",
							 "em28xx",dev->devno,"video");

1631
	list_add_tail(&dev->devlist,&em28xx_devlist);
1632

1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643

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

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

	if (video_register_device(dev->vbi_dev, VFL_TYPE_VBI,
					vbi_nr[dev->devno]) < 0) {
		printk("unable to register vbi device\n");
1660
		mutex_unlock(&dev->lock);
1661 1662 1663 1664
		list_del(&dev->devlist);
		video_device_release(dev->vbi_dev);
		video_device_release(dev->vdev);
		em28xx_devused&=~(1<<dev->devno);
1665
		kfree(dev);
1666 1667 1668 1669 1670 1671 1672 1673
		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);
1674 1675 1676 1677 1678

	return 0;
}

/*
1679
 * em28xx_usb_probe()
1680 1681
 * checks for supported devices
 */
1682
static int em28xx_usb_probe(struct usb_interface *interface,
1683 1684 1685 1686
			    const struct usb_device_id *id)
{
	const struct usb_endpoint_descriptor *endpoint;
	struct usb_device *udev;
1687
	struct usb_interface *uif;
1688
	struct em28xx *dev = NULL;
1689
	int retval = -ENODEV;
1690
	int i, nr, ifnum;
1691 1692

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

1695 1696 1697
	/* Check to see next free device and mark as used */
	nr=find_first_zero_bit(&em28xx_devused,EM28XX_MAXBOARDS);
	em28xx_devused|=1<<nr;
1698

1699
	/* Don't register audio interfaces */
1700
	if (interface->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) {
1701
		em28xx_err(DRIVER_NAME " audio device (%04x:%04x): interface %i, class %i\n",
1702 1703 1704
				udev->descriptor.idVendor,udev->descriptor.idProduct,
				ifnum,
				interface->altsetting[0].desc.bInterfaceClass);
1705 1706

		em28xx_devused&=~(1<<nr);
1707
		return -ENODEV;
1708 1709
	}

1710
	em28xx_err(DRIVER_NAME " new video device (%04x:%04x): interface %i, class %i\n",
1711 1712 1713
			udev->descriptor.idVendor,udev->descriptor.idProduct,
			ifnum,
			interface->altsetting[0].desc.bInterfaceClass);
1714

1715 1716
	endpoint = &interface->cur_altsetting->endpoint[1].desc;

1717
	/* check if the device has the iso in endpoint at the correct place */
1718 1719
	if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) !=
	    USB_ENDPOINT_XFER_ISOC) {
1720
		em28xx_err(DRIVER_NAME " probing error: endpoint is non-ISO endpoint!\n");
1721
		em28xx_devused&=~(1<<nr);
1722 1723 1724
		return -ENODEV;
	}
	if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT) {
1725
		em28xx_err(DRIVER_NAME " probing error: endpoint is ISO OUT endpoint!\n");
1726
		em28xx_devused&=~(1<<nr);
1727 1728 1729
		return -ENODEV;
	}

1730
	if (nr >= EM28XX_MAXBOARDS) {
1731
		printk (DRIVER_NAME ": Supports only %i em28xx boards.\n",EM28XX_MAXBOARDS);
1732
		em28xx_devused&=~(1<<nr);
1733 1734 1735 1736
		return -ENOMEM;
	}

	/* allocate memory for our device state and initialize it */
P
 
Panagiotis Issaris 已提交
1737
	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
1738
	if (dev == NULL) {
1739
		em28xx_err(DRIVER_NAME ": out of memory!\n");
1740
		em28xx_devused&=~(1<<nr);
1741 1742 1743
		return -ENOMEM;
	}

1744
	snprintf(dev->name, 29, "em28xx #%d", nr);
1745 1746
	dev->devno = nr;
	dev->model = id->driver_info;
1747

1748 1749 1750 1751
	/* compute alternate max packet sizes */
	uif = udev->actconfig->interface[0];

	dev->num_alt=uif->num_altsetting;
1752
	em28xx_info("Alternate settings: %i\n",dev->num_alt);
1753 1754 1755 1756
//	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) {
1757 1758
		em28xx_errdev("out of memory!\n");
		em28xx_devused&=~(1<<nr);
1759
		kfree(dev);
1760 1761 1762 1763 1764 1765 1766 1767
		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);
1768
		em28xx_info("Alternate setting %i, max size= %i\n",i,
1769 1770 1771
							dev->alt_max_pkt_size[i]);
	}

1772
	if ((card[nr]>=0)&&(card[nr]<em28xx_bcount))
1773
		dev->model = card[nr];
1774

1775
	/* allocate device struct */
1776
	retval = em28xx_init_dev(&dev, udev, nr);
1777 1778 1779
	if (retval)
		return retval;

1780
	em28xx_info("Found %s\n", em28xx_boards[dev->model].name);
1781 1782 1783 1784 1785 1786 1787

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

/*
1788
 * em28xx_usb_disconnect()
1789 1790 1791
 * called when the device gets diconencted
 * video device will be unregistered on v4l2_close in case it is still open
 */
1792
static void em28xx_usb_disconnect(struct usb_interface *interface)
1793
{
1794 1795 1796
	struct em28xx *dev;

	dev = usb_get_intfdata(interface);
1797 1798 1799 1800 1801
	usb_set_intfdata(interface, NULL);

	if (!dev)
		return;

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

1804
	/* wait until all current v4l2 io is finished then deallocate resources */
1805
	mutex_lock(&dev->lock);
1806 1807 1808 1809

	wake_up_interruptible_all(&dev->open);

	if (dev->users) {
1810
		em28xx_warn
1811
		    ("device /dev/video%d is open! Deregistration and memory "
1812 1813 1814
		     "deallocation are deferred on close.\n",
				dev->vdev->minor-MINOR_VFL_TYPE_GRABBER_MIN);

1815
		dev->state |= DEV_MISCONFIGURED;
1816
		em28xx_uninit_isoc(dev);
1817 1818 1819 1820 1821
		dev->state |= DEV_DISCONNECTED;
		wake_up_interruptible(&dev->wait_frame);
		wake_up_interruptible(&dev->wait_stream);
	} else {
		dev->state |= DEV_DISCONNECTED;
1822
		em28xx_release_resources(dev);
1823 1824
	}

1825

1826
	mutex_unlock(&dev->lock);
1827

1828 1829
	if (!dev->users) {
		kfree(dev->alt_max_pkt_size);
1830
		kfree(dev);
1831
	}
1832 1833 1834

}

1835 1836 1837 1838 1839
static struct usb_driver em28xx_usb_driver = {
	.name = "em28xx",
	.probe = em28xx_usb_probe,
	.disconnect = em28xx_usb_disconnect,
	.id_table = em28xx_id_table,
1840 1841
};

1842
static int __init em28xx_module_init(void)
1843 1844 1845 1846
{
	int result;

	printk(KERN_INFO DRIVER_NAME " v4l2 driver version %d.%d.%d loaded\n",
1847 1848
	       (EM28XX_VERSION_CODE >> 16) & 0xff,
	       (EM28XX_VERSION_CODE >> 8) & 0xff, EM28XX_VERSION_CODE & 0xff);
1849 1850 1851 1852 1853 1854
#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 */
1855
	result = usb_register(&em28xx_usb_driver);
1856
	if (result)
1857
		em28xx_err(DRIVER_NAME
1858 1859 1860 1861 1862
			   " usb_register failed. Error number %d.\n", result);

	return result;
}

1863
static void __exit em28xx_module_exit(void)
1864 1865
{
	/* deregister this driver with the USB subsystem */
1866
	usb_deregister(&em28xx_usb_driver);
1867 1868
}

1869 1870
module_init(em28xx_module_init);
module_exit(em28xx_module_exit);