diff options
author | Magnus Damm <magnus.damm@gmail.com> | 2008-07-11 19:59:34 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@infradead.org> | 2008-07-20 06:25:21 -0400 |
commit | a034d1b76b173b37f9a3646aa8f50a2c14a0f3ea (patch) | |
tree | 318a5ccff6e07d0849c21a2d536ebadb96a767a7 | |
parent | 092d3921195c4553a1818e698cee7a281ab361f4 (diff) |
V4L/DVB (8338): 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 <damm@igel.co.jp>
Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@pengutronix.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
-rw-r--r-- | drivers/media/video/pxa_camera.c | 17 | ||||
-rw-r--r-- | drivers/media/video/soc_camera.c | 39 | ||||
-rw-r--r-- | include/media/soc_camera.h | 5 |
3 files changed, 7 insertions, 54 deletions
diff --git a/drivers/media/video/pxa_camera.c b/drivers/media/video/pxa_camera.c index c3a7d476dc4b..b15f82c49766 100644 --- a/drivers/media/video/pxa_camera.c +++ b/drivers/media/video/pxa_camera.c | |||
@@ -583,12 +583,15 @@ static struct videobuf_queue_ops pxa_videobuf_ops = { | |||
583 | .buf_release = pxa_videobuf_release, | 583 | .buf_release = pxa_videobuf_release, |
584 | }; | 584 | }; |
585 | 585 | ||
586 | static void pxa_camera_init_videobuf(struct videobuf_queue *q, spinlock_t *lock, | 586 | static void pxa_camera_init_videobuf(struct videobuf_queue *q, |
587 | struct soc_camera_device *icd) | 587 | struct soc_camera_device *icd) |
588 | { | 588 | { |
589 | struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent); | ||
590 | struct pxa_camera_dev *pcdev = ici->priv; | ||
591 | |||
589 | /* We must pass NULL as dev pointer, then all pci_* dma operations | 592 | /* We must pass NULL as dev pointer, then all pci_* dma operations |
590 | * transform to normal dma_* ones. */ | 593 | * transform to normal dma_* ones. */ |
591 | videobuf_queue_sg_init(q, &pxa_videobuf_ops, NULL, lock, | 594 | videobuf_queue_sg_init(q, &pxa_videobuf_ops, NULL, &pcdev->lock, |
592 | V4L2_BUF_TYPE_VIDEO_CAPTURE, V4L2_FIELD_NONE, | 595 | V4L2_BUF_TYPE_VIDEO_CAPTURE, V4L2_FIELD_NONE, |
593 | sizeof(struct pxa_buffer), icd); | 596 | sizeof(struct pxa_buffer), icd); |
594 | } | 597 | } |
@@ -994,15 +997,6 @@ static int pxa_camera_querycap(struct soc_camera_host *ici, | |||
994 | return 0; | 997 | return 0; |
995 | } | 998 | } |
996 | 999 | ||
997 | static spinlock_t *pxa_camera_spinlock_alloc(struct soc_camera_file *icf) | ||
998 | { | ||
999 | struct soc_camera_host *ici = | ||
1000 | to_soc_camera_host(icf->icd->dev.parent); | ||
1001 | struct pxa_camera_dev *pcdev = ici->priv; | ||
1002 | |||
1003 | return &pcdev->lock; | ||
1004 | } | ||
1005 | |||
1006 | static struct soc_camera_host_ops pxa_soc_camera_host_ops = { | 1000 | static struct soc_camera_host_ops pxa_soc_camera_host_ops = { |
1007 | .owner = THIS_MODULE, | 1001 | .owner = THIS_MODULE, |
1008 | .add = pxa_camera_add_device, | 1002 | .add = pxa_camera_add_device, |
@@ -1015,7 +1009,6 @@ static struct soc_camera_host_ops pxa_soc_camera_host_ops = { | |||
1015 | .querycap = pxa_camera_querycap, | 1009 | .querycap = pxa_camera_querycap, |
1016 | .try_bus_param = pxa_camera_try_bus_param, | 1010 | .try_bus_param = pxa_camera_try_bus_param, |
1017 | .set_bus_param = pxa_camera_set_bus_param, | 1011 | .set_bus_param = pxa_camera_set_bus_param, |
1018 | .spinlock_alloc = pxa_camera_spinlock_alloc, | ||
1019 | }; | 1012 | }; |
1020 | 1013 | ||
1021 | /* Should be allocated dynamically too, but we have only one. */ | 1014 | /* Should be allocated dynamically too, but we have only one. */ |
diff --git a/drivers/media/video/soc_camera.c b/drivers/media/video/soc_camera.c index 38a89f133164..e39b98f1eca4 100644 --- a/drivers/media/video/soc_camera.c +++ b/drivers/media/video/soc_camera.c | |||
@@ -183,7 +183,6 @@ static int soc_camera_open(struct inode *inode, struct file *file) | |||
183 | struct soc_camera_device *icd; | 183 | struct soc_camera_device *icd; |
184 | struct soc_camera_host *ici; | 184 | struct soc_camera_host *ici; |
185 | struct soc_camera_file *icf; | 185 | struct soc_camera_file *icf; |
186 | spinlock_t *lock; | ||
187 | int ret; | 186 | int ret; |
188 | 187 | ||
189 | icf = vmalloc(sizeof(*icf)); | 188 | icf = vmalloc(sizeof(*icf)); |
@@ -210,13 +209,6 @@ static int soc_camera_open(struct inode *inode, struct file *file) | |||
210 | } | 209 | } |
211 | 210 | ||
212 | icf->icd = icd; | 211 | icf->icd = icd; |
213 | |||
214 | icf->lock = ici->ops->spinlock_alloc(icf); | ||
215 | if (!icf->lock) { | ||
216 | ret = -ENOMEM; | ||
217 | goto esla; | ||
218 | } | ||
219 | |||
220 | icd->use_count++; | 212 | icd->use_count++; |
221 | 213 | ||
222 | /* Now we really have to activate the camera */ | 214 | /* Now we really have to activate the camera */ |
@@ -234,17 +226,12 @@ static int soc_camera_open(struct inode *inode, struct file *file) | |||
234 | file->private_data = icf; | 226 | file->private_data = icf; |
235 | dev_dbg(&icd->dev, "camera device open\n"); | 227 | dev_dbg(&icd->dev, "camera device open\n"); |
236 | 228 | ||
237 | ici->ops->init_videobuf(&icf->vb_vidq, icf->lock, icd); | 229 | ici->ops->init_videobuf(&icf->vb_vidq, icd); |
238 | 230 | ||
239 | return 0; | 231 | return 0; |
240 | 232 | ||
241 | /* All errors are entered with the video_lock held */ | 233 | /* All errors are entered with the video_lock held */ |
242 | eiciadd: | 234 | eiciadd: |
243 | lock = icf->lock; | ||
244 | icf->lock = NULL; | ||
245 | if (ici->ops->spinlock_free) | ||
246 | ici->ops->spinlock_free(lock); | ||
247 | esla: | ||
248 | module_put(ici->ops->owner); | 235 | module_put(ici->ops->owner); |
249 | emgi: | 236 | emgi: |
250 | module_put(icd->ops->owner); | 237 | module_put(icd->ops->owner); |
@@ -260,15 +247,11 @@ static int soc_camera_close(struct inode *inode, struct file *file) | |||
260 | struct soc_camera_device *icd = icf->icd; | 247 | struct soc_camera_device *icd = icf->icd; |
261 | struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent); | 248 | struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent); |
262 | struct video_device *vdev = icd->vdev; | 249 | struct video_device *vdev = icd->vdev; |
263 | spinlock_t *lock = icf->lock; | ||
264 | 250 | ||
265 | mutex_lock(&video_lock); | 251 | mutex_lock(&video_lock); |
266 | icd->use_count--; | 252 | icd->use_count--; |
267 | if (!icd->use_count) | 253 | if (!icd->use_count) |
268 | ici->ops->remove(icd); | 254 | ici->ops->remove(icd); |
269 | icf->lock = NULL; | ||
270 | if (ici->ops->spinlock_free) | ||
271 | ici->ops->spinlock_free(lock); | ||
272 | module_put(icd->ops->owner); | 255 | module_put(icd->ops->owner); |
273 | module_put(ici->ops->owner); | 256 | module_put(ici->ops->owner); |
274 | mutex_unlock(&video_lock); | 257 | mutex_unlock(&video_lock); |
@@ -764,21 +747,6 @@ static void dummy_release(struct device *dev) | |||
764 | { | 747 | { |
765 | } | 748 | } |
766 | 749 | ||
767 | static spinlock_t *spinlock_alloc(struct soc_camera_file *icf) | ||
768 | { | ||
769 | spinlock_t *lock = kmalloc(sizeof(spinlock_t), GFP_KERNEL); | ||
770 | |||
771 | if (lock) | ||
772 | spin_lock_init(lock); | ||
773 | |||
774 | return lock; | ||
775 | } | ||
776 | |||
777 | static void spinlock_free(spinlock_t *lock) | ||
778 | { | ||
779 | kfree(lock); | ||
780 | } | ||
781 | |||
782 | int soc_camera_host_register(struct soc_camera_host *ici) | 750 | int soc_camera_host_register(struct soc_camera_host *ici) |
783 | { | 751 | { |
784 | int ret; | 752 | int ret; |
@@ -808,11 +776,6 @@ int soc_camera_host_register(struct soc_camera_host *ici) | |||
808 | if (ret) | 776 | if (ret) |
809 | goto edevr; | 777 | goto edevr; |
810 | 778 | ||
811 | if (!ici->ops->spinlock_alloc) { | ||
812 | ici->ops->spinlock_alloc = spinlock_alloc; | ||
813 | ici->ops->spinlock_free = spinlock_free; | ||
814 | } | ||
815 | |||
816 | scan_add_host(ici); | 779 | scan_add_host(ici); |
817 | 780 | ||
818 | return 0; | 781 | return 0; |
diff --git a/include/media/soc_camera.h b/include/media/soc_camera.h index b204c0dee956..bae160213657 100644 --- a/include/media/soc_camera.h +++ b/include/media/soc_camera.h | |||
@@ -48,7 +48,6 @@ struct soc_camera_device { | |||
48 | struct soc_camera_file { | 48 | struct soc_camera_file { |
49 | struct soc_camera_device *icd; | 49 | struct soc_camera_device *icd; |
50 | struct videobuf_queue vb_vidq; | 50 | struct videobuf_queue vb_vidq; |
51 | spinlock_t *lock; | ||
52 | }; | 51 | }; |
53 | 52 | ||
54 | struct soc_camera_host { | 53 | struct soc_camera_host { |
@@ -67,15 +66,13 @@ struct soc_camera_host_ops { | |||
67 | int (*set_fmt_cap)(struct soc_camera_device *, __u32, | 66 | int (*set_fmt_cap)(struct soc_camera_device *, __u32, |
68 | struct v4l2_rect *); | 67 | struct v4l2_rect *); |
69 | int (*try_fmt_cap)(struct soc_camera_device *, struct v4l2_format *); | 68 | int (*try_fmt_cap)(struct soc_camera_device *, struct v4l2_format *); |
70 | void (*init_videobuf)(struct videobuf_queue*, spinlock_t *, | 69 | void (*init_videobuf)(struct videobuf_queue *, |
71 | struct soc_camera_device *); | 70 | struct soc_camera_device *); |
72 | int (*reqbufs)(struct soc_camera_file *, struct v4l2_requestbuffers *); | 71 | int (*reqbufs)(struct soc_camera_file *, struct v4l2_requestbuffers *); |
73 | int (*querycap)(struct soc_camera_host *, struct v4l2_capability *); | 72 | int (*querycap)(struct soc_camera_host *, struct v4l2_capability *); |
74 | int (*try_bus_param)(struct soc_camera_device *, __u32); | 73 | int (*try_bus_param)(struct soc_camera_device *, __u32); |
75 | int (*set_bus_param)(struct soc_camera_device *, __u32); | 74 | int (*set_bus_param)(struct soc_camera_device *, __u32); |
76 | unsigned int (*poll)(struct file *, poll_table *); | 75 | unsigned int (*poll)(struct file *, poll_table *); |
77 | spinlock_t* (*spinlock_alloc)(struct soc_camera_file *); | ||
78 | void (*spinlock_free)(spinlock_t *); | ||
79 | }; | 76 | }; |
80 | 77 | ||
81 | struct soc_camera_link { | 78 | struct soc_camera_link { |