tm6000-video.c 42.7 KB
Newer Older
1
/*
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
 *   tm6000-video.c - driver for TM5600/TM6000/TM6010 USB video capture devices
 *
 *  Copyright (C) 2006-2007 Mauro Carvalho Chehab <mchehab@infradead.org>
 *
 *  Copyright (C) 2007 Michel Ludwig <michel.ludwig@gmail.com>
 *	- Fixed module load/unload
 *
 *  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 version 2
 *
 *  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.
21
 */
22

23 24 25 26 27 28 29 30 31 32 33 34 35
#include <linux/module.h>
#include <linux/delay.h>
#include <linux/errno.h>
#include <linux/fs.h>
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/mm.h>
#include <linux/ioport.h>
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/random.h>
#include <linux/usb.h>
#include <linux/videodev2.h>
36
#include <media/v4l2-ioctl.h>
37
#include <media/v4l2-event.h>
38
#include <media/tuner.h>
39 40 41 42 43 44 45 46 47 48
#include <linux/interrupt.h>
#include <linux/kthread.h>
#include <linux/highmem.h>
#include <linux/freezer.h>

#include "tm6000-regs.h"
#include "tm6000.h"

#define BUFFER_TIMEOUT     msecs_to_jiffies(2000)  /* 2 seconds */

49 50 51 52
/* Limits minimum and default number of buffers */
#define TM6000_MIN_BUF 4
#define TM6000_DEF_BUF 8

53 54
#define TM6000_NUM_URB_BUF 8

55
#define TM6000_MAX_ISO_PACKETS	46	/* Max number of ISO packets */
56

57 58 59
/* Declare static vars that will be used as parameters */
static unsigned int vid_limit = 16;	/* Video memory limit, in Mb */
static int video_nr = -1;		/* /dev/videoN, -1 for autodetect */
60
static int radio_nr = -1;		/* /dev/radioN, -1 for autodetect */
61
static bool keep_urb;			/* keep urb buffers allocated */
62 63 64

/* Debug level */
int tm6000_debug;
65
EXPORT_SYMBOL_GPL(tm6000_debug);
66 67 68 69 70 71

static struct tm6000_fmt format[] = {
	{
		.name     = "4:2:2, packed, YVY2",
		.fourcc   = V4L2_PIX_FMT_YUYV,
		.depth    = 16,
72
	}, {
73 74 75
		.name     = "4:2:2, packed, UYVY",
		.fourcc   = V4L2_PIX_FMT_UYVY,
		.depth    = 16,
76
	}, {
77 78 79 80 81 82 83
		.name     = "A/V + VBI mux packet",
		.fourcc   = V4L2_PIX_FMT_TM6000,
		.depth    = 16,
	}
};

/* ------------------------------------------------------------------
84 85 86
 *	DMA and thread functions
 * ------------------------------------------------------------------
 */
87 88

#define norm_maxw(a) 720
89
#define norm_maxh(a) 576
90 91 92 93 94 95 96

#define norm_minw(a) norm_maxw(a)
#define norm_minh(a) norm_maxh(a)

/*
 * video-buf generic routine to get the next available buffer
 */
97
static inline void get_next_buf(struct tm6000_dmaqueue *dma_q,
98
			       struct tm6000_buffer   **buf)
99
{
100
	struct tm6000_core *dev = container_of(dma_q, struct tm6000_core, vidq);
101 102

	if (list_empty(&dma_q->active)) {
103
		dprintk(dev, V4L2_DEBUG_QUEUE, "No active queue to serve\n");
104
		*buf = NULL;
105
		return;
106 107 108 109 110 111 112 113 114
	}

	*buf = list_entry(dma_q->active.next,
			struct tm6000_buffer, vb.queue);
}

/*
 * Announces that a buffer were filled and request the next
 */
115 116 117
static inline void buffer_filled(struct tm6000_core *dev,
				 struct tm6000_dmaqueue *dma_q,
				 struct tm6000_buffer *buf)
118 119
{
	/* Advice that buffer was filled */
120
	dprintk(dev, V4L2_DEBUG_ISOC, "[%p/%d] wakeup\n", buf, buf->vb.i);
121
	buf->vb.state = VIDEOBUF_DONE;
122
	buf->vb.field_count++;
123
	v4l2_get_timestamp(&buf->vb.ts);
124 125 126 127 128 129 130 131

	list_del(&buf->vb.queue);
	wake_up(&buf->vb.done);
}

/*
 * Identify the tm5600/6000 buffer header type and properly handles
 */
132 133
static int copy_streams(u8 *data, unsigned long len,
			struct urb *urb)
134 135
{
	struct tm6000_dmaqueue  *dma_q = urb->context;
136
	struct tm6000_core *dev = container_of(dma_q, struct tm6000_core, vidq);
137
	u8 *ptr = data, *endp = data+len;
138 139
	unsigned long header = 0;
	int rc = 0;
140
	unsigned int cmd, cpysize, pktsize, size, field, block, line, pos = 0;
141
	struct tm6000_buffer *vbuf = NULL;
142 143 144
	char *voutp = NULL;
	unsigned int linewidth;

145 146 147 148 149 150 151 152 153 154 155
	if (!dev->radio) {
		/* get video buffer */
		get_next_buf(dma_q, &vbuf);

		if (!vbuf)
			return rc;
		voutp = videobuf_to_vmalloc(&vbuf->vb);

		if (!voutp)
			return 0;
	}
156

157
	for (ptr = data; ptr < endp;) {
158
		if (!dev->isoc_ctl.cmd) {
159 160 161 162 163
			/* Header */
			if (dev->isoc_ctl.tmp_buf_len > 0) {
				/* from last urb or packet */
				header = dev->isoc_ctl.tmp_buf;
				if (4 - dev->isoc_ctl.tmp_buf_len > 0) {
164
					memcpy((u8 *)&header +
165
						dev->isoc_ctl.tmp_buf_len,
166
						ptr,
167 168
						4 - dev->isoc_ctl.tmp_buf_len);
					ptr += 4 - dev->isoc_ctl.tmp_buf_len;
169
				}
170 171 172 173 174
				dev->isoc_ctl.tmp_buf_len = 0;
			} else {
				if (ptr + 3 >= endp) {
					/* have incomplete header */
					dev->isoc_ctl.tmp_buf_len = endp - ptr;
175
					memcpy(&dev->isoc_ctl.tmp_buf, ptr,
176 177 178 179 180 181 182 183 184 185 186
						dev->isoc_ctl.tmp_buf_len);
					return rc;
				}
				/* Seek for sync */
				for (; ptr < endp - 3; ptr++) {
					if (*(ptr + 3) == 0x47)
						break;
				}
				/* Get message header */
				header = *(unsigned long *)ptr;
				ptr += 4;
187
			}
188

189 190 191 192 193 194 195 196 197 198 199 200
			/* split the header fields */
			size = ((header & 0x7e) << 1);
			if (size > 0)
				size -= 4;
			block = (header >> 7) & 0xf;
			field = (header >> 11) & 0x1;
			line  = (header >> 12) & 0x1ff;
			cmd   = (header >> 21) & 0x7;
			/* Validates haeder fields */
			if (size > TM6000_URB_MSG_LEN)
				size = TM6000_URB_MSG_LEN;
			pktsize = TM6000_URB_MSG_LEN;
201 202
			/*
			 * calculate position in buffer and change the buffer
203 204 205
			 */
			switch (cmd) {
			case TM6000_URB_MSG_VIDEO:
206 207 208
				if (!dev->radio) {
					if ((dev->isoc_ctl.vfield != field) &&
						(field == 1)) {
209 210 211 212
						/*
						 * Announces that a new buffer
						 * were filled
						 */
213 214
						buffer_filled(dev, dma_q, vbuf);
						dprintk(dev, V4L2_DEBUG_ISOC,
215
							"new buffer filled\n");
216 217 218 219 220 221 222 223 224 225 226 227 228 229 230
						get_next_buf(dma_q, &vbuf);
						if (!vbuf)
							return rc;
						voutp = videobuf_to_vmalloc(&vbuf->vb);
						if (!voutp)
							return rc;
						memset(voutp, 0, vbuf->vb.size);
					}
					linewidth = vbuf->vb.width << 1;
					pos = ((line << 1) - field - 1) *
					linewidth + block * TM6000_URB_MSG_LEN;
					/* Don't allow to write out of the buffer */
					if (pos + size > vbuf->vb.size)
						cmd = TM6000_URB_MSG_ERR;
					dev->isoc_ctl.vfield = field;
231
				}
232 233
				break;
			case TM6000_URB_MSG_VBI:
234 235
				break;
			case TM6000_URB_MSG_AUDIO:
236
			case TM6000_URB_MSG_PTS:
237
				size = pktsize; /* Size is always 180 bytes */
238
				break;
239
			}
240 241 242 243 244 245
		} else {
			/* Continue the last copy */
			cmd = dev->isoc_ctl.cmd;
			size = dev->isoc_ctl.size;
			pos = dev->isoc_ctl.pos;
			pktsize = dev->isoc_ctl.pktsize;
246
			field = dev->isoc_ctl.field;
247 248 249 250 251 252 253 254
		}
		cpysize = (endp - ptr > size) ? size : endp - ptr;
		if (cpysize) {
			/* copy data in different buffers */
			switch (cmd) {
			case TM6000_URB_MSG_VIDEO:
				/* Fills video buffer */
				if (vbuf)
255
					memcpy(&voutp[pos], ptr, cpysize);
256
				break;
257 258 259 260
			case TM6000_URB_MSG_AUDIO: {
				int i;
				for (i = 0; i < cpysize; i += 2)
					swab16s((u16 *)(ptr + i));
D
Dmitri Belimov 已提交
261

262
				tm6000_call_fillbuf(dev, TM6000_AUDIO, ptr, cpysize);
263
				break;
264
			}
265 266 267
			case TM6000_URB_MSG_VBI:
				/* Need some code to copy vbi buffer */
				break;
S
Stefan Ringel 已提交
268
			case TM6000_URB_MSG_PTS: {
269
				/* Need some code to copy pts */
S
Stefan Ringel 已提交
270 271
				u32 pts;
				pts = *(u32 *)ptr;
272 273
				dprintk(dev, V4L2_DEBUG_ISOC, "field %d, PTS %x",
					field, pts);
274
				break;
275
			}
S
Stefan Ringel 已提交
276
			}
277
		}
278
		if (ptr + pktsize > endp) {
279 280
			/*
			 * End of URB packet, but cmd processing is not
281 282 283 284 285
			 * complete. Preserve the state for a next packet
			 */
			dev->isoc_ctl.pos = pos + cpysize;
			dev->isoc_ctl.size = size - cpysize;
			dev->isoc_ctl.cmd = cmd;
286
			dev->isoc_ctl.field = field;
287
			dev->isoc_ctl.pktsize = pktsize - (endp - ptr);
288
			ptr += endp - ptr;
289 290 291
		} else {
			dev->isoc_ctl.cmd = 0;
			ptr += pktsize;
292
		}
293
	}
294
	return 0;
295
}
296

297 298 299
/*
 * Identify the tm5600/6000 buffer header type and properly handles
 */
300 301
static int copy_multiplexed(u8 *ptr, unsigned long len,
			struct urb *urb)
302 303
{
	struct tm6000_dmaqueue  *dma_q = urb->context;
304 305 306
	struct tm6000_core *dev = container_of(dma_q, struct tm6000_core, vidq);
	unsigned int pos = dev->isoc_ctl.pos, cpysize;
	int rc = 1;
307 308 309 310 311 312 313 314 315
	struct tm6000_buffer *buf;
	char *outp = NULL;

	get_next_buf(dma_q, &buf);
	if (buf)
		outp = videobuf_to_vmalloc(&buf->vb);

	if (!outp)
		return 0;
316

317 318
	while (len > 0) {
		cpysize = min(len, buf->vb.size-pos);
319
		memcpy(&outp[pos], ptr, cpysize);
320 321 322
		pos += cpysize;
		ptr += cpysize;
		len -= cpysize;
323
		if (pos >= buf->vb.size) {
324
			pos = 0;
325
			/* Announces that a new buffer were filled */
326
			buffer_filled(dev, dma_q, buf);
327
			dprintk(dev, V4L2_DEBUG_ISOC, "new buffer filled\n");
328
			get_next_buf(dma_q, &buf);
329
			if (!buf)
330
				break;
331 332
			outp = videobuf_to_vmalloc(&(buf->vb));
			if (!outp)
333 334
				return rc;
			pos = 0;
335 336 337
		}
	}

338
	dev->isoc_ctl.pos = pos;
339 340 341
	return rc;
}

342
static inline void print_err_status(struct tm6000_core *dev,
343
				     int packet, int status)
344 345 346
{
	char *errmsg = "Unknown";

347
	switch (status) {
348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372
	case -ENOENT:
		errmsg = "unlinked synchronuously";
		break;
	case -ECONNRESET:
		errmsg = "unlinked asynchronuously";
		break;
	case -ENOSR:
		errmsg = "Buffer error (overrun)";
		break;
	case -EPIPE:
		errmsg = "Stalled (device not responding)";
		break;
	case -EOVERFLOW:
		errmsg = "Babble (bad cable?)";
		break;
	case -EPROTO:
		errmsg = "Bit-stuff error (bad cable?)";
		break;
	case -EILSEQ:
		errmsg = "CRC/Timeout (could be anything)";
		break;
	case -ETIME:
		errmsg = "Device does not respond";
		break;
	}
373
	if (packet < 0) {
374 375 376
		dprintk(dev, V4L2_DEBUG_QUEUE, "URB status %d [%s].\n",
			status, errmsg);
	} else {
377
		dprintk(dev, V4L2_DEBUG_QUEUE, "URB packet %d, status %d [%s].\n",
378 379 380 381 382
			packet, status, errmsg);
	}
}


383 384 385
/*
 * Controls the isoc copy of each urb packet
 */
386
static inline int tm6000_isoc_copy(struct urb *urb)
387 388
{
	struct tm6000_dmaqueue  *dma_q = urb->context;
389 390
	struct tm6000_core *dev = container_of(dma_q, struct tm6000_core, vidq);
	int i, len = 0, rc = 1, status;
391
	char *p;
392

393
	if (urb->status < 0) {
394
		print_err_status(dev, -1, urb->status);
395 396
		return 0;
	}
397 398

	for (i = 0; i < urb->number_of_packets; i++) {
399
		status = urb->iso_frame_desc[i].status;
400

401 402
		if (status < 0) {
			print_err_status(dev, i, status);
403
			continue;
404
		}
405

406
		len = urb->iso_frame_desc[i].actual_length;
407

408 409
		if (len > 0) {
			p = urb->transfer_buffer + urb->iso_frame_desc[i].offset;
410
			if (!urb->iso_frame_desc[i].status) {
411 412 413
				if ((dev->fourcc) == V4L2_PIX_FMT_TM6000) {
					rc = copy_multiplexed(p, len, urb);
					if (rc <= 0)
414 415
						return rc;
				} else {
416
					copy_streams(p, len, urb);
417 418
				}
			}
419
		}
420 421 422 423 424
	}
	return rc;
}

/* ------------------------------------------------------------------
425 426 427
 *	URB control
 * ------------------------------------------------------------------
 */
428 429 430 431 432 433 434

/*
 * IRQ callback, called by URB callback
 */
static void tm6000_irq_callback(struct urb *urb)
{
	struct tm6000_dmaqueue  *dma_q = urb->context;
435
	struct tm6000_core *dev = container_of(dma_q, struct tm6000_core, vidq);
436
	int i;
437

438 439 440 441 442 443 444 445
	switch (urb->status) {
	case 0:
	case -ETIMEDOUT:
		break;

	case -ECONNRESET:
	case -ENOENT:
	case -ESHUTDOWN:
446
		return;
447

448 449 450 451 452
	default:
		tm6000_err("urb completion error %d.\n", urb->status);
		break;
	}

453 454 455
	spin_lock(&dev->slock);
	tm6000_isoc_copy(urb);
	spin_unlock(&dev->slock);
456

457 458 459 460 461
	/* Reset urb buffers */
	for (i = 0; i < urb->number_of_packets; i++) {
		urb->iso_frame_desc[i].status = 0;
		urb->iso_frame_desc[i].actual_length = 0;
	}
462

463 464
	urb->status = usb_submit_urb(urb, GFP_ATOMIC);
	if (urb->status)
465 466 467 468
		tm6000_err("urb resubmit failed (error=%i)\n",
			urb->status);
}

469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533
/*
 * Allocate URB buffers
 */
static int tm6000_alloc_urb_buffers(struct tm6000_core *dev)
{
	int num_bufs = TM6000_NUM_URB_BUF;
	int i;

	if (dev->urb_buffer != NULL)
		return 0;

	dev->urb_buffer = kmalloc(sizeof(void *)*num_bufs, GFP_KERNEL);
	if (!dev->urb_buffer) {
		tm6000_err("cannot allocate memory for urb buffers\n");
		return -ENOMEM;
	}

	dev->urb_dma = kmalloc(sizeof(dma_addr_t *)*num_bufs, GFP_KERNEL);
	if (!dev->urb_dma) {
		tm6000_err("cannot allocate memory for urb dma pointers\n");
		return -ENOMEM;
	}

	for (i = 0; i < num_bufs; i++) {
		dev->urb_buffer[i] = usb_alloc_coherent(
					dev->udev, dev->urb_size,
					GFP_KERNEL, &dev->urb_dma[i]);
		if (!dev->urb_buffer[i]) {
			tm6000_err("unable to allocate %i bytes for transfer buffer %i\n",
				    dev->urb_size, i);
			return -ENOMEM;
		}
		memset(dev->urb_buffer[i], 0, dev->urb_size);
	}

	return 0;
}

/*
 * Free URB buffers
 */
static int tm6000_free_urb_buffers(struct tm6000_core *dev)
{
	int i;

	if (dev->urb_buffer == NULL)
		return 0;

	for (i = 0; i < TM6000_NUM_URB_BUF; i++) {
		if (dev->urb_buffer[i]) {
			usb_free_coherent(dev->udev,
					dev->urb_size,
					dev->urb_buffer[i],
					dev->urb_dma[i]);
			dev->urb_buffer[i] = NULL;
		}
	}
	kfree(dev->urb_buffer);
	kfree(dev->urb_dma);
	dev->urb_buffer = NULL;
	dev->urb_dma = NULL;

	return 0;
}

534 535 536 537 538 539 540 541
/*
 * Stop and Deallocate URBs
 */
static void tm6000_uninit_isoc(struct tm6000_core *dev)
{
	struct urb *urb;
	int i;

542
	dev->isoc_ctl.buf = NULL;
543
	for (i = 0; i < dev->isoc_ctl.num_bufs; i++) {
544
		urb = dev->isoc_ctl.urb[i];
545 546 547 548 549 550 551 552 553
		if (urb) {
			usb_kill_urb(urb);
			usb_unlink_urb(urb);
			usb_free_urb(urb);
			dev->isoc_ctl.urb[i] = NULL;
		}
		dev->isoc_ctl.transfer_buffer[i] = NULL;
	}

554 555 556
	if (!keep_urb)
		tm6000_free_urb_buffers(dev);

557 558
	kfree(dev->isoc_ctl.urb);
	kfree(dev->isoc_ctl.transfer_buffer);
559

560 561
	dev->isoc_ctl.urb = NULL;
	dev->isoc_ctl.transfer_buffer = NULL;
562
	dev->isoc_ctl.num_bufs = 0;
563 564 565
}

/*
566
 * Assign URBs and start IRQ
567
 */
568
static int tm6000_prepare_isoc(struct tm6000_core *dev)
569 570
{
	struct tm6000_dmaqueue *dma_q = &dev->vidq;
571 572
	int i, j, sb_size, pipe, size, max_packets;
	int num_bufs = TM6000_NUM_URB_BUF;
573
	struct urb *urb;
574

575 576
	/* De-allocates all pending stuff */
	tm6000_uninit_isoc(dev);
D
Dmitri Belimov 已提交
577 578
	/* Stop interrupt USB pipe */
	tm6000_ir_int_stop(dev);
579

580 581 582 583
	usb_set_interface(dev->udev,
			  dev->isoc_in.bInterfaceNumber,
			  dev->isoc_in.bAlternateSetting);

D
Dmitri Belimov 已提交
584 585 586
	/* Start interrupt USB pipe */
	tm6000_ir_int_start(dev);

587
	pipe = usb_rcvisocpipe(dev->udev,
588
			       dev->isoc_in.endp->desc.bEndpointAddress &
589 590 591 592
			       USB_ENDPOINT_NUMBER_MASK);

	size = usb_maxpacket(dev->udev, pipe, usb_pipeout(pipe));

593 594
	if (size > dev->isoc_in.maxsize)
		size = dev->isoc_in.maxsize;
595 596 597

	dev->isoc_ctl.max_pkt_size = size;

598
	max_packets = TM6000_MAX_ISO_PACKETS;
599
	sb_size = max_packets * size;
600
	dev->urb_size = sb_size;
601 602 603

	dev->isoc_ctl.num_bufs = num_bufs;

604
	dev->isoc_ctl.urb = kmalloc(sizeof(void *)*num_bufs, GFP_KERNEL);
605 606 607 608 609
	if (!dev->isoc_ctl.urb) {
		tm6000_err("cannot alloc memory for usb buffers\n");
		return -ENOMEM;
	}

610
	dev->isoc_ctl.transfer_buffer = kmalloc(sizeof(void *)*num_bufs,
611
				   GFP_KERNEL);
612
	if (!dev->isoc_ctl.transfer_buffer) {
613 614 615 616 617
		tm6000_err("cannot allocate memory for usbtransfer\n");
		kfree(dev->isoc_ctl.urb);
		return -ENOMEM;
	}

618 619 620
	dprintk(dev, V4L2_DEBUG_QUEUE, "Allocating %d x %d packets"
		    " (%d bytes) of %d bytes each to handle %u size\n",
		    max_packets, num_bufs, sb_size,
621
		    dev->isoc_in.maxsize, size);
622

623 624 625 626 627 628 629 630 631 632 633

	if (!dev->urb_buffer && tm6000_alloc_urb_buffers(dev) < 0) {
		tm6000_err("cannot allocate memory for urb buffers\n");

		/* call free, as some buffers might have been allocated */
		tm6000_free_urb_buffers(dev);
		kfree(dev->isoc_ctl.urb);
		kfree(dev->isoc_ctl.transfer_buffer);
		return -ENOMEM;
	}

634 635 636 637 638 639
	/* allocate urbs and transfer buffers */
	for (i = 0; i < dev->isoc_ctl.num_bufs; i++) {
		urb = usb_alloc_urb(max_packets, GFP_KERNEL);
		if (!urb) {
			tm6000_err("cannot alloc isoc_ctl.urb %i\n", i);
			tm6000_uninit_isoc(dev);
640
			usb_free_urb(urb);
641 642 643 644
			return -ENOMEM;
		}
		dev->isoc_ctl.urb[i] = urb;

645 646
		urb->transfer_dma = dev->urb_dma[i];
		dev->isoc_ctl.transfer_buffer[i] = dev->urb_buffer[i];
647

648 649 650
		usb_fill_bulk_urb(urb, dev->udev, pipe,
				  dev->isoc_ctl.transfer_buffer[i], sb_size,
				  tm6000_irq_callback, dma_q);
651
		urb->interval = dev->isoc_in.endp->desc.bInterval;
652
		urb->number_of_packets = max_packets;
653
		urb->transfer_flags = URB_ISO_ASAP | URB_NO_TRANSFER_DMA_MAP;
654 655

		for (j = 0; j < max_packets; j++) {
656 657
			urb->iso_frame_desc[j].offset = size * j;
			urb->iso_frame_desc[j].length = size;
658 659 660 661 662 663
		}
	}

	return 0;
}

664
static int tm6000_start_thread(struct tm6000_core *dev)
665
{
666 667
	struct tm6000_dmaqueue *dma_q = &dev->vidq;
	int i;
668

669 670
	dma_q->frame = 0;
	dma_q->ini_jiffies = jiffies;
671 672 673 674 675

	init_waitqueue_head(&dma_q->wq);

	/* submit urbs and enables IRQ */
	for (i = 0; i < dev->isoc_ctl.num_bufs; i++) {
676
		int rc = usb_submit_urb(dev->isoc_ctl.urb[i], GFP_ATOMIC);
677 678 679 680 681 682 683 684 685 686 687 688
		if (rc) {
			tm6000_err("submit of urb %i failed (error=%i)\n", i,
				   rc);
			tm6000_uninit_isoc(dev);
			return rc;
		}
	}

	return 0;
}

/* ------------------------------------------------------------------
689 690 691
 *	Videobuf operations
 * ------------------------------------------------------------------
 */
692

693 694 695 696 697 698 699
static int
buffer_setup(struct videobuf_queue *vq, unsigned int *count, unsigned int *size)
{
	struct tm6000_fh *fh = vq->priv_data;

	*size = fh->fmt->depth * fh->width * fh->height >> 3;
	if (0 == *count)
700 701
		*count = TM6000_DEF_BUF;

702 703
	if (*count < TM6000_MIN_BUF)
		*count = TM6000_MIN_BUF;
704

705 706
	while (*size * *count > vid_limit * 1024 * 1024)
		(*count)--;
707

708 709 710 711 712
	return 0;
}

static void free_buffer(struct videobuf_queue *vq, struct tm6000_buffer *buf)
{
713 714 715 716
	struct tm6000_fh *fh = vq->priv_data;
	struct tm6000_core   *dev = fh->dev;
	unsigned long flags;

717 718 719
	if (in_interrupt())
		BUG();

720 721 722 723 724 725 726 727 728 729 730 731 732 733
	/* We used to wait for the buffer to finish here, but this didn't work
	   because, as we were keeping the state as VIDEOBUF_QUEUED,
	   videobuf_queue_cancel marked it as finished for us.
	   (Also, it could wedge forever if the hardware was misconfigured.)

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

734
	videobuf_vmalloc_free(&buf->vb);
735
	buf->vb.state = VIDEOBUF_NEEDS_INIT;
736 737 738 739 740 741 742
}

static int
buffer_prepare(struct videobuf_queue *vq, struct videobuf_buffer *vb,
						enum v4l2_field field)
{
	struct tm6000_fh     *fh  = vq->priv_data;
743
	struct tm6000_buffer *buf = container_of(vb, struct tm6000_buffer, vb);
744
	struct tm6000_core   *dev = fh->dev;
745
	int rc = 0;
746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763

	BUG_ON(NULL == fh->fmt);


	/* FIXME: It assumes depth=2 */
	/* The only currently supported format is 16 bits/pixel */
	buf->vb.size = fh->fmt->depth*fh->width*fh->height >> 3;
	if (0 != buf->vb.baddr  &&  buf->vb.bsize < buf->vb.size)
		return -EINVAL;

	if (buf->fmt       != fh->fmt    ||
	    buf->vb.width  != fh->width  ||
	    buf->vb.height != fh->height ||
	    buf->vb.field  != field) {
		buf->fmt       = fh->fmt;
		buf->vb.width  = fh->width;
		buf->vb.height = fh->height;
		buf->vb.field  = field;
764
		buf->vb.state = VIDEOBUF_NEEDS_INIT;
765 766
	}

767
	if (VIDEOBUF_NEEDS_INIT == buf->vb.state) {
768 769
		rc = videobuf_iolock(vq, &buf->vb, NULL);
		if (rc != 0)
770 771 772
			goto fail;
	}

773
	if (!dev->isoc_ctl.num_bufs) {
774
		rc = tm6000_prepare_isoc(dev);
775 776
		if (rc < 0)
			goto fail;
777

778
		rc = tm6000_start_thread(dev);
779
		if (rc < 0)
780
			goto fail;
781

782 783
	}

784
	buf->vb.state = VIDEOBUF_PREPARED;
785 786 787
	return 0;

fail:
788
	free_buffer(vq, buf);
789 790 791 792 793 794
	return rc;
}

static void
buffer_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb)
{
795
	struct tm6000_buffer    *buf     = container_of(vb, struct tm6000_buffer, vb);
796 797 798
	struct tm6000_fh        *fh      = vq->priv_data;
	struct tm6000_core      *dev     = fh->dev;
	struct tm6000_dmaqueue  *vidq    = &dev->vidq;
799 800 801

	buf->vb.state = VIDEOBUF_QUEUED;
	list_add_tail(&buf->vb.queue, &vidq->active);
802 803 804 805
}

static void buffer_release(struct videobuf_queue *vq, struct videobuf_buffer *vb)
{
806
	struct tm6000_buffer   *buf  = container_of(vb, struct tm6000_buffer, vb);
807

808
	free_buffer(vq, buf);
809 810 811 812 813 814 815 816 817 818
}

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

/* ------------------------------------------------------------------
819 820 821
 *	IOCTL handling
 * ------------------------------------------------------------------
 */
822

823
static bool is_res_read(struct tm6000_core *dev, struct tm6000_fh *fh)
824
{
825 826 827 828 829 830 831 832 833 834 835 836 837 838
	/* Is the current fh handling it? if so, that's OK */
	if (dev->resources == fh && dev->is_res_read)
		return true;

	return false;
}

static bool is_res_streaming(struct tm6000_core *dev, struct tm6000_fh *fh)
{
	/* Is the current fh handling it? if so, that's OK */
	if (dev->resources == fh)
		return true;

	return false;
839 840
}

841 842
static bool res_get(struct tm6000_core *dev, struct tm6000_fh *fh,
		   bool is_res_read)
843
{
844 845 846 847 848 849 850 851 852 853 854 855 856
	/* Is the current fh handling it? if so, that's OK */
	if (dev->resources == fh && dev->is_res_read == is_res_read)
		return true;

	/* is it free? */
	if (dev->resources)
		return false;

	/* grab it */
	dev->resources = fh;
	dev->is_res_read = is_res_read;
	dprintk(dev, V4L2_DEBUG_RES_LOCK, "res: get\n");
	return true;
857 858 859 860
}

static void res_free(struct tm6000_core *dev, struct tm6000_fh *fh)
{
861 862 863 864 865
	/* Is the current fh handling it? if so, that's OK */
	if (dev->resources != fh)
		return;

	dev->resources = NULL;
866 867 868 869
	dprintk(dev, V4L2_DEBUG_RES_LOCK, "res: put\n");
}

/* ------------------------------------------------------------------
870 871 872 873
 *	IOCTL vidioc handling
 * ------------------------------------------------------------------
 */
static int vidioc_querycap(struct file *file, void  *priv,
874 875
					struct v4l2_capability *cap)
{
876
	struct tm6000_core *dev = ((struct tm6000_fh *)priv)->dev;
877
	struct video_device *vdev = video_devdata(file);
878 879

	strlcpy(cap->driver, "tm6000", sizeof(cap->driver));
880
	strlcpy(cap->card, "Trident TVMaster TM5600/6000/6010", sizeof(cap->card));
881
	usb_make_path(dev->udev, cap->bus_info, sizeof(cap->bus_info));
882
	if (dev->tuner_type != TUNER_ABSENT)
883 884 885 886 887 888 889 890 891
		cap->device_caps |= V4L2_CAP_TUNER;
	if (vdev->vfl_type == VFL_TYPE_GRABBER)
		cap->device_caps |= V4L2_CAP_VIDEO_CAPTURE |
				V4L2_CAP_STREAMING |
				V4L2_CAP_READWRITE;
	else
		cap->device_caps |= V4L2_CAP_RADIO;
	cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS |
		V4L2_CAP_RADIO | V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE;
892

893 894 895
	return 0;
}

896
static int vidioc_enum_fmt_vid_cap(struct file *file, void  *priv,
897 898
					struct v4l2_fmtdesc *f)
{
899
	if (f->index >= ARRAY_SIZE(format))
900 901
		return -EINVAL;

902
	strlcpy(f->description, format[f->index].name, sizeof(f->description));
903 904 905 906
	f->pixelformat = format[f->index].fourcc;
	return 0;
}

907
static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
908 909
					struct v4l2_format *f)
{
910
	struct tm6000_fh  *fh = priv;
911 912 913 914 915

	f->fmt.pix.width        = fh->width;
	f->fmt.pix.height       = fh->height;
	f->fmt.pix.field        = fh->vb_vidq.field;
	f->fmt.pix.pixelformat  = fh->fmt->fourcc;
916
	f->fmt.pix.colorspace   = V4L2_COLORSPACE_SMPTE170M;
917 918 919 920
	f->fmt.pix.bytesperline =
		(f->fmt.pix.width * fh->fmt->depth) >> 3;
	f->fmt.pix.sizeimage =
		f->fmt.pix.height * f->fmt.pix.bytesperline;
H
Hans Verkuil 已提交
921
	f->fmt.pix.priv = 0;
922

923
	return 0;
924 925
}

926
static struct tm6000_fmt *format_by_fourcc(unsigned int fourcc)
927 928 929 930 931 932 933 934 935
{
	unsigned int i;

	for (i = 0; i < ARRAY_SIZE(format); i++)
		if (format[i].fourcc == fourcc)
			return format+i;
	return NULL;
}

936
static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
937 938 939 940 941 942 943 944 945 946 947 948 949 950 951
			struct v4l2_format *f)
{
	struct tm6000_core *dev = ((struct tm6000_fh *)priv)->dev;
	struct tm6000_fmt *fmt;
	enum v4l2_field field;

	fmt = format_by_fourcc(f->fmt.pix.pixelformat);
	if (NULL == fmt) {
		dprintk(dev, V4L2_DEBUG_IOCTL_ARG, "Fourcc format (0x%08x)"
				" invalid.\n", f->fmt.pix.pixelformat);
		return -EINVAL;
	}

	field = f->fmt.pix.field;

H
Hans Verkuil 已提交
952
	field = V4L2_FIELD_INTERLACED;
953

954
	tm6000_get_std_res(dev);
955

956 957
	f->fmt.pix.width  = dev->width;
	f->fmt.pix.height = dev->height;
958 959 960 961

	f->fmt.pix.width &= ~0x01;

	f->fmt.pix.field = field;
H
Hans Verkuil 已提交
962
	f->fmt.pix.priv = 0;
963 964 965 966 967

	f->fmt.pix.bytesperline =
		(f->fmt.pix.width * fmt->depth) >> 3;
	f->fmt.pix.sizeimage =
		f->fmt.pix.height * f->fmt.pix.bytesperline;
968
	f->fmt.pix.colorspace   = V4L2_COLORSPACE_SMPTE170M;
969 970 971 972 973

	return 0;
}

/*FIXME: This seems to be generic enough to be at videodev2 */
974
static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
975 976
					struct v4l2_format *f)
{
977
	struct tm6000_fh  *fh = priv;
978
	struct tm6000_core *dev = fh->dev;
979
	int ret = vidioc_try_fmt_vid_cap(file, fh, f);
980
	if (ret < 0)
981
		return ret;
982 983 984 985 986 987 988 989 990 991 992

	fh->fmt           = format_by_fourcc(f->fmt.pix.pixelformat);
	fh->width         = f->fmt.pix.width;
	fh->height        = f->fmt.pix.height;
	fh->vb_vidq.field = f->fmt.pix.field;
	fh->type          = f->type;

	dev->fourcc       = f->fmt.pix.pixelformat;

	tm6000_set_fourcc_format(dev);

993
	return 0;
994 995
}

996
static int vidioc_reqbufs(struct file *file, void *priv,
997 998
			   struct v4l2_requestbuffers *p)
{
999
	struct tm6000_fh  *fh = priv;
1000

1001
	return videobuf_reqbufs(&fh->vb_vidq, p);
1002 1003
}

1004
static int vidioc_querybuf(struct file *file, void *priv,
1005 1006
			    struct v4l2_buffer *p)
{
1007
	struct tm6000_fh  *fh = priv;
1008

1009
	return videobuf_querybuf(&fh->vb_vidq, p);
1010 1011
}

1012
static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *p)
1013
{
1014
	struct tm6000_fh  *fh = priv;
1015

1016
	return videobuf_qbuf(&fh->vb_vidq, p);
1017 1018
}

1019
static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *p)
1020
{
1021
	struct tm6000_fh  *fh = priv;
1022

1023 1024
	return videobuf_dqbuf(&fh->vb_vidq, p,
				file->f_flags & O_NONBLOCK);
1025 1026 1027 1028
}

static int vidioc_streamon(struct file *file, void *priv, enum v4l2_buf_type i)
{
1029 1030
	struct tm6000_fh *fh = priv;
	struct tm6000_core *dev = fh->dev;
1031 1032 1033 1034 1035 1036

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

1037
	if (!res_get(dev, fh, false))
1038
		return -EBUSY;
1039
	return videobuf_streamon(&fh->vb_vidq);
1040 1041 1042 1043
}

static int vidioc_streamoff(struct file *file, void *priv, enum v4l2_buf_type i)
{
1044 1045
	struct tm6000_fh *fh = priv;
	struct tm6000_core *dev = fh->dev;
1046 1047 1048

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

1050 1051 1052 1053
	if (i != fh->type)
		return -EINVAL;

	videobuf_streamoff(&fh->vb_vidq);
1054
	res_free(dev, fh);
1055

1056
	return 0;
1057 1058
}

1059
static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id *norm)
1060
{
1061
	int rc = 0;
1062
	struct tm6000_fh *fh = priv;
1063 1064
	struct tm6000_core *dev = fh->dev;

1065
	dev->norm = *norm;
1066
	rc = tm6000_init_analog_mode(dev);
1067 1068 1069 1070

	fh->width  = dev->width;
	fh->height = dev->height;

1071
	if (rc < 0)
1072 1073
		return rc;

1074
	v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_std, dev->norm);
1075 1076 1077 1078

	return 0;
}

1079
static const char *iname[] = {
1080 1081 1082 1083 1084 1085
	[TM6000_INPUT_TV] = "Television",
	[TM6000_INPUT_COMPOSITE1] = "Composite 1",
	[TM6000_INPUT_COMPOSITE2] = "Composite 2",
	[TM6000_INPUT_SVIDEO] = "S-Video",
};

1086
static int vidioc_enum_input(struct file *file, void *priv,
1087
				struct v4l2_input *i)
1088
{
1089 1090
	struct tm6000_fh   *fh = priv;
	struct tm6000_core *dev = fh->dev;
1091
	unsigned int n;
1092

1093 1094
	n = i->index;
	if (n >= 3)
1095
		return -EINVAL;
1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109

	if (!dev->vinput[n].type)
		return -EINVAL;

	i->index = n;

	if (dev->vinput[n].type == TM6000_INPUT_TV)
		i->type = V4L2_INPUT_TYPE_TUNER;
	else
		i->type = V4L2_INPUT_TYPE_CAMERA;

	strcpy(i->name, iname[dev->vinput[n].type]);

	i->std = TM6000_STD;
1110 1111 1112 1113

	return 0;
}

1114
static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
1115
{
1116
	struct tm6000_fh   *fh = priv;
1117 1118
	struct tm6000_core *dev = fh->dev;

1119
	*i = dev->input;
1120 1121 1122

	return 0;
}
1123

1124
static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
1125
{
1126
	struct tm6000_fh   *fh = priv;
1127
	struct tm6000_core *dev = fh->dev;
1128
	int rc = 0;
1129

1130 1131 1132
	if (i >= 3)
		return -EINVAL;
	if (!dev->vinput[i].type)
1133 1134
		return -EINVAL;

1135 1136 1137
	dev->input = i;

	rc = vidioc_s_std(file, priv, &dev->vfd->current_norm);
1138

1139
	return rc;
1140 1141
}

1142
/* --- controls ---------------------------------------------- */
1143

1144
static int tm6000_s_ctrl(struct v4l2_ctrl *ctrl)
1145
{
1146 1147
	struct tm6000_core *dev = container_of(ctrl->handler, struct tm6000_core, ctrl_handler);
	u8  val = ctrl->val;
1148 1149 1150

	switch (ctrl->id) {
	case V4L2_CID_CONTRAST:
1151 1152
		tm6000_set_reg(dev, TM6010_REQ07_R08_LUMA_CONTRAST_ADJ, val);
		return 0;
1153
	case V4L2_CID_BRIGHTNESS:
1154
		tm6000_set_reg(dev, TM6010_REQ07_R09_LUMA_BRIGHTNESS_ADJ, val);
1155 1156
		return 0;
	case V4L2_CID_SATURATION:
1157
		tm6000_set_reg(dev, TM6010_REQ07_R0A_CHROMA_SATURATION_ADJ, val);
1158 1159
		return 0;
	case V4L2_CID_HUE:
1160
		tm6000_set_reg(dev, TM6010_REQ07_R0B_CHROMA_HUE_PHASE_ADJ, val);
1161
		return 0;
1162
	}
1163 1164
	return -EINVAL;
}
1165

1166 1167 1168
static const struct v4l2_ctrl_ops tm6000_ctrl_ops = {
	.s_ctrl = tm6000_s_ctrl,
};
1169

1170
static int tm6000_radio_s_ctrl(struct v4l2_ctrl *ctrl)
1171
{
1172 1173 1174
	struct tm6000_core *dev = container_of(ctrl->handler,
			struct tm6000_core, radio_ctrl_handler);
	u8  val = ctrl->val;
1175 1176

	switch (ctrl->id) {
1177 1178 1179 1180 1181 1182 1183 1184
	case V4L2_CID_AUDIO_MUTE:
		dev->ctl_mute = val;
		tm6000_tvaudio_set_mute(dev, val);
		return 0;
	case V4L2_CID_AUDIO_VOLUME:
		dev->ctl_volume = val;
		tm6000_set_volume(dev, val);
		return 0;
1185 1186 1187 1188
	}
	return -EINVAL;
}

1189 1190 1191 1192
static const struct v4l2_ctrl_ops tm6000_radio_ctrl_ops = {
	.s_ctrl = tm6000_radio_s_ctrl,
};

1193
static int vidioc_g_tuner(struct file *file, void *priv,
1194 1195
				struct v4l2_tuner *t)
{
1196
	struct tm6000_fh   *fh  = priv;
1197 1198
	struct tm6000_core *dev = fh->dev;

1199 1200
	if (UNSET == dev->tuner_type)
		return -ENOTTY;
1201 1202 1203 1204 1205
	if (0 != t->index)
		return -EINVAL;

	strcpy(t->name, "Television");
	t->type       = V4L2_TUNER_ANALOG_TV;
1206
	t->capability = V4L2_TUNER_CAP_NORM | V4L2_TUNER_CAP_STEREO;
1207
	t->rangehigh  = 0xffffffffUL;
1208 1209 1210 1211 1212
	t->rxsubchans = V4L2_TUNER_SUB_STEREO;

	v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, g_tuner, t);

	t->audmode = dev->amode;
1213 1214 1215 1216

	return 0;
}

1217
static int vidioc_s_tuner(struct file *file, void *priv,
1218 1219
				struct v4l2_tuner *t)
{
1220
	struct tm6000_fh   *fh  = priv;
1221 1222 1223
	struct tm6000_core *dev = fh->dev;

	if (UNSET == dev->tuner_type)
1224
		return -ENOTTY;
1225 1226 1227
	if (0 != t->index)
		return -EINVAL;

1228 1229 1230 1231
	if (t->audmode > V4L2_TUNER_MODE_STEREO)
		dev->amode = V4L2_TUNER_MODE_STEREO;
	else
		dev->amode = t->audmode;
1232 1233 1234
	dprintk(dev, 3, "audio mode: %x\n", t->audmode);

	v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_tuner, t);
1235

1236 1237 1238
	return 0;
}

1239
static int vidioc_g_frequency(struct file *file, void *priv,
1240 1241
				struct v4l2_frequency *f)
{
1242
	struct tm6000_fh   *fh  = priv;
1243 1244
	struct tm6000_core *dev = fh->dev;

1245 1246 1247
	if (UNSET == dev->tuner_type)
		return -ENOTTY;
	if (f->tuner)
1248 1249 1250 1251
		return -EINVAL;

	f->frequency = dev->freq;

1252
	v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, g_frequency, f);
1253 1254 1255 1256

	return 0;
}

1257
static int vidioc_s_frequency(struct file *file, void *priv,
1258 1259
				struct v4l2_frequency *f)
{
1260
	struct tm6000_fh   *fh  = priv;
1261 1262
	struct tm6000_core *dev = fh->dev;

1263 1264 1265
	if (UNSET == dev->tuner_type)
		return -ENOTTY;
	if (f->tuner != 0)
1266
		return -EINVAL;
1267 1268

	dev->freq = f->frequency;
1269
	v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_frequency, f);
1270 1271 1272 1273

	return 0;
}

1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285
static int radio_g_tuner(struct file *file, void *priv,
					struct v4l2_tuner *t)
{
	struct tm6000_fh *fh = file->private_data;
	struct tm6000_core *dev = fh->dev;

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

	memset(t, 0, sizeof(*t));
	strcpy(t->name, "Radio");
	t->type = V4L2_TUNER_RADIO;
1286
	t->capability = V4L2_TUNER_CAP_LOW | V4L2_TUNER_CAP_STEREO;
1287
	t->rxsubchans = V4L2_TUNER_SUB_STEREO;
1288
	t->audmode = V4L2_TUNER_MODE_STEREO;
1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302

	v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, g_tuner, t);

	return 0;
}

static int radio_s_tuner(struct file *file, void *priv,
					struct v4l2_tuner *t)
{
	struct tm6000_fh *fh = file->private_data;
	struct tm6000_core *dev = fh->dev;

	if (0 != t->index)
		return -EINVAL;
1303 1304
	if (t->audmode > V4L2_TUNER_MODE_STEREO)
		t->audmode = V4L2_TUNER_MODE_STEREO;
1305 1306 1307 1308 1309 1310

	v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_tuner, t);

	return 0;
}

1311 1312 1313 1314
/* ------------------------------------------------------------------
	File operations for the device
   ------------------------------------------------------------------*/

1315
static int __tm6000_open(struct file *file)
1316
{
1317 1318
	struct video_device *vdev = video_devdata(file);
	struct tm6000_core *dev = video_drvdata(file);
1319
	struct tm6000_fh *fh;
1320
	enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1321
	int rc;
1322
	int radio = 0;
1323

1324 1325
	dprintk(dev, V4L2_DEBUG_OPEN, "tm6000: open called (dev=%s)\n",
		video_device_node_name(vdev));
1326

1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337
	switch (vdev->vfl_type) {
	case VFL_TYPE_GRABBER:
		type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
		break;
	case VFL_TYPE_VBI:
		type = V4L2_BUF_TYPE_VBI_CAPTURE;
		break;
	case VFL_TYPE_RADIO:
		radio = 1;
		break;
	}
1338 1339 1340 1341

	/* If more than one user, mutex should be added */
	dev->users++;

1342 1343 1344
	dprintk(dev, V4L2_DEBUG_OPEN, "open dev=%s type=%s users=%d\n",
		video_device_node_name(vdev), v4l2_type_names[type],
		dev->users);
1345 1346

	/* allocate + initialize per filehandle data */
1347
	fh = kzalloc(sizeof(*fh), GFP_KERNEL);
1348 1349 1350 1351 1352
	if (NULL == fh) {
		dev->users--;
		return -ENOMEM;
	}

1353
	v4l2_fh_init(&fh->fh, vdev);
1354 1355
	file->private_data = fh;
	fh->dev      = dev;
1356 1357 1358
	fh->radio    = radio;
	dev->radio   = radio;
	fh->type     = type;
1359 1360 1361
	dev->fourcc  = format[0].fourcc;

	fh->fmt      = format_by_fourcc(dev->fourcc);
1362

1363
	tm6000_get_std_res(dev);
1364

1365 1366
	fh->width = dev->width;
	fh->height = dev->height;
1367 1368 1369

	dprintk(dev, V4L2_DEBUG_OPEN, "Open: fh=0x%08lx, dev=0x%08lx, "
						"dev->vidq=0x%08lx\n",
1370 1371
			(unsigned long)fh, (unsigned long)dev,
			(unsigned long)&dev->vidq);
1372
	dprintk(dev, V4L2_DEBUG_OPEN, "Open: list_empty "
1373
				"queued=%d\n", list_empty(&dev->vidq.queued));
1374
	dprintk(dev, V4L2_DEBUG_OPEN, "Open: list_empty "
1375
				"active=%d\n", list_empty(&dev->vidq.active));
1376 1377

	/* initialize hardware on analog mode */
1378 1379 1380
	rc = tm6000_init_analog_mode(dev);
	if (rc < 0)
		return rc;
1381

1382
	dev->mode = TM6000_MODE_ANALOG;
1383

1384 1385 1386 1387 1388 1389 1390
	if (!fh->radio) {
		videobuf_queue_vmalloc_init(&fh->vb_vidq, &tm6000_video_qops,
				NULL, &dev->slock,
				fh->type,
				V4L2_FIELD_INTERLACED,
				sizeof(struct tm6000_buffer), fh, &dev->lock);
	} else {
1391
		dprintk(dev, V4L2_DEBUG_OPEN, "video_open: setting radio device\n");
1392
		tm6000_set_audio_rinput(dev);
1393 1394 1395 1396
		v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_radio);
		tm6000_prepare_isoc(dev);
		tm6000_start_thread(dev);
	}
1397
	v4l2_fh_add(&fh->fh);
1398

1399 1400 1401
	return 0;
}

1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412
static int tm6000_open(struct file *file)
{
	struct video_device *vdev = video_devdata(file);
	int res;

	mutex_lock(vdev->lock);
	res = __tm6000_open(file);
	mutex_unlock(vdev->lock);
	return res;
}

1413 1414 1415
static ssize_t
tm6000_read(struct file *file, char __user *data, size_t count, loff_t *pos)
{
1416 1417
	struct tm6000_fh *fh = file->private_data;
	struct tm6000_core *dev = fh->dev;
1418

1419
	if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
1420 1421
		int res;

1422
		if (!res_get(fh->dev, fh, true))
1423 1424
			return -EBUSY;

1425 1426 1427
		if (mutex_lock_interruptible(&dev->lock))
			return -ERESTARTSYS;
		res = videobuf_read_stream(&fh->vb_vidq, data, count, pos, 0,
1428
					file->f_flags & O_NONBLOCK);
1429 1430
		mutex_unlock(&dev->lock);
		return res;
1431 1432 1433 1434 1435
	}
	return 0;
}

static unsigned int
1436
__tm6000_poll(struct file *file, struct poll_table_struct *wait)
1437
{
1438
	unsigned long req_events = poll_requested_events(wait);
1439 1440
	struct tm6000_fh        *fh = file->private_data;
	struct tm6000_buffer    *buf;
1441
	int res = 0;
1442

1443 1444 1445 1446
	if (v4l2_event_pending(&fh->fh))
		res = POLLPRI;
	else if (req_events & POLLPRI)
		poll_wait(file, &fh->fh.wait, wait);
1447
	if (V4L2_BUF_TYPE_VIDEO_CAPTURE != fh->type)
1448
		return res | POLLERR;
1449

1450
	if (!!is_res_streaming(fh->dev, fh))
1451
		return res | POLLERR;
1452 1453

	if (!is_res_read(fh->dev, fh)) {
1454 1455
		/* streaming capture */
		if (list_empty(&fh->vb_vidq.stream))
1456
			return res | POLLERR;
1457
		buf = list_entry(fh->vb_vidq.stream.next, struct tm6000_buffer, vb.stream);
1458
	} else if (req_events & (POLLIN | POLLRDNORM)) {
1459
		/* read() capture */
1460
		return res | videobuf_poll_stream(file, &fh->vb_vidq, wait);
1461 1462
	}
	poll_wait(file, &buf->vb.done, wait);
1463 1464
	if (buf->vb.state == VIDEOBUF_DONE ||
	    buf->vb.state == VIDEOBUF_ERROR)
1465 1466
		return res | POLLIN | POLLRDNORM;
	return res;
1467 1468
}

1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480
static unsigned int tm6000_poll(struct file *file, struct poll_table_struct *wait)
{
	struct tm6000_fh *fh = file->private_data;
	struct tm6000_core *dev = fh->dev;
	unsigned int res;

	mutex_lock(&dev->lock);
	res = __tm6000_poll(file, wait);
	mutex_unlock(&dev->lock);
	return res;
}

1481
static int tm6000_release(struct file *file)
1482 1483 1484
{
	struct tm6000_fh         *fh = file->private_data;
	struct tm6000_core      *dev = fh->dev;
1485
	struct video_device    *vdev = video_devdata(file);
1486

1487 1488
	dprintk(dev, V4L2_DEBUG_OPEN, "tm6000: close called (dev=%s, users=%d)\n",
		video_device_node_name(vdev), dev->users);
1489

1490
	mutex_lock(&dev->lock);
1491 1492
	dev->users--;

1493
	res_free(dev, fh);
1494

1495
	if (!dev->users) {
1496
		tm6000_uninit_isoc(dev);
1497

1498 1499 1500 1501 1502
		/* Stop interrupt USB pipe */
		tm6000_ir_int_stop(dev);

		usb_reset_configuration(dev->udev);

1503
		if (dev->int_in.endp)
1504
			usb_set_interface(dev->udev,
1505
					dev->isoc_in.bInterfaceNumber, 2);
1506 1507
		else
			usb_set_interface(dev->udev,
1508
					dev->isoc_in.bInterfaceNumber, 0);
1509 1510 1511 1512

		/* Start interrupt USB pipe */
		tm6000_ir_int_start(dev);

1513 1514
		if (!fh->radio)
			videobuf_mmap_free(&fh->vb_vidq);
1515
	}
1516 1517
	v4l2_fh_del(&fh->fh);
	v4l2_fh_exit(&fh->fh);
1518
	kfree(fh);
1519
	mutex_unlock(&dev->lock);
1520 1521 1522 1523 1524 1525

	return 0;
}

static int tm6000_mmap(struct file *file, struct vm_area_struct * vma)
{
1526
	struct tm6000_fh *fh = file->private_data;
1527 1528
	struct tm6000_core *dev = fh->dev;
	int res;
1529

1530 1531 1532 1533 1534
	if (mutex_lock_interruptible(&dev->lock))
		return -ERESTARTSYS;
	res = videobuf_mmap_mapper(&fh->vb_vidq, vma);
	mutex_unlock(&dev->lock);
	return res;
1535 1536
}

1537
static struct v4l2_file_operations tm6000_fops = {
1538 1539 1540 1541 1542 1543 1544
	.owner = THIS_MODULE,
	.open = tm6000_open,
	.release = tm6000_release,
	.unlocked_ioctl = video_ioctl2, /* V4L2 ioctl handler */
	.read = tm6000_read,
	.poll = tm6000_poll,
	.mmap = tm6000_mmap,
1545 1546
};

1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566
static const struct v4l2_ioctl_ops video_ioctl_ops = {
	.vidioc_querycap          = vidioc_querycap,
	.vidioc_enum_fmt_vid_cap  = vidioc_enum_fmt_vid_cap,
	.vidioc_g_fmt_vid_cap     = vidioc_g_fmt_vid_cap,
	.vidioc_try_fmt_vid_cap   = vidioc_try_fmt_vid_cap,
	.vidioc_s_fmt_vid_cap     = vidioc_s_fmt_vid_cap,
	.vidioc_s_std             = vidioc_s_std,
	.vidioc_enum_input        = vidioc_enum_input,
	.vidioc_g_input           = vidioc_g_input,
	.vidioc_s_input           = vidioc_s_input,
	.vidioc_g_tuner           = vidioc_g_tuner,
	.vidioc_s_tuner           = vidioc_s_tuner,
	.vidioc_g_frequency       = vidioc_g_frequency,
	.vidioc_s_frequency       = vidioc_s_frequency,
	.vidioc_streamon          = vidioc_streamon,
	.vidioc_streamoff         = vidioc_streamoff,
	.vidioc_reqbufs           = vidioc_reqbufs,
	.vidioc_querybuf          = vidioc_querybuf,
	.vidioc_qbuf              = vidioc_qbuf,
	.vidioc_dqbuf             = vidioc_dqbuf,
1567 1568
	.vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
	.vidioc_unsubscribe_event = v4l2_event_unsubscribe,
1569 1570
};

1571 1572 1573
static struct video_device tm6000_template = {
	.name		= "tm6000",
	.fops           = &tm6000_fops,
1574
	.ioctl_ops      = &video_ioctl_ops,
1575
	.release	= video_device_release,
1576 1577
	.tvnorms        = TM6000_STD,
	.current_norm   = V4L2_STD_NTSC_M,
1578
};
1579

1580
static const struct v4l2_file_operations radio_fops = {
1581 1582
	.owner		= THIS_MODULE,
	.open		= tm6000_open,
1583
	.poll		= v4l2_ctrl_poll,
1584 1585
	.release	= tm6000_release,
	.unlocked_ioctl	= video_ioctl2,
1586 1587 1588
};

static const struct v4l2_ioctl_ops radio_ioctl_ops = {
1589
	.vidioc_querycap	= vidioc_querycap,
1590 1591 1592 1593
	.vidioc_g_tuner		= radio_g_tuner,
	.vidioc_s_tuner		= radio_s_tuner,
	.vidioc_g_frequency	= vidioc_g_frequency,
	.vidioc_s_frequency	= vidioc_s_frequency,
1594 1595
	.vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
	.vidioc_unsubscribe_event = v4l2_event_unsubscribe,
1596 1597
};

1598
static struct video_device tm6000_radio_template = {
1599 1600
	.name			= "tm6000",
	.fops			= &radio_fops,
1601
	.ioctl_ops		= &radio_ioctl_ops,
1602 1603
};

1604
/* -----------------------------------------------------------------
1605 1606 1607
 *	Initialization and module stuff
 * ------------------------------------------------------------------
 */
1608

1609 1610 1611
static struct video_device *vdev_init(struct tm6000_core *dev,
		const struct video_device
		*template, const char *type_name)
1612
{
1613 1614 1615
	struct video_device *vfd;

	vfd = video_device_alloc();
1616 1617 1618 1619 1620 1621 1622 1623
	if (NULL == vfd)
		return NULL;

	*vfd = *template;
	vfd->v4l2_dev = &dev->v4l2_dev;
	vfd->release = video_device_release;
	vfd->debug = tm6000_debug;
	vfd->lock = &dev->lock;
1624
	set_bit(V4L2_FL_USE_FH_PRIO, &vfd->flags);
1625 1626 1627 1628 1629 1630 1631 1632 1633

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

	video_set_drvdata(vfd, dev);
	return vfd;
}

int tm6000_v4l2_register(struct tm6000_core *dev)
{
1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658
	int ret = 0;

	v4l2_ctrl_handler_init(&dev->ctrl_handler, 6);
	v4l2_ctrl_handler_init(&dev->radio_ctrl_handler, 2);
	v4l2_ctrl_new_std(&dev->radio_ctrl_handler, &tm6000_radio_ctrl_ops,
			V4L2_CID_AUDIO_MUTE, 0, 1, 1, 0);
	v4l2_ctrl_new_std(&dev->radio_ctrl_handler, &tm6000_radio_ctrl_ops,
			V4L2_CID_AUDIO_VOLUME, -15, 15, 1, 0);
	v4l2_ctrl_new_std(&dev->ctrl_handler, &tm6000_ctrl_ops,
			V4L2_CID_BRIGHTNESS, 0, 255, 1, 54);
	v4l2_ctrl_new_std(&dev->ctrl_handler, &tm6000_ctrl_ops,
			V4L2_CID_CONTRAST, 0, 255, 1, 119);
	v4l2_ctrl_new_std(&dev->ctrl_handler, &tm6000_ctrl_ops,
			V4L2_CID_SATURATION, 0, 255, 1, 112);
	v4l2_ctrl_new_std(&dev->ctrl_handler, &tm6000_ctrl_ops,
			V4L2_CID_HUE, -128, 127, 1, 0);
	v4l2_ctrl_add_handler(&dev->ctrl_handler,
			&dev->radio_ctrl_handler, NULL);

	if (dev->radio_ctrl_handler.error)
		ret = dev->radio_ctrl_handler.error;
	if (!ret && dev->ctrl_handler.error)
		ret = dev->ctrl_handler.error;
	if (ret)
		goto free_ctrl;
1659 1660 1661 1662 1663 1664

	dev->vfd = vdev_init(dev, &tm6000_template, "video");

	if (!dev->vfd) {
		printk(KERN_INFO "%s: can't register video device\n",
		       dev->name);
1665 1666
		ret = -ENOMEM;
		goto free_ctrl;
1667
	}
1668
	dev->vfd->ctrl_handler = &dev->ctrl_handler;
1669 1670 1671 1672 1673

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

1674
	ret = video_register_device(dev->vfd, VFL_TYPE_GRABBER, video_nr);
1675

1676 1677 1678
	if (ret < 0) {
		printk(KERN_INFO "%s: can't register video device\n",
		       dev->name);
1679 1680 1681
		video_device_release(dev->vfd);
		dev->vfd = NULL;
		goto free_ctrl;
1682 1683 1684 1685
	}

	printk(KERN_INFO "%s: registered device %s\n",
	       dev->name, video_device_node_name(dev->vfd));
1686

1687 1688 1689 1690 1691 1692
	if (dev->caps.has_radio) {
		dev->radio_dev = vdev_init(dev, &tm6000_radio_template,
							   "radio");
		if (!dev->radio_dev) {
			printk(KERN_INFO "%s: can't register radio device\n",
			       dev->name);
1693
			ret = -ENXIO;
1694
			goto unreg_video;
1695
		}
1696

1697
		dev->radio_dev->ctrl_handler = &dev->radio_ctrl_handler;
1698 1699 1700 1701 1702
		ret = video_register_device(dev->radio_dev, VFL_TYPE_RADIO,
					    radio_nr);
		if (ret < 0) {
			printk(KERN_INFO "%s: can't register radio device\n",
			       dev->name);
1703 1704
			video_device_release(dev->radio_dev);
			goto unreg_video;
1705
		}
1706

1707 1708 1709
		printk(KERN_INFO "%s: registered device %s\n",
		       dev->name, video_device_node_name(dev->radio_dev));
	}
1710

1711
	printk(KERN_INFO "Trident TVMaster TM5600/TM6000/TM6010 USB2 board (Load status: %d)\n", ret);
1712
	return ret;
1713 1714 1715 1716 1717 1718 1719

unreg_video:
	video_unregister_device(dev->vfd);
free_ctrl:
	v4l2_ctrl_handler_free(&dev->ctrl_handler);
	v4l2_ctrl_handler_free(&dev->radio_ctrl_handler);
	return ret;
1720 1721 1722 1723
}

int tm6000_v4l2_unregister(struct tm6000_core *dev)
{
1724
	video_unregister_device(dev->vfd);
1725

1726 1727 1728
	/* if URB buffers are still allocated free them now */
	tm6000_free_urb_buffers(dev);

1729 1730 1731 1732 1733 1734 1735 1736
	if (dev->radio_dev) {
		if (video_is_registered(dev->radio_dev))
			video_unregister_device(dev->radio_dev);
		else
			video_device_release(dev->radio_dev);
		dev->radio_dev = NULL;
	}

1737 1738 1739 1740 1741 1742 1743 1744 1745
	return 0;
}

int tm6000_v4l2_exit(void)
{
	return 0;
}

module_param(video_nr, int, 0);
1746
MODULE_PARM_DESC(video_nr, "Allow changing video device number");
1747

1748 1749
module_param_named(debug, tm6000_debug, int, 0444);
MODULE_PARM_DESC(debug, "activates debug info");
1750

1751 1752
module_param(vid_limit, int, 0644);
MODULE_PARM_DESC(vid_limit, "capture memory limit in megabytes");
1753

1754 1755
module_param(keep_urb, bool, 0);
MODULE_PARM_DESC(keep_urb, "Keep urb buffers allocated even when the device is closed by the user");