[media] v4l: soc-camera: Remove videobuf1 support
All remaining soc-camera drivers use videobuf2, drop support for videobuf1. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> [hans.verkuil@cisco.com: also drop 'select VIDEOBUF_GEN' from Kconfig] Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
This commit is contained in:
parent
e8a2a41ee2
commit
73a0159920
|
@ -1,7 +1,6 @@
|
||||||
config SOC_CAMERA
|
config SOC_CAMERA
|
||||||
tristate "SoC camera support"
|
tristate "SoC camera support"
|
||||||
depends on VIDEO_V4L2 && HAS_DMA && I2C
|
depends on VIDEO_V4L2 && HAS_DMA && I2C
|
||||||
select VIDEOBUF_GEN
|
|
||||||
select VIDEOBUF2_CORE
|
select VIDEOBUF2_CORE
|
||||||
help
|
help
|
||||||
SoC Camera is a common API to several cameras, not connecting
|
SoC Camera is a common API to several cameras, not connecting
|
||||||
|
|
|
@ -37,18 +37,12 @@
|
||||||
#include <media/v4l2-ioctl.h>
|
#include <media/v4l2-ioctl.h>
|
||||||
#include <media/v4l2-dev.h>
|
#include <media/v4l2-dev.h>
|
||||||
#include <media/v4l2-of.h>
|
#include <media/v4l2-of.h>
|
||||||
#include <media/videobuf-core.h>
|
|
||||||
#include <media/videobuf2-v4l2.h>
|
#include <media/videobuf2-v4l2.h>
|
||||||
|
|
||||||
/* Default to VGA resolution */
|
/* Default to VGA resolution */
|
||||||
#define DEFAULT_WIDTH 640
|
#define DEFAULT_WIDTH 640
|
||||||
#define DEFAULT_HEIGHT 480
|
#define DEFAULT_HEIGHT 480
|
||||||
|
|
||||||
#define is_streaming(ici, icd) \
|
|
||||||
(((ici)->ops->init_videobuf) ? \
|
|
||||||
(icd)->vb_vidq.streaming : \
|
|
||||||
vb2_is_streaming(&(icd)->vb2_vidq))
|
|
||||||
|
|
||||||
#define MAP_MAX_NUM 32
|
#define MAP_MAX_NUM 32
|
||||||
static DECLARE_BITMAP(device_map, MAP_MAX_NUM);
|
static DECLARE_BITMAP(device_map, MAP_MAX_NUM);
|
||||||
static LIST_HEAD(hosts);
|
static LIST_HEAD(hosts);
|
||||||
|
@ -367,23 +361,13 @@ static int soc_camera_reqbufs(struct file *file, void *priv,
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
struct soc_camera_device *icd = file->private_data;
|
struct soc_camera_device *icd = file->private_data;
|
||||||
struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
|
|
||||||
|
|
||||||
WARN_ON(priv != file->private_data);
|
WARN_ON(priv != file->private_data);
|
||||||
|
|
||||||
if (icd->streamer && icd->streamer != file)
|
if (icd->streamer && icd->streamer != file)
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
|
|
||||||
if (ici->ops->init_videobuf) {
|
ret = vb2_reqbufs(&icd->vb2_vidq, p);
|
||||||
ret = videobuf_reqbufs(&icd->vb_vidq, p);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
ret = ici->ops->reqbufs(icd, p);
|
|
||||||
} else {
|
|
||||||
ret = vb2_reqbufs(&icd->vb2_vidq, p);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ret)
|
if (!ret)
|
||||||
icd->streamer = p->count ? file : NULL;
|
icd->streamer = p->count ? file : NULL;
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -393,61 +377,44 @@ static int soc_camera_querybuf(struct file *file, void *priv,
|
||||||
struct v4l2_buffer *p)
|
struct v4l2_buffer *p)
|
||||||
{
|
{
|
||||||
struct soc_camera_device *icd = file->private_data;
|
struct soc_camera_device *icd = file->private_data;
|
||||||
struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
|
|
||||||
|
|
||||||
WARN_ON(priv != file->private_data);
|
WARN_ON(priv != file->private_data);
|
||||||
|
|
||||||
if (ici->ops->init_videobuf)
|
return vb2_querybuf(&icd->vb2_vidq, p);
|
||||||
return videobuf_querybuf(&icd->vb_vidq, p);
|
|
||||||
else
|
|
||||||
return vb2_querybuf(&icd->vb2_vidq, p);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int soc_camera_qbuf(struct file *file, void *priv,
|
static int soc_camera_qbuf(struct file *file, void *priv,
|
||||||
struct v4l2_buffer *p)
|
struct v4l2_buffer *p)
|
||||||
{
|
{
|
||||||
struct soc_camera_device *icd = file->private_data;
|
struct soc_camera_device *icd = file->private_data;
|
||||||
struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
|
|
||||||
|
|
||||||
WARN_ON(priv != file->private_data);
|
WARN_ON(priv != file->private_data);
|
||||||
|
|
||||||
if (icd->streamer != file)
|
if (icd->streamer != file)
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
|
|
||||||
if (ici->ops->init_videobuf)
|
return vb2_qbuf(&icd->vb2_vidq, p);
|
||||||
return videobuf_qbuf(&icd->vb_vidq, p);
|
|
||||||
else
|
|
||||||
return vb2_qbuf(&icd->vb2_vidq, p);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int soc_camera_dqbuf(struct file *file, void *priv,
|
static int soc_camera_dqbuf(struct file *file, void *priv,
|
||||||
struct v4l2_buffer *p)
|
struct v4l2_buffer *p)
|
||||||
{
|
{
|
||||||
struct soc_camera_device *icd = file->private_data;
|
struct soc_camera_device *icd = file->private_data;
|
||||||
struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
|
|
||||||
|
|
||||||
WARN_ON(priv != file->private_data);
|
WARN_ON(priv != file->private_data);
|
||||||
|
|
||||||
if (icd->streamer != file)
|
if (icd->streamer != file)
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
|
|
||||||
if (ici->ops->init_videobuf)
|
return vb2_dqbuf(&icd->vb2_vidq, p, file->f_flags & O_NONBLOCK);
|
||||||
return videobuf_dqbuf(&icd->vb_vidq, p, file->f_flags & O_NONBLOCK);
|
|
||||||
else
|
|
||||||
return vb2_dqbuf(&icd->vb2_vidq, p, file->f_flags & O_NONBLOCK);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int soc_camera_create_bufs(struct file *file, void *priv,
|
static int soc_camera_create_bufs(struct file *file, void *priv,
|
||||||
struct v4l2_create_buffers *create)
|
struct v4l2_create_buffers *create)
|
||||||
{
|
{
|
||||||
struct soc_camera_device *icd = file->private_data;
|
struct soc_camera_device *icd = file->private_data;
|
||||||
struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/* videobuf2 only */
|
|
||||||
if (ici->ops->init_videobuf)
|
|
||||||
return -ENOTTY;
|
|
||||||
|
|
||||||
if (icd->streamer && icd->streamer != file)
|
if (icd->streamer && icd->streamer != file)
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
|
|
||||||
|
@ -461,24 +428,14 @@ static int soc_camera_prepare_buf(struct file *file, void *priv,
|
||||||
struct v4l2_buffer *b)
|
struct v4l2_buffer *b)
|
||||||
{
|
{
|
||||||
struct soc_camera_device *icd = file->private_data;
|
struct soc_camera_device *icd = file->private_data;
|
||||||
struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
|
|
||||||
|
|
||||||
/* videobuf2 only */
|
return vb2_prepare_buf(&icd->vb2_vidq, b);
|
||||||
if (ici->ops->init_videobuf)
|
|
||||||
return -EINVAL;
|
|
||||||
else
|
|
||||||
return vb2_prepare_buf(&icd->vb2_vidq, b);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int soc_camera_expbuf(struct file *file, void *priv,
|
static int soc_camera_expbuf(struct file *file, void *priv,
|
||||||
struct v4l2_exportbuffer *p)
|
struct v4l2_exportbuffer *p)
|
||||||
{
|
{
|
||||||
struct soc_camera_device *icd = file->private_data;
|
struct soc_camera_device *icd = file->private_data;
|
||||||
struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
|
|
||||||
|
|
||||||
/* videobuf2 only */
|
|
||||||
if (ici->ops->init_videobuf)
|
|
||||||
return -ENOTTY;
|
|
||||||
|
|
||||||
if (icd->streamer && icd->streamer != file)
|
if (icd->streamer && icd->streamer != file)
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
|
@ -602,8 +559,6 @@ static int soc_camera_set_fmt(struct soc_camera_device *icd,
|
||||||
icd->sizeimage = pix->sizeimage;
|
icd->sizeimage = pix->sizeimage;
|
||||||
icd->colorspace = pix->colorspace;
|
icd->colorspace = pix->colorspace;
|
||||||
icd->field = pix->field;
|
icd->field = pix->field;
|
||||||
if (ici->ops->init_videobuf)
|
|
||||||
icd->vb_vidq.field = pix->field;
|
|
||||||
|
|
||||||
dev_dbg(icd->pdev, "set width: %d height: %d\n",
|
dev_dbg(icd->pdev, "set width: %d height: %d\n",
|
||||||
icd->user_width, icd->user_height);
|
icd->user_width, icd->user_height);
|
||||||
|
@ -745,13 +700,9 @@ static int soc_camera_open(struct file *file)
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto esfmt;
|
goto esfmt;
|
||||||
|
|
||||||
if (ici->ops->init_videobuf) {
|
ret = ici->ops->init_videobuf2(&icd->vb2_vidq, icd);
|
||||||
ici->ops->init_videobuf(&icd->vb_vidq, icd);
|
if (ret < 0)
|
||||||
} else {
|
goto einitvb;
|
||||||
ret = ici->ops->init_videobuf2(&icd->vb2_vidq, icd);
|
|
||||||
if (ret < 0)
|
|
||||||
goto einitvb;
|
|
||||||
}
|
|
||||||
v4l2_ctrl_handler_setup(&icd->ctrl_handler);
|
v4l2_ctrl_handler_setup(&icd->ctrl_handler);
|
||||||
}
|
}
|
||||||
mutex_unlock(&ici->host_lock);
|
mutex_unlock(&ici->host_lock);
|
||||||
|
@ -842,10 +793,7 @@ static int soc_camera_mmap(struct file *file, struct vm_area_struct *vma)
|
||||||
|
|
||||||
if (mutex_lock_interruptible(&ici->host_lock))
|
if (mutex_lock_interruptible(&ici->host_lock))
|
||||||
return -ERESTARTSYS;
|
return -ERESTARTSYS;
|
||||||
if (ici->ops->init_videobuf)
|
err = vb2_mmap(&icd->vb2_vidq, vma);
|
||||||
err = videobuf_mmap_mapper(&icd->vb_vidq, vma);
|
|
||||||
else
|
|
||||||
err = vb2_mmap(&icd->vb2_vidq, vma);
|
|
||||||
mutex_unlock(&ici->host_lock);
|
mutex_unlock(&ici->host_lock);
|
||||||
|
|
||||||
dev_dbg(icd->pdev, "vma start=0x%08lx, size=%ld, ret=%d\n",
|
dev_dbg(icd->pdev, "vma start=0x%08lx, size=%ld, ret=%d\n",
|
||||||
|
@ -866,10 +814,7 @@ static unsigned int soc_camera_poll(struct file *file, poll_table *pt)
|
||||||
return POLLERR;
|
return POLLERR;
|
||||||
|
|
||||||
mutex_lock(&ici->host_lock);
|
mutex_lock(&ici->host_lock);
|
||||||
if (ici->ops->init_videobuf && list_empty(&icd->vb_vidq.stream))
|
res = ici->ops->poll(file, pt);
|
||||||
dev_err(icd->pdev, "Trying to poll with no queued buffers!\n");
|
|
||||||
else
|
|
||||||
res = ici->ops->poll(file, pt);
|
|
||||||
mutex_unlock(&ici->host_lock);
|
mutex_unlock(&ici->host_lock);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
@ -900,7 +845,7 @@ static int soc_camera_s_fmt_vid_cap(struct file *file, void *priv,
|
||||||
if (icd->streamer && icd->streamer != file)
|
if (icd->streamer && icd->streamer != file)
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
|
|
||||||
if (is_streaming(to_soc_camera_host(icd->parent), icd)) {
|
if (vb2_is_streaming(&icd->vb2_vidq)) {
|
||||||
dev_err(icd->pdev, "S_FMT denied: queue initialised\n");
|
dev_err(icd->pdev, "S_FMT denied: queue initialised\n");
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
|
@ -971,7 +916,6 @@ static int soc_camera_streamon(struct file *file, void *priv,
|
||||||
enum v4l2_buf_type i)
|
enum v4l2_buf_type i)
|
||||||
{
|
{
|
||||||
struct soc_camera_device *icd = file->private_data;
|
struct soc_camera_device *icd = file->private_data;
|
||||||
struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
|
|
||||||
struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
|
struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
@ -983,12 +927,8 @@ static int soc_camera_streamon(struct file *file, void *priv,
|
||||||
if (icd->streamer != file)
|
if (icd->streamer != file)
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
|
|
||||||
/* This calls buf_queue from host driver's videobuf_queue_ops */
|
/* This calls buf_queue from host driver's videobuf2_queue_ops */
|
||||||
if (ici->ops->init_videobuf)
|
ret = vb2_streamon(&icd->vb2_vidq, i);
|
||||||
ret = videobuf_streamon(&icd->vb_vidq);
|
|
||||||
else
|
|
||||||
ret = vb2_streamon(&icd->vb2_vidq, i);
|
|
||||||
|
|
||||||
if (!ret)
|
if (!ret)
|
||||||
v4l2_subdev_call(sd, video, s_stream, 1);
|
v4l2_subdev_call(sd, video, s_stream, 1);
|
||||||
|
|
||||||
|
@ -1000,7 +940,6 @@ static int soc_camera_streamoff(struct file *file, void *priv,
|
||||||
{
|
{
|
||||||
struct soc_camera_device *icd = file->private_data;
|
struct soc_camera_device *icd = file->private_data;
|
||||||
struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
|
struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
|
||||||
struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
WARN_ON(priv != file->private_data);
|
WARN_ON(priv != file->private_data);
|
||||||
|
@ -1012,13 +951,10 @@ static int soc_camera_streamoff(struct file *file, void *priv,
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This calls buf_release from host driver's videobuf_queue_ops for all
|
* This calls buf_release from host driver's videobuf2_queue_ops for all
|
||||||
* remaining buffers. When the last buffer is freed, stop capture
|
* remaining buffers. When the last buffer is freed, stop capture
|
||||||
*/
|
*/
|
||||||
if (ici->ops->init_videobuf)
|
ret = vb2_streamoff(&icd->vb2_vidq, i);
|
||||||
ret = videobuf_streamoff(&icd->vb_vidq);
|
|
||||||
else
|
|
||||||
ret = vb2_streamoff(&icd->vb2_vidq, i);
|
|
||||||
|
|
||||||
v4l2_subdev_call(sd, video, s_stream, 0);
|
v4l2_subdev_call(sd, video, s_stream, 0);
|
||||||
|
|
||||||
|
@ -1053,7 +989,7 @@ static int soc_camera_s_selection(struct file *file, void *fh,
|
||||||
|
|
||||||
if (s->target == V4L2_SEL_TGT_COMPOSE) {
|
if (s->target == V4L2_SEL_TGT_COMPOSE) {
|
||||||
/* No output size change during a running capture! */
|
/* No output size change during a running capture! */
|
||||||
if (is_streaming(ici, icd) &&
|
if (vb2_is_streaming(&icd->vb2_vidq) &&
|
||||||
(icd->user_width != s->r.width ||
|
(icd->user_width != s->r.width ||
|
||||||
icd->user_height != s->r.height))
|
icd->user_height != s->r.height))
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
|
@ -1066,7 +1002,8 @@ static int soc_camera_s_selection(struct file *file, void *fh,
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s->target == V4L2_SEL_TGT_CROP && is_streaming(ici, icd) &&
|
if (s->target == V4L2_SEL_TGT_CROP &&
|
||||||
|
vb2_is_streaming(&icd->vb2_vidq) &&
|
||||||
ici->ops->set_liveselection)
|
ici->ops->set_liveselection)
|
||||||
ret = ici->ops->set_liveselection(icd, s);
|
ret = ici->ops->set_liveselection(icd, s);
|
||||||
else
|
else
|
||||||
|
@ -1910,9 +1847,7 @@ int soc_camera_host_register(struct soc_camera_host *ici)
|
||||||
!ici->ops->set_fmt ||
|
!ici->ops->set_fmt ||
|
||||||
!ici->ops->set_bus_param ||
|
!ici->ops->set_bus_param ||
|
||||||
!ici->ops->querycap ||
|
!ici->ops->querycap ||
|
||||||
((!ici->ops->init_videobuf ||
|
!ici->ops->init_videobuf2 ||
|
||||||
!ici->ops->reqbufs) &&
|
|
||||||
!ici->ops->init_videobuf2) ||
|
|
||||||
!ici->ops->poll ||
|
!ici->ops->poll ||
|
||||||
!ici->v4l2_dev.dev)
|
!ici->v4l2_dev.dev)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
#include <linux/mutex.h>
|
#include <linux/mutex.h>
|
||||||
#include <linux/pm.h>
|
#include <linux/pm.h>
|
||||||
#include <linux/videodev2.h>
|
#include <linux/videodev2.h>
|
||||||
#include <media/videobuf-core.h>
|
|
||||||
#include <media/videobuf2-v4l2.h>
|
#include <media/videobuf2-v4l2.h>
|
||||||
#include <media/v4l2-async.h>
|
#include <media/v4l2-async.h>
|
||||||
#include <media/v4l2-ctrls.h>
|
#include <media/v4l2-ctrls.h>
|
||||||
|
@ -55,10 +54,7 @@ struct soc_camera_device {
|
||||||
/* Asynchronous subdevice management */
|
/* Asynchronous subdevice management */
|
||||||
struct soc_camera_async_client *sasc;
|
struct soc_camera_async_client *sasc;
|
||||||
/* video buffer queue */
|
/* video buffer queue */
|
||||||
union {
|
struct vb2_queue vb2_vidq;
|
||||||
struct videobuf_queue vb_vidq;
|
|
||||||
struct vb2_queue vb2_vidq;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Host supports programmable stride */
|
/* Host supports programmable stride */
|
||||||
|
@ -114,11 +110,8 @@ struct soc_camera_host_ops {
|
||||||
int (*set_liveselection)(struct soc_camera_device *, struct v4l2_selection *);
|
int (*set_liveselection)(struct soc_camera_device *, struct v4l2_selection *);
|
||||||
int (*set_fmt)(struct soc_camera_device *, struct v4l2_format *);
|
int (*set_fmt)(struct soc_camera_device *, struct v4l2_format *);
|
||||||
int (*try_fmt)(struct soc_camera_device *, struct v4l2_format *);
|
int (*try_fmt)(struct soc_camera_device *, struct v4l2_format *);
|
||||||
void (*init_videobuf)(struct videobuf_queue *,
|
|
||||||
struct soc_camera_device *);
|
|
||||||
int (*init_videobuf2)(struct vb2_queue *,
|
int (*init_videobuf2)(struct vb2_queue *,
|
||||||
struct soc_camera_device *);
|
struct soc_camera_device *);
|
||||||
int (*reqbufs)(struct soc_camera_device *, struct v4l2_requestbuffers *);
|
|
||||||
int (*querycap)(struct soc_camera_host *, struct v4l2_capability *);
|
int (*querycap)(struct soc_camera_host *, struct v4l2_capability *);
|
||||||
int (*set_bus_param)(struct soc_camera_device *);
|
int (*set_bus_param)(struct soc_camera_device *);
|
||||||
int (*get_parm)(struct soc_camera_device *, struct v4l2_streamparm *);
|
int (*get_parm)(struct soc_camera_device *, struct v4l2_streamparm *);
|
||||||
|
@ -396,11 +389,6 @@ static inline struct soc_camera_device *soc_camera_from_vb2q(const struct vb2_qu
|
||||||
return container_of(vq, struct soc_camera_device, vb2_vidq);
|
return container_of(vq, struct soc_camera_device, vb2_vidq);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline struct soc_camera_device *soc_camera_from_vbq(const struct videobuf_queue *vq)
|
|
||||||
{
|
|
||||||
return container_of(vq, struct soc_camera_device, vb_vidq);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline u32 soc_camera_grp_id(const struct soc_camera_device *icd)
|
static inline u32 soc_camera_grp_id(const struct soc_camera_device *icd)
|
||||||
{
|
{
|
||||||
return (icd->iface << 8) | (icd->devnum + 1);
|
return (icd->iface << 8) | (icd->devnum + 1);
|
||||||
|
|
Loading…
Reference in New Issue