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 bool 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 bool 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 
via_find_format(u32 pixelformat)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  */
via_sensor_power_setup(struct via_camera * cam)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  */
via_sensor_power_up(struct via_camera * cam)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 
via_sensor_power_down(struct via_camera * cam)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 
via_sensor_power_release(struct via_camera * cam)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  */
viacam_set_flip(struct via_camera * cam)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  */
viacam_configure_sensor(struct via_camera * cam)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  */
viacam_write_reg(struct via_camera * cam,int reg,int value)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 
viacam_read_reg(struct via_camera * cam,int reg)288 static inline int viacam_read_reg(struct via_camera *cam, int reg)
289 {
290 	return ioread32(cam->mmio + reg);
291 }
292 
viacam_write_reg_mask(struct via_camera * cam,int reg,int value,int mask)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 
viacam_quick_irq(int irq,void * data)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  */
viacam_next_buffer(struct via_camera * cam)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  */
viacam_irq(int irq,void * data)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  */
viacam_int_enable(struct via_camera * cam)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 
viacam_int_disable(struct via_camera * cam)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  */
viacam_ctlr_cbufs(struct via_camera * cam)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  */
viacam_set_scale(struct via_camera * cam)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  */
viacam_ctlr_image(struct via_camera * cam)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 
viacam_config_controller(struct via_camera * cam)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  */
viacam_start_engine(struct via_camera * cam)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 
viacam_stop_engine(struct via_camera * cam)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  */
viacam_vb_buf_setup(struct videobuf_queue * q,unsigned int * count,unsigned int * size)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  */
viacam_vb_buf_prepare(struct videobuf_queue * q,struct videobuf_buffer * vb,enum v4l2_field field)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  */
viacam_vb_buf_queue(struct videobuf_queue * q,struct videobuf_buffer * vb)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  */
viacam_vb_buf_release(struct videobuf_queue * q,struct videobuf_buffer * vb)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 
viacam_open(struct file * filp)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 
viacam_release(struct file * filp)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  */
viacam_read(struct file * filp,char __user * buffer,size_t len,loff_t * pos)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 
viacam_poll(struct file * filp,struct poll_table_struct * pt)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 
viacam_mmap(struct file * filp,struct vm_area_struct * vma)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 
viacam_g_chip_ident(struct file * file,void * priv,struct v4l2_dbg_chip_ident * ident)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  */
viacam_queryctrl(struct file * filp,void * priv,struct v4l2_queryctrl * qc)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 
viacam_g_ctrl(struct file * filp,void * priv,struct v4l2_control * ctrl)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 
viacam_s_ctrl(struct file * filp,void * priv,struct v4l2_control * ctrl)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  */
viacam_enum_input(struct file * filp,void * priv,struct v4l2_input * input)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 
viacam_g_input(struct file * filp,void * priv,unsigned int * i)875 static int viacam_g_input(struct file *filp, void *priv, unsigned int *i)
876 {
877 	*i = 0;
878 	return 0;
879 }
880 
viacam_s_input(struct file * filp,void * priv,unsigned int i)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 
viacam_s_std(struct file * filp,void * priv,v4l2_std_id * std)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 
viacam_enum_fmt_vid_cap(struct file * filp,void * priv,struct v4l2_fmtdesc * fmt)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  */
viacam_fmt_pre(struct v4l2_pix_format * userfmt,struct v4l2_pix_format * sensorfmt)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 
viacam_fmt_post(struct v4l2_pix_format * userfmt,struct v4l2_pix_format * sensorfmt)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  */
viacam_do_try_fmt(struct via_camera * cam,struct v4l2_pix_format * upix,struct v4l2_pix_format * spix)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 
viacam_try_fmt_vid_cap(struct file * filp,void * priv,struct v4l2_format * fmt)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 
viacam_g_fmt_vid_cap(struct file * filp,void * priv,struct v4l2_format * fmt)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 
viacam_s_fmt_vid_cap(struct file * filp,void * priv,struct v4l2_format * fmt)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 
viacam_querycap(struct file * filp,void * priv,struct v4l2_capability * cap)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  */
viacam_reqbufs(struct file * filp,void * priv,struct v4l2_requestbuffers * rb)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 
viacam_querybuf(struct file * filp,void * priv,struct v4l2_buffer * buf)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 
viacam_qbuf(struct file * filp,void * priv,struct v4l2_buffer * buf)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 
viacam_dqbuf(struct file * filp,void * priv,struct v4l2_buffer * buf)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 
viacam_streamon(struct file * filp,void * priv,enum v4l2_buf_type t)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 
viacam_streamoff(struct file * filp,void * priv,enum v4l2_buf_type t)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 
viacam_g_parm(struct file * filp,void * priv,struct v4l2_streamparm * parm)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 
viacam_s_parm(struct file * filp,void * priv,struct v4l2_streamparm * parm)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 
viacam_enum_framesizes(struct file * filp,void * priv,struct v4l2_frmsizeenum * sizes)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 
viacam_enum_frameintervals(struct file * filp,void * priv,struct v4l2_frmivalenum * interval)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 
viacam_suspend(void * priv)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 
viacam_resume(void * priv)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 
viacam_serial_is_enabled(void)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 
viacam_probe(struct platform_device * pdev)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 
viacam_remove(struct platform_device * pdev)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 module_platform_driver(viacam_driver);
1504