public inbox for linux-media@vger.kernel.org
 help / color / mirror / Atom feed
From: Magnus Damm <magnus.damm@gmail.com>
To: video4linux-list@redhat.com
Cc: akpm@linux-foundation.org, lethal@linux-sh.org,
	mchehab@infradead.org, linux-sh@vger.kernel.org
Subject: [PATCH 02/07] soc_camera: Let the host select videobuf_queue type
Date: Tue, 01 Jul 2008 21:46:57 +0900	[thread overview]
Message-ID: <20080701124657.30446.28078.sendpatchset@rx1.opensource.se> (raw)
In-Reply-To: <20080701124638.30446.81449.sendpatchset@rx1.opensource.se>

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@igel.co.jp>
---

 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@redhat.com?subject=unsubscribe
https://www.redhat.com/mailman/listinfo/video4linux-list

  parent reply	other threads:[~2008-07-01 12:46 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-07-01 12:46 [PATCH 00/07] soc_camera: SuperH Mobile CEU support Magnus Damm
2008-07-01 12:46 ` [PATCH 01/07] soc_camera: Remove default spinlock operations Magnus Damm
2008-07-01 12:46 ` Magnus Damm [this message]
2008-07-01 20:02   ` [PATCH 02/07] soc_camera: Let the host select videobuf_queue type Guennadi Liakhovetski
2008-07-02  2:50     ` Magnus Damm
2008-07-02  7:27   ` Paulius Zaleckas
2008-07-01 12:47 ` [PATCH 03/07] soc_camera: Remove vbq_ops and msize Magnus Damm
2008-07-01 12:47 ` [PATCH 04/07] soc_camera: Remove unused file lock pointer Magnus Damm
2008-07-01 12:47 ` [PATCH 05/07] soc_camera: Add 16-bit bus width support Magnus Damm
2008-07-01 12:47 ` [PATCH 06/07] videobuf: Add physically contiguous queue code Magnus Damm
2008-07-02  7:43   ` Paulius Zaleckas
     [not found]     ` <aec7e5c30807020232j1181ba9s43bc0e6920b18733@mail.gmail.com>
2008-07-02 10:42       ` Paulius Zaleckas
2008-07-04  9:08   ` Paulius Zaleckas
2008-07-01 12:47 ` [PATCH 07/07] sh_mobile_ceu_camera: Add SuperH Mobile CEU driver Magnus Damm
2008-07-01 20:07   ` Guennadi Liakhovetski
2008-07-02  3:08     ` Magnus Damm

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=20080701124657.30446.28078.sendpatchset@rx1.opensource.se \
    --to=magnus.damm@gmail.com \
    --cc=akpm@linux-foundation.org \
    --cc=lethal@linux-sh.org \
    --cc=linux-sh@vger.kernel.org \
    --cc=mchehab@infradead.org \
    --cc=video4linux-list@redhat.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox