blob: 20f7237b824213537f55b33a86edc467fe44f433 [file] [log] [blame]
Jonathan Corbet024fafbac2010-10-19 21:32:11 -03001/*
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>
Jonathan Corbet024fafbac2010-10-19 21:32:11 -030016#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>
Jonathan Corbet024fafbac2010-10-19 21:32:11 -030022#include <linux/delay.h>
23#include <linux/dma-mapping.h>
Jean Pihete8db0be2011-08-25 15:35:03 +020024#include <linux/pm_qos.h>
Jonathan Corbet024fafbac2010-10-19 21:32:11 -030025#include <linux/via-core.h>
26#include <linux/via-gpio.h>
27#include <linux/via_i2c.h>
Daniel Drakec6384c82011-03-03 16:03:31 -030028#include <asm/olpc.h>
Jonathan Corbet024fafbac2010-10-19 21:32:11 -030029
30#include "via-camera.h"
31
Daniel Drake027e99a2011-04-29 18:45:01 -030032MODULE_ALIAS("platform:viafb-camera");
Jonathan Corbet024fafbac2010-10-19 21:32:11 -030033MODULE_AUTHOR("Jonathan Corbet <corbet@lwn.net>");
34MODULE_DESCRIPTION("VIA framebuffer-based camera controller driver");
35MODULE_LICENSE("GPL");
36
Rusty Russell90ab5ee2012-01-13 09:32:20 +103037static bool flip_image;
Jonathan Corbet024fafbac2010-10-19 21:32:11 -030038module_param(flip_image, bool, 0444);
39MODULE_PARM_DESC(flip_image,
40 "If set, the sensor will be instructed to flip the image "
41 "vertically.");
42
Rusty Russell90ab5ee2012-01-13 09:32:20 +103043static bool override_serial;
Jonathan Corbet024fafbac2010-10-19 21:32:11 -030044module_param(override_serial, bool, 0444);
45MODULE_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 "
Daniel Drakec6384c82011-03-03 16:03:31 -030048 "to force-enable the camera.");
Jonathan Corbet024fafbac2010-10-19 21:32:11 -030049
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 */
61enum viacam_opstate { S_IDLE = 0, S_RUNNING = 1 };
62
63struct 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;
Jean Pihetcc749982011-08-25 15:35:12 +020072 struct pm_qos_request qos_request;
Jonathan Corbet024fafbac2010-10-19 21:32:11 -030073 /*
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 */
116static 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 */
147static 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 },
Jonathan Corbet024fafbac2010-10-19 21:32:11 -0300159 /* RGB444 and Bayer should be doable, but have never been
Daniel Drake9c900f02011-10-26 09:16:50 -0300160 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. */
Jonathan Corbet024fafbac2010-10-19 21:32:11 -0300163};
164#define N_VIA_FMTS ARRAY_SIZE(via_formats)
165
166static 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 */
183static 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 */
212static 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
221static 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
228static 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 */
241static 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 */
255static 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 */
282static inline void viacam_write_reg(struct via_camera *cam,
283 int reg, int value)
284{
285 iowrite32(value, cam->mmio + reg);
286}
287
288static inline int viacam_read_reg(struct via_camera *cam, int reg)
289{
290 return ioread32(cam->mmio + reg);
291}
292
293static 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
306static 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 */
330static 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;
347out:
348 spin_unlock_irqrestore(&cam->viadev->reg_lock, flags);
349 return buf;
350}
351
352/*
353 * The threaded IRQ handler.
354 */
355static 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);
384done:
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 */
396static 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
403static 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 */
417static 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 */
467static 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 */
489static 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
540static 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 */
557static 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
569static 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 */
588static 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 */
602static 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 */
625static 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 */
641static 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
651static 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
661static 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
693static 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 */
730static 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
767out_unlock:
768 mutex_unlock(&cam->lock);
769 return ret;
770}
771
772
773static 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
781static 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
790static 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
805static 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 */
822static 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
835static 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
848static 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 */
863static 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
875static int viacam_g_input(struct file *filp, void *priv, unsigned int *i)
876{
877 *i = 0;
878 return 0;
879}
880
881static 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
888static 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 */
897static 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
906static const enum v4l2_mbus_pixelcode via_def_mbus_code = V4L2_MBUS_FMT_YUYV8_2X8;
907
908static 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 */
923static 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
939static 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 */
956static 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
974static 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
988static 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
999static 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);
1032out:
1033 mutex_unlock(&cam->lock);
1034 return ret;
1035}
1036
1037static 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 */
1051static 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
1059static 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
1067static 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
1074static 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
1081static 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);
1127out:
1128 mutex_unlock(&cam->lock);
1129 return ret;
1130}
1131
1132static 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);
1153out:
1154 mutex_unlock(&cam->lock);
1155 return ret;
1156}
1157
Jonathan Corbet024fafbac2010-10-19 21:32:11 -03001158/* G/S_PARM */
1159
1160static 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
1173static 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
1186static 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
1200static 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
1214static 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,
Jonathan Corbet024fafbac2010-10-19 21:32:11 -03001238};
1239
1240/*----------------------------------------------------------------------------*/
1241
1242/*
1243 * Power management.
1244 */
Daniel Drake05229212011-02-11 18:15:02 -03001245#ifdef CONFIG_PM
1246
1247static 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
1260static 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
1295static struct viafb_pm_hooks viacam_pm_hooks = {
1296 .suspend = viacam_suspend,
1297 .resume = viacam_resume
1298};
1299
1300#endif /* CONFIG_PM */
Jonathan Corbet024fafbac2010-10-19 21:32:11 -03001301
1302/*
1303 * Setup stuff.
1304 */
1305
1306static 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
Daniel Drakec6384c82011-03-03 16:03:31 -03001316/*
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
1326static __devinit bool viacam_serial_is_enabled(void)
1327{
1328 struct pci_bus *pbus = pci_find_bus(0, 0);
1329 u8 cbyte;
1330
Jesper Juhlc8814df2011-08-01 18:39:17 -03001331 if (!pbus)
1332 return false;
Daniel Drakec6384c82011-03-03 16:03:31 -03001333 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}
Jonathan Corbet024fafbac2010-10-19 21:32:11 -03001349
1350static __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 }
Daniel Drakec6384c82011-03-03 16:03:31 -03001380
1381 if (machine_is_olpc() && viacam_serial_is_enabled())
1382 return -EBUSY;
1383
Jonathan Corbet024fafbac2010-10-19 21:32:11 -03001384 /*
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,
Laurent Pinchart9a1f8b32010-09-24 10:16:44 -03001437 "ov7670", 0x42 >> 1, NULL);
Jonathan Corbet024fafbac2010-10-19 21:32:11 -03001438 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
Daniel Drake05229212011-02-11 18:15:02 -03001461#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
Jonathan Corbet024fafbac2010-10-19 21:32:11 -03001469 /* Power the sensor down until somebody opens the device */
1470 via_sensor_power_down(cam);
1471 return 0;
1472
1473out_irq:
1474 free_irq(viadev->pdev->irq, cam);
1475out_power_down:
1476 via_sensor_power_release(cam);
1477out_unregister:
1478 v4l2_device_unregister(&cam->v4l2_dev);
1479 return ret;
1480}
1481
1482static __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
Jonathan Corbet024fafbac2010-10-19 21:32:11 -03001495static struct platform_driver viacam_driver = {
1496 .driver = {
1497 .name = "viafb-camera",
1498 },
1499 .probe = viacam_probe,
1500 .remove = viacam_remove,
1501};
1502
Axel Lin1d6629b2012-01-10 03:21:49 -03001503module_platform_driver(viacam_driver);