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