linux/drivers/media/platform/via-camera.c
<<
>>
Prefs
   1/*
   2 * Driver for the VIA Chrome integrated camera controller.
   3 *
   4 * Copyright 2009,2010 Jonathan Corbet <corbet@lwn.net>
   5 * Distributable under the terms of the GNU General Public License, version 2
   6 *
   7 * This work was supported by the One Laptop Per Child project
   8 */
   9#include <linux/kernel.h>
  10#include <linux/module.h>
  11#include <linux/device.h>
  12#include <linux/list.h>
  13#include <linux/pci.h>
  14#include <linux/gpio.h>
  15#include <linux/interrupt.h>
  16#include <linux/platform_device.h>
  17#include <linux/videodev2.h>
  18#include <media/v4l2-device.h>
  19#include <media/v4l2-ioctl.h>
  20#include <media/v4l2-chip-ident.h>
  21#include <media/v4l2-ctrls.h>
  22#include <media/ov7670.h>
  23#include <media/videobuf-dma-sg.h>
  24#include <linux/delay.h>
  25#include <linux/dma-mapping.h>
  26#include <linux/pm_qos.h>
  27#include <linux/via-core.h>
  28#include <linux/via-gpio.h>
  29#include <linux/via_i2c.h>
  30#include <asm/olpc.h>
  31
  32#include "via-camera.h"
  33
  34MODULE_ALIAS("platform:viafb-camera");
  35MODULE_AUTHOR("Jonathan Corbet <corbet@lwn.net>");
  36MODULE_DESCRIPTION("VIA framebuffer-based camera controller driver");
  37MODULE_LICENSE("GPL");
  38
  39static bool flip_image;
  40module_param(flip_image, bool, 0444);
  41MODULE_PARM_DESC(flip_image,
  42                "If set, the sensor will be instructed to flip the image "
  43                "vertically.");
  44
  45static bool override_serial;
  46module_param(override_serial, bool, 0444);
  47MODULE_PARM_DESC(override_serial,
  48                "The camera driver will normally refuse to load if "
  49                "the XO 1.5 serial port is enabled.  Set this option "
  50                "to force-enable the camera.");
  51
  52/*
  53 * Basic window sizes.
  54 */
  55#define VGA_WIDTH       640
  56#define VGA_HEIGHT      480
  57#define QCIF_WIDTH      176
  58#define QCIF_HEIGHT     144
  59
  60/*
  61 * The structure describing our camera.
  62 */
  63enum viacam_opstate { S_IDLE = 0, S_RUNNING = 1 };
  64
  65struct via_camera {
  66        struct v4l2_device v4l2_dev;
  67        struct v4l2_ctrl_handler ctrl_handler;
  68        struct video_device vdev;
  69        struct v4l2_subdev *sensor;
  70        struct platform_device *platdev;
  71        struct viafb_dev *viadev;
  72        struct mutex lock;
  73        enum viacam_opstate opstate;
  74        unsigned long flags;
  75        struct pm_qos_request qos_request;
  76        /*
  77         * GPIO info for power/reset management
  78         */
  79        int power_gpio;
  80        int reset_gpio;
  81        /*
  82         * I/O memory stuff.
  83         */
  84        void __iomem *mmio;     /* Where the registers live */
  85        void __iomem *fbmem;    /* Frame buffer memory */
  86        u32 fb_offset;          /* Reserved memory offset (FB) */
  87        /*
  88         * Capture buffers and related.  The controller supports
  89         * up to three, so that's what we have here.  These buffers
  90         * live in frame buffer memory, so we don't call them "DMA".
  91         */
  92        unsigned int cb_offsets[3];     /* offsets into fb mem */
  93        u8 *cb_addrs[3];                /* Kernel-space addresses */
  94        int n_cap_bufs;                 /* How many are we using? */
  95        int next_buf;
  96        struct videobuf_queue vb_queue;
  97        struct list_head buffer_queue;  /* prot. by reg_lock */
  98        /*
  99         * User tracking.
 100         */
 101        int users;
 102        struct file *owner;
 103        /*
 104         * Video format information.  sensor_format is kept in a form
 105         * that we can use to pass to the sensor.  We always run the
 106         * sensor in VGA resolution, though, and let the controller
 107         * downscale things if need be.  So we keep the "real*
 108         * dimensions separately.
 109         */
 110        struct v4l2_pix_format sensor_format;
 111        struct v4l2_pix_format user_format;
 112        enum v4l2_mbus_pixelcode mbus_code;
 113};
 114
 115/*
 116 * Yes, this is a hack, but there's only going to be one of these
 117 * on any system we know of.
 118 */
 119static struct via_camera *via_cam_info;
 120
 121/*
 122 * Flag values, manipulated with bitops
 123 */
 124#define CF_DMA_ACTIVE    0      /* A frame is incoming */
 125#define CF_CONFIG_NEEDED 1      /* Must configure hardware */
 126
 127
 128/*
 129 * Nasty ugly v4l2 boilerplate.
 130 */
 131#define sensor_call(cam, optype, func, args...) \
 132        v4l2_subdev_call(cam->sensor, optype, func, ##args)
 133
 134/*
 135 * Debugging and related.
 136 */
 137#define cam_err(cam, fmt, arg...) \
 138        dev_err(&(cam)->platdev->dev, fmt, ##arg);
 139#define cam_warn(cam, fmt, arg...) \
 140        dev_warn(&(cam)->platdev->dev, fmt, ##arg);
 141#define cam_dbg(cam, fmt, arg...) \
 142        dev_dbg(&(cam)->platdev->dev, fmt, ##arg);
 143
 144/*
 145 * Format handling.  This is ripped almost directly from Hans's changes
 146 * to cafe_ccic.c.  It's a little unfortunate; until this change, we
 147 * didn't need to know anything about the format except its byte depth;
 148 * now this information must be managed at this level too.
 149 */
 150static struct via_format {
 151        __u8 *desc;
 152        __u32 pixelformat;
 153        int bpp;   /* Bytes per pixel */
 154        enum v4l2_mbus_pixelcode mbus_code;
 155} via_formats[] = {
 156        {
 157                .desc           = "YUYV 4:2:2",
 158                .pixelformat    = V4L2_PIX_FMT_YUYV,
 159                .mbus_code      = V4L2_MBUS_FMT_YUYV8_2X8,
 160                .bpp            = 2,
 161        },
 162        /* RGB444 and Bayer should be doable, but have never been
 163           tested with this driver. RGB565 seems to work at the default
 164           resolution, but results in color corruption when being scaled by
 165           viacam_set_scaled(), and is disabled as a result. */
 166};
 167#define N_VIA_FMTS ARRAY_SIZE(via_formats)
 168
 169static struct via_format *via_find_format(u32 pixelformat)
 170{
 171        unsigned i;
 172
 173        for (i = 0; i < N_VIA_FMTS; i++)
 174                if (via_formats[i].pixelformat == pixelformat)
 175                        return via_formats + i;
 176        /* Not found? Then return the first format. */
 177        return via_formats;
 178}
 179
 180
 181/*--------------------------------------------------------------------------*/
 182/*
 183 * Sensor power/reset management.  This piece is OLPC-specific for
 184 * sure; other configurations will have things connected differently.
 185 */
 186static int via_sensor_power_setup(struct via_camera *cam)
 187{
 188        int ret;
 189
 190        cam->power_gpio = viafb_gpio_lookup("VGPIO3");
 191        cam->reset_gpio = viafb_gpio_lookup("VGPIO2");
 192        if (cam->power_gpio < 0 || cam->reset_gpio < 0) {
 193                dev_err(&cam->platdev->dev, "Unable to find GPIO lines\n");
 194                return -EINVAL;
 195        }
 196        ret = gpio_request(cam->power_gpio, "viafb-camera");
 197        if (ret) {
 198                dev_err(&cam->platdev->dev, "Unable to request power GPIO\n");
 199                return ret;
 200        }
 201        ret = gpio_request(cam->reset_gpio, "viafb-camera");
 202        if (ret) {
 203                dev_err(&cam->platdev->dev, "Unable to request reset GPIO\n");
 204                gpio_free(cam->power_gpio);
 205                return ret;
 206        }
 207        gpio_direction_output(cam->power_gpio, 0);
 208        gpio_direction_output(cam->reset_gpio, 0);
 209        return 0;
 210}
 211
 212/*
 213 * Power up the sensor and perform the reset dance.
 214 */
 215static void via_sensor_power_up(struct via_camera *cam)
 216{
 217        gpio_set_value(cam->power_gpio, 1);
 218        gpio_set_value(cam->reset_gpio, 0);
 219        msleep(20);  /* Probably excessive */
 220        gpio_set_value(cam->reset_gpio, 1);
 221        msleep(20);
 222}
 223
 224static void via_sensor_power_down(struct via_camera *cam)
 225{
 226        gpio_set_value(cam->power_gpio, 0);
 227        gpio_set_value(cam->reset_gpio, 0);
 228}
 229
 230
 231static void via_sensor_power_release(struct via_camera *cam)
 232{
 233        via_sensor_power_down(cam);
 234        gpio_free(cam->power_gpio);
 235        gpio_free(cam->reset_gpio);
 236}
 237
 238/* --------------------------------------------------------------------------*/
 239/* Sensor ops */
 240
 241/*
 242 * Manage the ov7670 "flip" bit, which needs special help.
 243 */
 244static int viacam_set_flip(struct via_camera *cam)
 245{
 246        struct v4l2_control ctrl;
 247
 248        memset(&ctrl, 0, sizeof(ctrl));
 249        ctrl.id = V4L2_CID_VFLIP;
 250        ctrl.value = flip_image;
 251        return sensor_call(cam, core, s_ctrl, &ctrl);
 252}
 253
 254/*
 255 * Configure the sensor.  It's up to the caller to ensure
 256 * that the camera is in the correct operating state.
 257 */
 258static int viacam_configure_sensor(struct via_camera *cam)
 259{
 260        struct v4l2_mbus_framefmt mbus_fmt;
 261        int ret;
 262
 263        v4l2_fill_mbus_format(&mbus_fmt, &cam->sensor_format, cam->mbus_code);
 264        ret = sensor_call(cam, core, init, 0);
 265        if (ret == 0)
 266                ret = sensor_call(cam, video, s_mbus_fmt, &mbus_fmt);
 267        /*
 268         * OV7670 does weird things if flip is set *before* format...
 269         */
 270        if (ret == 0)
 271                ret = viacam_set_flip(cam);
 272        return ret;
 273}
 274
 275
 276
 277/* --------------------------------------------------------------------------*/
 278/*
 279 * Some simple register accessors; they assume that the lock is held.
 280 *
 281 * Should we want to support the second capture engine, we could
 282 * hide the register difference by adding 0x1000 to registers in the
 283 * 0x300-350 range.
 284 */
 285static inline void viacam_write_reg(struct via_camera *cam,
 286                int reg, int value)
 287{
 288        iowrite32(value, cam->mmio + reg);
 289}
 290
 291static inline int viacam_read_reg(struct via_camera *cam, int reg)
 292{
 293        return ioread32(cam->mmio + reg);
 294}
 295
 296static inline void viacam_write_reg_mask(struct via_camera *cam,
 297                int reg, int value, int mask)
 298{
 299        int tmp = viacam_read_reg(cam, reg);
 300
 301        tmp = (tmp & ~mask) | (value & mask);
 302        viacam_write_reg(cam, reg, tmp);
 303}
 304
 305
 306/* --------------------------------------------------------------------------*/
 307/* Interrupt management and handling */
 308
 309static irqreturn_t viacam_quick_irq(int irq, void *data)
 310{
 311        struct via_camera *cam = data;
 312        irqreturn_t ret = IRQ_NONE;
 313        int icv;
 314
 315        /*
 316         * All we do here is to clear the interrupts and tell
 317         * the handler thread to wake up.
 318         */
 319        spin_lock(&cam->viadev->reg_lock);
 320        icv = viacam_read_reg(cam, VCR_INTCTRL);
 321        if (icv & VCR_IC_EAV) {
 322                icv |= VCR_IC_EAV|VCR_IC_EVBI|VCR_IC_FFULL;
 323                viacam_write_reg(cam, VCR_INTCTRL, icv);
 324                ret = IRQ_WAKE_THREAD;
 325        }
 326        spin_unlock(&cam->viadev->reg_lock);
 327        return ret;
 328}
 329
 330/*
 331 * Find the next videobuf buffer which has somebody waiting on it.
 332 */
 333static struct videobuf_buffer *viacam_next_buffer(struct via_camera *cam)
 334{
 335        unsigned long flags;
 336        struct videobuf_buffer *buf = NULL;
 337
 338        spin_lock_irqsave(&cam->viadev->reg_lock, flags);
 339        if (cam->opstate != S_RUNNING)
 340                goto out;
 341        if (list_empty(&cam->buffer_queue))
 342                goto out;
 343        buf = list_entry(cam->buffer_queue.next, struct videobuf_buffer, queue);
 344        if (!waitqueue_active(&buf->done)) {/* Nobody waiting */
 345                buf = NULL;
 346                goto out;
 347        }
 348        list_del(&buf->queue);
 349        buf->state = VIDEOBUF_ACTIVE;
 350out:
 351        spin_unlock_irqrestore(&cam->viadev->reg_lock, flags);
 352        return buf;
 353}
 354
 355/*
 356 * The threaded IRQ handler.
 357 */
 358static irqreturn_t viacam_irq(int irq, void *data)
 359{
 360        int bufn;
 361        struct videobuf_buffer *vb;
 362        struct via_camera *cam = data;
 363        struct videobuf_dmabuf *vdma;
 364
 365        /*
 366         * If there is no place to put the data frame, don't bother
 367         * with anything else.
 368         */
 369        vb = viacam_next_buffer(cam);
 370        if (vb == NULL)
 371                goto done;
 372        /*
 373         * Figure out which buffer we just completed.
 374         */
 375        bufn = (viacam_read_reg(cam, VCR_INTCTRL) & VCR_IC_ACTBUF) >> 3;
 376        bufn -= 1;
 377        if (bufn < 0)
 378                bufn = cam->n_cap_bufs - 1;
 379        /*
 380         * Copy over the data and let any waiters know.
 381         */
 382        vdma = videobuf_to_dma(vb);
 383        viafb_dma_copy_out_sg(cam->cb_offsets[bufn], vdma->sglist, vdma->sglen);
 384        vb->state = VIDEOBUF_DONE;
 385        vb->size = cam->user_format.sizeimage;
 386        wake_up(&vb->done);
 387done:
 388        return IRQ_HANDLED;
 389}
 390
 391
 392/*
 393 * These functions must mess around with the general interrupt
 394 * control register, which is relevant to much more than just the
 395 * camera.  Nothing else uses interrupts, though, as of this writing.
 396 * Should that situation change, we'll have to improve support at
 397 * the via-core level.
 398 */
 399static void viacam_int_enable(struct via_camera *cam)
 400{
 401        viacam_write_reg(cam, VCR_INTCTRL,
 402                        VCR_IC_INTEN|VCR_IC_EAV|VCR_IC_EVBI|VCR_IC_FFULL);
 403        viafb_irq_enable(VDE_I_C0AVEN);
 404}
 405
 406static void viacam_int_disable(struct via_camera *cam)
 407{
 408        viafb_irq_disable(VDE_I_C0AVEN);
 409        viacam_write_reg(cam, VCR_INTCTRL, 0);
 410}
 411
 412
 413
 414/* --------------------------------------------------------------------------*/
 415/* Controller operations */
 416
 417/*
 418 * Set up our capture buffers in framebuffer memory.
 419 */
 420static int viacam_ctlr_cbufs(struct via_camera *cam)
 421{
 422        int nbuf = cam->viadev->camera_fbmem_size/cam->sensor_format.sizeimage;
 423        int i;
 424        unsigned int offset;
 425
 426        /*
 427         * See how many buffers we can work with.
 428         */
 429        if (nbuf >= 3) {
 430                cam->n_cap_bufs = 3;
 431                viacam_write_reg_mask(cam, VCR_CAPINTC, VCR_CI_3BUFS,
 432                                VCR_CI_3BUFS);
 433        } else if (nbuf == 2) {
 434                cam->n_cap_bufs = 2;
 435                viacam_write_reg_mask(cam, VCR_CAPINTC, 0, VCR_CI_3BUFS);
 436        } else {
 437                cam_warn(cam, "Insufficient frame buffer memory\n");
 438                return -ENOMEM;
 439        }
 440        /*
 441         * Set them up.
 442         */
 443        offset = cam->fb_offset;
 444        for (i = 0; i < cam->n_cap_bufs; i++) {
 445                cam->cb_offsets[i] = offset;
 446                cam->cb_addrs[i] = cam->fbmem + offset;
 447                viacam_write_reg(cam, VCR_VBUF1 + i*4, offset & VCR_VBUF_MASK);
 448                offset += cam->sensor_format.sizeimage;
 449        }
 450        return 0;
 451}
 452
 453/*
 454 * Set the scaling register for downscaling the image.
 455 *
 456 * This register works like this...  Vertical scaling is enabled
 457 * by bit 26; if that bit is set, downscaling is controlled by the
 458 * value in bits 16:25.  Those bits are divided by 1024 to get
 459 * the scaling factor; setting just bit 25 thus cuts the height
 460 * in half.
 461 *
 462 * Horizontal scaling works about the same, but it's enabled by
 463 * bit 11, with bits 0:10 giving the numerator of a fraction
 464 * (over 2048) for the scaling value.
 465 *
 466 * This function is naive in that, if the user departs from
 467 * the 3x4 VGA scaling factor, the image will distort.  We
 468 * could work around that if it really seemed important.
 469 */
 470static void viacam_set_scale(struct via_camera *cam)
 471{
 472        unsigned int avscale;
 473        int sf;
 474
 475        if (cam->user_format.width == VGA_WIDTH)
 476                avscale = 0;
 477        else {
 478                sf = (cam->user_format.width*2048)/VGA_WIDTH;
 479                avscale = VCR_AVS_HEN | sf;
 480        }
 481        if (cam->user_format.height < VGA_HEIGHT) {
 482                sf = (1024*cam->user_format.height)/VGA_HEIGHT;
 483                avscale |= VCR_AVS_VEN | (sf << 16);
 484        }
 485        viacam_write_reg(cam, VCR_AVSCALE, avscale);
 486}
 487
 488
 489/*
 490 * Configure image-related information into the capture engine.
 491 */
 492static void viacam_ctlr_image(struct via_camera *cam)
 493{
 494        int cicreg;
 495
 496        /*
 497         * Disable clock before messing with stuff - from the via
 498         * sample driver.
 499         */
 500        viacam_write_reg(cam, VCR_CAPINTC, ~(VCR_CI_ENABLE|VCR_CI_CLKEN));
 501        /*
 502         * Set up the controller for VGA resolution, modulo magic
 503         * offsets from the via sample driver.
 504         */
 505        viacam_write_reg(cam, VCR_HORRANGE, 0x06200120);
 506        viacam_write_reg(cam, VCR_VERTRANGE, 0x01de0000);
 507        viacam_set_scale(cam);
 508        /*
 509         * Image size info.
 510         */
 511        viacam_write_reg(cam, VCR_MAXDATA,
 512                        (cam->sensor_format.height << 16) |
 513                        (cam->sensor_format.bytesperline >> 3));
 514        viacam_write_reg(cam, VCR_MAXVBI, 0);
 515        viacam_write_reg(cam, VCR_VSTRIDE,
 516                        cam->user_format.bytesperline & VCR_VS_STRIDE);
 517        /*
 518         * Set up the capture interface control register,
 519         * everything but the "go" bit.
 520         *
 521         * The FIFO threshold is a bit of a magic number; 8 is what
 522         * VIA's sample code uses.
 523         */
 524        cicreg = VCR_CI_CLKEN |
 525                0x08000000 |            /* FIFO threshold */
 526                VCR_CI_FLDINV |         /* OLPC-specific? */
 527                VCR_CI_VREFINV |        /* OLPC-specific? */
 528                VCR_CI_DIBOTH |         /* Capture both fields */
 529                VCR_CI_CCIR601_8;
 530        if (cam->n_cap_bufs == 3)
 531                cicreg |= VCR_CI_3BUFS;
 532        /*
 533         * YUV formats need different byte swapping than RGB.
 534         */
 535        if (cam->user_format.pixelformat == V4L2_PIX_FMT_YUYV)
 536                cicreg |= VCR_CI_YUYV;
 537        else
 538                cicreg |= VCR_CI_UYVY;
 539        viacam_write_reg(cam, VCR_CAPINTC, cicreg);
 540}
 541
 542
 543static int viacam_config_controller(struct via_camera *cam)
 544{
 545        int ret;
 546        unsigned long flags;
 547
 548        spin_lock_irqsave(&cam->viadev->reg_lock, flags);
 549        ret = viacam_ctlr_cbufs(cam);
 550        if (!ret)
 551                viacam_ctlr_image(cam);
 552        spin_unlock_irqrestore(&cam->viadev->reg_lock, flags);
 553        clear_bit(CF_CONFIG_NEEDED, &cam->flags);
 554        return ret;
 555}
 556
 557/*
 558 * Make it start grabbing data.
 559 */
 560static void viacam_start_engine(struct via_camera *cam)
 561{
 562        spin_lock_irq(&cam->viadev->reg_lock);
 563        cam->next_buf = 0;
 564        viacam_write_reg_mask(cam, VCR_CAPINTC, VCR_CI_ENABLE, VCR_CI_ENABLE);
 565        viacam_int_enable(cam);
 566        (void) viacam_read_reg(cam, VCR_CAPINTC); /* Force post */
 567        cam->opstate = S_RUNNING;
 568        spin_unlock_irq(&cam->viadev->reg_lock);
 569}
 570
 571
 572static void viacam_stop_engine(struct via_camera *cam)
 573{
 574        spin_lock_irq(&cam->viadev->reg_lock);
 575        viacam_int_disable(cam);
 576        viacam_write_reg_mask(cam, VCR_CAPINTC, 0, VCR_CI_ENABLE);
 577        (void) viacam_read_reg(cam, VCR_CAPINTC); /* Force post */
 578        cam->opstate = S_IDLE;
 579        spin_unlock_irq(&cam->viadev->reg_lock);
 580}
 581
 582
 583/* --------------------------------------------------------------------------*/
 584/* Videobuf callback ops */
 585
 586/*
 587 * buffer_setup.  The purpose of this one would appear to be to tell
 588 * videobuf how big a single image is.  It's also evidently up to us
 589 * to put some sort of limit on the maximum number of buffers allowed.
 590 */
 591static int viacam_vb_buf_setup(struct videobuf_queue *q,
 592                unsigned int *count, unsigned int *size)
 593{
 594        struct via_camera *cam = q->priv_data;
 595
 596        *size = cam->user_format.sizeimage;
 597        if (*count == 0 || *count > 6)  /* Arbitrary number */
 598                *count = 6;
 599        return 0;
 600}
 601
 602/*
 603 * Prepare a buffer.
 604 */
 605static int viacam_vb_buf_prepare(struct videobuf_queue *q,
 606                struct videobuf_buffer *vb, enum v4l2_field field)
 607{
 608        struct via_camera *cam = q->priv_data;
 609
 610        vb->size = cam->user_format.sizeimage;
 611        vb->width = cam->user_format.width; /* bytesperline???? */
 612        vb->height = cam->user_format.height;
 613        vb->field = field;
 614        if (vb->state == VIDEOBUF_NEEDS_INIT) {
 615                int ret = videobuf_iolock(q, vb, NULL);
 616                if (ret)
 617                        return ret;
 618        }
 619        vb->state = VIDEOBUF_PREPARED;
 620        return 0;
 621}
 622
 623/*
 624 * We've got a buffer to put data into.
 625 *
 626 * FIXME: check for a running engine and valid buffers?
 627 */
 628static void viacam_vb_buf_queue(struct videobuf_queue *q,
 629                struct videobuf_buffer *vb)
 630{
 631        struct via_camera *cam = q->priv_data;
 632
 633        /*
 634         * Note that videobuf holds the lock when it calls
 635         * us, so we need not (indeed, cannot) take it here.
 636         */
 637        vb->state = VIDEOBUF_QUEUED;
 638        list_add_tail(&vb->queue, &cam->buffer_queue);
 639}
 640
 641/*
 642 * Free a buffer.
 643 */
 644static void viacam_vb_buf_release(struct videobuf_queue *q,
 645                struct videobuf_buffer *vb)
 646{
 647        struct via_camera *cam = q->priv_data;
 648
 649        videobuf_dma_unmap(&cam->platdev->dev, videobuf_to_dma(vb));
 650        videobuf_dma_free(videobuf_to_dma(vb));
 651        vb->state = VIDEOBUF_NEEDS_INIT;
 652}
 653
 654static const struct videobuf_queue_ops viacam_vb_ops = {
 655        .buf_setup      = viacam_vb_buf_setup,
 656        .buf_prepare    = viacam_vb_buf_prepare,
 657        .buf_queue      = viacam_vb_buf_queue,
 658        .buf_release    = viacam_vb_buf_release,
 659};
 660
 661/* --------------------------------------------------------------------------*/
 662/* File operations */
 663
 664static int viacam_open(struct file *filp)
 665{
 666        struct via_camera *cam = video_drvdata(filp);
 667
 668        filp->private_data = cam;
 669        /*
 670         * Note the new user.  If this is the first one, we'll also
 671         * need to power up the sensor.
 672         */
 673        mutex_lock(&cam->lock);
 674        if (cam->users == 0) {
 675                int ret = viafb_request_dma();
 676
 677                if (ret) {
 678                        mutex_unlock(&cam->lock);
 679                        return ret;
 680                }
 681                via_sensor_power_up(cam);
 682                set_bit(CF_CONFIG_NEEDED, &cam->flags);
 683                /*
 684                 * Hook into videobuf.  Evidently this cannot fail.
 685                 */
 686                videobuf_queue_sg_init(&cam->vb_queue, &viacam_vb_ops,
 687                                &cam->platdev->dev, &cam->viadev->reg_lock,
 688                                V4L2_BUF_TYPE_VIDEO_CAPTURE, V4L2_FIELD_NONE,
 689                                sizeof(struct videobuf_buffer), cam, NULL);
 690        }
 691        (cam->users)++;
 692        mutex_unlock(&cam->lock);
 693        return 0;
 694}
 695
 696static int viacam_release(struct file *filp)
 697{
 698        struct via_camera *cam = video_drvdata(filp);
 699
 700        mutex_lock(&cam->lock);
 701        (cam->users)--;
 702        /*
 703         * If the "owner" is closing, shut down any ongoing
 704         * operations.
 705         */
 706        if (filp == cam->owner) {
 707                videobuf_stop(&cam->vb_queue);
 708                /*
 709                 * We don't hold the spinlock here, but, if release()
 710                 * is being called by the owner, nobody else will
 711                 * be changing the state.  And an extra stop would
 712                 * not hurt anyway.
 713                 */
 714                if (cam->opstate != S_IDLE)
 715                        viacam_stop_engine(cam);
 716                cam->owner = NULL;
 717        }
 718        /*
 719         * Last one out needs to turn out the lights.
 720         */
 721        if (cam->users == 0) {
 722                videobuf_mmap_free(&cam->vb_queue);
 723                via_sensor_power_down(cam);
 724                viafb_release_dma();
 725        }
 726        mutex_unlock(&cam->lock);
 727        return 0;
 728}
 729
 730/*
 731 * Read a frame from the device.
 732 */
 733static ssize_t viacam_read(struct file *filp, char __user *buffer,
 734                size_t len, loff_t *pos)
 735{
 736        struct via_camera *cam = video_drvdata(filp);
 737        int ret;
 738
 739        mutex_lock(&cam->lock);
 740        /*
 741         * Enforce the V4l2 "only one owner gets to read data" rule.
 742         */
 743        if (cam->owner && cam->owner != filp) {
 744                ret = -EBUSY;
 745                goto out_unlock;
 746        }
 747        cam->owner = filp;
 748        /*
 749         * Do we need to configure the hardware?
 750         */
 751        if (test_bit(CF_CONFIG_NEEDED, &cam->flags)) {
 752                ret = viacam_configure_sensor(cam);
 753                if (!ret)
 754                        ret = viacam_config_controller(cam);
 755                if (ret)
 756                        goto out_unlock;
 757        }
 758        /*
 759         * Fire up the capture engine, then have videobuf do
 760         * the heavy lifting.  Someday it would be good to avoid
 761         * stopping and restarting the engine each time.
 762         */
 763        INIT_LIST_HEAD(&cam->buffer_queue);
 764        viacam_start_engine(cam);
 765        ret = videobuf_read_stream(&cam->vb_queue, buffer, len, pos, 0,
 766                        filp->f_flags & O_NONBLOCK);
 767        viacam_stop_engine(cam);
 768        /* videobuf_stop() ?? */
 769
 770out_unlock:
 771        mutex_unlock(&cam->lock);
 772        return ret;
 773}
 774
 775
 776static unsigned int viacam_poll(struct file *filp, struct poll_table_struct *pt)
 777{
 778        struct via_camera *cam = video_drvdata(filp);
 779
 780        return videobuf_poll_stream(filp, &cam->vb_queue, pt);
 781}
 782
 783
 784static int viacam_mmap(struct file *filp, struct vm_area_struct *vma)
 785{
 786        struct via_camera *cam = video_drvdata(filp);
 787
 788        return videobuf_mmap_mapper(&cam->vb_queue, vma);
 789}
 790
 791
 792
 793static const struct v4l2_file_operations viacam_fops = {
 794        .owner          = THIS_MODULE,
 795        .open           = viacam_open,
 796        .release        = viacam_release,
 797        .read           = viacam_read,
 798        .poll           = viacam_poll,
 799        .mmap           = viacam_mmap,
 800        .unlocked_ioctl = video_ioctl2,
 801};
 802
 803/*----------------------------------------------------------------------------*/
 804/*
 805 * The long list of v4l2 ioctl ops
 806 */
 807
 808static int viacam_g_chip_ident(struct file *file, void *priv,
 809                struct v4l2_dbg_chip_ident *ident)
 810{
 811        struct via_camera *cam = priv;
 812
 813        ident->ident = V4L2_IDENT_NONE;
 814        ident->revision = 0;
 815        if (v4l2_chip_match_host(&ident->match)) {
 816                ident->ident = V4L2_IDENT_VIA_VX855;
 817                return 0;
 818        }
 819        return sensor_call(cam, core, g_chip_ident, ident);
 820}
 821
 822/*
 823 * Only one input.
 824 */
 825static int viacam_enum_input(struct file *filp, void *priv,
 826                struct v4l2_input *input)
 827{
 828        if (input->index != 0)
 829                return -EINVAL;
 830
 831        input->type = V4L2_INPUT_TYPE_CAMERA;
 832        input->std = V4L2_STD_ALL; /* Not sure what should go here */
 833        strcpy(input->name, "Camera");
 834        return 0;
 835}
 836
 837static int viacam_g_input(struct file *filp, void *priv, unsigned int *i)
 838{
 839        *i = 0;
 840        return 0;
 841}
 842
 843static int viacam_s_input(struct file *filp, void *priv, unsigned int i)
 844{
 845        if (i != 0)
 846                return -EINVAL;
 847        return 0;
 848}
 849
 850static int viacam_s_std(struct file *filp, void *priv, v4l2_std_id *std)
 851{
 852        return 0;
 853}
 854
 855/*
 856 * Video format stuff.  Here is our default format until
 857 * user space messes with things.
 858 */
 859static const struct v4l2_pix_format viacam_def_pix_format = {
 860        .width          = VGA_WIDTH,
 861        .height         = VGA_HEIGHT,
 862        .pixelformat    = V4L2_PIX_FMT_YUYV,
 863        .field          = V4L2_FIELD_NONE,
 864        .bytesperline   = VGA_WIDTH * 2,
 865        .sizeimage      = VGA_WIDTH * VGA_HEIGHT * 2,
 866};
 867
 868static const enum v4l2_mbus_pixelcode via_def_mbus_code = V4L2_MBUS_FMT_YUYV8_2X8;
 869
 870static int viacam_enum_fmt_vid_cap(struct file *filp, void *priv,
 871                struct v4l2_fmtdesc *fmt)
 872{
 873        if (fmt->index >= N_VIA_FMTS)
 874                return -EINVAL;
 875        strlcpy(fmt->description, via_formats[fmt->index].desc,
 876                        sizeof(fmt->description));
 877        fmt->pixelformat = via_formats[fmt->index].pixelformat;
 878        return 0;
 879}
 880
 881/*
 882 * Figure out proper image dimensions, but always force the
 883 * sensor to VGA.
 884 */
 885static void viacam_fmt_pre(struct v4l2_pix_format *userfmt,
 886                struct v4l2_pix_format *sensorfmt)
 887{
 888        *sensorfmt = *userfmt;
 889        if (userfmt->width < QCIF_WIDTH || userfmt->height < QCIF_HEIGHT) {
 890                userfmt->width = QCIF_WIDTH;
 891                userfmt->height = QCIF_HEIGHT;
 892        }
 893        if (userfmt->width > VGA_WIDTH || userfmt->height > VGA_HEIGHT) {
 894                userfmt->width = VGA_WIDTH;
 895                userfmt->height = VGA_HEIGHT;
 896        }
 897        sensorfmt->width = VGA_WIDTH;
 898        sensorfmt->height = VGA_HEIGHT;
 899}
 900
 901static void viacam_fmt_post(struct v4l2_pix_format *userfmt,
 902                struct v4l2_pix_format *sensorfmt)
 903{
 904        struct via_format *f = via_find_format(userfmt->pixelformat);
 905
 906        sensorfmt->bytesperline = sensorfmt->width * f->bpp;
 907        sensorfmt->sizeimage = sensorfmt->height * sensorfmt->bytesperline;
 908        userfmt->pixelformat = sensorfmt->pixelformat;
 909        userfmt->field = sensorfmt->field;
 910        userfmt->bytesperline = 2 * userfmt->width;
 911        userfmt->sizeimage = userfmt->bytesperline * userfmt->height;
 912}
 913
 914
 915/*
 916 * The real work of figuring out a workable format.
 917 */
 918static int viacam_do_try_fmt(struct via_camera *cam,
 919                struct v4l2_pix_format *upix, struct v4l2_pix_format *spix)
 920{
 921        int ret;
 922        struct v4l2_mbus_framefmt mbus_fmt;
 923        struct via_format *f = via_find_format(upix->pixelformat);
 924
 925        upix->pixelformat = f->pixelformat;
 926        viacam_fmt_pre(upix, spix);
 927        v4l2_fill_mbus_format(&mbus_fmt, spix, f->mbus_code);
 928        ret = sensor_call(cam, video, try_mbus_fmt, &mbus_fmt);
 929        v4l2_fill_pix_format(spix, &mbus_fmt);
 930        viacam_fmt_post(upix, spix);
 931        return ret;
 932}
 933
 934
 935
 936static int viacam_try_fmt_vid_cap(struct file *filp, void *priv,
 937                struct v4l2_format *fmt)
 938{
 939        struct via_camera *cam = priv;
 940        struct v4l2_format sfmt;
 941        int ret;
 942
 943        mutex_lock(&cam->lock);
 944        ret = viacam_do_try_fmt(cam, &fmt->fmt.pix, &sfmt.fmt.pix);
 945        mutex_unlock(&cam->lock);
 946        return ret;
 947}
 948
 949
 950static int viacam_g_fmt_vid_cap(struct file *filp, void *priv,
 951                struct v4l2_format *fmt)
 952{
 953        struct via_camera *cam = priv;
 954
 955        mutex_lock(&cam->lock);
 956        fmt->fmt.pix = cam->user_format;
 957        mutex_unlock(&cam->lock);
 958        return 0;
 959}
 960
 961static int viacam_s_fmt_vid_cap(struct file *filp, void *priv,
 962                struct v4l2_format *fmt)
 963{
 964        struct via_camera *cam = priv;
 965        int ret;
 966        struct v4l2_format sfmt;
 967        struct via_format *f = via_find_format(fmt->fmt.pix.pixelformat);
 968
 969        /*
 970         * Camera must be idle or we can't mess with the
 971         * video setup.
 972         */
 973        mutex_lock(&cam->lock);
 974        if (cam->opstate != S_IDLE) {
 975                ret = -EBUSY;
 976                goto out;
 977        }
 978        /*
 979         * Let the sensor code look over and tweak the
 980         * requested formatting.
 981         */
 982        ret = viacam_do_try_fmt(cam, &fmt->fmt.pix, &sfmt.fmt.pix);
 983        if (ret)
 984                goto out;
 985        /*
 986         * OK, let's commit to the new format.
 987         */
 988        cam->user_format = fmt->fmt.pix;
 989        cam->sensor_format = sfmt.fmt.pix;
 990        cam->mbus_code = f->mbus_code;
 991        ret = viacam_configure_sensor(cam);
 992        if (!ret)
 993                ret = viacam_config_controller(cam);
 994out:
 995        mutex_unlock(&cam->lock);
 996        return ret;
 997}
 998
 999static int viacam_querycap(struct file *filp, void *priv,
1000                struct v4l2_capability *cap)
1001{
1002        strcpy(cap->driver, "via-camera");
1003        strcpy(cap->card, "via-camera");
1004        cap->version = 1;
1005        cap->capabilities = V4L2_CAP_VIDEO_CAPTURE |
1006                V4L2_CAP_READWRITE | V4L2_CAP_STREAMING;
1007        return 0;
1008}
1009
1010/*
1011 * Streaming operations - pure videobuf stuff.
1012 */
1013static int viacam_reqbufs(struct file *filp, void *priv,
1014                struct v4l2_requestbuffers *rb)
1015{
1016        struct via_camera *cam = priv;
1017
1018        return videobuf_reqbufs(&cam->vb_queue, rb);
1019}
1020
1021static int viacam_querybuf(struct file *filp, void *priv,
1022                struct v4l2_buffer *buf)
1023{
1024        struct via_camera *cam = priv;
1025
1026        return videobuf_querybuf(&cam->vb_queue, buf);
1027}
1028
1029static int viacam_qbuf(struct file *filp, void *priv, struct v4l2_buffer *buf)
1030{
1031        struct via_camera *cam = priv;
1032
1033        return videobuf_qbuf(&cam->vb_queue, buf);
1034}
1035
1036static int viacam_dqbuf(struct file *filp, void *priv, struct v4l2_buffer *buf)
1037{
1038        struct via_camera *cam = priv;
1039
1040        return videobuf_dqbuf(&cam->vb_queue, buf, filp->f_flags & O_NONBLOCK);
1041}
1042
1043static int viacam_streamon(struct file *filp, void *priv, enum v4l2_buf_type t)
1044{
1045        struct via_camera *cam = priv;
1046        int ret = 0;
1047
1048        if (t != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1049                return -EINVAL;
1050
1051        mutex_lock(&cam->lock);
1052        if (cam->opstate != S_IDLE) {
1053                ret = -EBUSY;
1054                goto out;
1055        }
1056        /*
1057         * Enforce the V4l2 "only one owner gets to read data" rule.
1058         */
1059        if (cam->owner && cam->owner != filp) {
1060                ret = -EBUSY;
1061                goto out;
1062        }
1063        cam->owner = filp;
1064        /*
1065         * Configure things if need be.
1066         */
1067        if (test_bit(CF_CONFIG_NEEDED, &cam->flags)) {
1068                ret = viacam_configure_sensor(cam);
1069                if (ret)
1070                        goto out;
1071                ret = viacam_config_controller(cam);
1072                if (ret)
1073                        goto out;
1074        }
1075        /*
1076         * If the CPU goes into C3, the DMA transfer gets corrupted and
1077         * users start filing unsightly bug reports.  Put in a "latency"
1078         * requirement which will keep the CPU out of the deeper sleep
1079         * states.
1080         */
1081        pm_qos_add_request(&cam->qos_request, PM_QOS_CPU_DMA_LATENCY, 50);
1082        /*
1083         * Fire things up.
1084         */
1085        INIT_LIST_HEAD(&cam->buffer_queue);
1086        ret = videobuf_streamon(&cam->vb_queue);
1087        if (!ret)
1088                viacam_start_engine(cam);
1089out:
1090        mutex_unlock(&cam->lock);
1091        return ret;
1092}
1093
1094static int viacam_streamoff(struct file *filp, void *priv, enum v4l2_buf_type t)
1095{
1096        struct via_camera *cam = priv;
1097        int ret;
1098
1099        if (t != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1100                return -EINVAL;
1101        mutex_lock(&cam->lock);
1102        if (cam->opstate != S_RUNNING) {
1103                ret = -EINVAL;
1104                goto out;
1105        }
1106        pm_qos_remove_request(&cam->qos_request);
1107        viacam_stop_engine(cam);
1108        /*
1109         * Videobuf will recycle all of the outstanding buffers, but
1110         * we should be sure we don't retain any references to
1111         * any of them.
1112         */
1113        ret = videobuf_streamoff(&cam->vb_queue);
1114        INIT_LIST_HEAD(&cam->buffer_queue);
1115out:
1116        mutex_unlock(&cam->lock);
1117        return ret;
1118}
1119
1120/* G/S_PARM */
1121
1122static int viacam_g_parm(struct file *filp, void *priv,
1123                struct v4l2_streamparm *parm)
1124{
1125        struct via_camera *cam = priv;
1126        int ret;
1127
1128        mutex_lock(&cam->lock);
1129        ret = sensor_call(cam, video, g_parm, parm);
1130        mutex_unlock(&cam->lock);
1131        parm->parm.capture.readbuffers = cam->n_cap_bufs;
1132        return ret;
1133}
1134
1135static int viacam_s_parm(struct file *filp, void *priv,
1136                struct v4l2_streamparm *parm)
1137{
1138        struct via_camera *cam = priv;
1139        int ret;
1140
1141        mutex_lock(&cam->lock);
1142        ret = sensor_call(cam, video, s_parm, parm);
1143        mutex_unlock(&cam->lock);
1144        parm->parm.capture.readbuffers = cam->n_cap_bufs;
1145        return ret;
1146}
1147
1148static int viacam_enum_framesizes(struct file *filp, void *priv,
1149                struct v4l2_frmsizeenum *sizes)
1150{
1151        if (sizes->index != 0)
1152                return -EINVAL;
1153        sizes->type = V4L2_FRMSIZE_TYPE_CONTINUOUS;
1154        sizes->stepwise.min_width = QCIF_WIDTH;
1155        sizes->stepwise.min_height = QCIF_HEIGHT;
1156        sizes->stepwise.max_width = VGA_WIDTH;
1157        sizes->stepwise.max_height = VGA_HEIGHT;
1158        sizes->stepwise.step_width = sizes->stepwise.step_height = 1;
1159        return 0;
1160}
1161
1162static int viacam_enum_frameintervals(struct file *filp, void *priv,
1163                struct v4l2_frmivalenum *interval)
1164{
1165        struct via_camera *cam = priv;
1166        int ret;
1167
1168        mutex_lock(&cam->lock);
1169        ret = sensor_call(cam, video, enum_frameintervals, interval);
1170        mutex_unlock(&cam->lock);
1171        return ret;
1172}
1173
1174
1175
1176static const struct v4l2_ioctl_ops viacam_ioctl_ops = {
1177        .vidioc_g_chip_ident    = viacam_g_chip_ident,
1178        .vidioc_enum_input      = viacam_enum_input,
1179        .vidioc_g_input         = viacam_g_input,
1180        .vidioc_s_input         = viacam_s_input,
1181        .vidioc_s_std           = viacam_s_std,
1182        .vidioc_enum_fmt_vid_cap = viacam_enum_fmt_vid_cap,
1183        .vidioc_try_fmt_vid_cap = viacam_try_fmt_vid_cap,
1184        .vidioc_g_fmt_vid_cap   = viacam_g_fmt_vid_cap,
1185        .vidioc_s_fmt_vid_cap   = viacam_s_fmt_vid_cap,
1186        .vidioc_querycap        = viacam_querycap,
1187        .vidioc_reqbufs         = viacam_reqbufs,
1188        .vidioc_querybuf        = viacam_querybuf,
1189        .vidioc_qbuf            = viacam_qbuf,
1190        .vidioc_dqbuf           = viacam_dqbuf,
1191        .vidioc_streamon        = viacam_streamon,
1192        .vidioc_streamoff       = viacam_streamoff,
1193        .vidioc_g_parm          = viacam_g_parm,
1194        .vidioc_s_parm          = viacam_s_parm,
1195        .vidioc_enum_framesizes = viacam_enum_framesizes,
1196        .vidioc_enum_frameintervals = viacam_enum_frameintervals,
1197};
1198
1199/*----------------------------------------------------------------------------*/
1200
1201/*
1202 * Power management.
1203 */
1204#ifdef CONFIG_PM
1205
1206static int viacam_suspend(void *priv)
1207{
1208        struct via_camera *cam = priv;
1209        enum viacam_opstate state = cam->opstate;
1210
1211        if (cam->opstate != S_IDLE) {
1212                viacam_stop_engine(cam);
1213                cam->opstate = state; /* So resume restarts */
1214        }
1215
1216        return 0;
1217}
1218
1219static int viacam_resume(void *priv)
1220{
1221        struct via_camera *cam = priv;
1222        int ret = 0;
1223
1224        /*
1225         * Get back to a reasonable operating state.
1226         */
1227        via_write_reg_mask(VIASR, 0x78, 0, 0x80);
1228        via_write_reg_mask(VIASR, 0x1e, 0xc0, 0xc0);
1229        viacam_int_disable(cam);
1230        set_bit(CF_CONFIG_NEEDED, &cam->flags);
1231        /*
1232         * Make sure the sensor's power state is correct
1233         */
1234        if (cam->users > 0)
1235                via_sensor_power_up(cam);
1236        else
1237                via_sensor_power_down(cam);
1238        /*
1239         * If it was operating, try to restart it.
1240         */
1241        if (cam->opstate != S_IDLE) {
1242                mutex_lock(&cam->lock);
1243                ret = viacam_configure_sensor(cam);
1244                if (!ret)
1245                        ret = viacam_config_controller(cam);
1246                mutex_unlock(&cam->lock);
1247                if (!ret)
1248                        viacam_start_engine(cam);
1249        }
1250
1251        return ret;
1252}
1253
1254static struct viafb_pm_hooks viacam_pm_hooks = {
1255        .suspend = viacam_suspend,
1256        .resume = viacam_resume
1257};
1258
1259#endif /* CONFIG_PM */
1260
1261/*
1262 * Setup stuff.
1263 */
1264
1265static struct video_device viacam_v4l_template = {
1266        .name           = "via-camera",
1267        .minor          = -1,
1268        .tvnorms        = V4L2_STD_NTSC_M,
1269        .current_norm   = V4L2_STD_NTSC_M,
1270        .fops           = &viacam_fops,
1271        .ioctl_ops      = &viacam_ioctl_ops,
1272        .release        = video_device_release_empty, /* Check this */
1273};
1274
1275/*
1276 * The OLPC folks put the serial port on the same pin as
1277 * the camera.  They also get grumpy if we break the
1278 * serial port and keep them from using it.  So we have
1279 * to check the serial enable bit and not step on it.
1280 */
1281#define VIACAM_SERIAL_DEVFN 0x88
1282#define VIACAM_SERIAL_CREG 0x46
1283#define VIACAM_SERIAL_BIT 0x40
1284
1285static bool viacam_serial_is_enabled(void)
1286{
1287        struct pci_bus *pbus = pci_find_bus(0, 0);
1288        u8 cbyte;
1289
1290        if (!pbus)
1291                return false;
1292        pci_bus_read_config_byte(pbus, VIACAM_SERIAL_DEVFN,
1293                        VIACAM_SERIAL_CREG, &cbyte);
1294        if ((cbyte & VIACAM_SERIAL_BIT) == 0)
1295                return false; /* Not enabled */
1296        if (override_serial == 0) {
1297                printk(KERN_NOTICE "Via camera: serial port is enabled, " \
1298                                "refusing to load.\n");
1299                printk(KERN_NOTICE "Specify override_serial=1 to force " \
1300                                "module loading.\n");
1301                return true;
1302        }
1303        printk(KERN_NOTICE "Via camera: overriding serial port\n");
1304        pci_bus_write_config_byte(pbus, VIACAM_SERIAL_DEVFN,
1305                        VIACAM_SERIAL_CREG, cbyte & ~VIACAM_SERIAL_BIT);
1306        return false;
1307}
1308
1309static struct ov7670_config sensor_cfg = {
1310        /* The XO-1.5 (only known user) clocks the camera at 90MHz. */
1311        .clock_speed = 90,
1312};
1313
1314static int viacam_probe(struct platform_device *pdev)
1315{
1316        int ret;
1317        struct i2c_adapter *sensor_adapter;
1318        struct viafb_dev *viadev = pdev->dev.platform_data;
1319        struct i2c_board_info ov7670_info = {
1320                .type = "ov7670",
1321                .addr = 0x42 >> 1,
1322                .platform_data = &sensor_cfg,
1323        };
1324
1325        /*
1326         * Note that there are actually two capture channels on
1327         * the device.  We only deal with one for now.  That
1328         * is encoded here; nothing else assumes it's dealing with
1329         * a unique capture device.
1330         */
1331        struct via_camera *cam;
1332
1333        /*
1334         * Ensure that frame buffer memory has been set aside for
1335         * this purpose.  As an arbitrary limit, refuse to work
1336         * with less than two frames of VGA 16-bit data.
1337         *
1338         * If we ever support the second port, we'll need to set
1339         * aside more memory.
1340         */
1341        if (viadev->camera_fbmem_size < (VGA_HEIGHT*VGA_WIDTH*4)) {
1342                printk(KERN_ERR "viacam: insufficient FB memory reserved\n");
1343                return -ENOMEM;
1344        }
1345        if (viadev->engine_mmio == NULL) {
1346                printk(KERN_ERR "viacam: No I/O memory, so no pictures\n");
1347                return -ENOMEM;
1348        }
1349
1350        if (machine_is_olpc() && viacam_serial_is_enabled())
1351                return -EBUSY;
1352
1353        /*
1354         * Basic structure initialization.
1355         */
1356        cam = kzalloc (sizeof(struct via_camera), GFP_KERNEL);
1357        if (cam == NULL)
1358                return -ENOMEM;
1359        via_cam_info = cam;
1360        cam->platdev = pdev;
1361        cam->viadev = viadev;
1362        cam->users = 0;
1363        cam->owner = NULL;
1364        cam->opstate = S_IDLE;
1365        cam->user_format = cam->sensor_format = viacam_def_pix_format;
1366        mutex_init(&cam->lock);
1367        INIT_LIST_HEAD(&cam->buffer_queue);
1368        cam->mmio = viadev->engine_mmio;
1369        cam->fbmem = viadev->fbmem;
1370        cam->fb_offset = viadev->camera_fbmem_offset;
1371        cam->flags = 1 << CF_CONFIG_NEEDED;
1372        cam->mbus_code = via_def_mbus_code;
1373        /*
1374         * Tell V4L that we exist.
1375         */
1376        ret = v4l2_device_register(&pdev->dev, &cam->v4l2_dev);
1377        if (ret) {
1378                dev_err(&pdev->dev, "Unable to register v4l2 device\n");
1379                goto out_free;
1380        }
1381        ret = v4l2_ctrl_handler_init(&cam->ctrl_handler, 10);
1382        if (ret)
1383                goto out_unregister;
1384        cam->v4l2_dev.ctrl_handler = &cam->ctrl_handler;
1385        /*
1386         * Convince the system that we can do DMA.
1387         */
1388        pdev->dev.dma_mask = &viadev->pdev->dma_mask;
1389        dma_set_mask(&pdev->dev, 0xffffffff);
1390        /*
1391         * Fire up the capture port.  The write to 0x78 looks purely
1392         * OLPCish; any system will need to tweak 0x1e.
1393         */
1394        via_write_reg_mask(VIASR, 0x78, 0, 0x80);
1395        via_write_reg_mask(VIASR, 0x1e, 0xc0, 0xc0);
1396        /*
1397         * Get the sensor powered up.
1398         */
1399        ret = via_sensor_power_setup(cam);
1400        if (ret)
1401                goto out_ctrl_hdl_free;
1402        via_sensor_power_up(cam);
1403
1404        /*
1405         * See if we can't find it on the bus.  The VIA_PORT_31 assumption
1406         * is OLPC-specific.  0x42 assumption is ov7670-specific.
1407         */
1408        sensor_adapter = viafb_find_i2c_adapter(VIA_PORT_31);
1409        cam->sensor = v4l2_i2c_new_subdev_board(&cam->v4l2_dev, sensor_adapter,
1410                        &ov7670_info, NULL);
1411        if (cam->sensor == NULL) {
1412                dev_err(&pdev->dev, "Unable to find the sensor!\n");
1413                ret = -ENODEV;
1414                goto out_power_down;
1415        }
1416        /*
1417         * Get the IRQ.
1418         */
1419        viacam_int_disable(cam);
1420        ret = request_threaded_irq(viadev->pdev->irq, viacam_quick_irq,
1421                        viacam_irq, IRQF_SHARED, "via-camera", cam);
1422        if (ret)
1423                goto out_power_down;
1424        /*
1425         * Tell V4l2 that we exist.
1426         */
1427        cam->vdev = viacam_v4l_template;
1428        cam->vdev.v4l2_dev = &cam->v4l2_dev;
1429        ret = video_register_device(&cam->vdev, VFL_TYPE_GRABBER, -1);
1430        if (ret)
1431                goto out_irq;
1432        video_set_drvdata(&cam->vdev, cam);
1433
1434#ifdef CONFIG_PM
1435        /*
1436         * Hook into PM events
1437         */
1438        viacam_pm_hooks.private = cam;
1439        viafb_pm_register(&viacam_pm_hooks);
1440#endif
1441
1442        /* Power the sensor down until somebody opens the device */
1443        via_sensor_power_down(cam);
1444        return 0;
1445
1446out_irq:
1447        free_irq(viadev->pdev->irq, cam);
1448out_power_down:
1449        via_sensor_power_release(cam);
1450out_ctrl_hdl_free:
1451        v4l2_ctrl_handler_free(&cam->ctrl_handler);
1452out_unregister:
1453        v4l2_device_unregister(&cam->v4l2_dev);
1454out_free:
1455        kfree(cam);
1456        return ret;
1457}
1458
1459static int viacam_remove(struct platform_device *pdev)
1460{
1461        struct via_camera *cam = via_cam_info;
1462        struct viafb_dev *viadev = pdev->dev.platform_data;
1463
1464        video_unregister_device(&cam->vdev);
1465        v4l2_device_unregister(&cam->v4l2_dev);
1466        free_irq(viadev->pdev->irq, cam);
1467        via_sensor_power_release(cam);
1468        v4l2_ctrl_handler_free(&cam->ctrl_handler);
1469        kfree(cam);
1470        via_cam_info = NULL;
1471        return 0;
1472}
1473
1474static struct platform_driver viacam_driver = {
1475        .driver = {
1476                .name = "viafb-camera",
1477        },
1478        .probe = viacam_probe,
1479        .remove = viacam_remove,
1480};
1481
1482module_platform_driver(viacam_driver);
1483
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.