lists.zerezo.com
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 02/07] soc_camera: Let the host select videobuf_queue type
- Date: Tue, 01 Jul 2008 21:46:57 +0900
- From: Magnus Damm <magnus.damm@xxxxxxxxx>
- Subject: [PATCH 02/07] soc_camera: Let the host select videobuf_queue type
This patch makes it possible for hosts (soc_camera drivers for the soc)
to select a different videobuf queue than VIDEOBUF_DMA_SG. This is needed
by the SuperH Mobile CEU hardware which requires physically contiguous
buffers. While at it, rename the spinlock callbacks to file callbacks.
Signed-off-by: Magnus Damm <damm@xxxxxxxxxx>
---
drivers/media/video/Kconfig | 4 ++--
drivers/media/video/pxa_camera.c | 15 ++++++++++++---
drivers/media/video/soc_camera.c | 27 +++++++--------------------
include/media/soc_camera.h | 6 +++---
4 files changed, 24 insertions(+), 28 deletions(-)
--- 0001/drivers/media/video/Kconfig
+++ work/drivers/media/video/Kconfig 2008-07-01 13:05:48.000000000 +0900
@@ -901,8 +901,7 @@ endif # V4L_USB_DRIVERS
config SOC_CAMERA
tristate "SoC camera support"
- depends on VIDEO_V4L2 && HAS_DMA
- select VIDEOBUF_DMA_SG
+ depends on VIDEO_V4L2
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
@@ -941,6 +940,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
--- 0001/drivers/media/video/pxa_camera.c
+++ work/drivers/media/video/pxa_camera.c 2008-07-01 13:03:56.000000000 +0900
@@ -31,6 +31,7 @@
#include <media/v4l2-common.h>
#include <media/v4l2-dev.h>
#include <media/soc_camera.h>
+#include <media/videobuf-dma-sg.h>
#include <linux/videodev2.h>
@@ -983,13 +984,21 @@ static int pxa_camera_querycap(struct so
return 0;
}
-static spinlock_t *pxa_camera_spinlock_alloc(struct soc_camera_file *icf)
+static int pxa_camera_file_alloc(struct soc_camera_file *icf)
{
struct soc_camera_host *ici =
to_soc_camera_host(icf->icd->dev.parent);
struct pxa_camera_dev *pcdev = ici->priv;
- return &pcdev->lock;
+ icf->lock = &pcdev->lock;
+
+ /* We must pass NULL as dev pointer, then all pci_* dma operations
+ * transform to normal dma_* ones. */
+ videobuf_queue_sg_init(&icf->vb_vidq, &pxa_videobuf_ops,
+ NULL, icf->lock,
+ V4L2_BUF_TYPE_VIDEO_CAPTURE, V4L2_FIELD_NONE,
+ sizeof(struct pxa_buffer), icf->icd);
+ return 0;
}
static struct soc_camera_host_ops pxa_soc_camera_host_ops = {
@@ -1003,7 +1012,7 @@ static struct soc_camera_host_ops pxa_so
.querycap = pxa_camera_querycap,
.try_bus_param = pxa_camera_try_bus_param,
.set_bus_param = pxa_camera_set_bus_param,
- .spinlock_alloc = pxa_camera_spinlock_alloc,
+ .file_alloc = pxa_camera_file_alloc,
};
/* Should be allocated dynamically too, but we have only one. */
--- 0005/drivers/media/video/soc_camera.c
+++ work/drivers/media/video/soc_camera.c 2008-07-01 13:03:56.000000000 +0900
@@ -182,7 +182,6 @@ static int soc_camera_open(struct inode
struct soc_camera_device *icd;
struct soc_camera_host *ici;
struct soc_camera_file *icf;
- spinlock_t *lock;
int ret;
icf = vmalloc(sizeof(*icf));
@@ -210,11 +209,9 @@ static int soc_camera_open(struct inode
icf->icd = icd;
- icf->lock = ici->ops->spinlock_alloc(icf);
- if (!icf->lock) {
- ret = -ENOMEM;
+ ret = ici->ops->file_alloc(icf);
+ if (ret)
goto esla;
- }
icd->use_count++;
@@ -232,21 +229,13 @@ static int soc_camera_open(struct inode
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);
-
return 0;
/* All errors are entered with the video_lock held */
eiciadd:
- lock = icf->lock;
+ if (ici->ops->file_free)
+ ici->ops->file_free(icf);
icf->lock = NULL;
- if (ici->ops->spinlock_free)
- ici->ops->spinlock_free(lock);
esla:
module_put(ici->ops->owner);
emgi:
@@ -263,15 +252,14 @@ static int soc_camera_close(struct inode
struct soc_camera_device *icd = icf->icd;
struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
struct video_device *vdev = icd->vdev;
- spinlock_t *lock = icf->lock;
mutex_lock(&video_lock);
icd->use_count--;
if (!icd->use_count)
ici->ops->remove(icd);
+ if (ici->ops->file_free)
+ ici->ops->file_free(icf);
icf->lock = NULL;
- if (ici->ops->spinlock_free)
- ici->ops->spinlock_free(lock);
module_put(icd->ops->owner);
module_put(ici->ops->owner);
mutex_unlock(&video_lock);
@@ -772,8 +760,7 @@ int soc_camera_host_register(struct soc_
int ret;
struct soc_camera_host *ix;
- if (!ici->vbq_ops || !ici->ops->add || !ici->ops->remove
- || !ici->ops->spinlock_alloc)
+ if (!ici->ops->add || !ici->ops->remove || !ici->ops->file_alloc)
return -EINVAL;
/* Number might be equal to the platform device ID */
--- 0001/include/media/soc_camera.h
+++ work/include/media/soc_camera.h 2008-07-01 13:03:56.000000000 +0900
@@ -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;
@@ -74,8 +74,8 @@ struct soc_camera_host_ops {
int (*try_bus_param)(struct soc_camera_device *, __u32);
int (*set_bus_param)(struct soc_camera_device *, __u32);
unsigned int (*poll)(struct file *, poll_table *);
- spinlock_t* (*spinlock_alloc)(struct soc_camera_file *);
- void (*spinlock_free)(spinlock_t *);
+ int (*file_alloc)(struct soc_camera_file *);
+ void (*file_free)(struct soc_camera_file *);
};
struct soc_camera_link {
--
video4linux-list mailing list
Unsubscribe mailto:video4linux-list-request@xxxxxxxxxx?subject=unsubscribe
https://www.redhat.com/mailman/listinfo/video4linux-list