/*
 *  Driver for the Conexant CX25821 PCIe bridge
 *
 *  Copyright (C) 2009 Conexant Systems Inc.
 *  Authors  <shu.lin@conexant.com>, <hiep.huynh@conexant.com>
 *  Based on Steven Toth <stoth@linuxtv.org> cx23885 driver
 *  Parts adapted/taken from Eduardo Moscoso Rubino
 *  Copyright (C) 2009 Eduardo Moscoso Rubino <moscoso@TopoLogica.com>
 *
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

#include "cx25821-video.h"

MODULE_DESCRIPTION("v4l2 driver module for cx25821 based TV cards");
MODULE_AUTHOR("Hiep Huynh <hiep.huynh@conexant.com>");
MODULE_LICENSE("GPL");

static unsigned int video_nr[] = {[0 ... (CX25821_MAXBOARDS - 1)] = UNSET };
static unsigned int radio_nr[] = {[0 ... (CX25821_MAXBOARDS - 1)] = UNSET };

module_param_array(video_nr, int, NULL, 0444);
module_param_array(radio_nr, int, NULL, 0444);

MODULE_PARM_DESC(video_nr, "video device numbers");
MODULE_PARM_DESC(radio_nr, "radio device numbers");

static unsigned int video_debug = VIDEO_DEBUG;
module_param(video_debug, int, 0644);
MODULE_PARM_DESC(video_debug, "enable debug messages [video]");

static unsigned int irq_debug;
module_param(irq_debug, int, 0644);
MODULE_PARM_DESC(irq_debug, "enable debug messages [IRQ handler]");

unsigned int vid_limit = 16;
module_param(vid_limit, int, 0644);
MODULE_PARM_DESC(vid_limit, "capture memory limit in megabytes");

static void cx25821_init_controls(struct cx25821_dev *dev, int chan_num);

static const struct v4l2_file_operations video_fops;
static const struct v4l2_ioctl_ops video_ioctl_ops;

#define FORMAT_FLAGS_PACKED       0x01

struct cx25821_fmt formats[] = {
	{
		.name = "8 bpp, gray",
		.fourcc = V4L2_PIX_FMT_GREY,
		.depth = 8,
		.flags = FORMAT_FLAGS_PACKED,
	 }, {
		.name = "4:1:1, packed, Y41P",
		.fourcc = V4L2_PIX_FMT_Y41P,
		.depth = 12,
		.flags = FORMAT_FLAGS_PACKED,
	}, {
		.name = "4:2:2, packed, YUYV",
		.fourcc = V4L2_PIX_FMT_YUYV,
		.depth = 16,
		.flags = FORMAT_FLAGS_PACKED,
	}, {
		.name = "4:2:2, packed, UYVY",
		.fourcc = V4L2_PIX_FMT_UYVY,
		.depth = 16,
		.flags = FORMAT_FLAGS_PACKED,
	}, {
		.name = "4:2:0, YUV",
		.fourcc = V4L2_PIX_FMT_YUV420,
		.depth = 12,
		.flags = FORMAT_FLAGS_PACKED,
	},
};

int cx25821_get_format_size(void)
{
	return ARRAY_SIZE(formats);
}

struct cx25821_fmt *cx25821_format_by_fourcc(unsigned int fourcc)
{
	unsigned int i;

	if (fourcc == V4L2_PIX_FMT_Y41P || fourcc == V4L2_PIX_FMT_YUV411P) {
		return formats + 1;
	}

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

	printk(KERN_ERR "%s(0x%08x) NOT FOUND\n", __func__, fourcc);
	return NULL;
}

void cx25821_dump_video_queue(struct cx25821_dev *dev, struct cx25821_dmaqueue *q)
{
	struct cx25821_buffer *buf;
	struct list_head *item;
	dprintk(1, "%s()\n", __func__);

	if (!list_empty(&q->active)) {
		list_for_each(item, &q->active)
		    buf = list_entry(item, struct cx25821_buffer, vb.queue);
	}

	if (!list_empty(&q->queued)) {
		list_for_each(item, &q->queued)
		    buf = list_entry(item, struct cx25821_buffer, vb.queue);
	}

}

void cx25821_video_wakeup(struct cx25821_dev *dev, struct cx25821_dmaqueue *q,
			  u32 count)
{
	struct cx25821_buffer *buf;
	int bc;

	for (bc = 0;; bc++) {
		if (list_empty(&q->active)) {
			dprintk(1, "bc=%d (=0: active empty)\n", bc);
			break;
		}

		buf =
		    list_entry(q->active.next, struct cx25821_buffer, vb.queue);

		/* count comes from the hw and it is 16bit wide --
		 * this trick handles wrap-arounds correctly for
		 * up to 32767 buffers in flight... */
		if ((s16) (count - buf->count) < 0) {
			break;
		}

		do_gettimeofday(&buf->vb.ts);
		buf->vb.state = VIDEOBUF_DONE;
		list_del(&buf->vb.queue);
		wake_up(&buf->vb.done);
	}

	if (list_empty(&q->active))
		del_timer(&q->timeout);
	else
		mod_timer(&q->timeout, jiffies + BUFFER_TIMEOUT);
	if (bc != 1)
		printk(KERN_ERR "%s: %d buffers handled (should be 1)\n",
		       __func__, bc);
}

#ifdef TUNER_FLAG
int cx25821_set_tvnorm(struct cx25821_dev *dev, v4l2_std_id norm)
{
	dprintk(1, "%s(norm = 0x%08x) name: [%s]\n", __func__,
		(unsigned int)norm, v4l2_norm_to_name(norm));

	dev->tvnorm = norm;

	/* Tell the internal A/V decoder */
	cx25821_call_all(dev, core, s_std, norm);

	return 0;
}
#endif

struct video_device *cx25821_vdev_init(struct cx25821_dev *dev,
				       struct pci_dev *pci,
				       struct video_device *template,
				       char *type)
{
	struct video_device *vfd;
	dprintk(1, "%s()\n", __func__);

	vfd = video_device_alloc();
	if (NULL == vfd)
		return NULL;
	*vfd = *template;
	vfd->v4l2_dev = &dev->v4l2_dev;
	vfd->release = video_device_release;
	snprintf(vfd->name, sizeof(vfd->name), "%s %s (%s)", dev->name, type,
		 cx25821_boards[dev->board].name);
	video_set_drvdata(vfd, dev);
	return vfd;
}

/*
static int cx25821_ctrl_query(struct v4l2_queryctrl *qctrl)
{
    int i;

    if (qctrl->id < V4L2_CID_BASE || qctrl->id >= V4L2_CID_LASTP1)
	return -EINVAL;
    for (i = 0; i < CX25821_CTLS; i++)
	if (cx25821_ctls[i].v.id == qctrl->id)
	    break;
    if (i == CX25821_CTLS) {
	*qctrl = no_ctl;
	return 0;
    }
    *qctrl = cx25821_ctls[i].v;
    return 0;
}
*/

/* resource management */
int cx25821_res_get(struct cx25821_dev *dev, struct cx25821_fh *fh, unsigned int bit)
{
	dprintk(1, "%s()\n", __func__);
	if (fh->resources & bit)
		/* have it already allocated */
		return 1;

	/* is it free? */
	mutex_lock(&dev->lock);
       if (dev->channels[fh->channel_id].resources & bit) {
		/* no, someone else uses it */
		mutex_unlock(&dev->lock);
		return 0;
	}
	/* it's free, grab it */
	fh->resources |= bit;
       dev->channels[fh->channel_id].resources |= bit;
	dprintk(1, "res: get %d\n", bit);
	mutex_unlock(&dev->lock);
	return 1;
}

int cx25821_res_check(struct cx25821_fh *fh, unsigned int bit)
{
	return fh->resources & bit;
}

int cx25821_res_locked(struct cx25821_fh *fh, unsigned int bit)
{
       return fh->dev->channels[fh->channel_id].resources & bit;
}

void cx25821_res_free(struct cx25821_dev *dev, struct cx25821_fh *fh, unsigned int bits)
{
	BUG_ON((fh->resources & bits) != bits);
	dprintk(1, "%s()\n", __func__);

	mutex_lock(&dev->lock);
	fh->resources &= ~bits;
       dev->channels[fh->channel_id].resources &= ~bits;
	dprintk(1, "res: put %d\n", bits);
	mutex_unlock(&dev->lock);
}

int cx25821_video_mux(struct cx25821_dev *dev, unsigned int input)
{
	struct v4l2_routing route;
	memset(&route, 0, sizeof(route));

	dprintk(1, "%s() video_mux: %d [vmux=%d, gpio=0x%x,0x%x,0x%x,0x%x]\n",
		__func__, input, INPUT(input)->vmux, INPUT(input)->gpio0,
		INPUT(input)->gpio1, INPUT(input)->gpio2, INPUT(input)->gpio3);
	dev->input = input;

	route.input = INPUT(input)->vmux;

	/* Tell the internal A/V decoder */
	cx25821_call_all(dev, video, s_routing, INPUT(input)->vmux, 0, 0);

	return 0;
}

int cx25821_start_video_dma(struct cx25821_dev *dev,
			    struct cx25821_dmaqueue *q,
			    struct cx25821_buffer *buf,
			    struct sram_channel *channel)
{
	int tmp = 0;

	/* setup fifo + format */
	cx25821_sram_channel_setup(dev, channel, buf->bpl, buf->risc.dma);

	/* reset counter */
	cx_write(channel->gpcnt_ctl, 3);
	q->count = 1;

	/* enable irq */
	cx_set(PCI_INT_MSK, cx_read(PCI_INT_MSK) | (1 << channel->i));
	cx_set(channel->int_msk, 0x11);

	/* start dma */
	cx_write(channel->dma_ctl, 0x11);	/* FIFO and RISC enable */

	/* make sure upstream setting if any is reversed */
	tmp = cx_read(VID_CH_MODE_SEL);
	cx_write(VID_CH_MODE_SEL, tmp & 0xFFFFFE00);

	return 0;
}

int cx25821_restart_video_queue(struct cx25821_dev *dev,
				struct cx25821_dmaqueue *q,
				struct sram_channel *channel)
{
	struct cx25821_buffer *buf, *prev;
	struct list_head *item;

	if (!list_empty(&q->active)) {
		buf =
		    list_entry(q->active.next, struct cx25821_buffer, vb.queue);

		cx25821_start_video_dma(dev, q, buf, channel);

		list_for_each(item, &q->active) {
			buf = list_entry(item, struct cx25821_buffer, vb.queue);
			buf->count = q->count++;
		}

		mod_timer(&q->timeout, jiffies + BUFFER_TIMEOUT);
		return 0;
	}

	prev = NULL;
	for (;;) {
		if (list_empty(&q->queued))
			return 0;

		buf =
		    list_entry(q->queued.next, struct cx25821_buffer, vb.queue);

		if (NULL == prev) {
			list_move_tail(&buf->vb.queue, &q->active);
			cx25821_start_video_dma(dev, q, buf, channel);
			buf->vb.state = VIDEOBUF_ACTIVE;
			buf->count = q->count++;
			mod_timer(&q->timeout, jiffies + BUFFER_TIMEOUT);
		} else if (prev->vb.width == buf->vb.width &&
			   prev->vb.height == buf->vb.height &&
			   prev->fmt == buf->fmt) {
			list_move_tail(&buf->vb.queue, &q->active);
			buf->vb.state = VIDEOBUF_ACTIVE;
			buf->count = q->count++;
			prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
			prev->risc.jmp[2] = cpu_to_le32(0);	/* Bits 63 - 32 */
		} else {
			return 0;
		}
		prev = buf;
	}
}

void cx25821_vid_timeout(unsigned long data)
{
	struct cx25821_data *timeout_data = (struct cx25821_data *)data;
	struct cx25821_dev *dev = timeout_data->dev;
	struct sram_channel *channel = timeout_data->channel;
       struct cx25821_dmaqueue *q = &dev->channels[channel->i].vidq;
	struct cx25821_buffer *buf;
	unsigned long flags;

       /* cx25821_sram_channel_dump(dev, channel); */
	cx_clear(channel->dma_ctl, 0x11);

	spin_lock_irqsave(&dev->slock, flags);
	while (!list_empty(&q->active)) {
		buf =
		    list_entry(q->active.next, struct cx25821_buffer, vb.queue);
		list_del(&buf->vb.queue);

		buf->vb.state = VIDEOBUF_ERROR;
		wake_up(&buf->vb.done);
	}

	cx25821_restart_video_queue(dev, q, channel);
	spin_unlock_irqrestore(&dev->slock, flags);
}

int cx25821_video_irq(struct cx25821_dev *dev, int chan_num, u32 status)
{
	u32 count = 0;
	int handled = 0;
	u32 mask;
       struct sram_channel *channel = dev->channels[chan_num].sram_channels;

	mask = cx_read(channel->int_msk);
	if (0 == (status & mask))
		return handled;

	cx_write(channel->int_stat, status);

	/* risc op code error */
	if (status & (1 << 16)) {
		printk(KERN_WARNING "%s, %s: video risc op code error\n",
		       dev->name, channel->name);
		cx_clear(channel->dma_ctl, 0x11);
		cx25821_sram_channel_dump(dev, channel);
	}

	/* risc1 y */
	if (status & FLD_VID_DST_RISC1) {
		spin_lock(&dev->slock);
		count = cx_read(channel->gpcnt);
	       cx25821_video_wakeup(dev,
		       &dev->channels[channel->i].vidq, count);
		spin_unlock(&dev->slock);
		handled++;
	}

	/* risc2 y */
	if (status & 0x10) {
		dprintk(2, "stopper video\n");
		spin_lock(&dev->slock);
	       cx25821_restart_video_queue(dev,
			       &dev->channels[channel->i].vidq,
				       channel);
		spin_unlock(&dev->slock);
		handled++;
	}
	return handled;
}

void cx25821_videoioctl_unregister(struct cx25821_dev *dev)
{
	if (dev->ioctl_dev) {
		if (video_is_registered(dev->ioctl_dev))
			video_unregister_device(dev->ioctl_dev);
		else
			video_device_release(dev->ioctl_dev);

		dev->ioctl_dev = NULL;
	}
}

void cx25821_video_unregister(struct cx25821_dev *dev, int chan_num)
{
	cx_clear(PCI_INT_MSK, 1);

       if (dev->channels[chan_num].video_dev) {
	       if (video_is_registered(dev->channels[chan_num].video_dev))
		       video_unregister_device(
			       dev->channels[chan_num].video_dev);
		else
		       video_device_release(
			       dev->channels[chan_num].video_dev);

	       dev->channels[chan_num].video_dev = NULL;

	       btcx_riscmem_free(dev->pci,
		       &dev->channels[chan_num].vidq.stopper);

		printk(KERN_WARNING "device %d released!\n", chan_num);
	}

}

int cx25821_video_register(struct cx25821_dev *dev)
{
	int err;
       int i;

       struct video_device cx25821_video_device = {
	       .name = "cx25821-video",
	       .fops = &video_fops,
	       .minor = -1,
	       .ioctl_ops = &video_ioctl_ops,
	       .tvnorms = CX25821_NORMS,
	       .current_norm = V4L2_STD_NTSC_M,
       };

	spin_lock_init(&dev->slock);

    for (i = 0; i < MAX_VID_CHANNEL_NUM - 1; ++i) {
	       cx25821_init_controls(dev, i);

	       cx25821_risc_stopper(dev->pci,
			       &dev->channels[i].vidq.stopper,
			       dev->channels[i].sram_channels->dma_ctl,
			       0x11, 0);

	       dev->channels[i].sram_channels = &cx25821_sram_channels[i];
	       dev->channels[i].video_dev = NULL;
	       dev->channels[i].resources = 0;

	       cx_write(dev->channels[i].sram_channels->int_stat,
			       0xffffffff);

	       INIT_LIST_HEAD(&dev->channels[i].vidq.active);
	       INIT_LIST_HEAD(&dev->channels[i].vidq.queued);

	       dev->channels[i].timeout_data.dev = dev;
	       dev->channels[i].timeout_data.channel =
				       &cx25821_sram_channels[i];
	       dev->channels[i].vidq.timeout.function =
				       cx25821_vid_timeout;
	       dev->channels[i].vidq.timeout.data =
		       (unsigned long)&dev->channels[i].timeout_data;
	       init_timer(&dev->channels[i].vidq.timeout);

	       /* register v4l devices */
	       dev->channels[i].video_dev = cx25821_vdev_init(dev,
		       dev->pci, &cx25821_video_device, "video");

	       err = video_register_device(dev->channels[i].video_dev,
			       VFL_TYPE_GRABBER, video_nr[dev->nr]);

	       if (err < 0)
		       goto fail_unreg;

	}

    /* set PCI interrupt */
	cx_set(PCI_INT_MSK, 0xff);

	/* initial device configuration */
	mutex_lock(&dev->lock);
#ifdef TUNER_FLAG
       dev->tvnorm = cx25821_video_device.current_norm;
	cx25821_set_tvnorm(dev, dev->tvnorm);
#endif
	mutex_unlock(&dev->lock);


    return 0;

fail_unreg:
       cx25821_video_unregister(dev, i);
	return err;
}

int cx25821_buffer_setup(struct videobuf_queue *q, unsigned int *count,
		 unsigned int *size)
{
	struct cx25821_fh *fh = q->priv_data;

	*size = fh->fmt->depth * fh->width * fh->height >> 3;

	if (0 == *count)
		*count = 32;

	if (*size * *count > vid_limit * 1024 * 1024)
		*count = (vid_limit * 1024 * 1024) / *size;

	return 0;
}

int cx25821_buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
		   enum v4l2_field field)
{
	struct cx25821_fh *fh = q->priv_data;
	struct cx25821_dev *dev = fh->dev;
	struct cx25821_buffer *buf =
	    container_of(vb, struct cx25821_buffer, vb);
	int rc, init_buffer = 0;
	u32 line0_offset, line1_offset;
	struct videobuf_dmabuf *dma = videobuf_to_dma(&buf->vb);
	int bpl_local = LINE_SIZE_D1;
       int channel_opened = fh->channel_id;

	BUG_ON(NULL == fh->fmt);
	if (fh->width < 48 || fh->width > 720 ||
	    fh->height < 32 || fh->height > 576)
		return -EINVAL;

	buf->vb.size = (fh->width * fh->height * fh->fmt->depth) >> 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;
		init_buffer = 1;
	}

	if (VIDEOBUF_NEEDS_INIT == buf->vb.state) {
		init_buffer = 1;
		rc = videobuf_iolock(q, &buf->vb, NULL);
		if (0 != rc) {
			printk(KERN_DEBUG "videobuf_iolock failed!\n");
			goto fail;
		}
	}

	dprintk(1, "init_buffer=%d\n", init_buffer);

	if (init_buffer) {

		channel_opened = dev->channel_opened;
		channel_opened = (channel_opened < 0
				  || channel_opened > 7) ? 7 : channel_opened;

	       if (dev->channels[channel_opened]
		       .pixel_formats == PIXEL_FRMT_411)
			buf->bpl = (buf->fmt->depth * buf->vb.width) >> 3;
		else
			buf->bpl = (buf->fmt->depth >> 3) * (buf->vb.width);

	       if (dev->channels[channel_opened]
		       .pixel_formats == PIXEL_FRMT_411) {
			bpl_local = buf->bpl;
		} else {
		       bpl_local = buf->bpl;   /* Default */

			if (channel_opened >= 0 && channel_opened <= 7) {
			       if (dev->channels[channel_opened]
					       .use_cif_resolution) {
					if (dev->tvnorm & V4L2_STD_PAL_BG
					    || dev->tvnorm & V4L2_STD_PAL_DK)
						bpl_local = 352 << 1;
					else
						bpl_local =
						 dev->channels[channel_opened].
						 cif_width <<
						 1;
				}
			}
		}

		switch (buf->vb.field) {
		case V4L2_FIELD_TOP:
			cx25821_risc_buffer(dev->pci, &buf->risc,
					    dma->sglist, 0, UNSET,
					    buf->bpl, 0, buf->vb.height);
			break;
		case V4L2_FIELD_BOTTOM:
			cx25821_risc_buffer(dev->pci, &buf->risc,
					    dma->sglist, UNSET, 0,
					    buf->bpl, 0, buf->vb.height);
			break;
		case V4L2_FIELD_INTERLACED:
			/* All other formats are top field first */
			line0_offset = 0;
			line1_offset = buf->bpl;
			dprintk(1, "top field first\n");

			cx25821_risc_buffer(dev->pci, &buf->risc,
					    dma->sglist, line0_offset,
					    bpl_local, bpl_local, bpl_local,
					    buf->vb.height >> 1);
			break;
		case V4L2_FIELD_SEQ_TB:
			cx25821_risc_buffer(dev->pci, &buf->risc,
					    dma->sglist,
					    0, buf->bpl * (buf->vb.height >> 1),
					    buf->bpl, 0, buf->vb.height >> 1);
			break;
		case V4L2_FIELD_SEQ_BT:
			cx25821_risc_buffer(dev->pci, &buf->risc,
					    dma->sglist,
					    buf->bpl * (buf->vb.height >> 1), 0,
					    buf->bpl, 0, buf->vb.height >> 1);
			break;
		default:
			BUG();
		}
	}

	dprintk(2, "[%p/%d] buffer_prep - %dx%d %dbpp \"%s\" - dma=0x%08lx\n",
		buf, buf->vb.i, fh->width, fh->height, fh->fmt->depth,
		fh->fmt->name, (unsigned long)buf->risc.dma);

	buf->vb.state = VIDEOBUF_PREPARED;

	return 0;

      fail:
	cx25821_free_buffer(q, buf);
	return rc;
}

void cx25821_buffer_release(struct videobuf_queue *q, struct videobuf_buffer *vb)
{
	struct cx25821_buffer *buf =
	    container_of(vb, struct cx25821_buffer, vb);

	cx25821_free_buffer(q, buf);
}

struct videobuf_queue *get_queue(struct cx25821_fh *fh)
{
	switch (fh->type) {
	case V4L2_BUF_TYPE_VIDEO_CAPTURE:
		return &fh->vidq;
	default:
		BUG();
		return NULL;
	}
}

int cx25821_get_resource(struct cx25821_fh *fh, int resource)
{
	switch (fh->type) {
	case V4L2_BUF_TYPE_VIDEO_CAPTURE:
		return resource;
	default:
		BUG();
		return 0;
	}
}

int cx25821_video_mmap(struct file *file, struct vm_area_struct *vma)
{
	struct cx25821_fh *fh = file->private_data;

	return videobuf_mmap_mapper(get_queue(fh), vma);
}


static void buffer_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb)
{
       struct cx25821_buffer *buf =
	   container_of(vb, struct cx25821_buffer, vb);
       struct cx25821_buffer *prev;
       struct cx25821_fh *fh = vq->priv_data;
       struct cx25821_dev *dev = fh->dev;
       struct cx25821_dmaqueue *q = &dev->channels[fh->channel_id].vidq;

       /* add jump to stopper */
       buf->risc.jmp[0] = cpu_to_le32(RISC_JUMP | RISC_IRQ1 | RISC_CNT_INC);
       buf->risc.jmp[1] = cpu_to_le32(q->stopper.dma);
       buf->risc.jmp[2] = cpu_to_le32(0);      /* bits 63-32 */

       dprintk(2, "jmp to stopper (0x%x)\n", buf->risc.jmp[1]);

       if (!list_empty(&q->queued)) {
	       list_add_tail(&buf->vb.queue, &q->queued);
	       buf->vb.state = VIDEOBUF_QUEUED;
	       dprintk(2, "[%p/%d] buffer_queue - append to queued\n", buf,
		       buf->vb.i);

       } else if (list_empty(&q->active)) {
	       list_add_tail(&buf->vb.queue, &q->active);
	       cx25821_start_video_dma(dev, q, buf,
				       dev->channels[fh->channel_id].
				       sram_channels);
	       buf->vb.state = VIDEOBUF_ACTIVE;
	       buf->count = q->count++;
	       mod_timer(&q->timeout, jiffies + BUFFER_TIMEOUT);
	       dprintk(2,
		       "[%p/%d] buffer_queue - first active, buf cnt = %d, \
		       q->count = %d\n",
		       buf, buf->vb.i, buf->count, q->count);
       } else {
	       prev =
		   list_entry(q->active.prev, struct cx25821_buffer, vb.queue);
	       if (prev->vb.width == buf->vb.width
		   && prev->vb.height == buf->vb.height
		   && prev->fmt == buf->fmt) {
		       list_add_tail(&buf->vb.queue, &q->active);
		       buf->vb.state = VIDEOBUF_ACTIVE;
		       buf->count = q->count++;
		       prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma);

		       /* 64 bit bits 63-32 */
		       prev->risc.jmp[2] = cpu_to_le32(0);
		       dprintk(2,
			       "[%p/%d] buffer_queue - append to active, \
			       buf->count=%d\n",
			       buf, buf->vb.i, buf->count);

	       } else {
		       list_add_tail(&buf->vb.queue, &q->queued);
		       buf->vb.state = VIDEOBUF_QUEUED;
		       dprintk(2, "[%p/%d] buffer_queue - first queued\n", buf,
			       buf->vb.i);
	       }
       }

       if (list_empty(&q->active))
	       dprintk(2, "active queue empty!\n");
}

static struct videobuf_queue_ops cx25821_video_qops = {
       .buf_setup = cx25821_buffer_setup,
       .buf_prepare = cx25821_buffer_prepare,
       .buf_queue = buffer_queue,
       .buf_release = cx25821_buffer_release,
};

static int video_open(struct file *file)
{
       struct video_device *vdev = video_devdata(file);
       struct cx25821_dev *h, *dev = video_drvdata(file);
       struct cx25821_fh *fh;
       struct list_head *list;
       int minor = video_devdata(file)->minor;
       enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
       u32 pix_format;
       int ch_id = 0;
       int i;

       dprintk(1, "open dev=%s type=%s\n",
		       video_device_node_name(vdev),
		       v4l2_type_names[type]);

       /* allocate + initialize per filehandle data */
       fh = kzalloc(sizeof(*fh), GFP_KERNEL);
       if (NULL == fh)
	       return -ENOMEM;

       lock_kernel();

       list_for_each(list, &cx25821_devlist)
       {
	       h = list_entry(list, struct cx25821_dev, devlist);

	       for (i = 0; i < MAX_VID_CHANNEL_NUM; i++) {
		       if (h->channels[i].video_dev &&
			   h->channels[i].video_dev->minor == minor) {
			       dev = h;
			       ch_id = i;
			       type  = V4L2_BUF_TYPE_VIDEO_CAPTURE;
		       }
	       }
       }

       if (NULL == dev) {
	       unlock_kernel();
	       return -ENODEV;
       }

       file->private_data = fh;
       fh->dev = dev;
       fh->type = type;
       fh->width = 720;
    fh->channel_id = ch_id;

       if (dev->tvnorm & V4L2_STD_PAL_BG || dev->tvnorm & V4L2_STD_PAL_DK)
	       fh->height = 576;
       else
	       fh->height = 480;

       dev->channel_opened = fh->channel_id;
       pix_format =
	   (dev->channels[ch_id].pixel_formats ==
	    PIXEL_FRMT_411) ? V4L2_PIX_FMT_Y41P : V4L2_PIX_FMT_YUYV;
       fh->fmt = cx25821_format_by_fourcc(pix_format);

       v4l2_prio_open(&dev->channels[ch_id].prio, &fh->prio);

       videobuf_queue_sg_init(&fh->vidq, &cx25821_video_qops,
			      &dev->pci->dev, &dev->slock,
			      V4L2_BUF_TYPE_VIDEO_CAPTURE,
			      V4L2_FIELD_INTERLACED,
			      sizeof(struct cx25821_buffer), fh, NULL);

       dprintk(1, "post videobuf_queue_init()\n");
       unlock_kernel();

       return 0;
}

static ssize_t video_read(struct file *file, char __user * data, size_t count,
			 loff_t *ppos)
{
       struct cx25821_fh *fh = file->private_data;

       switch (fh->type) {
       case V4L2_BUF_TYPE_VIDEO_CAPTURE:
	       if (cx25821_res_locked(fh, RESOURCE_VIDEO0))
		       return -EBUSY;

	       return videobuf_read_one(&fh->vidq, data, count, ppos,
					file->f_flags & O_NONBLOCK);

       default:
	       BUG();
	       return 0;
       }
}

static unsigned int video_poll(struct file *file,
			      struct poll_table_struct *wait)
{
       struct cx25821_fh *fh = file->private_data;
       struct cx25821_buffer *buf;

       if (cx25821_res_check(fh, RESOURCE_VIDEO0)) {
	       /* streaming capture */
	       if (list_empty(&fh->vidq.stream))
		       return POLLERR;
	       buf = list_entry(fh->vidq.stream.next,
				struct cx25821_buffer, vb.stream);
       } else {
	       /* read() capture */
	       buf = (struct cx25821_buffer *)fh->vidq.read_buf;
	       if (NULL == buf)
		       return POLLERR;
       }

       poll_wait(file, &buf->vb.done, wait);
       if (buf->vb.state == VIDEOBUF_DONE || buf->vb.state == VIDEOBUF_ERROR) {
	       if (buf->vb.state == VIDEOBUF_DONE) {
		       struct cx25821_dev *dev = fh->dev;

		       if (dev && dev->channels[fh->channel_id]
					       .use_cif_resolution) {
			       u8 cam_id = *((char *)buf->vb.baddr + 3);
			       memcpy((char *)buf->vb.baddr,
				      (char *)buf->vb.baddr + (fh->width * 2),
				      (fh->width * 2));
			       *((char *)buf->vb.baddr + 3) = cam_id;
		       }
	       }

	       return POLLIN | POLLRDNORM;
       }

       return 0;
}

static int video_release(struct file *file)
{
       struct cx25821_fh *fh = file->private_data;
       struct cx25821_dev *dev = fh->dev;

       /* stop the risc engine and fifo */
       cx_write(channel0->dma_ctl, 0); /* FIFO and RISC disable */

       /* stop video capture */
       if (cx25821_res_check(fh, RESOURCE_VIDEO0)) {
	       videobuf_queue_cancel(&fh->vidq);
	       cx25821_res_free(dev, fh, RESOURCE_VIDEO0);
       }

       if (fh->vidq.read_buf) {
	       cx25821_buffer_release(&fh->vidq, fh->vidq.read_buf);
	       kfree(fh->vidq.read_buf);
       }

       videobuf_mmap_free(&fh->vidq);

       v4l2_prio_close(&dev->channels[fh->channel_id].prio, fh->prio);
       file->private_data = NULL;
       kfree(fh);

       return 0;
}

static int vidioc_streamon(struct file *file, void *priv, enum v4l2_buf_type i)
{
       struct cx25821_fh *fh = priv;
       struct cx25821_dev *dev = fh->dev;

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

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

       if (unlikely(!cx25821_res_get(dev, fh,
		       cx25821_get_resource(fh, RESOURCE_VIDEO0))))
	       return -EBUSY;

       return videobuf_streamon(get_queue(fh));
}

static int vidioc_streamoff(struct file *file, void *priv, enum v4l2_buf_type i)
{
       struct cx25821_fh *fh = priv;
       struct cx25821_dev *dev = fh->dev;
       int err, res;

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

       res = cx25821_get_resource(fh, RESOURCE_VIDEO0);
       err = videobuf_streamoff(get_queue(fh));
       if (err < 0)
	       return err;
       cx25821_res_free(dev, fh, res);
       return 0;
}

static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
			       struct v4l2_format *f)
{
       struct cx25821_fh *fh = priv;
       struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
	struct v4l2_mbus_framefmt mbus_fmt;
       int err;
       int pix_format = PIXEL_FRMT_422;

       if (fh) {
	       err = v4l2_prio_check(&dev->channels[fh->channel_id]
					       .prio, fh->prio);
	       if (0 != err)
		       return err;
       }

       dprintk(2, "%s()\n", __func__);
       err = cx25821_vidioc_try_fmt_vid_cap(file, priv, f);

       if (0 != err)
	       return err;

       fh->fmt = cx25821_format_by_fourcc(f->fmt.pix.pixelformat);
       fh->vidq.field = f->fmt.pix.field;

       /* check if width and height is valid based on set standard */
       if (cx25821_is_valid_width(f->fmt.pix.width, dev->tvnorm))
	       fh->width = f->fmt.pix.width;

       if (cx25821_is_valid_height(f->fmt.pix.height, dev->tvnorm))
	       fh->height = f->fmt.pix.height;

       if (f->fmt.pix.pixelformat == V4L2_PIX_FMT_Y41P)
	       pix_format = PIXEL_FRMT_411;
       else if (f->fmt.pix.pixelformat == V4L2_PIX_FMT_YUYV)
	       pix_format = PIXEL_FRMT_422;
       else
	       return -EINVAL;

       cx25821_set_pixel_format(dev, SRAM_CH00, pix_format);

       /* check if cif resolution */
       if (fh->width == 320 || fh->width == 352)
	       dev->channels[fh->channel_id].use_cif_resolution = 1;
       else
	       dev->channels[fh->channel_id].use_cif_resolution = 0;

       dev->channels[fh->channel_id].cif_width = fh->width;
       medusa_set_resolution(dev, fh->width, SRAM_CH00);

       dprintk(2, "%s() width=%d height=%d field=%d\n", __func__, fh->width,
	       fh->height, fh->vidq.field);
	v4l2_fill_mbus_format(&mbus_fmt, &f->fmt.pix, V4L2_MBUS_FMT_FIXED);
	cx25821_call_all(dev, video, s_mbus_fmt, &mbus_fmt);

       return 0;
}

static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *p)
{
       int ret_val = 0;
       struct cx25821_fh *fh = priv;
       struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;

       ret_val = videobuf_dqbuf(get_queue(fh), p, file->f_flags & O_NONBLOCK);

    p->sequence = dev->channels[fh->channel_id].vidq.count;

       return ret_val;
}

static int vidioc_log_status(struct file *file, void *priv)
{
       struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
       struct cx25821_fh *fh = priv;
       char name[32 + 2];

       struct sram_channel *sram_ch = dev->channels[fh->channel_id]
						       .sram_channels;
       u32 tmp = 0;

       snprintf(name, sizeof(name), "%s/2", dev->name);
       printk(KERN_INFO "%s/2: ============  START LOG STATUS  ============\n",
	      dev->name);
       cx25821_call_all(dev, core, log_status);
       tmp = cx_read(sram_ch->dma_ctl);
       printk(KERN_INFO "Video input 0 is %s\n",
	      (tmp & 0x11) ? "streaming" : "stopped");
       printk(KERN_INFO "%s/2: =============  END LOG STATUS  =============\n",
	      dev->name);
       return 0;
}

static int vidioc_s_ctrl(struct file *file, void *priv,
			struct v4l2_control *ctl)
{
       struct cx25821_fh *fh = priv;
       struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
       int err;

       if (fh) {
	       err = v4l2_prio_check(&dev->channels[fh->channel_id]
					       .prio, fh->prio);
	       if (0 != err)
		       return err;
       }

       return cx25821_set_control(dev, ctl, fh->channel_id);
}

/* VIDEO IOCTLS                                                       */
int cx25821_vidioc_g_fmt_vid_cap(struct file *file, void *priv, struct v4l2_format *f)
{
	struct cx25821_fh *fh = priv;

	f->fmt.pix.width = fh->width;
	f->fmt.pix.height = fh->height;
	f->fmt.pix.field = fh->vidq.field;
	f->fmt.pix.pixelformat = fh->fmt->fourcc;
	f->fmt.pix.bytesperline = (f->fmt.pix.width * fh->fmt->depth) >> 3;
	f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline;

	return 0;
}

int cx25821_vidioc_try_fmt_vid_cap(struct file *file, void *priv, struct v4l2_format *f)
{
	struct cx25821_fmt *fmt;
	enum v4l2_field field;
	unsigned int maxw, maxh;

	fmt = cx25821_format_by_fourcc(f->fmt.pix.pixelformat);
	if (NULL == fmt)
		return -EINVAL;

	field = f->fmt.pix.field;
	maxw = 720;
	maxh = 576;

	if (V4L2_FIELD_ANY == field) {
		field = (f->fmt.pix.height > maxh / 2)
		    ? V4L2_FIELD_INTERLACED : V4L2_FIELD_TOP;
	}

	switch (field) {
	case V4L2_FIELD_TOP:
	case V4L2_FIELD_BOTTOM:
		maxh = maxh / 2;
		break;
	case V4L2_FIELD_INTERLACED:
		break;
	default:
		return -EINVAL;
	}

	f->fmt.pix.field = field;
	if (f->fmt.pix.height < 32)
		f->fmt.pix.height = 32;
	if (f->fmt.pix.height > maxh)
		f->fmt.pix.height = maxh;
	if (f->fmt.pix.width < 48)
		f->fmt.pix.width = 48;
	if (f->fmt.pix.width > maxw)
		f->fmt.pix.width = maxw;
	f->fmt.pix.width &= ~0x03;
	f->fmt.pix.bytesperline = (f->fmt.pix.width * fmt->depth) >> 3;
	f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline;

	return 0;
}

int cx25821_vidioc_querycap(struct file *file, void *priv, struct v4l2_capability *cap)
{
	struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;

	strcpy(cap->driver, "cx25821");
	strlcpy(cap->card, cx25821_boards[dev->board].name, sizeof(cap->card));
	sprintf(cap->bus_info, "PCIe:%s", pci_name(dev->pci));
	cap->version = CX25821_VERSION_CODE;
	cap->capabilities =
	    V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE | V4L2_CAP_STREAMING;
	if (UNSET != dev->tuner_type)
		cap->capabilities |= V4L2_CAP_TUNER;
	return 0;
}

int cx25821_vidioc_enum_fmt_vid_cap(struct file *file, void *priv,
			    struct v4l2_fmtdesc *f)
{
	if (unlikely(f->index >= ARRAY_SIZE(formats)))
		return -EINVAL;

	strlcpy(f->description, formats[f->index].name, sizeof(f->description));
	f->pixelformat = formats[f->index].fourcc;

	return 0;
}

#ifdef CONFIG_VIDEO_V4L1_COMPAT
int cx25821_vidiocgmbuf(struct file *file, void *priv, struct video_mbuf *mbuf)
{
	struct cx25821_fh *fh = priv;
	struct videobuf_queue *q;
	struct v4l2_requestbuffers req;
	unsigned int i;
	int err;

	q = get_queue(fh);
	memset(&req, 0, sizeof(req));
	req.type = q->type;
	req.count = 8;
	req.memory = V4L2_MEMORY_MMAP;
	err = videobuf_reqbufs(q, &req);
	if (err < 0)
		return err;

	mbuf->frames = req.count;
	mbuf->size = 0;
	for (i = 0; i < mbuf->frames; i++) {
		mbuf->offsets[i] = q->bufs[i]->boff;
		mbuf->size += q->bufs[i]->bsize;
	}
	return 0;
}
#endif

int cx25821_vidioc_reqbufs(struct file *file, void *priv, struct v4l2_requestbuffers *p)
{
	struct cx25821_fh *fh = priv;
	return videobuf_reqbufs(get_queue(fh), p);
}

int cx25821_vidioc_querybuf(struct file *file, void *priv, struct v4l2_buffer *p)
{
	struct cx25821_fh *fh = priv;
	return videobuf_querybuf(get_queue(fh), p);
}

int cx25821_vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *p)
{
	struct cx25821_fh *fh = priv;
	return videobuf_qbuf(get_queue(fh), p);
}

int cx25821_vidioc_g_priority(struct file *file, void *f, enum v4l2_priority *p)
{
	struct cx25821_dev *dev = ((struct cx25821_fh *)f)->dev;
       struct cx25821_fh *fh = f;

       *p = v4l2_prio_max(&dev->channels[fh->channel_id].prio);

	return 0;
}

int cx25821_vidioc_s_priority(struct file *file, void *f, enum v4l2_priority prio)
{
	struct cx25821_fh *fh = f;
	struct cx25821_dev *dev = ((struct cx25821_fh *)f)->dev;

       return v4l2_prio_change(&dev->channels[fh->channel_id]
				       .prio, &fh->prio, prio);
}

#ifdef TUNER_FLAG
int cx25821_vidioc_s_std(struct file *file, void *priv, v4l2_std_id * tvnorms)
{
	struct cx25821_fh *fh = priv;
	struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
	int err;

	dprintk(1, "%s()\n", __func__);

	if (fh) {
	       err = v4l2_prio_check(&dev->channels[fh->channel_id]
					       .prio, fh->prio);
		if (0 != err)
			return err;
	}

	if (dev->tvnorm == *tvnorms) {
		return 0;
	}

	mutex_lock(&dev->lock);
	cx25821_set_tvnorm(dev, *tvnorms);
	mutex_unlock(&dev->lock);

	medusa_set_videostandard(dev);

	return 0;
}
#endif

int cx25821_enum_input(struct cx25821_dev *dev, struct v4l2_input *i)
{
	static const char *iname[] = {
		[CX25821_VMUX_COMPOSITE] = "Composite",
		[CX25821_VMUX_SVIDEO] = "S-Video",
		[CX25821_VMUX_DEBUG] = "for debug only",
	};
	unsigned int n;
	dprintk(1, "%s()\n", __func__);

	n = i->index;
	if (n >= 2)
		return -EINVAL;

	if (0 == INPUT(n)->type)
		return -EINVAL;

	memset(i, 0, sizeof(*i));
	i->index = n;
	i->type = V4L2_INPUT_TYPE_CAMERA;
	strcpy(i->name, iname[INPUT(n)->type]);

	i->std = CX25821_NORMS;
	return 0;
}

int cx25821_vidioc_enum_input(struct file *file, void *priv, struct v4l2_input *i)
{
	struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
	dprintk(1, "%s()\n", __func__);
	return cx25821_enum_input(dev, i);
}

int cx25821_vidioc_g_input(struct file *file, void *priv, unsigned int *i)
{
	struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;

	*i = dev->input;
	dprintk(1, "%s() returns %d\n", __func__, *i);
	return 0;
}

int cx25821_vidioc_s_input(struct file *file, void *priv, unsigned int i)
{
	struct cx25821_fh *fh = priv;
	struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
	int err;

	dprintk(1, "%s(%d)\n", __func__, i);

	if (fh) {
	       err = v4l2_prio_check(&dev->channels[fh->channel_id]
					       .prio, fh->prio);
		if (0 != err)
			return err;
	}

	if (i > 2) {
		dprintk(1, "%s() -EINVAL\n", __func__);
		return -EINVAL;
	}

	mutex_lock(&dev->lock);
	cx25821_video_mux(dev, i);
	mutex_unlock(&dev->lock);
	return 0;
}

#ifdef TUNER_FLAG
int cx25821_vidioc_g_frequency(struct file *file, void *priv, struct v4l2_frequency *f)
{
	struct cx25821_fh *fh = priv;
	struct cx25821_dev *dev = fh->dev;

	f->frequency = dev->freq;

	cx25821_call_all(dev, tuner, g_frequency, f);

	return 0;
}

int cx25821_set_freq(struct cx25821_dev *dev, struct v4l2_frequency *f)
{
	mutex_lock(&dev->lock);
	dev->freq = f->frequency;

	cx25821_call_all(dev, tuner, s_frequency, f);

	/* When changing channels it is required to reset TVAUDIO */
	msleep(10);

	mutex_unlock(&dev->lock);

	return 0;
}

int cx25821_vidioc_s_frequency(struct file *file, void *priv, struct v4l2_frequency *f)
{
	struct cx25821_fh *fh = priv;
	struct cx25821_dev *dev;
	int err;

	if (fh) {
	       dev = fh->dev;
	       err = v4l2_prio_check(&dev->channels[fh->channel_id]
					       .prio, fh->prio);
		if (0 != err)
			return err;
       } else {
	       printk(KERN_ERR "Invalid fh pointer!\n");
	       return -EINVAL;
	}

	return cx25821_set_freq(dev, f);
}
#endif

#ifdef CONFIG_VIDEO_ADV_DEBUG
int cx25821_vidioc_g_register(struct file *file, void *fh,
		      struct v4l2_dbg_register *reg)
{
	struct cx25821_dev *dev = ((struct cx25821_fh *)fh)->dev;

	if (!v4l2_chip_match_host(&reg->match))
		return -EINVAL;

	cx25821_call_all(dev, core, g_register, reg);

	return 0;
}

int cx25821_vidioc_s_register(struct file *file, void *fh,
		      struct v4l2_dbg_register *reg)
{
	struct cx25821_dev *dev = ((struct cx25821_fh *)fh)->dev;

	if (!v4l2_chip_match_host(&reg->match))
		return -EINVAL;

	cx25821_call_all(dev, core, s_register, reg);

	return 0;
}

#endif

#ifdef TUNER_FLAG
int cx25821_vidioc_g_tuner(struct file *file, void *priv, struct v4l2_tuner *t)
{
	struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;

	if (unlikely(UNSET == dev->tuner_type))
		return -EINVAL;
	if (0 != t->index)
		return -EINVAL;

	strcpy(t->name, "Television");
	t->type = V4L2_TUNER_ANALOG_TV;
	t->capability = V4L2_TUNER_CAP_NORM;
	t->rangehigh = 0xffffffffUL;

	t->signal = 0xffff;	/* LOCKED */
	return 0;
}

int cx25821_vidioc_s_tuner(struct file *file, void *priv, struct v4l2_tuner *t)
{
	struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
	struct cx25821_fh *fh = priv;
	int err;

	if (fh) {
	       err = v4l2_prio_check(&dev->channels[fh->channel_id]
					       .prio, fh->prio);
		if (0 != err)
			return err;
	}

	dprintk(1, "%s()\n", __func__);
	if (UNSET == dev->tuner_type)
		return -EINVAL;
	if (0 != t->index)
		return -EINVAL;

	return 0;
}

#endif
/*****************************************************************************/
static const struct v4l2_queryctrl no_ctl = {
	.name = "42",
	.flags = V4L2_CTRL_FLAG_DISABLED,
};

static struct v4l2_queryctrl cx25821_ctls[] = {
	/* --- video --- */
	{
	 .id = V4L2_CID_BRIGHTNESS,
	 .name = "Brightness",
	 .minimum = 0,
	 .maximum = 10000,
	 .step = 1,
	 .default_value = 6200,
	 .type = V4L2_CTRL_TYPE_INTEGER,
	 }, {
	     .id = V4L2_CID_CONTRAST,
	     .name = "Contrast",
	     .minimum = 0,
	     .maximum = 10000,
	     .step = 1,
	     .default_value = 5000,
	     .type = V4L2_CTRL_TYPE_INTEGER,
	     }, {
		 .id = V4L2_CID_SATURATION,
		 .name = "Saturation",
		 .minimum = 0,
		 .maximum = 10000,
		 .step = 1,
		 .default_value = 5000,
		 .type = V4L2_CTRL_TYPE_INTEGER,
		 }, {
		     .id = V4L2_CID_HUE,
		     .name = "Hue",
		     .minimum = 0,
		     .maximum = 10000,
		     .step = 1,
		     .default_value = 5000,
		     .type = V4L2_CTRL_TYPE_INTEGER,
		     }
};
static const int CX25821_CTLS = ARRAY_SIZE(cx25821_ctls);

static int cx25821_ctrl_query(struct v4l2_queryctrl *qctrl)
{
	int i;

	if (qctrl->id < V4L2_CID_BASE || qctrl->id >= V4L2_CID_LASTP1)
		return -EINVAL;
	for (i = 0; i < CX25821_CTLS; i++)
		if (cx25821_ctls[i].id == qctrl->id)
			break;
	if (i == CX25821_CTLS) {
		*qctrl = no_ctl;
		return 0;
	}
	*qctrl = cx25821_ctls[i];
	return 0;
}

int cx25821_vidioc_queryctrl(struct file *file, void *priv,
		     struct v4l2_queryctrl *qctrl)
{
	return cx25821_ctrl_query(qctrl);
}

/* ------------------------------------------------------------------ */
/* VIDEO CTRL IOCTLS                                                  */

static const struct v4l2_queryctrl *ctrl_by_id(unsigned int id)
{
	unsigned int i;

	for (i = 0; i < CX25821_CTLS; i++)
		if (cx25821_ctls[i].id == id)
			return cx25821_ctls + i;
	return NULL;
}

int cx25821_vidioc_g_ctrl(struct file *file, void *priv, struct v4l2_control *ctl)
{
	struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
       struct cx25821_fh *fh = priv;

	const struct v4l2_queryctrl *ctrl;

	ctrl = ctrl_by_id(ctl->id);

	if (NULL == ctrl)
		return -EINVAL;
	switch (ctl->id) {
	case V4L2_CID_BRIGHTNESS:
	       ctl->value = dev->channels[fh->channel_id].ctl_bright;
		break;
	case V4L2_CID_HUE:
	       ctl->value = dev->channels[fh->channel_id].ctl_hue;
		break;
	case V4L2_CID_CONTRAST:
	       ctl->value = dev->channels[fh->channel_id].ctl_contrast;
		break;
	case V4L2_CID_SATURATION:
	       ctl->value = dev->channels[fh->channel_id].ctl_saturation;
		break;
	}
	return 0;
}

int cx25821_set_control(struct cx25821_dev *dev,
			struct v4l2_control *ctl, int chan_num)
{
	int err;
	const struct v4l2_queryctrl *ctrl;

	err = -EINVAL;

	ctrl = ctrl_by_id(ctl->id);

	if (NULL == ctrl)
		return err;

	switch (ctrl->type) {
	case V4L2_CTRL_TYPE_BOOLEAN:
	case V4L2_CTRL_TYPE_MENU:
	case V4L2_CTRL_TYPE_INTEGER:
		if (ctl->value < ctrl->minimum)
			ctl->value = ctrl->minimum;
		if (ctl->value > ctrl->maximum)
			ctl->value = ctrl->maximum;
		break;
	default:
		/* nothing */ ;
	};

	switch (ctl->id) {
	case V4L2_CID_BRIGHTNESS:
	       dev->channels[chan_num].ctl_bright = ctl->value;
		medusa_set_brightness(dev, ctl->value, chan_num);
		break;
	case V4L2_CID_HUE:
	       dev->channels[chan_num].ctl_hue = ctl->value;
		medusa_set_hue(dev, ctl->value, chan_num);
		break;
	case V4L2_CID_CONTRAST:
	       dev->channels[chan_num].ctl_contrast = ctl->value;
		medusa_set_contrast(dev, ctl->value, chan_num);
		break;
	case V4L2_CID_SATURATION:
	       dev->channels[chan_num].ctl_saturation = ctl->value;
		medusa_set_saturation(dev, ctl->value, chan_num);
		break;
	}

	err = 0;

	return err;
}

static void cx25821_init_controls(struct cx25821_dev *dev, int chan_num)
{
	struct v4l2_control ctrl;
	int i;
	for (i = 0; i < CX25821_CTLS; i++) {
		ctrl.id = cx25821_ctls[i].id;
		ctrl.value = cx25821_ctls[i].default_value;

		cx25821_set_control(dev, &ctrl, chan_num);
	}
}

int cx25821_vidioc_cropcap(struct file *file, void *priv, struct v4l2_cropcap *cropcap)
{
	struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;

	if (cropcap->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
		return -EINVAL;
	cropcap->bounds.top = cropcap->bounds.left = 0;
	cropcap->bounds.width = 720;
	cropcap->bounds.height = dev->tvnorm == V4L2_STD_PAL_BG ? 576 : 480;
	cropcap->pixelaspect.numerator =
	    dev->tvnorm == V4L2_STD_PAL_BG ? 59 : 10;
	cropcap->pixelaspect.denominator =
	    dev->tvnorm == V4L2_STD_PAL_BG ? 54 : 11;
	cropcap->defrect = cropcap->bounds;
	return 0;
}

int cx25821_vidioc_s_crop(struct file *file, void *priv, struct v4l2_crop *crop)
{
	struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
	struct cx25821_fh *fh = priv;
	int err;

	if (fh) {
	       err = v4l2_prio_check(&dev->channels[fh->channel_id].
					       prio, fh->prio);
		if (0 != err)
			return err;
	}
       /* cx25821_vidioc_s_crop not supported */
	return -EINVAL;
}

int cx25821_vidioc_g_crop(struct file *file, void *priv, struct v4l2_crop *crop)
{
       /* cx25821_vidioc_g_crop not supported */
	return -EINVAL;
}

int cx25821_vidioc_querystd(struct file *file, void *priv, v4l2_std_id * norm)
{
       /* medusa does not support video standard sensing of current input */
	*norm = CX25821_NORMS;

	return 0;
}

int cx25821_is_valid_width(u32 width, v4l2_std_id tvnorm)
{
	if (tvnorm == V4L2_STD_PAL_BG) {
		if (width == 352 || width == 720)
			return 1;
		else
			return 0;
	}

	if (tvnorm == V4L2_STD_NTSC_M) {
		if (width == 320 || width == 352 || width == 720)
			return 1;
		else
			return 0;
	}
	return 0;
}

int cx25821_is_valid_height(u32 height, v4l2_std_id tvnorm)
{
	if (tvnorm == V4L2_STD_PAL_BG) {
		if (height == 576 || height == 288)
			return 1;
		else
			return 0;
	}

	if (tvnorm == V4L2_STD_NTSC_M) {
		if (height == 480 || height == 240)
			return 1;
		else
			return 0;
	}

	return 0;
}

static long video_ioctl_upstream9(struct file *file, unsigned int cmd,
				 unsigned long arg)
{
       struct cx25821_fh *fh = file->private_data;
       struct cx25821_dev *dev = fh->dev;
       int command = 0;
       struct upstream_user_struct *data_from_user;

       data_from_user = (struct upstream_user_struct *)arg;

       if (!data_from_user) {
	       printk
		   ("cx25821 in %s(): Upstream data is INVALID. Returning.\n",
		    __func__);
	       return 0;
       }

       command = data_from_user->command;

       if (command != UPSTREAM_START_VIDEO &&
	       command != UPSTREAM_STOP_VIDEO)
	       return 0;

       dev->input_filename = data_from_user->input_filename;
       dev->input_audiofilename = data_from_user->input_filename;
       dev->vid_stdname = data_from_user->vid_stdname;
       dev->pixel_format = data_from_user->pixel_format;
       dev->channel_select = data_from_user->channel_select;
       dev->command = data_from_user->command;

       switch (command) {
       case UPSTREAM_START_VIDEO:
	       cx25821_start_upstream_video_ch1(dev, data_from_user);
	       break;

       case UPSTREAM_STOP_VIDEO:
	       cx25821_stop_upstream_video_ch1(dev);
	       break;
       }

       return 0;
}

static long video_ioctl_upstream10(struct file *file, unsigned int cmd,
				  unsigned long arg)
{
       struct cx25821_fh *fh = file->private_data;
       struct cx25821_dev *dev = fh->dev;
       int command = 0;
       struct upstream_user_struct *data_from_user;

       data_from_user = (struct upstream_user_struct *)arg;

       if (!data_from_user) {
	       printk
		   ("cx25821 in %s(): Upstream data is INVALID. Returning.\n",
		    __func__);
	       return 0;
       }

       command = data_from_user->command;

       if (command != UPSTREAM_START_VIDEO &&
	       command != UPSTREAM_STOP_VIDEO)
	       return 0;

       dev->input_filename_ch2 = data_from_user->input_filename;
       dev->input_audiofilename = data_from_user->input_filename;
       dev->vid_stdname_ch2 = data_from_user->vid_stdname;
       dev->pixel_format_ch2 = data_from_user->pixel_format;
       dev->channel_select_ch2 = data_from_user->channel_select;
       dev->command_ch2 = data_from_user->command;

       switch (command) {
       case UPSTREAM_START_VIDEO:
	       cx25821_start_upstream_video_ch2(dev, data_from_user);
	       break;

       case UPSTREAM_STOP_VIDEO:
	       cx25821_stop_upstream_video_ch2(dev);
	       break;
       }

       return 0;
}

static long video_ioctl_upstream11(struct file *file, unsigned int cmd,
				  unsigned long arg)
{
       struct cx25821_fh *fh = file->private_data;
       struct cx25821_dev *dev = fh->dev;
       int command = 0;
       struct upstream_user_struct *data_from_user;

       data_from_user = (struct upstream_user_struct *)arg;

       if (!data_from_user) {
	       printk
		   ("cx25821 in %s(): Upstream data is INVALID. Returning.\n",
		    __func__);
	       return 0;
       }

       command = data_from_user->command;

       if (command != UPSTREAM_START_AUDIO &&
	       command != UPSTREAM_STOP_AUDIO)
	       return 0;

       dev->input_filename = data_from_user->input_filename;
       dev->input_audiofilename = data_from_user->input_filename;
       dev->vid_stdname = data_from_user->vid_stdname;
       dev->pixel_format = data_from_user->pixel_format;
       dev->channel_select = data_from_user->channel_select;
       dev->command = data_from_user->command;

       switch (command) {
       case UPSTREAM_START_AUDIO:
	       cx25821_start_upstream_audio(dev, data_from_user);
	       break;

       case UPSTREAM_STOP_AUDIO:
	       cx25821_stop_upstream_audio(dev);
	       break;
       }

       return 0;
}

static long video_ioctl_set(struct file *file, unsigned int cmd,
			   unsigned long arg)
{
       struct cx25821_fh *fh = file->private_data;
       struct cx25821_dev *dev = fh->dev;
       struct downstream_user_struct *data_from_user;
       int command;
       int width = 720;
       int selected_channel = 0, pix_format = 0, i = 0;
       int cif_enable = 0, cif_width = 0;
       u32 value = 0;

       data_from_user = (struct downstream_user_struct *)arg;

       if (!data_from_user) {
	       printk(
	       "cx25821 in %s(): User data is INVALID. Returning.\n",
	       __func__);
	       return 0;
       }

       command = data_from_user->command;

       if (command != SET_VIDEO_STD && command != SET_PIXEL_FORMAT
	   && command != ENABLE_CIF_RESOLUTION && command != REG_READ
	   && command != REG_WRITE && command != MEDUSA_READ
	   && command != MEDUSA_WRITE) {
	       return 0;
       }

       switch (command) {
       case SET_VIDEO_STD:
	       dev->tvnorm =
		   !strcmp(data_from_user->vid_stdname,
			   "PAL") ? V4L2_STD_PAL_BG : V4L2_STD_NTSC_M;
	       medusa_set_videostandard(dev);
	       break;

       case SET_PIXEL_FORMAT:
	       selected_channel = data_from_user->decoder_select;
	       pix_format = data_from_user->pixel_format;

	       if (!(selected_channel <= 7 && selected_channel >= 0)) {
		       selected_channel -= 4;
		       selected_channel = selected_channel % 8;
	       }

	       if (selected_channel >= 0)
		       cx25821_set_pixel_format(dev, selected_channel,
						pix_format);

	       break;

       case ENABLE_CIF_RESOLUTION:
	       selected_channel = data_from_user->decoder_select;
	       cif_enable = data_from_user->cif_resolution_enable;
	       cif_width = data_from_user->cif_width;

	       if (cif_enable) {
		       if (dev->tvnorm & V4L2_STD_PAL_BG
			   || dev->tvnorm & V4L2_STD_PAL_DK)
			       width = 352;
		       else
			       width = (cif_width == 320
					|| cif_width == 352) ? cif_width : 320;
	       }

	       if (!(selected_channel <= 7 && selected_channel >= 0)) {
		       selected_channel -= 4;
		       selected_channel = selected_channel % 8;
	       }

	       if (selected_channel <= 7 && selected_channel >= 0) {
		       dev->channels[selected_channel].
			       use_cif_resolution = cif_enable;
		       dev->channels[selected_channel].cif_width = width;
	       } else {
		       for (i = 0; i < VID_CHANNEL_NUM; i++) {
			       dev->channels[i].use_cif_resolution =
				       cif_enable;
			       dev->channels[i].cif_width = width;
		       }
	       }

	       medusa_set_resolution(dev, width, selected_channel);
	       break;
       case REG_READ:
	       data_from_user->reg_data = cx_read(data_from_user->reg_address);
	       break;
       case REG_WRITE:
	       cx_write(data_from_user->reg_address, data_from_user->reg_data);
	       break;
       case MEDUSA_READ:
	       value =
		   cx25821_i2c_read(&dev->i2c_bus[0],
				    (u16) data_from_user->reg_address,
				    &data_from_user->reg_data);
	       break;
       case MEDUSA_WRITE:
	       cx25821_i2c_write(&dev->i2c_bus[0],
				 (u16) data_from_user->reg_address,
				 data_from_user->reg_data);
	       break;
       }

       return 0;
}

static long cx25821_video_ioctl(struct file *file,
			       unsigned int cmd, unsigned long arg)
{
       int  ret = 0;

       struct cx25821_fh  *fh  = file->private_data;

       /* check to see if it's the video upstream */
       if (fh->channel_id == SRAM_CH09) {
	       ret = video_ioctl_upstream9(file, cmd, arg);
	       return ret;
       } else if (fh->channel_id == SRAM_CH10) {
	       ret = video_ioctl_upstream10(file, cmd, arg);
	       return ret;
       } else if (fh->channel_id == SRAM_CH11) {
	       ret = video_ioctl_upstream11(file, cmd, arg);
	       ret = video_ioctl_set(file, cmd, arg);
	       return ret;
       }

    return video_ioctl2(file, cmd, arg);
}

/* exported stuff */
static const struct v4l2_file_operations video_fops = {
       .owner = THIS_MODULE,
       .open = video_open,
       .release = video_release,
       .read = video_read,
       .poll = video_poll,
       .mmap = cx25821_video_mmap,
       .ioctl = cx25821_video_ioctl,
};

static const struct v4l2_ioctl_ops video_ioctl_ops = {
       .vidioc_querycap = cx25821_vidioc_querycap,
       .vidioc_enum_fmt_vid_cap = cx25821_vidioc_enum_fmt_vid_cap,
       .vidioc_g_fmt_vid_cap = cx25821_vidioc_g_fmt_vid_cap,
       .vidioc_try_fmt_vid_cap = cx25821_vidioc_try_fmt_vid_cap,
       .vidioc_s_fmt_vid_cap = vidioc_s_fmt_vid_cap,
       .vidioc_reqbufs = cx25821_vidioc_reqbufs,
       .vidioc_querybuf = cx25821_vidioc_querybuf,
       .vidioc_qbuf = cx25821_vidioc_qbuf,
       .vidioc_dqbuf = vidioc_dqbuf,
#ifdef TUNER_FLAG
       .vidioc_s_std = cx25821_vidioc_s_std,
       .vidioc_querystd = cx25821_vidioc_querystd,
#endif
       .vidioc_cropcap = cx25821_vidioc_cropcap,
       .vidioc_s_crop = cx25821_vidioc_s_crop,
       .vidioc_g_crop = cx25821_vidioc_g_crop,
       .vidioc_enum_input = cx25821_vidioc_enum_input,
       .vidioc_g_input = cx25821_vidioc_g_input,
       .vidioc_s_input = cx25821_vidioc_s_input,
       .vidioc_g_ctrl = cx25821_vidioc_g_ctrl,
       .vidioc_s_ctrl = vidioc_s_ctrl,
       .vidioc_queryctrl = cx25821_vidioc_queryctrl,
       .vidioc_streamon = vidioc_streamon,
       .vidioc_streamoff = vidioc_streamoff,
       .vidioc_log_status = vidioc_log_status,
       .vidioc_g_priority = cx25821_vidioc_g_priority,
       .vidioc_s_priority = cx25821_vidioc_s_priority,
#ifdef CONFIG_VIDEO_V4L1_COMPAT
       .vidiocgmbuf = cx25821_vidiocgmbuf,
#endif
#ifdef TUNER_FLAG
       .vidioc_g_tuner = cx25821_vidioc_g_tuner,
       .vidioc_s_tuner = cx25821_vidioc_s_tuner,
       .vidioc_g_frequency = cx25821_vidioc_g_frequency,
       .vidioc_s_frequency = cx25821_vidioc_s_frequency,
#endif
#ifdef CONFIG_VIDEO_ADV_DEBUG
       .vidioc_g_register = cx25821_vidioc_g_register,
       .vidioc_s_register = cx25821_vidioc_s_register,
#endif
};

struct video_device cx25821_videoioctl_template = {
	       .name = "cx25821-videoioctl",
	       .fops = &video_fops,
	       .ioctl_ops = &video_ioctl_ops,
	       .tvnorms = CX25821_NORMS,
	       .current_norm = V4L2_STD_NTSC_M,
};
