linux/drivers/media/video/omap24xxcam.c
<<
>>
Prefs
   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
  50static void omap24xxcam_reset(struct omap24xxcam_device *cam);
  51static int omap24xxcam_sensor_if_enable(struct omap24xxcam_device *cam);
  52static void omap24xxcam_device_unregister(struct v4l2_int_device *s);
  53static int omap24xxcam_remove(struct platform_device *pdev);
  54
  55/* module parameters */
  56static 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 */
  61static int capture_mem = 1280 * 960 * 2 * 2;
  62
  63static struct v4l2_int_device omap24xxcam;
  64
  65/*
  66 *
  67 * Clocks.
  68 *
  69 */
  70
  71static 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
  81static 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
 103static void omap24xxcam_clock_on(struct omap24xxcam_device *cam)
 104{
 105        clk_enable(cam->fck);
 106        clk_enable(cam->ick);
 107}
 108
 109static 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 */
 126static 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
 144static 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 */
 170static 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 */
 185static 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. */
 192static 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 */
 230static 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. */
 257static 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 */
 283static 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
 348out:
 349        omap24xxcam_vbq_free_mmap_buffer(vb);
 350        return err;
 351}
 352
 353static 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;
 373out:
 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 */
 388static 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
 418static 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 */
 442static 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
 462static 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
 478static 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
 544static 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
 585static 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 */
 601static 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 */
 625static 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 */
 646static 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 */
 667static 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 */
 696static 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
 714out:
 715        atomic_dec(&cam->in_reset);
 716        spin_unlock_irqrestore(&cam->core_enable_disable_lock, flags);
 717}
 718
 719static ssize_t
 720omap24xxcam_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}
 727static 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 */
 732static 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 */
 741static 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 */
 776static 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
 872static 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 */
 884static 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
 911out:
 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
 920static void omap24xxcam_sensor_exit(struct omap24xxcam_device *cam)
 921{
 922        if (cam->sdev)
 923                vidioc_int_dev_exit(cam->sdev);
 924}
 925
 926static 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 */
 936static 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
 954out:
 955        omap24xxcam_sensor_disable(cam);
 956
 957        return rval;
 958}
 959
 960static 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
 988static 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
1001static 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
1013static 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
1027static 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
1042out:
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
1057static 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
1071static 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
1100out:
1101        return rval;
1102}
1103
1104static 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
1112static 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
1119static 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
1126videobuf_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
1142out:
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
1162static 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
1186out:
1187        mutex_unlock(&cam->mutex);
1188
1189        return rval;
1190}
1191
1192static 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
1216static 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
1228static int vidioc_g_input(struct file *file, void *fh, unsigned int *i)
1229{
1230        *i = 0;
1231
1232        return 0;
1233}
1234
1235static 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
1243static 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
1255static 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
1269static 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
1283static 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
1296static 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
1327out:
1328        mutex_unlock(&cam->mutex);
1329
1330        return rval;
1331}
1332
1333/*
1334 *
1335 * File operations.
1336 *
1337 */
1338
1339static 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
1369static 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
1422out:
1423        mutex_unlock(&vbq->vb_lock);
1424
1425        return err;
1426}
1427
1428static 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
1452static 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
1498out_omap24xxcam_sensor_enable:
1499        omap24xxcam_poweron_reset(cam);
1500        module_put(cam->sdev->module);
1501
1502out_try_module_get:
1503        kfree(fh);
1504
1505        return -ENODEV;
1506}
1507
1508static 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
1556static 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
1571static 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
1587static 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
1604static 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
1632static 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
1684err:
1685        omap24xxcam_device_unregister(s);
1686
1687        return rval;
1688}
1689
1690static 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
1719static struct v4l2_int_master omap24xxcam_master = {
1720        .attach = omap24xxcam_device_register,
1721        .detach = omap24xxcam_device_unregister,
1722};
1723
1724static 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
1739static 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
1820err:
1821        omap24xxcam_remove(pdev);
1822        return -ENODEV;
1823}
1824
1825static 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
1858static 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
1877static int __init omap24xxcam_init(void)
1878{
1879        return platform_driver_register(&omap24xxcam_driver);
1880}
1881
1882static void __exit omap24xxcam_cleanup(void)
1883{
1884        platform_driver_unregister(&omap24xxcam_driver);
1885}
1886
1887MODULE_AUTHOR("Sakari Ailus <sakari.ailus@nokia.com>");
1888MODULE_DESCRIPTION("OMAP24xx Video for Linux camera driver");
1889MODULE_LICENSE("GPL");
1890MODULE_VERSION(OMAP24XXCAM_VERSION);
1891module_param(video_nr, int, 0);
1892MODULE_PARM_DESC(video_nr,
1893                 "Minor number for video device (-1 ==> auto assign)");
1894module_param(capture_mem, int, 0);
1895MODULE_PARM_DESC(capture_mem, "Maximum amount of memory for capture "
1896                 "buffers (default 4800kiB)");
1897
1898module_init(omap24xxcam_init);
1899module_exit(omap24xxcam_cleanup);
1900