Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 092d3921 authored by Paulius Zaleckas's avatar Paulius Zaleckas Committed by Mauro Carvalho Chehab
Browse files

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: default avatarPaulius Zaleckas <paulius.zaleckas@teltonika.lt>
Signed-off-by: default avatarGuennadi Liakhovetski <g.liakhovetski@pengutronix.de>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent 439d0e42
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -921,7 +921,7 @@ endif # V4L_USB_DRIVERS
config SOC_CAMERA
	tristate "SoC camera support"
	depends on VIDEO_V4L2 && HAS_DMA
	select VIDEOBUF_DMA_SG
	select VIDEOBUF_GEN
	help
	  SoC Camera is a common API to several cameras, not connecting
	  over a bus like PCI or USB. For example some i2c camera connected
@@ -960,6 +960,7 @@ config VIDEO_PXA27x
	tristate "PXA27x Quick Capture Interface driver"
	depends on VIDEO_DEV && PXA27x
	select SOC_CAMERA
	select VIDEOBUF_DMA_SG
	---help---
	  This is a v4l2 driver for the PXA27x Quick Capture Interface

+12 −2
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@

#include <media/v4l2-common.h>
#include <media/v4l2-dev.h>
#include <media/videobuf-dma-sg.h>
#include <media/soc_camera.h>

#include <linux/videodev2.h>
@@ -582,6 +583,16 @@ static struct videobuf_queue_ops pxa_videobuf_ops = {
	.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)
{
	unsigned int mclk_10khz = pcdev->platform_mclk_10khz;
@@ -998,6 +1009,7 @@ static struct soc_camera_host_ops pxa_soc_camera_host_ops = {
	.remove		= pxa_camera_remove_device,
	.set_fmt_cap	= pxa_camera_set_fmt_cap,
	.try_fmt_cap	= pxa_camera_try_fmt_cap,
	.init_videobuf	= pxa_camera_init_videobuf,
	.reqbufs	= pxa_camera_reqbufs,
	.poll		= pxa_camera_poll,
	.querycap	= pxa_camera_querycap,
@@ -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. */
static struct soc_camera_host pxa_soc_camera_host = {
	.drv_name		= PXA_CAM_DRV_NAME,
	.vbq_ops		= &pxa_videobuf_ops,
	.msize			= sizeof(struct pxa_buffer),
	.ops			= &pxa_soc_camera_host_ops,
};

+3 −6
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@

#include <media/v4l2-common.h>
#include <media/v4l2-dev.h>
#include <media/videobuf-core.h>
#include <media/soc_camera.h>

static LIST_HEAD(hosts);
@@ -233,11 +234,7 @@ static int soc_camera_open(struct inode *inode, struct file *file)
	file->private_data = icf;
	dev_dbg(&icd->dev, "camera device open\n");

	/* We must pass NULL as dev pointer, then all pci_* dma operations
	 * 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);
	ici->ops->init_videobuf(&icf->vb_vidq, icf->lock, icd);

	return 0;

@@ -787,7 +784,7 @@ int soc_camera_host_register(struct soc_camera_host *ici)
	int ret;
	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;

	/* Number might be equal to the platform device ID */
+3 −3
Original line number Diff line number Diff line
@@ -13,7 +13,7 @@
#define SOC_CAMERA_H

#include <linux/videodev2.h>
#include <media/videobuf-dma-sg.h>
#include <media/videobuf-core.h>

struct soc_camera_device {
	struct list_head list;
@@ -55,8 +55,6 @@ struct soc_camera_host {
	struct list_head list;
	struct device dev;
	unsigned char nr;				/* Host number */
	size_t msize;
	struct videobuf_queue_ops *vbq_ops;
	void *priv;
	char *drv_name;
	struct soc_camera_host_ops *ops;
@@ -69,6 +67,8 @@ struct soc_camera_host_ops {
	int (*set_fmt_cap)(struct soc_camera_device *, __u32,
			   struct v4l2_rect *);
	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 (*querycap)(struct soc_camera_host *, struct v4l2_capability *);
	int (*try_bus_param)(struct soc_camera_device *, __u32);