em28xx-video.c 45.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 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 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265
/* Usage lock check functions */
static int res_get(struct em28xx_fh *fh)
{
	struct em28xx    *dev = fh->dev;
	int		 rc   = 0;

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

	mutex_lock(&dev->lock);

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

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

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

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

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

266
/*
267
 * em28xx_v4l2_open()
268 269
 * inits the device and starts isoc transfer
 */
270
static int em28xx_v4l2_open(struct inode *inode, struct file *filp)
271 272 273
{
	int minor = iminor(inode);
	int errCode = 0;
274
	struct em28xx *h,*dev = NULL;
275
	struct em28xx_fh *fh;
276

277
	list_for_each_entry(h, &em28xx_devlist, devlist) {
278 279
		if (h->vdev->minor == minor) {
			dev  = h;
280 281 282 283 284
			dev->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
		}
		if (h->vbi_dev->minor == minor) {
			dev  = h;
			dev->type = V4L2_BUF_TYPE_VBI_CAPTURE;
285 286
		}
	}
287 288
	if (NULL == dev)
		return -ENODEV;
289

290 291
	em28xx_videodbg("open minor=%d type=%s users=%d\n",
				minor,v4l2_type_names[dev->type],dev->users);
292

293
	fh = kzalloc(sizeof(struct em28xx_fh), GFP_KERNEL);
294

295 296 297
	if (!fh) {
		em28xx_errdev("em28xx-video.c: Out of memory?!\n");
		return -ENOMEM;
298
	}
299 300 301
	mutex_lock(&dev->lock);
	fh->dev = dev;
	filp->private_data = fh;
302

303
	if (dev->type == V4L2_BUF_TYPE_VIDEO_CAPTURE && dev->users == 0) {
304
		em28xx_set_alternate(dev);
305

306 307 308 309 310 311 312
		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;
313

314 315
		em28xx_capture_start(dev, 1);
		em28xx_resolution_set(dev);
316

317

318 319 320 321 322
		/* start the transfer */
		errCode = em28xx_init_isoc(dev);
		if (errCode)
			goto err;

323
		em28xx_empty_framequeues(dev);
324
	}
325 326 327

	dev->users++;

328 329
err:
	mutex_unlock(&dev->lock);
330 331 332 333
	return errCode;
}

/*
334
 * em28xx_realease_resources()
335 336 337
 * unregisters the v4l2,i2c and usb devices
 * called when the device gets disconected or at module unload
*/
338
static void em28xx_release_resources(struct em28xx *dev)
339 340
{

341 342 343 344 345
	/*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);
346
	list_del(&dev->devlist);
347
	video_unregister_device(dev->vdev);
348
	video_unregister_device(dev->vbi_dev);
349
	em28xx_i2c_unregister(dev);
350
	usb_put_dev(dev->udev);
351 352 353 354


	/* Mark device as unused */
	em28xx_devused&=~(1<<dev->devno);
355 356 357
}

/*
358
 * em28xx_v4l2_close()
359 360
 * stops streaming and deallocates all resources allocated by the v4l2 calls and ioctls
 */
361
static int em28xx_v4l2_close(struct inode *inode, struct file *filp)
362
{
363 364 365
	struct em28xx_fh *fh  = filp->private_data;
	struct em28xx    *dev = fh->dev;
	int              errCode;
366

367
	em28xx_videodbg("users=%d\n", dev->users);
368

369 370 371 372

	if (res_check(fh))
		res_free(fh);

373
	mutex_lock(&dev->lock);
374

375 376 377
	if (dev->users == 1) {
		em28xx_uninit_isoc(dev);
		em28xx_release_buffers(dev);
378
		dev->io = IO_NONE;
379

380 381 382 383 384 385 386 387
		/* 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;
		}
388

389 390 391 392 393 394 395 396
		/* 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);
		}
397
	}
398
	kfree(fh);
399 400
	dev->users--;
	wake_up_interruptible_nr(&dev->open, 1);
401
	mutex_unlock(&dev->lock);
402 403 404 405
	return 0;
}

/*
406
 * em28xx_v4l2_read()
407 408 409
 * will allocate buffers when called for the first time
 */
static ssize_t
410
em28xx_v4l2_read(struct file *filp, char __user * buf, size_t count,
411 412
		 loff_t * f_pos)
{
413
	struct em28xx_frame_t *f, *i;
414 415
	unsigned long lock_flags;
	int ret = 0;
416 417
	struct em28xx_fh *fh = filp->private_data;
	struct em28xx *dev = fh->dev;
418

419 420 421 422

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

423 424
	mutex_lock(&dev->lock);

425
	if (dev->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
426
		em28xx_videodbg("V4l2_Buf_type_videocapture is set\n");
427

428 429 430 431
	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)) {
432
			mutex_unlock(&dev->lock);
433 434
			return -EFAULT;
		}
435
		mutex_unlock(&dev->lock);
436 437 438 439 440 441
		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)) {
442
			mutex_unlock(&dev->lock);
443 444
			return -EFAULT;
		}
445
		mutex_unlock(&dev->lock);
446 447 448
		return (1);
	}

449
	if (dev->state & DEV_DISCONNECTED) {
450
		em28xx_videodbg("device not present\n");
451
		mutex_unlock(&dev->lock);
452 453 454 455
		return -ENODEV;
	}

	if (dev->state & DEV_MISCONFIGURED) {
456
		em28xx_videodbg("device misconfigured; close and open it again\n");
457
		mutex_unlock(&dev->lock);
458 459 460 461
		return -EIO;
	}

	if (dev->io == IO_MMAP) {
462
		em28xx_videodbg ("IO method is set to mmap; close and open"
463
				" the device again to choose the read method\n");
464
		mutex_unlock(&dev->lock);
465 466 467 468
		return -EINVAL;
	}

	if (dev->io == IO_NONE) {
469 470
		if (!em28xx_request_buffers(dev, EM28XX_NUM_READ_FRAMES)) {
			em28xx_errdev("read failed, not enough memory\n");
471
			mutex_unlock(&dev->lock);
472 473 474 475
			return -ENOMEM;
		}
		dev->io = IO_READ;
		dev->stream = STREAM_ON;
476
		em28xx_queue_unusedframes(dev);
477 478 479
	}

	if (!count) {
480
		mutex_unlock(&dev->lock);
481 482 483 484 485
		return 0;
	}

	if (list_empty(&dev->outqueue)) {
		if (filp->f_flags & O_NONBLOCK) {
486
			mutex_unlock(&dev->lock);
487 488 489 490 491 492 493
			return -EAGAIN;
		}
		ret = wait_event_interruptible
		    (dev->wait_frame,
		     (!list_empty(&dev->outqueue)) ||
		     (dev->state & DEV_DISCONNECTED));
		if (ret) {
494
			mutex_unlock(&dev->lock);
495 496 497
			return ret;
		}
		if (dev->state & DEV_DISCONNECTED) {
498
			mutex_unlock(&dev->lock);
499 500 501 502
			return -ENODEV;
		}
	}

503
	f = list_entry(dev->outqueue.prev, struct em28xx_frame_t, frame);
504 505 506 507 508 509 510

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

511
	em28xx_queue_unusedframes(dev);
512 513 514 515 516

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

	if (copy_to_user(buf, f->bufmem, count)) {
517
		mutex_unlock(&dev->lock);
518 519 520 521
		return -EFAULT;
	}
	*f_pos += count;

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

	return count;
}

/*
528
 * em28xx_v4l2_poll()
529 530
 * will allocate buffers when called for the first time
 */
531
static unsigned int em28xx_v4l2_poll(struct file *filp, poll_table * wait)
532 533
{
	unsigned int mask = 0;
534 535
	struct em28xx_fh *fh = filp->private_data;
	struct em28xx *dev = fh->dev;
536

537 538 539
	if (unlikely(res_get(fh) < 0))
		return POLLERR;

540
	mutex_lock(&dev->lock);
541 542

	if (dev->state & DEV_DISCONNECTED) {
543
		em28xx_videodbg("device not present\n");
544
	} else if (dev->state & DEV_MISCONFIGURED) {
545
		em28xx_videodbg("device is misconfigured; close and open it again\n");
546 547
	} else {
		if (dev->io == IO_NONE) {
548 549 550
			if (!em28xx_request_buffers
			    (dev, EM28XX_NUM_READ_FRAMES)) {
				em28xx_warn
551 552 553 554 555 556 557 558
				    ("poll() failed, not enough memory\n");
			} else {
				dev->io = IO_READ;
				dev->stream = STREAM_ON;
			}
		}

		if (dev->io == IO_READ) {
559
			em28xx_queue_unusedframes(dev);
560 561 562 563 564
			poll_wait(filp, &dev->wait_frame, wait);

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

565
			mutex_unlock(&dev->lock);
566 567 568 569 570

			return mask;
		}
	}

571
	mutex_unlock(&dev->lock);
572 573 574 575
	return POLLERR;
}

/*
576
 * em28xx_vm_open()
577
 */
578
static void em28xx_vm_open(struct vm_area_struct *vma)
579
{
580
	struct em28xx_frame_t *f = vma->vm_private_data;
581 582 583 584
	f->vma_use_count++;
}

/*
585
 * em28xx_vm_close()
586
 */
587
static void em28xx_vm_close(struct vm_area_struct *vma)
588 589
{
	/* NOTE: buffers are not freed here */
590
	struct em28xx_frame_t *f = vma->vm_private_data;
591 592 593

	if (f->vma_use_count)
		f->vma_use_count--;
594 595
}

596 597 598
static struct vm_operations_struct em28xx_vm_ops = {
	.open = em28xx_vm_open,
	.close = em28xx_vm_close,
599 600 601
};

/*
602
 * em28xx_v4l2_mmap()
603
 */
604
static int em28xx_v4l2_mmap(struct file *filp, struct vm_area_struct *vma)
605
{
606 607 608 609 610 611
	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;
612

613
	if (unlikely(res_get(fh) < 0))
614
		return -EBUSY;
615 616

	mutex_lock(&dev->lock);
617

618
	if (dev->state & DEV_DISCONNECTED) {
619
		em28xx_videodbg("mmap: device not present\n");
620
		mutex_unlock(&dev->lock);
621 622 623 624
		return -ENODEV;
	}

	if (dev->state & DEV_MISCONFIGURED) {
625
		em28xx_videodbg ("mmap: Device is misconfigured; close and "
626
						"open it again\n");
627
		mutex_unlock(&dev->lock);
628 629 630 631 632
		return -EIO;
	}

	if (dev->io != IO_MMAP || !(vma->vm_flags & VM_WRITE) ||
	    size != PAGE_ALIGN(dev->frame[0].buf.length)) {
633
		mutex_unlock(&dev->lock);
634 635 636 637 638 639 640 641
		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) {
642
		em28xx_videodbg("mmap: user supplied mapping address is out of range\n");
643
		mutex_unlock(&dev->lock);
644 645 646 647 648 649 650
		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 */

651
	pos = dev->frame[i].bufmem;
652
	while (size > 0) {	/* size is page-aligned */
653 654
		if (vm_insert_page(vma, start, vmalloc_to_page(pos))) {
			em28xx_videodbg("mmap: vm_insert_page failed\n");
655
			mutex_unlock(&dev->lock);
656 657 658 659 660 661 662
			return -EAGAIN;
		}
		start += PAGE_SIZE;
		pos += PAGE_SIZE;
		size -= PAGE_SIZE;
	}

663
	vma->vm_ops = &em28xx_vm_ops;
664 665
	vma->vm_private_data = &dev->frame[i];

666
	em28xx_vm_open(vma);
667
	mutex_unlock(&dev->lock);
668 669 670 671
	return 0;
}

/*
672
 * em28xx_get_ctrl()
673 674
 * return the current saturation, brightness or contrast, mute state
 */
675
static int em28xx_get_ctrl(struct em28xx *dev, struct v4l2_control *ctrl)
676 677 678 679 680 681 682 683
{
	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;
684 685 686 687 688
	default:
		return -EINVAL;
	}
}

689
/*
690
 * em28xx_set_ctrl()
691 692
 * mute or set new saturation, brightness or contrast
 */
693
static int em28xx_set_ctrl(struct em28xx *dev, const struct v4l2_control *ctrl)
694 695 696 697 698
{
	switch (ctrl->id) {
	case V4L2_CID_AUDIO_MUTE:
		if (ctrl->value != dev->mute) {
			dev->mute = ctrl->value;
699 700
			em28xx_audio_usb_mute(dev, ctrl->value);
			return em28xx_audio_analog_set(dev);
701 702 703 704
		}
		return 0;
	case V4L2_CID_AUDIO_VOLUME:
		dev->volume = ctrl->value;
705
		return em28xx_audio_analog_set(dev);
706 707 708 709 710
	default:
		return -EINVAL;
	}
}

711
/*
712
 * em28xx_stream_interrupt()
713 714
 * stops streaming
 */
715
static int em28xx_stream_interrupt(struct em28xx *dev)
716 717 718 719 720 721 722 723 724
{
	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),
725
				 EM28XX_URB_TIMEOUT);
726 727 728 729
	if (dev->state & DEV_DISCONNECTED)
		return -ENODEV;
	else if (ret) {
		dev->state |= DEV_MISCONFIGURED;
730
		em28xx_videodbg("device is misconfigured; close and "
731 732
			"open /dev/video%d again\n",
				dev->vdev->minor-MINOR_VFL_TYPE_GRABBER_MIN);
733 734 735 736 737 738
		return ret;
	}

	return 0;
}

739
static int em28xx_set_norm(struct em28xx *dev, int width, int height)
740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777
{
	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;

778
	em28xx_resolution_set(dev);
779 780 781 782

	return 0;
}

783 784 785 786 787 788 789 790 791 792 793
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");

794 795 796
	switch (format->type) {
	case V4L2_BUF_TYPE_VIDEO_CAPTURE:
	{
797 798 799 800 801 802 803 804 805 806
		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);
807
		break;
808 809
	}

810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825
	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);
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 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897
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;
	}

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

901 902 903
	width = (((unsigned long)maxw) << 12) / (hscale + 4096L);

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

	height = (((unsigned long)maxh) << 12) / (vscale + 4096L);
907 908 909 910 911 912 913 914 915 916

	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",
917 918 919
		cmd == VIDIOC_TRY_FMT ?
		"VIDIOC_TRY_FMT" :"VIDIOC_S_FMT",
		format->fmt.pix.width, format->fmt.pix.height, hscale, vscale);
920 921 922 923 924 925 926 927 928 929 930 931 932

	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) {
933
		em28xx_videodbg("VIDIOC_SET_FMT: interrupting stream\n");
934 935 936 937 938 939 940 941 942 943 944
		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;
945
	dev->field_size = dev->frame_size >> 1;
946 947 948 949 950 951 952 953 954 955 956
	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;
}
957

958
/*
959
 * em28xx_v4l2_do_ioctl()
960
 * This function is _not_ called directly, but from
961
 * em28xx_v4l2_ioctl. Userspace
962 963
 * copying is done already, arg is a kernel pointer.
 */
964 965
static int em28xx_do_ioctl(struct inode *inode, struct file *filp,
			   struct em28xx *dev, unsigned int cmd, void *arg,
966 967
			   v4l2_kioctl driver_ioctl)
{
968
	struct em28xx_fh *fh = filp->private_data;
969 970 971 972 973
	int ret;

	switch (cmd) {
		/* ---------- tv norms ---------- */
	case VIDIOC_ENUMSTD:
974 975 976
	{
		struct v4l2_standard *e = arg;
		unsigned int i;
977

978 979 980 981 982 983 984 985 986 987
		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;
	}
988
	case VIDIOC_G_STD:
989 990
	{
		v4l2_std_id *id = arg;
991

992 993 994
		*id = dev->tvnorm->id;
		return 0;
	}
995
	case VIDIOC_S_STD:
996 997 998
	{
		v4l2_std_id *id = arg;
		unsigned int i;
999

1000 1001 1002 1003
		for (i = 0; i < TVNORMS; i++)
			if (*id == tvnorms[i].id)
				break;
		if (i == TVNORMS)
1004
			for (i = 0; i < TVNORMS; i++)
1005
				if (*id & tvnorms[i].id)
1006
					break;
1007 1008
		if (i == TVNORMS)
			return -EINVAL;
1009

1010
		mutex_lock(&dev->lock);
1011
		dev->tvnorm = &tvnorms[i];
1012

1013
		em28xx_set_norm(dev, dev->width, dev->height);
1014

1015 1016
		em28xx_i2c_call_clients(dev, VIDIOC_S_STD,
					&dev->tvnorm->id);
1017

1018
		mutex_unlock(&dev->lock);
1019

1020 1021
		return 0;
	}
1022

1023
	/* ------ input switching ---------- */
1024
	case VIDIOC_ENUMINPUT:
1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055
	{
		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;
	}
1056
	case VIDIOC_G_INPUT:
1057 1058 1059
	{
		int *i = arg;
		*i = dev->ctl_input;
1060

1061 1062
		return 0;
	}
1063
	case VIDIOC_S_INPUT:
1064 1065
	{
		int *index = arg;
1066

1067 1068 1069 1070
		if (*index >= MAX_EM28XX_INPUT)
			return -EINVAL;
		if (0 == INPUT(*index)->type)
			return -EINVAL;
1071

1072
		mutex_lock(&dev->lock);
1073
		video_mux(dev, *index);
1074
		mutex_unlock(&dev->lock);
1075

1076 1077
		return 0;
	}
1078
	case VIDIOC_G_AUDIO:
1079 1080 1081
	{
		struct v4l2_audio *a = arg;
		unsigned int index = a->index;
1082

1083 1084 1085 1086
		if (a->index > 1)
			return -EINVAL;
		memset(a, 0, sizeof(*a));
		index = dev->ctl_ainput;
1087

1088 1089 1090 1091
		if (index == 0) {
			strcpy(a->name, "Television");
		} else {
			strcpy(a->name, "Line In");
1092
		}
1093 1094 1095 1096
		a->capability = V4L2_AUDCAP_STEREO;
		a->index = index;
		return 0;
	}
1097
	case VIDIOC_S_AUDIO:
1098 1099
	{
		struct v4l2_audio *a = arg;
1100

1101 1102 1103 1104 1105
		if (a->index != dev->ctl_ainput)
			return -EINVAL;

		return 0;
	}
1106

1107
	/* --- controls ---------------------------------------------- */
1108
	case VIDIOC_QUERYCTRL:
1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120
	{
		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));
1121 1122
					return 0;
				}
1123
			}
1124
		}
1125
		mutex_lock(&dev->lock);
1126
		em28xx_i2c_call_clients(dev,cmd,qc);
1127
		mutex_unlock(&dev->lock);
1128 1129 1130 1131
		if (qc->type)
			return 0;
		else
			return -EINVAL;
1132
	}
1133
	case VIDIOC_G_CTRL:
1134 1135 1136
	{
		struct v4l2_control *ctrl = arg;
		int retval=-EINVAL;
1137

1138 1139 1140
		if (!dev->has_msp34xx)
			retval=em28xx_get_ctrl(dev, ctrl);
		if (retval==-EINVAL) {
1141
			mutex_lock(&dev->lock);
1142
			em28xx_i2c_call_clients(dev,cmd,arg);
1143
			mutex_unlock(&dev->lock);
1144
			return 0;
1145 1146
		} else return retval;
	}
1147
	case VIDIOC_S_CTRL:
1148 1149 1150
	{
		struct v4l2_control *ctrl = arg;
		u8 i;
1151
		mutex_lock(&dev->lock);
1152 1153 1154 1155

		if (!dev->has_msp34xx){
			for (i = 0; i < ARRAY_SIZE(em28xx_qctrl); i++) {
				if (ctrl->id == em28xx_qctrl[i].id) {
1156
					int retval=-EINVAL;
1157 1158 1159 1160 1161
					if (ctrl->value <
					em28xx_qctrl[i].minimum
					|| ctrl->value >
					em28xx_qctrl[i].maximum)
						return -ERANGE;
1162 1163 1164
					retval = em28xx_set_ctrl(dev, ctrl);
					mutex_unlock(&dev->lock);
					return retval;
1165 1166
				}
			}
1167
		}
1168

1169
		em28xx_i2c_call_clients(dev,cmd,arg);
1170
		mutex_unlock(&dev->lock);
1171
		return 0;
1172 1173
	}
	/* --- tuner ioctls ------------------------------------------ */
1174
	case VIDIOC_G_TUNER:
1175 1176
	{
		struct v4l2_tuner *t = arg;
1177

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

1181 1182
		memset(t, 0, sizeof(*t));
		strcpy(t->name, "Tuner");
1183
		mutex_lock(&dev->lock);
1184 1185
		/* let clients fill in the remainder of this struct */
		em28xx_i2c_call_clients(dev, cmd, t);
1186
		mutex_unlock(&dev->lock);
1187 1188 1189 1190
		em28xx_videodbg("VIDIO_G_TUNER: signal=%x, afc=%x\n", t->signal,
				t->afc);
		return 0;
	}
1191
	case VIDIOC_S_TUNER:
1192 1193
	{
		struct v4l2_tuner *t = arg;
1194

1195 1196
		if (0 != t->index)
			return -EINVAL;
1197
		mutex_lock(&dev->lock);
1198 1199
		/* let clients handle this */
		em28xx_i2c_call_clients(dev, cmd, t);
1200
		mutex_unlock(&dev->lock);
1201 1202
		return 0;
	}
1203
	case VIDIOC_G_FREQUENCY:
1204 1205
	{
		struct v4l2_frequency *f = arg;
1206

1207 1208 1209
		memset(f, 0, sizeof(*f));
		f->type = V4L2_TUNER_ANALOG_TV;
		f->frequency = dev->ctl_freq;
1210

1211 1212
		return 0;
	}
1213
	case VIDIOC_S_FREQUENCY:
1214 1215
	{
		struct v4l2_frequency *f = arg;
1216

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

1220 1221
		if (V4L2_TUNER_ANALOG_TV != f->type)
			return -EINVAL;
1222

1223
		mutex_lock(&dev->lock);
1224 1225
		dev->ctl_freq = f->frequency;
		em28xx_i2c_call_clients(dev, VIDIOC_S_FREQUENCY, f);
1226
		mutex_unlock(&dev->lock);
1227 1228
		return 0;
	}
1229
	case VIDIOC_CROPCAP:
1230 1231
	{
		struct v4l2_cropcap *cc = arg;
1232

1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243
		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;
	}
1244
	case VIDIOC_STREAMON:
1245 1246
	{
		int *type = arg;
1247

1248 1249 1250
		if (*type != V4L2_BUF_TYPE_VIDEO_CAPTURE
			|| dev->io != IO_MMAP)
			return -EINVAL;
1251

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

1255 1256 1257
		if (unlikely(res_get(fh) < 0))
			return -EBUSY;

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

1260
		em28xx_videodbg("VIDIOC_STREAMON: starting stream\n");
1261

1262 1263
		return 0;
	}
1264
	case VIDIOC_STREAMOFF:
1265 1266 1267
	{
		int *type = arg;
		int ret;
1268

1269 1270 1271
		if (*type != V4L2_BUF_TYPE_VIDEO_CAPTURE
			|| dev->io != IO_MMAP)
			return -EINVAL;
1272

1273
		mutex_lock(&dev->lock);
1274 1275
		if (dev->stream == STREAM_ON) {
			em28xx_videodbg ("VIDIOC_STREAMOFF: interrupting stream\n");
1276 1277
			if ((ret = em28xx_stream_interrupt(dev))){
				mutex_unlock(&dev->lock);
1278
				return ret;
1279
			}
1280
		}
1281

1282
		em28xx_empty_framequeues(dev);
1283
		mutex_unlock(&dev->lock);
1284 1285 1286

		return 0;
	}
1287 1288 1289 1290 1291 1292 1293 1294
	default:
		return v4l_compat_translate_ioctl(inode, filp, cmd, arg,
						  driver_ioctl);
	}
	return 0;
}

/*
1295
 * em28xx_v4l2_do_ioctl()
1296
 * This function is _not_ called directly, but from
1297
 * em28xx_v4l2_ioctl. Userspace
1298 1299
 * copying is done already, arg is a kernel pointer.
 */
1300
static int em28xx_video_do_ioctl(struct inode *inode, struct file *filp,
1301 1302
				 unsigned int cmd, void *arg)
{
1303 1304
	struct em28xx_fh *fh = filp->private_data;
	struct em28xx *dev   = fh->dev;
1305 1306 1307 1308 1309

	if (!dev)
		return -ENODEV;

	if (video_debug > 1)
1310
		v4l_print_ioctl(dev->name,cmd);
1311 1312 1313 1314 1315 1316

	switch (cmd) {

		/* --- capabilities ------------------------------------------ */
	case VIDIOC_QUERYCAP:
		{
1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335
		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 ---------------------------------------- */
1336
	case VIDIOC_ENUM_FMT:
1337 1338
	{
		struct v4l2_fmtdesc *fmtd = arg;
1339

1340 1341 1342 1343 1344 1345 1346 1347 1348
		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;
	}
1349
	case VIDIOC_G_FMT:
1350 1351 1352 1353 1354 1355
	{
		int retval;
		mutex_lock(&dev->lock);
		retval = em28xx_get_fmt(dev, (struct v4l2_format *) arg);
		mutex_unlock(&dev->lock);
		return retval;
1356

1357
	}
1358 1359
	case VIDIOC_TRY_FMT:
	case VIDIOC_S_FMT:
1360 1361 1362 1363 1364 1365 1366
	{
		int retval;
		mutex_lock(&dev->lock);
		retval = em28xx_set_fmt(dev, cmd, (struct v4l2_format *)arg);
		mutex_unlock(&dev->lock);
		return retval;
	}
1367 1368

	case VIDIOC_REQBUFS:
1369 1370 1371 1372
	{
		struct v4l2_requestbuffers *rb = arg;
		u32 i;
		int ret;
1373

1374 1375 1376
		if (rb->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
			rb->memory != V4L2_MEMORY_MMAP)
			return -EINVAL;
1377

1378 1379 1380 1381 1382 1383
		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;
		}
1384

1385 1386 1387 1388
		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;
1389 1390
			}

1391
		mutex_lock(&dev->lock);
1392 1393
		if (dev->stream == STREAM_ON) {
			em28xx_videodbg("VIDIOC_REQBUFS: interrupting stream\n");
1394 1395
			if ((ret = em28xx_stream_interrupt(dev))){
				mutex_unlock(&dev->lock);
1396
				return ret;
1397
			}
1398
		}
1399

1400
		em28xx_empty_framequeues(dev);
1401

1402 1403 1404 1405
		em28xx_release_buffers(dev);
		if (rb->count)
			rb->count =
				em28xx_request_buffers(dev, rb->count);
1406

1407
		dev->frame_current = NULL;
1408

1409 1410 1411
		em28xx_videodbg ("VIDIOC_REQBUFS: setting io method to mmap: num bufs %i\n",
						rb->count);
		dev->io = rb->count ? IO_MMAP : IO_NONE;
1412
		mutex_unlock(&dev->lock);
1413 1414
		return 0;
	}
1415
	case VIDIOC_QUERYBUF:
1416 1417
	{
		struct v4l2_buffer *b = arg;
1418

1419 1420 1421
		if (b->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
			b->index >= dev->num_frames || dev->io != IO_MMAP)
			return -EINVAL;
1422

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

1425 1426
		if (dev->frame[b->index].vma_use_count) {
			b->flags |= V4L2_BUF_FLAG_MAPPED;
1427
		}
1428 1429 1430 1431 1432 1433
		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;
	}
1434
	case VIDIOC_QBUF:
1435 1436 1437
	{
		struct v4l2_buffer *b = arg;
		unsigned long lock_flags;
1438

1439 1440 1441 1442
		if (b->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
			b->index >= dev->num_frames || dev->io != IO_MMAP) {
			return -EINVAL;
		}
1443

1444 1445 1446 1447
		if (dev->frame[b->index].state != F_UNUSED) {
			return -EAGAIN;
		}
		dev->frame[b->index].state = F_QUEUED;
1448

1449 1450 1451 1452 1453
		/* 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);
1454

1455 1456
		return 0;
	}
1457
	case VIDIOC_DQBUF:
1458 1459 1460 1461 1462
	{
		struct v4l2_buffer *b = arg;
		struct em28xx_frame_t *f;
		unsigned long lock_flags;
		int ret = 0;
1463

1464 1465 1466
		if (b->type != V4L2_BUF_TYPE_VIDEO_CAPTURE
			|| dev->io != IO_MMAP)
			return -EINVAL;
1467

1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481
		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;
		}
1482

1483 1484 1485 1486 1487
		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);
1488

1489 1490
		f->state = F_UNUSED;
		memcpy(b, &f->buf, sizeof(*b));
1491

1492 1493
		if (f->vma_use_count)
			b->flags |= V4L2_BUF_FLAG_MAPPED;
1494

1495 1496
		return 0;
	}
1497
	default:
1498 1499
		return em28xx_do_ioctl(inode, filp, dev, cmd, arg,
				       em28xx_video_do_ioctl);
1500 1501 1502 1503 1504
	}
	return 0;
}

/*
1505 1506
 * em28xx_v4l2_ioctl()
 * handle v4l2 ioctl the main action happens in em28xx_v4l2_do_ioctl()
1507
 */
1508
static int em28xx_v4l2_ioctl(struct inode *inode, struct file *filp,
1509 1510 1511
			     unsigned int cmd, unsigned long arg)
{
	int ret = 0;
1512 1513
	struct em28xx_fh *fh = filp->private_data;
	struct em28xx *dev   = fh->dev;
1514 1515

	if (dev->state & DEV_DISCONNECTED) {
1516
		em28xx_errdev("v4l2 ioctl: device not present\n");
1517 1518 1519 1520
		return -ENODEV;
	}

	if (dev->state & DEV_MISCONFIGURED) {
1521
		em28xx_errdev
1522 1523 1524 1525
		    ("v4l2 ioctl: device is misconfigured; close and open it again\n");
		return -EIO;
	}

1526
	ret = video_usercopy(inode, filp, cmd, arg, em28xx_video_do_ioctl);
1527 1528 1529 1530

	return ret;
}

1531
static const struct file_operations em28xx_v4l_fops = {
1532
	.owner = THIS_MODULE,
1533 1534 1535 1536 1537 1538
	.open = em28xx_v4l2_open,
	.release = em28xx_v4l2_close,
	.ioctl = em28xx_v4l2_ioctl,
	.read = em28xx_v4l2_read,
	.poll = em28xx_v4l2_poll,
	.mmap = em28xx_v4l2_mmap,
1539
	.llseek = no_llseek,
1540 1541
	.compat_ioctl   = v4l_compat_ioctl32,

1542 1543 1544 1545 1546
};

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

/*
1547
 * em28xx_init_dev()
1548 1549
 * allocates and inits the device structs, registers i2c bus and v4l device
 */
1550
static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev,
1551
			   int minor)
1552
{
1553
	struct em28xx *dev = *devhandle;
1554 1555 1556 1557 1558
	int retval = -ENOMEM;
	int errCode, i;
	unsigned int maxh, maxw;

	dev->udev = udev;
1559
	mutex_init(&dev->lock);
1560
	spin_lock_init(&dev->queue_lock);
1561
	init_waitqueue_head(&dev->open);
1562 1563
	init_waitqueue_head(&dev->wait_frame);
	init_waitqueue_head(&dev->wait_stream);
1564

1565 1566 1567 1568 1569
	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;
1570
	dev->is_em2800 = em28xx_boards[dev->model].is_em2800;
1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581

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

1582
	em28xx_pre_card_setup(dev);
1583

1584
	errCode = em28xx_config(dev);
1585
	if (errCode) {
1586
		em28xx_errdev("error configuring device\n");
1587
		em28xx_devused &= ~(1<<dev->devno);
1588
		kfree(dev);
1589 1590 1591 1592
		return -ENOMEM;
	}

	/* register i2c bus */
1593
	em28xx_i2c_register(dev);
1594 1595

	/* Do board specific init and eeprom reading */
1596
	em28xx_card_setup(dev);
1597 1598

	/* configure the device */
1599
	em28xx_config_i2c(dev);
1600

1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625
	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;

1626
	errCode = em28xx_config(dev);
1627 1628 1629 1630

	/* allocate and fill v4l2 device struct */
	dev->vdev = video_device_alloc();
	if (NULL == dev->vdev) {
1631
		em28xx_errdev("cannot allocate video_device.\n");
1632
		em28xx_devused&=~(1<<dev->devno);
1633
		kfree(dev);
1634 1635 1636 1637 1638 1639 1640 1641
		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);
1642
		kfree(dev);
1643 1644 1645
		return -ENOMEM;
	}

1646 1647 1648 1649 1650 1651 1652 1653 1654 1655
	/* 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 */
1656 1657 1658
	dev->vdev->type = VID_TYPE_CAPTURE;
	if (dev->has_tuner)
		dev->vdev->type |= VID_TYPE_TUNER;
1659
	dev->vdev->fops = &em28xx_v4l_fops;
1660 1661 1662
	dev->vdev->minor = -1;
	dev->vdev->dev = &dev->udev->dev;
	dev->vdev->release = video_device_release;
1663 1664 1665
	snprintf(dev->vdev->name, sizeof(dev->vbi_dev->name), "%s#%d %s",
							 "em28xx",dev->devno,"video");

1666
	list_add_tail(&dev->devlist,&em28xx_devlist);
1667

1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678

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

1679
	/* register v4l2 device */
1680 1681
	if ((retval = video_register_device(dev->vdev, VFL_TYPE_GRABBER,
					 video_nr[dev->devno]))) {
1682
		em28xx_errdev("unable to register video device (error=%i).\n",
1683
			      retval);
1684
		mutex_unlock(&dev->lock);
1685
		list_del(&dev->devlist);
1686
		video_device_release(dev->vdev);
1687
		em28xx_devused&=~(1<<dev->devno);
1688
		kfree(dev);
1689 1690
		return -ENODEV;
	}
1691 1692 1693 1694

	if (video_register_device(dev->vbi_dev, VFL_TYPE_VBI,
					vbi_nr[dev->devno]) < 0) {
		printk("unable to register vbi device\n");
1695
		mutex_unlock(&dev->lock);
1696 1697 1698 1699
		list_del(&dev->devlist);
		video_device_release(dev->vbi_dev);
		video_device_release(dev->vdev);
		em28xx_devused&=~(1<<dev->devno);
1700
		kfree(dev);
1701 1702 1703 1704 1705 1706 1707 1708
		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);
1709 1710 1711 1712 1713

	return 0;
}

/*
1714
 * em28xx_usb_probe()
1715 1716
 * checks for supported devices
 */
1717
static int em28xx_usb_probe(struct usb_interface *interface,
1718 1719 1720 1721
			    const struct usb_device_id *id)
{
	const struct usb_endpoint_descriptor *endpoint;
	struct usb_device *udev;
1722
	struct usb_interface *uif;
1723
	struct em28xx *dev = NULL;
1724
	int retval = -ENODEV;
1725
	int i, nr, ifnum;
1726 1727

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

1730 1731 1732
	/* Check to see next free device and mark as used */
	nr=find_first_zero_bit(&em28xx_devused,EM28XX_MAXBOARDS);
	em28xx_devused|=1<<nr;
1733

1734
	/* Don't register audio interfaces */
1735
	if (interface->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) {
1736
		em28xx_err(DRIVER_NAME " audio device (%04x:%04x): interface %i, class %i\n",
1737 1738 1739
				udev->descriptor.idVendor,udev->descriptor.idProduct,
				ifnum,
				interface->altsetting[0].desc.bInterfaceClass);
1740 1741

		em28xx_devused&=~(1<<nr);
1742
		return -ENODEV;
1743 1744
	}

1745
	em28xx_err(DRIVER_NAME " new video device (%04x:%04x): interface %i, class %i\n",
1746 1747 1748
			udev->descriptor.idVendor,udev->descriptor.idProduct,
			ifnum,
			interface->altsetting[0].desc.bInterfaceClass);
1749

1750 1751
	endpoint = &interface->cur_altsetting->endpoint[1].desc;

1752
	/* check if the device has the iso in endpoint at the correct place */
1753 1754
	if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) !=
	    USB_ENDPOINT_XFER_ISOC) {
1755
		em28xx_err(DRIVER_NAME " probing error: endpoint is non-ISO endpoint!\n");
1756
		em28xx_devused&=~(1<<nr);
1757 1758 1759
		return -ENODEV;
	}
	if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT) {
1760
		em28xx_err(DRIVER_NAME " probing error: endpoint is ISO OUT endpoint!\n");
1761
		em28xx_devused&=~(1<<nr);
1762 1763 1764
		return -ENODEV;
	}

1765
	if (nr >= EM28XX_MAXBOARDS) {
1766
		printk (DRIVER_NAME ": Supports only %i em28xx boards.\n",EM28XX_MAXBOARDS);
1767
		em28xx_devused&=~(1<<nr);
1768 1769 1770 1771
		return -ENOMEM;
	}

	/* allocate memory for our device state and initialize it */
P
 
Panagiotis Issaris 已提交
1772
	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
1773
	if (dev == NULL) {
1774
		em28xx_err(DRIVER_NAME ": out of memory!\n");
1775
		em28xx_devused&=~(1<<nr);
1776 1777 1778
		return -ENOMEM;
	}

1779
	snprintf(dev->name, 29, "em28xx #%d", nr);
1780 1781
	dev->devno = nr;
	dev->model = id->driver_info;
1782

1783 1784 1785 1786
	/* compute alternate max packet sizes */
	uif = udev->actconfig->interface[0];

	dev->num_alt=uif->num_altsetting;
1787
	em28xx_info("Alternate settings: %i\n",dev->num_alt);
1788 1789 1790 1791
//	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) {
1792 1793
		em28xx_errdev("out of memory!\n");
		em28xx_devused&=~(1<<nr);
1794
		kfree(dev);
1795 1796 1797 1798 1799 1800 1801 1802
		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);
1803
		em28xx_info("Alternate setting %i, max size= %i\n",i,
1804 1805 1806
							dev->alt_max_pkt_size[i]);
	}

1807
	if ((card[nr]>=0)&&(card[nr]<em28xx_bcount))
1808
		dev->model = card[nr];
1809

1810
	/* allocate device struct */
1811
	retval = em28xx_init_dev(&dev, udev, nr);
1812 1813 1814
	if (retval)
		return retval;

1815
	em28xx_info("Found %s\n", em28xx_boards[dev->model].name);
1816 1817 1818 1819 1820 1821 1822

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

/*
1823
 * em28xx_usb_disconnect()
1824 1825 1826
 * called when the device gets diconencted
 * video device will be unregistered on v4l2_close in case it is still open
 */
1827
static void em28xx_usb_disconnect(struct usb_interface *interface)
1828
{
1829 1830 1831
	struct em28xx *dev;

	dev = usb_get_intfdata(interface);
1832 1833 1834 1835 1836
	usb_set_intfdata(interface, NULL);

	if (!dev)
		return;

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

1839
	/* wait until all current v4l2 io is finished then deallocate resources */
1840
	mutex_lock(&dev->lock);
1841 1842 1843 1844

	wake_up_interruptible_all(&dev->open);

	if (dev->users) {
1845
		em28xx_warn
1846
		    ("device /dev/video%d is open! Deregistration and memory "
1847 1848 1849
		     "deallocation are deferred on close.\n",
				dev->vdev->minor-MINOR_VFL_TYPE_GRABBER_MIN);

1850
		dev->state |= DEV_MISCONFIGURED;
1851
		em28xx_uninit_isoc(dev);
1852 1853 1854 1855 1856
		dev->state |= DEV_DISCONNECTED;
		wake_up_interruptible(&dev->wait_frame);
		wake_up_interruptible(&dev->wait_stream);
	} else {
		dev->state |= DEV_DISCONNECTED;
1857
		em28xx_release_resources(dev);
1858 1859
	}

1860

1861
	mutex_unlock(&dev->lock);
1862

1863 1864
	if (!dev->users) {
		kfree(dev->alt_max_pkt_size);
1865
		kfree(dev);
1866
	}
1867 1868 1869

}

1870 1871 1872 1873 1874
static struct usb_driver em28xx_usb_driver = {
	.name = "em28xx",
	.probe = em28xx_usb_probe,
	.disconnect = em28xx_usb_disconnect,
	.id_table = em28xx_id_table,
1875 1876
};

1877
static int __init em28xx_module_init(void)
1878 1879 1880 1881
{
	int result;

	printk(KERN_INFO DRIVER_NAME " v4l2 driver version %d.%d.%d loaded\n",
1882 1883
	       (EM28XX_VERSION_CODE >> 16) & 0xff,
	       (EM28XX_VERSION_CODE >> 8) & 0xff, EM28XX_VERSION_CODE & 0xff);
1884 1885 1886 1887 1888 1889
#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 */
1890
	result = usb_register(&em28xx_usb_driver);
1891
	if (result)
1892
		em28xx_err(DRIVER_NAME
1893 1894 1895 1896 1897
			   " usb_register failed. Error number %d.\n", result);

	return result;
}

1898
static void __exit em28xx_module_exit(void)
1899 1900
{
	/* deregister this driver with the USB subsystem */
1901
	usb_deregister(&em28xx_usb_driver);
1902 1903
}

1904 1905
module_init(em28xx_module_init);
module_exit(em28xx_module_exit);