The patch number 8338 was added via Magnus Damm <[EMAIL PROTECTED]>
to http://linuxtv.org/hg/v4l-dvb master development tree.

Kernel patches in this development tree may be modified to be backward
compatible with older kernels. Compatibility modifications will be
removed before inclusion into the mainstream Kernel

If anyone has any objections, please let us know by sending a message to:
        [EMAIL PROTECTED]

------

soc_camera: Move spinlocks
This patch moves the spinlock handling from soc_camera.c to the actual
camera host driver. The spinlock_alloc/free callbacks are replaced with
code in init_videobuf(). So far all camera host drivers implement their
own spinlock_alloc/free methods anyway, and videobuf_queue_core_init()
BUGs on a NULL spinlock argument, so, new camera host drivers will not
forget to provide a spinlock when initialising their videobuf queues.

Signed-off-by: Magnus Damm <[EMAIL PROTECTED]>
Signed-off-by: Guennadi Liakhovetski <[EMAIL PROTECTED]>
---

 drivers/media/video/pxa_camera.c |   17 ++++------------
 drivers/media/video/soc_camera.c |   39 --------------------------------------
 include/media/soc_camera.h       |    5 ----
 3 files changed, 7 insertions(+), 54 deletions(-)


---

 linux/drivers/media/video/pxa_camera.c |   17 +++-------
 linux/drivers/media/video/soc_camera.c |   39 -------------------------
 linux/include/media/soc_camera.h       |    5 ---
 3 files changed, 7 insertions(+), 54 deletions(-)

diff -r d0b324ba2360 -r e2fb01d722d9 linux/drivers/media/video/pxa_camera.c
--- a/linux/drivers/media/video/pxa_camera.c    Fri Jul 11 22:50:31 2008 +0200
+++ b/linux/drivers/media/video/pxa_camera.c    Fri Jul 11 22:59:34 2008 +0200
@@ -583,12 +583,15 @@ static struct videobuf_queue_ops pxa_vid
        .buf_release    = pxa_videobuf_release,
 };
 
-static void pxa_camera_init_videobuf(struct videobuf_queue *q, spinlock_t 
*lock,
+static void pxa_camera_init_videobuf(struct videobuf_queue *q,
                              struct soc_camera_device *icd)
 {
+       struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
+       struct pxa_camera_dev *pcdev = ici->priv;
+
        /* 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,
+       videobuf_queue_sg_init(q, &pxa_videobuf_ops, NULL, &pcdev->lock,
                                V4L2_BUF_TYPE_VIDEO_CAPTURE, V4L2_FIELD_NONE,
                                sizeof(struct pxa_buffer), icd);
 }
@@ -994,15 +997,6 @@ static int pxa_camera_querycap(struct so
        return 0;
 }
 
-static spinlock_t *pxa_camera_spinlock_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;
-}
-
 static struct soc_camera_host_ops pxa_soc_camera_host_ops = {
        .owner          = THIS_MODULE,
        .add            = pxa_camera_add_device,
@@ -1015,7 +1009,6 @@ 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,
 };
 
 /* Should be allocated dynamically too, but we have only one. */
diff -r d0b324ba2360 -r e2fb01d722d9 linux/drivers/media/video/soc_camera.c
--- a/linux/drivers/media/video/soc_camera.c    Fri Jul 11 22:50:31 2008 +0200
+++ b/linux/drivers/media/video/soc_camera.c    Fri Jul 11 22:59:34 2008 +0200
@@ -183,7 +183,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,13 +209,6 @@ static int soc_camera_open(struct inode 
        }
 
        icf->icd = icd;
-
-       icf->lock = ici->ops->spinlock_alloc(icf);
-       if (!icf->lock) {
-               ret = -ENOMEM;
-               goto esla;
-       }
-
        icd->use_count++;
 
        /* Now we really have to activate the camera */
@@ -234,17 +226,12 @@ static int soc_camera_open(struct inode 
        file->private_data = icf;
        dev_dbg(&icd->dev, "camera device open\n");
 
-       ici->ops->init_videobuf(&icf->vb_vidq, icf->lock, icd);
+       ici->ops->init_videobuf(&icf->vb_vidq, icd);
 
        return 0;
 
        /* All errors are entered with the video_lock held */
 eiciadd:
-       lock = icf->lock;
-       icf->lock = NULL;
-       if (ici->ops->spinlock_free)
-               ici->ops->spinlock_free(lock);
-esla:
        module_put(ici->ops->owner);
 emgi:
        module_put(icd->ops->owner);
@@ -260,15 +247,11 @@ 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);
-       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);
@@ -764,21 +747,6 @@ static void dummy_release(struct device 
 {
 }
 
-static spinlock_t *spinlock_alloc(struct soc_camera_file *icf)
-{
-       spinlock_t *lock = kmalloc(sizeof(spinlock_t), GFP_KERNEL);
-
-       if (lock)
-               spin_lock_init(lock);
-
-       return lock;
-}
-
-static void spinlock_free(spinlock_t *lock)
-{
-       kfree(lock);
-}
-
 int soc_camera_host_register(struct soc_camera_host *ici)
 {
        int ret;
@@ -807,11 +775,6 @@ int soc_camera_host_register(struct soc_
 
        if (ret)
                goto edevr;
-
-       if (!ici->ops->spinlock_alloc) {
-               ici->ops->spinlock_alloc = spinlock_alloc;
-               ici->ops->spinlock_free = spinlock_free;
-       }
 
        scan_add_host(ici);
 
diff -r d0b324ba2360 -r e2fb01d722d9 linux/include/media/soc_camera.h
--- a/linux/include/media/soc_camera.h  Fri Jul 11 22:50:31 2008 +0200
+++ b/linux/include/media/soc_camera.h  Fri Jul 11 22:59:34 2008 +0200
@@ -48,7 +48,6 @@ struct soc_camera_file {
 struct soc_camera_file {
        struct soc_camera_device *icd;
        struct videobuf_queue vb_vidq;
-       spinlock_t *lock;
 };
 
 struct soc_camera_host {
@@ -67,15 +66,13 @@ 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 *,
+       void (*init_videobuf)(struct videobuf_queue *,
                              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);
        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 *);
 };
 
 struct soc_camera_link {


---

Patch is available at: 
http://linuxtv.org/hg/v4l-dvb/rev/e2fb01d722d99a9ad79ea5fab65fb637025ed89c

_______________________________________________
linuxtv-commits mailing list
linuxtv-commits@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits

Reply via email to