提交 092d3921 编写于 作者: P Paulius Zaleckas 提交者: Mauro Carvalho Chehab

V4L/DVB (8337): soc_camera: make videobuf independent

Makes SoC camera videobuf independent. Includes all necessary changes for
PXA camera driver (currently the only driver using soc_camera in the mainline).
These changes are important for the future soc_camera based drivers.
Signed-off-by: NPaulius Zaleckas <paulius.zaleckas@teltonika.lt>
Signed-off-by: NGuennadi Liakhovetski <g.liakhovetski@pengutronix.de>
Signed-off-by: NMauro Carvalho Chehab <mchehab@infradead.org>
上级 439d0e42
...@@ -921,7 +921,7 @@ endif # V4L_USB_DRIVERS ...@@ -921,7 +921,7 @@ endif # V4L_USB_DRIVERS
config SOC_CAMERA config SOC_CAMERA
tristate "SoC camera support" tristate "SoC camera support"
depends on VIDEO_V4L2 && HAS_DMA depends on VIDEO_V4L2 && HAS_DMA
select VIDEOBUF_DMA_SG select VIDEOBUF_GEN
help help
SoC Camera is a common API to several cameras, not connecting SoC Camera is a common API to several cameras, not connecting
over a bus like PCI or USB. For example some i2c camera connected over a bus like PCI or USB. For example some i2c camera connected
...@@ -960,6 +960,7 @@ config VIDEO_PXA27x ...@@ -960,6 +960,7 @@ config VIDEO_PXA27x
tristate "PXA27x Quick Capture Interface driver" tristate "PXA27x Quick Capture Interface driver"
depends on VIDEO_DEV && PXA27x depends on VIDEO_DEV && PXA27x
select SOC_CAMERA select SOC_CAMERA
select VIDEOBUF_DMA_SG
---help--- ---help---
This is a v4l2 driver for the PXA27x Quick Capture Interface This is a v4l2 driver for the PXA27x Quick Capture Interface
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include <media/v4l2-common.h> #include <media/v4l2-common.h>
#include <media/v4l2-dev.h> #include <media/v4l2-dev.h>
#include <media/videobuf-dma-sg.h>
#include <media/soc_camera.h> #include <media/soc_camera.h>
#include <linux/videodev2.h> #include <linux/videodev2.h>
...@@ -582,6 +583,16 @@ static struct videobuf_queue_ops pxa_videobuf_ops = { ...@@ -582,6 +583,16 @@ static struct videobuf_queue_ops pxa_videobuf_ops = {
.buf_release = pxa_videobuf_release, .buf_release = pxa_videobuf_release,
}; };
static void pxa_camera_init_videobuf(struct videobuf_queue *q, spinlock_t *lock,
struct soc_camera_device *icd)
{
/* We must pass NULL as dev pointer, then all pci_* dma operations
* transform to normal dma_* ones. */
videobuf_queue_sg_init(q, &pxa_videobuf_ops, NULL, lock,
V4L2_BUF_TYPE_VIDEO_CAPTURE, V4L2_FIELD_NONE,
sizeof(struct pxa_buffer), icd);
}
static int mclk_get_divisor(struct pxa_camera_dev *pcdev) static int mclk_get_divisor(struct pxa_camera_dev *pcdev)
{ {
unsigned int mclk_10khz = pcdev->platform_mclk_10khz; unsigned int mclk_10khz = pcdev->platform_mclk_10khz;
...@@ -998,6 +1009,7 @@ static struct soc_camera_host_ops pxa_soc_camera_host_ops = { ...@@ -998,6 +1009,7 @@ static struct soc_camera_host_ops pxa_soc_camera_host_ops = {
.remove = pxa_camera_remove_device, .remove = pxa_camera_remove_device,
.set_fmt_cap = pxa_camera_set_fmt_cap, .set_fmt_cap = pxa_camera_set_fmt_cap,
.try_fmt_cap = pxa_camera_try_fmt_cap, .try_fmt_cap = pxa_camera_try_fmt_cap,
.init_videobuf = pxa_camera_init_videobuf,
.reqbufs = pxa_camera_reqbufs, .reqbufs = pxa_camera_reqbufs,
.poll = pxa_camera_poll, .poll = pxa_camera_poll,
.querycap = pxa_camera_querycap, .querycap = pxa_camera_querycap,
...@@ -1009,8 +1021,6 @@ static struct soc_camera_host_ops pxa_soc_camera_host_ops = { ...@@ -1009,8 +1021,6 @@ static struct soc_camera_host_ops pxa_soc_camera_host_ops = {
/* Should be allocated dynamically too, but we have only one. */ /* Should be allocated dynamically too, but we have only one. */
static struct soc_camera_host pxa_soc_camera_host = { static struct soc_camera_host pxa_soc_camera_host = {
.drv_name = PXA_CAM_DRV_NAME, .drv_name = PXA_CAM_DRV_NAME,
.vbq_ops = &pxa_videobuf_ops,
.msize = sizeof(struct pxa_buffer),
.ops = &pxa_soc_camera_host_ops, .ops = &pxa_soc_camera_host_ops,
}; };
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include <media/v4l2-common.h> #include <media/v4l2-common.h>
#include <media/v4l2-dev.h> #include <media/v4l2-dev.h>
#include <media/videobuf-core.h>
#include <media/soc_camera.h> #include <media/soc_camera.h>
static LIST_HEAD(hosts); static LIST_HEAD(hosts);
...@@ -233,11 +234,7 @@ static int soc_camera_open(struct inode *inode, struct file *file) ...@@ -233,11 +234,7 @@ static int soc_camera_open(struct inode *inode, struct file *file)
file->private_data = icf; file->private_data = icf;
dev_dbg(&icd->dev, "camera device open\n"); dev_dbg(&icd->dev, "camera device open\n");
/* We must pass NULL as dev pointer, then all pci_* dma operations ici->ops->init_videobuf(&icf->vb_vidq, icf->lock, icd);
* transform to normal dma_* ones. */
videobuf_queue_sg_init(&icf->vb_vidq, ici->vbq_ops, NULL, icf->lock,
V4L2_BUF_TYPE_VIDEO_CAPTURE, V4L2_FIELD_NONE,
ici->msize, icd);
return 0; return 0;
...@@ -787,7 +784,7 @@ int soc_camera_host_register(struct soc_camera_host *ici) ...@@ -787,7 +784,7 @@ int soc_camera_host_register(struct soc_camera_host *ici)
int ret; int ret;
struct soc_camera_host *ix; struct soc_camera_host *ix;
if (!ici->vbq_ops || !ici->ops->add || !ici->ops->remove) if (!ici->ops->init_videobuf || !ici->ops->add || !ici->ops->remove)
return -EINVAL; return -EINVAL;
/* Number might be equal to the platform device ID */ /* Number might be equal to the platform device ID */
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
#define SOC_CAMERA_H #define SOC_CAMERA_H
#include <linux/videodev2.h> #include <linux/videodev2.h>
#include <media/videobuf-dma-sg.h> #include <media/videobuf-core.h>
struct soc_camera_device { struct soc_camera_device {
struct list_head list; struct list_head list;
...@@ -55,8 +55,6 @@ struct soc_camera_host { ...@@ -55,8 +55,6 @@ struct soc_camera_host {
struct list_head list; struct list_head list;
struct device dev; struct device dev;
unsigned char nr; /* Host number */ unsigned char nr; /* Host number */
size_t msize;
struct videobuf_queue_ops *vbq_ops;
void *priv; void *priv;
char *drv_name; char *drv_name;
struct soc_camera_host_ops *ops; struct soc_camera_host_ops *ops;
...@@ -69,6 +67,8 @@ struct soc_camera_host_ops { ...@@ -69,6 +67,8 @@ struct soc_camera_host_ops {
int (*set_fmt_cap)(struct soc_camera_device *, __u32, int (*set_fmt_cap)(struct soc_camera_device *, __u32,
struct v4l2_rect *); struct v4l2_rect *);
int (*try_fmt_cap)(struct soc_camera_device *, struct v4l2_format *); int (*try_fmt_cap)(struct soc_camera_device *, struct v4l2_format *);
void (*init_videobuf)(struct videobuf_queue*, spinlock_t *,
struct soc_camera_device *);
int (*reqbufs)(struct soc_camera_file *, struct v4l2_requestbuffers *); int (*reqbufs)(struct soc_camera_file *, struct v4l2_requestbuffers *);
int (*querycap)(struct soc_camera_host *, struct v4l2_capability *); int (*querycap)(struct soc_camera_host *, struct v4l2_capability *);
int (*try_bus_param)(struct soc_camera_device *, __u32); int (*try_bus_param)(struct soc_camera_device *, __u32);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册