• Home
  • Raw
  • Download

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>
44 /* I2C address of video decoder chip is 0x4A */
81 /* common v4l buffer stuff -- must be first */
248 struct viu_reg __iomem *vr = dev->vr; in viu_start_dma()
250 dev->field = 0; in viu_start_dma()
253 out_be32(&vr->status_cfg, SOFT_RST); in viu_start_dma()
254 out_be32(&vr->status_cfg, INT_FIELD_EN); in viu_start_dma()
259 struct viu_reg __iomem *vr = dev->vr; in viu_stop_dma()
263 out_be32(&vr->status_cfg, 0); in viu_stop_dma()
266 status_cfg = in_be32(&vr->status_cfg); in viu_stop_dma()
268 out_be32(&vr->status_cfg, status_cfg & 0x3f0000); in viu_stop_dma()
272 status_cfg = in_be32(&vr->status_cfg); in viu_stop_dma()
275 } while (cnt--); in viu_stop_dma()
279 out_be32(&vr->status_cfg, SOFT_RST); in viu_stop_dma()
280 out_be32(&vr->status_cfg, 0); in viu_stop_dma()
283 out_be32(&vr->status_cfg, status_cfg & 0x3f0000); in viu_stop_dma()
287 dev->field = 0; in viu_stop_dma()
295 if (!list_empty(&vidq->active)) { in restart_video_queue()
296 buf = list_entry(vidq->active.next, struct viu_buf, vb.queue); in restart_video_queue()
298 buf, buf->vb.i); in restart_video_queue()
300 viu_stop_dma(vidq->dev); in restart_video_queue()
303 list_for_each_entry_safe(buf, prev, &vidq->active, vb.queue) { in restart_video_queue()
304 list_del(&buf->vb.queue); in restart_video_queue()
305 buf->vb.state = VIDEOBUF_ERROR; in restart_video_queue()
306 wake_up(&buf->vb.done); in restart_video_queue()
308 mod_timer(&vidq->timeout, jiffies+BUFFER_TIMEOUT); in restart_video_queue()
314 if (list_empty(&vidq->queued)) in restart_video_queue()
316 buf = list_entry(vidq->queued.next, struct viu_buf, vb.queue); in restart_video_queue()
318 list_move_tail(&buf->vb.queue, &vidq->active); in restart_video_queue()
321 viu_stop_dma(vidq->dev); in restart_video_queue()
322 viu_start_dma(vidq->dev); in restart_video_queue()
324 buf->vb.state = VIDEOBUF_ACTIVE; in restart_video_queue()
325 mod_timer(&vidq->timeout, jiffies+BUFFER_TIMEOUT); in restart_video_queue()
326 dprintk(2, "[%p/%d] restart_queue - first active\n", in restart_video_queue()
327 buf, buf->vb.i); in restart_video_queue()
329 } else if (prev->vb.width == buf->vb.width && in restart_video_queue()
330 prev->vb.height == buf->vb.height && in restart_video_queue()
331 prev->fmt == buf->fmt) { in restart_video_queue()
332 list_move_tail(&buf->vb.queue, &vidq->active); in restart_video_queue()
333 buf->vb.state = VIDEOBUF_ACTIVE; in restart_video_queue()
334 dprintk(2, "[%p/%d] restart_queue - move to active\n", in restart_video_queue()
335 buf, buf->vb.i); in restart_video_queue()
347 struct viu_dmaqueue *vidq = &dev->vidq; in viu_vid_timeout()
349 while (!list_empty(&vidq->active)) { in viu_vid_timeout()
350 buf = list_entry(vidq->active.next, struct viu_buf, vb.queue); in viu_vid_timeout()
351 list_del(&buf->vb.queue); in viu_vid_timeout()
352 buf->vb.state = VIDEOBUF_ERROR; in viu_vid_timeout()
353 wake_up(&buf->vb.done); in viu_vid_timeout()
354 dprintk(1, "viu/0: [%p/%d] timeout\n", buf, buf->vb.i); in viu_vid_timeout()
366 struct viu_fh *fh = vq->priv_data; in buffer_setup()
368 *size = fh->width * fh->height * fh->fmt->depth >> 3; in buffer_setup()
373 (*count)--; in buffer_setup()
381 struct videobuf_buffer *vb = &buf->vb; in free_buffer()
386 videobuf_waiton(vq, &buf->vb, 0, 0); in free_buffer()
388 if (vq->int_ops && vq->int_ops->vaddr) in free_buffer()
389 vaddr = vq->int_ops->vaddr(vb); in free_buffer()
392 videobuf_dma_contig_free(vq, &buf->vb); in free_buffer()
394 buf->vb.state = VIDEOBUF_NEEDS_INIT; in free_buffer()
399 struct viu_reg __iomem *vr = dev->vr; in buffer_activate()
403 reg_val.field_base_addr = videobuf_to_dma_contig(&buf->vb); in buffer_activate()
406 buf, buf->vb.i, (unsigned long)reg_val.field_base_addr); in buffer_activate()
410 bpp = buf->fmt->depth >> 3; in buffer_activate()
414 reg_val.dma_inc = buf->vb.width * 2; in buffer_activate()
418 reg_val.dma_inc = buf->vb.width * 4; in buffer_activate()
423 return -EINVAL; in buffer_activate()
427 reg_val.picture_count = (buf->vb.height / 2) << 16 | in buffer_activate()
428 buf->vb.width; in buffer_activate()
432 buf->vb.state = VIDEOBUF_ACTIVE; in buffer_activate()
433 dev->capfield = buf->vb.field; in buffer_activate()
436 if (!V4L2_FIELD_HAS_BOTH(buf->vb.field)) in buffer_activate()
439 out_be32(&vr->dma_inc, reg_val.dma_inc); in buffer_activate()
440 out_be32(&vr->picture_count, reg_val.picture_count); in buffer_activate()
441 out_be32(&vr->field_base_addr, reg_val.field_base_addr); in buffer_activate()
442 mod_timer(&dev->vidq.timeout, jiffies + BUFFER_TIMEOUT); in buffer_activate()
450 struct viu_fh *fh = vq->priv_data; in buffer_prepare()
454 BUG_ON(fh->fmt == NULL); in buffer_prepare()
456 if (fh->width < 48 || fh->width > norm_maxw() || in buffer_prepare()
457 fh->height < 32 || fh->height > norm_maxh()) in buffer_prepare()
458 return -EINVAL; in buffer_prepare()
459 buf->vb.size = (fh->width * fh->height * fh->fmt->depth) >> 3; in buffer_prepare()
460 if (buf->vb.baddr != 0 && buf->vb.bsize < buf->vb.size) in buffer_prepare()
461 return -EINVAL; in buffer_prepare()
463 if (buf->fmt != fh->fmt || in buffer_prepare()
464 buf->vb.width != fh->width || in buffer_prepare()
465 buf->vb.height != fh->height || in buffer_prepare()
466 buf->vb.field != field) { in buffer_prepare()
467 buf->fmt = fh->fmt; in buffer_prepare()
468 buf->vb.width = fh->width; in buffer_prepare()
469 buf->vb.height = fh->height; in buffer_prepare()
470 buf->vb.field = field; in buffer_prepare()
473 if (buf->vb.state == VIDEOBUF_NEEDS_INIT) { in buffer_prepare()
474 rc = videobuf_iolock(vq, &buf->vb, NULL); in buffer_prepare()
478 buf->vb.width = fh->width; in buffer_prepare()
479 buf->vb.height = fh->height; in buffer_prepare()
480 buf->vb.field = field; in buffer_prepare()
481 buf->fmt = fh->fmt; in buffer_prepare()
484 buf->vb.state = VIDEOBUF_PREPARED; in buffer_prepare()
495 struct viu_fh *fh = vq->priv_data; in buffer_queue()
496 struct viu_dev *dev = fh->dev; in buffer_queue()
497 struct viu_dmaqueue *vidq = &dev->vidq; in buffer_queue()
500 if (!list_empty(&vidq->queued)) { in buffer_queue()
501 dprintk(1, "adding vb queue=%p\n", &buf->vb.queue); in buffer_queue()
503 vidq, &vidq->queued); in buffer_queue()
505 dev, &vidq->queued, vidq->queued.next, in buffer_queue()
506 vidq->queued.prev); in buffer_queue()
507 list_add_tail(&buf->vb.queue, &vidq->queued); in buffer_queue()
508 buf->vb.state = VIDEOBUF_QUEUED; in buffer_queue()
509 dprintk(2, "[%p/%d] buffer_queue - append to queued\n", in buffer_queue()
510 buf, buf->vb.i); in buffer_queue()
511 } else if (list_empty(&vidq->active)) { in buffer_queue()
512 dprintk(1, "adding vb active=%p\n", &buf->vb.queue); in buffer_queue()
513 list_add_tail(&buf->vb.queue, &vidq->active); in buffer_queue()
514 buf->vb.state = VIDEOBUF_ACTIVE; in buffer_queue()
515 mod_timer(&vidq->timeout, jiffies+BUFFER_TIMEOUT); in buffer_queue()
516 dprintk(2, "[%p/%d] buffer_queue - first active\n", in buffer_queue()
517 buf, buf->vb.i); in buffer_queue()
521 dprintk(1, "adding vb queue2=%p\n", &buf->vb.queue); in buffer_queue()
522 prev = list_entry(vidq->active.prev, struct viu_buf, vb.queue); in buffer_queue()
523 if (prev->vb.width == buf->vb.width && in buffer_queue()
524 prev->vb.height == buf->vb.height && in buffer_queue()
525 prev->fmt == buf->fmt) { in buffer_queue()
526 list_add_tail(&buf->vb.queue, &vidq->active); in buffer_queue()
527 buf->vb.state = VIDEOBUF_ACTIVE; in buffer_queue()
528 dprintk(2, "[%p/%d] buffer_queue - append to active\n", in buffer_queue()
529 buf, buf->vb.i); in buffer_queue()
531 list_add_tail(&buf->vb.queue, &vidq->queued); in buffer_queue()
532 buf->vb.state = VIDEOBUF_QUEUED; in buffer_queue()
533 dprintk(2, "[%p/%d] buffer_queue - first queued\n", in buffer_queue()
534 buf, buf->vb.i); in buffer_queue()
543 struct viu_fh *fh = vq->priv_data; in buffer_release()
544 struct viu_dev *dev = (struct viu_dev *)fh->dev; in buffer_release()
563 strscpy(cap->driver, "viu", sizeof(cap->driver)); in vidioc_querycap()
564 strscpy(cap->card, "viu", sizeof(cap->card)); in vidioc_querycap()
565 strscpy(cap->bus_info, "platform:viu", sizeof(cap->bus_info)); in vidioc_querycap()
572 int index = f->index; in vidioc_enum_fmt()
574 if (f->index >= NUM_FORMATS) in vidioc_enum_fmt()
575 return -EINVAL; in vidioc_enum_fmt()
577 f->pixelformat = formats[index].fourcc; in vidioc_enum_fmt()
586 f->fmt.pix.width = fh->width; in vidioc_g_fmt_cap()
587 f->fmt.pix.height = fh->height; in vidioc_g_fmt_cap()
588 f->fmt.pix.field = fh->vb_vidq.field; in vidioc_g_fmt_cap()
589 f->fmt.pix.pixelformat = fh->fmt->pixelformat; in vidioc_g_fmt_cap()
590 f->fmt.pix.bytesperline = in vidioc_g_fmt_cap()
591 (f->fmt.pix.width * fh->fmt->depth) >> 3; in vidioc_g_fmt_cap()
592 f->fmt.pix.sizeimage = fh->sizeimage; in vidioc_g_fmt_cap()
593 f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; in vidioc_g_fmt_cap()
603 fmt = format_by_fourcc(f->fmt.pix.pixelformat); in vidioc_try_fmt_cap()
606 f->fmt.pix.pixelformat); in vidioc_try_fmt_cap()
607 return -EINVAL; in vidioc_try_fmt_cap()
613 f->fmt.pix.field = V4L2_FIELD_INTERLACED; in vidioc_try_fmt_cap()
614 if (f->fmt.pix.height < 32) in vidioc_try_fmt_cap()
615 f->fmt.pix.height = 32; in vidioc_try_fmt_cap()
616 if (f->fmt.pix.height > maxh) in vidioc_try_fmt_cap()
617 f->fmt.pix.height = maxh; in vidioc_try_fmt_cap()
618 if (f->fmt.pix.width < 48) in vidioc_try_fmt_cap()
619 f->fmt.pix.width = 48; in vidioc_try_fmt_cap()
620 if (f->fmt.pix.width > maxw) in vidioc_try_fmt_cap()
621 f->fmt.pix.width = maxw; in vidioc_try_fmt_cap()
622 f->fmt.pix.width &= ~0x03; in vidioc_try_fmt_cap()
623 f->fmt.pix.bytesperline = in vidioc_try_fmt_cap()
624 (f->fmt.pix.width * fmt->depth) >> 3; in vidioc_try_fmt_cap()
625 f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline; in vidioc_try_fmt_cap()
626 f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; in vidioc_try_fmt_cap()
641 fh->fmt = format_by_fourcc(f->fmt.pix.pixelformat); in vidioc_s_fmt_cap()
642 fh->width = f->fmt.pix.width; in vidioc_s_fmt_cap()
643 fh->height = f->fmt.pix.height; in vidioc_s_fmt_cap()
644 fh->sizeimage = f->fmt.pix.sizeimage; in vidioc_s_fmt_cap()
645 fh->vb_vidq.field = f->fmt.pix.field; in vidioc_s_fmt_cap()
646 fh->type = f->type; in vidioc_s_fmt_cap()
655 f->fmt.win = fh->win; in vidioc_g_fmt_overlay()
664 if (dev->ovbuf.base == NULL) in verify_preview()
665 return -EINVAL; in verify_preview()
666 if (dev->ovfmt == NULL) in verify_preview()
667 return -EINVAL; in verify_preview()
668 if (win->w.width < 48 || win->w.height < 32) in verify_preview()
669 return -EINVAL; in verify_preview()
671 field = win->field; in verify_preview()
672 maxw = dev->crop_current.width; in verify_preview()
673 maxh = dev->crop_current.height; in verify_preview()
676 field = (win->w.height > maxh/2) in verify_preview()
688 return -EINVAL; in verify_preview()
691 win->field = field; in verify_preview()
692 if (win->w.width > maxw) in verify_preview()
693 win->w.width = maxw; in verify_preview()
694 if (win->w.height > maxh) in verify_preview()
695 win->w.height = maxh; in verify_preview()
701 out_be32(&vr->field_base_addr, reg_val.field_base_addr); in viu_activate_overlay()
702 out_be32(&vr->dma_inc, reg_val.dma_inc); in viu_activate_overlay()
703 out_be32(&vr->picture_count, reg_val.picture_count); in viu_activate_overlay()
711 fh->win.w.width, fh->win.w.height); in viu_setup_preview()
716 reg_val.picture_count = (fh->win.w.height / 2) << 16 | in viu_setup_preview()
717 fh->win.w.width; in viu_setup_preview()
720 bpp = dev->ovfmt->depth / 8; in viu_setup_preview()
724 reg_val.dma_inc = fh->win.w.width * 2; in viu_setup_preview()
728 reg_val.dma_inc = fh->win.w.width * 4; in viu_setup_preview()
733 return -EINVAL; in viu_setup_preview()
736 dev->ovfield = fh->win.field; in viu_setup_preview()
737 if (!V4L2_FIELD_HAS_BOTH(dev->ovfield)) in viu_setup_preview()
743 reg_val.field_base_addr = (u32)(long)dev->ovbuf.base; in viu_setup_preview()
752 struct viu_dev *dev = (struct viu_dev *)fh->dev; in vidioc_s_fmt_overlay()
756 err = verify_preview(dev, &f->fmt.win); in vidioc_s_fmt_overlay()
760 fh->win = f->fmt.win; in vidioc_s_fmt_overlay()
762 spin_lock_irqsave(&dev->slock, flags); in vidioc_s_fmt_overlay()
764 spin_unlock_irqrestore(&dev->slock, flags); in vidioc_s_fmt_overlay()
777 struct viu_dev *dev = (struct viu_dev *)fh->dev; in vidioc_overlay()
781 spin_lock_irqsave(&dev->slock, flags); in vidioc_overlay()
782 viu_activate_overlay(dev->vr); in vidioc_overlay()
783 dev->ovenable = 1; in vidioc_overlay()
787 spin_unlock_irqrestore(&dev->slock, flags); in vidioc_overlay()
790 dev->ovenable = 0; in vidioc_overlay()
799 struct viu_dev *dev = fh->dev; in vidioc_g_fbuf()
802 *fb = dev->ovbuf; in vidioc_g_fbuf()
803 fb->capability = V4L2_FBUF_CAP_LIST_CLIPPING; in vidioc_g_fbuf()
810 struct viu_dev *dev = fh->dev; in vidioc_s_fbuf()
815 return -EPERM; in vidioc_s_fbuf()
818 fmt = format_by_fourcc(fb->fmt.pixelformat); in vidioc_s_fbuf()
820 return -EINVAL; in vidioc_s_fbuf()
823 dev->ovbuf = *fb; in vidioc_s_fbuf()
824 dev->ovfmt = fmt; in vidioc_s_fbuf()
825 if (dev->ovbuf.fmt.bytesperline == 0) { in vidioc_s_fbuf()
826 dev->ovbuf.fmt.bytesperline = in vidioc_s_fbuf()
827 dev->ovbuf.fmt.width * fmt->depth / 8; in vidioc_s_fbuf()
837 return videobuf_reqbufs(&fh->vb_vidq, p); in vidioc_reqbufs()
845 return videobuf_querybuf(&fh->vb_vidq, p); in vidioc_querybuf()
852 return videobuf_qbuf(&fh->vb_vidq, p); in vidioc_qbuf()
859 return videobuf_dqbuf(&fh->vb_vidq, p, in vidioc_dqbuf()
860 file->f_flags & O_NONBLOCK); in vidioc_dqbuf()
866 struct viu_dev *dev = fh->dev; in vidioc_streamon()
868 if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) in vidioc_streamon()
869 return -EINVAL; in vidioc_streamon()
870 if (fh->type != i) in vidioc_streamon()
871 return -EINVAL; in vidioc_streamon()
873 if (dev->ovenable) in vidioc_streamon()
874 dev->ovenable = 0; in vidioc_streamon()
876 viu_start_dma(fh->dev); in vidioc_streamon()
878 return videobuf_streamon(&fh->vb_vidq); in vidioc_streamon()
885 if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) in vidioc_streamoff()
886 return -EINVAL; in vidioc_streamoff()
887 if (fh->type != i) in vidioc_streamoff()
888 return -EINVAL; in vidioc_streamoff()
890 viu_stop_dma(fh->dev); in vidioc_streamoff()
892 return videobuf_streamoff(&fh->vb_vidq); in vidioc_streamoff()
896 v4l2_subdev_call(viu->decoder, o, f, ##args)
902 decoder_call(fh->dev, video, querystd, std_id); in vidioc_querystd()
910 fh->dev->std = id; in vidioc_s_std()
911 decoder_call(fh->dev, video, s_std, id); in vidioc_s_std()
919 *std_id = fh->dev->std; in vidioc_g_std()
929 if (inp->index != 0) in vidioc_enum_input()
930 return -EINVAL; in vidioc_enum_input()
932 inp->type = V4L2_INPUT_TYPE_CAMERA; in vidioc_enum_input()
933 inp->std = fh->dev->vdev->tvnorms; in vidioc_enum_input()
934 strscpy(inp->name, "Camera", sizeof(inp->name)); in vidioc_enum_input()
949 return -EINVAL; in vidioc_s_input()
951 decoder_call(fh->dev, video, s_routing, i, 0, 0); in vidioc_s_input()
962 if (!list_empty(&vidq->active)) { in viu_activate_next_buf()
963 buf = list_entry(vidq->active.next, struct viu_buf, in viu_activate_next_buf()
967 } else if (!list_empty(&vidq->queued)) { in viu_activate_next_buf()
968 buf = list_entry(vidq->queued.next, struct viu_buf, in viu_activate_next_buf()
970 list_del(&buf->vb.queue); in viu_activate_next_buf()
973 list_add_tail(&buf->vb.queue, &vidq->active); in viu_activate_next_buf()
974 buf->vb.state = VIDEOBUF_ACTIVE; in viu_activate_next_buf()
981 out_be32(&vr->luminance, 0x9512A254); in viu_default_settings()
982 out_be32(&vr->chroma_r, 0x03310000); in viu_default_settings()
983 out_be32(&vr->chroma_g, 0x06600F38); in viu_default_settings()
984 out_be32(&vr->chroma_b, 0x00000409); in viu_default_settings()
985 out_be32(&vr->alpha, 0x000000ff); in viu_default_settings()
986 out_be32(&vr->req_alarm, 0x00000090); in viu_default_settings()
988 in_be32(&vr->status_cfg), in_be32(&vr->field_base_addr)); in viu_default_settings()
993 struct viu_reg __iomem *vr = dev->vr; in viu_overlay_intr()
996 dev->dma_done = 1; in viu_overlay_intr()
999 if (dev->dma_done) { in viu_overlay_intr()
1002 dev->dma_done = 0; in viu_overlay_intr()
1006 out_be32(&vr->field_base_addr, addr); in viu_overlay_intr()
1007 out_be32(&vr->dma_inc, reg_val.dma_inc); in viu_overlay_intr()
1008 out_be32(&vr->status_cfg, in viu_overlay_intr()
1013 out_be32(&vr->status_cfg, in viu_overlay_intr()
1023 struct viu_dmaqueue *vidq = &dev->vidq; in viu_capture_intr()
1024 struct viu_reg __iomem *vr = dev->vr; in viu_capture_intr()
1031 need_two = V4L2_FIELD_HAS_BOTH(dev->capfield); in viu_capture_intr()
1035 if (((field_num == 0) && (dev->field == 0)) || in viu_capture_intr()
1036 (field_num && (dev->field == 1))) in viu_capture_intr()
1037 dev->field++; in viu_capture_intr()
1043 if (unlikely(dev->first)) { in viu_capture_intr()
1045 dev->first = 0; in viu_capture_intr()
1054 if (!list_empty(&vidq->active)) { in viu_capture_intr()
1060 (unsigned long)addr, dev->field); in viu_capture_intr()
1062 out_be32(&vr->field_base_addr, addr); in viu_capture_intr()
1063 out_be32(&vr->dma_inc, reg_val.dma_inc); in viu_capture_intr()
1064 out_be32(&vr->status_cfg, in viu_capture_intr()
1072 if (dma_done && field_num && (dev->field == 2)) { in viu_capture_intr()
1073 dev->field = 0; in viu_capture_intr()
1074 buf = list_entry(vidq->active.next, in viu_capture_intr()
1077 buf, buf->vb.i, in viu_capture_intr()
1078 (unsigned long)videobuf_to_dma_contig(&buf->vb), in viu_capture_intr()
1079 (unsigned long)in_be32(&vr->field_base_addr)); in viu_capture_intr()
1081 if (waitqueue_active(&buf->vb.done)) { in viu_capture_intr()
1082 list_del(&buf->vb.queue); in viu_capture_intr()
1083 buf->vb.ts = ktime_get_ns(); in viu_capture_intr()
1084 buf->vb.state = VIDEOBUF_DONE; in viu_capture_intr()
1085 buf->vb.field_count++; in viu_capture_intr()
1086 wake_up(&buf->vb.done); in viu_capture_intr()
1096 struct viu_reg __iomem *vr = dev->vr; in viu_intr()
1100 status = in_be32(&vr->status_cfg); in viu_intr()
1103 dev->irqs.error_irq++; in viu_intr()
1107 error >> 4, dev->irqs.error_irq); in viu_intr()
1109 out_be32(&vr->status_cfg, in viu_intr()
1114 dev->irqs.dma_end_irq++; in viu_intr()
1115 dev->dma_done = 1; in viu_intr()
1117 dev->irqs.dma_end_irq); in viu_intr()
1121 dev->irqs.hsync_irq++; in viu_intr()
1124 dev->irqs.field_irq++; in viu_intr()
1126 dev->irqs.field_irq); in viu_intr()
1130 dev->irqs.vstart_irq++; in viu_intr()
1133 dev->irqs.vsync_irq++; in viu_intr()
1135 dev->irqs.vsync_irq); in viu_intr()
1139 status = in_be32(&vr->status_cfg); in viu_intr()
1140 out_be32(&vr->status_cfg, in viu_intr()
1143 if (dev->ovenable) { in viu_intr()
1162 int minor = vdev->minor; in viu_open()
1167 dev->users++; in viu_open()
1168 if (dev->users > 1) { in viu_open()
1169 dev->users--; in viu_open()
1170 return -EBUSY; in viu_open()
1173 vr = dev->vr; in viu_open()
1176 v4l2_type_names[V4L2_BUF_TYPE_VIDEO_CAPTURE], dev->users); in viu_open()
1178 if (mutex_lock_interruptible(&dev->lock)) { in viu_open()
1179 dev->users--; in viu_open()
1180 return -ERESTARTSYS; in viu_open()
1186 dev->users--; in viu_open()
1187 mutex_unlock(&dev->lock); in viu_open()
1188 return -ENOMEM; in viu_open()
1191 v4l2_fh_init(&fh->fh, vdev); in viu_open()
1192 file->private_data = fh; in viu_open()
1193 fh->dev = dev; in viu_open()
1195 fh->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; in viu_open()
1196 fh->fmt = format_by_fourcc(V4L2_PIX_FMT_RGB32); in viu_open()
1197 fh->width = norm_maxw(); in viu_open()
1198 fh->height = norm_maxh(); in viu_open()
1199 dev->crop_current.width = fh->width; in viu_open()
1200 dev->crop_current.height = fh->height; in viu_open()
1202 dprintk(1, "Open: fh=%p, dev=%p, dev->vidq=%p\n", fh, dev, &dev->vidq); in viu_open()
1204 list_empty(&dev->vidq.queued)); in viu_open()
1206 list_empty(&dev->vidq.active)); in viu_open()
1210 status_cfg = in_be32(&vr->status_cfg); in viu_open()
1211 out_be32(&vr->status_cfg, in viu_open()
1216 status_cfg = in_be32(&vr->status_cfg); in viu_open()
1217 out_be32(&vr->status_cfg, status_cfg | INT_ALL_STATUS); in viu_open()
1219 spin_lock_init(&fh->vbq_lock); in viu_open()
1220 videobuf_queue_dma_contig_init(&fh->vb_vidq, &viu_video_qops, in viu_open()
1221 dev->dev, &fh->vbq_lock, in viu_open()
1222 fh->type, V4L2_FIELD_INTERLACED, in viu_open()
1224 &fh->dev->lock); in viu_open()
1225 v4l2_fh_add(&fh->fh); in viu_open()
1226 mutex_unlock(&dev->lock); in viu_open()
1233 struct viu_fh *fh = file->private_data; in viu_read()
1234 struct viu_dev *dev = fh->dev; in viu_read()
1238 if (dev->ovenable) in viu_read()
1239 dev->ovenable = 0; in viu_read()
1241 if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) { in viu_read()
1242 if (mutex_lock_interruptible(&dev->lock)) in viu_read()
1243 return -ERESTARTSYS; in viu_read()
1245 ret = videobuf_read_stream(&fh->vb_vidq, data, count, in viu_read()
1246 ppos, 0, file->f_flags & O_NONBLOCK); in viu_read()
1247 mutex_unlock(&dev->lock); in viu_read()
1255 struct viu_fh *fh = file->private_data; in viu_poll()
1256 struct videobuf_queue *q = &fh->vb_vidq; in viu_poll()
1257 struct viu_dev *dev = fh->dev; in viu_poll()
1261 if (V4L2_BUF_TYPE_VIDEO_CAPTURE != fh->type) in viu_poll()
1267 mutex_lock(&dev->lock); in viu_poll()
1269 mutex_unlock(&dev->lock); in viu_poll()
1275 struct viu_fh *fh = file->private_data; in viu_release()
1276 struct viu_dev *dev = fh->dev; in viu_release()
1277 int minor = video_devdata(file)->minor; in viu_release()
1279 mutex_lock(&dev->lock); in viu_release()
1281 videobuf_stop(&fh->vb_vidq); in viu_release()
1282 videobuf_mmap_free(&fh->vb_vidq); in viu_release()
1283 v4l2_fh_del(&fh->fh); in viu_release()
1284 v4l2_fh_exit(&fh->fh); in viu_release()
1285 mutex_unlock(&dev->lock); in viu_release()
1289 dev->users--; in viu_release()
1291 minor, dev->users); in viu_release()
1297 out_be32(&reg->status_cfg, 0); in viu_reset()
1298 out_be32(&reg->luminance, 0x9512a254); in viu_reset()
1299 out_be32(&reg->chroma_r, 0x03310000); in viu_reset()
1300 out_be32(&reg->chroma_g, 0x06600f38); in viu_reset()
1301 out_be32(&reg->chroma_b, 0x00000409); in viu_reset()
1302 out_be32(&reg->field_base_addr, 0); in viu_reset()
1303 out_be32(&reg->dma_inc, 0); in viu_reset()
1304 out_be32(&reg->picture_count, 0x01e002d0); in viu_reset()
1305 out_be32(&reg->req_alarm, 0x00000090); in viu_reset()
1306 out_be32(&reg->alpha, 0x000000ff); in viu_reset()
1311 struct viu_fh *fh = file->private_data; in viu_mmap()
1312 struct viu_dev *dev = fh->dev; in viu_mmap()
1317 if (mutex_lock_interruptible(&dev->lock)) in viu_mmap()
1318 return -ERESTARTSYS; in viu_mmap()
1319 ret = videobuf_mmap_mapper(&fh->vb_vidq, vma); in viu_mmap()
1320 mutex_unlock(&dev->lock); in viu_mmap()
1323 (unsigned long)vma->vm_start, in viu_mmap()
1324 (unsigned long)vma->vm_end-(unsigned long)vma->vm_start, in viu_mmap()
1373 .minor = -1,
1392 ret = of_address_to_resource(op->dev.of_node, 0, &r); in viu_of_probe()
1394 dev_err(&op->dev, "Can't parse device node resource\n"); in viu_of_probe()
1395 return -ENODEV; in viu_of_probe()
1398 viu_irq = irq_of_parse_and_map(op->dev.of_node, 0); in viu_of_probe()
1400 dev_err(&op->dev, "Error while mapping the irq\n"); in viu_of_probe()
1401 return -EINVAL; in viu_of_probe()
1405 if (!devm_request_mem_region(&op->dev, r.start, in viu_of_probe()
1407 dev_err(&op->dev, "Error while requesting mem region\n"); in viu_of_probe()
1408 ret = -EBUSY; in viu_of_probe()
1413 viu_regs = devm_ioremap(&op->dev, r.start, sizeof(struct viu_reg)); in viu_of_probe()
1415 dev_err(&op->dev, "Can't map register set\n"); in viu_of_probe()
1416 ret = -ENOMEM; in viu_of_probe()
1421 viu_dev = devm_kzalloc(&op->dev, sizeof(struct viu_dev), GFP_ATOMIC); in viu_of_probe()
1423 dev_err(&op->dev, "Can't allocate private structure\n"); in viu_of_probe()
1424 ret = -ENOMEM; in viu_of_probe()
1428 viu_dev->vr = viu_regs; in viu_of_probe()
1429 viu_dev->irq = viu_irq; in viu_of_probe()
1430 viu_dev->dev = &op->dev; in viu_of_probe()
1433 INIT_LIST_HEAD(&viu_dev->vidq.active); in viu_of_probe()
1434 INIT_LIST_HEAD(&viu_dev->vidq.queued); in viu_of_probe()
1436 snprintf(viu_dev->v4l2_dev.name, in viu_of_probe()
1437 sizeof(viu_dev->v4l2_dev.name), "%s", "VIU"); in viu_of_probe()
1438 ret = v4l2_device_register(viu_dev->dev, &viu_dev->v4l2_dev); in viu_of_probe()
1440 dev_err(&op->dev, "v4l2_device_register() failed: %d\n", ret); in viu_of_probe()
1446 ret = -EFAULT; in viu_of_probe()
1447 dev_err(&op->dev, "couldn't get i2c adapter\n"); in viu_of_probe()
1451 v4l2_ctrl_handler_init(&viu_dev->hdl, 5); in viu_of_probe()
1452 if (viu_dev->hdl.error) { in viu_of_probe()
1453 ret = viu_dev->hdl.error; in viu_of_probe()
1454 dev_err(&op->dev, "couldn't register control\n"); in viu_of_probe()
1458 sub-device(s). */ in viu_of_probe()
1459 viu_dev->v4l2_dev.ctrl_handler = &viu_dev->hdl; in viu_of_probe()
1460 viu_dev->decoder = v4l2_i2c_new_subdev(&viu_dev->v4l2_dev, ad, in viu_of_probe()
1463 timer_setup(&viu_dev->vidq.timeout, viu_vid_timeout, 0); in viu_of_probe()
1464 viu_dev->std = V4L2_STD_NTSC_M; in viu_of_probe()
1465 viu_dev->first = 1; in viu_of_probe()
1470 ret = -ENOMEM; in viu_of_probe()
1476 vdev->v4l2_dev = &viu_dev->v4l2_dev; in viu_of_probe()
1478 viu_dev->vdev = vdev; in viu_of_probe()
1481 mutex_init(&viu_dev->lock); in viu_of_probe()
1482 viu_dev->vdev->lock = &viu_dev->lock; in viu_of_probe()
1483 spin_lock_init(&viu_dev->slock); in viu_of_probe()
1485 video_set_drvdata(viu_dev->vdev, viu_dev); in viu_of_probe()
1487 mutex_lock(&viu_dev->lock); in viu_of_probe()
1489 ret = video_register_device(viu_dev->vdev, VFL_TYPE_VIDEO, -1); in viu_of_probe()
1491 video_device_release(viu_dev->vdev); in viu_of_probe()
1496 clk = devm_clk_get(&op->dev, "ipg"); in viu_of_probe()
1498 dev_err(&op->dev, "failed to lookup the clock!\n"); in viu_of_probe()
1504 dev_err(&op->dev, "failed to enable the clock!\n"); in viu_of_probe()
1507 viu_dev->clk = clk; in viu_of_probe()
1510 viu_reset(viu_dev->vr); in viu_of_probe()
1513 if (request_irq(viu_dev->irq, viu_intr, 0, "viu", (void *)viu_dev)) { in viu_of_probe()
1514 dev_err(&op->dev, "Request VIU IRQ failed.\n"); in viu_of_probe()
1515 ret = -ENODEV; in viu_of_probe()
1519 mutex_unlock(&viu_dev->lock); in viu_of_probe()
1521 dev_info(&op->dev, "Freescale VIU Video Capture Board\n"); in viu_of_probe()
1525 clk_disable_unprepare(viu_dev->clk); in viu_of_probe()
1527 video_unregister_device(viu_dev->vdev); in viu_of_probe()
1529 mutex_unlock(&viu_dev->lock); in viu_of_probe()
1531 v4l2_ctrl_handler_free(&viu_dev->hdl); in viu_of_probe()
1535 v4l2_device_unregister(&viu_dev->v4l2_dev); in viu_of_probe()
1543 struct v4l2_device *v4l2_dev = dev_get_drvdata(&op->dev); in viu_of_remove()
1545 struct v4l2_subdev *sdev = list_entry(v4l2_dev->subdevs.next, in viu_of_remove()
1549 free_irq(dev->irq, (void *)dev); in viu_of_remove()
1550 irq_dispose_mapping(dev->irq); in viu_of_remove()
1552 clk_disable_unprepare(dev->clk); in viu_of_remove()
1554 v4l2_ctrl_handler_free(&dev->hdl); in viu_of_remove()
1555 video_unregister_device(dev->vdev); in viu_of_remove()
1556 i2c_put_adapter(client->adapter); in viu_of_remove()
1557 v4l2_device_unregister(&dev->v4l2_dev); in viu_of_remove()
1564 struct v4l2_device *v4l2_dev = dev_get_drvdata(&op->dev); in viu_suspend()
1567 clk_disable(dev->clk); in viu_suspend()
1573 struct v4l2_device *v4l2_dev = dev_get_drvdata(&op->dev); in viu_resume()
1576 clk_enable(dev->clk); in viu_resume()
1586 .compatible = "fsl,mpc5121-viu",
1607 MODULE_DESCRIPTION("Freescale Video-In(VIU)");