Lines Matching +full:mpc5121 +full:- +full:i2c

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright 2008-2010 Freescale Semiconductor, Inc. All Rights Reserved.
7 * Authors: Hongjun Chen <hong-jun.chen@freescale.com>
15 #include <linux/i2c.h>
23 #include <media/v4l2-common.h>
24 #include <media/v4l2-device.h>
25 #include <media/v4l2-ioctl.h>
26 #include <media/v4l2-ctrls.h>
27 #include <media/v4l2-fh.h>
28 #include <media/v4l2-event.h>
29 #include <media/videobuf-dma-contig.h>
38 /* I2C address of video decoder chip is 0x4A */
75 /* common v4l buffer stuff -- must be first */
242 struct viu_reg __iomem *vr = dev->vr; in viu_start_dma()
244 dev->field = 0; in viu_start_dma()
247 iowrite32be(SOFT_RST, &vr->status_cfg); in viu_start_dma()
248 iowrite32be(INT_FIELD_EN, &vr->status_cfg); in viu_start_dma()
253 struct viu_reg __iomem *vr = dev->vr; in viu_stop_dma()
257 iowrite32be(0, &vr->status_cfg); in viu_stop_dma()
260 status_cfg = ioread32be(&vr->status_cfg); in viu_stop_dma()
262 iowrite32be(status_cfg & 0x3f0000, &vr->status_cfg); in viu_stop_dma()
266 status_cfg = ioread32be(&vr->status_cfg); in viu_stop_dma()
269 } while (cnt--); in viu_stop_dma()
273 iowrite32be(SOFT_RST, &vr->status_cfg); in viu_stop_dma()
274 iowrite32be(0, &vr->status_cfg); in viu_stop_dma()
277 iowrite32be(status_cfg & 0x3f0000, &vr->status_cfg); in viu_stop_dma()
281 dev->field = 0; in viu_stop_dma()
289 if (!list_empty(&vidq->active)) { in restart_video_queue()
290 buf = list_entry(vidq->active.next, struct viu_buf, vb.queue); in restart_video_queue()
292 buf, buf->vb.i); in restart_video_queue()
294 viu_stop_dma(vidq->dev); in restart_video_queue()
297 list_for_each_entry_safe(buf, prev, &vidq->active, vb.queue) { in restart_video_queue()
298 list_del(&buf->vb.queue); in restart_video_queue()
299 buf->vb.state = VIDEOBUF_ERROR; in restart_video_queue()
300 wake_up(&buf->vb.done); in restart_video_queue()
302 mod_timer(&vidq->timeout, jiffies+BUFFER_TIMEOUT); in restart_video_queue()
308 if (list_empty(&vidq->queued)) in restart_video_queue()
310 buf = list_entry(vidq->queued.next, struct viu_buf, vb.queue); in restart_video_queue()
312 list_move_tail(&buf->vb.queue, &vidq->active); in restart_video_queue()
315 viu_stop_dma(vidq->dev); in restart_video_queue()
316 viu_start_dma(vidq->dev); in restart_video_queue()
318 buf->vb.state = VIDEOBUF_ACTIVE; in restart_video_queue()
319 mod_timer(&vidq->timeout, jiffies+BUFFER_TIMEOUT); in restart_video_queue()
320 dprintk(2, "[%p/%d] restart_queue - first active\n", in restart_video_queue()
321 buf, buf->vb.i); in restart_video_queue()
323 } else if (prev->vb.width == buf->vb.width && in restart_video_queue()
324 prev->vb.height == buf->vb.height && in restart_video_queue()
325 prev->fmt == buf->fmt) { in restart_video_queue()
326 list_move_tail(&buf->vb.queue, &vidq->active); in restart_video_queue()
327 buf->vb.state = VIDEOBUF_ACTIVE; in restart_video_queue()
328 dprintk(2, "[%p/%d] restart_queue - move to active\n", in restart_video_queue()
329 buf, buf->vb.i); in restart_video_queue()
341 struct viu_dmaqueue *vidq = &dev->vidq; in viu_vid_timeout()
343 while (!list_empty(&vidq->active)) { in viu_vid_timeout()
344 buf = list_entry(vidq->active.next, struct viu_buf, vb.queue); in viu_vid_timeout()
345 list_del(&buf->vb.queue); in viu_vid_timeout()
346 buf->vb.state = VIDEOBUF_ERROR; in viu_vid_timeout()
347 wake_up(&buf->vb.done); in viu_vid_timeout()
348 dprintk(1, "viu/0: [%p/%d] timeout\n", buf, buf->vb.i); in viu_vid_timeout()
360 struct viu_fh *fh = vq->priv_data; in buffer_setup()
362 *size = fh->width * fh->height * fh->fmt->depth >> 3; in buffer_setup()
367 (*count)--; in buffer_setup()
375 struct videobuf_buffer *vb = &buf->vb; in free_buffer()
378 videobuf_waiton(vq, &buf->vb, 0, 0); in free_buffer()
380 if (vq->int_ops && vq->int_ops->vaddr) in free_buffer()
381 vaddr = vq->int_ops->vaddr(vb); in free_buffer()
384 videobuf_dma_contig_free(vq, &buf->vb); in free_buffer()
386 buf->vb.state = VIDEOBUF_NEEDS_INIT; in free_buffer()
391 struct viu_reg __iomem *vr = dev->vr; in buffer_activate()
395 reg_val.field_base_addr = videobuf_to_dma_contig(&buf->vb); in buffer_activate()
398 buf, buf->vb.i, (unsigned long)reg_val.field_base_addr); in buffer_activate()
402 bpp = buf->fmt->depth >> 3; in buffer_activate()
406 reg_val.dma_inc = buf->vb.width * 2; in buffer_activate()
410 reg_val.dma_inc = buf->vb.width * 4; in buffer_activate()
415 return -EINVAL; in buffer_activate()
419 reg_val.picture_count = (buf->vb.height / 2) << 16 | in buffer_activate()
420 buf->vb.width; in buffer_activate()
424 buf->vb.state = VIDEOBUF_ACTIVE; in buffer_activate()
425 dev->capfield = buf->vb.field; in buffer_activate()
428 if (!V4L2_FIELD_HAS_BOTH(buf->vb.field)) in buffer_activate()
431 iowrite32be(reg_val.dma_inc, &vr->dma_inc); in buffer_activate()
432 iowrite32be(reg_val.picture_count, &vr->picture_count); in buffer_activate()
433 iowrite32be(reg_val.field_base_addr, &vr->field_base_addr); in buffer_activate()
434 mod_timer(&dev->vidq.timeout, jiffies + BUFFER_TIMEOUT); in buffer_activate()
442 struct viu_fh *fh = vq->priv_data; in buffer_prepare()
446 BUG_ON(fh->fmt == NULL); in buffer_prepare()
448 if (fh->width < 48 || fh->width > norm_maxw() || in buffer_prepare()
449 fh->height < 32 || fh->height > norm_maxh()) in buffer_prepare()
450 return -EINVAL; in buffer_prepare()
451 buf->vb.size = (fh->width * fh->height * fh->fmt->depth) >> 3; in buffer_prepare()
452 if (buf->vb.baddr != 0 && buf->vb.bsize < buf->vb.size) in buffer_prepare()
453 return -EINVAL; in buffer_prepare()
455 if (buf->fmt != fh->fmt || in buffer_prepare()
456 buf->vb.width != fh->width || in buffer_prepare()
457 buf->vb.height != fh->height || in buffer_prepare()
458 buf->vb.field != field) { in buffer_prepare()
459 buf->fmt = fh->fmt; in buffer_prepare()
460 buf->vb.width = fh->width; in buffer_prepare()
461 buf->vb.height = fh->height; in buffer_prepare()
462 buf->vb.field = field; in buffer_prepare()
465 if (buf->vb.state == VIDEOBUF_NEEDS_INIT) { in buffer_prepare()
466 rc = videobuf_iolock(vq, &buf->vb, NULL); in buffer_prepare()
470 buf->vb.width = fh->width; in buffer_prepare()
471 buf->vb.height = fh->height; in buffer_prepare()
472 buf->vb.field = field; in buffer_prepare()
473 buf->fmt = fh->fmt; in buffer_prepare()
476 buf->vb.state = VIDEOBUF_PREPARED; in buffer_prepare()
487 struct viu_fh *fh = vq->priv_data; in buffer_queue()
488 struct viu_dev *dev = fh->dev; in buffer_queue()
489 struct viu_dmaqueue *vidq = &dev->vidq; in buffer_queue()
492 if (!list_empty(&vidq->queued)) { in buffer_queue()
493 dprintk(1, "adding vb queue=%p\n", &buf->vb.queue); in buffer_queue()
495 vidq, &vidq->queued); in buffer_queue()
497 dev, &vidq->queued, vidq->queued.next, in buffer_queue()
498 vidq->queued.prev); in buffer_queue()
499 list_add_tail(&buf->vb.queue, &vidq->queued); in buffer_queue()
500 buf->vb.state = VIDEOBUF_QUEUED; in buffer_queue()
501 dprintk(2, "[%p/%d] buffer_queue - append to queued\n", in buffer_queue()
502 buf, buf->vb.i); in buffer_queue()
503 } else if (list_empty(&vidq->active)) { in buffer_queue()
504 dprintk(1, "adding vb active=%p\n", &buf->vb.queue); in buffer_queue()
505 list_add_tail(&buf->vb.queue, &vidq->active); in buffer_queue()
506 buf->vb.state = VIDEOBUF_ACTIVE; in buffer_queue()
507 mod_timer(&vidq->timeout, jiffies+BUFFER_TIMEOUT); in buffer_queue()
508 dprintk(2, "[%p/%d] buffer_queue - first active\n", in buffer_queue()
509 buf, buf->vb.i); in buffer_queue()
513 dprintk(1, "adding vb queue2=%p\n", &buf->vb.queue); in buffer_queue()
514 prev = list_entry(vidq->active.prev, struct viu_buf, vb.queue); in buffer_queue()
515 if (prev->vb.width == buf->vb.width && in buffer_queue()
516 prev->vb.height == buf->vb.height && in buffer_queue()
517 prev->fmt == buf->fmt) { in buffer_queue()
518 list_add_tail(&buf->vb.queue, &vidq->active); in buffer_queue()
519 buf->vb.state = VIDEOBUF_ACTIVE; in buffer_queue()
520 dprintk(2, "[%p/%d] buffer_queue - append to active\n", in buffer_queue()
521 buf, buf->vb.i); in buffer_queue()
523 list_add_tail(&buf->vb.queue, &vidq->queued); in buffer_queue()
524 buf->vb.state = VIDEOBUF_QUEUED; in buffer_queue()
525 dprintk(2, "[%p/%d] buffer_queue - first queued\n", in buffer_queue()
526 buf, buf->vb.i); in buffer_queue()
535 struct viu_fh *fh = vq->priv_data; in buffer_release()
536 struct viu_dev *dev = (struct viu_dev *)fh->dev; in buffer_release()
555 strscpy(cap->driver, "viu", sizeof(cap->driver)); in vidioc_querycap()
556 strscpy(cap->card, "viu", sizeof(cap->card)); in vidioc_querycap()
557 strscpy(cap->bus_info, "platform:viu", sizeof(cap->bus_info)); in vidioc_querycap()
564 int index = f->index; in vidioc_enum_fmt()
566 if (f->index >= NUM_FORMATS) in vidioc_enum_fmt()
567 return -EINVAL; in vidioc_enum_fmt()
569 f->pixelformat = formats[index].fourcc; in vidioc_enum_fmt()
578 f->fmt.pix.width = fh->width; in vidioc_g_fmt_cap()
579 f->fmt.pix.height = fh->height; in vidioc_g_fmt_cap()
580 f->fmt.pix.field = fh->vb_vidq.field; in vidioc_g_fmt_cap()
581 f->fmt.pix.pixelformat = fh->fmt->pixelformat; in vidioc_g_fmt_cap()
582 f->fmt.pix.bytesperline = in vidioc_g_fmt_cap()
583 (f->fmt.pix.width * fh->fmt->depth) >> 3; in vidioc_g_fmt_cap()
584 f->fmt.pix.sizeimage = fh->sizeimage; in vidioc_g_fmt_cap()
585 f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; in vidioc_g_fmt_cap()
595 fmt = format_by_fourcc(f->fmt.pix.pixelformat); in vidioc_try_fmt_cap()
598 f->fmt.pix.pixelformat); in vidioc_try_fmt_cap()
599 return -EINVAL; in vidioc_try_fmt_cap()
605 f->fmt.pix.field = V4L2_FIELD_INTERLACED; in vidioc_try_fmt_cap()
606 if (f->fmt.pix.height < 32) in vidioc_try_fmt_cap()
607 f->fmt.pix.height = 32; in vidioc_try_fmt_cap()
608 if (f->fmt.pix.height > maxh) in vidioc_try_fmt_cap()
609 f->fmt.pix.height = maxh; in vidioc_try_fmt_cap()
610 if (f->fmt.pix.width < 48) in vidioc_try_fmt_cap()
611 f->fmt.pix.width = 48; in vidioc_try_fmt_cap()
612 if (f->fmt.pix.width > maxw) in vidioc_try_fmt_cap()
613 f->fmt.pix.width = maxw; in vidioc_try_fmt_cap()
614 f->fmt.pix.width &= ~0x03; in vidioc_try_fmt_cap()
615 f->fmt.pix.bytesperline = in vidioc_try_fmt_cap()
616 (f->fmt.pix.width * fmt->depth) >> 3; in vidioc_try_fmt_cap()
617 f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline; in vidioc_try_fmt_cap()
618 f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; in vidioc_try_fmt_cap()
633 fh->fmt = format_by_fourcc(f->fmt.pix.pixelformat); in vidioc_s_fmt_cap()
634 fh->width = f->fmt.pix.width; in vidioc_s_fmt_cap()
635 fh->height = f->fmt.pix.height; in vidioc_s_fmt_cap()
636 fh->sizeimage = f->fmt.pix.sizeimage; in vidioc_s_fmt_cap()
637 fh->vb_vidq.field = f->fmt.pix.field; in vidioc_s_fmt_cap()
638 fh->type = f->type; in vidioc_s_fmt_cap()
647 f->fmt.win = fh->win; in vidioc_g_fmt_overlay()
656 if (dev->ovbuf.base == NULL) in verify_preview()
657 return -EINVAL; in verify_preview()
658 if (dev->ovfmt == NULL) in verify_preview()
659 return -EINVAL; in verify_preview()
660 if (win->w.width < 48 || win->w.height < 32) in verify_preview()
661 return -EINVAL; in verify_preview()
663 field = win->field; in verify_preview()
664 maxw = dev->crop_current.width; in verify_preview()
665 maxh = dev->crop_current.height; in verify_preview()
668 field = (win->w.height > maxh/2) in verify_preview()
680 return -EINVAL; in verify_preview()
683 win->field = field; in verify_preview()
684 if (win->w.width > maxw) in verify_preview()
685 win->w.width = maxw; in verify_preview()
686 if (win->w.height > maxh) in verify_preview()
687 win->w.height = maxh; in verify_preview()
693 iowrite32be(reg_val.field_base_addr, &vr->field_base_addr); in viu_activate_overlay()
694 iowrite32be(reg_val.dma_inc, &vr->dma_inc); in viu_activate_overlay()
695 iowrite32be(reg_val.picture_count, &vr->picture_count); in viu_activate_overlay()
703 fh->win.w.width, fh->win.w.height); in viu_setup_preview()
708 reg_val.picture_count = (fh->win.w.height / 2) << 16 | in viu_setup_preview()
709 fh->win.w.width; in viu_setup_preview()
712 bpp = dev->ovfmt->depth / 8; in viu_setup_preview()
716 reg_val.dma_inc = fh->win.w.width * 2; in viu_setup_preview()
720 reg_val.dma_inc = fh->win.w.width * 4; in viu_setup_preview()
725 return -EINVAL; in viu_setup_preview()
728 dev->ovfield = fh->win.field; in viu_setup_preview()
729 if (!V4L2_FIELD_HAS_BOTH(dev->ovfield)) in viu_setup_preview()
735 reg_val.field_base_addr = (u32)(long)dev->ovbuf.base; in viu_setup_preview()
744 struct viu_dev *dev = (struct viu_dev *)fh->dev; in vidioc_s_fmt_overlay()
748 err = verify_preview(dev, &f->fmt.win); in vidioc_s_fmt_overlay()
752 fh->win = f->fmt.win; in vidioc_s_fmt_overlay()
754 spin_lock_irqsave(&dev->slock, flags); in vidioc_s_fmt_overlay()
756 spin_unlock_irqrestore(&dev->slock, flags); in vidioc_s_fmt_overlay()
769 struct viu_dev *dev = (struct viu_dev *)fh->dev; in vidioc_overlay()
773 spin_lock_irqsave(&dev->slock, flags); in vidioc_overlay()
774 viu_activate_overlay(dev->vr); in vidioc_overlay()
775 dev->ovenable = 1; in vidioc_overlay()
779 spin_unlock_irqrestore(&dev->slock, flags); in vidioc_overlay()
782 dev->ovenable = 0; in vidioc_overlay()
791 struct viu_dev *dev = fh->dev; in vidioc_g_fbuf()
794 *fb = dev->ovbuf; in vidioc_g_fbuf()
795 fb->capability = V4L2_FBUF_CAP_LIST_CLIPPING; in vidioc_g_fbuf()
802 struct viu_dev *dev = fh->dev; in vidioc_s_fbuf()
807 return -EPERM; in vidioc_s_fbuf()
810 fmt = format_by_fourcc(fb->fmt.pixelformat); in vidioc_s_fbuf()
812 return -EINVAL; in vidioc_s_fbuf()
815 dev->ovbuf = *fb; in vidioc_s_fbuf()
816 dev->ovfmt = fmt; in vidioc_s_fbuf()
817 if (dev->ovbuf.fmt.bytesperline == 0) { in vidioc_s_fbuf()
818 dev->ovbuf.fmt.bytesperline = in vidioc_s_fbuf()
819 dev->ovbuf.fmt.width * fmt->depth / 8; in vidioc_s_fbuf()
829 return videobuf_reqbufs(&fh->vb_vidq, p); in vidioc_reqbufs()
837 return videobuf_querybuf(&fh->vb_vidq, p); in vidioc_querybuf()
844 return videobuf_qbuf(&fh->vb_vidq, p); in vidioc_qbuf()
851 return videobuf_dqbuf(&fh->vb_vidq, p, in vidioc_dqbuf()
852 file->f_flags & O_NONBLOCK); in vidioc_dqbuf()
858 struct viu_dev *dev = fh->dev; in vidioc_streamon()
860 if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) in vidioc_streamon()
861 return -EINVAL; in vidioc_streamon()
862 if (fh->type != i) in vidioc_streamon()
863 return -EINVAL; in vidioc_streamon()
865 if (dev->ovenable) in vidioc_streamon()
866 dev->ovenable = 0; in vidioc_streamon()
868 viu_start_dma(fh->dev); in vidioc_streamon()
870 return videobuf_streamon(&fh->vb_vidq); in vidioc_streamon()
877 if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) in vidioc_streamoff()
878 return -EINVAL; in vidioc_streamoff()
879 if (fh->type != i) in vidioc_streamoff()
880 return -EINVAL; in vidioc_streamoff()
882 viu_stop_dma(fh->dev); in vidioc_streamoff()
884 return videobuf_streamoff(&fh->vb_vidq); in vidioc_streamoff()
888 v4l2_subdev_call(viu->decoder, o, f, ##args)
894 decoder_call(fh->dev, video, querystd, std_id); in vidioc_querystd()
902 fh->dev->std = id; in vidioc_s_std()
903 decoder_call(fh->dev, video, s_std, id); in vidioc_s_std()
911 *std_id = fh->dev->std; in vidioc_g_std()
921 if (inp->index != 0) in vidioc_enum_input()
922 return -EINVAL; in vidioc_enum_input()
924 inp->type = V4L2_INPUT_TYPE_CAMERA; in vidioc_enum_input()
925 inp->std = fh->dev->vdev->tvnorms; in vidioc_enum_input()
926 strscpy(inp->name, "Camera", sizeof(inp->name)); in vidioc_enum_input()
941 return -EINVAL; in vidioc_s_input()
943 decoder_call(fh->dev, video, s_routing, i, 0, 0); in vidioc_s_input()
954 if (!list_empty(&vidq->active)) { in viu_activate_next_buf()
955 buf = list_entry(vidq->active.next, struct viu_buf, in viu_activate_next_buf()
959 } else if (!list_empty(&vidq->queued)) { in viu_activate_next_buf()
960 buf = list_entry(vidq->queued.next, struct viu_buf, in viu_activate_next_buf()
962 list_del(&buf->vb.queue); in viu_activate_next_buf()
965 list_add_tail(&buf->vb.queue, &vidq->active); in viu_activate_next_buf()
966 buf->vb.state = VIDEOBUF_ACTIVE; in viu_activate_next_buf()
973 iowrite32be(0x9512A254, &vr->luminance); in viu_default_settings()
974 iowrite32be(0x03310000, &vr->chroma_r); in viu_default_settings()
975 iowrite32be(0x06600F38, &vr->chroma_g); in viu_default_settings()
976 iowrite32be(0x00000409, &vr->chroma_b); in viu_default_settings()
977 iowrite32be(0x000000ff, &vr->alpha); in viu_default_settings()
978 iowrite32be(0x00000090, &vr->req_alarm); in viu_default_settings()
980 ioread32be(&vr->status_cfg), ioread32be(&vr->field_base_addr)); in viu_default_settings()
985 struct viu_reg __iomem *vr = dev->vr; in viu_overlay_intr()
988 dev->dma_done = 1; in viu_overlay_intr()
991 if (dev->dma_done) { in viu_overlay_intr()
994 dev->dma_done = 0; in viu_overlay_intr()
998 iowrite32be(addr, &vr->field_base_addr); in viu_overlay_intr()
999 iowrite32be(reg_val.dma_inc, &vr->dma_inc); in viu_overlay_intr()
1002 reg_val.status_cfg, &vr->status_cfg); in viu_overlay_intr()
1006 reg_val.status_cfg, &vr->status_cfg); in viu_overlay_intr()
1013 struct viu_dmaqueue *vidq = &dev->vidq; in viu_capture_intr()
1014 struct viu_reg __iomem *vr = dev->vr; in viu_capture_intr()
1021 need_two = V4L2_FIELD_HAS_BOTH(dev->capfield); in viu_capture_intr()
1025 if (((field_num == 0) && (dev->field == 0)) || in viu_capture_intr()
1026 (field_num && (dev->field == 1))) in viu_capture_intr()
1027 dev->field++; in viu_capture_intr()
1033 if (unlikely(dev->first)) { in viu_capture_intr()
1035 dev->first = 0; in viu_capture_intr()
1044 if (!list_empty(&vidq->active)) { in viu_capture_intr()
1050 (unsigned long)addr, dev->field); in viu_capture_intr()
1052 iowrite32be(addr, &vr->field_base_addr); in viu_capture_intr()
1053 iowrite32be(reg_val.dma_inc, &vr->dma_inc); in viu_capture_intr()
1056 reg_val.status_cfg, &vr->status_cfg); in viu_capture_intr()
1061 if (dma_done && field_num && (dev->field == 2)) { in viu_capture_intr()
1062 dev->field = 0; in viu_capture_intr()
1063 buf = list_entry(vidq->active.next, in viu_capture_intr()
1066 buf, buf->vb.i, in viu_capture_intr()
1067 (unsigned long)videobuf_to_dma_contig(&buf->vb), in viu_capture_intr()
1068 (unsigned long)ioread32be(&vr->field_base_addr)); in viu_capture_intr()
1070 if (waitqueue_active(&buf->vb.done)) { in viu_capture_intr()
1071 list_del(&buf->vb.queue); in viu_capture_intr()
1072 buf->vb.ts = ktime_get_ns(); in viu_capture_intr()
1073 buf->vb.state = VIDEOBUF_DONE; in viu_capture_intr()
1074 buf->vb.field_count++; in viu_capture_intr()
1075 wake_up(&buf->vb.done); in viu_capture_intr()
1085 struct viu_reg __iomem *vr = dev->vr; in viu_intr()
1089 status = ioread32be(&vr->status_cfg); in viu_intr()
1092 dev->irqs.error_irq++; in viu_intr()
1096 error >> 4, dev->irqs.error_irq); in viu_intr()
1099 &vr->status_cfg); in viu_intr()
1103 dev->irqs.dma_end_irq++; in viu_intr()
1104 dev->dma_done = 1; in viu_intr()
1106 dev->irqs.dma_end_irq); in viu_intr()
1110 dev->irqs.hsync_irq++; in viu_intr()
1113 dev->irqs.field_irq++; in viu_intr()
1115 dev->irqs.field_irq); in viu_intr()
1119 dev->irqs.vstart_irq++; in viu_intr()
1122 dev->irqs.vsync_irq++; in viu_intr()
1124 dev->irqs.vsync_irq); in viu_intr()
1128 status = ioread32be(&vr->status_cfg); in viu_intr()
1130 &vr->status_cfg); in viu_intr()
1132 if (dev->ovenable) { in viu_intr()
1151 int minor = vdev->minor; in viu_open()
1156 dev->users++; in viu_open()
1157 if (dev->users > 1) { in viu_open()
1158 dev->users--; in viu_open()
1159 return -EBUSY; in viu_open()
1162 vr = dev->vr; in viu_open()
1165 v4l2_type_names[V4L2_BUF_TYPE_VIDEO_CAPTURE], dev->users); in viu_open()
1167 if (mutex_lock_interruptible(&dev->lock)) { in viu_open()
1168 dev->users--; in viu_open()
1169 return -ERESTARTSYS; in viu_open()
1175 dev->users--; in viu_open()
1176 mutex_unlock(&dev->lock); in viu_open()
1177 return -ENOMEM; in viu_open()
1180 v4l2_fh_init(&fh->fh, vdev); in viu_open()
1181 file->private_data = fh; in viu_open()
1182 fh->dev = dev; in viu_open()
1184 fh->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; in viu_open()
1185 fh->fmt = format_by_fourcc(V4L2_PIX_FMT_RGB32); in viu_open()
1186 fh->width = norm_maxw(); in viu_open()
1187 fh->height = norm_maxh(); in viu_open()
1188 dev->crop_current.width = fh->width; in viu_open()
1189 dev->crop_current.height = fh->height; in viu_open()
1191 dprintk(1, "Open: fh=%p, dev=%p, dev->vidq=%p\n", fh, dev, &dev->vidq); in viu_open()
1193 list_empty(&dev->vidq.queued)); in viu_open()
1195 list_empty(&dev->vidq.active)); in viu_open()
1199 status_cfg = ioread32be(&vr->status_cfg); in viu_open()
1203 &vr->status_cfg); in viu_open()
1205 status_cfg = ioread32be(&vr->status_cfg); in viu_open()
1206 iowrite32be(status_cfg | INT_ALL_STATUS, &vr->status_cfg); in viu_open()
1208 spin_lock_init(&fh->vbq_lock); in viu_open()
1209 videobuf_queue_dma_contig_init(&fh->vb_vidq, &viu_video_qops, in viu_open()
1210 dev->dev, &fh->vbq_lock, in viu_open()
1211 fh->type, V4L2_FIELD_INTERLACED, in viu_open()
1213 &fh->dev->lock); in viu_open()
1214 v4l2_fh_add(&fh->fh); in viu_open()
1215 mutex_unlock(&dev->lock); in viu_open()
1222 struct viu_fh *fh = file->private_data; in viu_read()
1223 struct viu_dev *dev = fh->dev; in viu_read()
1227 if (dev->ovenable) in viu_read()
1228 dev->ovenable = 0; in viu_read()
1230 if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) { in viu_read()
1231 if (mutex_lock_interruptible(&dev->lock)) in viu_read()
1232 return -ERESTARTSYS; in viu_read()
1234 ret = videobuf_read_stream(&fh->vb_vidq, data, count, in viu_read()
1235 ppos, 0, file->f_flags & O_NONBLOCK); in viu_read()
1236 mutex_unlock(&dev->lock); in viu_read()
1244 struct viu_fh *fh = file->private_data; in viu_poll()
1245 struct videobuf_queue *q = &fh->vb_vidq; in viu_poll()
1246 struct viu_dev *dev = fh->dev; in viu_poll()
1250 if (V4L2_BUF_TYPE_VIDEO_CAPTURE != fh->type) in viu_poll()
1256 mutex_lock(&dev->lock); in viu_poll()
1258 mutex_unlock(&dev->lock); in viu_poll()
1264 struct viu_fh *fh = file->private_data; in viu_release()
1265 struct viu_dev *dev = fh->dev; in viu_release()
1266 int minor = video_devdata(file)->minor; in viu_release()
1268 mutex_lock(&dev->lock); in viu_release()
1270 videobuf_stop(&fh->vb_vidq); in viu_release()
1271 videobuf_mmap_free(&fh->vb_vidq); in viu_release()
1272 v4l2_fh_del(&fh->fh); in viu_release()
1273 v4l2_fh_exit(&fh->fh); in viu_release()
1274 mutex_unlock(&dev->lock); in viu_release()
1278 dev->users--; in viu_release()
1280 minor, dev->users); in viu_release()
1286 iowrite32be(0, &reg->status_cfg); in viu_reset()
1287 iowrite32be(0x9512a254, &reg->luminance); in viu_reset()
1288 iowrite32be(0x03310000, &reg->chroma_r); in viu_reset()
1289 iowrite32be(0x06600f38, &reg->chroma_g); in viu_reset()
1290 iowrite32be(0x00000409, &reg->chroma_b); in viu_reset()
1291 iowrite32be(0, &reg->field_base_addr); in viu_reset()
1292 iowrite32be(0, &reg->dma_inc); in viu_reset()
1293 iowrite32be(0x01e002d0, &reg->picture_count); in viu_reset()
1294 iowrite32be(0x00000090, &reg->req_alarm); in viu_reset()
1295 iowrite32be(0x000000ff, &reg->alpha); in viu_reset()
1300 struct viu_fh *fh = file->private_data; in viu_mmap()
1301 struct viu_dev *dev = fh->dev; in viu_mmap()
1306 if (mutex_lock_interruptible(&dev->lock)) in viu_mmap()
1307 return -ERESTARTSYS; in viu_mmap()
1308 ret = videobuf_mmap_mapper(&fh->vb_vidq, vma); in viu_mmap()
1309 mutex_unlock(&dev->lock); in viu_mmap()
1312 (unsigned long)vma->vm_start, in viu_mmap()
1313 (unsigned long)vma->vm_end-(unsigned long)vma->vm_start, in viu_mmap()
1362 .minor = -1,
1381 ret = of_address_to_resource(op->dev.of_node, 0, &r); in viu_of_probe()
1383 dev_err(&op->dev, "Can't parse device node resource\n"); in viu_of_probe()
1384 return -ENODEV; in viu_of_probe()
1387 viu_irq = irq_of_parse_and_map(op->dev.of_node, 0); in viu_of_probe()
1389 dev_err(&op->dev, "Error while mapping the irq\n"); in viu_of_probe()
1390 return -EINVAL; in viu_of_probe()
1394 if (!devm_request_mem_region(&op->dev, r.start, in viu_of_probe()
1396 dev_err(&op->dev, "Error while requesting mem region\n"); in viu_of_probe()
1397 ret = -EBUSY; in viu_of_probe()
1402 viu_regs = devm_ioremap(&op->dev, r.start, sizeof(struct viu_reg)); in viu_of_probe()
1404 dev_err(&op->dev, "Can't map register set\n"); in viu_of_probe()
1405 ret = -ENOMEM; in viu_of_probe()
1410 viu_dev = devm_kzalloc(&op->dev, sizeof(struct viu_dev), GFP_ATOMIC); in viu_of_probe()
1412 dev_err(&op->dev, "Can't allocate private structure\n"); in viu_of_probe()
1413 ret = -ENOMEM; in viu_of_probe()
1417 viu_dev->vr = viu_regs; in viu_of_probe()
1418 viu_dev->irq = viu_irq; in viu_of_probe()
1419 viu_dev->dev = &op->dev; in viu_of_probe()
1422 INIT_LIST_HEAD(&viu_dev->vidq.active); in viu_of_probe()
1423 INIT_LIST_HEAD(&viu_dev->vidq.queued); in viu_of_probe()
1425 snprintf(viu_dev->v4l2_dev.name, in viu_of_probe()
1426 sizeof(viu_dev->v4l2_dev.name), "%s", "VIU"); in viu_of_probe()
1427 ret = v4l2_device_register(viu_dev->dev, &viu_dev->v4l2_dev); in viu_of_probe()
1429 dev_err(&op->dev, "v4l2_device_register() failed: %d\n", ret); in viu_of_probe()
1435 ret = -EFAULT; in viu_of_probe()
1436 dev_err(&op->dev, "couldn't get i2c adapter\n"); in viu_of_probe()
1440 v4l2_ctrl_handler_init(&viu_dev->hdl, 5); in viu_of_probe()
1441 if (viu_dev->hdl.error) { in viu_of_probe()
1442 ret = viu_dev->hdl.error; in viu_of_probe()
1443 dev_err(&op->dev, "couldn't register control\n"); in viu_of_probe()
1447 sub-device(s). */ in viu_of_probe()
1448 viu_dev->v4l2_dev.ctrl_handler = &viu_dev->hdl; in viu_of_probe()
1449 viu_dev->decoder = v4l2_i2c_new_subdev(&viu_dev->v4l2_dev, ad, in viu_of_probe()
1452 timer_setup(&viu_dev->vidq.timeout, viu_vid_timeout, 0); in viu_of_probe()
1453 viu_dev->std = V4L2_STD_NTSC_M; in viu_of_probe()
1454 viu_dev->first = 1; in viu_of_probe()
1459 ret = -ENOMEM; in viu_of_probe()
1465 vdev->v4l2_dev = &viu_dev->v4l2_dev; in viu_of_probe()
1467 viu_dev->vdev = vdev; in viu_of_probe()
1470 mutex_init(&viu_dev->lock); in viu_of_probe()
1471 viu_dev->vdev->lock = &viu_dev->lock; in viu_of_probe()
1472 spin_lock_init(&viu_dev->slock); in viu_of_probe()
1474 video_set_drvdata(viu_dev->vdev, viu_dev); in viu_of_probe()
1476 mutex_lock(&viu_dev->lock); in viu_of_probe()
1478 ret = video_register_device(viu_dev->vdev, VFL_TYPE_VIDEO, -1); in viu_of_probe()
1480 video_device_release(viu_dev->vdev); in viu_of_probe()
1485 clk = devm_clk_get(&op->dev, "ipg"); in viu_of_probe()
1487 dev_err(&op->dev, "failed to lookup the clock!\n"); in viu_of_probe()
1493 dev_err(&op->dev, "failed to enable the clock!\n"); in viu_of_probe()
1496 viu_dev->clk = clk; in viu_of_probe()
1499 viu_reset(viu_dev->vr); in viu_of_probe()
1502 if (request_irq(viu_dev->irq, viu_intr, 0, "viu", (void *)viu_dev)) { in viu_of_probe()
1503 dev_err(&op->dev, "Request VIU IRQ failed.\n"); in viu_of_probe()
1504 ret = -ENODEV; in viu_of_probe()
1508 mutex_unlock(&viu_dev->lock); in viu_of_probe()
1510 dev_info(&op->dev, "Freescale VIU Video Capture Board\n"); in viu_of_probe()
1514 clk_disable_unprepare(viu_dev->clk); in viu_of_probe()
1516 video_unregister_device(viu_dev->vdev); in viu_of_probe()
1518 mutex_unlock(&viu_dev->lock); in viu_of_probe()
1520 v4l2_ctrl_handler_free(&viu_dev->hdl); in viu_of_probe()
1524 v4l2_device_unregister(&viu_dev->v4l2_dev); in viu_of_probe()
1534 struct v4l2_subdev *sdev = list_entry(v4l2_dev->subdevs.next, in viu_of_remove()
1538 free_irq(dev->irq, (void *)dev); in viu_of_remove()
1539 irq_dispose_mapping(dev->irq); in viu_of_remove()
1541 clk_disable_unprepare(dev->clk); in viu_of_remove()
1543 v4l2_ctrl_handler_free(&dev->hdl); in viu_of_remove()
1544 video_unregister_device(dev->vdev); in viu_of_remove()
1545 i2c_put_adapter(client->adapter); in viu_of_remove()
1546 v4l2_device_unregister(&dev->v4l2_dev); in viu_of_remove()
1556 clk_disable(dev->clk); in viu_suspend()
1565 clk_enable(dev->clk); in viu_resume()
1575 .compatible = "fsl,mpc5121-viu",
1596 MODULE_DESCRIPTION("Freescale Video-In(VIU)");