/*
 *  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 *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 = 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 = 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 = 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,
};
