All of lore.kernel.org
 help / color / mirror / Atom feed
From: Steve Longerbeam <slongerbeam@gmail.com>
To: robh+dt@kernel.org, mark.rutland@arm.com, shawnguo@kernel.org,
	kernel@pengutronix.de, fabio.estevam@nxp.com,
	linux@armlinux.org.uk, mchehab@kernel.org, hverkuil@xs4all.nl,
	nick@shmanahar.org, markus.heiser@darmarIT.de,
	p.zabel@pengutronix.de,
	laurent.pinchart+renesas@ideasonboard.com, bparrot@ti.com,
	geert@linux-m68k.org, arnd@arndb.de, sudipm.mukherjee@gmail.com,
	minghsiu.tsai@mediatek.com, tiffany.lin@mediatek.com,
	jean-christophe.trotin@st.com, horms+renesas@verge.net.au,
	niklas.soderlund+renesas@ragnatech.se, robert.jarzmik@free.fr,
	songjun.wu@microchip.com, andrew-ct.chen@mediatek.com,
	gregkh@linuxfoundation.org, shuah@kernel.org,
	sakari.ailus@linux.intel.com, pavel@ucw.cz
Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	linux-media@vger.kernel.org, devel@driverdev.osuosl.org,
	Steve Longerbeam <steve_longerbeam@mentor.com>
Subject: [PATCH v4 19/36] media: imx: Add Capture Device Interface
Date: Wed, 15 Feb 2017 18:19:21 -0800	[thread overview]
Message-ID: <1487211578-11360-20-git-send-email-steve_longerbeam@mentor.com> (raw)
In-Reply-To: <1487211578-11360-1-git-send-email-steve_longerbeam@mentor.com>

This is the capture device interface driver that provides the v4l2
user interface. Frames can be received from various sources:

- directly from CSI for capturing unconverted images directly from
  camera sensors.

- from the IC pre-process encode task.

- from the IC pre-process viewfinder task.

Signed-off-by: Steve Longerbeam <steve_longerbeam@mentor.com>
---
 drivers/staging/media/imx/Makefile            |   2 +-
 drivers/staging/media/imx/imx-media-capture.c | 654 ++++++++++++++++++++++++++
 2 files changed, 655 insertions(+), 1 deletion(-)
 create mode 100644 drivers/staging/media/imx/imx-media-capture.c

diff --git a/drivers/staging/media/imx/Makefile b/drivers/staging/media/imx/Makefile
index ba8e4fb..4606a3a 100644
--- a/drivers/staging/media/imx/Makefile
+++ b/drivers/staging/media/imx/Makefile
@@ -3,4 +3,4 @@ imx-media-common-objs := imx-media-utils.o imx-media-fim.o
 
 obj-$(CONFIG_VIDEO_IMX_MEDIA) += imx-media.o
 obj-$(CONFIG_VIDEO_IMX_MEDIA) += imx-media-common.o
-
+obj-$(CONFIG_VIDEO_IMX_MEDIA) += imx-media-capture.o
diff --git a/drivers/staging/media/imx/imx-media-capture.c b/drivers/staging/media/imx/imx-media-capture.c
new file mode 100644
index 0000000..fbf6067
--- /dev/null
+++ b/drivers/staging/media/imx/imx-media-capture.c
@@ -0,0 +1,654 @@
+/*
+ * Video Capture Subdev for Freescale i.MX5/6 SOC
+ *
+ * Copyright (c) 2012-2016 Mentor Graphics Inc.
+ *
+ * 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.
+ */
+#include <linux/delay.h>
+#include <linux/fs.h>
+#include <linux/module.h>
+#include <linux/of_platform.h>
+#include <linux/pinctrl/consumer.h>
+#include <linux/platform_device.h>
+#include <linux/sched.h>
+#include <linux/slab.h>
+#include <linux/spinlock.h>
+#include <linux/timer.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-event.h>
+#include <media/v4l2-ioctl.h>
+#include <media/v4l2-of.h>
+#include <media/v4l2-mc.h>
+#include <media/v4l2-subdev.h>
+#include <media/videobuf2-dma-contig.h>
+#include <video/imx-ipu-v3.h>
+#include <media/imx.h>
+#include "imx-media.h"
+
+struct capture_priv {
+	struct imx_media_video_dev vdev;
+
+	struct v4l2_subdev    *src_sd;
+	int                   src_sd_pad;
+	struct device         *dev;
+
+	struct media_pipeline mp;
+	struct imx_media_dev  *md;
+
+	struct media_pad      vdev_pad;
+
+	struct mutex          mutex;       /* capture device mutex */
+
+	/* the videobuf2 queue */
+	struct vb2_queue       q;
+	/* list of ready imx_media_buffer's from q */
+	struct list_head       ready_q;
+	/* protect ready_q */
+	spinlock_t             q_lock;
+
+	/* controls inherited from subdevs */
+	struct v4l2_ctrl_handler ctrl_hdlr;
+
+	/* misc status */
+	bool                  stop;          /* streaming is stopping */
+};
+
+#define to_capture_priv(v) container_of(v, struct capture_priv, vdev)
+
+/* In bytes, per queue */
+#define VID_MEM_LIMIT	SZ_64M
+
+static struct vb2_ops capture_qops;
+
+/*
+ * Video ioctls follow
+ */
+
+static int vidioc_querycap(struct file *file, void *fh,
+			   struct v4l2_capability *cap)
+{
+	struct capture_priv *priv = video_drvdata(file);
+
+	strncpy(cap->driver, "imx-media-capture", sizeof(cap->driver) - 1);
+	strncpy(cap->card, "imx-media-capture", sizeof(cap->card) - 1);
+	snprintf(cap->bus_info, sizeof(cap->bus_info),
+		 "platform:%s", dev_name(priv->dev));
+
+	return 0;
+}
+
+static int capture_enum_fmt_vid_cap(struct file *file, void *fh,
+				    struct v4l2_fmtdesc *f)
+{
+	u32 fourcc;
+	int ret;
+
+	ret = imx_media_enum_format(&fourcc, NULL, f->index, true, true);
+	if (ret)
+		return ret;
+
+	f->pixelformat = fourcc;
+
+	return 0;
+}
+
+static int capture_g_fmt_vid_cap(struct file *file, void *fh,
+				 struct v4l2_format *f)
+{
+	struct capture_priv *priv = video_drvdata(file);
+
+	*f = priv->vdev.fmt;
+
+	return 0;
+}
+
+static int capture_try_fmt_vid_cap(struct file *file, void *fh,
+				   struct v4l2_format *f)
+{
+	struct capture_priv *priv = video_drvdata(file);
+	struct v4l2_subdev_format fmt_src;
+	const struct imx_media_pixfmt *cc, *src_cc;
+	u32 fourcc;
+	int ret;
+
+	fourcc = f->fmt.pix.pixelformat;
+	cc = imx_media_find_format(fourcc, 0, true, true);
+	if (!cc) {
+		imx_media_enum_format(&fourcc, NULL, 0, true, true);
+		cc = imx_media_find_format(fourcc, 0, true, true);
+	}
+
+	/*
+	 * user frame dimensions are the same as src_sd's pad.
+	 */
+	fmt_src.pad = priv->src_sd_pad;
+	fmt_src.which = V4L2_SUBDEV_FORMAT_ACTIVE;
+	ret = v4l2_subdev_call(priv->src_sd, pad, get_fmt, NULL, &fmt_src);
+	if (ret)
+		return ret;
+
+	/*
+	 * but we can allow planar pixel formats if the src_sd's
+	 * pad configured a YUV format
+	 */
+	src_cc = imx_media_find_format(0, fmt_src.format.code, true, false);
+	if (src_cc->cs == IPUV3_COLORSPACE_YUV &&
+	    cc->cs == IPUV3_COLORSPACE_YUV) {
+		imx_media_mbus_fmt_to_pix_fmt(&f->fmt.pix,
+					      &fmt_src.format, cc);
+	} else {
+		imx_media_mbus_fmt_to_pix_fmt(&f->fmt.pix,
+					      &fmt_src.format, src_cc);
+	}
+
+	return 0;
+}
+
+static int capture_s_fmt_vid_cap(struct file *file, void *fh,
+				 struct v4l2_format *f)
+{
+	struct capture_priv *priv = video_drvdata(file);
+	int ret;
+
+	if (vb2_is_busy(&priv->q)) {
+		v4l2_err(priv->src_sd, "%s queue busy\n", __func__);
+		return -EBUSY;
+	}
+
+	ret = capture_try_fmt_vid_cap(file, priv, f);
+	if (ret)
+		return ret;
+
+	priv->vdev.fmt.fmt.pix = f->fmt.pix;
+	priv->vdev.cc = imx_media_find_format(f->fmt.pix.pixelformat, 0,
+					      true, true);
+
+	return 0;
+}
+
+static int capture_querystd(struct file *file, void *fh, v4l2_std_id *std)
+{
+	struct capture_priv *priv = video_drvdata(file);
+	struct imx_media_subdev *sensor;
+
+	sensor = imx_media_find_sensor(priv->md, &priv->src_sd->entity);
+	if (IS_ERR(sensor)) {
+		v4l2_err(priv->src_sd, "no sensor attached\n");
+		return PTR_ERR(sensor);
+	}
+
+	return v4l2_subdev_call(sensor->sd, video, querystd, std);
+}
+
+static int capture_g_std(struct file *file, void *fh, v4l2_std_id *std)
+{
+	struct capture_priv *priv = video_drvdata(file);
+	struct imx_media_subdev *sensor;
+
+	sensor = imx_media_find_sensor(priv->md, &priv->src_sd->entity);
+	if (IS_ERR(sensor)) {
+		v4l2_err(priv->src_sd, "no sensor attached\n");
+		return PTR_ERR(sensor);
+	}
+
+	return v4l2_subdev_call(sensor->sd, video, g_std, std);
+}
+
+static int capture_s_std(struct file *file, void *fh, v4l2_std_id std)
+{
+	struct capture_priv *priv = video_drvdata(file);
+	struct imx_media_subdev *sensor;
+
+	if (vb2_is_busy(&priv->q))
+		return -EBUSY;
+
+	sensor = imx_media_find_sensor(priv->md, &priv->src_sd->entity);
+	if (IS_ERR(sensor)) {
+		v4l2_err(priv->src_sd, "no sensor attached\n");
+		return PTR_ERR(sensor);
+	}
+
+	return v4l2_subdev_call(sensor->sd, video, s_std, std);
+}
+
+static int capture_g_parm(struct file *file, void *fh,
+			  struct v4l2_streamparm *a)
+{
+	struct capture_priv *priv = video_drvdata(file);
+	struct imx_media_subdev *sensor;
+
+	sensor = imx_media_find_sensor(priv->md, &priv->src_sd->entity);
+	if (IS_ERR(sensor)) {
+		v4l2_err(priv->src_sd, "no sensor attached\n");
+		return PTR_ERR(sensor);
+	}
+
+	if (a->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
+		return -EINVAL;
+
+	return v4l2_subdev_call(sensor->sd, video, g_parm, a);
+}
+
+static int capture_s_parm(struct file *file, void *fh,
+			  struct v4l2_streamparm *a)
+{
+	struct capture_priv *priv = video_drvdata(file);
+	struct imx_media_subdev *sensor;
+
+	sensor = imx_media_find_sensor(priv->md, &priv->src_sd->entity);
+	if (IS_ERR(sensor)) {
+		v4l2_err(priv->src_sd, "no sensor attached\n");
+		return PTR_ERR(sensor);
+	}
+
+	if (a->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
+		return -EINVAL;
+
+	return v4l2_subdev_call(sensor->sd, video, s_parm, a);
+}
+
+static const struct v4l2_ioctl_ops capture_ioctl_ops = {
+	.vidioc_querycap	= vidioc_querycap,
+
+	.vidioc_enum_fmt_vid_cap        = capture_enum_fmt_vid_cap,
+	.vidioc_g_fmt_vid_cap           = capture_g_fmt_vid_cap,
+	.vidioc_try_fmt_vid_cap         = capture_try_fmt_vid_cap,
+	.vidioc_s_fmt_vid_cap           = capture_s_fmt_vid_cap,
+
+	.vidioc_querystd        = capture_querystd,
+	.vidioc_g_std           = capture_g_std,
+	.vidioc_s_std           = capture_s_std,
+
+	.vidioc_g_parm          = capture_g_parm,
+	.vidioc_s_parm          = capture_s_parm,
+
+	.vidioc_reqbufs		= vb2_ioctl_reqbufs,
+	.vidioc_create_bufs     = vb2_ioctl_create_bufs,
+	.vidioc_prepare_buf     = vb2_ioctl_prepare_buf,
+	.vidioc_querybuf	= vb2_ioctl_querybuf,
+	.vidioc_qbuf		= vb2_ioctl_qbuf,
+	.vidioc_dqbuf		= vb2_ioctl_dqbuf,
+	.vidioc_expbuf		= vb2_ioctl_expbuf,
+	.vidioc_streamon	= vb2_ioctl_streamon,
+	.vidioc_streamoff	= vb2_ioctl_streamoff,
+};
+
+/*
+ * Queue operations
+ */
+
+static int capture_queue_setup(struct vb2_queue *vq,
+			       unsigned int *nbuffers,
+			       unsigned int *nplanes,
+			       unsigned int sizes[],
+			       struct device *alloc_devs[])
+{
+	struct capture_priv *priv = vb2_get_drv_priv(vq);
+	struct v4l2_pix_format *pix = &priv->vdev.fmt.fmt.pix;
+	unsigned int count = *nbuffers;
+
+	if (vq->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
+		return -EINVAL;
+
+	if (*nplanes) {
+		if (*nplanes != 1 || sizes[0] < pix->sizeimage)
+			return -EINVAL;
+		count += vq->num_buffers;
+	}
+
+	count = min_t(__u32, VID_MEM_LIMIT / pix->sizeimage, count);
+
+	if (*nplanes)
+		*nbuffers = (count < vq->num_buffers) ? 0 :
+			count - vq->num_buffers;
+	else
+		*nbuffers = count;
+
+	*nplanes = 1;
+	sizes[0] = pix->sizeimage;
+
+	return 0;
+}
+
+static int capture_buf_init(struct vb2_buffer *vb)
+{
+	struct imx_media_buffer *buf = to_imx_media_vb(vb);
+
+	INIT_LIST_HEAD(&buf->list);
+
+	return 0;
+}
+
+static int capture_buf_prepare(struct vb2_buffer *vb)
+{
+	struct vb2_queue *vq = vb->vb2_queue;
+	struct capture_priv *priv = vb2_get_drv_priv(vq);
+	struct v4l2_pix_format *pix = &priv->vdev.fmt.fmt.pix;
+
+	if (vb2_plane_size(vb, 0) < pix->sizeimage) {
+		v4l2_err(priv->src_sd,
+			 "data will not fit into plane (%lu < %lu)\n",
+			 vb2_plane_size(vb, 0), (long)pix->sizeimage);
+		return -EINVAL;
+	}
+
+	vb2_set_plane_payload(vb, 0, pix->sizeimage);
+
+	return 0;
+}
+
+static void capture_buf_queue(struct vb2_buffer *vb)
+{
+	struct capture_priv *priv = vb2_get_drv_priv(vb->vb2_queue);
+	struct imx_media_buffer *buf = to_imx_media_vb(vb);
+	unsigned long flags;
+
+	spin_lock_irqsave(&priv->q_lock, flags);
+
+	list_add_tail(&buf->list, &priv->ready_q);
+
+	spin_unlock_irqrestore(&priv->q_lock, flags);
+}
+
+static int capture_start_streaming(struct vb2_queue *vq, unsigned int count)
+{
+	struct capture_priv *priv = vb2_get_drv_priv(vq);
+	struct imx_media_buffer *buf, *tmp;
+	unsigned long flags;
+	int ret;
+
+	if (vb2_is_streaming(vq))
+		return 0;
+
+	ret = imx_media_pipeline_set_stream(priv->md, &priv->src_sd->entity,
+					    &priv->mp, true);
+	if (ret) {
+		v4l2_err(priv->src_sd, "pipeline_set_stream failed with %d\n",
+			 ret);
+		goto return_bufs;
+	}
+
+	priv->stop = false;
+
+	return 0;
+
+return_bufs:
+	spin_lock_irqsave(&priv->q_lock, flags);
+	list_for_each_entry_safe(buf, tmp, &priv->ready_q, list) {
+		list_del(&buf->list);
+		vb2_buffer_done(&buf->vbuf.vb2_buf, VB2_BUF_STATE_QUEUED);
+	}
+	spin_unlock_irqrestore(&priv->q_lock, flags);
+	return ret;
+}
+
+static void capture_stop_streaming(struct vb2_queue *vq)
+{
+	struct capture_priv *priv = vb2_get_drv_priv(vq);
+	struct imx_media_buffer *frame;
+	unsigned long flags;
+	int ret;
+
+	if (!vb2_is_streaming(vq))
+		return;
+
+	spin_lock_irqsave(&priv->q_lock, flags);
+	priv->stop = true;
+	spin_unlock_irqrestore(&priv->q_lock, flags);
+
+	ret = imx_media_pipeline_set_stream(priv->md, &priv->src_sd->entity,
+					    &priv->mp, false);
+	if (ret)
+		v4l2_warn(priv->src_sd, "pipeline_set_stream failed with %d\n",
+			  ret);
+
+	/* release all active buffers */
+	spin_lock_irqsave(&priv->q_lock, flags);
+	while (!list_empty(&priv->ready_q)) {
+		frame = list_entry(priv->ready_q.next,
+				   struct imx_media_buffer, list);
+		list_del(&frame->list);
+		vb2_buffer_done(&frame->vbuf.vb2_buf, VB2_BUF_STATE_ERROR);
+	}
+	spin_unlock_irqrestore(&priv->q_lock, flags);
+}
+
+static struct vb2_ops capture_qops = {
+	.queue_setup	 = capture_queue_setup,
+	.buf_init        = capture_buf_init,
+	.buf_prepare	 = capture_buf_prepare,
+	.buf_queue	 = capture_buf_queue,
+	.wait_prepare	 = vb2_ops_wait_prepare,
+	.wait_finish	 = vb2_ops_wait_finish,
+	.start_streaming = capture_start_streaming,
+	.stop_streaming  = capture_stop_streaming,
+};
+
+/*
+ * File operations
+ */
+static int capture_open(struct file *file)
+{
+	struct capture_priv *priv = video_drvdata(file);
+	int ret;
+
+	if (mutex_lock_interruptible(&priv->mutex))
+		return -ERESTARTSYS;
+
+	ret = v4l2_fh_open(file);
+	if (ret)
+		v4l2_err(priv->src_sd, "v4l2_fh_open failed\n");
+
+	mutex_unlock(&priv->mutex);
+	return ret;
+}
+
+static int capture_release(struct file *file)
+{
+	struct capture_priv *priv = video_drvdata(file);
+	struct vb2_queue *vq = &priv->q;
+	int ret = 0;
+
+	mutex_lock(&priv->mutex);
+
+	if (file->private_data == vq->owner) {
+		vb2_queue_release(vq);
+		vq->owner = NULL;
+	}
+
+	v4l2_fh_release(file);
+	mutex_unlock(&priv->mutex);
+	return ret;
+}
+
+static const struct v4l2_file_operations capture_fops = {
+	.owner		= THIS_MODULE,
+	.open		= capture_open,
+	.release	= capture_release,
+	.poll		= vb2_fop_poll,
+	.unlocked_ioctl	= video_ioctl2,
+	.mmap		= vb2_fop_mmap,
+};
+
+static struct video_device capture_videodev = {
+	.fops		= &capture_fops,
+	.ioctl_ops	= &capture_ioctl_ops,
+	.minor		= -1,
+	.release	= video_device_release,
+	.vfl_dir	= VFL_DIR_RX,
+	.tvnorms	= V4L2_STD_NTSC | V4L2_STD_PAL | V4L2_STD_SECAM,
+	.device_caps	= V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING,
+};
+
+struct imx_media_buffer *
+imx_media_capture_device_next_buf(struct imx_media_video_dev *vdev)
+{
+	struct capture_priv *priv = to_capture_priv(vdev);
+	struct imx_media_buffer *buf = NULL;
+	unsigned long flags;
+
+	spin_lock_irqsave(&priv->q_lock, flags);
+
+	/* get next queued buffer */
+	if (!list_empty(&priv->ready_q)) {
+		buf = list_entry(priv->ready_q.next, struct imx_media_buffer,
+				 list);
+		list_del(&buf->list);
+	}
+
+	spin_unlock_irqrestore(&priv->q_lock, flags);
+
+	return buf;
+}
+EXPORT_SYMBOL_GPL(imx_media_capture_device_next_buf);
+
+int imx_media_capture_device_register(struct imx_media_video_dev *vdev)
+{
+	struct capture_priv *priv = to_capture_priv(vdev);
+	struct v4l2_subdev *sd = priv->src_sd;
+	struct video_device *vfd = vdev->vfd;
+	struct vb2_queue *vq = &priv->q;
+	struct v4l2_subdev_format fmt_src;
+	int ret;
+
+	/* get media device */
+	priv->md = dev_get_drvdata(sd->v4l2_dev->dev);
+
+	vfd->v4l2_dev = sd->v4l2_dev;
+
+	ret = video_register_device(vfd, VFL_TYPE_GRABBER, 0);
+	if (ret) {
+		v4l2_err(sd, "Failed to register video device\n");
+		return ret;
+	}
+
+	vq->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+	vq->io_modes = VB2_MMAP | VB2_DMABUF;
+	vq->drv_priv = priv;
+	vq->buf_struct_size = sizeof(struct imx_media_buffer);
+	vq->ops = &capture_qops;
+	vq->mem_ops = &vb2_dma_contig_memops;
+	vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
+	vq->lock = &priv->mutex;
+	vq->min_buffers_needed = 2;
+	vq->dev = priv->dev;
+
+	ret = vb2_queue_init(vq);
+	if (ret) {
+		v4l2_err(sd, "vb2_queue_init failed\n");
+		goto unreg;
+	}
+
+	INIT_LIST_HEAD(&priv->ready_q);
+
+	priv->vdev_pad.flags = MEDIA_PAD_FL_SINK;
+	ret = media_entity_pads_init(&vfd->entity, 1, &priv->vdev_pad);
+	if (ret) {
+		v4l2_err(sd, "failed to init dev pad\n");
+		goto unreg;
+	}
+
+	/* create the link from the src_sd devnode pad to device node */
+	ret = media_create_pad_link(&sd->entity, priv->src_sd_pad,
+				    &vfd->entity, 0, 0);
+	if (ret) {
+		v4l2_err(sd, "failed to create link to device node\n");
+		goto unreg;
+	}
+
+	/* setup default format */
+	fmt_src.pad = priv->src_sd_pad;
+	fmt_src.which = V4L2_SUBDEV_FORMAT_ACTIVE;
+	v4l2_subdev_call(sd, pad, get_fmt, NULL, &fmt_src);
+	if (ret) {
+		v4l2_err(sd, "failed to get src_sd format\n");
+		goto unreg;
+	}
+
+	vdev->fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+	imx_media_mbus_fmt_to_pix_fmt(&vdev->fmt.fmt.pix,
+				      &fmt_src.format, NULL);
+	vdev->cc = imx_media_find_format(0, fmt_src.format.code,
+					 true, false);
+
+	v4l2_info(sd, "Registered %s as /dev/%s\n", vfd->name,
+		  video_device_node_name(vfd));
+
+	vfd->ctrl_handler = &priv->ctrl_hdlr;
+
+	return 0;
+unreg:
+	video_unregister_device(vfd);
+	return ret;
+}
+EXPORT_SYMBOL_GPL(imx_media_capture_device_register);
+
+void imx_media_capture_device_unregister(struct imx_media_video_dev *vdev)
+{
+	struct capture_priv *priv = to_capture_priv(vdev);
+	struct video_device *vfd = priv->vdev.vfd;
+
+	mutex_lock(&priv->mutex);
+
+	if (video_is_registered(vfd)) {
+		video_unregister_device(vfd);
+		media_entity_cleanup(&vfd->entity);
+	}
+
+	mutex_unlock(&priv->mutex);
+}
+EXPORT_SYMBOL_GPL(imx_media_capture_device_unregister);
+
+struct imx_media_video_dev *
+imx_media_capture_device_init(struct v4l2_subdev *src_sd, int pad)
+{
+	struct capture_priv *priv;
+	struct video_device *vfd;
+
+	priv = devm_kzalloc(src_sd->dev, sizeof(*priv), GFP_KERNEL);
+	if (!priv)
+		return ERR_PTR(-ENOMEM);
+
+	priv->src_sd = src_sd;
+	priv->src_sd_pad = pad;
+	priv->dev = src_sd->dev;
+
+	mutex_init(&priv->mutex);
+	spin_lock_init(&priv->q_lock);
+
+	snprintf(capture_videodev.name, sizeof(capture_videodev.name),
+		 "%s capture", src_sd->name);
+
+	vfd = video_device_alloc();
+	if (!vfd)
+		return ERR_PTR(-ENOMEM);
+
+	*vfd = capture_videodev;
+	vfd->lock = &priv->mutex;
+	vfd->queue = &priv->q;
+	priv->vdev.vfd = vfd;
+
+	video_set_drvdata(vfd, priv);
+
+	v4l2_ctrl_handler_init(&priv->ctrl_hdlr, 0);
+
+	return &priv->vdev;
+}
+EXPORT_SYMBOL_GPL(imx_media_capture_device_init);
+
+void imx_media_capture_device_remove(struct imx_media_video_dev *vdev)
+{
+	struct capture_priv *priv = to_capture_priv(vdev);
+
+	v4l2_ctrl_handler_free(&priv->ctrl_hdlr);
+}
+EXPORT_SYMBOL_GPL(imx_media_capture_device_remove);
+
+MODULE_DESCRIPTION("i.MX5/6 v4l2 video capture interface driver");
+MODULE_AUTHOR("Steve Longerbeam <steve_longerbeam@mentor.com>");
+MODULE_LICENSE("GPL");
-- 
2.7.4

WARNING: multiple messages have this Message-ID (diff)
From: slongerbeam@gmail.com (Steve Longerbeam)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v4 19/36] media: imx: Add Capture Device Interface
Date: Wed, 15 Feb 2017 18:19:21 -0800	[thread overview]
Message-ID: <1487211578-11360-20-git-send-email-steve_longerbeam@mentor.com> (raw)
In-Reply-To: <1487211578-11360-1-git-send-email-steve_longerbeam@mentor.com>

This is the capture device interface driver that provides the v4l2
user interface. Frames can be received from various sources:

- directly from CSI for capturing unconverted images directly from
  camera sensors.

- from the IC pre-process encode task.

- from the IC pre-process viewfinder task.

Signed-off-by: Steve Longerbeam <steve_longerbeam@mentor.com>
---
 drivers/staging/media/imx/Makefile            |   2 +-
 drivers/staging/media/imx/imx-media-capture.c | 654 ++++++++++++++++++++++++++
 2 files changed, 655 insertions(+), 1 deletion(-)
 create mode 100644 drivers/staging/media/imx/imx-media-capture.c

diff --git a/drivers/staging/media/imx/Makefile b/drivers/staging/media/imx/Makefile
index ba8e4fb..4606a3a 100644
--- a/drivers/staging/media/imx/Makefile
+++ b/drivers/staging/media/imx/Makefile
@@ -3,4 +3,4 @@ imx-media-common-objs := imx-media-utils.o imx-media-fim.o
 
 obj-$(CONFIG_VIDEO_IMX_MEDIA) += imx-media.o
 obj-$(CONFIG_VIDEO_IMX_MEDIA) += imx-media-common.o
-
+obj-$(CONFIG_VIDEO_IMX_MEDIA) += imx-media-capture.o
diff --git a/drivers/staging/media/imx/imx-media-capture.c b/drivers/staging/media/imx/imx-media-capture.c
new file mode 100644
index 0000000..fbf6067
--- /dev/null
+++ b/drivers/staging/media/imx/imx-media-capture.c
@@ -0,0 +1,654 @@
+/*
+ * Video Capture Subdev for Freescale i.MX5/6 SOC
+ *
+ * Copyright (c) 2012-2016 Mentor Graphics Inc.
+ *
+ * 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.
+ */
+#include <linux/delay.h>
+#include <linux/fs.h>
+#include <linux/module.h>
+#include <linux/of_platform.h>
+#include <linux/pinctrl/consumer.h>
+#include <linux/platform_device.h>
+#include <linux/sched.h>
+#include <linux/slab.h>
+#include <linux/spinlock.h>
+#include <linux/timer.h>
+#include <media/v4l2-ctrls.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-event.h>
+#include <media/v4l2-ioctl.h>
+#include <media/v4l2-of.h>
+#include <media/v4l2-mc.h>
+#include <media/v4l2-subdev.h>
+#include <media/videobuf2-dma-contig.h>
+#include <video/imx-ipu-v3.h>
+#include <media/imx.h>
+#include "imx-media.h"
+
+struct capture_priv {
+	struct imx_media_video_dev vdev;
+
+	struct v4l2_subdev    *src_sd;
+	int                   src_sd_pad;
+	struct device         *dev;
+
+	struct media_pipeline mp;
+	struct imx_media_dev  *md;
+
+	struct media_pad      vdev_pad;
+
+	struct mutex          mutex;       /* capture device mutex */
+
+	/* the videobuf2 queue */
+	struct vb2_queue       q;
+	/* list of ready imx_media_buffer's from q */
+	struct list_head       ready_q;
+	/* protect ready_q */
+	spinlock_t             q_lock;
+
+	/* controls inherited from subdevs */
+	struct v4l2_ctrl_handler ctrl_hdlr;
+
+	/* misc status */
+	bool                  stop;          /* streaming is stopping */
+};
+
+#define to_capture_priv(v) container_of(v, struct capture_priv, vdev)
+
+/* In bytes, per queue */
+#define VID_MEM_LIMIT	SZ_64M
+
+static struct vb2_ops capture_qops;
+
+/*
+ * Video ioctls follow
+ */
+
+static int vidioc_querycap(struct file *file, void *fh,
+			   struct v4l2_capability *cap)
+{
+	struct capture_priv *priv = video_drvdata(file);
+
+	strncpy(cap->driver, "imx-media-capture", sizeof(cap->driver) - 1);
+	strncpy(cap->card, "imx-media-capture", sizeof(cap->card) - 1);
+	snprintf(cap->bus_info, sizeof(cap->bus_info),
+		 "platform:%s", dev_name(priv->dev));
+
+	return 0;
+}
+
+static int capture_enum_fmt_vid_cap(struct file *file, void *fh,
+				    struct v4l2_fmtdesc *f)
+{
+	u32 fourcc;
+	int ret;
+
+	ret = imx_media_enum_format(&fourcc, NULL, f->index, true, true);
+	if (ret)
+		return ret;
+
+	f->pixelformat = fourcc;
+
+	return 0;
+}
+
+static int capture_g_fmt_vid_cap(struct file *file, void *fh,
+				 struct v4l2_format *f)
+{
+	struct capture_priv *priv = video_drvdata(file);
+
+	*f = priv->vdev.fmt;
+
+	return 0;
+}
+
+static int capture_try_fmt_vid_cap(struct file *file, void *fh,
+				   struct v4l2_format *f)
+{
+	struct capture_priv *priv = video_drvdata(file);
+	struct v4l2_subdev_format fmt_src;
+	const struct imx_media_pixfmt *cc, *src_cc;
+	u32 fourcc;
+	int ret;
+
+	fourcc = f->fmt.pix.pixelformat;
+	cc = imx_media_find_format(fourcc, 0, true, true);
+	if (!cc) {
+		imx_media_enum_format(&fourcc, NULL, 0, true, true);
+		cc = imx_media_find_format(fourcc, 0, true, true);
+	}
+
+	/*
+	 * user frame dimensions are the same as src_sd's pad.
+	 */
+	fmt_src.pad = priv->src_sd_pad;
+	fmt_src.which = V4L2_SUBDEV_FORMAT_ACTIVE;
+	ret = v4l2_subdev_call(priv->src_sd, pad, get_fmt, NULL, &fmt_src);
+	if (ret)
+		return ret;
+
+	/*
+	 * but we can allow planar pixel formats if the src_sd's
+	 * pad configured a YUV format
+	 */
+	src_cc = imx_media_find_format(0, fmt_src.format.code, true, false);
+	if (src_cc->cs == IPUV3_COLORSPACE_YUV &&
+	    cc->cs == IPUV3_COLORSPACE_YUV) {
+		imx_media_mbus_fmt_to_pix_fmt(&f->fmt.pix,
+					      &fmt_src.format, cc);
+	} else {
+		imx_media_mbus_fmt_to_pix_fmt(&f->fmt.pix,
+					      &fmt_src.format, src_cc);
+	}
+
+	return 0;
+}
+
+static int capture_s_fmt_vid_cap(struct file *file, void *fh,
+				 struct v4l2_format *f)
+{
+	struct capture_priv *priv = video_drvdata(file);
+	int ret;
+
+	if (vb2_is_busy(&priv->q)) {
+		v4l2_err(priv->src_sd, "%s queue busy\n", __func__);
+		return -EBUSY;
+	}
+
+	ret = capture_try_fmt_vid_cap(file, priv, f);
+	if (ret)
+		return ret;
+
+	priv->vdev.fmt.fmt.pix = f->fmt.pix;
+	priv->vdev.cc = imx_media_find_format(f->fmt.pix.pixelformat, 0,
+					      true, true);
+
+	return 0;
+}
+
+static int capture_querystd(struct file *file, void *fh, v4l2_std_id *std)
+{
+	struct capture_priv *priv = video_drvdata(file);
+	struct imx_media_subdev *sensor;
+
+	sensor = imx_media_find_sensor(priv->md, &priv->src_sd->entity);
+	if (IS_ERR(sensor)) {
+		v4l2_err(priv->src_sd, "no sensor attached\n");
+		return PTR_ERR(sensor);
+	}
+
+	return v4l2_subdev_call(sensor->sd, video, querystd, std);
+}
+
+static int capture_g_std(struct file *file, void *fh, v4l2_std_id *std)
+{
+	struct capture_priv *priv = video_drvdata(file);
+	struct imx_media_subdev *sensor;
+
+	sensor = imx_media_find_sensor(priv->md, &priv->src_sd->entity);
+	if (IS_ERR(sensor)) {
+		v4l2_err(priv->src_sd, "no sensor attached\n");
+		return PTR_ERR(sensor);
+	}
+
+	return v4l2_subdev_call(sensor->sd, video, g_std, std);
+}
+
+static int capture_s_std(struct file *file, void *fh, v4l2_std_id std)
+{
+	struct capture_priv *priv = video_drvdata(file);
+	struct imx_media_subdev *sensor;
+
+	if (vb2_is_busy(&priv->q))
+		return -EBUSY;
+
+	sensor = imx_media_find_sensor(priv->md, &priv->src_sd->entity);
+	if (IS_ERR(sensor)) {
+		v4l2_err(priv->src_sd, "no sensor attached\n");
+		return PTR_ERR(sensor);
+	}
+
+	return v4l2_subdev_call(sensor->sd, video, s_std, std);
+}
+
+static int capture_g_parm(struct file *file, void *fh,
+			  struct v4l2_streamparm *a)
+{
+	struct capture_priv *priv = video_drvdata(file);
+	struct imx_media_subdev *sensor;
+
+	sensor = imx_media_find_sensor(priv->md, &priv->src_sd->entity);
+	if (IS_ERR(sensor)) {
+		v4l2_err(priv->src_sd, "no sensor attached\n");
+		return PTR_ERR(sensor);
+	}
+
+	if (a->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
+		return -EINVAL;
+
+	return v4l2_subdev_call(sensor->sd, video, g_parm, a);
+}
+
+static int capture_s_parm(struct file *file, void *fh,
+			  struct v4l2_streamparm *a)
+{
+	struct capture_priv *priv = video_drvdata(file);
+	struct imx_media_subdev *sensor;
+
+	sensor = imx_media_find_sensor(priv->md, &priv->src_sd->entity);
+	if (IS_ERR(sensor)) {
+		v4l2_err(priv->src_sd, "no sensor attached\n");
+		return PTR_ERR(sensor);
+	}
+
+	if (a->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
+		return -EINVAL;
+
+	return v4l2_subdev_call(sensor->sd, video, s_parm, a);
+}
+
+static const struct v4l2_ioctl_ops capture_ioctl_ops = {
+	.vidioc_querycap	= vidioc_querycap,
+
+	.vidioc_enum_fmt_vid_cap        = capture_enum_fmt_vid_cap,
+	.vidioc_g_fmt_vid_cap           = capture_g_fmt_vid_cap,
+	.vidioc_try_fmt_vid_cap         = capture_try_fmt_vid_cap,
+	.vidioc_s_fmt_vid_cap           = capture_s_fmt_vid_cap,
+
+	.vidioc_querystd        = capture_querystd,
+	.vidioc_g_std           = capture_g_std,
+	.vidioc_s_std           = capture_s_std,
+
+	.vidioc_g_parm          = capture_g_parm,
+	.vidioc_s_parm          = capture_s_parm,
+
+	.vidioc_reqbufs		= vb2_ioctl_reqbufs,
+	.vidioc_create_bufs     = vb2_ioctl_create_bufs,
+	.vidioc_prepare_buf     = vb2_ioctl_prepare_buf,
+	.vidioc_querybuf	= vb2_ioctl_querybuf,
+	.vidioc_qbuf		= vb2_ioctl_qbuf,
+	.vidioc_dqbuf		= vb2_ioctl_dqbuf,
+	.vidioc_expbuf		= vb2_ioctl_expbuf,
+	.vidioc_streamon	= vb2_ioctl_streamon,
+	.vidioc_streamoff	= vb2_ioctl_streamoff,
+};
+
+/*
+ * Queue operations
+ */
+
+static int capture_queue_setup(struct vb2_queue *vq,
+			       unsigned int *nbuffers,
+			       unsigned int *nplanes,
+			       unsigned int sizes[],
+			       struct device *alloc_devs[])
+{
+	struct capture_priv *priv = vb2_get_drv_priv(vq);
+	struct v4l2_pix_format *pix = &priv->vdev.fmt.fmt.pix;
+	unsigned int count = *nbuffers;
+
+	if (vq->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
+		return -EINVAL;
+
+	if (*nplanes) {
+		if (*nplanes != 1 || sizes[0] < pix->sizeimage)
+			return -EINVAL;
+		count += vq->num_buffers;
+	}
+
+	count = min_t(__u32, VID_MEM_LIMIT / pix->sizeimage, count);
+
+	if (*nplanes)
+		*nbuffers = (count < vq->num_buffers) ? 0 :
+			count - vq->num_buffers;
+	else
+		*nbuffers = count;
+
+	*nplanes = 1;
+	sizes[0] = pix->sizeimage;
+
+	return 0;
+}
+
+static int capture_buf_init(struct vb2_buffer *vb)
+{
+	struct imx_media_buffer *buf = to_imx_media_vb(vb);
+
+	INIT_LIST_HEAD(&buf->list);
+
+	return 0;
+}
+
+static int capture_buf_prepare(struct vb2_buffer *vb)
+{
+	struct vb2_queue *vq = vb->vb2_queue;
+	struct capture_priv *priv = vb2_get_drv_priv(vq);
+	struct v4l2_pix_format *pix = &priv->vdev.fmt.fmt.pix;
+
+	if (vb2_plane_size(vb, 0) < pix->sizeimage) {
+		v4l2_err(priv->src_sd,
+			 "data will not fit into plane (%lu < %lu)\n",
+			 vb2_plane_size(vb, 0), (long)pix->sizeimage);
+		return -EINVAL;
+	}
+
+	vb2_set_plane_payload(vb, 0, pix->sizeimage);
+
+	return 0;
+}
+
+static void capture_buf_queue(struct vb2_buffer *vb)
+{
+	struct capture_priv *priv = vb2_get_drv_priv(vb->vb2_queue);
+	struct imx_media_buffer *buf = to_imx_media_vb(vb);
+	unsigned long flags;
+
+	spin_lock_irqsave(&priv->q_lock, flags);
+
+	list_add_tail(&buf->list, &priv->ready_q);
+
+	spin_unlock_irqrestore(&priv->q_lock, flags);
+}
+
+static int capture_start_streaming(struct vb2_queue *vq, unsigned int count)
+{
+	struct capture_priv *priv = vb2_get_drv_priv(vq);
+	struct imx_media_buffer *buf, *tmp;
+	unsigned long flags;
+	int ret;
+
+	if (vb2_is_streaming(vq))
+		return 0;
+
+	ret = imx_media_pipeline_set_stream(priv->md, &priv->src_sd->entity,
+					    &priv->mp, true);
+	if (ret) {
+		v4l2_err(priv->src_sd, "pipeline_set_stream failed with %d\n",
+			 ret);
+		goto return_bufs;
+	}
+
+	priv->stop = false;
+
+	return 0;
+
+return_bufs:
+	spin_lock_irqsave(&priv->q_lock, flags);
+	list_for_each_entry_safe(buf, tmp, &priv->ready_q, list) {
+		list_del(&buf->list);
+		vb2_buffer_done(&buf->vbuf.vb2_buf, VB2_BUF_STATE_QUEUED);
+	}
+	spin_unlock_irqrestore(&priv->q_lock, flags);
+	return ret;
+}
+
+static void capture_stop_streaming(struct vb2_queue *vq)
+{
+	struct capture_priv *priv = vb2_get_drv_priv(vq);
+	struct imx_media_buffer *frame;
+	unsigned long flags;
+	int ret;
+
+	if (!vb2_is_streaming(vq))
+		return;
+
+	spin_lock_irqsave(&priv->q_lock, flags);
+	priv->stop = true;
+	spin_unlock_irqrestore(&priv->q_lock, flags);
+
+	ret = imx_media_pipeline_set_stream(priv->md, &priv->src_sd->entity,
+					    &priv->mp, false);
+	if (ret)
+		v4l2_warn(priv->src_sd, "pipeline_set_stream failed with %d\n",
+			  ret);
+
+	/* release all active buffers */
+	spin_lock_irqsave(&priv->q_lock, flags);
+	while (!list_empty(&priv->ready_q)) {
+		frame = list_entry(priv->ready_q.next,
+				   struct imx_media_buffer, list);
+		list_del(&frame->list);
+		vb2_buffer_done(&frame->vbuf.vb2_buf, VB2_BUF_STATE_ERROR);
+	}
+	spin_unlock_irqrestore(&priv->q_lock, flags);
+}
+
+static struct vb2_ops capture_qops = {
+	.queue_setup	 = capture_queue_setup,
+	.buf_init        = capture_buf_init,
+	.buf_prepare	 = capture_buf_prepare,
+	.buf_queue	 = capture_buf_queue,
+	.wait_prepare	 = vb2_ops_wait_prepare,
+	.wait_finish	 = vb2_ops_wait_finish,
+	.start_streaming = capture_start_streaming,
+	.stop_streaming  = capture_stop_streaming,
+};
+
+/*
+ * File operations
+ */
+static int capture_open(struct file *file)
+{
+	struct capture_priv *priv = video_drvdata(file);
+	int ret;
+
+	if (mutex_lock_interruptible(&priv->mutex))
+		return -ERESTARTSYS;
+
+	ret = v4l2_fh_open(file);
+	if (ret)
+		v4l2_err(priv->src_sd, "v4l2_fh_open failed\n");
+
+	mutex_unlock(&priv->mutex);
+	return ret;
+}
+
+static int capture_release(struct file *file)
+{
+	struct capture_priv *priv = video_drvdata(file);
+	struct vb2_queue *vq = &priv->q;
+	int ret = 0;
+
+	mutex_lock(&priv->mutex);
+
+	if (file->private_data == vq->owner) {
+		vb2_queue_release(vq);
+		vq->owner = NULL;
+	}
+
+	v4l2_fh_release(file);
+	mutex_unlock(&priv->mutex);
+	return ret;
+}
+
+static const struct v4l2_file_operations capture_fops = {
+	.owner		= THIS_MODULE,
+	.open		= capture_open,
+	.release	= capture_release,
+	.poll		= vb2_fop_poll,
+	.unlocked_ioctl	= video_ioctl2,
+	.mmap		= vb2_fop_mmap,
+};
+
+static struct video_device capture_videodev = {
+	.fops		= &capture_fops,
+	.ioctl_ops	= &capture_ioctl_ops,
+	.minor		= -1,
+	.release	= video_device_release,
+	.vfl_dir	= VFL_DIR_RX,
+	.tvnorms	= V4L2_STD_NTSC | V4L2_STD_PAL | V4L2_STD_SECAM,
+	.device_caps	= V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING,
+};
+
+struct imx_media_buffer *
+imx_media_capture_device_next_buf(struct imx_media_video_dev *vdev)
+{
+	struct capture_priv *priv = to_capture_priv(vdev);
+	struct imx_media_buffer *buf = NULL;
+	unsigned long flags;
+
+	spin_lock_irqsave(&priv->q_lock, flags);
+
+	/* get next queued buffer */
+	if (!list_empty(&priv->ready_q)) {
+		buf = list_entry(priv->ready_q.next, struct imx_media_buffer,
+				 list);
+		list_del(&buf->list);
+	}
+
+	spin_unlock_irqrestore(&priv->q_lock, flags);
+
+	return buf;
+}
+EXPORT_SYMBOL_GPL(imx_media_capture_device_next_buf);
+
+int imx_media_capture_device_register(struct imx_media_video_dev *vdev)
+{
+	struct capture_priv *priv = to_capture_priv(vdev);
+	struct v4l2_subdev *sd = priv->src_sd;
+	struct video_device *vfd = vdev->vfd;
+	struct vb2_queue *vq = &priv->q;
+	struct v4l2_subdev_format fmt_src;
+	int ret;
+
+	/* get media device */
+	priv->md = dev_get_drvdata(sd->v4l2_dev->dev);
+
+	vfd->v4l2_dev = sd->v4l2_dev;
+
+	ret = video_register_device(vfd, VFL_TYPE_GRABBER, 0);
+	if (ret) {
+		v4l2_err(sd, "Failed to register video device\n");
+		return ret;
+	}
+
+	vq->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+	vq->io_modes = VB2_MMAP | VB2_DMABUF;
+	vq->drv_priv = priv;
+	vq->buf_struct_size = sizeof(struct imx_media_buffer);
+	vq->ops = &capture_qops;
+	vq->mem_ops = &vb2_dma_contig_memops;
+	vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
+	vq->lock = &priv->mutex;
+	vq->min_buffers_needed = 2;
+	vq->dev = priv->dev;
+
+	ret = vb2_queue_init(vq);
+	if (ret) {
+		v4l2_err(sd, "vb2_queue_init failed\n");
+		goto unreg;
+	}
+
+	INIT_LIST_HEAD(&priv->ready_q);
+
+	priv->vdev_pad.flags = MEDIA_PAD_FL_SINK;
+	ret = media_entity_pads_init(&vfd->entity, 1, &priv->vdev_pad);
+	if (ret) {
+		v4l2_err(sd, "failed to init dev pad\n");
+		goto unreg;
+	}
+
+	/* create the link from the src_sd devnode pad to device node */
+	ret = media_create_pad_link(&sd->entity, priv->src_sd_pad,
+				    &vfd->entity, 0, 0);
+	if (ret) {
+		v4l2_err(sd, "failed to create link to device node\n");
+		goto unreg;
+	}
+
+	/* setup default format */
+	fmt_src.pad = priv->src_sd_pad;
+	fmt_src.which = V4L2_SUBDEV_FORMAT_ACTIVE;
+	v4l2_subdev_call(sd, pad, get_fmt, NULL, &fmt_src);
+	if (ret) {
+		v4l2_err(sd, "failed to get src_sd format\n");
+		goto unreg;
+	}
+
+	vdev->fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+	imx_media_mbus_fmt_to_pix_fmt(&vdev->fmt.fmt.pix,
+				      &fmt_src.format, NULL);
+	vdev->cc = imx_media_find_format(0, fmt_src.format.code,
+					 true, false);
+
+	v4l2_info(sd, "Registered %s as /dev/%s\n", vfd->name,
+		  video_device_node_name(vfd));
+
+	vfd->ctrl_handler = &priv->ctrl_hdlr;
+
+	return 0;
+unreg:
+	video_unregister_device(vfd);
+	return ret;
+}
+EXPORT_SYMBOL_GPL(imx_media_capture_device_register);
+
+void imx_media_capture_device_unregister(struct imx_media_video_dev *vdev)
+{
+	struct capture_priv *priv = to_capture_priv(vdev);
+	struct video_device *vfd = priv->vdev.vfd;
+
+	mutex_lock(&priv->mutex);
+
+	if (video_is_registered(vfd)) {
+		video_unregister_device(vfd);
+		media_entity_cleanup(&vfd->entity);
+	}
+
+	mutex_unlock(&priv->mutex);
+}
+EXPORT_SYMBOL_GPL(imx_media_capture_device_unregister);
+
+struct imx_media_video_dev *
+imx_media_capture_device_init(struct v4l2_subdev *src_sd, int pad)
+{
+	struct capture_priv *priv;
+	struct video_device *vfd;
+
+	priv = devm_kzalloc(src_sd->dev, sizeof(*priv), GFP_KERNEL);
+	if (!priv)
+		return ERR_PTR(-ENOMEM);
+
+	priv->src_sd = src_sd;
+	priv->src_sd_pad = pad;
+	priv->dev = src_sd->dev;
+
+	mutex_init(&priv->mutex);
+	spin_lock_init(&priv->q_lock);
+
+	snprintf(capture_videodev.name, sizeof(capture_videodev.name),
+		 "%s capture", src_sd->name);
+
+	vfd = video_device_alloc();
+	if (!vfd)
+		return ERR_PTR(-ENOMEM);
+
+	*vfd = capture_videodev;
+	vfd->lock = &priv->mutex;
+	vfd->queue = &priv->q;
+	priv->vdev.vfd = vfd;
+
+	video_set_drvdata(vfd, priv);
+
+	v4l2_ctrl_handler_init(&priv->ctrl_hdlr, 0);
+
+	return &priv->vdev;
+}
+EXPORT_SYMBOL_GPL(imx_media_capture_device_init);
+
+void imx_media_capture_device_remove(struct imx_media_video_dev *vdev)
+{
+	struct capture_priv *priv = to_capture_priv(vdev);
+
+	v4l2_ctrl_handler_free(&priv->ctrl_hdlr);
+}
+EXPORT_SYMBOL_GPL(imx_media_capture_device_remove);
+
+MODULE_DESCRIPTION("i.MX5/6 v4l2 video capture interface driver");
+MODULE_AUTHOR("Steve Longerbeam <steve_longerbeam@mentor.com>");
+MODULE_LICENSE("GPL");
-- 
2.7.4

  parent reply	other threads:[~2017-02-16  2:20 UTC|newest]

Thread overview: 672+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-02-16  2:19 [PATCH v4 00/36] i.MX Media Driver Steve Longerbeam
2017-02-16  2:19 ` Steve Longerbeam
2017-02-16  2:19 ` Steve Longerbeam
2017-02-16  2:19 ` [PATCH v4 01/36] [media] dt-bindings: Add bindings for i.MX media driver Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16 11:54   ` Philipp Zabel
2017-02-16 11:54     ` Philipp Zabel
2017-02-16 11:54     ` Philipp Zabel
2017-02-16 19:20     ` Steve Longerbeam
2017-02-16 19:20       ` Steve Longerbeam
2017-02-16 19:20       ` Steve Longerbeam
2017-02-27 14:38   ` Rob Herring
2017-02-27 14:38     ` Rob Herring
2017-02-27 14:38     ` Rob Herring
2017-03-01  0:00     ` Steve Longerbeam
2017-03-01  0:00       ` Steve Longerbeam
2017-03-01  0:00       ` Steve Longerbeam
2017-02-16  2:19 ` [PATCH v4 02/36] ARM: dts: imx6qdl: Add compatible, clocks, irqs to MIPI CSI-2 node Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16  2:19 ` [PATCH v4 03/36] ARM: dts: imx6qdl: Add mipi_ipu1/2 multiplexers, mipi_csi, and their connections Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16  2:19 ` [PATCH v4 04/36] ARM: dts: imx6qdl: add capture-subsystem device Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16  2:19 ` [PATCH v4 05/36] ARM: dts: imx6qdl-sabrelite: remove erratum ERR006687 workaround Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16  2:19 ` [PATCH v4 06/36] ARM: dts: imx6-sabrelite: add OV5642 and OV5640 camera sensors Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16  2:19 ` [PATCH v4 07/36] ARM: dts: imx6-sabresd: " Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-17  0:51   ` Fabio Estevam
2017-02-17  0:51     ` Fabio Estevam
2017-02-17  0:51     ` Fabio Estevam
2017-02-17  0:51     ` Fabio Estevam
2017-02-17  0:56     ` Steve Longerbeam
2017-02-17  0:56       ` Steve Longerbeam
2017-02-17  0:56       ` Steve Longerbeam
2017-02-17  0:56       ` Steve Longerbeam
2017-02-16  2:19 ` [PATCH v4 08/36] ARM: dts: imx6-sabreauto: create i2cmux for i2c3 Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16  2:19 ` [PATCH v4 09/36] ARM: dts: imx6-sabreauto: add reset-gpios property for max7310_b Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16  2:19 ` [PATCH v4 10/36] ARM: dts: imx6-sabreauto: add pinctrl for gpt input capture Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16  2:19 ` [PATCH v4 11/36] ARM: dts: imx6-sabreauto: add the ADV7180 video decoder Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16  2:19 ` [PATCH v4 12/36] add mux and video interface bridge entity functions Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-19 21:28   ` Pavel Machek
2017-02-19 21:28     ` Pavel Machek
2017-02-19 21:28     ` Pavel Machek
2017-02-22 17:19     ` Steve Longerbeam
2017-02-22 17:19       ` Steve Longerbeam
2017-02-22 17:19       ` Steve Longerbeam
2017-02-16  2:19 ` [PATCH v4 13/36] [media] v4l2: add a frame timeout event Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-03-02 15:53   ` Sakari Ailus
2017-03-02 15:53     ` Sakari Ailus
2017-03-02 15:53     ` Sakari Ailus
2017-03-02 23:07     ` Steve Longerbeam
2017-03-02 23:07       ` Steve Longerbeam
2017-03-02 23:07       ` Steve Longerbeam
2017-03-03 11:45       ` Sakari Ailus
2017-03-03 11:45         ` Sakari Ailus
2017-03-03 11:45         ` Sakari Ailus
2017-03-03 22:43         ` Steve Longerbeam
2017-03-03 22:43           ` Steve Longerbeam
2017-03-03 22:43           ` Steve Longerbeam
2017-03-04 10:56           ` Sakari Ailus
2017-03-04 10:56             ` Sakari Ailus
2017-03-04 10:56             ` Sakari Ailus
2017-03-05  0:37             ` Steve Longerbeam
2017-03-05  0:37               ` Steve Longerbeam
2017-03-05  0:37               ` Steve Longerbeam
2017-03-05 21:31               ` Sakari Ailus
2017-03-05 21:31                 ` Sakari Ailus
2017-03-05 21:31                 ` Sakari Ailus
2017-03-05 22:41               ` Russell King - ARM Linux
2017-03-05 22:41                 ` Russell King - ARM Linux
2017-03-05 22:41                 ` Russell King - ARM Linux
2017-03-10  2:38                 ` Steve Longerbeam
2017-03-10  2:38                   ` Steve Longerbeam
2017-03-10  2:38                   ` Steve Longerbeam
2017-03-10  9:33                   ` Russell King - ARM Linux
2017-03-10  9:33                     ` Russell King - ARM Linux
2017-03-10  9:33                     ` Russell King - ARM Linux
2017-02-16  2:19 ` [PATCH v4 14/36] [media] v4l2-mc: add a function to inherit controls from a pipeline Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-19 21:44   ` Pavel Machek
2017-02-19 21:44     ` Pavel Machek
2017-02-19 21:44     ` Pavel Machek
2017-03-02 16:02   ` Sakari Ailus
2017-03-02 16:02     ` Sakari Ailus
2017-03-02 16:02     ` Sakari Ailus
2017-03-02 23:48     ` Steve Longerbeam
2017-03-02 23:48       ` Steve Longerbeam
2017-03-02 23:48       ` Steve Longerbeam
2017-03-03  0:46       ` Steve Longerbeam
2017-03-03  0:46         ` Steve Longerbeam
2017-03-03  0:46         ` Steve Longerbeam
2017-03-03  2:12       ` Steve Longerbeam
2017-03-03  2:12         ` Steve Longerbeam
2017-03-03  2:12         ` Steve Longerbeam
2017-03-03 19:17         ` Sakari Ailus
2017-03-03 19:17           ` Sakari Ailus
2017-03-03 19:17           ` Sakari Ailus
2017-03-03 22:47           ` Steve Longerbeam
2017-03-03 22:47             ` Steve Longerbeam
2017-03-03 22:47             ` Steve Longerbeam
2017-03-03 23:06     ` Russell King - ARM Linux
2017-03-03 23:06       ` Russell King - ARM Linux
2017-03-03 23:06       ` Russell King - ARM Linux
2017-03-04  0:36       ` Steve Longerbeam
2017-03-04  0:36         ` Steve Longerbeam
2017-03-04  0:36         ` Steve Longerbeam
2017-03-04 13:13       ` Sakari Ailus
2017-03-04 13:13         ` Sakari Ailus
2017-03-04 13:13         ` Sakari Ailus
2017-03-10 12:54         ` Hans Verkuil
2017-03-10 12:54           ` Hans Verkuil
2017-03-10 12:54           ` Hans Verkuil
2017-03-10 13:07           ` Russell King - ARM Linux
2017-03-10 13:07             ` Russell King - ARM Linux
2017-03-10 13:07             ` Russell King - ARM Linux
2017-03-10 13:22             ` Hans Verkuil
2017-03-10 13:22               ` Hans Verkuil
2017-03-10 13:22               ` Hans Verkuil
2017-03-10 14:01               ` Russell King - ARM Linux
2017-03-10 14:01                 ` Russell King - ARM Linux
2017-03-10 14:01                 ` Russell King - ARM Linux
2017-03-10 14:20                 ` Hans Verkuil
2017-03-10 14:20                   ` Hans Verkuil
2017-03-10 14:20                   ` Hans Verkuil
2017-03-10 15:53                   ` Mauro Carvalho Chehab
2017-03-10 15:53                     ` Mauro Carvalho Chehab
2017-03-10 15:53                     ` Mauro Carvalho Chehab
2017-03-10 22:37                     ` Sakari Ailus
2017-03-10 22:37                       ` Sakari Ailus
2017-03-10 22:37                       ` Sakari Ailus
2017-03-11 11:25                       ` Mauro Carvalho Chehab
2017-03-11 11:25                         ` Mauro Carvalho Chehab
2017-03-11 11:25                         ` Mauro Carvalho Chehab
2017-03-11 21:52                         ` Pavel Machek
2017-03-11 21:52                           ` Pavel Machek
2017-03-11 21:52                           ` Pavel Machek
2017-03-11 23:14                         ` Russell King - ARM Linux
2017-03-11 23:14                           ` Russell King - ARM Linux
2017-03-11 23:14                           ` Russell King - ARM Linux
2017-03-12  0:19                           ` Steve Longerbeam
2017-03-12  0:19                             ` Steve Longerbeam
2017-03-12  0:19                             ` Steve Longerbeam
2017-03-12 21:29                           ` Pavel Machek
2017-03-12 21:29                             ` Pavel Machek
2017-03-12 21:29                             ` Pavel Machek
2017-03-12 22:37                             ` Mauro Carvalho Chehab
2017-03-12 22:37                               ` Mauro Carvalho Chehab
2017-03-12 22:37                               ` Mauro Carvalho Chehab
2017-03-14 18:26                               ` Pavel Machek
2017-03-14 18:26                                 ` Pavel Machek
2017-03-14 18:26                                 ` Pavel Machek
2017-03-26 16:41                                 ` Laurent Pinchart
2017-03-13 12:46                         ` Sakari Ailus
2017-03-13 12:46                           ` Sakari Ailus
2017-03-13 12:46                           ` Sakari Ailus
2017-03-14  3:45                           ` Mauro Carvalho Chehab
2017-03-14  3:45                             ` Mauro Carvalho Chehab
2017-03-14  3:45                             ` Mauro Carvalho Chehab
2017-03-14  7:55                             ` Hans Verkuil
2017-03-14  7:55                               ` Hans Verkuil
2017-03-14  7:55                               ` Hans Verkuil
2017-03-14 10:21                               ` Mauro Carvalho Chehab
2017-03-14 10:21                                 ` Mauro Carvalho Chehab
2017-03-14 10:21                                 ` Mauro Carvalho Chehab
2017-03-14 22:32                                 ` media / v4l2-mc: wishlist for complex cameras (was Re: [PATCH v4 14/36] [media] v4l2-mc: add a function to inherit controls from a pipeline) Pavel Machek
2017-03-14 22:32                                   ` Pavel Machek
2017-03-14 22:32                                   ` Pavel Machek
2017-03-15  0:54                                   ` Mauro Carvalho Chehab
2017-03-15  0:54                                     ` Mauro Carvalho Chehab
2017-03-15  0:54                                     ` Mauro Carvalho Chehab
2017-03-15 10:50                                     ` Philippe De Muyter
2017-03-15 10:50                                       ` Philippe De Muyter
2017-03-15 10:50                                       ` Philippe De Muyter
2017-03-15 18:55                                       ` Nicolas Dufresne
2017-03-15 18:55                                         ` Nicolas Dufresne
2017-03-15 18:55                                         ` Nicolas Dufresne
2017-03-16  9:26                                         ` Philipp Zabel
2017-03-16  9:26                                           ` Philipp Zabel
2017-03-16  9:26                                           ` Philipp Zabel
2017-03-16  9:47                                           ` Philippe De Muyter
2017-03-16  9:47                                             ` Philippe De Muyter
2017-03-16  9:47                                             ` Philippe De Muyter
2017-03-16 10:01                                             ` Philipp Zabel
2017-03-16 10:01                                               ` Philipp Zabel
2017-03-16 10:01                                               ` Philipp Zabel
2017-03-16 10:19                                               ` Philippe De Muyter
2017-03-16 10:19                                                 ` Philippe De Muyter
2017-03-16 10:19                                                 ` Philippe De Muyter
2017-03-15 18:04                                     ` Pavel Machek
2017-03-15 18:04                                       ` Pavel Machek
2017-03-15 18:04                                       ` Pavel Machek
2017-03-15 20:26                                       ` Mauro Carvalho Chehab
2017-03-15 20:26                                         ` Mauro Carvalho Chehab
2017-03-15 20:26                                         ` Mauro Carvalho Chehab
2017-03-16 22:11                                         ` Pavel Machek
2017-03-16 22:11                                           ` Pavel Machek
2017-03-16 22:11                                           ` Pavel Machek
2017-03-20 13:24                                 ` [PATCH v4 14/36] [media] v4l2-mc: add a function to inherit controls from a pipeline Hans Verkuil
2017-03-20 13:24                                   ` Hans Verkuil
2017-03-20 13:24                                   ` Hans Verkuil
2017-03-20 15:39                                   ` Mauro Carvalho Chehab
2017-03-20 15:39                                     ` Mauro Carvalho Chehab
2017-03-20 15:39                                     ` Mauro Carvalho Chehab
2017-03-20 16:10                                     ` Russell King - ARM Linux
2017-03-20 16:10                                       ` Russell King - ARM Linux
2017-03-20 16:10                                       ` Russell King - ARM Linux
2017-03-20 17:37                                       ` Mauro Carvalho Chehab
2017-03-20 17:37                                         ` Mauro Carvalho Chehab
2017-03-20 17:37                                         ` Mauro Carvalho Chehab
2017-03-17 11:42                               ` Russell King - ARM Linux
2017-03-17 11:42                                 ` Russell King - ARM Linux
2017-03-17 11:42                                 ` Russell King - ARM Linux
2017-03-17 11:55                                 ` Sakari Ailus
2017-03-17 11:55                                   ` Sakari Ailus
2017-03-17 11:55                                   ` Sakari Ailus
2017-03-17 13:24                                   ` Mauro Carvalho Chehab
2017-03-17 13:24                                     ` Mauro Carvalho Chehab
2017-03-17 13:24                                     ` Mauro Carvalho Chehab
2017-03-17 13:51                                     ` Philipp Zabel
2017-03-17 13:51                                       ` Philipp Zabel
2017-03-17 13:51                                       ` Philipp Zabel
2017-03-17 14:37                                       ` Russell King - ARM Linux
2017-03-17 14:37                                         ` Russell King - ARM Linux
2017-03-17 14:37                                         ` Russell King - ARM Linux
2017-03-20 13:10                                         ` Hans Verkuil
2017-03-20 13:10                                           ` Hans Verkuil
2017-03-20 13:10                                           ` Hans Verkuil
2017-03-20 15:06                                           ` Mauro Carvalho Chehab
2017-03-20 15:06                                             ` Mauro Carvalho Chehab
2017-03-20 15:06                                             ` Mauro Carvalho Chehab
2017-03-21 11:11                                     ` Pavel Machek
2017-03-21 11:11                                       ` Pavel Machek
2017-03-21 11:11                                       ` Pavel Machek
2017-03-20 11:16                                   ` Hans Verkuil
2017-03-20 11:16                                     ` Hans Verkuil
2017-03-20 11:16                                     ` Hans Verkuil
2017-03-17 12:02                                 ` Philipp Zabel
2017-03-17 12:02                                   ` Philipp Zabel
2017-03-17 12:02                                   ` Philipp Zabel
2017-03-17 12:16                                   ` Russell King - ARM Linux
2017-03-17 12:16                                     ` Russell King - ARM Linux
2017-03-17 12:16                                     ` Russell King - ARM Linux
2017-03-17 17:49                                     ` Mauro Carvalho Chehab
2017-03-17 17:49                                       ` Mauro Carvalho Chehab
2017-03-17 17:49                                       ` Mauro Carvalho Chehab
2017-03-19 13:25                                 ` Pavel Machek
2017-03-19 13:25                                   ` Pavel Machek
2017-03-19 13:25                                   ` Pavel Machek
2017-03-26 16:44                               ` Laurent Pinchart
2017-03-26 16:44                                 ` Laurent Pinchart
2017-03-26 16:44                                 ` Laurent Pinchart
2017-03-10 15:26             ` Mauro Carvalho Chehab
2017-03-10 15:26               ` Mauro Carvalho Chehab
2017-03-10 15:26               ` Mauro Carvalho Chehab
2017-03-10 15:57               ` Russell King - ARM Linux
2017-03-10 15:57                 ` Russell King - ARM Linux
2017-03-10 15:57                 ` Russell King - ARM Linux
2017-03-10 17:06                 ` Russell King - ARM Linux
2017-03-10 17:06                   ` Russell King - ARM Linux
2017-03-10 17:06                   ` Russell King - ARM Linux
2017-03-10 20:42                 ` Mauro Carvalho Chehab
2017-03-10 20:42                   ` Mauro Carvalho Chehab
2017-03-10 20:42                   ` Mauro Carvalho Chehab
2017-03-10 21:55                   ` Pavel Machek
2017-03-10 21:55                     ` Pavel Machek
2017-03-10 21:55                     ` Pavel Machek
2017-03-10 15:09           ` Mauro Carvalho Chehab
2017-03-10 15:09             ` Mauro Carvalho Chehab
2017-03-10 15:09             ` Mauro Carvalho Chehab
2017-03-11 11:32             ` Hans Verkuil
2017-03-11 11:32               ` Hans Verkuil
2017-03-11 11:32               ` Hans Verkuil
2017-03-11 13:14               ` Mauro Carvalho Chehab
2017-03-11 13:14                 ` Mauro Carvalho Chehab
2017-03-11 13:14                 ` Mauro Carvalho Chehab
2017-03-11 15:32                 ` Sakari Ailus
2017-03-11 15:32                   ` Sakari Ailus
2017-03-11 15:32                   ` Sakari Ailus
2017-03-11 17:32                   ` Russell King - ARM Linux
2017-03-11 17:32                     ` Russell King - ARM Linux
2017-03-11 17:32                     ` Russell King - ARM Linux
2017-03-11 18:08                   ` Steve Longerbeam
2017-03-11 18:08                     ` Steve Longerbeam
2017-03-11 18:08                     ` Steve Longerbeam
2017-03-11 18:45                     ` Russell King - ARM Linux
2017-03-11 18:45                       ` Russell King - ARM Linux
2017-03-11 18:45                       ` Russell King - ARM Linux
2017-03-11 18:54                       ` Steve Longerbeam
2017-03-11 18:54                         ` Steve Longerbeam
2017-03-11 18:54                         ` Steve Longerbeam
2017-03-11 18:59                         ` Russell King - ARM Linux
2017-03-11 18:59                           ` Russell King - ARM Linux
2017-03-11 18:59                           ` Russell King - ARM Linux
2017-03-11 19:06                           ` Steve Longerbeam
2017-03-11 19:06                             ` Steve Longerbeam
2017-03-11 19:06                             ` Steve Longerbeam
2017-03-11 20:41                             ` Russell King - ARM Linux
2017-03-11 20:41                               ` Russell King - ARM Linux
2017-03-11 20:41                               ` Russell King - ARM Linux
2017-03-12  3:31                           ` Steve Longerbeam
2017-03-12  3:31                             ` Steve Longerbeam
2017-03-12  3:31                             ` Steve Longerbeam
2017-03-12  7:37                             ` Russell King - ARM Linux
2017-03-12  7:37                               ` Russell King - ARM Linux
2017-03-12  7:37                               ` Russell King - ARM Linux
2017-03-12 17:56                               ` Steve Longerbeam
2017-03-12 17:56                                 ` Steve Longerbeam
2017-03-12 17:56                                 ` Steve Longerbeam
2017-03-12 21:58                                 ` Mauro Carvalho Chehab
2017-03-12 21:58                                   ` Mauro Carvalho Chehab
2017-03-12 21:58                                   ` Mauro Carvalho Chehab
2017-03-26  9:12                                   ` script to setup pipeline was " Pavel Machek
2017-03-26  9:12                                     ` Pavel Machek
2017-03-26  9:12                                     ` Pavel Machek
2017-03-13 10:44                                 ` Hans Verkuil
2017-03-13 10:44                                   ` Hans Verkuil
2017-03-13 10:44                                   ` Hans Verkuil
2017-03-13 10:58                                   ` Russell King - ARM Linux
2017-03-13 10:58                                     ` Russell King - ARM Linux
2017-03-13 10:58                                     ` Russell King - ARM Linux
2017-03-13 11:08                                     ` Hans Verkuil
2017-03-13 11:08                                       ` Hans Verkuil
2017-03-13 11:08                                       ` Hans Verkuil
2017-03-13 11:42                                     ` Mauro Carvalho Chehab
2017-03-13 11:42                                       ` Mauro Carvalho Chehab
2017-03-13 11:42                                       ` Mauro Carvalho Chehab
2017-03-13 12:35                                       ` Russell King - ARM Linux
2017-03-13 12:35                                         ` Russell King - ARM Linux
2017-03-13 12:35                                         ` Russell King - ARM Linux
2017-03-12 18:14                               ` Pavel Machek
2017-03-12 18:14                                 ` Pavel Machek
2017-03-12 18:14                                 ` Pavel Machek
2017-03-11 20:26                     ` Pavel Machek
2017-03-11 20:26                       ` Pavel Machek
2017-03-11 20:26                       ` Pavel Machek
2017-03-11 20:33                       ` Steve Longerbeam
2017-03-11 20:33                         ` Steve Longerbeam
2017-03-11 20:33                         ` Steve Longerbeam
2017-03-11 21:30                 ` Pavel Machek
2017-03-11 21:30                   ` Pavel Machek
2017-03-11 21:30                   ` Pavel Machek
2017-02-16  2:19 ` [PATCH v4 15/36] platform: add video-multiplexer subdevice driver Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-19 22:02   ` Pavel Machek
2017-02-19 22:02     ` Pavel Machek
2017-02-19 22:02     ` Pavel Machek
2017-02-21  9:11     ` Philipp Zabel
2017-02-21  9:11       ` Philipp Zabel
2017-02-21  9:11       ` Philipp Zabel
2017-02-24 20:09       ` Pavel Machek
2017-02-24 20:09         ` Pavel Machek
2017-02-24 20:09         ` Pavel Machek
2017-02-27 14:41   ` Rob Herring
2017-02-27 14:41     ` Rob Herring
2017-02-27 14:41     ` Rob Herring
2017-03-01  0:20     ` Steve Longerbeam
2017-03-01  0:20       ` Steve Longerbeam
2017-03-01  0:20       ` Steve Longerbeam
2017-02-16  2:19 ` [PATCH v4 16/36] UAPI: Add media UAPI Kbuild file Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16  2:19 ` [PATCH v4 17/36] media: Add userspace header file for i.MX Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16 11:33   ` Philipp Zabel
2017-02-16 11:33     ` Philipp Zabel
2017-02-16 11:33     ` Philipp Zabel
2017-02-22 23:54     ` Steve Longerbeam
2017-02-22 23:54       ` Steve Longerbeam
2017-02-22 23:54       ` Steve Longerbeam
2017-02-16  2:19 ` [PATCH v4 18/36] media: Add i.MX media core driver Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16 10:27   ` Russell King - ARM Linux
2017-02-16 10:27     ` Russell King - ARM Linux
2017-02-16 10:27     ` Russell King - ARM Linux
2017-02-16 17:53     ` Steve Longerbeam
2017-02-16 17:53       ` Steve Longerbeam
2017-02-16 17:53       ` Steve Longerbeam
2017-02-16 13:02   ` Philipp Zabel
2017-02-16 13:02     ` Philipp Zabel
2017-02-16 13:02     ` Philipp Zabel
2017-02-16 13:44     ` Russell King - ARM Linux
2017-02-16 13:44       ` Russell King - ARM Linux
2017-02-16 13:44       ` Russell King - ARM Linux
2017-02-17  1:33     ` Steve Longerbeam
2017-02-17  1:33       ` Steve Longerbeam
2017-02-17  1:33       ` Steve Longerbeam
2017-02-17  8:34       ` Philipp Zabel
2017-02-17  8:34         ` Philipp Zabel
2017-02-17  8:34         ` Philipp Zabel
2017-02-16  2:19 ` Steve Longerbeam [this message]
2017-02-16  2:19   ` [PATCH v4 19/36] media: imx: Add Capture Device Interface Steve Longerbeam
2017-02-16  2:19 ` [PATCH v4 20/36] media: imx: Add CSI subdev driver Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16 11:52   ` Russell King - ARM Linux
2017-02-16 11:52     ` Russell King - ARM Linux
2017-02-16 11:52     ` Russell King - ARM Linux
2017-02-16 12:40     ` Russell King - ARM Linux
2017-02-16 12:40       ` Russell King - ARM Linux
2017-02-16 12:40       ` Russell King - ARM Linux
2017-02-16 13:09       ` Russell King - ARM Linux
2017-02-16 13:09         ` Russell King - ARM Linux
2017-02-16 13:09         ` Russell King - ARM Linux
2017-02-16 14:20         ` Russell King - ARM Linux
2017-02-16 14:20           ` Russell King - ARM Linux
2017-02-16 14:20           ` Russell King - ARM Linux
2017-02-16 19:07           ` Steve Longerbeam
2017-02-16 19:07             ` Steve Longerbeam
2017-02-16 19:07             ` Steve Longerbeam
2017-02-16 18:44       ` Steve Longerbeam
2017-02-16 18:44         ` Steve Longerbeam
2017-02-16 18:44         ` Steve Longerbeam
2017-02-16 19:09         ` Russell King - ARM Linux
2017-02-16 19:09           ` Russell King - ARM Linux
2017-02-16 19:09           ` Russell King - ARM Linux
2017-02-16  2:19 ` [PATCH v4 21/36] media: imx: Add VDIC " Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16  2:19 ` [PATCH v4 22/36] media: imx: Add IC subdev drivers Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16  2:19 ` [PATCH v4 23/36] media: imx: Add MIPI CSI-2 Receiver subdev driver Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16 10:28   ` Russell King - ARM Linux
2017-02-16 10:28     ` Russell King - ARM Linux
2017-02-16 10:28     ` Russell King - ARM Linux
2017-02-16 17:54     ` Steve Longerbeam
2017-02-16 17:54       ` Steve Longerbeam
2017-02-16 17:54       ` Steve Longerbeam
2017-02-17 10:47   ` Philipp Zabel
2017-02-17 10:47     ` Philipp Zabel
2017-02-17 10:47     ` Philipp Zabel
2017-02-17 11:06     ` Russell King - ARM Linux
2017-02-17 11:06       ` Russell King - ARM Linux
2017-02-17 11:06       ` Russell King - ARM Linux
2017-02-17 11:38       ` Philipp Zabel
2017-02-17 11:38         ` Philipp Zabel
2017-02-17 11:38         ` Philipp Zabel
2017-02-22 23:38         ` Steve Longerbeam
2017-02-22 23:38           ` Steve Longerbeam
2017-02-22 23:38           ` Steve Longerbeam
2017-02-22 23:41           ` Steve Longerbeam
2017-02-22 23:41             ` Steve Longerbeam
2017-02-22 23:41             ` Steve Longerbeam
2017-02-23  0:06       ` Steve Longerbeam
2017-02-23  0:06         ` Steve Longerbeam
2017-02-23  0:06         ` Steve Longerbeam
2017-02-23  0:09         ` Steve Longerbeam
2017-02-23  0:09           ` Steve Longerbeam
2017-02-23  0:09           ` Steve Longerbeam
2017-02-17 14:16     ` Philipp Zabel
2017-02-17 14:16       ` Philipp Zabel
2017-02-17 14:16       ` Philipp Zabel
2017-02-17 18:27       ` Steve Longerbeam
2017-02-17 18:27         ` Steve Longerbeam
2017-02-17 18:27         ` Steve Longerbeam
2017-02-16  2:19 ` [PATCH v4 24/36] [media] add Omnivision OV5640 sensor driver Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-27 14:45   ` Rob Herring
2017-02-27 14:45     ` Rob Herring
2017-02-27 14:45     ` Rob Herring
2017-03-01  0:43     ` Steve Longerbeam
2017-03-01  0:43       ` Steve Longerbeam
2017-03-01  0:43       ` Steve Longerbeam
2017-02-16  2:19 ` [PATCH v4 25/36] ARM: imx_v6_v7_defconfig: Enable staging video4linux drivers Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16  2:19 ` [PATCH v4 26/36] media: imx: add support for bayer formats Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16  2:19 ` [PATCH v4 27/36] media: imx: csi: " Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16  2:19 ` [PATCH v4 28/36] media: imx: csi: fix crop rectangle changes in set_fmt Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16 11:05   ` Russell King - ARM Linux
2017-02-16 11:05     ` Russell King - ARM Linux
2017-02-16 11:05     ` Russell King - ARM Linux
2017-02-16 18:16     ` Steve Longerbeam
2017-02-16 18:16       ` Steve Longerbeam
2017-02-16 18:16       ` Steve Longerbeam
2017-02-16  2:19 ` [PATCH v4 29/36] media: imx: mipi-csi2: enable setting and getting of frame rates Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-18  1:11   ` Steve Longerbeam
2017-02-18  1:11     ` Steve Longerbeam
2017-02-18  1:11     ` Steve Longerbeam
2017-02-18  1:12   ` Steve Longerbeam
2017-02-18  1:12     ` Steve Longerbeam
2017-02-18  1:12     ` Steve Longerbeam
2017-02-18  9:23     ` Russell King - ARM Linux
2017-02-18  9:23       ` Russell King - ARM Linux
2017-02-18  9:23       ` Russell King - ARM Linux
2017-02-18 17:29       ` Steve Longerbeam
2017-02-18 17:29         ` Steve Longerbeam
2017-02-18 17:29         ` Steve Longerbeam
2017-02-18 18:08         ` Russell King - ARM Linux
2017-02-18 18:08           ` Russell King - ARM Linux
2017-02-18 18:08           ` Russell King - ARM Linux
2017-02-20 22:04   ` Sakari Ailus
2017-02-20 22:04     ` Sakari Ailus
2017-02-20 22:04     ` Sakari Ailus
2017-02-20 22:56     ` Steve Longerbeam
2017-02-20 22:56       ` Steve Longerbeam
2017-02-20 22:56       ` Steve Longerbeam
2017-02-20 23:47       ` Steve Longerbeam
2017-02-20 23:47         ` Steve Longerbeam
2017-02-20 23:47         ` Steve Longerbeam
2017-02-21 12:15       ` Sakari Ailus
2017-02-21 12:15         ` Sakari Ailus
2017-02-21 12:15         ` Sakari Ailus
2017-02-21 22:21         ` Steve Longerbeam
2017-02-21 22:21           ` Steve Longerbeam
2017-02-21 22:21           ` Steve Longerbeam
2017-02-21 23:34           ` Steve Longerbeam
2017-02-21 23:34             ` Steve Longerbeam
2017-02-21 23:34             ` Steve Longerbeam
2017-02-21  0:13     ` Russell King - ARM Linux
2017-02-21  0:13       ` Russell King - ARM Linux
2017-02-21  0:13       ` Russell King - ARM Linux
2017-02-21  0:18       ` Steve Longerbeam
2017-02-21  0:18         ` Steve Longerbeam
2017-02-21  0:18         ` Steve Longerbeam
2017-02-21  8:50         ` Philipp Zabel
2017-02-21  8:50           ` Philipp Zabel
2017-02-21  8:50           ` Philipp Zabel
2017-03-13 13:16           ` Sakari Ailus
2017-03-13 13:16             ` Sakari Ailus
2017-03-13 13:16             ` Sakari Ailus
2017-03-13 13:27             ` Russell King - ARM Linux
2017-03-13 13:27               ` Russell King - ARM Linux
2017-03-13 13:27               ` Russell King - ARM Linux
2017-03-13 13:55               ` Philipp Zabel
2017-03-13 13:55                 ` Philipp Zabel
2017-03-13 13:55                 ` Philipp Zabel
2017-03-13 18:06                 ` Steve Longerbeam
2017-03-13 18:06                   ` Steve Longerbeam
2017-03-13 18:06                   ` Steve Longerbeam
2017-03-13 21:03                   ` Sakari Ailus
2017-03-13 21:03                     ` Sakari Ailus
2017-03-13 21:03                     ` Sakari Ailus
2017-03-13 21:29                     ` Russell King - ARM Linux
2017-03-13 21:29                       ` Russell King - ARM Linux
2017-03-13 21:29                       ` Russell King - ARM Linux
2017-03-14  7:34                     ` Hans Verkuil
2017-03-14  7:34                       ` Hans Verkuil
2017-03-14  7:34                       ` Hans Verkuil
2017-03-14 10:43                       ` Philipp Zabel
2017-03-14 10:43                         ` Philipp Zabel
2017-03-14 10:43                         ` Philipp Zabel
2017-03-13 20:56               ` Sakari Ailus
2017-03-13 20:56                 ` Sakari Ailus
2017-03-13 20:56                 ` Sakari Ailus
2017-03-13 21:07                 ` Russell King - ARM Linux
2017-03-13 21:07                   ` Russell King - ARM Linux
2017-03-13 21:07                   ` Russell King - ARM Linux
2017-02-21 12:37       ` Sakari Ailus
2017-02-21 12:37         ` Sakari Ailus
2017-02-21 12:37         ` Sakari Ailus
2017-02-21 13:21         ` Russell King - ARM Linux
2017-02-21 13:21           ` Russell King - ARM Linux
2017-02-21 13:21           ` Russell King - ARM Linux
2017-02-21 15:38           ` Sakari Ailus
2017-02-21 15:38             ` Sakari Ailus
2017-02-21 15:38             ` Sakari Ailus
2017-02-21 16:03             ` Russell King - ARM Linux
2017-02-21 16:03               ` Russell King - ARM Linux
2017-02-21 16:03               ` Russell King - ARM Linux
2017-02-21 16:15               ` Sakari Ailus
2017-02-21 16:15                 ` Sakari Ailus
2017-02-21 16:15                 ` Sakari Ailus
2017-02-16  2:19 ` [PATCH v4 30/36] media: imx: update capture dev format on IDMAC output pad set_fmt Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16 11:29   ` Philipp Zabel
2017-02-16 11:29     ` Philipp Zabel
2017-02-16 11:29     ` Philipp Zabel
2017-02-16  2:19 ` [PATCH v4 31/36] media: imx: csi: add __csi_get_fmt Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16  2:19 ` [PATCH v4 32/36] media: imx: csi/fim: add support for frame intervals Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16  2:38   ` Steve Longerbeam
2017-02-16  2:38     ` Steve Longerbeam
2017-02-16  2:38     ` Steve Longerbeam
2017-02-16  2:19 ` [PATCH v4 33/36] media: imx: redo pixel format enumeration and negotiation Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16 11:32   ` Philipp Zabel
2017-02-16 11:32     ` Philipp Zabel
2017-02-16 11:32     ` Philipp Zabel
2017-02-22 23:52     ` Steve Longerbeam
2017-02-22 23:52       ` Steve Longerbeam
2017-02-22 23:52       ` Steve Longerbeam
2017-02-23  9:10       ` Philipp Zabel
2017-02-23  9:10         ` Philipp Zabel
2017-02-23  9:10         ` Philipp Zabel
2017-02-24  1:30         ` Steve Longerbeam
2017-02-24  1:30           ` Steve Longerbeam
2017-02-24  1:30           ` Steve Longerbeam
2017-02-16  2:19 ` [PATCH v4 34/36] media: imx: csi: add frame skipping support Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16  2:19 ` [PATCH v4 35/36] media: imx: csi: fix crop rectangle reset in sink set_fmt Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16  2:19 ` [PATCH v4 36/36] media: imx: propagate sink pad formats to source pads Steve Longerbeam
2017-02-16  2:19   ` Steve Longerbeam
2017-02-16 11:29   ` Philipp Zabel
2017-02-16 11:29     ` Philipp Zabel
2017-02-16 11:29     ` Philipp Zabel
2017-02-16 18:19     ` Steve Longerbeam
2017-02-16 18:19       ` Steve Longerbeam
2017-02-16 18:19       ` Steve Longerbeam
2017-02-16 11:37 ` [PATCH v4 00/36] i.MX Media Driver Russell King - ARM Linux
2017-02-16 11:37   ` Russell King - ARM Linux
2017-02-16 11:37   ` Russell King - ARM Linux
2017-02-16 18:30   ` Steve Longerbeam
2017-02-16 18:30     ` Steve Longerbeam
2017-02-16 18:30     ` Steve Longerbeam
2017-02-16 22:20 ` Russell King - ARM Linux
2017-02-16 22:20   ` Russell King - ARM Linux
2017-02-16 22:20   ` Russell King - ARM Linux
2017-02-16 22:27   ` Steve Longerbeam
2017-02-16 22:27     ` Steve Longerbeam
2017-02-16 22:27     ` Steve Longerbeam
2017-02-16 22:57     ` Russell King - ARM Linux
2017-02-16 22:57       ` Russell King - ARM Linux
2017-02-16 22:57       ` Russell King - ARM Linux
2017-02-17 10:39       ` Philipp Zabel
2017-02-17 10:39         ` Philipp Zabel
2017-02-17 10:39         ` Philipp Zabel
2017-02-17 10:56         ` Russell King - ARM Linux
2017-02-17 10:56           ` Russell King - ARM Linux
2017-02-17 10:56           ` Russell King - ARM Linux
2017-02-17 11:21           ` Philipp Zabel
2017-02-17 11:21             ` Philipp Zabel
2017-02-17 11:21             ` Philipp Zabel
2017-02-18 17:21       ` Steve Longerbeam
2017-02-18 17:21         ` Steve Longerbeam
2017-02-18 17:21         ` Steve Longerbeam
2017-02-17 11:43     ` Philipp Zabel
2017-02-17 11:43       ` Philipp Zabel
2017-02-17 11:43       ` Philipp Zabel
2017-02-17 12:22       ` Sakari Ailus
2017-02-17 12:22         ` Sakari Ailus
2017-02-17 12:22         ` Sakari Ailus
2017-02-17 12:31         ` Russell King - ARM Linux
2017-02-17 12:31           ` Russell King - ARM Linux
2017-02-17 12:31           ` Russell King - ARM Linux
2017-02-17 15:04         ` Philipp Zabel
2017-02-17 15:04           ` Philipp Zabel
2017-02-17 15:04           ` Philipp Zabel
2017-02-18 11:58           ` Sakari Ailus
2017-02-18 11:58             ` Sakari Ailus
2017-02-18 11:58             ` Sakari Ailus

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1487211578-11360-20-git-send-email-steve_longerbeam@mentor.com \
    --to=slongerbeam@gmail.com \
    --cc=andrew-ct.chen@mediatek.com \
    --cc=arnd@arndb.de \
    --cc=bparrot@ti.com \
    --cc=devel@driverdev.osuosl.org \
    --cc=devicetree@vger.kernel.org \
    --cc=fabio.estevam@nxp.com \
    --cc=geert@linux-m68k.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=horms+renesas@verge.net.au \
    --cc=hverkuil@xs4all.nl \
    --cc=jean-christophe.trotin@st.com \
    --cc=kernel@pengutronix.de \
    --cc=laurent.pinchart+renesas@ideasonboard.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-media@vger.kernel.org \
    --cc=linux@armlinux.org.uk \
    --cc=mark.rutland@arm.com \
    --cc=markus.heiser@darmarIT.de \
    --cc=mchehab@kernel.org \
    --cc=minghsiu.tsai@mediatek.com \
    --cc=nick@shmanahar.org \
    --cc=niklas.soderlund+renesas@ragnatech.se \
    --cc=p.zabel@pengutronix.de \
    --cc=pavel@ucw.cz \
    --cc=robert.jarzmik@free.fr \
    --cc=robh+dt@kernel.org \
    --cc=sakari.ailus@linux.intel.com \
    --cc=shawnguo@kernel.org \
    --cc=shuah@kernel.org \
    --cc=songjun.wu@microchip.com \
    --cc=steve_longerbeam@mentor.com \
    --cc=sudipm.mukherjee@gmail.com \
    --cc=tiffany.lin@mediatek.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.