• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * drivers/media/video/omap24xxcam.c
3  *
4  * OMAP 2 camera block driver.
5  *
6  * Copyright (C) 2004 MontaVista Software, Inc.
7  * Copyright (C) 2004 Texas Instruments.
8  * Copyright (C) 2007-2008 Nokia Corporation.
9  *
10  * Contact: Sakari Ailus <sakari.ailus@nokia.com>
11  *
12  * Based on code from Andy Lowe <source@mvista.com>
13  *
14  * This program is free software; you can redistribute it and/or
15  * modify it under the terms of the GNU General Public License
16  * version 2 as published by the Free Software Foundation.
17  *
18  * This program is distributed in the hope that it will be useful, but
19  * WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21  * General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with this program; if not, write to the Free Software
25  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
26  * 02110-1301 USA
27  */
28 
29 #include <linux/delay.h>
30 #include <linux/kernel.h>
31 #include <linux/interrupt.h>
32 #include <linux/videodev2.h>
33 #include <linux/pci.h>		/* needed for videobufs */
34 #include <linux/version.h>
35 #include <linux/platform_device.h>
36 #include <linux/clk.h>
37 #include <linux/io.h>
38 
39 #include <media/v4l2-common.h>
40 #include <media/v4l2-ioctl.h>
41 
42 #include "omap24xxcam.h"
43 
44 #define OMAP24XXCAM_VERSION KERNEL_VERSION(0, 0, 0)
45 
46 #define RESET_TIMEOUT_NS 10000
47 
48 static void omap24xxcam_reset(struct omap24xxcam_device *cam);
49 static int omap24xxcam_sensor_if_enable(struct omap24xxcam_device *cam);
50 static void omap24xxcam_device_unregister(struct v4l2_int_device *s);
51 static int omap24xxcam_remove(struct platform_device *pdev);
52 
53 /* module parameters */
54 static int video_nr = -1;	/* video device minor (-1 ==> auto assign) */
55 /*
56  * Maximum amount of memory to use for capture buffers.
57  * Default is 4800KB, enough to double-buffer SXGA.
58  */
59 static int capture_mem = 1280 * 960 * 2 * 2;
60 
61 static struct v4l2_int_device omap24xxcam;
62 
63 /*
64  *
65  * Clocks.
66  *
67  */
68 
omap24xxcam_clock_put(struct omap24xxcam_device * cam)69 static void omap24xxcam_clock_put(struct omap24xxcam_device *cam)
70 {
71 	if (cam->ick != NULL && !IS_ERR(cam->ick))
72 		clk_put(cam->ick);
73 	if (cam->fck != NULL && !IS_ERR(cam->fck))
74 		clk_put(cam->fck);
75 
76 	cam->ick = cam->fck = NULL;
77 }
78 
omap24xxcam_clock_get(struct omap24xxcam_device * cam)79 static int omap24xxcam_clock_get(struct omap24xxcam_device *cam)
80 {
81 	int rval = 0;
82 
83 	cam->fck = clk_get(cam->dev, "cam_fck");
84 	if (IS_ERR(cam->fck)) {
85 		dev_err(cam->dev, "can't get cam_fck");
86 		rval = PTR_ERR(cam->fck);
87 		omap24xxcam_clock_put(cam);
88 		return rval;
89 	}
90 
91 	cam->ick = clk_get(cam->dev, "cam_ick");
92 	if (IS_ERR(cam->ick)) {
93 		dev_err(cam->dev, "can't get cam_ick");
94 		rval = PTR_ERR(cam->ick);
95 		omap24xxcam_clock_put(cam);
96 	}
97 
98 	return rval;
99 }
100 
omap24xxcam_clock_on(struct omap24xxcam_device * cam)101 static void omap24xxcam_clock_on(struct omap24xxcam_device *cam)
102 {
103 	clk_enable(cam->fck);
104 	clk_enable(cam->ick);
105 }
106 
omap24xxcam_clock_off(struct omap24xxcam_device * cam)107 static void omap24xxcam_clock_off(struct omap24xxcam_device *cam)
108 {
109 	clk_disable(cam->fck);
110 	clk_disable(cam->ick);
111 }
112 
113 /*
114  *
115  * Camera core
116  *
117  */
118 
119 /*
120  * Set xclk.
121  *
122  * To disable xclk, use value zero.
123  */
omap24xxcam_core_xclk_set(const struct omap24xxcam_device * cam,u32 xclk)124 static void omap24xxcam_core_xclk_set(const struct omap24xxcam_device *cam,
125 				      u32 xclk)
126 {
127 	if (xclk) {
128 		u32 divisor = CAM_MCLK / xclk;
129 
130 		if (divisor == 1)
131 			omap24xxcam_reg_out(cam->mmio_base + CC_REG_OFFSET,
132 					    CC_CTRL_XCLK,
133 					    CC_CTRL_XCLK_DIV_BYPASS);
134 		else
135 			omap24xxcam_reg_out(cam->mmio_base + CC_REG_OFFSET,
136 					    CC_CTRL_XCLK, divisor);
137 	} else
138 		omap24xxcam_reg_out(cam->mmio_base + CC_REG_OFFSET,
139 				    CC_CTRL_XCLK, CC_CTRL_XCLK_DIV_STABLE_LOW);
140 }
141 
omap24xxcam_core_hwinit(const struct omap24xxcam_device * cam)142 static void omap24xxcam_core_hwinit(const struct omap24xxcam_device *cam)
143 {
144 	/*
145 	 * Setting the camera core AUTOIDLE bit causes problems with frame
146 	 * synchronization, so we will clear the AUTOIDLE bit instead.
147 	 */
148 	omap24xxcam_reg_out(cam->mmio_base + CC_REG_OFFSET, CC_SYSCONFIG,
149 			    CC_SYSCONFIG_AUTOIDLE);
150 
151 	/* program the camera interface DMA packet size */
152 	omap24xxcam_reg_out(cam->mmio_base + CC_REG_OFFSET, CC_CTRL_DMA,
153 			    CC_CTRL_DMA_EN | (DMA_THRESHOLD / 4 - 1));
154 
155 	/* enable camera core error interrupts */
156 	omap24xxcam_reg_out(cam->mmio_base + CC_REG_OFFSET, CC_IRQENABLE,
157 			    CC_IRQENABLE_FW_ERR_IRQ
158 			    | CC_IRQENABLE_FSC_ERR_IRQ
159 			    | CC_IRQENABLE_SSC_ERR_IRQ
160 			    | CC_IRQENABLE_FIFO_OF_IRQ);
161 }
162 
163 /*
164  * Enable the camera core.
165  *
166  * Data transfer to the camera DMA starts from next starting frame.
167  */
omap24xxcam_core_enable(const struct omap24xxcam_device * cam)168 static void omap24xxcam_core_enable(const struct omap24xxcam_device *cam)
169 {
170 
171 	omap24xxcam_reg_out(cam->mmio_base + CC_REG_OFFSET, CC_CTRL,
172 			    cam->cc_ctrl);
173 }
174 
175 /*
176  * Disable camera core.
177  *
178  * The data transfer will be stopped immediately (CC_CTRL_CC_RST). The
179  * core internal state machines will be reset. Use
180  * CC_CTRL_CC_FRAME_TRIG instead if you want to transfer the current
181  * frame completely.
182  */
omap24xxcam_core_disable(const struct omap24xxcam_device * cam)183 static void omap24xxcam_core_disable(const struct omap24xxcam_device *cam)
184 {
185 	omap24xxcam_reg_out(cam->mmio_base + CC_REG_OFFSET, CC_CTRL,
186 			    CC_CTRL_CC_RST);
187 }
188 
189 /* Interrupt service routine for camera core interrupts. */
omap24xxcam_core_isr(struct omap24xxcam_device * cam)190 static void omap24xxcam_core_isr(struct omap24xxcam_device *cam)
191 {
192 	u32 cc_irqstatus;
193 	const u32 cc_irqstatus_err =
194 		CC_IRQSTATUS_FW_ERR_IRQ
195 		| CC_IRQSTATUS_FSC_ERR_IRQ
196 		| CC_IRQSTATUS_SSC_ERR_IRQ
197 		| CC_IRQSTATUS_FIFO_UF_IRQ
198 		| CC_IRQSTATUS_FIFO_OF_IRQ;
199 
200 	cc_irqstatus = omap24xxcam_reg_in(cam->mmio_base + CC_REG_OFFSET,
201 					  CC_IRQSTATUS);
202 	omap24xxcam_reg_out(cam->mmio_base + CC_REG_OFFSET, CC_IRQSTATUS,
203 			    cc_irqstatus);
204 
205 	if (cc_irqstatus & cc_irqstatus_err
206 	    && !atomic_read(&cam->in_reset)) {
207 		dev_dbg(cam->dev, "resetting camera, cc_irqstatus 0x%x\n",
208 			cc_irqstatus);
209 		omap24xxcam_reset(cam);
210 	}
211 }
212 
213 /*
214  *
215  * videobuf_buffer handling.
216  *
217  * Memory for mmapped videobuf_buffers is not allocated
218  * conventionally, but by several kmalloc allocations and then
219  * creating the scatterlist on our own. User-space buffers are handled
220  * normally.
221  *
222  */
223 
224 /*
225  * Free the memory-mapped buffer memory allocated for a
226  * videobuf_buffer and the associated scatterlist.
227  */
omap24xxcam_vbq_free_mmap_buffer(struct videobuf_buffer * vb)228 static void omap24xxcam_vbq_free_mmap_buffer(struct videobuf_buffer *vb)
229 {
230 	struct videobuf_dmabuf *dma = videobuf_to_dma(vb);
231 	size_t alloc_size;
232 	struct page *page;
233 	int i;
234 
235 	if (dma->sglist == NULL)
236 		return;
237 
238 	i = dma->sglen;
239 	while (i) {
240 		i--;
241 		alloc_size = sg_dma_len(&dma->sglist[i]);
242 		page = sg_page(&dma->sglist[i]);
243 		do {
244 			ClearPageReserved(page++);
245 		} while (alloc_size -= PAGE_SIZE);
246 		__free_pages(sg_page(&dma->sglist[i]),
247 			     get_order(sg_dma_len(&dma->sglist[i])));
248 	}
249 
250 	kfree(dma->sglist);
251 	dma->sglist = NULL;
252 }
253 
254 /* Release all memory related to the videobuf_queue. */
omap24xxcam_vbq_free_mmap_buffers(struct videobuf_queue * vbq)255 static void omap24xxcam_vbq_free_mmap_buffers(struct videobuf_queue *vbq)
256 {
257 	int i;
258 
259 	mutex_lock(&vbq->vb_lock);
260 
261 	for (i = 0; i < VIDEO_MAX_FRAME; i++) {
262 		if (NULL == vbq->bufs[i])
263 			continue;
264 		if (V4L2_MEMORY_MMAP != vbq->bufs[i]->memory)
265 			continue;
266 		vbq->ops->buf_release(vbq, vbq->bufs[i]);
267 		omap24xxcam_vbq_free_mmap_buffer(vbq->bufs[i]);
268 		kfree(vbq->bufs[i]);
269 		vbq->bufs[i] = NULL;
270 	}
271 
272 	mutex_unlock(&vbq->vb_lock);
273 
274 	videobuf_mmap_free(vbq);
275 }
276 
277 /*
278  * Allocate physically as contiguous as possible buffer for video
279  * frame and allocate and build DMA scatter-gather list for it.
280  */
omap24xxcam_vbq_alloc_mmap_buffer(struct videobuf_buffer * vb)281 static int omap24xxcam_vbq_alloc_mmap_buffer(struct videobuf_buffer *vb)
282 {
283 	unsigned int order;
284 	size_t alloc_size, size = vb->bsize; /* vb->bsize is page aligned */
285 	struct page *page;
286 	int max_pages, err = 0, i = 0;
287 	struct videobuf_dmabuf *dma = videobuf_to_dma(vb);
288 
289 	/*
290 	 * allocate maximum size scatter-gather list. Note this is
291 	 * overhead. We may not use as many entries as we allocate
292 	 */
293 	max_pages = vb->bsize >> PAGE_SHIFT;
294 	dma->sglist = kcalloc(max_pages, sizeof(*dma->sglist), GFP_KERNEL);
295 	if (dma->sglist == NULL) {
296 		err = -ENOMEM;
297 		goto out;
298 	}
299 
300 	while (size) {
301 		order = get_order(size);
302 		/*
303 		 * do not over-allocate even if we would get larger
304 		 * contiguous chunk that way
305 		 */
306 		if ((PAGE_SIZE << order) > size)
307 			order--;
308 
309 		/* try to allocate as many contiguous pages as possible */
310 		page = alloc_pages(GFP_KERNEL | GFP_DMA, order);
311 		/* if allocation fails, try to allocate smaller amount */
312 		while (page == NULL) {
313 			order--;
314 			page = alloc_pages(GFP_KERNEL | GFP_DMA, order);
315 			if (page == NULL && !order) {
316 				err = -ENOMEM;
317 				goto out;
318 			}
319 		}
320 		size -= (PAGE_SIZE << order);
321 
322 		/* append allocated chunk of pages into scatter-gather list */
323 		sg_set_page(&dma->sglist[i], page, PAGE_SIZE << order, 0);
324 		dma->sglen++;
325 		i++;
326 
327 		alloc_size = (PAGE_SIZE << order);
328 
329 		/* clear pages before giving them to user space */
330 		memset(page_address(page), 0, alloc_size);
331 
332 		/* mark allocated pages reserved */
333 		do {
334 			SetPageReserved(page++);
335 		} while (alloc_size -= PAGE_SIZE);
336 	}
337 	/*
338 	 * REVISIT: not fully correct to assign nr_pages == sglen but
339 	 * video-buf is passing nr_pages for e.g. unmap_sg calls
340 	 */
341 	dma->nr_pages = dma->sglen;
342 	dma->direction = PCI_DMA_FROMDEVICE;
343 
344 	return 0;
345 
346 out:
347 	omap24xxcam_vbq_free_mmap_buffer(vb);
348 	return err;
349 }
350 
omap24xxcam_vbq_alloc_mmap_buffers(struct videobuf_queue * vbq,unsigned int count)351 static int omap24xxcam_vbq_alloc_mmap_buffers(struct videobuf_queue *vbq,
352 					      unsigned int count)
353 {
354 	int i, err = 0;
355 	struct omap24xxcam_fh *fh =
356 		container_of(vbq, struct omap24xxcam_fh, vbq);
357 
358 	mutex_lock(&vbq->vb_lock);
359 
360 	for (i = 0; i < count; i++) {
361 		err = omap24xxcam_vbq_alloc_mmap_buffer(vbq->bufs[i]);
362 		if (err)
363 			goto out;
364 		dev_dbg(fh->cam->dev, "sglen is %d for buffer %d\n",
365 			videobuf_to_dma(vbq->bufs[i])->sglen, i);
366 	}
367 
368 	mutex_unlock(&vbq->vb_lock);
369 
370 	return 0;
371 out:
372 	while (i) {
373 		i--;
374 		omap24xxcam_vbq_free_mmap_buffer(vbq->bufs[i]);
375 	}
376 
377 	mutex_unlock(&vbq->vb_lock);
378 
379 	return err;
380 }
381 
382 /*
383  * This routine is called from interrupt context when a scatter-gather DMA
384  * transfer of a videobuf_buffer completes.
385  */
omap24xxcam_vbq_complete(struct omap24xxcam_sgdma * sgdma,u32 csr,void * arg)386 static void omap24xxcam_vbq_complete(struct omap24xxcam_sgdma *sgdma,
387 				     u32 csr, void *arg)
388 {
389 	struct omap24xxcam_device *cam =
390 		container_of(sgdma, struct omap24xxcam_device, sgdma);
391 	struct omap24xxcam_fh *fh = cam->streaming->private_data;
392 	struct videobuf_buffer *vb = (struct videobuf_buffer *)arg;
393 	const u32 csr_error = CAMDMA_CSR_MISALIGNED_ERR
394 		| CAMDMA_CSR_SUPERVISOR_ERR | CAMDMA_CSR_SECURE_ERR
395 		| CAMDMA_CSR_TRANS_ERR | CAMDMA_CSR_DROP;
396 	unsigned long flags;
397 
398 	spin_lock_irqsave(&cam->core_enable_disable_lock, flags);
399 	if (--cam->sgdma_in_queue == 0)
400 		omap24xxcam_core_disable(cam);
401 	spin_unlock_irqrestore(&cam->core_enable_disable_lock, flags);
402 
403 	do_gettimeofday(&vb->ts);
404 	vb->field_count = atomic_add_return(2, &fh->field_count);
405 	if (csr & csr_error) {
406 		vb->state = VIDEOBUF_ERROR;
407 		if (!atomic_read(&fh->cam->in_reset)) {
408 			dev_dbg(cam->dev, "resetting camera, csr 0x%x\n", csr);
409 			omap24xxcam_reset(cam);
410 		}
411 	} else
412 		vb->state = VIDEOBUF_DONE;
413 	wake_up(&vb->done);
414 }
415 
omap24xxcam_vbq_release(struct videobuf_queue * vbq,struct videobuf_buffer * vb)416 static void omap24xxcam_vbq_release(struct videobuf_queue *vbq,
417 				    struct videobuf_buffer *vb)
418 {
419 	struct videobuf_dmabuf *dma = videobuf_to_dma(vb);
420 
421 	/* wait for buffer, especially to get out of the sgdma queue */
422 	videobuf_waiton(vb, 0, 0);
423 	if (vb->memory == V4L2_MEMORY_MMAP) {
424 		dma_unmap_sg(vbq->dev, dma->sglist, dma->sglen,
425 			     dma->direction);
426 		dma->direction = DMA_NONE;
427 	} else {
428 		videobuf_dma_unmap(vbq, videobuf_to_dma(vb));
429 		videobuf_dma_free(videobuf_to_dma(vb));
430 	}
431 
432 	vb->state = VIDEOBUF_NEEDS_INIT;
433 }
434 
435 /*
436  * Limit the number of available kernel image capture buffers based on the
437  * number requested, the currently selected image size, and the maximum
438  * amount of memory permitted for kernel capture buffers.
439  */
omap24xxcam_vbq_setup(struct videobuf_queue * vbq,unsigned int * cnt,unsigned int * size)440 static int omap24xxcam_vbq_setup(struct videobuf_queue *vbq, unsigned int *cnt,
441 				 unsigned int *size)
442 {
443 	struct omap24xxcam_fh *fh = vbq->priv_data;
444 
445 	if (*cnt <= 0)
446 		*cnt = VIDEO_MAX_FRAME;	/* supply a default number of buffers */
447 
448 	if (*cnt > VIDEO_MAX_FRAME)
449 		*cnt = VIDEO_MAX_FRAME;
450 
451 	*size = fh->pix.sizeimage;
452 
453 	/* accessing fh->cam->capture_mem is ok, it's constant */
454 	while (*size * *cnt > fh->cam->capture_mem)
455 		(*cnt)--;
456 
457 	return 0;
458 }
459 
omap24xxcam_dma_iolock(struct videobuf_queue * vbq,struct videobuf_dmabuf * dma)460 static int omap24xxcam_dma_iolock(struct videobuf_queue *vbq,
461 				  struct videobuf_dmabuf *dma)
462 {
463 	int err = 0;
464 
465 	dma->direction = PCI_DMA_FROMDEVICE;
466 	if (!dma_map_sg(vbq->dev, dma->sglist, dma->sglen, dma->direction)) {
467 		kfree(dma->sglist);
468 		dma->sglist = NULL;
469 		dma->sglen = 0;
470 		err = -EIO;
471 	}
472 
473 	return err;
474 }
475 
omap24xxcam_vbq_prepare(struct videobuf_queue * vbq,struct videobuf_buffer * vb,enum v4l2_field field)476 static int omap24xxcam_vbq_prepare(struct videobuf_queue *vbq,
477 				   struct videobuf_buffer *vb,
478 				   enum v4l2_field field)
479 {
480 	struct omap24xxcam_fh *fh = vbq->priv_data;
481 	int err = 0;
482 
483 	/*
484 	 * Accessing pix here is okay since it's constant while
485 	 * streaming is on (and we only get called then).
486 	 */
487 	if (vb->baddr) {
488 		/* This is a userspace buffer. */
489 		if (fh->pix.sizeimage > vb->bsize) {
490 			/* The buffer isn't big enough. */
491 			err = -EINVAL;
492 		} else
493 			vb->size = fh->pix.sizeimage;
494 	} else {
495 		if (vb->state != VIDEOBUF_NEEDS_INIT) {
496 			/*
497 			 * We have a kernel bounce buffer that has
498 			 * already been allocated.
499 			 */
500 			if (fh->pix.sizeimage > vb->size) {
501 				/*
502 				 * The image size has been changed to
503 				 * a larger size since this buffer was
504 				 * allocated, so we need to free and
505 				 * reallocate it.
506 				 */
507 				omap24xxcam_vbq_release(vbq, vb);
508 				vb->size = fh->pix.sizeimage;
509 			}
510 		} else {
511 			/* We need to allocate a new kernel bounce buffer. */
512 			vb->size = fh->pix.sizeimage;
513 		}
514 	}
515 
516 	if (err)
517 		return err;
518 
519 	vb->width = fh->pix.width;
520 	vb->height = fh->pix.height;
521 	vb->field = field;
522 
523 	if (vb->state == VIDEOBUF_NEEDS_INIT) {
524 		if (vb->memory == V4L2_MEMORY_MMAP)
525 			/*
526 			 * we have built the scatter-gather list by ourself so
527 			 * do the scatter-gather mapping as well
528 			 */
529 			err = omap24xxcam_dma_iolock(vbq, videobuf_to_dma(vb));
530 		else
531 			err = videobuf_iolock(vbq, vb, NULL);
532 	}
533 
534 	if (!err)
535 		vb->state = VIDEOBUF_PREPARED;
536 	else
537 		omap24xxcam_vbq_release(vbq, vb);
538 
539 	return err;
540 }
541 
omap24xxcam_vbq_queue(struct videobuf_queue * vbq,struct videobuf_buffer * vb)542 static void omap24xxcam_vbq_queue(struct videobuf_queue *vbq,
543 				  struct videobuf_buffer *vb)
544 {
545 	struct omap24xxcam_fh *fh = vbq->priv_data;
546 	struct omap24xxcam_device *cam = fh->cam;
547 	enum videobuf_state state = vb->state;
548 	unsigned long flags;
549 	int err;
550 
551 	/*
552 	 * FIXME: We're marking the buffer active since we have no
553 	 * pretty way of marking it active exactly when the
554 	 * scatter-gather transfer starts.
555 	 */
556 	vb->state = VIDEOBUF_ACTIVE;
557 
558 	err = omap24xxcam_sgdma_queue(&fh->cam->sgdma,
559 				      videobuf_to_dma(vb)->sglist,
560 				      videobuf_to_dma(vb)->sglen, vb->size,
561 				      omap24xxcam_vbq_complete, vb);
562 
563 	if (!err) {
564 		spin_lock_irqsave(&cam->core_enable_disable_lock, flags);
565 		if (++cam->sgdma_in_queue == 1
566 		    && !atomic_read(&cam->in_reset))
567 			omap24xxcam_core_enable(cam);
568 		spin_unlock_irqrestore(&cam->core_enable_disable_lock, flags);
569 	} else {
570 		/*
571 		 * Oops. We're not supposed to get any errors here.
572 		 * The only way we could get an error is if we ran out
573 		 * of scatter-gather DMA slots, but we are supposed to
574 		 * have at least as many scatter-gather DMA slots as
575 		 * video buffers so that can't happen.
576 		 */
577 		dev_err(cam->dev, "failed to queue a video buffer for dma!\n");
578 		dev_err(cam->dev, "likely a bug in the driver!\n");
579 		vb->state = state;
580 	}
581 }
582 
583 static struct videobuf_queue_ops omap24xxcam_vbq_ops = {
584 	.buf_setup   = omap24xxcam_vbq_setup,
585 	.buf_prepare = omap24xxcam_vbq_prepare,
586 	.buf_queue   = omap24xxcam_vbq_queue,
587 	.buf_release = omap24xxcam_vbq_release,
588 };
589 
590 /*
591  *
592  * OMAP main camera system
593  *
594  */
595 
596 /*
597  * Reset camera block to power-on state.
598  */
omap24xxcam_poweron_reset(struct omap24xxcam_device * cam)599 static void omap24xxcam_poweron_reset(struct omap24xxcam_device *cam)
600 {
601 	int max_loop = RESET_TIMEOUT_NS;
602 
603 	/* Reset whole camera subsystem */
604 	omap24xxcam_reg_out(cam->mmio_base,
605 			    CAM_SYSCONFIG,
606 			    CAM_SYSCONFIG_SOFTRESET);
607 
608 	/* Wait till it's finished */
609 	while (!(omap24xxcam_reg_in(cam->mmio_base, CAM_SYSSTATUS)
610 		 & CAM_SYSSTATUS_RESETDONE)
611 	       && --max_loop) {
612 		ndelay(1);
613 	}
614 
615 	if (!(omap24xxcam_reg_in(cam->mmio_base, CAM_SYSSTATUS)
616 	      & CAM_SYSSTATUS_RESETDONE))
617 		dev_err(cam->dev, "camera soft reset timeout\n");
618 }
619 
620 /*
621  * (Re)initialise the camera block.
622  */
omap24xxcam_hwinit(struct omap24xxcam_device * cam)623 static void omap24xxcam_hwinit(struct omap24xxcam_device *cam)
624 {
625 	omap24xxcam_poweron_reset(cam);
626 
627 	/* set the camera subsystem autoidle bit */
628 	omap24xxcam_reg_out(cam->mmio_base, CAM_SYSCONFIG,
629 			    CAM_SYSCONFIG_AUTOIDLE);
630 
631 	/* set the camera MMU autoidle bit */
632 	omap24xxcam_reg_out(cam->mmio_base,
633 			    CAMMMU_REG_OFFSET + CAMMMU_SYSCONFIG,
634 			    CAMMMU_SYSCONFIG_AUTOIDLE);
635 
636 	omap24xxcam_core_hwinit(cam);
637 
638 	omap24xxcam_dma_hwinit(&cam->sgdma.dma);
639 }
640 
641 /*
642  * Callback for dma transfer stalling.
643  */
omap24xxcam_stalled_dma_reset(unsigned long data)644 static void omap24xxcam_stalled_dma_reset(unsigned long data)
645 {
646 	struct omap24xxcam_device *cam = (struct omap24xxcam_device *)data;
647 
648 	if (!atomic_read(&cam->in_reset)) {
649 		dev_dbg(cam->dev, "dma stalled, resetting camera\n");
650 		omap24xxcam_reset(cam);
651 	}
652 }
653 
654 /*
655  * Stop capture. Mark we're doing a reset, stop DMA transfers and
656  * core. (No new scatter-gather transfers will be queued whilst
657  * in_reset is non-zero.)
658  *
659  * If omap24xxcam_capture_stop is called from several places at
660  * once, only the first call will have an effect. Similarly, the last
661  * call omap24xxcam_streaming_cont will have effect.
662  *
663  * Serialisation is ensured by using cam->core_enable_disable_lock.
664  */
omap24xxcam_capture_stop(struct omap24xxcam_device * cam)665 static void omap24xxcam_capture_stop(struct omap24xxcam_device *cam)
666 {
667 	unsigned long flags;
668 
669 	spin_lock_irqsave(&cam->core_enable_disable_lock, flags);
670 
671 	if (atomic_inc_return(&cam->in_reset) != 1) {
672 		spin_unlock_irqrestore(&cam->core_enable_disable_lock, flags);
673 		return;
674 	}
675 
676 	omap24xxcam_core_disable(cam);
677 
678 	spin_unlock_irqrestore(&cam->core_enable_disable_lock, flags);
679 
680 	omap24xxcam_sgdma_sync(&cam->sgdma);
681 }
682 
683 /*
684  * Reset and continue streaming.
685  *
686  * Note: Resetting the camera FIFO via the CC_RST bit in the CC_CTRL
687  * register is supposed to be sufficient to recover from a camera
688  * interface error, but it doesn't seem to be enough. If we only do
689  * that then subsequent image captures are out of sync by either one
690  * or two times DMA_THRESHOLD bytes. Resetting and re-initializing the
691  * entire camera subsystem prevents the problem with frame
692  * synchronization.
693  */
omap24xxcam_capture_cont(struct omap24xxcam_device * cam)694 static void omap24xxcam_capture_cont(struct omap24xxcam_device *cam)
695 {
696 	unsigned long flags;
697 
698 	spin_lock_irqsave(&cam->core_enable_disable_lock, flags);
699 
700 	if (atomic_read(&cam->in_reset) != 1)
701 		goto out;
702 
703 	omap24xxcam_hwinit(cam);
704 
705 	omap24xxcam_sensor_if_enable(cam);
706 
707 	omap24xxcam_sgdma_process(&cam->sgdma);
708 
709 	if (cam->sgdma_in_queue)
710 		omap24xxcam_core_enable(cam);
711 
712 out:
713 	atomic_dec(&cam->in_reset);
714 	spin_unlock_irqrestore(&cam->core_enable_disable_lock, flags);
715 }
716 
717 static ssize_t
omap24xxcam_streaming_show(struct device * dev,struct device_attribute * attr,char * buf)718 omap24xxcam_streaming_show(struct device *dev, struct device_attribute *attr,
719 		char *buf)
720 {
721 	struct omap24xxcam_device *cam = dev_get_drvdata(dev);
722 
723 	return sprintf(buf, "%s\n", cam->streaming ?  "active" : "inactive");
724 }
725 static DEVICE_ATTR(streaming, S_IRUGO, omap24xxcam_streaming_show, NULL);
726 
727 /*
728  * Stop capture and restart it. I.e. reset the camera during use.
729  */
omap24xxcam_reset(struct omap24xxcam_device * cam)730 static void omap24xxcam_reset(struct omap24xxcam_device *cam)
731 {
732 	omap24xxcam_capture_stop(cam);
733 	omap24xxcam_capture_cont(cam);
734 }
735 
736 /*
737  * The main interrupt handler.
738  */
omap24xxcam_isr(int irq,void * arg)739 static irqreturn_t omap24xxcam_isr(int irq, void *arg)
740 {
741 	struct omap24xxcam_device *cam = (struct omap24xxcam_device *)arg;
742 	u32 irqstatus;
743 	unsigned int irqhandled = 0;
744 
745 	irqstatus = omap24xxcam_reg_in(cam->mmio_base, CAM_IRQSTATUS);
746 
747 	if (irqstatus &
748 	    (CAM_IRQSTATUS_DMA_IRQ2 | CAM_IRQSTATUS_DMA_IRQ1
749 	     | CAM_IRQSTATUS_DMA_IRQ0)) {
750 		omap24xxcam_dma_isr(&cam->sgdma.dma);
751 		irqhandled = 1;
752 	}
753 	if (irqstatus & CAM_IRQSTATUS_CC_IRQ) {
754 		omap24xxcam_core_isr(cam);
755 		irqhandled = 1;
756 	}
757 	if (irqstatus & CAM_IRQSTATUS_MMU_IRQ)
758 		dev_err(cam->dev, "unhandled camera MMU interrupt!\n");
759 
760 	return IRQ_RETVAL(irqhandled);
761 }
762 
763 /*
764  *
765  * Sensor handling.
766  *
767  */
768 
769 /*
770  * Enable the external sensor interface. Try to negotiate interface
771  * parameters with the sensor and start using the new ones. The calls
772  * to sensor_if_enable and sensor_if_disable need not to be balanced.
773  */
omap24xxcam_sensor_if_enable(struct omap24xxcam_device * cam)774 static int omap24xxcam_sensor_if_enable(struct omap24xxcam_device *cam)
775 {
776 	int rval;
777 	struct v4l2_ifparm p;
778 
779 	rval = vidioc_int_g_ifparm(cam->sdev, &p);
780 	if (rval) {
781 		dev_err(cam->dev, "vidioc_int_g_ifparm failed with %d\n", rval);
782 		return rval;
783 	}
784 
785 	cam->if_type = p.if_type;
786 
787 	cam->cc_ctrl = CC_CTRL_CC_EN;
788 
789 	switch (p.if_type) {
790 	case V4L2_IF_TYPE_BT656:
791 		if (p.u.bt656.frame_start_on_rising_vs)
792 			cam->cc_ctrl |= CC_CTRL_NOBT_SYNCHRO;
793 		if (p.u.bt656.bt_sync_correct)
794 			cam->cc_ctrl |= CC_CTRL_BT_CORRECT;
795 		if (p.u.bt656.swap)
796 			cam->cc_ctrl |= CC_CTRL_PAR_ORDERCAM;
797 		if (p.u.bt656.latch_clk_inv)
798 			cam->cc_ctrl |= CC_CTRL_PAR_CLK_POL;
799 		if (p.u.bt656.nobt_hs_inv)
800 			cam->cc_ctrl |= CC_CTRL_NOBT_HS_POL;
801 		if (p.u.bt656.nobt_vs_inv)
802 			cam->cc_ctrl |= CC_CTRL_NOBT_VS_POL;
803 
804 		switch (p.u.bt656.mode) {
805 		case V4L2_IF_TYPE_BT656_MODE_NOBT_8BIT:
806 			cam->cc_ctrl |= CC_CTRL_PAR_MODE_NOBT8;
807 			break;
808 		case V4L2_IF_TYPE_BT656_MODE_NOBT_10BIT:
809 			cam->cc_ctrl |= CC_CTRL_PAR_MODE_NOBT10;
810 			break;
811 		case V4L2_IF_TYPE_BT656_MODE_NOBT_12BIT:
812 			cam->cc_ctrl |= CC_CTRL_PAR_MODE_NOBT12;
813 			break;
814 		case V4L2_IF_TYPE_BT656_MODE_BT_8BIT:
815 			cam->cc_ctrl |= CC_CTRL_PAR_MODE_BT8;
816 			break;
817 		case V4L2_IF_TYPE_BT656_MODE_BT_10BIT:
818 			cam->cc_ctrl |= CC_CTRL_PAR_MODE_BT10;
819 			break;
820 		default:
821 			dev_err(cam->dev,
822 				"bt656 interface mode %d not supported\n",
823 				p.u.bt656.mode);
824 			return -EINVAL;
825 		}
826 		/*
827 		 * The clock rate that the sensor wants has changed.
828 		 * We have to adjust the xclk from OMAP 2 side to
829 		 * match the sensor's wish as closely as possible.
830 		 */
831 		if (p.u.bt656.clock_curr != cam->if_u.bt656.xclk) {
832 			u32 xclk = p.u.bt656.clock_curr;
833 			u32 divisor;
834 
835 			if (xclk == 0)
836 				return -EINVAL;
837 
838 			if (xclk > CAM_MCLK)
839 				xclk = CAM_MCLK;
840 
841 			divisor = CAM_MCLK / xclk;
842 			if (divisor * xclk < CAM_MCLK)
843 				divisor++;
844 			if (CAM_MCLK / divisor < p.u.bt656.clock_min
845 			    && divisor > 1)
846 				divisor--;
847 			if (divisor > 30)
848 				divisor = 30;
849 
850 			xclk = CAM_MCLK / divisor;
851 
852 			if (xclk < p.u.bt656.clock_min
853 			    || xclk > p.u.bt656.clock_max)
854 				return -EINVAL;
855 
856 			cam->if_u.bt656.xclk = xclk;
857 		}
858 		omap24xxcam_core_xclk_set(cam, cam->if_u.bt656.xclk);
859 		break;
860 	default:
861 		/* FIXME: how about other interfaces? */
862 		dev_err(cam->dev, "interface type %d not supported\n",
863 			p.if_type);
864 		return -EINVAL;
865 	}
866 
867 	return 0;
868 }
869 
omap24xxcam_sensor_if_disable(const struct omap24xxcam_device * cam)870 static void omap24xxcam_sensor_if_disable(const struct omap24xxcam_device *cam)
871 {
872 	switch (cam->if_type) {
873 	case V4L2_IF_TYPE_BT656:
874 		omap24xxcam_core_xclk_set(cam, 0);
875 		break;
876 	}
877 }
878 
879 /*
880  * Initialise the sensor hardware.
881  */
omap24xxcam_sensor_init(struct omap24xxcam_device * cam)882 static int omap24xxcam_sensor_init(struct omap24xxcam_device *cam)
883 {
884 	int err = 0;
885 	struct v4l2_int_device *sdev = cam->sdev;
886 
887 	omap24xxcam_clock_on(cam);
888 	err = omap24xxcam_sensor_if_enable(cam);
889 	if (err) {
890 		dev_err(cam->dev, "sensor interface could not be enabled at "
891 			"initialisation, %d\n", err);
892 		cam->sdev = NULL;
893 		goto out;
894 	}
895 
896 	/* power up sensor during sensor initialization */
897 	vidioc_int_s_power(sdev, 1);
898 
899 	err = vidioc_int_dev_init(sdev);
900 	if (err) {
901 		dev_err(cam->dev, "cannot initialize sensor, error %d\n", err);
902 		/* Sensor init failed --- it's nonexistent to us! */
903 		cam->sdev = NULL;
904 		goto out;
905 	}
906 
907 	dev_info(cam->dev, "sensor is %s\n", sdev->name);
908 
909 out:
910 	omap24xxcam_sensor_if_disable(cam);
911 	omap24xxcam_clock_off(cam);
912 
913 	vidioc_int_s_power(sdev, 0);
914 
915 	return err;
916 }
917 
omap24xxcam_sensor_exit(struct omap24xxcam_device * cam)918 static void omap24xxcam_sensor_exit(struct omap24xxcam_device *cam)
919 {
920 	if (cam->sdev)
921 		vidioc_int_dev_exit(cam->sdev);
922 }
923 
omap24xxcam_sensor_disable(struct omap24xxcam_device * cam)924 static void omap24xxcam_sensor_disable(struct omap24xxcam_device *cam)
925 {
926 	omap24xxcam_sensor_if_disable(cam);
927 	omap24xxcam_clock_off(cam);
928 	vidioc_int_s_power(cam->sdev, 0);
929 }
930 
931 /*
932  * Power-up and configure camera sensor. It's ready for capturing now.
933  */
omap24xxcam_sensor_enable(struct omap24xxcam_device * cam)934 static int omap24xxcam_sensor_enable(struct omap24xxcam_device *cam)
935 {
936 	int rval;
937 
938 	omap24xxcam_clock_on(cam);
939 
940 	omap24xxcam_sensor_if_enable(cam);
941 
942 	rval = vidioc_int_s_power(cam->sdev, 1);
943 	if (rval)
944 		goto out;
945 
946 	rval = vidioc_int_init(cam->sdev);
947 	if (rval)
948 		goto out;
949 
950 	return 0;
951 
952 out:
953 	omap24xxcam_sensor_disable(cam);
954 
955 	return rval;
956 }
957 
omap24xxcam_sensor_reset_work(struct work_struct * work)958 static void omap24xxcam_sensor_reset_work(struct work_struct *work)
959 {
960 	struct omap24xxcam_device *cam =
961 		container_of(work, struct omap24xxcam_device,
962 			     sensor_reset_work);
963 
964 	if (atomic_read(&cam->reset_disable))
965 		return;
966 
967 	omap24xxcam_capture_stop(cam);
968 
969 	if (vidioc_int_reset(cam->sdev) == 0) {
970 		vidioc_int_init(cam->sdev);
971 	} else {
972 		/* Can't reset it by vidioc_int_reset. */
973 		omap24xxcam_sensor_disable(cam);
974 		omap24xxcam_sensor_enable(cam);
975 	}
976 
977 	omap24xxcam_capture_cont(cam);
978 }
979 
980 /*
981  *
982  * IOCTL interface.
983  *
984  */
985 
vidioc_querycap(struct file * file,void * fh,struct v4l2_capability * cap)986 static int vidioc_querycap(struct file *file, void *fh,
987 			   struct v4l2_capability *cap)
988 {
989 	struct omap24xxcam_fh *ofh = fh;
990 	struct omap24xxcam_device *cam = ofh->cam;
991 
992 	strlcpy(cap->driver, CAM_NAME, sizeof(cap->driver));
993 	strlcpy(cap->card, cam->vfd->name, sizeof(cap->card));
994 	cap->version = OMAP24XXCAM_VERSION;
995 	cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING;
996 
997 	return 0;
998 }
999 
vidioc_enum_fmt_vid_cap(struct file * file,void * fh,struct v4l2_fmtdesc * f)1000 static int vidioc_enum_fmt_vid_cap(struct file *file, void *fh,
1001 				   struct v4l2_fmtdesc *f)
1002 {
1003 	struct omap24xxcam_fh *ofh = fh;
1004 	struct omap24xxcam_device *cam = ofh->cam;
1005 	int rval;
1006 
1007 	rval = vidioc_int_enum_fmt_cap(cam->sdev, f);
1008 
1009 	return rval;
1010 }
1011 
vidioc_g_fmt_vid_cap(struct file * file,void * fh,struct v4l2_format * f)1012 static int vidioc_g_fmt_vid_cap(struct file *file, void *fh,
1013 				struct v4l2_format *f)
1014 {
1015 	struct omap24xxcam_fh *ofh = fh;
1016 	struct omap24xxcam_device *cam = ofh->cam;
1017 	int rval;
1018 
1019 	mutex_lock(&cam->mutex);
1020 	rval = vidioc_int_g_fmt_cap(cam->sdev, f);
1021 	mutex_unlock(&cam->mutex);
1022 
1023 	return rval;
1024 }
1025 
vidioc_s_fmt_vid_cap(struct file * file,void * fh,struct v4l2_format * f)1026 static int vidioc_s_fmt_vid_cap(struct file *file, void *fh,
1027 				struct v4l2_format *f)
1028 {
1029 	struct omap24xxcam_fh *ofh = fh;
1030 	struct omap24xxcam_device *cam = ofh->cam;
1031 	int rval;
1032 
1033 	mutex_lock(&cam->mutex);
1034 	if (cam->streaming) {
1035 		rval = -EBUSY;
1036 		goto out;
1037 	}
1038 
1039 	rval = vidioc_int_s_fmt_cap(cam->sdev, f);
1040 
1041 out:
1042 	mutex_unlock(&cam->mutex);
1043 
1044 	if (!rval) {
1045 		mutex_lock(&ofh->vbq.vb_lock);
1046 		ofh->pix = f->fmt.pix;
1047 		mutex_unlock(&ofh->vbq.vb_lock);
1048 	}
1049 
1050 	memset(f, 0, sizeof(*f));
1051 	vidioc_g_fmt_vid_cap(file, fh, f);
1052 
1053 	return rval;
1054 }
1055 
vidioc_try_fmt_vid_cap(struct file * file,void * fh,struct v4l2_format * f)1056 static int vidioc_try_fmt_vid_cap(struct file *file, void *fh,
1057 				  struct v4l2_format *f)
1058 {
1059 	struct omap24xxcam_fh *ofh = fh;
1060 	struct omap24xxcam_device *cam = ofh->cam;
1061 	int rval;
1062 
1063 	mutex_lock(&cam->mutex);
1064 	rval = vidioc_int_try_fmt_cap(cam->sdev, f);
1065 	mutex_unlock(&cam->mutex);
1066 
1067 	return rval;
1068 }
1069 
vidioc_reqbufs(struct file * file,void * fh,struct v4l2_requestbuffers * b)1070 static int vidioc_reqbufs(struct file *file, void *fh,
1071 			  struct v4l2_requestbuffers *b)
1072 {
1073 	struct omap24xxcam_fh *ofh = fh;
1074 	struct omap24xxcam_device *cam = ofh->cam;
1075 	int rval;
1076 
1077 	mutex_lock(&cam->mutex);
1078 	if (cam->streaming) {
1079 		mutex_unlock(&cam->mutex);
1080 		return -EBUSY;
1081 	}
1082 
1083 	omap24xxcam_vbq_free_mmap_buffers(&ofh->vbq);
1084 	mutex_unlock(&cam->mutex);
1085 
1086 	rval = videobuf_reqbufs(&ofh->vbq, b);
1087 
1088 	/*
1089 	 * Either videobuf_reqbufs failed or the buffers are not
1090 	 * memory-mapped (which would need special attention).
1091 	 */
1092 	if (rval < 0 || b->memory != V4L2_MEMORY_MMAP)
1093 		goto out;
1094 
1095 	rval = omap24xxcam_vbq_alloc_mmap_buffers(&ofh->vbq, rval);
1096 	if (rval)
1097 		omap24xxcam_vbq_free_mmap_buffers(&ofh->vbq);
1098 
1099 out:
1100 	return rval;
1101 }
1102 
vidioc_querybuf(struct file * file,void * fh,struct v4l2_buffer * b)1103 static int vidioc_querybuf(struct file *file, void *fh,
1104 			   struct v4l2_buffer *b)
1105 {
1106 	struct omap24xxcam_fh *ofh = fh;
1107 
1108 	return videobuf_querybuf(&ofh->vbq, b);
1109 }
1110 
vidioc_qbuf(struct file * file,void * fh,struct v4l2_buffer * b)1111 static int vidioc_qbuf(struct file *file, void *fh, struct v4l2_buffer *b)
1112 {
1113 	struct omap24xxcam_fh *ofh = fh;
1114 
1115 	return videobuf_qbuf(&ofh->vbq, b);
1116 }
1117 
vidioc_dqbuf(struct file * file,void * fh,struct v4l2_buffer * b)1118 static int vidioc_dqbuf(struct file *file, void *fh, struct v4l2_buffer *b)
1119 {
1120 	struct omap24xxcam_fh *ofh = fh;
1121 	struct omap24xxcam_device *cam = ofh->cam;
1122 	struct videobuf_buffer *vb;
1123 	int rval;
1124 
1125 videobuf_dqbuf_again:
1126 	rval = videobuf_dqbuf(&ofh->vbq, b, file->f_flags & O_NONBLOCK);
1127 	if (rval)
1128 		goto out;
1129 
1130 	vb = ofh->vbq.bufs[b->index];
1131 
1132 	mutex_lock(&cam->mutex);
1133 	/* _needs_reset returns -EIO if reset is required. */
1134 	rval = vidioc_int_g_needs_reset(cam->sdev, (void *)vb->baddr);
1135 	mutex_unlock(&cam->mutex);
1136 	if (rval == -EIO)
1137 		schedule_work(&cam->sensor_reset_work);
1138 	else
1139 		rval = 0;
1140 
1141 out:
1142 	/*
1143 	 * This is a hack. We don't want to show -EIO to the user
1144 	 * space. Requeue the buffer and try again if we're not doing
1145 	 * this in non-blocking mode.
1146 	 */
1147 	if (rval == -EIO) {
1148 		videobuf_qbuf(&ofh->vbq, b);
1149 		if (!(file->f_flags & O_NONBLOCK))
1150 			goto videobuf_dqbuf_again;
1151 		/*
1152 		 * We don't have a videobuf_buffer now --- maybe next
1153 		 * time...
1154 		 */
1155 		rval = -EAGAIN;
1156 	}
1157 
1158 	return rval;
1159 }
1160 
vidioc_streamon(struct file * file,void * fh,enum v4l2_buf_type i)1161 static int vidioc_streamon(struct file *file, void *fh, enum v4l2_buf_type i)
1162 {
1163 	struct omap24xxcam_fh *ofh = fh;
1164 	struct omap24xxcam_device *cam = ofh->cam;
1165 	int rval;
1166 
1167 	mutex_lock(&cam->mutex);
1168 	if (cam->streaming) {
1169 		rval = -EBUSY;
1170 		goto out;
1171 	}
1172 
1173 	rval = omap24xxcam_sensor_if_enable(cam);
1174 	if (rval) {
1175 		dev_dbg(cam->dev, "vidioc_int_g_ifparm failed\n");
1176 		goto out;
1177 	}
1178 
1179 	rval = videobuf_streamon(&ofh->vbq);
1180 	if (!rval) {
1181 		cam->streaming = file;
1182 		sysfs_notify(&cam->dev->kobj, NULL, "streaming");
1183 	}
1184 
1185 out:
1186 	mutex_unlock(&cam->mutex);
1187 
1188 	return rval;
1189 }
1190 
vidioc_streamoff(struct file * file,void * fh,enum v4l2_buf_type i)1191 static int vidioc_streamoff(struct file *file, void *fh, enum v4l2_buf_type i)
1192 {
1193 	struct omap24xxcam_fh *ofh = fh;
1194 	struct omap24xxcam_device *cam = ofh->cam;
1195 	struct videobuf_queue *q = &ofh->vbq;
1196 	int rval;
1197 
1198 	atomic_inc(&cam->reset_disable);
1199 
1200 	flush_scheduled_work();
1201 
1202 	rval = videobuf_streamoff(q);
1203 	if (!rval) {
1204 		mutex_lock(&cam->mutex);
1205 		cam->streaming = NULL;
1206 		mutex_unlock(&cam->mutex);
1207 		sysfs_notify(&cam->dev->kobj, NULL, "streaming");
1208 	}
1209 
1210 	atomic_dec(&cam->reset_disable);
1211 
1212 	return rval;
1213 }
1214 
vidioc_enum_input(struct file * file,void * fh,struct v4l2_input * inp)1215 static int vidioc_enum_input(struct file *file, void *fh,
1216 			     struct v4l2_input *inp)
1217 {
1218 	if (inp->index > 0)
1219 		return -EINVAL;
1220 
1221 	strlcpy(inp->name, "camera", sizeof(inp->name));
1222 	inp->type = V4L2_INPUT_TYPE_CAMERA;
1223 
1224 	return 0;
1225 }
1226 
vidioc_g_input(struct file * file,void * fh,unsigned int * i)1227 static int vidioc_g_input(struct file *file, void *fh, unsigned int *i)
1228 {
1229 	*i = 0;
1230 
1231 	return 0;
1232 }
1233 
vidioc_s_input(struct file * file,void * fh,unsigned int i)1234 static int vidioc_s_input(struct file *file, void *fh, unsigned int i)
1235 {
1236 	if (i > 0)
1237 		return -EINVAL;
1238 
1239 	return 0;
1240 }
1241 
vidioc_queryctrl(struct file * file,void * fh,struct v4l2_queryctrl * a)1242 static int vidioc_queryctrl(struct file *file, void *fh,
1243 			    struct v4l2_queryctrl *a)
1244 {
1245 	struct omap24xxcam_fh *ofh = fh;
1246 	struct omap24xxcam_device *cam = ofh->cam;
1247 	int rval;
1248 
1249 	rval = vidioc_int_queryctrl(cam->sdev, a);
1250 
1251 	return rval;
1252 }
1253 
vidioc_g_ctrl(struct file * file,void * fh,struct v4l2_control * a)1254 static int vidioc_g_ctrl(struct file *file, void *fh,
1255 			 struct v4l2_control *a)
1256 {
1257 	struct omap24xxcam_fh *ofh = fh;
1258 	struct omap24xxcam_device *cam = ofh->cam;
1259 	int rval;
1260 
1261 	mutex_lock(&cam->mutex);
1262 	rval = vidioc_int_g_ctrl(cam->sdev, a);
1263 	mutex_unlock(&cam->mutex);
1264 
1265 	return rval;
1266 }
1267 
vidioc_s_ctrl(struct file * file,void * fh,struct v4l2_control * a)1268 static int vidioc_s_ctrl(struct file *file, void *fh,
1269 			 struct v4l2_control *a)
1270 {
1271 	struct omap24xxcam_fh *ofh = fh;
1272 	struct omap24xxcam_device *cam = ofh->cam;
1273 	int rval;
1274 
1275 	mutex_lock(&cam->mutex);
1276 	rval = vidioc_int_s_ctrl(cam->sdev, a);
1277 	mutex_unlock(&cam->mutex);
1278 
1279 	return rval;
1280 }
1281 
vidioc_g_parm(struct file * file,void * fh,struct v4l2_streamparm * a)1282 static int vidioc_g_parm(struct file *file, void *fh,
1283 			 struct v4l2_streamparm *a) {
1284 	struct omap24xxcam_fh *ofh = fh;
1285 	struct omap24xxcam_device *cam = ofh->cam;
1286 	int rval;
1287 
1288 	if (a->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1289 		return -EINVAL;
1290 
1291 	mutex_lock(&cam->mutex);
1292 	rval = vidioc_int_g_parm(cam->sdev, a);
1293 	mutex_unlock(&cam->mutex);
1294 
1295 	return rval;
1296 }
1297 
vidioc_s_parm(struct file * file,void * fh,struct v4l2_streamparm * a)1298 static int vidioc_s_parm(struct file *file, void *fh,
1299 			 struct v4l2_streamparm *a)
1300 {
1301 	struct omap24xxcam_fh *ofh = fh;
1302 	struct omap24xxcam_device *cam = ofh->cam;
1303 	struct v4l2_streamparm old_streamparm;
1304 	int rval;
1305 
1306 	if (a->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1307 		return -EINVAL;
1308 
1309 	mutex_lock(&cam->mutex);
1310 	if (cam->streaming) {
1311 		rval = -EBUSY;
1312 		goto out;
1313 	}
1314 
1315 	old_streamparm.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1316 	rval = vidioc_int_g_parm(cam->sdev, &old_streamparm);
1317 	if (rval)
1318 		goto out;
1319 
1320 	rval = vidioc_int_s_parm(cam->sdev, a);
1321 	if (rval)
1322 		goto out;
1323 
1324 	rval = omap24xxcam_sensor_if_enable(cam);
1325 	/*
1326 	 * Revert to old streaming parameters if enabling sensor
1327 	 * interface with the new ones failed.
1328 	 */
1329 	if (rval)
1330 		vidioc_int_s_parm(cam->sdev, &old_streamparm);
1331 
1332 out:
1333 	mutex_unlock(&cam->mutex);
1334 
1335 	return rval;
1336 }
1337 
1338 /*
1339  *
1340  * File operations.
1341  *
1342  */
1343 
omap24xxcam_poll(struct file * file,struct poll_table_struct * wait)1344 static unsigned int omap24xxcam_poll(struct file *file,
1345 				     struct poll_table_struct *wait)
1346 {
1347 	struct omap24xxcam_fh *fh = file->private_data;
1348 	struct omap24xxcam_device *cam = fh->cam;
1349 	struct videobuf_buffer *vb;
1350 
1351 	mutex_lock(&cam->mutex);
1352 	if (cam->streaming != file) {
1353 		mutex_unlock(&cam->mutex);
1354 		return POLLERR;
1355 	}
1356 	mutex_unlock(&cam->mutex);
1357 
1358 	mutex_lock(&fh->vbq.vb_lock);
1359 	if (list_empty(&fh->vbq.stream)) {
1360 		mutex_unlock(&fh->vbq.vb_lock);
1361 		return POLLERR;
1362 	}
1363 	vb = list_entry(fh->vbq.stream.next, struct videobuf_buffer, stream);
1364 	mutex_unlock(&fh->vbq.vb_lock);
1365 
1366 	poll_wait(file, &vb->done, wait);
1367 
1368 	if (vb->state == VIDEOBUF_DONE || vb->state == VIDEOBUF_ERROR)
1369 		return POLLIN | POLLRDNORM;
1370 
1371 	return 0;
1372 }
1373 
omap24xxcam_mmap_buffers(struct file * file,struct vm_area_struct * vma)1374 static int omap24xxcam_mmap_buffers(struct file *file,
1375 				    struct vm_area_struct *vma)
1376 {
1377 	struct omap24xxcam_fh *fh = file->private_data;
1378 	struct omap24xxcam_device *cam = fh->cam;
1379 	struct videobuf_queue *vbq = &fh->vbq;
1380 	unsigned int first, last, size, i, j;
1381 	int err = 0;
1382 
1383 	mutex_lock(&cam->mutex);
1384 	if (cam->streaming) {
1385 		mutex_unlock(&cam->mutex);
1386 		return -EBUSY;
1387 	}
1388 	mutex_unlock(&cam->mutex);
1389 	mutex_lock(&vbq->vb_lock);
1390 
1391 	/* look for first buffer to map */
1392 	for (first = 0; first < VIDEO_MAX_FRAME; first++) {
1393 		if (NULL == vbq->bufs[first])
1394 			continue;
1395 		if (V4L2_MEMORY_MMAP != vbq->bufs[first]->memory)
1396 			continue;
1397 		if (vbq->bufs[first]->boff == (vma->vm_pgoff << PAGE_SHIFT))
1398 			break;
1399 	}
1400 
1401 	/* look for last buffer to map */
1402 	for (size = 0, last = first; last < VIDEO_MAX_FRAME; last++) {
1403 		if (NULL == vbq->bufs[last])
1404 			continue;
1405 		if (V4L2_MEMORY_MMAP != vbq->bufs[last]->memory)
1406 			continue;
1407 		size += vbq->bufs[last]->bsize;
1408 		if (size == (vma->vm_end - vma->vm_start))
1409 			break;
1410 	}
1411 
1412 	size = 0;
1413 	for (i = first; i <= last; i++) {
1414 		struct videobuf_dmabuf *dma = videobuf_to_dma(vbq->bufs[i]);
1415 
1416 		for (j = 0; j < dma->sglen; j++) {
1417 			err = remap_pfn_range(
1418 				vma, vma->vm_start + size,
1419 				page_to_pfn(sg_page(&dma->sglist[j])),
1420 				sg_dma_len(&dma->sglist[j]), vma->vm_page_prot);
1421 			if (err)
1422 				goto out;
1423 			size += sg_dma_len(&dma->sglist[j]);
1424 		}
1425 	}
1426 
1427 out:
1428 	mutex_unlock(&vbq->vb_lock);
1429 
1430 	return err;
1431 }
1432 
omap24xxcam_mmap(struct file * file,struct vm_area_struct * vma)1433 static int omap24xxcam_mmap(struct file *file, struct vm_area_struct *vma)
1434 {
1435 	struct omap24xxcam_fh *fh = file->private_data;
1436 	int rval;
1437 
1438 	/* let the video-buf mapper check arguments and set-up structures */
1439 	rval = videobuf_mmap_mapper(&fh->vbq, vma);
1440 	if (rval)
1441 		return rval;
1442 
1443 	vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
1444 
1445 	/* do mapping to our allocated buffers */
1446 	rval = omap24xxcam_mmap_buffers(file, vma);
1447 	/*
1448 	 * In case of error, free vma->vm_private_data allocated by
1449 	 * videobuf_mmap_mapper.
1450 	 */
1451 	if (rval)
1452 		kfree(vma->vm_private_data);
1453 
1454 	return rval;
1455 }
1456 
omap24xxcam_open(struct file * file)1457 static int omap24xxcam_open(struct file *file)
1458 {
1459 	int minor = video_devdata(file)->minor;
1460 	struct omap24xxcam_device *cam = omap24xxcam.priv;
1461 	struct omap24xxcam_fh *fh;
1462 	struct v4l2_format format;
1463 
1464 	if (!cam || !cam->vfd || (cam->vfd->minor != minor))
1465 		return -ENODEV;
1466 
1467 	fh = kzalloc(sizeof(*fh), GFP_KERNEL);
1468 	if (fh == NULL)
1469 		return -ENOMEM;
1470 
1471 	mutex_lock(&cam->mutex);
1472 	if (cam->sdev == NULL || !try_module_get(cam->sdev->module)) {
1473 		mutex_unlock(&cam->mutex);
1474 		goto out_try_module_get;
1475 	}
1476 
1477 	if (atomic_inc_return(&cam->users) == 1) {
1478 		omap24xxcam_hwinit(cam);
1479 		if (omap24xxcam_sensor_enable(cam)) {
1480 			mutex_unlock(&cam->mutex);
1481 			goto out_omap24xxcam_sensor_enable;
1482 		}
1483 	}
1484 	mutex_unlock(&cam->mutex);
1485 
1486 	fh->cam = cam;
1487 	mutex_lock(&cam->mutex);
1488 	vidioc_int_g_fmt_cap(cam->sdev, &format);
1489 	mutex_unlock(&cam->mutex);
1490 	/* FIXME: how about fh->pix when there are more users? */
1491 	fh->pix = format.fmt.pix;
1492 
1493 	file->private_data = fh;
1494 
1495 	spin_lock_init(&fh->vbq_lock);
1496 
1497 	videobuf_queue_sg_init(&fh->vbq, &omap24xxcam_vbq_ops, NULL,
1498 				&fh->vbq_lock, V4L2_BUF_TYPE_VIDEO_CAPTURE,
1499 				V4L2_FIELD_NONE,
1500 				sizeof(struct videobuf_buffer), fh);
1501 
1502 	return 0;
1503 
1504 out_omap24xxcam_sensor_enable:
1505 	omap24xxcam_poweron_reset(cam);
1506 	module_put(cam->sdev->module);
1507 
1508 out_try_module_get:
1509 	kfree(fh);
1510 
1511 	return -ENODEV;
1512 }
1513 
omap24xxcam_release(struct file * file)1514 static int omap24xxcam_release(struct file *file)
1515 {
1516 	struct omap24xxcam_fh *fh = file->private_data;
1517 	struct omap24xxcam_device *cam = fh->cam;
1518 
1519 	atomic_inc(&cam->reset_disable);
1520 
1521 	flush_scheduled_work();
1522 
1523 	/* stop streaming capture */
1524 	videobuf_streamoff(&fh->vbq);
1525 
1526 	mutex_lock(&cam->mutex);
1527 	if (cam->streaming == file) {
1528 		cam->streaming = NULL;
1529 		mutex_unlock(&cam->mutex);
1530 		sysfs_notify(&cam->dev->kobj, NULL, "streaming");
1531 	} else {
1532 		mutex_unlock(&cam->mutex);
1533 	}
1534 
1535 	atomic_dec(&cam->reset_disable);
1536 
1537 	omap24xxcam_vbq_free_mmap_buffers(&fh->vbq);
1538 
1539 	/*
1540 	 * Make sure the reset work we might have scheduled is not
1541 	 * pending! It may be run *only* if we have users. (And it may
1542 	 * not be scheduled anymore since streaming is already
1543 	 * disabled.)
1544 	 */
1545 	flush_scheduled_work();
1546 
1547 	mutex_lock(&cam->mutex);
1548 	if (atomic_dec_return(&cam->users) == 0) {
1549 		omap24xxcam_sensor_disable(cam);
1550 		omap24xxcam_poweron_reset(cam);
1551 	}
1552 	mutex_unlock(&cam->mutex);
1553 
1554 	file->private_data = NULL;
1555 
1556 	module_put(cam->sdev->module);
1557 	kfree(fh);
1558 
1559 	return 0;
1560 }
1561 
1562 static struct v4l2_file_operations omap24xxcam_fops = {
1563 	.ioctl	 = video_ioctl2,
1564 	.poll	 = omap24xxcam_poll,
1565 	.mmap	 = omap24xxcam_mmap,
1566 	.open	 = omap24xxcam_open,
1567 	.release = omap24xxcam_release,
1568 };
1569 
1570 /*
1571  *
1572  * Power management.
1573  *
1574  */
1575 
1576 #ifdef CONFIG_PM
omap24xxcam_suspend(struct platform_device * pdev,pm_message_t state)1577 static int omap24xxcam_suspend(struct platform_device *pdev, pm_message_t state)
1578 {
1579 	struct omap24xxcam_device *cam = platform_get_drvdata(pdev);
1580 
1581 	if (atomic_read(&cam->users) == 0)
1582 		return 0;
1583 
1584 	if (!atomic_read(&cam->reset_disable))
1585 		omap24xxcam_capture_stop(cam);
1586 
1587 	omap24xxcam_sensor_disable(cam);
1588 	omap24xxcam_poweron_reset(cam);
1589 
1590 	return 0;
1591 }
1592 
omap24xxcam_resume(struct platform_device * pdev)1593 static int omap24xxcam_resume(struct platform_device *pdev)
1594 {
1595 	struct omap24xxcam_device *cam = platform_get_drvdata(pdev);
1596 
1597 	if (atomic_read(&cam->users) == 0)
1598 		return 0;
1599 
1600 	omap24xxcam_hwinit(cam);
1601 	omap24xxcam_sensor_enable(cam);
1602 
1603 	if (!atomic_read(&cam->reset_disable))
1604 		omap24xxcam_capture_cont(cam);
1605 
1606 	return 0;
1607 }
1608 #endif /* CONFIG_PM */
1609 
1610 static const struct v4l2_ioctl_ops omap24xxcam_ioctl_fops = {
1611 	.vidioc_querycap	= vidioc_querycap,
1612 	.vidioc_enum_fmt_vid_cap	= vidioc_enum_fmt_vid_cap,
1613 	.vidioc_g_fmt_vid_cap	= vidioc_g_fmt_vid_cap,
1614 	.vidioc_s_fmt_vid_cap	= vidioc_s_fmt_vid_cap,
1615 	.vidioc_try_fmt_vid_cap	= vidioc_try_fmt_vid_cap,
1616 	.vidioc_reqbufs		= vidioc_reqbufs,
1617 	.vidioc_querybuf	= vidioc_querybuf,
1618 	.vidioc_qbuf		= vidioc_qbuf,
1619 	.vidioc_dqbuf		= vidioc_dqbuf,
1620 	.vidioc_streamon	= vidioc_streamon,
1621 	.vidioc_streamoff	= vidioc_streamoff,
1622 	.vidioc_enum_input	= vidioc_enum_input,
1623 	.vidioc_g_input		= vidioc_g_input,
1624 	.vidioc_s_input		= vidioc_s_input,
1625 	.vidioc_queryctrl	= vidioc_queryctrl,
1626 	.vidioc_g_ctrl		= vidioc_g_ctrl,
1627 	.vidioc_s_ctrl		= vidioc_s_ctrl,
1628 	.vidioc_g_parm		= vidioc_g_parm,
1629 	.vidioc_s_parm		= vidioc_s_parm,
1630 };
1631 
1632 /*
1633  *
1634  * Camera device (i.e. /dev/video).
1635  *
1636  */
1637 
omap24xxcam_device_register(struct v4l2_int_device * s)1638 static int omap24xxcam_device_register(struct v4l2_int_device *s)
1639 {
1640 	struct omap24xxcam_device *cam = s->u.slave->master->priv;
1641 	struct video_device *vfd;
1642 	int rval;
1643 
1644 	/* We already have a slave. */
1645 	if (cam->sdev)
1646 		return -EBUSY;
1647 
1648 	cam->sdev = s;
1649 
1650 	if (device_create_file(cam->dev, &dev_attr_streaming) != 0) {
1651 		dev_err(cam->dev, "could not register sysfs entry\n");
1652 		rval = -EBUSY;
1653 		goto err;
1654 	}
1655 
1656 	/* initialize the video_device struct */
1657 	vfd = cam->vfd = video_device_alloc();
1658 	if (!vfd) {
1659 		dev_err(cam->dev, "could not allocate video device struct\n");
1660 		rval = -ENOMEM;
1661 		goto err;
1662 	}
1663 	vfd->release = video_device_release;
1664 
1665 	vfd->parent = cam->dev;
1666 
1667 	strlcpy(vfd->name, CAM_NAME, sizeof(vfd->name));
1668 	vfd->vfl_type		 = VID_TYPE_CAPTURE | VID_TYPE_CHROMAKEY;
1669 	vfd->fops		 = &omap24xxcam_fops;
1670 	vfd->minor		 = -1;
1671 	vfd->ioctl_ops		 = &omap24xxcam_ioctl_fops;
1672 
1673 	omap24xxcam_hwinit(cam);
1674 
1675 	rval = omap24xxcam_sensor_init(cam);
1676 	if (rval)
1677 		goto err;
1678 
1679 	if (video_register_device(vfd, VFL_TYPE_GRABBER, video_nr) < 0) {
1680 		dev_err(cam->dev, "could not register V4L device\n");
1681 		vfd->minor = -1;
1682 		rval = -EBUSY;
1683 		goto err;
1684 	}
1685 
1686 	omap24xxcam_poweron_reset(cam);
1687 
1688 	dev_info(cam->dev, "registered device video%d\n", vfd->minor);
1689 
1690 	return 0;
1691 
1692 err:
1693 	omap24xxcam_device_unregister(s);
1694 
1695 	return rval;
1696 }
1697 
omap24xxcam_device_unregister(struct v4l2_int_device * s)1698 static void omap24xxcam_device_unregister(struct v4l2_int_device *s)
1699 {
1700 	struct omap24xxcam_device *cam = s->u.slave->master->priv;
1701 
1702 	omap24xxcam_sensor_exit(cam);
1703 
1704 	if (cam->vfd) {
1705 		if (cam->vfd->minor == -1) {
1706 			/*
1707 			 * The device was never registered, so release the
1708 			 * video_device struct directly.
1709 			 */
1710 			video_device_release(cam->vfd);
1711 		} else {
1712 			/*
1713 			 * The unregister function will release the
1714 			 * video_device struct as well as
1715 			 * unregistering it.
1716 			 */
1717 			video_unregister_device(cam->vfd);
1718 		}
1719 		cam->vfd = NULL;
1720 	}
1721 
1722 	device_remove_file(cam->dev, &dev_attr_streaming);
1723 
1724 	cam->sdev = NULL;
1725 }
1726 
1727 static struct v4l2_int_master omap24xxcam_master = {
1728 	.attach = omap24xxcam_device_register,
1729 	.detach = omap24xxcam_device_unregister,
1730 };
1731 
1732 static struct v4l2_int_device omap24xxcam = {
1733 	.module	= THIS_MODULE,
1734 	.name	= CAM_NAME,
1735 	.type	= v4l2_int_type_master,
1736 	.u	= {
1737 		.master = &omap24xxcam_master
1738 	},
1739 };
1740 
1741 /*
1742  *
1743  * Driver initialisation and deinitialisation.
1744  *
1745  */
1746 
omap24xxcam_probe(struct platform_device * pdev)1747 static int __init omap24xxcam_probe(struct platform_device *pdev)
1748 {
1749 	struct omap24xxcam_device *cam;
1750 	struct resource *mem;
1751 	int irq;
1752 
1753 	cam = kzalloc(sizeof(*cam), GFP_KERNEL);
1754 	if (!cam) {
1755 		dev_err(&pdev->dev, "could not allocate memory\n");
1756 		goto err;
1757 	}
1758 
1759 	platform_set_drvdata(pdev, cam);
1760 
1761 	cam->dev = &pdev->dev;
1762 
1763 	/*
1764 	 * Impose a lower limit on the amount of memory allocated for
1765 	 * capture. We require at least enough memory to double-buffer
1766 	 * QVGA (300KB).
1767 	 */
1768 	if (capture_mem < 320 * 240 * 2 * 2)
1769 		capture_mem = 320 * 240 * 2 * 2;
1770 	cam->capture_mem = capture_mem;
1771 
1772 	/* request the mem region for the camera registers */
1773 	mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1774 	if (!mem) {
1775 		dev_err(cam->dev, "no mem resource?\n");
1776 		goto err;
1777 	}
1778 	if (!request_mem_region(mem->start, (mem->end - mem->start) + 1,
1779 				pdev->name)) {
1780 		dev_err(cam->dev,
1781 			"cannot reserve camera register I/O region\n");
1782 		goto err;
1783 	}
1784 	cam->mmio_base_phys = mem->start;
1785 	cam->mmio_size = (mem->end - mem->start) + 1;
1786 
1787 	/* map the region */
1788 	cam->mmio_base = (unsigned long)
1789 		ioremap_nocache(cam->mmio_base_phys, cam->mmio_size);
1790 	if (!cam->mmio_base) {
1791 		dev_err(cam->dev, "cannot map camera register I/O region\n");
1792 		goto err;
1793 	}
1794 
1795 	irq = platform_get_irq(pdev, 0);
1796 	if (irq <= 0) {
1797 		dev_err(cam->dev, "no irq for camera?\n");
1798 		goto err;
1799 	}
1800 
1801 	/* install the interrupt service routine */
1802 	if (request_irq(irq, omap24xxcam_isr, 0, CAM_NAME, cam)) {
1803 		dev_err(cam->dev,
1804 			"could not install interrupt service routine\n");
1805 		goto err;
1806 	}
1807 	cam->irq = irq;
1808 
1809 	if (omap24xxcam_clock_get(cam))
1810 		goto err;
1811 
1812 	INIT_WORK(&cam->sensor_reset_work, omap24xxcam_sensor_reset_work);
1813 
1814 	mutex_init(&cam->mutex);
1815 	spin_lock_init(&cam->core_enable_disable_lock);
1816 
1817 	omap24xxcam_sgdma_init(&cam->sgdma,
1818 			       cam->mmio_base + CAMDMA_REG_OFFSET,
1819 			       omap24xxcam_stalled_dma_reset,
1820 			       (unsigned long)cam);
1821 
1822 	omap24xxcam.priv = cam;
1823 
1824 	if (v4l2_int_device_register(&omap24xxcam))
1825 		goto err;
1826 
1827 	return 0;
1828 
1829 err:
1830 	omap24xxcam_remove(pdev);
1831 	return -ENODEV;
1832 }
1833 
omap24xxcam_remove(struct platform_device * pdev)1834 static int omap24xxcam_remove(struct platform_device *pdev)
1835 {
1836 	struct omap24xxcam_device *cam = platform_get_drvdata(pdev);
1837 
1838 	if (!cam)
1839 		return 0;
1840 
1841 	if (omap24xxcam.priv != NULL)
1842 		v4l2_int_device_unregister(&omap24xxcam);
1843 	omap24xxcam.priv = NULL;
1844 
1845 	omap24xxcam_clock_put(cam);
1846 
1847 	if (cam->irq) {
1848 		free_irq(cam->irq, cam);
1849 		cam->irq = 0;
1850 	}
1851 
1852 	if (cam->mmio_base) {
1853 		iounmap((void *)cam->mmio_base);
1854 		cam->mmio_base = 0;
1855 	}
1856 
1857 	if (cam->mmio_base_phys) {
1858 		release_mem_region(cam->mmio_base_phys, cam->mmio_size);
1859 		cam->mmio_base_phys = 0;
1860 	}
1861 
1862 	kfree(cam);
1863 
1864 	return 0;
1865 }
1866 
1867 static struct platform_driver omap24xxcam_driver = {
1868 	.probe	 = omap24xxcam_probe,
1869 	.remove	 = omap24xxcam_remove,
1870 #ifdef CONFIG_PM
1871 	.suspend = omap24xxcam_suspend,
1872 	.resume	 = omap24xxcam_resume,
1873 #endif
1874 	.driver	 = {
1875 		.name = CAM_NAME,
1876 		.owner = THIS_MODULE,
1877 	},
1878 };
1879 
1880 /*
1881  *
1882  * Module initialisation and deinitialisation
1883  *
1884  */
1885 
omap24xxcam_init(void)1886 static int __init omap24xxcam_init(void)
1887 {
1888 	return platform_driver_register(&omap24xxcam_driver);
1889 }
1890 
omap24xxcam_cleanup(void)1891 static void __exit omap24xxcam_cleanup(void)
1892 {
1893 	platform_driver_unregister(&omap24xxcam_driver);
1894 }
1895 
1896 MODULE_AUTHOR("Sakari Ailus <sakari.ailus@nokia.com>");
1897 MODULE_DESCRIPTION("OMAP24xx Video for Linux camera driver");
1898 MODULE_LICENSE("GPL");
1899 module_param(video_nr, int, 0);
1900 MODULE_PARM_DESC(video_nr,
1901 		 "Minor number for video device (-1 ==> auto assign)");
1902 module_param(capture_mem, int, 0);
1903 MODULE_PARM_DESC(capture_mem, "Maximum amount of memory for capture "
1904 		 "buffers (default 4800kiB)");
1905 
1906 module_init(omap24xxcam_init);
1907 module_exit(omap24xxcam_cleanup);
1908