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