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