#define DT3155_DEVICE_ID 0x1223
 
-/*  global initializers (for all boards)  */
-#ifdef CONFIG_DT3155_CCIR
-static const u8 csr2_init = VT_50HZ;
-#define DT3155_CURRENT_NORM V4L2_STD_625_50
-static const unsigned int img_width = 768;
-static const unsigned int img_height = 576;
-static const unsigned int frames_per_sec = 25;
 static const struct v4l2_fmtdesc frame_std[] = {
        {
        .index = 0,
        .type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
        .flags = 0,
-       .description = "CCIR/50Hz 8 bits gray",
+       .description = "8-bit Greyscale",
        .pixelformat = V4L2_PIX_FMT_GREY,
        },
 };
-#else
-static const u8 csr2_init = VT_60HZ;
-#define DT3155_CURRENT_NORM V4L2_STD_525_60
-static const unsigned int img_width = 640;
-static const unsigned int img_height = 480;
-static const unsigned int frames_per_sec = 30;
-static const struct v4l2_fmtdesc frame_std[] = {
-       {
-       .index = 0,
-       .type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
-       .flags = 0,
-       .description = "RS-170/60Hz 8 bits gray",
-       .pixelformat = V4L2_PIX_FMT_GREY,
-       },
-};
-#endif
 
 #define NUM_OF_FORMATS ARRAY_SIZE(frame_std)
 
-static u8 config_init = ACQ_MODE_EVEN;
-
 /**
  * read_i2c_reg - reads an internal i2c register
  *
 
 {
        struct dt3155_priv *pd = vb2_get_drv_priv(vq);
-       unsigned size = img_width * img_height;
+       unsigned size = pd->width * pd->height;
 
        if (vq->num_buffers + *nbuffers < 2)
                *nbuffers = 2 - vq->num_buffers;
 
 static int dt3155_buf_prepare(struct vb2_buffer *vb)
 {
-       vb2_set_plane_payload(vb, 0, img_width * img_height);
+       struct dt3155_priv *pd = vb2_get_drv_priv(vb->vb2_queue);
+
+       vb2_set_plane_payload(vb, 0, pd->width * pd->height);
        return 0;
 }
 
        pd->sequence = 0;
        dma_addr = vb2_dma_contig_plane_dma_addr(vb, 0);
        iowrite32(dma_addr, pd->regs + EVEN_DMA_START);
-       iowrite32(dma_addr + img_width, pd->regs + ODD_DMA_START);
-       iowrite32(img_width, pd->regs + EVEN_DMA_STRIDE);
-       iowrite32(img_width, pd->regs + ODD_DMA_STRIDE);
+       iowrite32(dma_addr + pd->width, pd->regs + ODD_DMA_START);
+       iowrite32(pd->width, pd->regs + EVEN_DMA_STRIDE);
+       iowrite32(pd->width, pd->regs + ODD_DMA_STRIDE);
        /* enable interrupts, clear all irq flags */
        iowrite32(FLD_START_EN | FLD_END_ODD_EN | FLD_START |
                        FLD_END_EVEN | FLD_END_ODD, pd->regs + INT_CSR);
                ipd->curr_buf = ivb;
                dma_addr = vb2_dma_contig_plane_dma_addr(ivb, 0);
                iowrite32(dma_addr, ipd->regs + EVEN_DMA_START);
-               iowrite32(dma_addr + img_width, ipd->regs + ODD_DMA_START);
-               iowrite32(img_width, ipd->regs + EVEN_DMA_STRIDE);
-               iowrite32(img_width, ipd->regs + ODD_DMA_STRIDE);
+               iowrite32(dma_addr + ipd->width, ipd->regs + ODD_DMA_START);
+               iowrite32(ipd->width, ipd->regs + EVEN_DMA_STRIDE);
+               iowrite32(ipd->width, ipd->regs + ODD_DMA_STRIDE);
                mmiowb();
        }
 
 
 static int dt3155_g_fmt_vid_cap(struct file *filp, void *p, struct v4l2_format *f)
 {
+       struct dt3155_priv *pd = video_drvdata(filp);
+
        if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
                return -EINVAL;
-       f->fmt.pix.width = img_width;
-       f->fmt.pix.height = img_height;
+       f->fmt.pix.width = pd->width;
+       f->fmt.pix.height = pd->height;
        f->fmt.pix.pixelformat = V4L2_PIX_FMT_GREY;
        f->fmt.pix.field = V4L2_FIELD_NONE;
        f->fmt.pix.bytesperline = f->fmt.pix.width;
 
 static int dt3155_try_fmt_vid_cap(struct file *filp, void *p, struct v4l2_format *f)
 {
+       struct dt3155_priv *pd = video_drvdata(filp);
+
        if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
                return -EINVAL;
-       if (f->fmt.pix.width == img_width &&
-               f->fmt.pix.height == img_height &&
+       if (f->fmt.pix.width == pd->width &&
+               f->fmt.pix.height == pd->height &&
                f->fmt.pix.pixelformat == V4L2_PIX_FMT_GREY &&
                f->fmt.pix.field == V4L2_FIELD_NONE &&
                f->fmt.pix.bytesperline == f->fmt.pix.width &&
        return dt3155_g_fmt_vid_cap(filp, p, f);
 }
 
-static int dt3155_querystd(struct file *filp, void *p, v4l2_std_id *norm)
-{
-       *norm = DT3155_CURRENT_NORM;
-       return 0;
-}
-
 static int dt3155_g_std(struct file *filp, void *p, v4l2_std_id *norm)
 {
-       *norm = DT3155_CURRENT_NORM;
+       struct dt3155_priv *pd = video_drvdata(filp);
+
+       *norm = pd->std;
        return 0;
 }
 
 static int dt3155_s_std(struct file *filp, void *p, v4l2_std_id norm)
 {
-       if (norm & DT3155_CURRENT_NORM)
+       struct dt3155_priv *pd = video_drvdata(filp);
+
+       if (pd->std == norm)
                return 0;
-       return -EINVAL;
+       if (vb2_is_busy(&pd->vidq))
+               return -EBUSY;
+       pd->std = norm;
+       if (pd->std & V4L2_STD_525_60) {
+               pd->csr2 = VT_60HZ;
+               pd->width = 640;
+               pd->height = 480;
+       } else {
+               pd->csr2 = VT_50HZ;
+               pd->width = 768;
+               pd->height = 576;
+       }
+       return 0;
 }
 
 static int dt3155_enum_input(struct file *filp, void *p, struct v4l2_input *input)
                return -EINVAL;
        strcpy(input->name, "Coax in");
        input->type = V4L2_INPUT_TYPE_CAMERA;
-       /*
-        * FIXME: input->std = 0 according to v4l2 API
-        * VIDIOC_G_STD, VIDIOC_S_STD, VIDIOC_QUERYSTD and VIDIOC_ENUMSTD
-        * should return -EINVAL
-        */
-       input->std = DT3155_CURRENT_NORM;
-       input->status = 0;/* FIXME: add sync detection & V4L2_IN_ST_NO_H_LOCK */
+       input->std = V4L2_STD_ALL;
+       input->status = 0;
        return 0;
 }
 
        return 0;
 }
 
-static int dt3155_g_parm(struct file *filp, void *p, struct v4l2_streamparm *parms)
-{
-       if (parms->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
-               return -EINVAL;
-       parms->parm.capture.capability = V4L2_CAP_TIMEPERFRAME;
-       parms->parm.capture.capturemode = 0;
-       parms->parm.capture.timeperframe.numerator = 1001;
-       parms->parm.capture.timeperframe.denominator = frames_per_sec * 1000;
-       parms->parm.capture.extendedmode = 0;
-       parms->parm.capture.readbuffers = 1; /* FIXME: 2 buffers? */
-       return 0;
-}
-
-static int dt3155_s_parm(struct file *filp, void *p, struct v4l2_streamparm *parms)
-{
-       if (parms->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
-               return -EINVAL;
-       parms->parm.capture.capability = V4L2_CAP_TIMEPERFRAME;
-       parms->parm.capture.capturemode = 0;
-       parms->parm.capture.timeperframe.numerator = 1001;
-       parms->parm.capture.timeperframe.denominator = frames_per_sec * 1000;
-       parms->parm.capture.extendedmode = 0;
-       parms->parm.capture.readbuffers = 1; /* FIXME: 2 buffers? */
-       return 0;
-}
-
 static const struct v4l2_ioctl_ops dt3155_ioctl_ops = {
        .vidioc_querycap = dt3155_querycap,
        .vidioc_enum_fmt_vid_cap = dt3155_enum_fmt_vid_cap,
        .vidioc_dqbuf = vb2_ioctl_dqbuf,
        .vidioc_streamon = vb2_ioctl_streamon,
        .vidioc_streamoff = vb2_ioctl_streamoff,
-       .vidioc_querystd = dt3155_querystd,
        .vidioc_g_std = dt3155_g_std,
        .vidioc_s_std = dt3155_s_std,
        .vidioc_enum_input = dt3155_enum_input,
        .vidioc_g_input = dt3155_g_input,
        .vidioc_s_input = dt3155_s_input,
-       .vidioc_g_parm = dt3155_g_parm,
-       .vidioc_s_parm = dt3155_s_parm,
 };
 
 static int dt3155_init_board(struct dt3155_priv *pd)
        .ioctl_ops = &dt3155_ioctl_ops,
        .minor = -1,
        .release = video_device_release_empty,
-       .tvnorms = DT3155_CURRENT_NORM,
+       .tvnorms = V4L2_STD_ALL,
 };
 
 static int dt3155_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        pd->vdev.v4l2_dev = &pd->v4l2_dev;
        video_set_drvdata(&pd->vdev, pd);  /* for use in video_fops */
        pd->pdev = pdev;
+       pd->std = V4L2_STD_625_50;
+       pd->csr2 = VT_50HZ;
+       pd->width = 768;
+       pd->height = 576;
        INIT_LIST_HEAD(&pd->dmaq);
        mutex_init(&pd->mux);
        pd->vdev.lock = &pd->mux; /* for locking v4l2_file_operations */
                goto err_v4l2_dev_unreg;
        }
        spin_lock_init(&pd->lock);
-       pd->csr2 = csr2_init;
-       pd->config = config_init;
+       pd->config = ACQ_MODE_EVEN;
        err = pci_enable_device(pdev);
        if (err)
                goto err_free_ctx;