cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

tm6000-video.c (42111B)


      1// SPDX-License-Identifier: GPL-2.0
      2// tm6000-video.c - driver for TM5600/TM6000/TM6010 USB video capture devices
      3//
      4// Copyright (c) 2006-2007 Mauro Carvalho Chehab <mchehab@kernel.org>
      5//
      6// Copyright (c) 2007 Michel Ludwig <michel.ludwig@gmail.com>
      7//	- Fixed module load/unload
      8
      9#include <linux/module.h>
     10#include <linux/delay.h>
     11#include <linux/errno.h>
     12#include <linux/fs.h>
     13#include <linux/kernel.h>
     14#include <linux/slab.h>
     15#include <linux/mm.h>
     16#include <linux/ioport.h>
     17#include <linux/init.h>
     18#include <linux/sched.h>
     19#include <linux/random.h>
     20#include <linux/usb.h>
     21#include <linux/videodev2.h>
     22#include <media/v4l2-ioctl.h>
     23#include <media/v4l2-event.h>
     24#include <media/tuner.h>
     25#include <linux/interrupt.h>
     26#include <linux/kthread.h>
     27#include <linux/highmem.h>
     28#include <linux/freezer.h>
     29
     30#include "tm6000-regs.h"
     31#include "tm6000.h"
     32
     33#define BUFFER_TIMEOUT     msecs_to_jiffies(2000)  /* 2 seconds */
     34
     35/* Limits minimum and default number of buffers */
     36#define TM6000_MIN_BUF 4
     37#define TM6000_DEF_BUF 8
     38
     39#define TM6000_NUM_URB_BUF 8
     40
     41#define TM6000_MAX_ISO_PACKETS	46	/* Max number of ISO packets */
     42
     43/* Declare static vars that will be used as parameters */
     44static unsigned int vid_limit = 16;	/* Video memory limit, in Mb */
     45static int video_nr = -1;		/* /dev/videoN, -1 for autodetect */
     46static int radio_nr = -1;		/* /dev/radioN, -1 for autodetect */
     47static bool keep_urb;			/* keep urb buffers allocated */
     48
     49/* Debug level */
     50int tm6000_debug;
     51EXPORT_SYMBOL_GPL(tm6000_debug);
     52
     53static struct tm6000_fmt format[] = {
     54	{
     55		.fourcc   = V4L2_PIX_FMT_YUYV,
     56		.depth    = 16,
     57	}, {
     58		.fourcc   = V4L2_PIX_FMT_UYVY,
     59		.depth    = 16,
     60	}, {
     61		.fourcc   = V4L2_PIX_FMT_TM6000,
     62		.depth    = 16,
     63	}
     64};
     65
     66/* ------------------------------------------------------------------
     67 *	DMA and thread functions
     68 * ------------------------------------------------------------------
     69 */
     70
     71#define norm_maxw(a) 720
     72#define norm_maxh(a) 576
     73
     74#define norm_minw(a) norm_maxw(a)
     75#define norm_minh(a) norm_maxh(a)
     76
     77/*
     78 * video-buf generic routine to get the next available buffer
     79 */
     80static inline void get_next_buf(struct tm6000_dmaqueue *dma_q,
     81			       struct tm6000_buffer   **buf)
     82{
     83	struct tm6000_core *dev = container_of(dma_q, struct tm6000_core, vidq);
     84
     85	if (list_empty(&dma_q->active)) {
     86		dprintk(dev, V4L2_DEBUG_QUEUE, "No active queue to serve\n");
     87		*buf = NULL;
     88		return;
     89	}
     90
     91	*buf = list_entry(dma_q->active.next,
     92			struct tm6000_buffer, vb.queue);
     93}
     94
     95/*
     96 * Announces that a buffer were filled and request the next
     97 */
     98static inline void buffer_filled(struct tm6000_core *dev,
     99				 struct tm6000_dmaqueue *dma_q,
    100				 struct tm6000_buffer *buf)
    101{
    102	/* Advice that buffer was filled */
    103	dprintk(dev, V4L2_DEBUG_ISOC, "[%p/%d] wakeup\n", buf, buf->vb.i);
    104	buf->vb.state = VIDEOBUF_DONE;
    105	buf->vb.field_count++;
    106	buf->vb.ts = ktime_get_ns();
    107
    108	list_del(&buf->vb.queue);
    109	wake_up(&buf->vb.done);
    110}
    111
    112/*
    113 * Identify the tm5600/6000 buffer header type and properly handles
    114 */
    115static int copy_streams(u8 *data, unsigned long len,
    116			struct urb *urb)
    117{
    118	struct tm6000_dmaqueue  *dma_q = urb->context;
    119	struct tm6000_core *dev = container_of(dma_q, struct tm6000_core, vidq);
    120	u8 *ptr = data, *endp = data+len;
    121	unsigned long header = 0;
    122	int rc = 0;
    123	unsigned int cmd, cpysize, pktsize, size, field, block, line, pos = 0;
    124	struct tm6000_buffer *vbuf = NULL;
    125	char *voutp = NULL;
    126	unsigned int linewidth;
    127
    128	if (!dev->radio) {
    129		/* get video buffer */
    130		get_next_buf(dma_q, &vbuf);
    131
    132		if (!vbuf)
    133			return rc;
    134		voutp = videobuf_to_vmalloc(&vbuf->vb);
    135
    136		if (!voutp)
    137			return 0;
    138	}
    139
    140	for (ptr = data; ptr < endp;) {
    141		if (!dev->isoc_ctl.cmd) {
    142			/* Header */
    143			if (dev->isoc_ctl.tmp_buf_len > 0) {
    144				/* from last urb or packet */
    145				header = dev->isoc_ctl.tmp_buf;
    146				if (4 - dev->isoc_ctl.tmp_buf_len > 0) {
    147					memcpy((u8 *)&header +
    148						dev->isoc_ctl.tmp_buf_len,
    149						ptr,
    150						4 - dev->isoc_ctl.tmp_buf_len);
    151					ptr += 4 - dev->isoc_ctl.tmp_buf_len;
    152				}
    153				dev->isoc_ctl.tmp_buf_len = 0;
    154			} else {
    155				if (ptr + 3 >= endp) {
    156					/* have incomplete header */
    157					dev->isoc_ctl.tmp_buf_len = endp - ptr;
    158					memcpy(&dev->isoc_ctl.tmp_buf, ptr,
    159						dev->isoc_ctl.tmp_buf_len);
    160					return rc;
    161				}
    162				/* Seek for sync */
    163				for (; ptr < endp - 3; ptr++) {
    164					if (*(ptr + 3) == 0x47)
    165						break;
    166				}
    167				/* Get message header */
    168				header = *(unsigned long *)ptr;
    169				ptr += 4;
    170			}
    171
    172			/* split the header fields */
    173			size = ((header & 0x7e) << 1);
    174			if (size > 0)
    175				size -= 4;
    176			block = (header >> 7) & 0xf;
    177			field = (header >> 11) & 0x1;
    178			line  = (header >> 12) & 0x1ff;
    179			cmd   = (header >> 21) & 0x7;
    180			/* Validates header fields */
    181			if (size > TM6000_URB_MSG_LEN)
    182				size = TM6000_URB_MSG_LEN;
    183			pktsize = TM6000_URB_MSG_LEN;
    184			/*
    185			 * calculate position in buffer and change the buffer
    186			 */
    187			switch (cmd) {
    188			case TM6000_URB_MSG_VIDEO:
    189				if (!dev->radio) {
    190					if ((dev->isoc_ctl.vfield != field) &&
    191						(field == 1)) {
    192						/*
    193						 * Announces that a new buffer
    194						 * were filled
    195						 */
    196						buffer_filled(dev, dma_q, vbuf);
    197						dprintk(dev, V4L2_DEBUG_ISOC,
    198							"new buffer filled\n");
    199						get_next_buf(dma_q, &vbuf);
    200						if (!vbuf)
    201							return rc;
    202						voutp = videobuf_to_vmalloc(&vbuf->vb);
    203						if (!voutp)
    204							return rc;
    205						memset(voutp, 0, vbuf->vb.size);
    206					}
    207					linewidth = vbuf->vb.width << 1;
    208					pos = ((line << 1) - field - 1) *
    209					linewidth + block * TM6000_URB_MSG_LEN;
    210					/* Don't allow to write out of the buffer */
    211					if (pos + size > vbuf->vb.size)
    212						cmd = TM6000_URB_MSG_ERR;
    213					dev->isoc_ctl.vfield = field;
    214				}
    215				break;
    216			case TM6000_URB_MSG_VBI:
    217				break;
    218			case TM6000_URB_MSG_AUDIO:
    219			case TM6000_URB_MSG_PTS:
    220				size = pktsize; /* Size is always 180 bytes */
    221				break;
    222			}
    223		} else {
    224			/* Continue the last copy */
    225			cmd = dev->isoc_ctl.cmd;
    226			size = dev->isoc_ctl.size;
    227			pos = dev->isoc_ctl.pos;
    228			pktsize = dev->isoc_ctl.pktsize;
    229			field = dev->isoc_ctl.field;
    230		}
    231		cpysize = (endp - ptr > size) ? size : endp - ptr;
    232		if (cpysize) {
    233			/* copy data in different buffers */
    234			switch (cmd) {
    235			case TM6000_URB_MSG_VIDEO:
    236				/* Fills video buffer */
    237				if (vbuf)
    238					memcpy(&voutp[pos], ptr, cpysize);
    239				break;
    240			case TM6000_URB_MSG_AUDIO: {
    241				int i;
    242				for (i = 0; i < cpysize; i += 2)
    243					swab16s((u16 *)(ptr + i));
    244
    245				tm6000_call_fillbuf(dev, TM6000_AUDIO, ptr, cpysize);
    246				break;
    247			}
    248			case TM6000_URB_MSG_VBI:
    249				/* Need some code to copy vbi buffer */
    250				break;
    251			case TM6000_URB_MSG_PTS: {
    252				/* Need some code to copy pts */
    253				u32 pts;
    254				pts = *(u32 *)ptr;
    255				dprintk(dev, V4L2_DEBUG_ISOC, "field %d, PTS %x",
    256					field, pts);
    257				break;
    258			}
    259			}
    260		}
    261		if (ptr + pktsize > endp) {
    262			/*
    263			 * End of URB packet, but cmd processing is not
    264			 * complete. Preserve the state for a next packet
    265			 */
    266			dev->isoc_ctl.pos = pos + cpysize;
    267			dev->isoc_ctl.size = size - cpysize;
    268			dev->isoc_ctl.cmd = cmd;
    269			dev->isoc_ctl.field = field;
    270			dev->isoc_ctl.pktsize = pktsize - (endp - ptr);
    271			ptr += endp - ptr;
    272		} else {
    273			dev->isoc_ctl.cmd = 0;
    274			ptr += pktsize;
    275		}
    276	}
    277	return 0;
    278}
    279
    280/*
    281 * Identify the tm5600/6000 buffer header type and properly handles
    282 */
    283static int copy_multiplexed(u8 *ptr, unsigned long len,
    284			struct urb *urb)
    285{
    286	struct tm6000_dmaqueue  *dma_q = urb->context;
    287	struct tm6000_core *dev = container_of(dma_q, struct tm6000_core, vidq);
    288	unsigned int pos = dev->isoc_ctl.pos, cpysize;
    289	int rc = 1;
    290	struct tm6000_buffer *buf;
    291	char *outp = NULL;
    292
    293	get_next_buf(dma_q, &buf);
    294	if (buf)
    295		outp = videobuf_to_vmalloc(&buf->vb);
    296
    297	if (!outp)
    298		return 0;
    299
    300	while (len > 0) {
    301		cpysize = min(len, buf->vb.size-pos);
    302		memcpy(&outp[pos], ptr, cpysize);
    303		pos += cpysize;
    304		ptr += cpysize;
    305		len -= cpysize;
    306		if (pos >= buf->vb.size) {
    307			pos = 0;
    308			/* Announces that a new buffer were filled */
    309			buffer_filled(dev, dma_q, buf);
    310			dprintk(dev, V4L2_DEBUG_ISOC, "new buffer filled\n");
    311			get_next_buf(dma_q, &buf);
    312			if (!buf)
    313				break;
    314			outp = videobuf_to_vmalloc(&(buf->vb));
    315			if (!outp)
    316				return rc;
    317			pos = 0;
    318		}
    319	}
    320
    321	dev->isoc_ctl.pos = pos;
    322	return rc;
    323}
    324
    325static inline void print_err_status(struct tm6000_core *dev,
    326				     int packet, int status)
    327{
    328	char *errmsg = "Unknown";
    329
    330	switch (status) {
    331	case -ENOENT:
    332		errmsg = "unlinked synchronously";
    333		break;
    334	case -ECONNRESET:
    335		errmsg = "unlinked asynchronously";
    336		break;
    337	case -ENOSR:
    338		errmsg = "Buffer error (overrun)";
    339		break;
    340	case -EPIPE:
    341		errmsg = "Stalled (device not responding)";
    342		break;
    343	case -EOVERFLOW:
    344		errmsg = "Babble (bad cable?)";
    345		break;
    346	case -EPROTO:
    347		errmsg = "Bit-stuff error (bad cable?)";
    348		break;
    349	case -EILSEQ:
    350		errmsg = "CRC/Timeout (could be anything)";
    351		break;
    352	case -ETIME:
    353		errmsg = "Device does not respond";
    354		break;
    355	}
    356	if (packet < 0) {
    357		dprintk(dev, V4L2_DEBUG_QUEUE, "URB status %d [%s].\n",
    358			status, errmsg);
    359	} else {
    360		dprintk(dev, V4L2_DEBUG_QUEUE, "URB packet %d, status %d [%s].\n",
    361			packet, status, errmsg);
    362	}
    363}
    364
    365
    366/*
    367 * Controls the isoc copy of each urb packet
    368 */
    369static inline int tm6000_isoc_copy(struct urb *urb)
    370{
    371	struct tm6000_dmaqueue  *dma_q = urb->context;
    372	struct tm6000_core *dev = container_of(dma_q, struct tm6000_core, vidq);
    373	int i, len = 0, rc = 1, status;
    374	char *p;
    375
    376	if (urb->status < 0) {
    377		print_err_status(dev, -1, urb->status);
    378		return 0;
    379	}
    380
    381	for (i = 0; i < urb->number_of_packets; i++) {
    382		status = urb->iso_frame_desc[i].status;
    383
    384		if (status < 0) {
    385			print_err_status(dev, i, status);
    386			continue;
    387		}
    388
    389		len = urb->iso_frame_desc[i].actual_length;
    390
    391		if (len > 0) {
    392			p = urb->transfer_buffer + urb->iso_frame_desc[i].offset;
    393			if (!urb->iso_frame_desc[i].status) {
    394				if ((dev->fourcc) == V4L2_PIX_FMT_TM6000) {
    395					rc = copy_multiplexed(p, len, urb);
    396					if (rc <= 0)
    397						return rc;
    398				} else {
    399					copy_streams(p, len, urb);
    400				}
    401			}
    402		}
    403	}
    404	return rc;
    405}
    406
    407/* ------------------------------------------------------------------
    408 *	URB control
    409 * ------------------------------------------------------------------
    410 */
    411
    412/*
    413 * IRQ callback, called by URB callback
    414 */
    415static void tm6000_irq_callback(struct urb *urb)
    416{
    417	struct tm6000_dmaqueue  *dma_q = urb->context;
    418	struct tm6000_core *dev = container_of(dma_q, struct tm6000_core, vidq);
    419	unsigned long flags;
    420	int i;
    421
    422	switch (urb->status) {
    423	case 0:
    424	case -ETIMEDOUT:
    425		break;
    426
    427	case -ECONNRESET:
    428	case -ENOENT:
    429	case -ESHUTDOWN:
    430		return;
    431
    432	default:
    433		tm6000_err("urb completion error %d.\n", urb->status);
    434		break;
    435	}
    436
    437	spin_lock_irqsave(&dev->slock, flags);
    438	tm6000_isoc_copy(urb);
    439	spin_unlock_irqrestore(&dev->slock, flags);
    440
    441	/* Reset urb buffers */
    442	for (i = 0; i < urb->number_of_packets; i++) {
    443		urb->iso_frame_desc[i].status = 0;
    444		urb->iso_frame_desc[i].actual_length = 0;
    445	}
    446
    447	urb->status = usb_submit_urb(urb, GFP_ATOMIC);
    448	if (urb->status)
    449		tm6000_err("urb resubmit failed (error=%i)\n",
    450			urb->status);
    451}
    452
    453/*
    454 * Allocate URB buffers
    455 */
    456static int tm6000_alloc_urb_buffers(struct tm6000_core *dev)
    457{
    458	int num_bufs = TM6000_NUM_URB_BUF;
    459	int i;
    460
    461	if (dev->urb_buffer)
    462		return 0;
    463
    464	dev->urb_buffer = kmalloc_array(num_bufs, sizeof(*dev->urb_buffer),
    465					GFP_KERNEL);
    466	if (!dev->urb_buffer)
    467		return -ENOMEM;
    468
    469	dev->urb_dma = kmalloc_array(num_bufs, sizeof(*dev->urb_dma),
    470				     GFP_KERNEL);
    471	if (!dev->urb_dma)
    472		return -ENOMEM;
    473
    474	for (i = 0; i < num_bufs; i++) {
    475		dev->urb_buffer[i] = usb_alloc_coherent(
    476					dev->udev, dev->urb_size,
    477					GFP_KERNEL, &dev->urb_dma[i]);
    478		if (!dev->urb_buffer[i]) {
    479			tm6000_err("unable to allocate %i bytes for transfer buffer %i\n",
    480				    dev->urb_size, i);
    481			return -ENOMEM;
    482		}
    483		memset(dev->urb_buffer[i], 0, dev->urb_size);
    484	}
    485
    486	return 0;
    487}
    488
    489/*
    490 * Free URB buffers
    491 */
    492static int tm6000_free_urb_buffers(struct tm6000_core *dev)
    493{
    494	int i;
    495
    496	if (!dev->urb_buffer)
    497		return 0;
    498
    499	for (i = 0; i < TM6000_NUM_URB_BUF; i++) {
    500		if (dev->urb_buffer[i]) {
    501			usb_free_coherent(dev->udev,
    502					dev->urb_size,
    503					dev->urb_buffer[i],
    504					dev->urb_dma[i]);
    505			dev->urb_buffer[i] = NULL;
    506		}
    507	}
    508	kfree(dev->urb_buffer);
    509	kfree(dev->urb_dma);
    510	dev->urb_buffer = NULL;
    511	dev->urb_dma = NULL;
    512
    513	return 0;
    514}
    515
    516/*
    517 * Stop and Deallocate URBs
    518 */
    519static void tm6000_uninit_isoc(struct tm6000_core *dev)
    520{
    521	struct urb *urb;
    522	int i;
    523
    524	dev->isoc_ctl.buf = NULL;
    525	for (i = 0; i < dev->isoc_ctl.num_bufs; i++) {
    526		urb = dev->isoc_ctl.urb[i];
    527		if (urb) {
    528			usb_kill_urb(urb);
    529			usb_unlink_urb(urb);
    530			usb_free_urb(urb);
    531			dev->isoc_ctl.urb[i] = NULL;
    532		}
    533		dev->isoc_ctl.transfer_buffer[i] = NULL;
    534	}
    535
    536	if (!keep_urb)
    537		tm6000_free_urb_buffers(dev);
    538
    539	kfree(dev->isoc_ctl.urb);
    540	kfree(dev->isoc_ctl.transfer_buffer);
    541
    542	dev->isoc_ctl.urb = NULL;
    543	dev->isoc_ctl.transfer_buffer = NULL;
    544	dev->isoc_ctl.num_bufs = 0;
    545}
    546
    547/*
    548 * Assign URBs and start IRQ
    549 */
    550static int tm6000_prepare_isoc(struct tm6000_core *dev)
    551{
    552	struct tm6000_dmaqueue *dma_q = &dev->vidq;
    553	int i, j, sb_size, pipe, size, max_packets;
    554	int num_bufs = TM6000_NUM_URB_BUF;
    555	struct urb *urb;
    556
    557	/* De-allocates all pending stuff */
    558	tm6000_uninit_isoc(dev);
    559	/* Stop interrupt USB pipe */
    560	tm6000_ir_int_stop(dev);
    561
    562	usb_set_interface(dev->udev,
    563			  dev->isoc_in.bInterfaceNumber,
    564			  dev->isoc_in.bAlternateSetting);
    565
    566	/* Start interrupt USB pipe */
    567	tm6000_ir_int_start(dev);
    568
    569	pipe = usb_rcvisocpipe(dev->udev,
    570			       dev->isoc_in.endp->desc.bEndpointAddress &
    571			       USB_ENDPOINT_NUMBER_MASK);
    572
    573	size = usb_maxpacket(dev->udev, pipe);
    574
    575	if (size > dev->isoc_in.maxsize)
    576		size = dev->isoc_in.maxsize;
    577
    578	dev->isoc_ctl.max_pkt_size = size;
    579
    580	max_packets = TM6000_MAX_ISO_PACKETS;
    581	sb_size = max_packets * size;
    582	dev->urb_size = sb_size;
    583
    584	dev->isoc_ctl.num_bufs = num_bufs;
    585
    586	dev->isoc_ctl.urb = kmalloc_array(num_bufs, sizeof(void *),
    587					  GFP_KERNEL);
    588	if (!dev->isoc_ctl.urb)
    589		return -ENOMEM;
    590
    591	dev->isoc_ctl.transfer_buffer = kmalloc_array(num_bufs,
    592						      sizeof(void *),
    593						      GFP_KERNEL);
    594	if (!dev->isoc_ctl.transfer_buffer) {
    595		kfree(dev->isoc_ctl.urb);
    596		return -ENOMEM;
    597	}
    598
    599	dprintk(dev, V4L2_DEBUG_QUEUE, "Allocating %d x %d packets (%d bytes) of %d bytes each to handle %u size\n",
    600		    max_packets, num_bufs, sb_size,
    601		    dev->isoc_in.maxsize, size);
    602
    603
    604	if (tm6000_alloc_urb_buffers(dev) < 0) {
    605		tm6000_err("cannot allocate memory for urb buffers\n");
    606
    607		/* call free, as some buffers might have been allocated */
    608		tm6000_free_urb_buffers(dev);
    609		kfree(dev->isoc_ctl.urb);
    610		kfree(dev->isoc_ctl.transfer_buffer);
    611		return -ENOMEM;
    612	}
    613
    614	/* allocate urbs and transfer buffers */
    615	for (i = 0; i < dev->isoc_ctl.num_bufs; i++) {
    616		urb = usb_alloc_urb(max_packets, GFP_KERNEL);
    617		if (!urb) {
    618			tm6000_uninit_isoc(dev);
    619			tm6000_free_urb_buffers(dev);
    620			return -ENOMEM;
    621		}
    622		dev->isoc_ctl.urb[i] = urb;
    623
    624		urb->transfer_dma = dev->urb_dma[i];
    625		dev->isoc_ctl.transfer_buffer[i] = dev->urb_buffer[i];
    626
    627		usb_fill_bulk_urb(urb, dev->udev, pipe,
    628				  dev->isoc_ctl.transfer_buffer[i], sb_size,
    629				  tm6000_irq_callback, dma_q);
    630		urb->interval = dev->isoc_in.endp->desc.bInterval;
    631		urb->number_of_packets = max_packets;
    632		urb->transfer_flags = URB_ISO_ASAP | URB_NO_TRANSFER_DMA_MAP;
    633
    634		for (j = 0; j < max_packets; j++) {
    635			urb->iso_frame_desc[j].offset = size * j;
    636			urb->iso_frame_desc[j].length = size;
    637		}
    638	}
    639
    640	return 0;
    641}
    642
    643static int tm6000_start_thread(struct tm6000_core *dev)
    644{
    645	struct tm6000_dmaqueue *dma_q = &dev->vidq;
    646	int i;
    647
    648	dma_q->frame = 0;
    649	dma_q->ini_jiffies = jiffies;
    650
    651	init_waitqueue_head(&dma_q->wq);
    652
    653	/* submit urbs and enables IRQ */
    654	for (i = 0; i < dev->isoc_ctl.num_bufs; i++) {
    655		int rc = usb_submit_urb(dev->isoc_ctl.urb[i], GFP_ATOMIC);
    656		if (rc) {
    657			tm6000_err("submit of urb %i failed (error=%i)\n", i,
    658				   rc);
    659			tm6000_uninit_isoc(dev);
    660			return rc;
    661		}
    662	}
    663
    664	return 0;
    665}
    666
    667/* ------------------------------------------------------------------
    668 *	Videobuf operations
    669 * ------------------------------------------------------------------
    670 */
    671
    672static int
    673buffer_setup(struct videobuf_queue *vq, unsigned int *count, unsigned int *size)
    674{
    675	struct tm6000_fh *fh = vq->priv_data;
    676
    677	*size = fh->fmt->depth * fh->width * fh->height >> 3;
    678	if (0 == *count)
    679		*count = TM6000_DEF_BUF;
    680
    681	if (*count < TM6000_MIN_BUF)
    682		*count = TM6000_MIN_BUF;
    683
    684	while (*size * *count > vid_limit * 1024 * 1024)
    685		(*count)--;
    686
    687	return 0;
    688}
    689
    690static void free_buffer(struct videobuf_queue *vq, struct tm6000_buffer *buf)
    691{
    692	struct tm6000_fh *fh = vq->priv_data;
    693	struct tm6000_core   *dev = fh->dev;
    694	unsigned long flags;
    695
    696	/* We used to wait for the buffer to finish here, but this didn't work
    697	   because, as we were keeping the state as VIDEOBUF_QUEUED,
    698	   videobuf_queue_cancel marked it as finished for us.
    699	   (Also, it could wedge forever if the hardware was misconfigured.)
    700
    701	   This should be safe; by the time we get here, the buffer isn't
    702	   queued anymore. If we ever start marking the buffers as
    703	   VIDEOBUF_ACTIVE, it won't be, though.
    704	*/
    705	spin_lock_irqsave(&dev->slock, flags);
    706	if (dev->isoc_ctl.buf == buf)
    707		dev->isoc_ctl.buf = NULL;
    708	spin_unlock_irqrestore(&dev->slock, flags);
    709
    710	videobuf_vmalloc_free(&buf->vb);
    711	buf->vb.state = VIDEOBUF_NEEDS_INIT;
    712}
    713
    714static int
    715buffer_prepare(struct videobuf_queue *vq, struct videobuf_buffer *vb,
    716						enum v4l2_field field)
    717{
    718	struct tm6000_fh     *fh  = vq->priv_data;
    719	struct tm6000_buffer *buf = container_of(vb, struct tm6000_buffer, vb);
    720	struct tm6000_core   *dev = fh->dev;
    721	int rc = 0;
    722
    723	BUG_ON(NULL == fh->fmt);
    724
    725
    726	/* FIXME: It assumes depth=2 */
    727	/* The only currently supported format is 16 bits/pixel */
    728	buf->vb.size = fh->fmt->depth*fh->width*fh->height >> 3;
    729	if (0 != buf->vb.baddr  &&  buf->vb.bsize < buf->vb.size)
    730		return -EINVAL;
    731
    732	if (buf->fmt       != fh->fmt    ||
    733	    buf->vb.width  != fh->width  ||
    734	    buf->vb.height != fh->height ||
    735	    buf->vb.field  != field) {
    736		buf->fmt       = fh->fmt;
    737		buf->vb.width  = fh->width;
    738		buf->vb.height = fh->height;
    739		buf->vb.field  = field;
    740		buf->vb.state = VIDEOBUF_NEEDS_INIT;
    741	}
    742
    743	if (VIDEOBUF_NEEDS_INIT == buf->vb.state) {
    744		rc = videobuf_iolock(vq, &buf->vb, NULL);
    745		if (rc != 0)
    746			goto fail;
    747	}
    748
    749	if (!dev->isoc_ctl.num_bufs) {
    750		rc = tm6000_prepare_isoc(dev);
    751		if (rc < 0)
    752			goto fail;
    753
    754		rc = tm6000_start_thread(dev);
    755		if (rc < 0)
    756			goto fail;
    757
    758	}
    759
    760	buf->vb.state = VIDEOBUF_PREPARED;
    761	return 0;
    762
    763fail:
    764	free_buffer(vq, buf);
    765	return rc;
    766}
    767
    768static void
    769buffer_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb)
    770{
    771	struct tm6000_buffer    *buf     = container_of(vb, struct tm6000_buffer, vb);
    772	struct tm6000_fh        *fh      = vq->priv_data;
    773	struct tm6000_core      *dev     = fh->dev;
    774	struct tm6000_dmaqueue  *vidq    = &dev->vidq;
    775
    776	buf->vb.state = VIDEOBUF_QUEUED;
    777	list_add_tail(&buf->vb.queue, &vidq->active);
    778}
    779
    780static void buffer_release(struct videobuf_queue *vq, struct videobuf_buffer *vb)
    781{
    782	struct tm6000_buffer   *buf  = container_of(vb, struct tm6000_buffer, vb);
    783
    784	free_buffer(vq, buf);
    785}
    786
    787static const struct videobuf_queue_ops tm6000_video_qops = {
    788	.buf_setup      = buffer_setup,
    789	.buf_prepare    = buffer_prepare,
    790	.buf_queue      = buffer_queue,
    791	.buf_release    = buffer_release,
    792};
    793
    794/* ------------------------------------------------------------------
    795 *	IOCTL handling
    796 * ------------------------------------------------------------------
    797 */
    798
    799static bool is_res_read(struct tm6000_core *dev, struct tm6000_fh *fh)
    800{
    801	/* Is the current fh handling it? if so, that's OK */
    802	if (dev->resources == fh && dev->is_res_read)
    803		return true;
    804
    805	return false;
    806}
    807
    808static bool is_res_streaming(struct tm6000_core *dev, struct tm6000_fh *fh)
    809{
    810	/* Is the current fh handling it? if so, that's OK */
    811	if (dev->resources == fh)
    812		return true;
    813
    814	return false;
    815}
    816
    817static bool res_get(struct tm6000_core *dev, struct tm6000_fh *fh,
    818		   bool is_res_read)
    819{
    820	/* Is the current fh handling it? if so, that's OK */
    821	if (dev->resources == fh && dev->is_res_read == is_res_read)
    822		return true;
    823
    824	/* is it free? */
    825	if (dev->resources)
    826		return false;
    827
    828	/* grab it */
    829	dev->resources = fh;
    830	dev->is_res_read = is_res_read;
    831	dprintk(dev, V4L2_DEBUG_RES_LOCK, "res: get\n");
    832	return true;
    833}
    834
    835static void res_free(struct tm6000_core *dev, struct tm6000_fh *fh)
    836{
    837	/* Is the current fh handling it? if so, that's OK */
    838	if (dev->resources != fh)
    839		return;
    840
    841	dev->resources = NULL;
    842	dprintk(dev, V4L2_DEBUG_RES_LOCK, "res: put\n");
    843}
    844
    845/* ------------------------------------------------------------------
    846 *	IOCTL vidioc handling
    847 * ------------------------------------------------------------------
    848 */
    849static int vidioc_querycap(struct file *file, void  *priv,
    850					struct v4l2_capability *cap)
    851{
    852	struct tm6000_core *dev = ((struct tm6000_fh *)priv)->dev;
    853
    854	strscpy(cap->driver, "tm6000", sizeof(cap->driver));
    855	strscpy(cap->card, "Trident TM5600/6000/6010", sizeof(cap->card));
    856	usb_make_path(dev->udev, cap->bus_info, sizeof(cap->bus_info));
    857	cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE |
    858			    V4L2_CAP_DEVICE_CAPS;
    859	if (dev->tuner_type != TUNER_ABSENT)
    860		cap->capabilities |= V4L2_CAP_TUNER;
    861	if (dev->caps.has_radio)
    862		cap->capabilities |= V4L2_CAP_RADIO;
    863
    864	return 0;
    865}
    866
    867static int vidioc_enum_fmt_vid_cap(struct file *file, void  *priv,
    868					struct v4l2_fmtdesc *f)
    869{
    870	if (f->index >= ARRAY_SIZE(format))
    871		return -EINVAL;
    872
    873	f->pixelformat = format[f->index].fourcc;
    874	return 0;
    875}
    876
    877static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
    878					struct v4l2_format *f)
    879{
    880	struct tm6000_fh  *fh = priv;
    881
    882	f->fmt.pix.width        = fh->width;
    883	f->fmt.pix.height       = fh->height;
    884	f->fmt.pix.field        = fh->vb_vidq.field;
    885	f->fmt.pix.pixelformat  = fh->fmt->fourcc;
    886	f->fmt.pix.colorspace   = V4L2_COLORSPACE_SMPTE170M;
    887	f->fmt.pix.bytesperline =
    888		(f->fmt.pix.width * fh->fmt->depth) >> 3;
    889	f->fmt.pix.sizeimage =
    890		f->fmt.pix.height * f->fmt.pix.bytesperline;
    891
    892	return 0;
    893}
    894
    895static struct tm6000_fmt *format_by_fourcc(unsigned int fourcc)
    896{
    897	unsigned int i;
    898
    899	for (i = 0; i < ARRAY_SIZE(format); i++)
    900		if (format[i].fourcc == fourcc)
    901			return format+i;
    902	return NULL;
    903}
    904
    905static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
    906			struct v4l2_format *f)
    907{
    908	struct tm6000_core *dev = ((struct tm6000_fh *)priv)->dev;
    909	struct tm6000_fmt *fmt;
    910	enum v4l2_field field;
    911
    912	fmt = format_by_fourcc(f->fmt.pix.pixelformat);
    913	if (NULL == fmt) {
    914		dprintk(dev, 2, "Fourcc format (0x%08x) invalid.\n",
    915			f->fmt.pix.pixelformat);
    916		return -EINVAL;
    917	}
    918
    919	field = f->fmt.pix.field;
    920
    921	field = V4L2_FIELD_INTERLACED;
    922
    923	tm6000_get_std_res(dev);
    924
    925	f->fmt.pix.width  = dev->width;
    926	f->fmt.pix.height = dev->height;
    927
    928	f->fmt.pix.width &= ~0x01;
    929
    930	f->fmt.pix.field = field;
    931
    932	f->fmt.pix.bytesperline =
    933		(f->fmt.pix.width * fmt->depth) >> 3;
    934	f->fmt.pix.sizeimage =
    935		f->fmt.pix.height * f->fmt.pix.bytesperline;
    936	f->fmt.pix.colorspace   = V4L2_COLORSPACE_SMPTE170M;
    937
    938	return 0;
    939}
    940
    941/*FIXME: This seems to be generic enough to be at videodev2 */
    942static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
    943					struct v4l2_format *f)
    944{
    945	struct tm6000_fh  *fh = priv;
    946	struct tm6000_core *dev = fh->dev;
    947	int ret = vidioc_try_fmt_vid_cap(file, fh, f);
    948	if (ret < 0)
    949		return ret;
    950
    951	fh->fmt           = format_by_fourcc(f->fmt.pix.pixelformat);
    952	fh->width         = f->fmt.pix.width;
    953	fh->height        = f->fmt.pix.height;
    954	fh->vb_vidq.field = f->fmt.pix.field;
    955	fh->type          = f->type;
    956
    957	dev->fourcc       = f->fmt.pix.pixelformat;
    958
    959	tm6000_set_fourcc_format(dev);
    960
    961	return 0;
    962}
    963
    964static int vidioc_reqbufs(struct file *file, void *priv,
    965			   struct v4l2_requestbuffers *p)
    966{
    967	struct tm6000_fh  *fh = priv;
    968
    969	return videobuf_reqbufs(&fh->vb_vidq, p);
    970}
    971
    972static int vidioc_querybuf(struct file *file, void *priv,
    973			    struct v4l2_buffer *p)
    974{
    975	struct tm6000_fh  *fh = priv;
    976
    977	return videobuf_querybuf(&fh->vb_vidq, p);
    978}
    979
    980static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *p)
    981{
    982	struct tm6000_fh  *fh = priv;
    983
    984	return videobuf_qbuf(&fh->vb_vidq, p);
    985}
    986
    987static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *p)
    988{
    989	struct tm6000_fh  *fh = priv;
    990
    991	return videobuf_dqbuf(&fh->vb_vidq, p,
    992				file->f_flags & O_NONBLOCK);
    993}
    994
    995static int vidioc_streamon(struct file *file, void *priv, enum v4l2_buf_type i)
    996{
    997	struct tm6000_fh *fh = priv;
    998	struct tm6000_core *dev = fh->dev;
    999
   1000	if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
   1001		return -EINVAL;
   1002	if (i != fh->type)
   1003		return -EINVAL;
   1004
   1005	if (!res_get(dev, fh, false))
   1006		return -EBUSY;
   1007	return videobuf_streamon(&fh->vb_vidq);
   1008}
   1009
   1010static int vidioc_streamoff(struct file *file, void *priv, enum v4l2_buf_type i)
   1011{
   1012	struct tm6000_fh *fh = priv;
   1013	struct tm6000_core *dev = fh->dev;
   1014
   1015	if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
   1016		return -EINVAL;
   1017
   1018	if (i != fh->type)
   1019		return -EINVAL;
   1020
   1021	videobuf_streamoff(&fh->vb_vidq);
   1022	res_free(dev, fh);
   1023
   1024	return 0;
   1025}
   1026
   1027static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id norm)
   1028{
   1029	int rc = 0;
   1030	struct tm6000_fh *fh = priv;
   1031	struct tm6000_core *dev = fh->dev;
   1032
   1033	dev->norm = norm;
   1034	rc = tm6000_init_analog_mode(dev);
   1035
   1036	fh->width  = dev->width;
   1037	fh->height = dev->height;
   1038
   1039	if (rc < 0)
   1040		return rc;
   1041
   1042	v4l2_device_call_all(&dev->v4l2_dev, 0, video, s_std, dev->norm);
   1043
   1044	return 0;
   1045}
   1046
   1047static int vidioc_g_std(struct file *file, void *priv, v4l2_std_id *norm)
   1048{
   1049	struct tm6000_fh *fh = priv;
   1050	struct tm6000_core *dev = fh->dev;
   1051
   1052	*norm = dev->norm;
   1053	return 0;
   1054}
   1055
   1056static const char *iname[] = {
   1057	[TM6000_INPUT_TV] = "Television",
   1058	[TM6000_INPUT_COMPOSITE1] = "Composite 1",
   1059	[TM6000_INPUT_COMPOSITE2] = "Composite 2",
   1060	[TM6000_INPUT_SVIDEO] = "S-Video",
   1061};
   1062
   1063static int vidioc_enum_input(struct file *file, void *priv,
   1064				struct v4l2_input *i)
   1065{
   1066	struct tm6000_fh   *fh = priv;
   1067	struct tm6000_core *dev = fh->dev;
   1068	unsigned int n;
   1069
   1070	n = i->index;
   1071	if (n >= 3)
   1072		return -EINVAL;
   1073
   1074	if (!dev->vinput[n].type)
   1075		return -EINVAL;
   1076
   1077	i->index = n;
   1078
   1079	if (dev->vinput[n].type == TM6000_INPUT_TV)
   1080		i->type = V4L2_INPUT_TYPE_TUNER;
   1081	else
   1082		i->type = V4L2_INPUT_TYPE_CAMERA;
   1083
   1084	strscpy(i->name, iname[dev->vinput[n].type], sizeof(i->name));
   1085
   1086	i->std = TM6000_STD;
   1087
   1088	return 0;
   1089}
   1090
   1091static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
   1092{
   1093	struct tm6000_fh   *fh = priv;
   1094	struct tm6000_core *dev = fh->dev;
   1095
   1096	*i = dev->input;
   1097
   1098	return 0;
   1099}
   1100
   1101static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
   1102{
   1103	struct tm6000_fh   *fh = priv;
   1104	struct tm6000_core *dev = fh->dev;
   1105	int rc = 0;
   1106
   1107	if (i >= 3)
   1108		return -EINVAL;
   1109	if (!dev->vinput[i].type)
   1110		return -EINVAL;
   1111
   1112	dev->input = i;
   1113
   1114	rc = vidioc_s_std(file, priv, dev->norm);
   1115
   1116	return rc;
   1117}
   1118
   1119/* --- controls ---------------------------------------------- */
   1120
   1121static int tm6000_s_ctrl(struct v4l2_ctrl *ctrl)
   1122{
   1123	struct tm6000_core *dev = container_of(ctrl->handler, struct tm6000_core, ctrl_handler);
   1124	u8  val = ctrl->val;
   1125
   1126	switch (ctrl->id) {
   1127	case V4L2_CID_CONTRAST:
   1128		tm6000_set_reg(dev, TM6010_REQ07_R08_LUMA_CONTRAST_ADJ, val);
   1129		return 0;
   1130	case V4L2_CID_BRIGHTNESS:
   1131		tm6000_set_reg(dev, TM6010_REQ07_R09_LUMA_BRIGHTNESS_ADJ, val);
   1132		return 0;
   1133	case V4L2_CID_SATURATION:
   1134		tm6000_set_reg(dev, TM6010_REQ07_R0A_CHROMA_SATURATION_ADJ, val);
   1135		return 0;
   1136	case V4L2_CID_HUE:
   1137		tm6000_set_reg(dev, TM6010_REQ07_R0B_CHROMA_HUE_PHASE_ADJ, val);
   1138		return 0;
   1139	}
   1140	return -EINVAL;
   1141}
   1142
   1143static const struct v4l2_ctrl_ops tm6000_ctrl_ops = {
   1144	.s_ctrl = tm6000_s_ctrl,
   1145};
   1146
   1147static int tm6000_radio_s_ctrl(struct v4l2_ctrl *ctrl)
   1148{
   1149	struct tm6000_core *dev = container_of(ctrl->handler,
   1150			struct tm6000_core, radio_ctrl_handler);
   1151	u8  val = ctrl->val;
   1152
   1153	switch (ctrl->id) {
   1154	case V4L2_CID_AUDIO_MUTE:
   1155		dev->ctl_mute = val;
   1156		tm6000_tvaudio_set_mute(dev, val);
   1157		return 0;
   1158	case V4L2_CID_AUDIO_VOLUME:
   1159		dev->ctl_volume = val;
   1160		tm6000_set_volume(dev, val);
   1161		return 0;
   1162	}
   1163	return -EINVAL;
   1164}
   1165
   1166static const struct v4l2_ctrl_ops tm6000_radio_ctrl_ops = {
   1167	.s_ctrl = tm6000_radio_s_ctrl,
   1168};
   1169
   1170static int vidioc_g_tuner(struct file *file, void *priv,
   1171				struct v4l2_tuner *t)
   1172{
   1173	struct tm6000_fh   *fh  = priv;
   1174	struct tm6000_core *dev = fh->dev;
   1175
   1176	if (UNSET == dev->tuner_type)
   1177		return -ENOTTY;
   1178	if (0 != t->index)
   1179		return -EINVAL;
   1180
   1181	strscpy(t->name, "Television", sizeof(t->name));
   1182	t->type       = V4L2_TUNER_ANALOG_TV;
   1183	t->capability = V4L2_TUNER_CAP_NORM | V4L2_TUNER_CAP_STEREO;
   1184	t->rangehigh  = 0xffffffffUL;
   1185	t->rxsubchans = V4L2_TUNER_SUB_STEREO;
   1186
   1187	v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, g_tuner, t);
   1188
   1189	t->audmode = dev->amode;
   1190
   1191	return 0;
   1192}
   1193
   1194static int vidioc_s_tuner(struct file *file, void *priv,
   1195				const struct v4l2_tuner *t)
   1196{
   1197	struct tm6000_fh   *fh  = priv;
   1198	struct tm6000_core *dev = fh->dev;
   1199
   1200	if (UNSET == dev->tuner_type)
   1201		return -ENOTTY;
   1202	if (0 != t->index)
   1203		return -EINVAL;
   1204
   1205	if (t->audmode > V4L2_TUNER_MODE_STEREO)
   1206		dev->amode = V4L2_TUNER_MODE_STEREO;
   1207	else
   1208		dev->amode = t->audmode;
   1209	dprintk(dev, 3, "audio mode: %x\n", t->audmode);
   1210
   1211	v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_tuner, t);
   1212
   1213	return 0;
   1214}
   1215
   1216static int vidioc_g_frequency(struct file *file, void *priv,
   1217				struct v4l2_frequency *f)
   1218{
   1219	struct tm6000_fh   *fh  = priv;
   1220	struct tm6000_core *dev = fh->dev;
   1221
   1222	if (UNSET == dev->tuner_type)
   1223		return -ENOTTY;
   1224	if (f->tuner)
   1225		return -EINVAL;
   1226
   1227	f->frequency = dev->freq;
   1228
   1229	v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, g_frequency, f);
   1230
   1231	return 0;
   1232}
   1233
   1234static int vidioc_s_frequency(struct file *file, void *priv,
   1235				const struct v4l2_frequency *f)
   1236{
   1237	struct tm6000_fh   *fh  = priv;
   1238	struct tm6000_core *dev = fh->dev;
   1239
   1240	if (UNSET == dev->tuner_type)
   1241		return -ENOTTY;
   1242	if (f->tuner != 0)
   1243		return -EINVAL;
   1244
   1245	dev->freq = f->frequency;
   1246	v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_frequency, f);
   1247
   1248	return 0;
   1249}
   1250
   1251static int radio_g_tuner(struct file *file, void *priv,
   1252					struct v4l2_tuner *t)
   1253{
   1254	struct tm6000_fh *fh = file->private_data;
   1255	struct tm6000_core *dev = fh->dev;
   1256
   1257	if (0 != t->index)
   1258		return -EINVAL;
   1259
   1260	memset(t, 0, sizeof(*t));
   1261	strscpy(t->name, "Radio", sizeof(t->name));
   1262	t->type = V4L2_TUNER_RADIO;
   1263	t->capability = V4L2_TUNER_CAP_LOW | V4L2_TUNER_CAP_STEREO;
   1264	t->rxsubchans = V4L2_TUNER_SUB_STEREO;
   1265	t->audmode = V4L2_TUNER_MODE_STEREO;
   1266
   1267	v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, g_tuner, t);
   1268
   1269	return 0;
   1270}
   1271
   1272static int radio_s_tuner(struct file *file, void *priv,
   1273					const struct v4l2_tuner *t)
   1274{
   1275	struct tm6000_fh *fh = file->private_data;
   1276	struct tm6000_core *dev = fh->dev;
   1277
   1278	if (0 != t->index)
   1279		return -EINVAL;
   1280	v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_tuner, t);
   1281	return 0;
   1282}
   1283
   1284/* ------------------------------------------------------------------
   1285	File operations for the device
   1286   ------------------------------------------------------------------*/
   1287
   1288static int __tm6000_open(struct file *file)
   1289{
   1290	struct video_device *vdev = video_devdata(file);
   1291	struct tm6000_core *dev = video_drvdata(file);
   1292	struct tm6000_fh *fh;
   1293	enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
   1294	int rc;
   1295	int radio = 0;
   1296
   1297	dprintk(dev, V4L2_DEBUG_OPEN, "tm6000: open called (dev=%s)\n",
   1298		video_device_node_name(vdev));
   1299
   1300	switch (vdev->vfl_type) {
   1301	case VFL_TYPE_VIDEO:
   1302		type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
   1303		break;
   1304	case VFL_TYPE_VBI:
   1305		type = V4L2_BUF_TYPE_VBI_CAPTURE;
   1306		break;
   1307	case VFL_TYPE_RADIO:
   1308		radio = 1;
   1309		break;
   1310	default:
   1311		return -EINVAL;
   1312	}
   1313
   1314	/* If more than one user, mutex should be added */
   1315	dev->users++;
   1316
   1317	dprintk(dev, V4L2_DEBUG_OPEN, "open dev=%s type=%s users=%d\n",
   1318		video_device_node_name(vdev), v4l2_type_names[type],
   1319		dev->users);
   1320
   1321	/* allocate + initialize per filehandle data */
   1322	fh = kzalloc(sizeof(*fh), GFP_KERNEL);
   1323	if (NULL == fh) {
   1324		dev->users--;
   1325		return -ENOMEM;
   1326	}
   1327
   1328	v4l2_fh_init(&fh->fh, vdev);
   1329	file->private_data = fh;
   1330	fh->dev      = dev;
   1331	fh->radio    = radio;
   1332	dev->radio   = radio;
   1333	fh->type     = type;
   1334	dev->fourcc  = format[0].fourcc;
   1335
   1336	fh->fmt      = format_by_fourcc(dev->fourcc);
   1337
   1338	tm6000_get_std_res(dev);
   1339
   1340	fh->width = dev->width;
   1341	fh->height = dev->height;
   1342
   1343	dprintk(dev, V4L2_DEBUG_OPEN, "Open: fh=%p, dev=%p, dev->vidq=%p\n",
   1344		fh, dev, &dev->vidq);
   1345	dprintk(dev, V4L2_DEBUG_OPEN, "Open: list_empty queued=%d\n",
   1346		list_empty(&dev->vidq.queued));
   1347	dprintk(dev, V4L2_DEBUG_OPEN, "Open: list_empty active=%d\n",
   1348		list_empty(&dev->vidq.active));
   1349
   1350	/* initialize hardware on analog mode */
   1351	rc = tm6000_init_analog_mode(dev);
   1352	if (rc < 0) {
   1353		v4l2_fh_exit(&fh->fh);
   1354		kfree(fh);
   1355		return rc;
   1356	}
   1357
   1358	dev->mode = TM6000_MODE_ANALOG;
   1359
   1360	if (!fh->radio) {
   1361		videobuf_queue_vmalloc_init(&fh->vb_vidq, &tm6000_video_qops,
   1362				NULL, &dev->slock,
   1363				fh->type,
   1364				V4L2_FIELD_INTERLACED,
   1365				sizeof(struct tm6000_buffer), fh, &dev->lock);
   1366	} else {
   1367		dprintk(dev, V4L2_DEBUG_OPEN, "video_open: setting radio device\n");
   1368		tm6000_set_audio_rinput(dev);
   1369		v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_radio);
   1370		tm6000_prepare_isoc(dev);
   1371		tm6000_start_thread(dev);
   1372	}
   1373	v4l2_fh_add(&fh->fh);
   1374
   1375	return 0;
   1376}
   1377
   1378static int tm6000_open(struct file *file)
   1379{
   1380	struct video_device *vdev = video_devdata(file);
   1381	int res;
   1382
   1383	mutex_lock(vdev->lock);
   1384	res = __tm6000_open(file);
   1385	mutex_unlock(vdev->lock);
   1386	return res;
   1387}
   1388
   1389static ssize_t
   1390tm6000_read(struct file *file, char __user *data, size_t count, loff_t *pos)
   1391{
   1392	struct tm6000_fh *fh = file->private_data;
   1393	struct tm6000_core *dev = fh->dev;
   1394
   1395	if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
   1396		int res;
   1397
   1398		if (!res_get(fh->dev, fh, true))
   1399			return -EBUSY;
   1400
   1401		if (mutex_lock_interruptible(&dev->lock))
   1402			return -ERESTARTSYS;
   1403		res = videobuf_read_stream(&fh->vb_vidq, data, count, pos, 0,
   1404					file->f_flags & O_NONBLOCK);
   1405		mutex_unlock(&dev->lock);
   1406		return res;
   1407	}
   1408	return 0;
   1409}
   1410
   1411static __poll_t
   1412__tm6000_poll(struct file *file, struct poll_table_struct *wait)
   1413{
   1414	__poll_t req_events = poll_requested_events(wait);
   1415	struct tm6000_fh        *fh = file->private_data;
   1416	struct tm6000_buffer    *buf;
   1417	__poll_t res = 0;
   1418
   1419	if (v4l2_event_pending(&fh->fh))
   1420		res = EPOLLPRI;
   1421	else if (req_events & EPOLLPRI)
   1422		poll_wait(file, &fh->fh.wait, wait);
   1423	if (V4L2_BUF_TYPE_VIDEO_CAPTURE != fh->type)
   1424		return res | EPOLLERR;
   1425
   1426	if (!!is_res_streaming(fh->dev, fh))
   1427		return res | EPOLLERR;
   1428
   1429	if (!is_res_read(fh->dev, fh)) {
   1430		/* streaming capture */
   1431		if (list_empty(&fh->vb_vidq.stream))
   1432			return res | EPOLLERR;
   1433		buf = list_entry(fh->vb_vidq.stream.next, struct tm6000_buffer, vb.stream);
   1434		poll_wait(file, &buf->vb.done, wait);
   1435		if (buf->vb.state == VIDEOBUF_DONE ||
   1436		    buf->vb.state == VIDEOBUF_ERROR)
   1437			return res | EPOLLIN | EPOLLRDNORM;
   1438	} else if (req_events & (EPOLLIN | EPOLLRDNORM)) {
   1439		/* read() capture */
   1440		return res | videobuf_poll_stream(file, &fh->vb_vidq, wait);
   1441	}
   1442	return res;
   1443}
   1444
   1445static __poll_t tm6000_poll(struct file *file, struct poll_table_struct *wait)
   1446{
   1447	struct tm6000_fh *fh = file->private_data;
   1448	struct tm6000_core *dev = fh->dev;
   1449	__poll_t res;
   1450
   1451	mutex_lock(&dev->lock);
   1452	res = __tm6000_poll(file, wait);
   1453	mutex_unlock(&dev->lock);
   1454	return res;
   1455}
   1456
   1457static int tm6000_release(struct file *file)
   1458{
   1459	struct tm6000_fh         *fh = file->private_data;
   1460	struct tm6000_core      *dev = fh->dev;
   1461	struct video_device    *vdev = video_devdata(file);
   1462
   1463	dprintk(dev, V4L2_DEBUG_OPEN, "tm6000: close called (dev=%s, users=%d)\n",
   1464		video_device_node_name(vdev), dev->users);
   1465
   1466	mutex_lock(&dev->lock);
   1467	dev->users--;
   1468
   1469	res_free(dev, fh);
   1470
   1471	if (!dev->users) {
   1472		tm6000_uninit_isoc(dev);
   1473
   1474		/* Stop interrupt USB pipe */
   1475		tm6000_ir_int_stop(dev);
   1476
   1477		usb_reset_configuration(dev->udev);
   1478
   1479		if (dev->int_in.endp)
   1480			usb_set_interface(dev->udev,
   1481					dev->isoc_in.bInterfaceNumber, 2);
   1482		else
   1483			usb_set_interface(dev->udev,
   1484					dev->isoc_in.bInterfaceNumber, 0);
   1485
   1486		/* Start interrupt USB pipe */
   1487		tm6000_ir_int_start(dev);
   1488
   1489		if (!fh->radio)
   1490			videobuf_mmap_free(&fh->vb_vidq);
   1491	}
   1492	v4l2_fh_del(&fh->fh);
   1493	v4l2_fh_exit(&fh->fh);
   1494	kfree(fh);
   1495	mutex_unlock(&dev->lock);
   1496
   1497	return 0;
   1498}
   1499
   1500static int tm6000_mmap(struct file *file, struct vm_area_struct * vma)
   1501{
   1502	struct tm6000_fh *fh = file->private_data;
   1503	struct tm6000_core *dev = fh->dev;
   1504	int res;
   1505
   1506	if (mutex_lock_interruptible(&dev->lock))
   1507		return -ERESTARTSYS;
   1508	res = videobuf_mmap_mapper(&fh->vb_vidq, vma);
   1509	mutex_unlock(&dev->lock);
   1510	return res;
   1511}
   1512
   1513static const struct v4l2_file_operations tm6000_fops = {
   1514	.owner = THIS_MODULE,
   1515	.open = tm6000_open,
   1516	.release = tm6000_release,
   1517	.unlocked_ioctl = video_ioctl2, /* V4L2 ioctl handler */
   1518	.read = tm6000_read,
   1519	.poll = tm6000_poll,
   1520	.mmap = tm6000_mmap,
   1521};
   1522
   1523static const struct v4l2_ioctl_ops video_ioctl_ops = {
   1524	.vidioc_querycap          = vidioc_querycap,
   1525	.vidioc_enum_fmt_vid_cap  = vidioc_enum_fmt_vid_cap,
   1526	.vidioc_g_fmt_vid_cap     = vidioc_g_fmt_vid_cap,
   1527	.vidioc_try_fmt_vid_cap   = vidioc_try_fmt_vid_cap,
   1528	.vidioc_s_fmt_vid_cap     = vidioc_s_fmt_vid_cap,
   1529	.vidioc_s_std             = vidioc_s_std,
   1530	.vidioc_g_std             = vidioc_g_std,
   1531	.vidioc_enum_input        = vidioc_enum_input,
   1532	.vidioc_g_input           = vidioc_g_input,
   1533	.vidioc_s_input           = vidioc_s_input,
   1534	.vidioc_g_tuner           = vidioc_g_tuner,
   1535	.vidioc_s_tuner           = vidioc_s_tuner,
   1536	.vidioc_g_frequency       = vidioc_g_frequency,
   1537	.vidioc_s_frequency       = vidioc_s_frequency,
   1538	.vidioc_streamon          = vidioc_streamon,
   1539	.vidioc_streamoff         = vidioc_streamoff,
   1540	.vidioc_reqbufs           = vidioc_reqbufs,
   1541	.vidioc_querybuf          = vidioc_querybuf,
   1542	.vidioc_qbuf              = vidioc_qbuf,
   1543	.vidioc_dqbuf             = vidioc_dqbuf,
   1544	.vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
   1545	.vidioc_unsubscribe_event = v4l2_event_unsubscribe,
   1546};
   1547
   1548static struct video_device tm6000_template = {
   1549	.name		= "tm6000",
   1550	.fops           = &tm6000_fops,
   1551	.ioctl_ops      = &video_ioctl_ops,
   1552	.release	= video_device_release_empty,
   1553	.tvnorms        = TM6000_STD,
   1554};
   1555
   1556static const struct v4l2_file_operations radio_fops = {
   1557	.owner		= THIS_MODULE,
   1558	.open		= tm6000_open,
   1559	.poll		= v4l2_ctrl_poll,
   1560	.release	= tm6000_release,
   1561	.unlocked_ioctl	= video_ioctl2,
   1562};
   1563
   1564static const struct v4l2_ioctl_ops radio_ioctl_ops = {
   1565	.vidioc_querycap	= vidioc_querycap,
   1566	.vidioc_g_tuner		= radio_g_tuner,
   1567	.vidioc_s_tuner		= radio_s_tuner,
   1568	.vidioc_g_frequency	= vidioc_g_frequency,
   1569	.vidioc_s_frequency	= vidioc_s_frequency,
   1570	.vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
   1571	.vidioc_unsubscribe_event = v4l2_event_unsubscribe,
   1572};
   1573
   1574static struct video_device tm6000_radio_template = {
   1575	.name			= "tm6000",
   1576	.fops			= &radio_fops,
   1577	.ioctl_ops		= &radio_ioctl_ops,
   1578};
   1579
   1580/* -----------------------------------------------------------------
   1581 *	Initialization and module stuff
   1582 * ------------------------------------------------------------------
   1583 */
   1584
   1585static void vdev_init(struct tm6000_core *dev,
   1586		struct video_device *vfd,
   1587		const struct video_device
   1588		*template, const char *type_name)
   1589{
   1590	*vfd = *template;
   1591	vfd->v4l2_dev = &dev->v4l2_dev;
   1592	vfd->release = video_device_release_empty;
   1593	vfd->lock = &dev->lock;
   1594
   1595	snprintf(vfd->name, sizeof(vfd->name), "%s %s", dev->name, type_name);
   1596
   1597	video_set_drvdata(vfd, dev);
   1598}
   1599
   1600int tm6000_v4l2_register(struct tm6000_core *dev)
   1601{
   1602	int ret = 0;
   1603
   1604	v4l2_ctrl_handler_init(&dev->ctrl_handler, 6);
   1605	v4l2_ctrl_handler_init(&dev->radio_ctrl_handler, 2);
   1606	v4l2_ctrl_new_std(&dev->radio_ctrl_handler, &tm6000_radio_ctrl_ops,
   1607			V4L2_CID_AUDIO_MUTE, 0, 1, 1, 0);
   1608	v4l2_ctrl_new_std(&dev->radio_ctrl_handler, &tm6000_radio_ctrl_ops,
   1609			V4L2_CID_AUDIO_VOLUME, -15, 15, 1, 0);
   1610	v4l2_ctrl_new_std(&dev->ctrl_handler, &tm6000_ctrl_ops,
   1611			V4L2_CID_BRIGHTNESS, 0, 255, 1, 54);
   1612	v4l2_ctrl_new_std(&dev->ctrl_handler, &tm6000_ctrl_ops,
   1613			V4L2_CID_CONTRAST, 0, 255, 1, 119);
   1614	v4l2_ctrl_new_std(&dev->ctrl_handler, &tm6000_ctrl_ops,
   1615			V4L2_CID_SATURATION, 0, 255, 1, 112);
   1616	v4l2_ctrl_new_std(&dev->ctrl_handler, &tm6000_ctrl_ops,
   1617			V4L2_CID_HUE, -128, 127, 1, 0);
   1618	v4l2_ctrl_add_handler(&dev->ctrl_handler,
   1619			&dev->radio_ctrl_handler, NULL, false);
   1620
   1621	if (dev->radio_ctrl_handler.error)
   1622		ret = dev->radio_ctrl_handler.error;
   1623	if (!ret && dev->ctrl_handler.error)
   1624		ret = dev->ctrl_handler.error;
   1625	if (ret)
   1626		goto free_ctrl;
   1627
   1628	vdev_init(dev, &dev->vfd, &tm6000_template, "video");
   1629
   1630	dev->vfd.ctrl_handler = &dev->ctrl_handler;
   1631	dev->vfd.device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING |
   1632			       V4L2_CAP_READWRITE;
   1633	if (dev->tuner_type != TUNER_ABSENT)
   1634		dev->vfd.device_caps |= V4L2_CAP_TUNER;
   1635
   1636	/* init video dma queues */
   1637	INIT_LIST_HEAD(&dev->vidq.active);
   1638	INIT_LIST_HEAD(&dev->vidq.queued);
   1639
   1640	ret = video_register_device(&dev->vfd, VFL_TYPE_VIDEO, video_nr);
   1641
   1642	if (ret < 0) {
   1643		printk(KERN_INFO "%s: can't register video device\n",
   1644		       dev->name);
   1645		goto free_ctrl;
   1646	}
   1647
   1648	printk(KERN_INFO "%s: registered device %s\n",
   1649	       dev->name, video_device_node_name(&dev->vfd));
   1650
   1651	if (dev->caps.has_radio) {
   1652		vdev_init(dev, &dev->radio_dev, &tm6000_radio_template,
   1653							   "radio");
   1654		dev->radio_dev.ctrl_handler = &dev->radio_ctrl_handler;
   1655		dev->radio_dev.device_caps = V4L2_CAP_RADIO | V4L2_CAP_TUNER;
   1656		ret = video_register_device(&dev->radio_dev, VFL_TYPE_RADIO,
   1657					    radio_nr);
   1658		if (ret < 0) {
   1659			printk(KERN_INFO "%s: can't register radio device\n",
   1660			       dev->name);
   1661			goto unreg_video;
   1662		}
   1663
   1664		printk(KERN_INFO "%s: registered device %s\n",
   1665		       dev->name, video_device_node_name(&dev->radio_dev));
   1666	}
   1667
   1668	printk(KERN_INFO "Trident TVMaster TM5600/TM6000/TM6010 USB2 board (Load status: %d)\n", ret);
   1669	return ret;
   1670
   1671unreg_video:
   1672	video_unregister_device(&dev->vfd);
   1673free_ctrl:
   1674	v4l2_ctrl_handler_free(&dev->ctrl_handler);
   1675	v4l2_ctrl_handler_free(&dev->radio_ctrl_handler);
   1676	return ret;
   1677}
   1678
   1679int tm6000_v4l2_unregister(struct tm6000_core *dev)
   1680{
   1681	video_unregister_device(&dev->vfd);
   1682
   1683	/* if URB buffers are still allocated free them now */
   1684	tm6000_free_urb_buffers(dev);
   1685
   1686	video_unregister_device(&dev->radio_dev);
   1687	return 0;
   1688}
   1689
   1690int tm6000_v4l2_exit(void)
   1691{
   1692	return 0;
   1693}
   1694
   1695module_param(video_nr, int, 0);
   1696MODULE_PARM_DESC(video_nr, "Allow changing video device number");
   1697
   1698module_param_named(debug, tm6000_debug, int, 0444);
   1699MODULE_PARM_DESC(debug, "activates debug info");
   1700
   1701module_param(vid_limit, int, 0644);
   1702MODULE_PARM_DESC(vid_limit, "capture memory limit in megabytes");
   1703
   1704module_param(keep_urb, bool, 0);
   1705MODULE_PARM_DESC(keep_urb, "Keep urb buffers allocated even when the device is closed by the user");