public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/12] meye driver update
@ 2004-11-04 11:12 Stelian Pop
  2004-11-04 11:13 ` [PATCH 1/12] meye: module related fixes Stelian Pop
                   ` (13 more replies)
  0 siblings, 14 replies; 26+ messages in thread
From: Stelian Pop @ 2004-11-04 11:12 UTC (permalink / raw)
  To: Linux Kernel Mailing List; +Cc: Linus Torvalds, Andrew Morton

Hi,

Please find attached a collection of patches updating the meye driver
to the latest version.

The main changes in these patches are:
	- migrate to module_param();
	- implement the V4L2 API in addition to V4L1
	- many code, whitespace and coding style cleanups

Full changelog below, the patches will be send as followups to this one.

Please apply.

Thanks,

Stelian.

PATCH  1/12: meye: module related fixes
	* use module_param() instead of MODULE_PARM() and __setup()
	* use MODULE_VERSION()

PATCH  2/12: meye: replace homebrew queue with kfifo

PATCH  3/12: meye: picture depth is in bits not in bytes

PATCH  4/12: meye: do lock properly when waiting for buffers

PATCH  5/12: meye: implement non blocking access using poll()

PATCH  6/12: meye: cleanup init/exit paths

PATCH  7/12: meye: the driver is no longer experimental and depends on PCI

PATCH  8/12: meye: module parameters documentation fixes

PATCH  9/12: meye: add v4l2 support

PATCH 10/12: meye: whitespace and coding style cleanups

PATCH 11/12: meye: bump up the version number

PATCH 12/12: meye: retrieving the current settings from the camera does not work
		   very well, we need to cache the values in the driver

-- 
Stelian Pop <stelian@popies.net>    

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCH 1/12] meye: module related fixes
  2004-11-04 11:12 [PATCH 0/12] meye driver update Stelian Pop
@ 2004-11-04 11:13 ` Stelian Pop
  2004-11-04 11:13 ` [PATCH 2/12] meye: replace homebrew queue with kfifo Stelian Pop
                   ` (12 subsequent siblings)
  13 siblings, 0 replies; 26+ messages in thread
From: Stelian Pop @ 2004-11-04 11:13 UTC (permalink / raw)
  To: Linux Kernel Mailing List, Linus Torvalds, Andrew Morton

===================================================================

ChangeSet@1.2340, 2004-11-02 15:03:36+01:00, stelian@popies.net
  meye: module related fixes
          * use module_param() instead of MODULE_PARM() and __setup()
          * use MODULE_VERSION()
  
  Signed-off-by: Stelian Pop <stelian@popies.net>

===================================================================

 meye.c |   61 ++++++++++++++++++++++---------------------------------------
 meye.h |    3 +++
 2 files changed, 25 insertions(+), 39 deletions(-)

===================================================================

diff -Nru a/drivers/media/video/meye.c b/drivers/media/video/meye.c
--- a/drivers/media/video/meye.c	2004-11-04 11:03:16 +01:00
+++ b/drivers/media/video/meye.c	2004-11-04 11:03:16 +01:00
@@ -39,16 +39,31 @@
 #include <linux/vmalloc.h>
 
 #include "meye.h"
-#include "linux/meye.h"
+#include <linux/meye.h>
+
+MODULE_AUTHOR("Stelian Pop <stelian@popies.net>");
+MODULE_DESCRIPTION("v4l/v4l2 driver for the MotionEye camera");
+MODULE_LICENSE("GPL");
+MODULE_VERSION(MEYE_DRIVER_VERSION);
 
-/* driver structure - only one possible */
-static struct meye meye;
 /* number of grab buffers */
 static unsigned int gbuffers = 2;
+module_param(gbuffers, int, 0444);
+MODULE_PARM_DESC(gbuffers, "number of capture buffers, default is 2 (32 max)");
+
 /* size of a grab buffer */
 static unsigned int gbufsize = MEYE_MAX_BUFSIZE;
+module_param(gbufsize, int, 0444);
+MODULE_PARM_DESC(gbufsize, "size of the capture buffers, default is 614400"
+		 " (will be rounded up to a page multiple)");
+
 /* /dev/videoX registration number */
 static int video_nr = -1;
+module_param(video_nr, int, 0444);
+MODULE_PARM_DESC(video_nr, "video device to register (0=/dev/video0, etc)");
+
+/* driver structure - only one possible */
+static struct meye meye;
 
 /****************************************************************************/
 /* Queue routines                                                           */
@@ -1438,7 +1453,7 @@
 #endif
 };
 
-static int __init meye_init_module(void) {
+static int __init meye_init(void) {
 	if (gbuffers < 2)
 		gbuffers = 2;
 	if (gbuffers > MEYE_MAX_BUFNBRS)
@@ -1450,42 +1465,10 @@
 	return pci_module_init(&meye_driver);
 }
 
-static void __exit meye_cleanup_module(void) {
+static void __exit meye_exit(void) {
 	pci_unregister_driver(&meye_driver);
 }
 
-#ifndef MODULE
-static int __init meye_setup(char *str) {
-	int ints[4];
-
-	str = get_options(str, ARRAY_SIZE(ints), ints);
-	if (ints[0] <= 0) 
-		goto out;
-	gbuffers = ints[1];
-	if (ints[0] == 1)
-		goto out;
-	gbufsize = ints[2];
-	if (ints[0] == 2)
-		goto out;
-	video_nr = ints[3];
-out:
-	return 1;
-}
-
-__setup("meye=", meye_setup);
-#endif
-
-MODULE_AUTHOR("Stelian Pop <stelian@popies.net>");
-MODULE_DESCRIPTION("video4linux driver for the MotionEye camera");
-MODULE_LICENSE("GPL");
-
-MODULE_PARM(gbuffers,"i");
-MODULE_PARM_DESC(gbuffers,"number of capture buffers, default is 2 (32 max)");
-MODULE_PARM(gbufsize,"i");
-MODULE_PARM_DESC(gbufsize,"size of the capture buffers, default is 614400");
-MODULE_PARM(video_nr,"i");
-MODULE_PARM_DESC(video_nr,"video device to register (0=/dev/video0, etc)");
-
 /* Module entry points */
-module_init(meye_init_module);
-module_exit(meye_cleanup_module);
+module_init(meye_init);
+module_exit(meye_exit);
diff -Nru a/drivers/media/video/meye.h b/drivers/media/video/meye.h
--- a/drivers/media/video/meye.h	2004-11-04 11:03:16 +01:00
+++ b/drivers/media/video/meye.h	2004-11-04 11:03:16 +01:00
@@ -33,6 +33,9 @@
 #define MEYE_DRIVER_MAJORVERSION	1
 #define MEYE_DRIVER_MINORVERSION	10
 
+#define MEYE_DRIVER_VERSION __stringify(MEYE_DRIVER_MAJORVERSION) "." \
+			    __stringify(MEYE_DRIVER_MINORVERSION)
+
 #include <linux/config.h>
 #include <linux/types.h>
 #include <linux/pci.h>

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCH 2/12] meye: replace homebrew queue with kfifo
  2004-11-04 11:12 [PATCH 0/12] meye driver update Stelian Pop
  2004-11-04 11:13 ` [PATCH 1/12] meye: module related fixes Stelian Pop
@ 2004-11-04 11:13 ` Stelian Pop
  2004-11-04 11:14 ` [PATCH 3/12] meye: picture depth is in bits not in bytes Stelian Pop
                   ` (11 subsequent siblings)
  13 siblings, 0 replies; 26+ messages in thread
From: Stelian Pop @ 2004-11-04 11:13 UTC (permalink / raw)
  To: Linux Kernel Mailing List, Linus Torvalds, Andrew Morton

===================================================================

ChangeSet@1.2341, 2004-11-02 15:37:50+01:00, stelian@popies.net
  meye: replace homebrew queue with kfifo
  
  Signed-off-by: Stelian Pop <stelian@popies.net>

===================================================================

 meye.c |  201 +++++++++++++++++++++++++++++------------------------------------
 meye.h |   18 ++---
 2 files changed, 99 insertions(+), 120 deletions(-)

===================================================================

diff -Nru a/drivers/media/video/meye.c b/drivers/media/video/meye.c
--- a/drivers/media/video/meye.c	2004-11-04 11:17:30 +01:00
+++ b/drivers/media/video/meye.c	2004-11-04 11:17:30 +01:00
@@ -66,68 +66,6 @@
 static struct meye meye;
 
 /****************************************************************************/
-/* Queue routines                                                           */
-/****************************************************************************/
-
-/* Inits the queue */
-static inline void meye_initq(struct meye_queue *queue) {
-	queue->head = queue->tail = 0;
-	queue->len = 0;
-	queue->s_lock = SPIN_LOCK_UNLOCKED;
-	init_waitqueue_head(&queue->proc_list);
-}
-
-/* Pulls an element from the queue */
-static inline int meye_pullq(struct meye_queue *queue) {
-	int result;
-	unsigned long flags;
-
-	spin_lock_irqsave(&queue->s_lock, flags);
-	if (!queue->len) {
-		spin_unlock_irqrestore(&queue->s_lock, flags);
-		return -1;
-	}
-	result = queue->buf[queue->head];
-	queue->head++;
-	queue->head &= (MEYE_QUEUE_SIZE - 1);
-	queue->len--;
-	spin_unlock_irqrestore(&queue->s_lock, flags);
-	return result;
-}
-
-/* Pushes an element into the queue */
-static inline void meye_pushq(struct meye_queue *queue, int element) {
-	unsigned long flags;
-
-	spin_lock_irqsave(&queue->s_lock, flags);
-	if (queue->len == MEYE_QUEUE_SIZE) {
-		/* remove the first element */
-		queue->head++;
-		queue->head &= (MEYE_QUEUE_SIZE - 1);
-		queue->len--;
-	}
-	queue->buf[queue->tail] = element;
-	queue->tail++;
-	queue->tail &= (MEYE_QUEUE_SIZE - 1);
-	queue->len++;
-
-	spin_unlock_irqrestore(&queue->s_lock, flags);
-}
-
-/* Tests if the queue is empty */
-static inline int meye_emptyq(struct meye_queue *queue, int *elem) {
-	int result;
-	unsigned long flags;
-
-	spin_lock_irqsave(&queue->s_lock, flags);
-	result = (queue->len == 0);
-	if (!result && elem)
-		*elem = queue->buf[queue->head];
-	spin_unlock_irqrestore(&queue->s_lock, flags);
-	return result;
-}
-
-/****************************************************************************/
 /* Memory allocation routines (stolen from bttv-driver.c)                   */
 /****************************************************************************/
 static void *rvmalloc(unsigned long size) {
@@ -839,54 +777,54 @@
 /****************************************************************************/
 /* Interrupt handling                                                       */
 /****************************************************************************/
-
-static irqreturn_t meye_irq(int irq, void *dev_id, struct pt_regs *regs) {
+static irqreturn_t meye_irq(int irq, void *dev_id, struct pt_regs *regs)
+{
 	u32 v;
 	int reqnr;
 	v = mchip_read(MCHIP_MM_INTA);
 
-	while (1) {
-		v = mchip_get_frame();
-		if (!(v & MCHIP_MM_FIR_RDY))
-			return IRQ_NONE;
-		switch (meye.mchip_mode) {
-
-		case MCHIP_HIC_MODE_CONT_OUT:
-			if (!meye_emptyq(&meye.grabq, NULL)) {
-				int nr = meye_pullq(&meye.grabq);
-				mchip_cont_read_frame(
-					v, 
-					meye.grab_fbuffer + gbufsize * nr,
-					mchip_hsize() * mchip_vsize() * 2);
-				meye.grab_buffer[nr].state = MEYE_BUF_DONE;
-				wake_up_interruptible(&meye.grabq.proc_list);
-			}
-			break;
-
-		case MCHIP_HIC_MODE_CONT_COMP:
-			if (!meye_emptyq(&meye.grabq, &reqnr)) {
-				int size;
-				size = mchip_comp_read_frame(
-					v,
-					meye.grab_fbuffer + gbufsize * reqnr,
-					gbufsize);
-				if (size == -1)
-					break;
-				reqnr = meye_pullq(&meye.grabq);
-				meye.grab_buffer[reqnr].size = size;
-				meye.grab_buffer[reqnr].state = MEYE_BUF_DONE;
-				wake_up_interruptible(&meye.grabq.proc_list);
-			}
-			break;
-
-		default:
-			/* do not free frame, since it can be a snap */
-			return IRQ_NONE;
-		} /* switch */
-
-		mchip_free_frame();
+	if (meye.mchip_mode != MCHIP_HIC_MODE_CONT_OUT &&
+	    meye.mchip_mode != MCHIP_HIC_MODE_CONT_COMP)
+		return IRQ_NONE;
+
+again:
+	v = mchip_get_frame();
+	if (!(v & MCHIP_MM_FIR_RDY))
+		return IRQ_HANDLED;
+
+	if (meye.mchip_mode == MCHIP_HIC_MODE_CONT_OUT) {
+		if (kfifo_get(meye.grabq, (unsigned char *)&reqnr,
+			      sizeof(int)) != sizeof(int)) {
+			mchip_free_frame();
+			return IRQ_HANDLED;
+		}
+		mchip_cont_read_frame(v, meye.grab_fbuffer + gbufsize * reqnr,
+				      mchip_hsize() * mchip_vsize() * 2);
+		meye.grab_buffer[reqnr].size = mchip_hsize() * mchip_vsize() * 2;
+		meye.grab_buffer[reqnr].state = MEYE_BUF_DONE;
+		kfifo_put(meye.doneq, (unsigned char *)&reqnr, sizeof(int));
+		wake_up_interruptible(&meye.proc_list);
+	} else {
+		int size;
+		size = mchip_comp_read_frame(v, meye.grab_temp, gbufsize);
+		if (size == -1) {
+			mchip_free_frame();
+			goto again;
+		}
+		if (kfifo_get(meye.grabq, (unsigned char *)&reqnr,
+			      sizeof(int)) != sizeof(int)) {
+			mchip_free_frame();
+			goto again;
+		}
+		memcpy(meye.grab_fbuffer + gbufsize * reqnr, meye.grab_temp,
+		       size);
+		meye.grab_buffer[reqnr].size = size;
+		meye.grab_buffer[reqnr].state = MEYE_BUF_DONE;
+		kfifo_put(meye.doneq, (unsigned char *)&reqnr, sizeof(int));
+		wake_up_interruptible(&meye.proc_list);
 	}
-	return IRQ_HANDLED;
+	mchip_free_frame();
+	goto again;
 }
 
 /****************************************************************************/
@@ -906,9 +844,12 @@
 		return -ENOBUFS;
 	}
 	mchip_hic_stop();
-	meye_initq(&meye.grabq);
+
 	for (i = 0; i < MEYE_MAX_BUFNBRS; i++)
 		meye.grab_buffer[i].state = MEYE_BUF_UNUSED;
+	kfifo_reset(meye.grabq);
+	kfifo_reset(meye.doneq);
+
 	return 0;
 }
 
@@ -983,6 +924,7 @@
 
 	case VIDIOCSYNC: {
 		int *i = arg;
+		int unused;
 
 		if (*i < 0 || *i >= gbuffers)
 			return -EINVAL;
@@ -992,12 +934,13 @@
 		case MEYE_BUF_UNUSED:
 			return -EINVAL;
 		case MEYE_BUF_USING:
-			if (wait_event_interruptible(meye.grabq.proc_list,
+			if (wait_event_interruptible(meye.proc_list,
 						     (meye.grab_buffer[*i].state != MEYE_BUF_USING)))
 				return -EINTR;
 			/* fall through */
 		case MEYE_BUF_DONE:
 			meye.grab_buffer[*i].state = MEYE_BUF_UNUSED;
+			kfifo_get(meye.doneq, (unsigned char *)&unused, sizeof(int));
 		}
 		break;
 	}
@@ -1038,7 +981,7 @@
 		if (restart || meye.mchip_mode != MCHIP_HIC_MODE_CONT_OUT)
 			mchip_continuous_start();
 		meye.grab_buffer[vm->frame].state = MEYE_BUF_USING;
-		meye_pushq(&meye.grabq, vm->frame);
+		kfifo_put(meye.grabq, (unsigned char *)&vm->frame, sizeof(int));
 		up(&meye.lock);
 		break;
 	}
@@ -1104,13 +1047,14 @@
 		if (meye.mchip_mode != MCHIP_HIC_MODE_CONT_COMP)
 			mchip_cont_compression_start();
 		meye.grab_buffer[*nb].state = MEYE_BUF_USING;
-		meye_pushq(&meye.grabq, *nb);
+		kfifo_put(meye.grabq, (unsigned char *)nb, sizeof(int));
 		up(&meye.lock);
 		break;
 	}
 
 	case MEYEIOC_SYNC: {
 		int *i = arg;
+		int unused;
 
 		if (*i < 0 || *i >= gbuffers)
 			return -EINVAL;
@@ -1120,12 +1064,13 @@
 		case MEYE_BUF_UNUSED:
 			return -EINVAL;
 		case MEYE_BUF_USING:
-			if (wait_event_interruptible(meye.grabq.proc_list,
+			if (wait_event_interruptible(meye.proc_list,
 						     (meye.grab_buffer[*i].state != MEYE_BUF_USING)))
 				return -EINTR;
 			/* fall through */
 		case MEYE_BUF_DONE:
 			meye.grab_buffer[*i].state = MEYE_BUF_UNUSED;
+			kfifo_get(meye.doneq, (unsigned char *)&unused, sizeof(int));
 		}
 		*i = meye.grab_buffer[*i].size;
 		break;
@@ -1290,6 +1235,29 @@
 		ret = -EBUSY;
 		goto out1;
 	}
+
+	ret = -ENOMEM;
+	meye.grab_temp = vmalloc(MCHIP_NB_PAGES_MJPEG * PAGE_SIZE);
+	if (!meye.grab_temp) {
+		printk(KERN_ERR "meye: grab buffer allocation failed\n");
+		goto outvmalloc;
+	}
+
+	meye.grabq_lock = SPIN_LOCK_UNLOCKED;
+	meye.grabq = kfifo_alloc(sizeof(int) * MEYE_MAX_BUFNBRS, GFP_KERNEL,
+				 &meye.grabq_lock);
+	if (IS_ERR(meye.grabq)) {
+		printk(KERN_ERR "meye: fifo allocation failed\n");
+		goto outkfifoalloc1;
+	}
+	meye.doneq_lock = SPIN_LOCK_UNLOCKED;
+	meye.doneq = kfifo_alloc(sizeof(int) * MEYE_MAX_BUFNBRS, GFP_KERNEL,
+				 &meye.doneq_lock);
+	if (IS_ERR(meye.doneq)) {
+		printk(KERN_ERR "meye: fifo allocation failed\n");
+		goto outkfifoalloc2;
+	}
+
 	memcpy(meye.video_dev, &meye_template, sizeof(meye_template));
 	meye.video_dev->dev = &meye.mchip_dev->dev;
 
@@ -1365,6 +1333,7 @@
 
 	/* init all fields */
 	init_MUTEX(&meye.lock);
+	init_waitqueue_head(&meye.proc_list);
 
 	meye.picture.depth = 2;
 	meye.picture.palette = VIDEO_PALETTE_YUV422;
@@ -1402,6 +1371,13 @@
 	meye.video_dev = NULL;
 
 	sonypi_camera_command(SONYPI_COMMAND_SETCAMERA, 0);
+	kfifo_free(meye.doneq);
+outkfifoalloc2:
+	kfifo_free(meye.grabq);
+outkfifoalloc1:
+	vfree(meye.grab_temp);
+outvmalloc:
+	video_device_release(meye.video_dev);
 out1:
 	return ret;
 }
@@ -1430,6 +1406,11 @@
 		rvfree(meye.grab_fbuffer, gbuffers*gbufsize);
 
 	sonypi_camera_command(SONYPI_COMMAND_SETCAMERA, 0);
+
+	kfifo_free(meye.doneq);
+	kfifo_free(meye.grabq);
+
+	vfree(meye.grab_temp);
 
 	printk(KERN_INFO "meye: removed\n");
 }
diff -Nru a/drivers/media/video/meye.h b/drivers/media/video/meye.h
--- a/drivers/media/video/meye.h	2004-11-04 11:17:30 +01:00
+++ b/drivers/media/video/meye.h	2004-11-04 11:17:30 +01:00
@@ -39,6 +39,7 @@
 #include <linux/config.h>
 #include <linux/types.h>
 #include <linux/pci.h>
+#include <linux/kfifo.h>
 
 /****************************************************************************/
 /* Motion JPEG chip registers                                               */
@@ -280,16 +281,8 @@
 	unsigned long size;		/* size of jpg frame */
 };
 
-/* queues containing the buffer indices */
+/* size of kfifos containings buffer indices */
 #define MEYE_QUEUE_SIZE	MEYE_MAX_BUFNBRS
-struct meye_queue {
-	unsigned int head;		/* queue head */
-	unsigned int tail;		/* queue tail */
-	unsigned int len;		/* queue length */
-	spinlock_t s_lock;		/* spinlock protecting the queue */
-	wait_queue_head_t proc_list;	/* wait queue */
-	int buf[MEYE_QUEUE_SIZE];	/* queue contents */
-};
 
 /* Motion Eye device structure */
 struct meye {
@@ -306,13 +299,18 @@
 	dma_addr_t mchip_dmahandle;	/* mchip: dma handle to ptable toc */
 
 	unsigned char *grab_fbuffer;	/* capture framebuffer */
+	unsigned char *grab_temp;	/* temporary buffer */
 					/* list of buffers */
 	struct meye_grab_buffer grab_buffer[MEYE_MAX_BUFNBRS];
 
 	/* other */
 	struct semaphore lock;		/* semaphore for open/mmap... */
 
-	struct meye_queue grabq;	/* queue for buffers to be grabbed */
+	struct kfifo *grabq;		/* queue for buffers to be grabbed */
+	spinlock_t grabq_lock;		/* lock protecting the queue */
+	struct kfifo *doneq;		/* queue for grabbed buffers */
+	spinlock_t doneq_lock;		/* lock protecting the queue */
+	wait_queue_head_t proc_list;	/* wait queue */
 
 	struct video_device *video_dev;	/* video device parameters */
 	struct video_picture picture;	/* video picture parameters */

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCH 3/12] meye: picture depth is in bits not in bytes
  2004-11-04 11:12 [PATCH 0/12] meye driver update Stelian Pop
  2004-11-04 11:13 ` [PATCH 1/12] meye: module related fixes Stelian Pop
  2004-11-04 11:13 ` [PATCH 2/12] meye: replace homebrew queue with kfifo Stelian Pop
@ 2004-11-04 11:14 ` Stelian Pop
  2004-11-04 11:14 ` [PATCH 4/12] meye: do lock properly when waiting for buffers Stelian Pop
                   ` (10 subsequent siblings)
  13 siblings, 0 replies; 26+ messages in thread
From: Stelian Pop @ 2004-11-04 11:14 UTC (permalink / raw)
  To: Linux Kernel Mailing List, Linus Torvalds, Andrew Morton

===================================================================

ChangeSet@1.2342, 2004-11-02 15:41:24+01:00, stelian@popies.net
  meye: picture depth is in bits not in bytes
  
  Signed-off-by: Stelian Pop <stelian@popies.net>

===================================================================

 meye.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

===================================================================

diff -Nru a/drivers/media/video/meye.c b/drivers/media/video/meye.c
--- a/drivers/media/video/meye.c	2004-11-04 11:20:03 +01:00
+++ b/drivers/media/video/meye.c	2004-11-04 11:20:03 +01:00
@@ -904,7 +904,7 @@
 
 	case VIDIOCSPICT: {
 		struct video_picture *p = arg;
-		if (p->depth != 2)
+		if (p->depth != 16)
 			return -EINVAL;
 		if (p->palette != VIDEO_PALETTE_YUV422)
 			return -EINVAL;
@@ -1335,7 +1335,7 @@
 	init_MUTEX(&meye.lock);
 	init_waitqueue_head(&meye.proc_list);
 
-	meye.picture.depth = 2;
+	meye.picture.depth = 16;
 	meye.picture.palette = VIDEO_PALETTE_YUV422;
 	meye.picture.brightness = 32 << 10;
 	meye.picture.hue = 32 << 10;

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCH 4/12] meye: do lock properly when waiting for buffers
  2004-11-04 11:12 [PATCH 0/12] meye driver update Stelian Pop
                   ` (2 preceding siblings ...)
  2004-11-04 11:14 ` [PATCH 3/12] meye: picture depth is in bits not in bytes Stelian Pop
@ 2004-11-04 11:14 ` Stelian Pop
  2004-11-04 11:15 ` [PATCH 5/12] meye: implement non blocking access using poll() Stelian Pop
                   ` (9 subsequent siblings)
  13 siblings, 0 replies; 26+ messages in thread
From: Stelian Pop @ 2004-11-04 11:14 UTC (permalink / raw)
  To: Linux Kernel Mailing List, Linus Torvalds, Andrew Morton

===================================================================

ChangeSet@1.2343, 2004-11-02 15:46:59+01:00, stelian@popies.net
  meye: do lock properly when waiting for buffers
  
  Signed-off-by: Stelian Pop <stelian@popies.net>

===================================================================

 meye.c |   15 +++++++++++++--
 1 files changed, 13 insertions(+), 2 deletions(-)

===================================================================

diff -Nru a/drivers/media/video/meye.c b/drivers/media/video/meye.c
--- a/drivers/media/video/meye.c	2004-11-04 11:21:51 +01:00
+++ b/drivers/media/video/meye.c	2004-11-04 11:21:52 +01:00
@@ -929,19 +929,25 @@
 		if (*i < 0 || *i >= gbuffers)
 			return -EINVAL;
 
+		down(&meye.lock);
+
 		switch (meye.grab_buffer[*i].state) {
 
 		case MEYE_BUF_UNUSED:
+			up(&meye.lock);
 			return -EINVAL;
 		case MEYE_BUF_USING:
 			if (wait_event_interruptible(meye.proc_list,
-						     (meye.grab_buffer[*i].state != MEYE_BUF_USING)))
+						     (meye.grab_buffer[*i].state != MEYE_BUF_USING))) {
+				up(&meye.lock);
 				return -EINTR;
+			}
 			/* fall through */
 		case MEYE_BUF_DONE:
 			meye.grab_buffer[*i].state = MEYE_BUF_UNUSED;
 			kfifo_get(meye.doneq, (unsigned char *)&unused, sizeof(int));
 		}
+		up(&meye.lock);
 		break;
 	}
 
@@ -1059,20 +1065,25 @@
 		if (*i < 0 || *i >= gbuffers)
 			return -EINVAL;
 
+		down(&meye.lock);
 		switch (meye.grab_buffer[*i].state) {
 
 		case MEYE_BUF_UNUSED:
+			up(&meye.lock);
 			return -EINVAL;
 		case MEYE_BUF_USING:
 			if (wait_event_interruptible(meye.proc_list,
-						     (meye.grab_buffer[*i].state != MEYE_BUF_USING)))
+						     (meye.grab_buffer[*i].state != MEYE_BUF_USING))) {
+				up(&meye.lock);
 				return -EINTR;
+			}
 			/* fall through */
 		case MEYE_BUF_DONE:
 			meye.grab_buffer[*i].state = MEYE_BUF_UNUSED;
 			kfifo_get(meye.doneq, (unsigned char *)&unused, sizeof(int));
 		}
 		*i = meye.grab_buffer[*i].size;
+		up(&meye.lock);
 		break;
 	}
 

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCH 5/12] meye: implement non blocking access using poll()
  2004-11-04 11:12 [PATCH 0/12] meye driver update Stelian Pop
                   ` (3 preceding siblings ...)
  2004-11-04 11:14 ` [PATCH 4/12] meye: do lock properly when waiting for buffers Stelian Pop
@ 2004-11-04 11:15 ` Stelian Pop
  2004-11-04 11:15 ` [PATCH 6/12] meye: cleanup init/exit paths Stelian Pop
                   ` (8 subsequent siblings)
  13 siblings, 0 replies; 26+ messages in thread
From: Stelian Pop @ 2004-11-04 11:15 UTC (permalink / raw)
  To: Linux Kernel Mailing List, Linus Torvalds, Andrew Morton

===================================================================

ChangeSet@1.2344, 2004-11-02 15:54:01+01:00, stelian@popies.net
  meye: implement non blocking access using poll()
  
  Signed-off-by: Stelian Pop <stelian@popies.net>

===================================================================

 meye.c |   21 +++++++++++++++++++++
 1 files changed, 21 insertions(+)

===================================================================

diff -Nru a/drivers/media/video/meye.c b/drivers/media/video/meye.c
--- a/drivers/media/video/meye.c	2004-11-04 11:25:29 +01:00
+++ b/drivers/media/video/meye.c	2004-11-04 11:25:29 +01:00
@@ -937,6 +937,10 @@
 			up(&meye.lock);
 			return -EINVAL;
 		case MEYE_BUF_USING:
+			if (file->f_flags & O_NONBLOCK) {
+				up(&meye.lock);
+				return -EAGAIN;
+			}
 			if (wait_event_interruptible(meye.proc_list,
 						     (meye.grab_buffer[*i].state != MEYE_BUF_USING))) {
 				up(&meye.lock);
@@ -1072,6 +1076,10 @@
 			up(&meye.lock);
 			return -EINVAL;
 		case MEYE_BUF_USING:
+			if (file->f_flags & O_NONBLOCK) {
+				up(&meye.lock);
+				return -EAGAIN;
+			}
 			if (wait_event_interruptible(meye.proc_list,
 						     (meye.grab_buffer[*i].state != MEYE_BUF_USING))) {
 				up(&meye.lock);
@@ -1137,6 +1145,18 @@
 	return video_usercopy(inode, file, cmd, arg, meye_do_ioctl);
 }
 
+static unsigned int meye_poll(struct file *file, poll_table *wait)
+{
+	unsigned int res = 0;
+
+	down(&meye.lock);
+	poll_wait(file, &meye.proc_list, wait);
+	if (kfifo_len(meye.doneq))
+		res = POLLIN | POLLRDNORM;
+	up(&meye.lock);
+	return res;
+}
+
 static int meye_mmap(struct file *file, struct vm_area_struct *vma) {
 	unsigned long start = vma->vm_start;
 	unsigned long size  = vma->vm_end - vma->vm_start;
@@ -1178,6 +1198,7 @@
 	.release	= meye_release,
 	.mmap		= meye_mmap,
 	.ioctl		= meye_ioctl,
+	.poll		= meye_poll,
 	.llseek		= no_llseek,
 };
 

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCH 6/12] meye: cleanup init/exit paths
  2004-11-04 11:12 [PATCH 0/12] meye driver update Stelian Pop
                   ` (4 preceding siblings ...)
  2004-11-04 11:15 ` [PATCH 5/12] meye: implement non blocking access using poll() Stelian Pop
@ 2004-11-04 11:15 ` Stelian Pop
  2004-11-04 11:16 ` [PATCH 7/12] meye: the driver is no longer experimental and depends on PCI Stelian Pop
                   ` (7 subsequent siblings)
  13 siblings, 0 replies; 26+ messages in thread
From: Stelian Pop @ 2004-11-04 11:15 UTC (permalink / raw)
  To: Linux Kernel Mailing List, Linus Torvalds, Andrew Morton

===================================================================

ChangeSet@1.2345, 2004-11-02 16:07:38+01:00, stelian@popies.net
  meye: cleanup init/exit paths
  
  Signed-off-by: Stelian Pop <stelian@popies.net>

===================================================================

 meye.c |  104 +++++++++++++++++++++++++++++------------------------------------
 1 files changed, 47 insertions(+), 57 deletions(-)

===================================================================

diff -Nru a/drivers/media/video/meye.c b/drivers/media/video/meye.c
--- a/drivers/media/video/meye.c	2004-11-04 11:26:57 +01:00
+++ b/drivers/media/video/meye.c	2004-11-04 11:26:58 +01:00
@@ -837,13 +837,14 @@
 	err = video_exclusive_open(inode,file);
 	if (err < 0)
 		return err;
-			
+
+	mchip_hic_stop();
+
 	if (mchip_dma_alloc()) {
 		printk(KERN_ERR "meye: mchip framebuffer allocation failed\n");
 		video_exclusive_release(inode,file);
 		return -ENOBUFS;
 	}
-	mchip_hic_stop();
 
 	for (i = 0; i < MEYE_MAX_BUFNBRS; i++)
 		meye.grab_buffer[i].state = MEYE_BUF_UNUSED;
@@ -1250,22 +1251,20 @@
 
 static int __devinit meye_probe(struct pci_dev *pcidev, 
 		                const struct pci_device_id *ent) {
-	int ret;
+	int ret = -EBUSY;
 	unsigned long mchip_adr;
 	u8 revision;
 
 	if (meye.mchip_dev != NULL) {
 		printk(KERN_ERR "meye: only one device allowed!\n");
-		ret = -EBUSY;
-		goto out1;
+		goto outnotdev;
 	}
 
 	meye.mchip_dev = pcidev;
 	meye.video_dev = video_device_alloc();
 	if (!meye.video_dev) {
 		printk(KERN_ERR "meye: video_device_alloc() failed!\n");
-		ret = -EBUSY;
-		goto out1;
+		goto outnotdev;
 	}
 
 	ret = -ENOMEM;
@@ -1295,46 +1294,42 @@
 
 	sonypi_camera_command(SONYPI_COMMAND_SETCAMERA, 1);
 
+	ret = -EIO;
 	if ((ret = pci_enable_device(meye.mchip_dev))) {
 		printk(KERN_ERR "meye: pci_enable_device failed\n");
-		goto out2;
+		goto outenabledev;
 	}
 
-	meye.mchip_irq = pcidev->irq;
 	mchip_adr = pci_resource_start(meye.mchip_dev,0);
 	if (!mchip_adr) {
 		printk(KERN_ERR "meye: mchip has no device base address\n");
-		ret = -EIO;
-		goto out3;
+		goto outregions;
 	}
 	if (!request_mem_region(pci_resource_start(meye.mchip_dev, 0),
-			        pci_resource_len(meye.mchip_dev, 0),
+				pci_resource_len(meye.mchip_dev, 0),
 				"meye")) {
-		ret = -EIO;
 		printk(KERN_ERR "meye: request_mem_region failed\n");
-		goto out3;
+		goto outregions;
+	}
+	meye.mchip_mmregs = ioremap(mchip_adr, MCHIP_MM_REGS);
+	if (!meye.mchip_mmregs) {
+		printk(KERN_ERR "meye: ioremap failed\n");
+		goto outremap;
 	}
 
-	pci_read_config_byte(meye.mchip_dev, PCI_REVISION_ID, &revision);
-
-	pci_set_master(meye.mchip_dev);
+	meye.mchip_irq = pcidev->irq;
+	if (request_irq(meye.mchip_irq, meye_irq,
+			SA_INTERRUPT | SA_SHIRQ, "meye", meye_irq)) {
+		printk(KERN_ERR "meye: request_irq failed\n");
+		goto outreqirq;
+	}
 
+	pci_read_config_byte(meye.mchip_dev, PCI_REVISION_ID, &revision);
 	pci_write_config_byte(meye.mchip_dev, PCI_CACHE_LINE_SIZE, 8);
 	pci_write_config_byte(meye.mchip_dev, PCI_LATENCY_TIMER, 64);
 
-	if ((ret = request_irq(meye.mchip_irq, meye_irq, 
-			       SA_INTERRUPT | SA_SHIRQ, "meye", meye_irq))) {
-		printk(KERN_ERR "meye: request_irq failed (ret=%d)\n", ret);
-		goto out4;
-	}
+	pci_set_master(meye.mchip_dev);
 
-	meye.mchip_mmregs = ioremap(mchip_adr, MCHIP_MM_REGS);
-	if (!meye.mchip_mmregs) {
-		printk(KERN_ERR "meye: ioremap failed\n");
-		ret = -EIO;
-		goto out5;
-	}
-	
 	/* Ask the camera to perform a soft reset. */
 	pci_write_config_word(meye.mchip_dev, MCHIP_PCI_SOFTRESET_SET, 1);
 
@@ -1353,20 +1348,11 @@
 	if (video_register_device(meye.video_dev, VFL_TYPE_GRABBER, video_nr) < 0) {
 
 		printk(KERN_ERR "meye: video_register_device failed\n");
-		ret = -EIO;
-		goto out6;
+		goto outvideoreg;
 	}
 	
-	printk(KERN_INFO "meye: Motion Eye Camera Driver v%d.%d.\n",
-	       MEYE_DRIVER_MAJORVERSION,
-	       MEYE_DRIVER_MINORVERSION);
-	printk(KERN_INFO "meye: mchip KL5A72002 rev. %d, base %lx, irq %d\n", 
-		revision, mchip_adr, meye.mchip_irq);
-
-	/* init all fields */
 	init_MUTEX(&meye.lock);
 	init_waitqueue_head(&meye.proc_list);
-
 	meye.picture.depth = 16;
 	meye.picture.palette = VIDEO_PALETTE_YUV422;
 	meye.picture.brightness = 32 << 10;
@@ -1375,11 +1361,12 @@
 	meye.picture.contrast = 32 << 10;
 	meye.picture.whiteness = 0;
 	meye.params.subsample = 0;
-	meye.params.quality = 7;
+	meye.params.quality = 8;
 	meye.params.sharpness = 32;
 	meye.params.agc = 48;
 	meye.params.picture = 0;
 	meye.params.framerate = 0;
+	
 	sonypi_camera_command(SONYPI_COMMAND_SETCAMERABRIGHTNESS, 32);
 	sonypi_camera_command(SONYPI_COMMAND_SETCAMERAHUE, 32);
 	sonypi_camera_command(SONYPI_COMMAND_SETCAMERACOLOR, 32);
@@ -1388,20 +1375,23 @@
 	sonypi_camera_command(SONYPI_COMMAND_SETCAMERAPICTURE, 0);
 	sonypi_camera_command(SONYPI_COMMAND_SETCAMERAAGC, 48);
 
+	printk(KERN_INFO "meye: Motion Eye Camera Driver v%s.\n",
+	       MEYE_DRIVER_VERSION);
+	printk(KERN_INFO "meye: mchip KL5A72002 rev. %d, base %lx, irq %d\n",
+	       revision, mchip_adr, meye.mchip_irq);
+
 	return 0;
-out6:
-	iounmap(meye.mchip_mmregs);
-out5:
+
+outvideoreg:
 	free_irq(meye.mchip_irq, meye_irq);
-out4:
+outreqirq:
+	iounmap(meye.mchip_mmregs);
+outremap:
 	release_mem_region(pci_resource_start(meye.mchip_dev, 0),
 			   pci_resource_len(meye.mchip_dev, 0));
-out3:
+outregions:
 	pci_disable_device(meye.mchip_dev);
-out2:
-	video_device_release(meye.video_dev);
-	meye.video_dev = NULL;
-
+outenabledev:
 	sonypi_camera_command(SONYPI_COMMAND_SETCAMERA, 0);
 	kfifo_free(meye.doneq);
 outkfifoalloc2:
@@ -1410,7 +1400,7 @@
 	vfree(meye.grab_temp);
 outvmalloc:
 	video_device_release(meye.video_dev);
-out1:
+outnotdev:
 	return ret;
 }
 
@@ -1434,9 +1424,6 @@
 
 	pci_disable_device(meye.mchip_dev);
 
-	if (meye.grab_fbuffer)
-		rvfree(meye.grab_fbuffer, gbuffers*gbufsize);
-
 	sonypi_camera_command(SONYPI_COMMAND_SETCAMERA, 0);
 
 	kfifo_free(meye.doneq);
@@ -1444,6 +1431,11 @@
 
 	vfree(meye.grab_temp);
 
+	if (meye.grab_fbuffer) {
+		rvfree(meye.grab_fbuffer, gbuffers*gbufsize);
+		meye.grab_fbuffer = NULL;
+	}
+
 	printk(KERN_INFO "meye: removed\n");
 }
 
@@ -1467,12 +1459,10 @@
 };
 
 static int __init meye_init(void) {
-	if (gbuffers < 2)
-		gbuffers = 2;
-	if (gbuffers > MEYE_MAX_BUFNBRS)
-		gbuffers = MEYE_MAX_BUFNBRS;
+	gbuffers = max(2, min((int)gbuffers, MEYE_MAX_BUFNBRS));
 	if (gbufsize < 0 || gbufsize > MEYE_MAX_BUFSIZE)
 		gbufsize = MEYE_MAX_BUFSIZE;
+	gbufsize = PAGE_ALIGN(gbufsize);
 	printk(KERN_INFO "meye: using %d buffers with %dk (%dk total) for capture\n",
 	       gbuffers, gbufsize/1024, gbuffers*gbufsize/1024);
 	return pci_module_init(&meye_driver);

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCH 7/12] meye: the driver is no longer experimental and depends on PCI
  2004-11-04 11:12 [PATCH 0/12] meye driver update Stelian Pop
                   ` (5 preceding siblings ...)
  2004-11-04 11:15 ` [PATCH 6/12] meye: cleanup init/exit paths Stelian Pop
@ 2004-11-04 11:16 ` Stelian Pop
  2004-11-04 11:41   ` Christoph Hellwig
  2004-11-04 11:16 ` [PATCH 8/12] meye: module parameters documentation fixes Stelian Pop
                   ` (6 subsequent siblings)
  13 siblings, 1 reply; 26+ messages in thread
From: Stelian Pop @ 2004-11-04 11:16 UTC (permalink / raw)
  To: Linux Kernel Mailing List, Linus Torvalds, Andrew Morton

===================================================================

ChangeSet@1.2346, 2004-11-02 16:09:26+01:00, stelian@popies.net
  meye: the driver is no longer experimental and depends on PCI
  
  Signed-off-by: Stelian Pop <stelian@popies.net>

===================================================================

 Kconfig |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

===================================================================

diff -Nru a/drivers/media/video/Kconfig b/drivers/media/video/Kconfig
--- a/drivers/media/video/Kconfig	2004-11-04 11:28:50 +01:00
+++ b/drivers/media/video/Kconfig	2004-11-04 11:28:50 +01:00
@@ -219,8 +219,8 @@
 	  module will be called zr36120.
 
 config VIDEO_MEYE
-	tristate "Sony Vaio Picturebook Motion Eye Video For Linux (EXPERIMENTAL)"
-	depends on VIDEO_DEV && SONYPI && !HIGHMEM64G
+	tristate "Sony Vaio Picturebook Motion Eye Video For Linux"
+	depends on VIDEO_DEV && PCI && SONYPI && !HIGHMEM64G
 	---help---
 	  This is the video4linux driver for the Motion Eye camera found
 	  in the Vaio Picturebook laptops. Please read the material in

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCH 8/12] meye: module parameters documentation fixes
  2004-11-04 11:12 [PATCH 0/12] meye driver update Stelian Pop
                   ` (6 preceding siblings ...)
  2004-11-04 11:16 ` [PATCH 7/12] meye: the driver is no longer experimental and depends on PCI Stelian Pop
@ 2004-11-04 11:16 ` Stelian Pop
  2004-11-04 11:17 ` [PATCH 9/12] meye: add v4l2 support Stelian Pop
                   ` (5 subsequent siblings)
  13 siblings, 0 replies; 26+ messages in thread
From: Stelian Pop @ 2004-11-04 11:16 UTC (permalink / raw)
  To: Linux Kernel Mailing List, Linus Torvalds, Andrew Morton

===================================================================

ChangeSet@1.2347, 2004-11-02 16:13:47+01:00, stelian@popies.net
  meye: module parameters documentation fixes
  
  Signed-off-by: Stelian Pop <stelian@popies.net>

===================================================================

 kernel-parameters.txt |    2 +-
 video4linux/meye.txt  |   11 ++++-------
 2 files changed, 5 insertions(+), 8 deletions(-)

===================================================================

diff -Nru a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
--- a/Documentation/kernel-parameters.txt	2004-11-04 11:30:33 +01:00
+++ b/Documentation/kernel-parameters.txt	2004-11-04 11:30:33 +01:00
@@ -701,7 +701,7 @@
 			[KNL,ACPI] Mark specific memory as reserved.
 			Region of memory to be used, from ss to ss+nn.
 
-	meye=		[HW] Set MotionEye Camera parameters
+	meye.*=		[HW] Set MotionEye Camera parameters
 			See Documentation/video4linux/meye.txt.
 
 	mga=		[HW,DRM]
diff -Nru a/Documentation/video4linux/meye.txt b/Documentation/video4linux/meye.txt
--- a/Documentation/video4linux/meye.txt	2004-11-04 11:30:33 +01:00
+++ b/Documentation/video4linux/meye.txt	2004-11-04 11:30:33 +01:00
@@ -41,13 +41,10 @@
 Driver options:
 ---------------
 
-Several options can be passed to the meye driver, either by adding them
-to /etc/modprobe.conf file, when the driver is compiled as a module, or
-by adding the following to the kernel command line (in your bootloader):
-
-	meye=gbuffers[,gbufsize[,video_nr]]
-
-where:
+Several options can be passed to the meye driver using the standard
+module argument syntax (<param>=<value> when passing the option to the
+module or meye.<param>=<value> on the kernel boot line when meye is
+statically linked into the kernel). Those options are:
 
 	gbuffers:	number of capture buffers, default is 2 (32 max)
 

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCH 9/12] meye: add v4l2 support
  2004-11-04 11:12 [PATCH 0/12] meye driver update Stelian Pop
                   ` (7 preceding siblings ...)
  2004-11-04 11:16 ` [PATCH 8/12] meye: module parameters documentation fixes Stelian Pop
@ 2004-11-04 11:17 ` Stelian Pop
  2004-11-04 11:17 ` [PATCH 10/12] meye: whitespace and coding style cleanups Stelian Pop
                   ` (4 subsequent siblings)
  13 siblings, 0 replies; 26+ messages in thread
From: Stelian Pop @ 2004-11-04 11:17 UTC (permalink / raw)
  To: Linux Kernel Mailing List, Linus Torvalds, Andrew Morton

===================================================================

ChangeSet@1.2348, 2004-11-02 16:29:09+01:00, stelian@popies.net
  meye: add v4l2 support
  
  Signed-off-by: Stelian Pop <stelian@popies.net>

===================================================================

 Documentation/video4linux/meye.txt |   21 -
 drivers/media/video/meye.c         |  562 ++++++++++++++++++++++++++++++++++++-
 drivers/media/video/meye.h         |    3 
 include/linux/meye.h               |    7 
 4 files changed, 576 insertions(+), 17 deletions(-)

===================================================================

diff -Nru a/Documentation/video4linux/meye.txt b/Documentation/video4linux/meye.txt
--- a/Documentation/video4linux/meye.txt	2004-11-04 11:32:06 +01:00
+++ b/Documentation/video4linux/meye.txt	2004-11-04 11:32:06 +01:00
@@ -46,6 +46,8 @@
 module or meye.<param>=<value> on the kernel boot line when meye is
 statically linked into the kernel). Those options are:
 
+	forcev4l1:	force use of V4L1 API instead of V4L2
+
 	gbuffers:	number of capture buffers, default is 2 (32 max)
 
 	gbufsize:	size of each capture buffer, default is 614400
@@ -78,8 +80,9 @@
 Private API:
 ------------
 
-	The driver supports frame grabbing with the video4linux API, so
-	all video4linux tools (like xawtv) should work with this driver.
+	The driver supports frame grabbing with the video4linux API
+	(either v4l1 or v4l2), so all video4linux tools (like xawtv)
+	should work with this driver.
 
 	Besides the video4linux interface, the driver has a private interface
 	for accessing the Motion Eye extended parameters (camera sharpness,
@@ -121,13 +124,7 @@
 Bugs / Todo:
 ------------
 
-	- overlay output is not supported (although the camera is capable of).
-	  	(it should not be too hard to to it, provided we found how...)
-		
-	- mjpeg hardware playback doesn't work (depends on overlay...)
-
-	- rewrite the driver to use some common video4linux API for snapshot
-	  and mjpeg capture. Unfortunately, video4linux1 does not permit it,
-	  the BUZ API seems to be targeted to TV cards only. The video4linux 2
-	  API may be an option, if it goes into the kernel (maybe 2.5 
-	  material ?).
+	- the driver could be much cleaned up by removing the v4l1 support.
+	  However, this means all v4l1-only applications will stop working.
+
+	- 'motioneye' still uses the meye private v4l1 API extensions.
diff -Nru a/drivers/media/video/meye.c b/drivers/media/video/meye.c
--- a/drivers/media/video/meye.c	2004-11-04 11:32:06 +01:00
+++ b/drivers/media/video/meye.c	2004-11-04 11:32:06 +01:00
@@ -46,6 +46,11 @@
 MODULE_LICENSE("GPL");
 MODULE_VERSION(MEYE_DRIVER_VERSION);
 
+/* force usage of V4L1 API */
+static int forcev4l1; /* = 0 */
+module_param(forcev4l1, int, 0644);
+MODULE_PARM_DESC(forcev4l1, "force use of V4L1 instead of V4L2");
+
 /* number of grab buffers */
 static unsigned int gbuffers = 2;
 module_param(gbuffers, int, 0444);
@@ -781,6 +786,8 @@
 {
 	u32 v;
 	int reqnr;
+	static int sequence = 0;
+
 	v = mchip_read(MCHIP_MM_INTA);
 
 	if (meye.mchip_mode != MCHIP_HIC_MODE_CONT_OUT &&
@@ -802,6 +809,8 @@
 				      mchip_hsize() * mchip_vsize() * 2);
 		meye.grab_buffer[reqnr].size = mchip_hsize() * mchip_vsize() * 2;
 		meye.grab_buffer[reqnr].state = MEYE_BUF_DONE;
+		do_gettimeofday(&meye.grab_buffer[reqnr].timestamp);
+		meye.grab_buffer[reqnr].sequence = sequence++;
 		kfifo_put(meye.doneq, (unsigned char *)&reqnr, sizeof(int));
 		wake_up_interruptible(&meye.proc_list);
 	} else {
@@ -820,6 +829,8 @@
 		       size);
 		meye.grab_buffer[reqnr].size = size;
 		meye.grab_buffer[reqnr].state = MEYE_BUF_DONE;
+		do_gettimeofday(&meye.grab_buffer[reqnr].timestamp);
+		meye.grab_buffer[reqnr].sequence = sequence++;
 		kfifo_put(meye.doneq, (unsigned char *)&reqnr, sizeof(int));
 		wake_up_interruptible(&meye.proc_list);
 	}
@@ -1132,10 +1143,519 @@
 		break;
 	}
 
+	case VIDIOC_QUERYCAP: {
+		struct v4l2_capability *cap = arg;
+
+		if (forcev4l1)
+			return -EINVAL;
+
+		memset(cap, 0, sizeof(*cap));
+		strcpy(cap->driver, "meye");
+		strcpy(cap->card, "meye");
+		sprintf(cap->bus_info, "PCI:%s", meye.mchip_dev->slot_name);
+		cap->version = (MEYE_DRIVER_MAJORVERSION << 8) +
+			       MEYE_DRIVER_MINORVERSION;
+		cap->capabilities = V4L2_CAP_VIDEO_CAPTURE |
+				    V4L2_CAP_STREAMING;
+		break;
+	}
+
+	case VIDIOC_ENUMINPUT: {
+		struct v4l2_input *i = arg;
+
+		if (i->index != 0)
+			return -EINVAL;
+		memset(i, 0, sizeof(*i));
+		i->index = 0;
+		strcpy(i->name, "Camera");
+		i->type = V4L2_INPUT_TYPE_CAMERA;
+		break;
+	}
+
+	case VIDIOC_G_INPUT: {
+		int *i = arg;
+
+		*i = 0;
+		break;
+	}
+
+	case VIDIOC_S_INPUT: {
+		int *i = arg;
+
+		if (*i != 0)
+			return -EINVAL;
+		break;
+	}
+
+	case VIDIOC_QUERYCTRL: {
+		struct v4l2_queryctrl *c = arg;
+
+		switch (c->id) {
+
+		case V4L2_CID_BRIGHTNESS:
+			c->type = V4L2_CTRL_TYPE_INTEGER;
+			strcpy(c->name, "Brightness");
+			c->minimum = 0;
+			c->maximum = 63;
+			c->step = 1;
+			c->default_value = 32;
+			c->flags = 0;
+			break;
+		case V4L2_CID_HUE:
+			c->type = V4L2_CTRL_TYPE_INTEGER;
+			strcpy(c->name, "Hue");
+			c->minimum = 0;
+			c->maximum = 63;
+			c->step = 1;
+			c->default_value = 32;
+			c->flags = 0;
+			break;
+		case V4L2_CID_CONTRAST:
+			c->type = V4L2_CTRL_TYPE_INTEGER;
+			strcpy(c->name, "Contrast");
+			c->minimum = 0;
+			c->maximum = 63;
+			c->step = 1;
+			c->default_value = 32;
+			c->flags = 0;
+			break;
+		case V4L2_CID_SATURATION:
+			c->type = V4L2_CTRL_TYPE_INTEGER;
+			strcpy(c->name, "Saturation");
+			c->minimum = 0;
+			c->maximum = 63;
+			c->step = 1;
+			c->default_value = 32;
+			c->flags = 0;
+			break;
+		case V4L2_CID_AGC:
+			c->type = V4L2_CTRL_TYPE_INTEGER;
+			strcpy(c->name, "Agc");
+			c->minimum = 0;
+			c->maximum = 63;
+			c->step = 1;
+			c->default_value = 48;
+			c->flags = 0;
+			break;
+		case V4L2_CID_SHARPNESS:
+			c->type = V4L2_CTRL_TYPE_INTEGER;
+			strcpy(c->name, "Sharpness");
+			c->minimum = 0;
+			c->maximum = 63;
+			c->step = 1;
+			c->default_value = 32;
+			c->flags = 0;
+			break;
+		case V4L2_CID_PICTURE:
+			c->type = V4L2_CTRL_TYPE_INTEGER;
+			strcpy(c->name, "Picture");
+			c->minimum = 0;
+			c->maximum = 63;
+			c->step = 1;
+			c->default_value = 0;
+			c->flags = 0;
+			break;
+		case V4L2_CID_JPEGQUAL:
+			c->type = V4L2_CTRL_TYPE_INTEGER;
+			strcpy(c->name, "JPEG quality");
+			c->minimum = 0;
+			c->maximum = 10;
+			c->step = 1;
+			c->default_value = 8;
+			c->flags = 0;
+			break;
+		case V4L2_CID_FRAMERATE:
+			c->type = V4L2_CTRL_TYPE_INTEGER;
+			strcpy(c->name, "Framerate");
+			c->minimum = 0;
+			c->maximum = 31;
+			c->step = 1;
+			c->default_value = 0;
+			c->flags = 0;
+			break;
+		default:
+			return -EINVAL;
+		}
+		break;
+	}
+
+	case VIDIOC_S_CTRL: {
+		struct v4l2_control *c = arg;
+
+		down(&meye.lock);
+		switch (c->id) {
+
+		case V4L2_CID_BRIGHTNESS:
+			sonypi_camera_command(
+				SONYPI_COMMAND_SETCAMERABRIGHTNESS, c->value);
+			break;
+		case V4L2_CID_HUE:
+			sonypi_camera_command(
+				SONYPI_COMMAND_SETCAMERAHUE, c->value);
+			break;
+		case V4L2_CID_CONTRAST:
+			sonypi_camera_command(
+				SONYPI_COMMAND_SETCAMERACOLOR, c->value);
+			break;
+		case V4L2_CID_SATURATION:
+			sonypi_camera_command(
+				SONYPI_COMMAND_SETCAMERACOLOR, c->value);
+			break;
+		case V4L2_CID_AGC:
+			sonypi_camera_command(
+				SONYPI_COMMAND_SETCAMERAAGC, c->value);
+			break;
+		case V4L2_CID_SHARPNESS:
+			sonypi_camera_command(
+				SONYPI_COMMAND_SETCAMERASHARPNESS, c->value);
+			break;
+		case V4L2_CID_PICTURE:
+			sonypi_camera_command(
+				SONYPI_COMMAND_SETCAMERAPICTURE, c->value);
+			break;
+		case V4L2_CID_JPEGQUAL:
+			meye.params.quality = c->value;
+			break;
+		case V4L2_CID_FRAMERATE:
+			meye.params.framerate = c->value;
+			break;
+		default:
+			up(&meye.lock);
+			return -EINVAL;
+		}
+		up(&meye.lock);
+		break;
+	}
+
+	case VIDIOC_G_CTRL: {
+		struct v4l2_control *c = arg;
+
+		down(&meye.lock);
+		switch (c->id) {
+		case V4L2_CID_BRIGHTNESS:
+			c->value = sonypi_camera_command(
+				SONYPI_COMMAND_GETCAMERABRIGHTNESS, 0);
+			break;
+		case V4L2_CID_HUE:
+			c->value = sonypi_camera_command(
+				SONYPI_COMMAND_GETCAMERAHUE, 0);
+			break;
+		case V4L2_CID_CONTRAST:
+			c->value = sonypi_camera_command(
+				SONYPI_COMMAND_GETCAMERACOLOR, 0);
+			break;
+		case V4L2_CID_SATURATION:
+			c->value = sonypi_camera_command(
+				SONYPI_COMMAND_GETCAMERACOLOR, 0);
+			break;
+		case V4L2_CID_AGC:
+			c->value = sonypi_camera_command(
+				SONYPI_COMMAND_GETCAMERAAGC, 0);
+			break;
+		case V4L2_CID_SHARPNESS:
+			c->value = sonypi_camera_command(
+				SONYPI_COMMAND_GETCAMERASHARPNESS, 0);
+			break;
+		case V4L2_CID_PICTURE:
+			c->value = sonypi_camera_command(
+				SONYPI_COMMAND_GETCAMERAPICTURE, 0);
+			break;
+		case V4L2_CID_JPEGQUAL:
+			c->value = meye.params.quality;
+			break;
+		case V4L2_CID_FRAMERATE:
+			c->value = meye.params.framerate;
+			break;
+		default:
+			up(&meye.lock);
+			return -EINVAL;
+		}
+		up(&meye.lock);
+		break;
+	}
+
+	case VIDIOC_ENUM_FMT: {
+		struct v4l2_fmtdesc *f = arg;
+
+		if (f->index > 1)
+			return -EINVAL;
+		if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
+			return -EINVAL;
+		if (f->index == 0) {
+			/* standard YUV 422 capture */
+			memset(f, 0, sizeof(*f));
+			f->index = 0;
+			f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+			f->flags = 0;
+			strcpy(f->description, "YUV422");
+			f->pixelformat = V4L2_PIX_FMT_YUYV;
+		} else {
+			/* compressed MJPEG capture */
+			memset(f, 0, sizeof(*f));
+			f->index = 1;
+			f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+			f->flags = V4L2_FMT_FLAG_COMPRESSED;
+			strcpy(f->description, "MJPEG");
+			f->pixelformat = V4L2_PIX_FMT_MJPEG;
+		}
+		break;
+	}
+
+	case VIDIOC_TRY_FMT: {
+		struct v4l2_format *f = arg;
+
+		if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
+			return -EINVAL;
+		if (f->fmt.pix.pixelformat != V4L2_PIX_FMT_YUYV &&
+		    f->fmt.pix.pixelformat != V4L2_PIX_FMT_MJPEG)
+			return -EINVAL;
+		if (f->fmt.pix.field != V4L2_FIELD_ANY &&
+		    f->fmt.pix.field != V4L2_FIELD_NONE)
+			return -EINVAL;
+		f->fmt.pix.field = V4L2_FIELD_NONE;
+		if (f->fmt.pix.width <= 320) {
+			f->fmt.pix.width = 320;
+			f->fmt.pix.height = 240;
+		} else {
+			f->fmt.pix.width = 640;
+			f->fmt.pix.height = 480;
+		}
+		f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
+		f->fmt.pix.sizeimage = f->fmt.pix.height *
+				       f->fmt.pix.bytesperline;
+		f->fmt.pix.colorspace = 0;
+		f->fmt.pix.priv = 0;
+		break;
+	}
+
+	case VIDIOC_G_FMT: {
+		struct v4l2_format *f = arg;
+
+		if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
+			return -EINVAL;
+		memset(&f->fmt.pix, 0, sizeof(struct v4l2_pix_format));
+		f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+		switch (meye.mchip_mode) {
+		case MCHIP_HIC_MODE_CONT_OUT:
+		default:
+			f->fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
+			break;
+		case MCHIP_HIC_MODE_CONT_COMP:
+			f->fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG;
+			break;
+		}
+		f->fmt.pix.field = V4L2_FIELD_NONE;
+		f->fmt.pix.width = mchip_hsize();
+		f->fmt.pix.height = mchip_vsize();
+		f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
+		f->fmt.pix.sizeimage = f->fmt.pix.height *
+				       f->fmt.pix.bytesperline;
+		f->fmt.pix.colorspace = 0;
+		f->fmt.pix.priv = 0;
+		break;
+	}
+
+	case VIDIOC_S_FMT: {
+		struct v4l2_format *f = arg;
+
+		if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
+			return -EINVAL;
+		if (f->fmt.pix.pixelformat != V4L2_PIX_FMT_YUYV &&
+		    f->fmt.pix.pixelformat != V4L2_PIX_FMT_MJPEG)
+			return -EINVAL;
+		if (f->fmt.pix.field != V4L2_FIELD_ANY &&
+		    f->fmt.pix.field != V4L2_FIELD_NONE)
+			return -EINVAL;
+		f->fmt.pix.field = V4L2_FIELD_NONE;
+		down(&meye.lock);
+		if (f->fmt.pix.width <= 320) {
+			f->fmt.pix.width = 320;
+			f->fmt.pix.height = 240;
+			meye.params.subsample = 1;
+		} else {
+			f->fmt.pix.width = 640;
+			f->fmt.pix.height = 480;
+			meye.params.subsample = 0;
+		}
+		switch (f->fmt.pix.pixelformat) {
+		case V4L2_PIX_FMT_YUYV:
+			meye.mchip_mode = MCHIP_HIC_MODE_CONT_OUT;
+			break;
+		case V4L2_PIX_FMT_MJPEG:
+			meye.mchip_mode = MCHIP_HIC_MODE_CONT_COMP;
+			break;
+		}
+		up(&meye.lock);
+		f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
+		f->fmt.pix.sizeimage = f->fmt.pix.height *
+				       f->fmt.pix.bytesperline;
+		f->fmt.pix.colorspace = 0;
+		f->fmt.pix.priv = 0;
+
+		break;
+	}
+
+	case VIDIOC_REQBUFS: {
+		struct v4l2_requestbuffers *req = arg;
+		int i;
+
+		if (req->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
+			return -EINVAL;
+		if (req->memory != V4L2_MEMORY_MMAP)
+			return -EINVAL;
+		if (meye.grab_fbuffer && req->count == gbuffers) {
+			/* already allocated, no modifications */
+			break;
+		}
+		down(&meye.lock);
+		if (meye.grab_fbuffer) {
+			for (i = 0; i < gbuffers; i++)
+				if (meye.vma_use_count[i]) {
+					up(&meye.lock);
+					return -EINVAL;
+				}
+			rvfree(meye.grab_fbuffer, gbuffers * gbufsize);
+			meye.grab_fbuffer = NULL;
+		}
+		gbuffers = max(2, min((int)req->count, MEYE_MAX_BUFNBRS));
+		req->count = gbuffers;
+		meye.grab_fbuffer = rvmalloc(gbuffers * gbufsize);
+		if (!meye.grab_fbuffer) {
+			printk(KERN_ERR "meye: v4l framebuffer allocation"
+					" failed\n");
+			up(&meye.lock);
+			return -ENOMEM;
+		}
+		for (i = 0; i < gbuffers; i++)
+			meye.vma_use_count[i] = 0;
+		up(&meye.lock);
+		break;
+	}
+
+	case VIDIOC_QUERYBUF: {
+		struct v4l2_buffer *buf = arg;
+		int index = buf->index;
+
+		if (index < 0 || index >= gbuffers)
+			return -EINVAL;
+		memset(buf, 0, sizeof(*buf));
+		buf->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+		buf->index = index;
+		buf->bytesused = meye.grab_buffer[index].size;
+		buf->flags = V4L2_BUF_FLAG_MAPPED;
+		if (meye.grab_buffer[index].state == MEYE_BUF_USING)
+			buf->flags |= V4L2_BUF_FLAG_QUEUED;
+		if (meye.grab_buffer[index].state == MEYE_BUF_DONE)
+			buf->flags |= V4L2_BUF_FLAG_DONE;
+		buf->field = V4L2_FIELD_NONE;
+		buf->timestamp = meye.grab_buffer[index].timestamp;
+		buf->sequence = meye.grab_buffer[index].sequence;
+		buf->memory = V4L2_MEMORY_MMAP;
+		buf->m.offset = index * gbufsize;
+		buf->length = gbufsize;
+		break;
+	}
+
+	case VIDIOC_QBUF: {
+		struct v4l2_buffer *buf = arg;
+
+		if (buf->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
+			return -EINVAL;
+		if (buf->memory != V4L2_MEMORY_MMAP)
+			return -EINVAL;
+		if (buf->index < 0 || buf->index >= gbuffers)
+			return -EINVAL;
+		if (meye.grab_buffer[buf->index].state != MEYE_BUF_UNUSED)
+			return -EINVAL;
+		down(&meye.lock);
+		buf->flags |= V4L2_BUF_FLAG_QUEUED;
+		buf->flags &= ~V4L2_BUF_FLAG_DONE;
+		meye.grab_buffer[buf->index].state = MEYE_BUF_USING;
+		kfifo_put(meye.grabq, (unsigned char *)&buf->index, sizeof(int));
+		up(&meye.lock);
+		break;
+	}
+
+	case VIDIOC_DQBUF: {
+		struct v4l2_buffer *buf = arg;
+		int reqnr;
+
+		if (buf->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
+			return -EINVAL;
+		if (buf->memory != V4L2_MEMORY_MMAP)
+			return -EINVAL;
+
+		down(&meye.lock);
+		if (kfifo_len(meye.doneq) == 0 && file->f_flags & O_NONBLOCK) {
+			up(&meye.lock);
+			return -EAGAIN;
+		}
+		if (wait_event_interruptible(meye.proc_list, 
+					     kfifo_len(meye.doneq) != 0) < 0) {
+			up(&meye.lock);
+			return -EINTR;
+		}
+		if (!kfifo_get(meye.doneq, (unsigned char *)&reqnr,
+			       sizeof(int))) {
+			up(&meye.lock);
+			return -EBUSY;
+		}
+		if (meye.grab_buffer[reqnr].state != MEYE_BUF_DONE) {
+			up(&meye.lock);
+			return -EINVAL;
+		}
+		buf->index = reqnr;
+		buf->bytesused = meye.grab_buffer[reqnr].size;
+		buf->flags = V4L2_BUF_FLAG_MAPPED;
+		buf->field = V4L2_FIELD_NONE;
+		buf->timestamp = meye.grab_buffer[reqnr].timestamp;
+		buf->sequence = meye.grab_buffer[reqnr].sequence;
+		buf->memory = V4L2_MEMORY_MMAP;
+		buf->m.offset = reqnr * gbufsize;
+		buf->length = gbufsize;
+		meye.grab_buffer[reqnr].state = MEYE_BUF_UNUSED;
+		up(&meye.lock);
+		break;
+	}
+
+	case VIDIOC_STREAMON: {
+		down(&meye.lock);
+		switch (meye.mchip_mode) {
+		case MCHIP_HIC_MODE_CONT_OUT:
+			mchip_continuous_start();
+			break;
+		case MCHIP_HIC_MODE_CONT_COMP:
+			mchip_cont_compression_start();
+			break;
+		default:
+			up(&meye.lock);
+			return -EINVAL;
+		}
+		up(&meye.lock);
+		break;
+	}
+
+	case VIDIOC_STREAMOFF: {
+		int i;
+
+		down(&meye.lock);
+		mchip_hic_stop();
+		kfifo_reset(meye.grabq);
+		kfifo_reset(meye.doneq);
+		for (i = 0; i < MEYE_MAX_BUFNBRS; i++)
+			meye.grab_buffer[i].state = MEYE_BUF_UNUSED;
+		up(&meye.lock);
+		break;
+	}
+
+	/* 
+	 * XXX what about private snapshot ioctls ?
+	 * Do they need to be converted to V4L2 ?
+	*/
+
 	default:
 		return -ENOIOCTLCMD;
-		
-	} /* switch */
+	}
 
 	return 0;
 }
@@ -1158,9 +1678,27 @@
 	return res;
 }
 
+static void meye_vm_open(struct vm_area_struct *vma)
+{
+	int idx = (int)vma->vm_private_data;
+	meye.vma_use_count[idx]++;
+}
+
+static void meye_vm_close(struct vm_area_struct *vma)
+{
+	int idx = (int)vma->vm_private_data;
+	meye.vma_use_count[idx]--;
+}
+
+static struct vm_operations_struct meye_vm_ops = {
+	.open		= meye_vm_open,
+	.close		= meye_vm_close,
+};
+
 static int meye_mmap(struct file *file, struct vm_area_struct *vma) {
 	unsigned long start = vma->vm_start;
-	unsigned long size  = vma->vm_end - vma->vm_start;
+	unsigned long size = vma->vm_end - vma->vm_start;
+	unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
 	unsigned long page, pos;
 
 	down(&meye.lock);
@@ -1169,6 +1707,8 @@
 		return -EINVAL;
 	}
 	if (!meye.grab_fbuffer) {
+		int i;
+
 		/* lazy allocation */
 		meye.grab_fbuffer = rvmalloc(gbuffers*gbufsize);
 		if (!meye.grab_fbuffer) {
@@ -1176,8 +1716,10 @@
 			up(&meye.lock);
 			return -ENOMEM;
 		}
+		for (i = 0; i < gbuffers; i++)
+			meye.vma_use_count[i] = 0;
 	}
-	pos = (unsigned long)meye.grab_fbuffer;
+	pos = (unsigned long)meye.grab_fbuffer + offset;
 
 	while (size > 0) {
 		page = vmalloc_to_pfn((void *)pos);
@@ -1187,8 +1729,18 @@
 		}
 		start += PAGE_SIZE;
 		pos += PAGE_SIZE;
-		size -= PAGE_SIZE;
+		if (size > PAGE_SIZE)
+			size -= PAGE_SIZE;
+		else
+			size = 0;
 	}
+
+	vma->vm_ops = &meye_vm_ops;
+	vma->vm_flags &= ~VM_IO;	/* not I/O memory */
+	vma->vm_flags |= VM_RESERVED;	/* avoid to swap out this VMA */
+	vma->vm_private_data = (void *) (offset / gbufsize);
+	meye_vm_open(vma);
+
 	up(&meye.lock);
 	return 0;
 }
diff -Nru a/drivers/media/video/meye.h b/drivers/media/video/meye.h
--- a/drivers/media/video/meye.h	2004-11-04 11:32:05 +01:00
+++ b/drivers/media/video/meye.h	2004-11-04 11:32:06 +01:00
@@ -279,6 +279,8 @@
 struct meye_grab_buffer {
 	int state;			/* state of buffer */
 	unsigned long size;		/* size of jpg frame */
+	struct timeval timestamp;	/* timestamp */
+	unsigned long sequence;		/* sequence number */
 };
 
 /* size of kfifos containings buffer indices */
@@ -302,6 +304,7 @@
 	unsigned char *grab_temp;	/* temporary buffer */
 					/* list of buffers */
 	struct meye_grab_buffer grab_buffer[MEYE_MAX_BUFNBRS];
+	int vma_use_count[MEYE_MAX_BUFNBRS]; /* mmap count */
 
 	/* other */
 	struct semaphore lock;		/* semaphore for open/mmap... */
diff -Nru a/include/linux/meye.h b/include/linux/meye.h
--- a/include/linux/meye.h	2004-11-04 11:32:05 +01:00
+++ b/include/linux/meye.h	2004-11-04 11:32:05 +01:00
@@ -56,4 +56,11 @@
 /* get a jpeg compressed snapshot */
 #define MEYEIOC_STILLJCAPT	_IOR ('v', BASE_VIDIOCPRIVATE+5, int)
 
+/* V4L2 private controls */
+#define V4L2_CID_AGC		V4L2_CID_PRIVATE_BASE
+#define V4L2_CID_SHARPNESS	(V4L2_CID_PRIVATE_BASE + 1)
+#define V4L2_CID_PICTURE	(V4L2_CID_PRIVATE_BASE + 2)
+#define V4L2_CID_JPEGQUAL	(V4L2_CID_PRIVATE_BASE + 3)
+#define V4L2_CID_FRAMERATE	(V4L2_CID_PRIVATE_BASE + 4)
+
 #endif

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCH 10/12] meye: whitespace and coding style cleanups
  2004-11-04 11:12 [PATCH 0/12] meye driver update Stelian Pop
                   ` (8 preceding siblings ...)
  2004-11-04 11:17 ` [PATCH 9/12] meye: add v4l2 support Stelian Pop
@ 2004-11-04 11:17 ` Stelian Pop
  2004-11-04 11:18 ` [PATCH 11/12] meye: bump up the version number Stelian Pop
                   ` (3 subsequent siblings)
  13 siblings, 0 replies; 26+ messages in thread
From: Stelian Pop @ 2004-11-04 11:17 UTC (permalink / raw)
  To: Linux Kernel Mailing List, Linus Torvalds, Andrew Morton

===================================================================

ChangeSet@1.2349, 2004-11-02 16:32:09+01:00, stelian@popies.net
  meye: whitespace and coding style cleanups
  
  Signed-off-by: Stelian Pop <stelian@popies.net>

===================================================================

 Documentation/video4linux/meye.txt |   10 
 drivers/media/video/meye.c         |  624 ++++++++++++++++++-------------------
 drivers/media/video/meye.h         |   26 -
 include/linux/meye.h               |   10 
 4 files changed, 332 insertions(+), 338 deletions(-)

===================================================================

diff -Nru a/Documentation/video4linux/meye.txt b/Documentation/video4linux/meye.txt
--- a/Documentation/video4linux/meye.txt	2004-11-04 11:34:29 +01:00
+++ b/Documentation/video4linux/meye.txt	2004-11-04 11:34:29 +01:00
@@ -1,12 +1,12 @@
 Vaio Picturebook Motion Eye Camera Driver Readme
 ------------------------------------------------
-	Copyright (C) 2001-2003 Stelian Pop <stelian@popies.net>
+	Copyright (C) 2001-2004 Stelian Pop <stelian@popies.net>
 	Copyright (C) 2001-2002 Alcôve <www.alcove.com>
 	Copyright (C) 2000 Andrew Tridgell <tridge@samba.org>
 
 This driver enable the use of video4linux compatible applications with the
-Motion Eye camera. This driver requires the "Sony Vaio Programmable I/O 
-Control Device" driver (which can be found in the "Character drivers" 
+Motion Eye camera. This driver requires the "Sony Vaio Programmable I/O
+Control Device" driver (which can be found in the "Character drivers"
 section of the kernel configuration utility) to be compiled and installed
 (using its "camera=1" parameter).
 
@@ -24,7 +24,7 @@
 The first version was connected directly on the video bus of the Neomagic
 video card and is unsupported.
 
-The second one, made by Kawasaki Steel is fully supported by this 
+The second one, made by Kawasaki Steel is fully supported by this
 driver (PCI vendor/device is 0x136b/0xff01)
 
 The third one, present in recent (more or less last year) Picturebooks
@@ -116,7 +116,7 @@
 	MEYEIOC_STILLJCAPT
 		Takes a snapshot in an uncompressed or compressed jpeg format.
 		This ioctl blocks until the snapshot is done and returns (for
-		jpeg snapshot) the size of the image. The image data is 
+		jpeg snapshot) the size of the image. The image data is
 		available from the first mmap'ed buffer.
 
 	Look at the 'motioneye' application code for an actual example.
diff -Nru a/drivers/media/video/meye.c b/drivers/media/video/meye.c
--- a/drivers/media/video/meye.c	2004-11-04 11:34:28 +01:00
+++ b/drivers/media/video/meye.c	2004-11-04 11:34:29 +01:00
@@ -1,7 +1,7 @@
-/* 
+/*
  * Motion Eye video4linux driver for Sony Vaio PictureBook
  *
- * Copyright (C) 2001-2003 Stelian Pop <stelian@popies.net>
+ * Copyright (C) 2001-2004 Stelian Pop <stelian@popies.net>
  *
  * Copyright (C) 2001-2002 Alcôve <www.alcove.com>
  *
@@ -11,17 +11,17 @@
  *
  * Some parts borrowed from various video4linux drivers, especially
  * bttv-driver.c and zoran.c, see original files for credits.
- * 
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
- * 
+ *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
@@ -73,15 +73,16 @@
 /****************************************************************************/
 /* Memory allocation routines (stolen from bttv-driver.c)                   */
 /****************************************************************************/
-static void *rvmalloc(unsigned long size) {
+static void *rvmalloc(unsigned long size)
+{
 	void *mem;
 	unsigned long adr;
 
 	size = PAGE_ALIGN(size);
 	mem = vmalloc_32(size);
 	if (mem) {
-		memset(mem, 0, size); /* Clear the ram out, no junk to the user */
-	        adr = (unsigned long)mem;
+		memset(mem, 0, size);
+		adr = (unsigned long) mem;
 		while (size > 0) {
 			SetPageReserved(vmalloc_to_page((void *)adr));
 			adr += PAGE_SIZE;
@@ -91,11 +92,12 @@
 	return mem;
 }
 
-static void rvfree(void * mem, unsigned long size) {
-        unsigned long adr;
+static void rvfree(void * mem, unsigned long size)
+{
+	unsigned long adr;
 
 	if (mem) {
-	        adr = (unsigned long) mem;
+		adr = (unsigned long) mem;
 		while ((long) size > 0) {
 			ClearPageReserved(vmalloc_to_page((void *)adr));
 			adr += PAGE_SIZE;
@@ -114,7 +116,8 @@
  * dma_addr_t for correctness but the compilation of this driver is
  * disabled for HIGHMEM64G=y, where sizeof(dma_addr_t) != 4
  */
-static int ptable_alloc(void) {
+static int ptable_alloc(void)
+{
 	dma_addr_t *pt;
 	int i;
 
@@ -131,7 +134,7 @@
 
 	pt = meye.mchip_ptable_toc;
 	for (i = 0; i < MCHIP_NB_PAGES; i++) {
-		meye.mchip_ptable[i] = dma_alloc_coherent(&meye.mchip_dev->dev, 
+		meye.mchip_ptable[i] = dma_alloc_coherent(&meye.mchip_dev->dev,
 							  PAGE_SIZE,
 							  pt,
 							  GFP_KERNEL);
@@ -157,22 +160,23 @@
 	return 0;
 }
 
-static void ptable_free(void) {
+static void ptable_free(void)
+{
 	dma_addr_t *pt;
 	int i;
 
 	pt = meye.mchip_ptable_toc;
 	for (i = 0; i < MCHIP_NB_PAGES; i++) {
 		if (meye.mchip_ptable[i])
-			dma_free_coherent(&meye.mchip_dev->dev, 
-					  PAGE_SIZE, 
+			dma_free_coherent(&meye.mchip_dev->dev,
+					  PAGE_SIZE,
 					  meye.mchip_ptable[i], *pt);
 		pt++;
 	}
 
 	if (meye.mchip_ptable_toc)
-		dma_free_coherent(&meye.mchip_dev->dev, 
-				  PAGE_SIZE, 
+		dma_free_coherent(&meye.mchip_dev->dev,
+				  PAGE_SIZE,
 				  meye.mchip_ptable_toc,
 				  meye.mchip_dmahandle);
 
@@ -182,9 +186,10 @@
 }
 
 /* copy data from ptable into buf */
-static void ptable_copy(u8 *buf, int start, int size, int pt_pages) {
+static void ptable_copy(u8 *buf, int start, int size, int pt_pages)
+{
 	int i;
-	
+
 	for (i = 0; i < (size / PAGE_SIZE) * PAGE_SIZE; i += PAGE_SIZE) {
 		memcpy(buf + i, meye.mchip_ptable[start++], PAGE_SIZE);
 		if (start >= pt_pages)
@@ -193,224 +198,193 @@
 	memcpy(buf + i, meye.mchip_ptable[start], size % PAGE_SIZE);
 }
 
-
 /****************************************************************************/
 /* JPEG tables at different qualities to load into the VRJ chip             */
 /****************************************************************************/
 
 /* return a set of quantisation tables based on a quality from 1 to 10 */
-static u16 *jpeg_quantisation_tables(int *size, int quality) {
-	static u16 tables0[] = {
-		0xdbff, 0x4300, 0xff00, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 
-		0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 
-		0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 
-		0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 
-		0xffff, 0xffff, 0xffff, 
-		0xdbff, 0x4300, 0xff01, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 
-		0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 
-		0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 
-		0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 
-		0xffff, 0xffff, 0xffff, 
-	};
-	static u16 tables1[] = {
-		0xdbff, 0x4300, 0x5000, 0x3c37, 0x3c46, 0x5032, 0x4146, 0x5a46, 
-		0x5055, 0x785f, 0x82c8, 0x6e78, 0x786e, 0xaff5, 0x91b9, 0xffc8, 
-		0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 
-		0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 
-		0xffff, 0xffff, 0xffff, 
-		0xdbff, 0x4300, 0x5501, 0x5a5a, 0x6978, 0xeb78, 0x8282, 0xffeb, 
-		0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 
-		0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 
-		0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 
-		0xffff, 0xffff, 0xffff, 
-	};
-	static u16 tables2[] = {
-		0xdbff, 0x4300, 0x2800, 0x1e1c, 0x1e23, 0x2819, 0x2123, 0x2d23, 
-		0x282b, 0x3c30, 0x4164, 0x373c, 0x3c37, 0x587b, 0x495d, 0x9164, 
-		0x9980, 0x8f96, 0x8c80, 0xa08a, 0xe6b4, 0xa0c3, 0xdaaa, 0x8aad, 
-		0xc88c, 0xcbff, 0xeeda, 0xfff5, 0xffff, 0xc19b, 0xffff, 0xfaff, 
-		0xe6ff, 0xfffd, 0xfff8, 
-		0xdbff, 0x4300, 0x2b01, 0x2d2d, 0x353c, 0x763c, 0x4141, 0xf876, 
-		0x8ca5, 0xf8a5, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 
-		0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 
-		0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 
-		0xf8f8, 0xf8f8, 0xfff8, 
-	};
-	static u16 tables3[] = {
-		0xdbff, 0x4300, 0x1b00, 0x1412, 0x1417, 0x1b11, 0x1617, 0x1e17, 
-		0x1b1c, 0x2820, 0x2b42, 0x2528, 0x2825, 0x3a51, 0x303d, 0x6042, 
-		0x6555, 0x5f64, 0x5d55, 0x6a5b, 0x9978, 0x6a81, 0x9071, 0x5b73, 
-		0x855d, 0x86b5, 0x9e90, 0xaba3, 0xabad, 0x8067, 0xc9bc, 0xa6ba, 
-		0x99c7, 0xaba8, 0xffa4, 
-		0xdbff, 0x4300, 0x1c01, 0x1e1e, 0x2328, 0x4e28, 0x2b2b, 0xa44e, 
-		0x5d6e, 0xa46e, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 
-		0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 
-		0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 
-		0xa4a4, 0xa4a4, 0xffa4, 
-	};
-	static u16 tables4[] = {
-		0xdbff, 0x4300, 0x1400, 0x0f0e, 0x0f12, 0x140d, 0x1012, 0x1712, 
-		0x1415, 0x1e18, 0x2132, 0x1c1e, 0x1e1c, 0x2c3d, 0x242e, 0x4932, 
-		0x4c40, 0x474b, 0x4640, 0x5045, 0x735a, 0x5062, 0x6d55, 0x4556, 
-		0x6446, 0x6588, 0x776d, 0x817b, 0x8182, 0x604e, 0x978d, 0x7d8c, 
-		0x7396, 0x817e, 0xff7c, 
-		0xdbff, 0x4300, 0x1501, 0x1717, 0x1a1e, 0x3b1e, 0x2121, 0x7c3b, 
-		0x4653, 0x7c53, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 
-		0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 
-		0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 
-		0x7c7c, 0x7c7c, 0xff7c, 
-	};
-	static u16 tables5[] = {
-		0xdbff, 0x4300, 0x1000, 0x0c0b, 0x0c0e, 0x100a, 0x0d0e, 0x120e, 
-		0x1011, 0x1813, 0x1a28, 0x1618, 0x1816, 0x2331, 0x1d25, 0x3a28, 
-		0x3d33, 0x393c, 0x3833, 0x4037, 0x5c48, 0x404e, 0x5744, 0x3745, 
-		0x5038, 0x516d, 0x5f57, 0x6762, 0x6768, 0x4d3e, 0x7971, 0x6470, 
-		0x5c78, 0x6765, 0xff63, 
-		0xdbff, 0x4300, 0x1101, 0x1212, 0x1518, 0x2f18, 0x1a1a, 0x632f, 
-		0x3842, 0x6342, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 
-		0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 
-		0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 
-		0x6363, 0x6363, 0xff63, 
-	};
-	static u16 tables6[] = {
-		0xdbff, 0x4300, 0x0d00, 0x0a09, 0x0a0b, 0x0d08, 0x0a0b, 0x0e0b, 
-		0x0d0e, 0x130f, 0x1520, 0x1213, 0x1312, 0x1c27, 0x171e, 0x2e20, 
-		0x3129, 0x2e30, 0x2d29, 0x332c, 0x4a3a, 0x333e, 0x4636, 0x2c37, 
-		0x402d, 0x4157, 0x4c46, 0x524e, 0x5253, 0x3e32, 0x615a, 0x505a, 
-		0x4a60, 0x5251, 0xff4f, 
-		0xdbff, 0x4300, 0x0e01, 0x0e0e, 0x1113, 0x2613, 0x1515, 0x4f26, 
-		0x2d35, 0x4f35, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 
-		0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 
-		0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 
-		0x4f4f, 0x4f4f, 0xff4f, 
-	};
-	static u16 tables7[] = {
-		0xdbff, 0x4300, 0x0a00, 0x0707, 0x0708, 0x0a06, 0x0808, 0x0b08, 
-		0x0a0a, 0x0e0b, 0x1018, 0x0d0e, 0x0e0d, 0x151d, 0x1116, 0x2318, 
-		0x251f, 0x2224, 0x221f, 0x2621, 0x372b, 0x262f, 0x3429, 0x2129, 
-		0x3022, 0x3141, 0x3934, 0x3e3b, 0x3e3e, 0x2e25, 0x4944, 0x3c43, 
-		0x3748, 0x3e3d, 0xff3b, 
-		0xdbff, 0x4300, 0x0a01, 0x0b0b, 0x0d0e, 0x1c0e, 0x1010, 0x3b1c, 
-		0x2228, 0x3b28, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 
-		0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 
-		0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 
-		0x3b3b, 0x3b3b, 0xff3b, 
-	};
-	static u16 tables8[] = {
-		0xdbff, 0x4300, 0x0600, 0x0504, 0x0506, 0x0604, 0x0506, 0x0706, 
-		0x0607, 0x0a08, 0x0a10, 0x090a, 0x0a09, 0x0e14, 0x0c0f, 0x1710, 
-		0x1814, 0x1718, 0x1614, 0x1a16, 0x251d, 0x1a1f, 0x231b, 0x161c, 
-		0x2016, 0x202c, 0x2623, 0x2927, 0x292a, 0x1f19, 0x302d, 0x282d, 
-		0x2530, 0x2928, 0xff28, 
-		0xdbff, 0x4300, 0x0701, 0x0707, 0x080a, 0x130a, 0x0a0a, 0x2813, 
-		0x161a, 0x281a, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 
-		0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 
-		0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 
-		0x2828, 0x2828, 0xff28, 
-	};
-	static u16 tables9[] = {
-		0xdbff, 0x4300, 0x0300, 0x0202, 0x0203, 0x0302, 0x0303, 0x0403, 
-		0x0303, 0x0504, 0x0508, 0x0405, 0x0504, 0x070a, 0x0607, 0x0c08, 
-		0x0c0a, 0x0b0c, 0x0b0a, 0x0d0b, 0x120e, 0x0d10, 0x110e, 0x0b0e, 
-		0x100b, 0x1016, 0x1311, 0x1514, 0x1515, 0x0f0c, 0x1817, 0x1416, 
-		0x1218, 0x1514, 0xff14, 
-		0xdbff, 0x4300, 0x0301, 0x0404, 0x0405, 0x0905, 0x0505, 0x1409, 
-		0x0b0d, 0x140d, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 
-		0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 
-		0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 
-		0x1414, 0x1414, 0xff14, 
-	};
-	static u16 tables10[] = {
-		0xdbff, 0x4300, 0x0100, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 
-		0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 
-		0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 
-		0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 
-		0x0101, 0x0101, 0xff01, 
-		0xdbff, 0x4300, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 
-		0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 
-		0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 
-		0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 
-		0x0101, 0x0101, 0xff01, 
-	};
-
-	switch (quality) {
-	case 0:
-		*size = sizeof(tables0);
-		return tables0;
-	case 1:
-		*size = sizeof(tables1);
-		return tables1;
-	case 2:
-		*size = sizeof(tables2);
-		return tables2;
-	case 3:
-		*size = sizeof(tables3);
-		return tables3;
-	case 4:
-		*size = sizeof(tables4);
-		return tables4;
-	case 5:
-		*size = sizeof(tables5);
-		return tables5;
-	case 6:
-		*size = sizeof(tables6);
-		return tables6;
-	case 7:
-		*size = sizeof(tables7);
-		return tables7;
-	case 8:
-		*size = sizeof(tables8);
-		return tables8;
-	case 9:
-		*size = sizeof(tables9);
-		return tables9;
-	case 10:
-		*size = sizeof(tables10);
-		return tables10;
-	default:
-		printk(KERN_WARNING "meye: invalid quality level %d - using 8\n", quality);
-		*size = sizeof(tables8);
-		return tables8;
+static u16 *jpeg_quantisation_tables(int *length, int quality)
+{
+	static u16 jpeg_tables[][70] = { {
+		0xdbff, 0x4300, 0xff00, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+		0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+		0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+		0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+		0xffff, 0xffff, 0xffff,
+		0xdbff, 0x4300, 0xff01, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+		0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+		0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+		0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+		0xffff, 0xffff, 0xffff,
+	},
+	{
+		0xdbff, 0x4300, 0x5000, 0x3c37, 0x3c46, 0x5032, 0x4146, 0x5a46,
+		0x5055, 0x785f, 0x82c8, 0x6e78, 0x786e, 0xaff5, 0x91b9, 0xffc8,
+		0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+		0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+		0xffff, 0xffff, 0xffff,
+		0xdbff, 0x4300, 0x5501, 0x5a5a, 0x6978, 0xeb78, 0x8282, 0xffeb,
+		0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+		0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+		0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+		0xffff, 0xffff, 0xffff,
+	},
+	{
+		0xdbff, 0x4300, 0x2800, 0x1e1c, 0x1e23, 0x2819, 0x2123, 0x2d23,
+		0x282b, 0x3c30, 0x4164, 0x373c, 0x3c37, 0x587b, 0x495d, 0x9164,
+		0x9980, 0x8f96, 0x8c80, 0xa08a, 0xe6b4, 0xa0c3, 0xdaaa, 0x8aad,
+		0xc88c, 0xcbff, 0xeeda, 0xfff5, 0xffff, 0xc19b, 0xffff, 0xfaff,
+		0xe6ff, 0xfffd, 0xfff8,
+		0xdbff, 0x4300, 0x2b01, 0x2d2d, 0x353c, 0x763c, 0x4141, 0xf876,
+		0x8ca5, 0xf8a5, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8,
+		0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8,
+		0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8,
+		0xf8f8, 0xf8f8, 0xfff8,
+	},
+	{
+		0xdbff, 0x4300, 0x1b00, 0x1412, 0x1417, 0x1b11, 0x1617, 0x1e17,
+		0x1b1c, 0x2820, 0x2b42, 0x2528, 0x2825, 0x3a51, 0x303d, 0x6042,
+		0x6555, 0x5f64, 0x5d55, 0x6a5b, 0x9978, 0x6a81, 0x9071, 0x5b73,
+		0x855d, 0x86b5, 0x9e90, 0xaba3, 0xabad, 0x8067, 0xc9bc, 0xa6ba,
+		0x99c7, 0xaba8, 0xffa4,
+		0xdbff, 0x4300, 0x1c01, 0x1e1e, 0x2328, 0x4e28, 0x2b2b, 0xa44e,
+		0x5d6e, 0xa46e, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4,
+		0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4,
+		0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4,
+		0xa4a4, 0xa4a4, 0xffa4,
+	},
+	{
+		0xdbff, 0x4300, 0x1400, 0x0f0e, 0x0f12, 0x140d, 0x1012, 0x1712,
+		0x1415, 0x1e18, 0x2132, 0x1c1e, 0x1e1c, 0x2c3d, 0x242e, 0x4932,
+		0x4c40, 0x474b, 0x4640, 0x5045, 0x735a, 0x5062, 0x6d55, 0x4556,
+		0x6446, 0x6588, 0x776d, 0x817b, 0x8182, 0x604e, 0x978d, 0x7d8c,
+		0x7396, 0x817e, 0xff7c,
+		0xdbff, 0x4300, 0x1501, 0x1717, 0x1a1e, 0x3b1e, 0x2121, 0x7c3b,
+		0x4653, 0x7c53, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c,
+		0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c,
+		0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c,
+		0x7c7c, 0x7c7c, 0xff7c,
+	},
+	{
+		0xdbff, 0x4300, 0x1000, 0x0c0b, 0x0c0e, 0x100a, 0x0d0e, 0x120e,
+		0x1011, 0x1813, 0x1a28, 0x1618, 0x1816, 0x2331, 0x1d25, 0x3a28,
+		0x3d33, 0x393c, 0x3833, 0x4037, 0x5c48, 0x404e, 0x5744, 0x3745,
+		0x5038, 0x516d, 0x5f57, 0x6762, 0x6768, 0x4d3e, 0x7971, 0x6470,
+		0x5c78, 0x6765, 0xff63,
+		0xdbff, 0x4300, 0x1101, 0x1212, 0x1518, 0x2f18, 0x1a1a, 0x632f,
+		0x3842, 0x6342, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363,
+		0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363,
+		0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363,
+		0x6363, 0x6363, 0xff63,
+	},
+	{
+		0xdbff, 0x4300, 0x0d00, 0x0a09, 0x0a0b, 0x0d08, 0x0a0b, 0x0e0b,
+		0x0d0e, 0x130f, 0x1520, 0x1213, 0x1312, 0x1c27, 0x171e, 0x2e20,
+		0x3129, 0x2e30, 0x2d29, 0x332c, 0x4a3a, 0x333e, 0x4636, 0x2c37,
+		0x402d, 0x4157, 0x4c46, 0x524e, 0x5253, 0x3e32, 0x615a, 0x505a,
+		0x4a60, 0x5251, 0xff4f,
+		0xdbff, 0x4300, 0x0e01, 0x0e0e, 0x1113, 0x2613, 0x1515, 0x4f26,
+		0x2d35, 0x4f35, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f,
+		0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f,
+		0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f,
+		0x4f4f, 0x4f4f, 0xff4f,
+	},
+	{
+		0xdbff, 0x4300, 0x0a00, 0x0707, 0x0708, 0x0a06, 0x0808, 0x0b08,
+		0x0a0a, 0x0e0b, 0x1018, 0x0d0e, 0x0e0d, 0x151d, 0x1116, 0x2318,
+		0x251f, 0x2224, 0x221f, 0x2621, 0x372b, 0x262f, 0x3429, 0x2129,
+		0x3022, 0x3141, 0x3934, 0x3e3b, 0x3e3e, 0x2e25, 0x4944, 0x3c43,
+		0x3748, 0x3e3d, 0xff3b,
+		0xdbff, 0x4300, 0x0a01, 0x0b0b, 0x0d0e, 0x1c0e, 0x1010, 0x3b1c,
+		0x2228, 0x3b28, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b,
+		0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b,
+		0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b,
+		0x3b3b, 0x3b3b, 0xff3b,
+	},
+	{
+		0xdbff, 0x4300, 0x0600, 0x0504, 0x0506, 0x0604, 0x0506, 0x0706,
+		0x0607, 0x0a08, 0x0a10, 0x090a, 0x0a09, 0x0e14, 0x0c0f, 0x1710,
+		0x1814, 0x1718, 0x1614, 0x1a16, 0x251d, 0x1a1f, 0x231b, 0x161c,
+		0x2016, 0x202c, 0x2623, 0x2927, 0x292a, 0x1f19, 0x302d, 0x282d,
+		0x2530, 0x2928, 0xff28,
+		0xdbff, 0x4300, 0x0701, 0x0707, 0x080a, 0x130a, 0x0a0a, 0x2813,
+		0x161a, 0x281a, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828,
+		0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828,
+		0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828,
+		0x2828, 0x2828, 0xff28,
+	},
+	{
+		0xdbff, 0x4300, 0x0300, 0x0202, 0x0203, 0x0302, 0x0303, 0x0403,
+		0x0303, 0x0504, 0x0508, 0x0405, 0x0504, 0x070a, 0x0607, 0x0c08,
+		0x0c0a, 0x0b0c, 0x0b0a, 0x0d0b, 0x120e, 0x0d10, 0x110e, 0x0b0e,
+		0x100b, 0x1016, 0x1311, 0x1514, 0x1515, 0x0f0c, 0x1817, 0x1416,
+		0x1218, 0x1514, 0xff14,
+		0xdbff, 0x4300, 0x0301, 0x0404, 0x0405, 0x0905, 0x0505, 0x1409,
+		0x0b0d, 0x140d, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414,
+		0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414,
+		0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414,
+		0x1414, 0x1414, 0xff14,
+	},
+	{
+		0xdbff, 0x4300, 0x0100, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
+		0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
+		0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
+		0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
+		0x0101, 0x0101, 0xff01,
+		0xdbff, 0x4300, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
+		0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
+		0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
+		0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
+		0x0101, 0x0101, 0xff01,
+	} };
+
+	if (quality < 0 || quality > 10) {
+		printk(KERN_WARNING
+		       "meye: invalid quality level %d - using 8\n", quality);
+		quality = 8;
 	}
-	return NULL;
+
+	*length = ARRAY_SIZE(jpeg_tables[quality]);
+	return jpeg_tables[quality];
 }
 
 /* return a generic set of huffman tables */
-static u16 *jpeg_huffman_tables(int *size) {
+static u16 *jpeg_huffman_tables(int *length)
+{
 	static u16 tables[] = {
-		0xC4FF, 0xB500, 0x0010, 0x0102, 0x0303, 0x0402, 0x0503, 0x0405, 
-		0x0004, 0x0100, 0x017D, 0x0302, 0x0400, 0x0511, 0x2112, 0x4131, 
-		0x1306, 0x6151, 0x2207, 0x1471, 0x8132, 0xA191, 0x2308, 0xB142, 
-		0x15C1, 0xD152, 0x24F0, 0x6233, 0x8272, 0x0A09, 0x1716, 0x1918, 
-		0x251A, 0x2726, 0x2928, 0x342A, 0x3635, 0x3837, 0x3A39, 0x4443, 
-		0x4645, 0x4847, 0x4A49, 0x5453, 0x5655, 0x5857, 0x5A59, 0x6463, 
-		0x6665, 0x6867, 0x6A69, 0x7473, 0x7675, 0x7877, 0x7A79, 0x8483, 
-		0x8685, 0x8887, 0x8A89, 0x9392, 0x9594, 0x9796, 0x9998, 0xA29A, 
-		0xA4A3, 0xA6A5, 0xA8A7, 0xAAA9, 0xB3B2, 0xB5B4, 0xB7B6, 0xB9B8, 
-		0xC2BA, 0xC4C3, 0xC6C5, 0xC8C7, 0xCAC9, 0xD3D2, 0xD5D4, 0xD7D6, 
-		0xD9D8, 0xE1DA, 0xE3E2, 0xE5E4, 0xE7E6, 0xE9E8, 0xF1EA, 0xF3F2, 
-		0xF5F4, 0xF7F6, 0xF9F8, 0xFFFA, 
-		0xC4FF, 0xB500, 0x0011, 0x0102, 0x0402, 0x0304, 0x0704, 0x0405, 
-		0x0004, 0x0201, 0x0077, 0x0201, 0x1103, 0x0504, 0x3121, 0x1206, 
-		0x5141, 0x6107, 0x1371, 0x3222, 0x0881, 0x4214, 0xA191, 0xC1B1, 
-		0x2309, 0x5233, 0x15F0, 0x7262, 0x0AD1, 0x2416, 0xE134, 0xF125, 
-		0x1817, 0x1A19, 0x2726, 0x2928, 0x352A, 0x3736, 0x3938, 0x433A, 
-		0x4544, 0x4746, 0x4948, 0x534A, 0x5554, 0x5756, 0x5958, 0x635A, 
-		0x6564, 0x6766, 0x6968, 0x736A, 0x7574, 0x7776, 0x7978, 0x827A, 
-		0x8483, 0x8685, 0x8887, 0x8A89, 0x9392, 0x9594, 0x9796, 0x9998, 
-		0xA29A, 0xA4A3, 0xA6A5, 0xA8A7, 0xAAA9, 0xB3B2, 0xB5B4, 0xB7B6, 
-		0xB9B8, 0xC2BA, 0xC4C3, 0xC6C5, 0xC8C7, 0xCAC9, 0xD3D2, 0xD5D4, 
-		0xD7D6, 0xD9D8, 0xE2DA, 0xE4E3, 0xE6E5, 0xE8E7, 0xEAE9, 0xF3F2, 
-		0xF5F4, 0xF7F6, 0xF9F8, 0xFFFA, 
-		0xC4FF, 0x1F00, 0x0000, 0x0501, 0x0101, 0x0101, 0x0101, 0x0000, 
-		0x0000, 0x0000, 0x0000, 0x0201, 0x0403, 0x0605, 0x0807, 0x0A09, 
-		0xFF0B, 
-		0xC4FF, 0x1F00, 0x0001, 0x0103, 0x0101, 0x0101, 0x0101, 0x0101, 
-		0x0000, 0x0000, 0x0000, 0x0201, 0x0403, 0x0605, 0x0807, 0x0A09, 
+		0xC4FF, 0xB500, 0x0010, 0x0102, 0x0303, 0x0402, 0x0503, 0x0405,
+		0x0004, 0x0100, 0x017D, 0x0302, 0x0400, 0x0511, 0x2112, 0x4131,
+		0x1306, 0x6151, 0x2207, 0x1471, 0x8132, 0xA191, 0x2308, 0xB142,
+		0x15C1, 0xD152, 0x24F0, 0x6233, 0x8272, 0x0A09, 0x1716, 0x1918,
+		0x251A, 0x2726, 0x2928, 0x342A, 0x3635, 0x3837, 0x3A39, 0x4443,
+		0x4645, 0x4847, 0x4A49, 0x5453, 0x5655, 0x5857, 0x5A59, 0x6463,
+		0x6665, 0x6867, 0x6A69, 0x7473, 0x7675, 0x7877, 0x7A79, 0x8483,
+		0x8685, 0x8887, 0x8A89, 0x9392, 0x9594, 0x9796, 0x9998, 0xA29A,
+		0xA4A3, 0xA6A5, 0xA8A7, 0xAAA9, 0xB3B2, 0xB5B4, 0xB7B6, 0xB9B8,
+		0xC2BA, 0xC4C3, 0xC6C5, 0xC8C7, 0xCAC9, 0xD3D2, 0xD5D4, 0xD7D6,
+		0xD9D8, 0xE1DA, 0xE3E2, 0xE5E4, 0xE7E6, 0xE9E8, 0xF1EA, 0xF3F2,
+		0xF5F4, 0xF7F6, 0xF9F8, 0xFFFA,
+		0xC4FF, 0xB500, 0x0011, 0x0102, 0x0402, 0x0304, 0x0704, 0x0405,
+		0x0004, 0x0201, 0x0077, 0x0201, 0x1103, 0x0504, 0x3121, 0x1206,
+		0x5141, 0x6107, 0x1371, 0x3222, 0x0881, 0x4214, 0xA191, 0xC1B1,
+		0x2309, 0x5233, 0x15F0, 0x7262, 0x0AD1, 0x2416, 0xE134, 0xF125,
+		0x1817, 0x1A19, 0x2726, 0x2928, 0x352A, 0x3736, 0x3938, 0x433A,
+		0x4544, 0x4746, 0x4948, 0x534A, 0x5554, 0x5756, 0x5958, 0x635A,
+		0x6564, 0x6766, 0x6968, 0x736A, 0x7574, 0x7776, 0x7978, 0x827A,
+		0x8483, 0x8685, 0x8887, 0x8A89, 0x9392, 0x9594, 0x9796, 0x9998,
+		0xA29A, 0xA4A3, 0xA6A5, 0xA8A7, 0xAAA9, 0xB3B2, 0xB5B4, 0xB7B6,
+		0xB9B8, 0xC2BA, 0xC4C3, 0xC6C5, 0xC8C7, 0xCAC9, 0xD3D2, 0xD5D4,
+		0xD7D6, 0xD9D8, 0xE2DA, 0xE4E3, 0xE6E5, 0xE8E7, 0xEAE9, 0xF3F2,
+		0xF5F4, 0xF7F6, 0xF9F8, 0xFFFA,
+		0xC4FF, 0x1F00, 0x0000, 0x0501, 0x0101, 0x0101, 0x0101, 0x0000,
+		0x0000, 0x0000, 0x0000, 0x0201, 0x0403, 0x0605, 0x0807, 0x0A09,
+		0xFF0B,
+		0xC4FF, 0x1F00, 0x0001, 0x0103, 0x0101, 0x0101, 0x0101, 0x0101,
+		0x0000, 0x0000, 0x0000, 0x0201, 0x0403, 0x0605, 0x0807, 0x0A09,
 		0xFF0B
 	};
 
-	*size = sizeof(tables);
+	*length = ARRAY_SIZE(tables);
 	return tables;
 }
 
@@ -419,23 +393,27 @@
 /****************************************************************************/
 
 /* returns the horizontal capture size */
-static inline int mchip_hsize(void) {
+static inline int mchip_hsize(void)
+{
 	return meye.params.subsample ? 320 : 640;
 }
 
 /* returns the vertical capture size */
-static inline int mchip_vsize(void) {
+static inline int mchip_vsize(void)
+{
 	return meye.params.subsample ? 240 : 480;
 }
 
 /* waits for a register to be available */
-static void mchip_sync(int reg) {
+static void mchip_sync(int reg)
+{
 	u32 status;
 	int i;
 
 	if (reg == MCHIP_MM_FIFO_DATA) {
 		for (i = 0; i < MCHIP_REG_TIMEOUT; i++) {
-			status = readl(meye.mchip_mmregs + MCHIP_MM_FIFO_STATUS);
+			status = readl(meye.mchip_mmregs +
+				       MCHIP_MM_FIFO_STATUS);
 			if (!(status & MCHIP_MM_FIFO_WAIT)) {
 				printk(KERN_WARNING "meye: fifo not ready\n");
 				return;
@@ -444,44 +422,48 @@
 				return;
 			udelay(1);
 		}
-	}
-	else if (reg > 0x80) {
+	} else if (reg > 0x80) {
 		u32 mask = (reg < 0x100) ? MCHIP_HIC_STATUS_MCC_RDY
-			                 : MCHIP_HIC_STATUS_VRJ_RDY;
+					 : MCHIP_HIC_STATUS_VRJ_RDY;
 		for (i = 0; i < MCHIP_REG_TIMEOUT; i++) {
 			status = readl(meye.mchip_mmregs + MCHIP_HIC_STATUS);
 			if (status & mask)
 				return;
 			udelay(1);
 		}
-	}
-	else
+	} else
 		return;
-	printk(KERN_WARNING "meye: mchip_sync() timeout on reg 0x%x status=0x%x\n", reg, status);
+	printk(KERN_WARNING
+	       "meye: mchip_sync() timeout on reg 0x%x status=0x%x\n",
+	       reg, status);
 }
 
 /* sets a value into the register */
-static inline void mchip_set(int reg, u32 v) {
+static inline void mchip_set(int reg, u32 v)
+{
 	mchip_sync(reg);
 	writel(v, meye.mchip_mmregs + reg);
 }
 
 /* get the register value */
-static inline u32 mchip_read(int reg) {
+static inline u32 mchip_read(int reg)
+{
 	mchip_sync(reg);
 	return readl(meye.mchip_mmregs + reg);
 }
 
 /* wait for a register to become a particular value */
-static inline int mchip_delay(u32 reg, u32 v) {
+static inline int mchip_delay(u32 reg, u32 v)
+{
 	int n = 10;
-	while (--n && mchip_read(reg) != v) 
+	while (--n && mchip_read(reg) != v)
 		udelay(1);
 	return n;
 }
 
 /* setup subsampling */
-static void mchip_subsample(void) {
+static void mchip_subsample(void)
+{
 	mchip_set(MCHIP_MCC_R_SAMPLING, meye.params.subsample);
 	mchip_set(MCHIP_MCC_R_XRANGE, mchip_hsize());
 	mchip_set(MCHIP_MCC_R_YRANGE, mchip_vsize());
@@ -491,29 +473,31 @@
 }
 
 /* set the framerate into the mchip */
-static void mchip_set_framerate(void) {
+static void mchip_set_framerate(void)
+{
 	mchip_set(MCHIP_HIC_S_RATE, meye.params.framerate);
 }
 
 /* load some huffman and quantisation tables into the VRJ chip ready
    for JPEG compression */
-static void mchip_load_tables(void) {
+static void mchip_load_tables(void)
+{
 	int i;
-	int size;
+	int length;
 	u16 *tables;
 
-	tables = jpeg_huffman_tables(&size);
-	for (i = 0; i < size / 2; i++)
+	tables = jpeg_huffman_tables(&length);
+	for (i = 0; i < length; i++)
 		writel(tables[i], meye.mchip_mmregs + MCHIP_VRJ_TABLE_DATA);
 
-	tables = jpeg_quantisation_tables(&size, meye.params.quality);
-	for (i = 0; i < size / 2; i++)
+	tables = jpeg_quantisation_tables(&length, meye.params.quality);
+	for (i = 0; i < length; i++)
 		writel(tables[i], meye.mchip_mmregs + MCHIP_VRJ_TABLE_DATA);
 }
 
 /* setup the VRJ parameters in the chip */
-static void mchip_vrj_setup(u8 mode) {
-
+static void mchip_vrj_setup(u8 mode)
+{
 	mchip_set(MCHIP_VRJ_BUS_MODE, 5);
 	mchip_set(MCHIP_VRJ_SIGNAL_ACTIVE_LEVEL, 0x1f);
 	mchip_set(MCHIP_VRJ_PDAT_USE, 1);
@@ -530,13 +514,14 @@
 	mchip_set(MCHIP_VRJ_SOF2, 0x1502);
 	mchip_set(MCHIP_VRJ_SOF3, 0x1503);
 	mchip_set(MCHIP_VRJ_SOF4, 0x1596);
-	mchip_set(MCHIP_VRJ_SOS,  0x0ed0);
+	mchip_set(MCHIP_VRJ_SOS, 0x0ed0);
 
 	mchip_load_tables();
 }
 
 /* sets the DMA parameters into the chip */
-static void mchip_dma_setup(u32 dma_addr) {
+static void mchip_dma_setup(u32 dma_addr)
+{
 	int i;
 
 	mchip_set(MCHIP_MM_PT_ADDR, dma_addr);
@@ -546,7 +531,8 @@
 }
 
 /* setup for DMA transfers - also zeros the framebuffer */
-static int mchip_dma_alloc(void) {
+static int mchip_dma_alloc(void)
+{
 	if (!meye.mchip_dmahandle)
 		if (ptable_alloc())
 			return -1;
@@ -554,7 +540,8 @@
 }
 
 /* frees the DMA buffer */
-static void mchip_dma_free(void) {
+static void mchip_dma_free(void)
+{
 	if (meye.mchip_dmahandle) {
 		mchip_dma_setup(0);
 		ptable_free();
@@ -563,7 +550,8 @@
 
 /* stop any existing HIC action and wait for any dma to complete then
    reset the dma engine */
-static void mchip_hic_stop(void) {
+static void mchip_hic_stop(void)
+{
 	int i, j;
 
 	meye.mchip_mode = MCHIP_HIC_MODE_NOOP;
@@ -573,12 +561,13 @@
 		mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_STOP);
 		mchip_delay(MCHIP_HIC_CMD, 0);
 		for (j = 0; j < 100; ++j) {
-			if (mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE))
+			if (mchip_delay(MCHIP_HIC_STATUS,
+					MCHIP_HIC_STATUS_IDLE))
 				return;
 			msleep(1);
 		}
 		printk(KERN_ERR "meye: need to reset HIC!\n");
-	
+
 		mchip_set(MCHIP_HIC_CTL, MCHIP_HIC_CTL_SOFT_RESET);
 		msleep(250);
 	}
@@ -590,15 +579,17 @@
 /****************************************************************************/
 
 /* get the next ready frame from the dma engine */
-static u32 mchip_get_frame(void) {
+static u32 mchip_get_frame(void)
+{
 	u32 v;
-	
+
 	v = mchip_read(MCHIP_MM_FIR(meye.mchip_fnum));
 	return v;
 }
 
 /* frees the current frame from the dma engine */
-static void mchip_free_frame(void) {
+static void mchip_free_frame(void)
+{
 	mchip_set(MCHIP_MM_FIR(meye.mchip_fnum), 0);
 	meye.mchip_fnum++;
 	meye.mchip_fnum %= 4;
@@ -606,17 +597,18 @@
 
 /* read one frame from the framebuffer assuming it was captured using
    a uncompressed transfer */
-static void mchip_cont_read_frame(u32 v, u8 *buf, int size) {
+static void mchip_cont_read_frame(u32 v, u8 *buf, int size)
+{
 	int pt_id;
 
 	pt_id = (v >> 17) & 0x3FF;
 
 	ptable_copy(buf, pt_id, size, MCHIP_NB_PAGES);
-
 }
 
 /* read a compressed frame from the framebuffer */
-static int mchip_comp_read_frame(u32 v, u8 *buf, int size) {
+static int mchip_comp_read_frame(u32 v, u8 *buf, int size)
+{
 	int pt_start, pt_end, trailer;
 	int fsize;
 	int i;
@@ -632,18 +624,17 @@
 		fsize = (pt_end - pt_start) * PAGE_SIZE + trailer * 4;
 
 	if (fsize > size) {
-		printk(KERN_WARNING "meye: oversized compressed frame %d\n", 
+		printk(KERN_WARNING "meye: oversized compressed frame %d\n",
 		       fsize);
 		return -1;
 	}
 
 	ptable_copy(buf, pt_start, fsize, MCHIP_NB_PAGES_MJPEG);
 
-
 #ifdef MEYE_JPEG_CORRECTION
 
 	/* Some mchip generated jpeg frames are incorrect. In most
-	 * (all ?) of those cases, the final EOI (0xff 0xd9) marker 
+	 * (all ?) of those cases, the final EOI (0xff 0xd9) marker
 	 * is not present at the end of the frame.
 	 *
 	 * Since adding the final marker is not enough to restore
@@ -661,9 +652,10 @@
 }
 
 /* take a picture into SDRAM */
-static void mchip_take_picture(void) {
+static void mchip_take_picture(void)
+{
 	int i;
-	
+
 	mchip_hic_stop();
 	mchip_subsample();
 	mchip_dma_setup(meye.mchip_dmahandle);
@@ -681,7 +673,8 @@
 }
 
 /* dma a previously taken picture into a buffer */
-static void mchip_get_picture(u8 *buf, int bufsize) {
+static void mchip_get_picture(u8 *buf, int bufsize)
+{
 	u32 v;
 	int i;
 
@@ -694,7 +687,7 @@
 			break;
 		msleep(1);
 	}
-	for (i = 0; i < 4 ; ++i) {
+	for (i = 0; i < 4; ++i) {
 		v = mchip_get_frame();
 		if (v & MCHIP_MM_FIR_RDY) {
 			mchip_cont_read_frame(v, buf, bufsize);
@@ -705,7 +698,8 @@
 }
 
 /* start continuous dma capture */
-static void mchip_continuous_start(void) {
+static void mchip_continuous_start(void)
+{
 	mchip_hic_stop();
 	mchip_subsample();
 	mchip_set_framerate();
@@ -720,7 +714,8 @@
 }
 
 /* compress one frame into a buffer */
-static int mchip_compress_frame(u8 *buf, int bufsize) {
+static int mchip_compress_frame(u8 *buf, int bufsize)
+{
 	u32 v;
 	int len = -1, i;
 
@@ -729,7 +724,7 @@
 
 	mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_STILL_COMP);
 	mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
-	
+
 	mchip_delay(MCHIP_HIC_CMD, 0);
 	for (i = 0; i < 100; ++i) {
 		if (mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE))
@@ -737,7 +732,7 @@
 		msleep(1);
 	}
 
-	for (i = 0; i < 4 ; ++i) {
+	for (i = 0; i < 4; ++i) {
 		v = mchip_get_frame();
 		if (v & MCHIP_MM_FIR_RDY) {
 			len = mchip_comp_read_frame(v, buf, bufsize);
@@ -750,13 +745,14 @@
 
 #if 0
 /* uncompress one image into a buffer */
-static int mchip_uncompress_frame(u8 *img, int imgsize, u8 *buf, int bufsize) {
+static int mchip_uncompress_frame(u8 *img, int imgsize, u8 *buf, int bufsize)
+{
 	mchip_vrj_setup(0x3f);
 	udelay(50);
 
 	mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_STILL_DECOMP);
 	mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
-	
+
 	mchip_delay(MCHIP_HIC_CMD, 0);
 
 	return mchip_comp_read_frame(buf, bufsize);
@@ -764,7 +760,8 @@
 #endif
 
 /* start continuous compressed capture */
-static void mchip_cont_compression_start(void) {
+static void mchip_cont_compression_start(void)
+{
 	mchip_hic_stop();
 	mchip_vrj_setup(0x3f);
 	mchip_subsample();
@@ -782,6 +779,7 @@
 /****************************************************************************/
 /* Interrupt handling                                                       */
 /****************************************************************************/
+
 static irqreturn_t meye_irq(int irq, void *dev_id, struct pt_regs *regs)
 {
 	u32 v;
@@ -842,10 +840,11 @@
 /* video4linux integration                                                  */
 /****************************************************************************/
 
-static int meye_open(struct inode *inode, struct file *file) {
+static int meye_open(struct inode *inode, struct file *file)
+{
 	int i, err;
 
-	err = video_exclusive_open(inode,file);
+	err = video_exclusive_open(inode, file);
 	if (err < 0)
 		return err;
 
@@ -853,7 +852,7 @@
 
 	if (mchip_dma_alloc()) {
 		printk(KERN_ERR "meye: mchip framebuffer allocation failed\n");
-		video_exclusive_release(inode,file);
+		video_exclusive_release(inode, file);
 		return -ENOBUFS;
 	}
 
@@ -861,20 +860,20 @@
 		meye.grab_buffer[i].state = MEYE_BUF_UNUSED;
 	kfifo_reset(meye.grabq);
 	kfifo_reset(meye.doneq);
-
 	return 0;
 }
 
-static int meye_release(struct inode *inode, struct file *file) {
+static int meye_release(struct inode *inode, struct file *file)
+{
 	mchip_hic_stop();
 	mchip_dma_free();
-	video_exclusive_release(inode,file);
+	video_exclusive_release(inode, file);
 	return 0;
 }
 
 static int meye_do_ioctl(struct inode *inode, struct file *file,
-			 unsigned int cmd, void *arg) {
-
+			 unsigned int cmd, void *arg)
+{
 	switch (cmd) {
 
 	case VIDIOCGCAP: {
@@ -921,13 +920,13 @@
 		if (p->palette != VIDEO_PALETTE_YUV422)
 			return -EINVAL;
 		down(&meye.lock);
-		sonypi_camera_command(SONYPI_COMMAND_SETCAMERABRIGHTNESS, 
+		sonypi_camera_command(SONYPI_COMMAND_SETCAMERABRIGHTNESS,
 				      p->brightness >> 10);
-		sonypi_camera_command(SONYPI_COMMAND_SETCAMERAHUE, 
+		sonypi_camera_command(SONYPI_COMMAND_SETCAMERAHUE,
 				      p->hue >> 10);
-		sonypi_camera_command(SONYPI_COMMAND_SETCAMERACOLOR, 
+		sonypi_camera_command(SONYPI_COMMAND_SETCAMERACOLOR,
 				      p->colour >> 10);
-		sonypi_camera_command(SONYPI_COMMAND_SETCAMERACONTRAST, 
+		sonypi_camera_command(SONYPI_COMMAND_SETCAMERACONTRAST,
 				      p->contrast >> 10);
 		meye.picture = *p;
 		up(&meye.lock);
@@ -988,14 +987,12 @@
 				meye.params.subsample = 0;
 				restart = 1;
 			}
-		}
-		else if (vm->width == 320 && vm->height == 240) {
+		} else if (vm->width == 320 && vm->height == 240) {
 			if (!meye.params.subsample) {
 				meye.params.subsample = 1;
 				restart = 1;
 			}
-		}
-		else {
+		} else {
 			up(&meye.lock);
 			return -EINVAL;
 		}
@@ -1054,7 +1051,7 @@
 	case MEYEIOC_QBUF_CAPT: {
 		int *nb = arg;
 
-		if (!meye.grab_fbuffer) 
+		if (!meye.grab_fbuffer)
 			return -EINVAL;
 		if (*nb >= gbuffers)
 			return -EINVAL;
@@ -1109,7 +1106,7 @@
 
 	case MEYEIOC_STILLCAPT: {
 
-		if (!meye.grab_fbuffer) 
+		if (!meye.grab_fbuffer)
 			return -EINVAL;
 		if (meye.grab_buffer[0].state != MEYE_BUF_UNUSED)
 			return -EBUSY;
@@ -1127,7 +1124,7 @@
 	case MEYEIOC_STILLJCAPT: {
 		int *len = arg;
 
-		if (!meye.grab_fbuffer) 
+		if (!meye.grab_fbuffer)
 			return -EINVAL;
 		if (meye.grab_buffer[0].state != MEYE_BUF_UNUSED)
 			return -EBUSY;
@@ -1695,7 +1692,8 @@
 	.close		= meye_vm_close,
 };
 
-static int meye_mmap(struct file *file, struct vm_area_struct *vma) {
+static int meye_mmap(struct file *file, struct vm_area_struct *vma)
+{
 	unsigned long start = vma->vm_start;
 	unsigned long size = vma->vm_end - vma->vm_start;
 	unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
@@ -1801,8 +1799,9 @@
 }
 #endif
 
-static int __devinit meye_probe(struct pci_dev *pcidev, 
-		                const struct pci_device_id *ent) {
+static int __devinit meye_probe(struct pci_dev *pcidev,
+				const struct pci_device_id *ent)
+{
 	int ret = -EBUSY;
 	unsigned long mchip_adr;
 	u8 revision;
@@ -1897,12 +1896,12 @@
 	msleep(1);
 	mchip_set(MCHIP_MM_INTA, MCHIP_MM_INTA_HIC_1_MASK);
 
-	if (video_register_device(meye.video_dev, VFL_TYPE_GRABBER, video_nr) < 0) {
-
+	if (video_register_device(meye.video_dev, VFL_TYPE_GRABBER, 
+				  video_nr) < 0) {
 		printk(KERN_ERR "meye: video_register_device failed\n");
 		goto outvideoreg;
 	}
-	
+
 	init_MUTEX(&meye.lock);
 	init_waitqueue_head(&meye.proc_list);
 	meye.picture.depth = 16;
@@ -1918,7 +1917,7 @@
 	meye.params.agc = 48;
 	meye.params.picture = 0;
 	meye.params.framerate = 0;
-	
+
 	sonypi_camera_command(SONYPI_COMMAND_SETCAMERABRIGHTNESS, 32);
 	sonypi_camera_command(SONYPI_COMMAND_SETCAMERAHUE, 32);
 	sonypi_camera_command(SONYPI_COMMAND_SETCAMERACOLOR, 32);
@@ -1956,8 +1955,8 @@
 	return ret;
 }
 
-static void __devexit meye_remove(struct pci_dev *pcidev) {
-
+static void __devexit meye_remove(struct pci_dev *pcidev)
+{
 	video_unregister_device(meye.video_dev);
 
 	mchip_hic_stop();
@@ -1992,7 +1991,7 @@
 }
 
 static struct pci_device_id meye_pci_tbl[] = {
-	{ PCI_VENDOR_ID_KAWASAKI, PCI_DEVICE_ID_MCHIP_KL5A72002, 
+	{ PCI_VENDOR_ID_KAWASAKI, PCI_DEVICE_ID_MCHIP_KL5A72002,
 	  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
 	{ }
 };
@@ -2010,20 +2009,23 @@
 #endif
 };
 
-static int __init meye_init(void) {
+static int __init meye_init(void)
+{
 	gbuffers = max(2, min((int)gbuffers, MEYE_MAX_BUFNBRS));
 	if (gbufsize < 0 || gbufsize > MEYE_MAX_BUFSIZE)
 		gbufsize = MEYE_MAX_BUFSIZE;
 	gbufsize = PAGE_ALIGN(gbufsize);
-	printk(KERN_INFO "meye: using %d buffers with %dk (%dk total) for capture\n",
-	       gbuffers, gbufsize/1024, gbuffers*gbufsize/1024);
-	return pci_module_init(&meye_driver);
+	printk(KERN_INFO "meye: using %d buffers with %dk (%dk total)"
+			 "for capture\n",
+			 gbuffers, 
+			 gbufsize / 1024, gbuffers * gbufsize / 1024);
+	return pci_register_driver(&meye_driver);
 }
 
-static void __exit meye_exit(void) {
+static void __exit meye_exit(void)
+{
 	pci_unregister_driver(&meye_driver);
 }
 
-/* Module entry points */
 module_init(meye_init);
 module_exit(meye_exit);
diff -Nru a/drivers/media/video/meye.h b/drivers/media/video/meye.h
--- a/drivers/media/video/meye.h	2004-11-04 11:34:28 +01:00
+++ b/drivers/media/video/meye.h	2004-11-04 11:34:28 +01:00
@@ -1,27 +1,27 @@
-/* 
+/*
  * Motion Eye video4linux driver for Sony Vaio PictureBook
  *
- * Copyright (C) 2001-2003 Stelian Pop <stelian@popies.net>
+ * Copyright (C) 2001-2004 Stelian Pop <stelian@popies.net>
  *
  * Copyright (C) 2001-2002 Alcôve <www.alcove.com>
  *
  * Copyright (C) 2000 Andrew Tridgell <tridge@valinux.com>
  *
  * Earlier work by Werner Almesberger, Paul `Rusty' Russell and Paul Mackerras.
- * 
+ *
  * Some parts borrowed from various video4linux drivers, especially
  * bttv-driver.c and zoran.c, see original files for credits.
- * 
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
- * 
+ *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
@@ -30,7 +30,7 @@
 #ifndef _MEYE_PRIV_H_
 #define _MEYE_PRIV_H_
 
-#define MEYE_DRIVER_MAJORVERSION	1
+#define MEYE_DRIVER_MAJORVERSION	 1
 #define MEYE_DRIVER_MINORVERSION	10
 
 #define MEYE_DRIVER_VERSION __stringify(MEYE_DRIVER_MAJORVERSION) "." \
@@ -47,7 +47,7 @@
 
 /* Motion JPEG chip PCI configuration registers */
 #define MCHIP_PCI_POWER_CSR		0x54
-#define MCHIP_PCI_MCORE_STATUS		0x60	/* see HIC_STATUS   */
+#define MCHIP_PCI_MCORE_STATUS		0x60		/* see HIC_STATUS   */
 #define MCHIP_PCI_HOSTUSEREQ_SET	0x64
 #define MCHIP_PCI_HOSTUSEREQ_CLR	0x68
 #define MCHIP_PCI_LOWPOWER_SET		0x6c
@@ -77,7 +77,7 @@
 #define MCHIP_MM_INTA_PCI_ERR		0x00000040	/* PCI error */
 #define MCHIP_MM_INTA_PCI_ERR_MASK	0x00004000
 
-#define MCHIP_MM_PT_ADDR		0x08		/* page table address */
+#define MCHIP_MM_PT_ADDR		0x08		/* page table address*/
 							/* n*4kB */
 #define MCHIP_NB_PAGES			1024		/* pages for display */
 #define MCHIP_NB_PAGES_MJPEG		256		/* pages for mjpeg */
@@ -288,33 +288,25 @@
 
 /* Motion Eye device structure */
 struct meye {
-
-	/* mchip related */
 	struct pci_dev *mchip_dev;	/* pci device */
 	u8 mchip_irq;			/* irq */
 	u8 mchip_mode;			/* actual mchip mode: HIC_MODE... */
 	u8 mchip_fnum;			/* current mchip frame number */
-
 	unsigned char *mchip_mmregs;	/* mchip: memory mapped registers */
 	u8 *mchip_ptable[MCHIP_NB_PAGES];/* mchip: ptable */
 	dma_addr_t *mchip_ptable_toc;	/* mchip: ptable toc */
 	dma_addr_t mchip_dmahandle;	/* mchip: dma handle to ptable toc */
-
 	unsigned char *grab_fbuffer;	/* capture framebuffer */
 	unsigned char *grab_temp;	/* temporary buffer */
 					/* list of buffers */
 	struct meye_grab_buffer grab_buffer[MEYE_MAX_BUFNBRS];
 	int vma_use_count[MEYE_MAX_BUFNBRS]; /* mmap count */
-
-	/* other */
 	struct semaphore lock;		/* semaphore for open/mmap... */
-
 	struct kfifo *grabq;		/* queue for buffers to be grabbed */
 	spinlock_t grabq_lock;		/* lock protecting the queue */
 	struct kfifo *doneq;		/* queue for grabbed buffers */
 	spinlock_t doneq_lock;		/* lock protecting the queue */
 	wait_queue_head_t proc_list;	/* wait queue */
-
 	struct video_device *video_dev;	/* video device parameters */
 	struct video_picture picture;	/* video picture parameters */
 	struct meye_params params;	/* additional parameters */
diff -Nru a/include/linux/meye.h b/include/linux/meye.h
--- a/include/linux/meye.h	2004-11-04 11:34:28 +01:00
+++ b/include/linux/meye.h	2004-11-04 11:34:28 +01:00
@@ -1,4 +1,4 @@
-/* 
+/*
  * Motion Eye video4linux driver for Sony Vaio PictureBook
  *
  * Copyright (C) 2001-2003 Stelian Pop <stelian@popies.net>
@@ -8,20 +8,20 @@
  * Copyright (C) 2000 Andrew Tridgell <tridge@valinux.com>
  *
  * Earlier work by Werner Almesberger, Paul `Rusty' Russell and Paul Mackerras.
- * 
+ *
  * Some parts borrowed from various video4linux drivers, especially
  * bttv-driver.c and zoran.c, see original files for credits.
- * 
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
- * 
+ *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCH 11/12] meye: bump up the version number
  2004-11-04 11:12 [PATCH 0/12] meye driver update Stelian Pop
                   ` (9 preceding siblings ...)
  2004-11-04 11:17 ` [PATCH 10/12] meye: whitespace and coding style cleanups Stelian Pop
@ 2004-11-04 11:18 ` Stelian Pop
  2004-11-04 11:18 ` [PATCH 12/12] meye: cache the camera settings in the driver Stelian Pop
                   ` (2 subsequent siblings)
  13 siblings, 0 replies; 26+ messages in thread
From: Stelian Pop @ 2004-11-04 11:18 UTC (permalink / raw)
  To: Linux Kernel Mailing List, Linus Torvalds, Andrew Morton

===================================================================

ChangeSet@1.2350, 2004-11-02 16:34:21+01:00, stelian@popies.net
  meye: bump up the version number
  
  Signed-off-by: Stelian Pop <stelian@popies.net>

===================================================================

 meye.h |    2 +-
 1 files changed, 1 insertion(+), 1 deletion(-)

===================================================================

diff -Nru a/drivers/media/video/meye.h b/drivers/media/video/meye.h
--- a/drivers/media/video/meye.h	2004-11-04 11:36:28 +01:00
+++ b/drivers/media/video/meye.h	2004-11-04 11:36:28 +01:00
@@ -31,7 +31,7 @@
 #define _MEYE_PRIV_H_
 
 #define MEYE_DRIVER_MAJORVERSION	 1
-#define MEYE_DRIVER_MINORVERSION	10
+#define MEYE_DRIVER_MINORVERSION	11
 
 #define MEYE_DRIVER_VERSION __stringify(MEYE_DRIVER_MAJORVERSION) "." \
 			    __stringify(MEYE_DRIVER_MINORVERSION)

^ permalink raw reply	[flat|nested] 26+ messages in thread

* [PATCH 12/12] meye: cache the camera settings in the driver
  2004-11-04 11:12 [PATCH 0/12] meye driver update Stelian Pop
                   ` (10 preceding siblings ...)
  2004-11-04 11:18 ` [PATCH 11/12] meye: bump up the version number Stelian Pop
@ 2004-11-04 11:18 ` Stelian Pop
  2004-11-04 12:25 ` [PATCH 0/12] meye driver update Emmanuel Fleury
  2004-11-04 21:19 ` meye bug? (was: meye driver update) Roland Mas
  13 siblings, 0 replies; 26+ messages in thread
From: Stelian Pop @ 2004-11-04 11:18 UTC (permalink / raw)
  To: Linux Kernel Mailing List, Linus Torvalds, Andrew Morton

===================================================================

ChangeSet@1.2352, 2004-11-04 11:50:37+01:00, stelian@popies.net
  meye: retrieving the current settings from the camera does not work
        very well, we need to cache the values in the driver
  
  Signed-off-by: Stelian Pop <stelian@popies.net>

===================================================================

 meye.c |   31 +++++++++++++++----------------
 1 files changed, 15 insertions(+), 16 deletions(-)

===================================================================

diff -Nru a/drivers/media/video/meye.c b/drivers/media/video/meye.c
--- a/drivers/media/video/meye.c	2004-11-04 11:52:38 +01:00
+++ b/drivers/media/video/meye.c	2004-11-04 11:52:38 +01:00
@@ -1281,34 +1281,40 @@
 
 		down(&meye.lock);
 		switch (c->id) {
-
 		case V4L2_CID_BRIGHTNESS:
 			sonypi_camera_command(
 				SONYPI_COMMAND_SETCAMERABRIGHTNESS, c->value);
+			meye.picture.brightness = c->value << 10;
 			break;
 		case V4L2_CID_HUE:
 			sonypi_camera_command(
 				SONYPI_COMMAND_SETCAMERAHUE, c->value);
+			meye.picture.hue = c->value << 10;
 			break;
 		case V4L2_CID_CONTRAST:
 			sonypi_camera_command(
-				SONYPI_COMMAND_SETCAMERACOLOR, c->value);
+				SONYPI_COMMAND_SETCAMERACONTRAST, c->value);
+			meye.picture.contrast = c->value << 10;
 			break;
 		case V4L2_CID_SATURATION:
 			sonypi_camera_command(
 				SONYPI_COMMAND_SETCAMERACOLOR, c->value);
+			meye.picture.colour = c->value << 10;
 			break;
 		case V4L2_CID_AGC:
 			sonypi_camera_command(
 				SONYPI_COMMAND_SETCAMERAAGC, c->value);
+			meye.params.agc = c->value;
 			break;
 		case V4L2_CID_SHARPNESS:
 			sonypi_camera_command(
 				SONYPI_COMMAND_SETCAMERASHARPNESS, c->value);
+			meye.params.sharpness = c->value;
 			break;
 		case V4L2_CID_PICTURE:
 			sonypi_camera_command(
 				SONYPI_COMMAND_SETCAMERAPICTURE, c->value);
+			meye.params.picture = c->value;
 			break;
 		case V4L2_CID_JPEGQUAL:
 			meye.params.quality = c->value;
@@ -1330,32 +1336,25 @@
 		down(&meye.lock);
 		switch (c->id) {
 		case V4L2_CID_BRIGHTNESS:
-			c->value = sonypi_camera_command(
-				SONYPI_COMMAND_GETCAMERABRIGHTNESS, 0);
+			c->value = meye.picture.brightness >> 10;
 			break;
 		case V4L2_CID_HUE:
-			c->value = sonypi_camera_command(
-				SONYPI_COMMAND_GETCAMERAHUE, 0);
+			c->value = meye.picture.hue >> 10;
 			break;
 		case V4L2_CID_CONTRAST:
-			c->value = sonypi_camera_command(
-				SONYPI_COMMAND_GETCAMERACOLOR, 0);
+			c->value = meye.picture.contrast >> 10;
 			break;
 		case V4L2_CID_SATURATION:
-			c->value = sonypi_camera_command(
-				SONYPI_COMMAND_GETCAMERACOLOR, 0);
+			c->value = meye.picture.colour >> 10;
 			break;
 		case V4L2_CID_AGC:
-			c->value = sonypi_camera_command(
-				SONYPI_COMMAND_GETCAMERAAGC, 0);
+			c->value = meye.params.agc;
 			break;
 		case V4L2_CID_SHARPNESS:
-			c->value = sonypi_camera_command(
-				SONYPI_COMMAND_GETCAMERASHARPNESS, 0);
+			c->value = meye.params.sharpness;
 			break;
 		case V4L2_CID_PICTURE:
-			c->value = sonypi_camera_command(
-				SONYPI_COMMAND_GETCAMERAPICTURE, 0);
+			c->value = meye.params.picture;
 			break;
 		case V4L2_CID_JPEGQUAL:
 			c->value = meye.params.quality;

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH 7/12] meye: the driver is no longer experimental and depends on PCI
  2004-11-04 11:16 ` [PATCH 7/12] meye: the driver is no longer experimental and depends on PCI Stelian Pop
@ 2004-11-04 11:41   ` Christoph Hellwig
  2004-11-04 11:49     ` Stelian Pop
  0 siblings, 1 reply; 26+ messages in thread
From: Christoph Hellwig @ 2004-11-04 11:41 UTC (permalink / raw)
  To: Stelian Pop, Linux Kernel Mailing List, Linus Torvalds,
	Andrew Morton

> +	depends on VIDEO_DEV && PCI && SONYPI && !HIGHMEM64G

What's the problem with PAE?

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH 7/12] meye: the driver is no longer experimental and depends on PCI
  2004-11-04 11:41   ` Christoph Hellwig
@ 2004-11-04 11:49     ` Stelian Pop
  2004-11-04 12:23       ` Arjan van de Ven
  0 siblings, 1 reply; 26+ messages in thread
From: Stelian Pop @ 2004-11-04 11:49 UTC (permalink / raw)
  To: Christoph Hellwig, Linux Kernel Mailing List, Linus Torvalds,
	Andrew Morton

On Thu, Nov 04, 2004 at 11:41:26AM +0000, Christoph Hellwig wrote:
> > +	depends on VIDEO_DEV && PCI && SONYPI && !HIGHMEM64G
> 
> What's the problem with PAE?

Read the source:
-----------------
 * NOTE: The meye device expects dma_addr_t size to be 32 bits
 * (the toc must be exactly 1024 entries each of them being 4 bytes
 * in size, the whole result being 4096 bytes). We're using here
 * dma_addr_t for corectness but the compilation of this driver is
 * disabled for HIGHMEM64G=y, where sizeof(dma_addr_t) != 4 !
-----------------

Of course, the actual hardware does exist only on C1V* Vaio Laptops,
which can accept at most 256 MB RAM, so the test is there in Kconfig
only to prevent 'make allyesconfig' and equivalents from spitting
warnings...

Stelian.
-- 
Stelian Pop <stelian@popies.net>    

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH 7/12] meye: the driver is no longer experimental and depends on PCI
  2004-11-04 11:49     ` Stelian Pop
@ 2004-11-04 12:23       ` Arjan van de Ven
  2004-11-04 12:32         ` Stelian Pop
  0 siblings, 1 reply; 26+ messages in thread
From: Arjan van de Ven @ 2004-11-04 12:23 UTC (permalink / raw)
  To: Stelian Pop
  Cc: Christoph Hellwig, Linux Kernel Mailing List, Linus Torvalds,
	Andrew Morton


> Of course, the actual hardware does exist only on C1V* Vaio Laptops,
> which can accept at most 256 MB RAM


... but distros enable PAE anyway for things like NX and for general
reasons (distros need to support > 4Gb ram of course ;)


^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH 0/12] meye driver update
  2004-11-04 11:12 [PATCH 0/12] meye driver update Stelian Pop
                   ` (11 preceding siblings ...)
  2004-11-04 11:18 ` [PATCH 12/12] meye: cache the camera settings in the driver Stelian Pop
@ 2004-11-04 12:25 ` Emmanuel Fleury
  2004-11-04 12:36   ` Stelian Pop
  2004-11-04 21:19 ` meye bug? (was: meye driver update) Roland Mas
  13 siblings, 1 reply; 26+ messages in thread
From: Emmanuel Fleury @ 2004-11-04 12:25 UTC (permalink / raw)
  To: Linux Kernel Mailing List; +Cc: Stelian Pop

Hi,

By the way, is there any news for the development of a driver for the
meye of a PCG-C1MZX ?

lspci:

0000:00:00.0 Host bridge: Transmeta Corporation LongRun Northbridge (rev 03)
0000:00:00.1 RAM memory: Transmeta Corporation SDRAM controller
0000:00:00.2 RAM memory: Transmeta Corporation BIOS scratchpad
0000:00:06.0 Multimedia audio controller: ALi Corporation M5451 PCI
AC-Link Controller Audio Device (rev 02)
0000:00:07.0 ISA bridge: ALi Corporation M1533 PCI to ISA Bridge [Aladdin IV]
0000:00:08.0 Modem: ALi Corporation M5457 AC'97 Modem Controller
0000:00:09.0 FireWire (IEEE 1394): Texas Instruments TSB43AB22/A IEEE-1394a-2000 Controller (PHY/Link)
0000:00:0a.0 Multimedia controller: Fujitsu Limited.: Unknown device 2011
0000:00:0b.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+ (rev 10)
0000:00:0c.0 VGA compatible controller: ATI Technologies Inc Radeon Mobility M6 LY
0000:00:0f.0 USB Controller: ALi Corporation USB 1.1 Controller (rev 03)
0000:00:10.0 IDE interface: ALi Corporation M5229 IDE (rev c4)
0000:00:11.0 Non-VGA unclassified device: ALi Corporation M7101 Power Management Controller [PMU]
0000:00:12.0 CardBus bridge: Ricoh Co Ltd RL5c475 (rev 80)
0000:00:14.0 USB Controller: ALi Corporation USB 1.1 Controller (rev 03)


Chipset of the meye (I guess): 

Ricoh Co Ltd RL5c475 (rev 80)

Regards
-- 
Emmanuel Fleury

Computer Science Department, |  Office: B1-201
Aalborg University,          |  Phone:  +45 96 35 72 23
Fredriks Bajersvej 7E,       |  Fax:    +45 98 15 98 89
9220 Aalborg East, Denmark   |  Email:  fleury@cs.aau.dk


^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH 7/12] meye: the driver is no longer experimental and depends on PCI
  2004-11-04 12:23       ` Arjan van de Ven
@ 2004-11-04 12:32         ` Stelian Pop
  2004-11-04 13:16           ` Arjan van de Ven
  0 siblings, 1 reply; 26+ messages in thread
From: Stelian Pop @ 2004-11-04 12:32 UTC (permalink / raw)
  To: Arjan van de Ven
  Cc: Christoph Hellwig, Linux Kernel Mailing List, Linus Torvalds,
	Andrew Morton

On Thu, Nov 04, 2004 at 01:23:00PM +0100, Arjan van de Ven wrote:

> 
> > Of course, the actual hardware does exist only on C1V* Vaio Laptops,
> > which can accept at most 256 MB RAM
> 
> 
> ... but distros enable PAE anyway for things like NX and for general
> reasons (distros need to support > 4Gb ram of course ;)

On a Fedora Core 2:
	$ grep HIGHMEM /boot/config-2.6.6-1.435 
	# CONFIG_NOHIGHMEM is not set
	CONFIG_HIGHMEM4G=y
	# CONFIG_HIGHMEM64G is not set
	CONFIG_HIGHMEM=y
	# CONFIG_DEBUG_HIGHMEM is not set

I thought that CONFIG_HIGHMEM64G is not cost-free and thus must
be enabled only when needed...

Stelian.
-- 
Stelian Pop <stelian@popies.net>    

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH 0/12] meye driver update
  2004-11-04 12:25 ` [PATCH 0/12] meye driver update Emmanuel Fleury
@ 2004-11-04 12:36   ` Stelian Pop
  0 siblings, 0 replies; 26+ messages in thread
From: Stelian Pop @ 2004-11-04 12:36 UTC (permalink / raw)
  To: Emmanuel Fleury; +Cc: Linux Kernel Mailing List

On Thu, Nov 04, 2004 at 01:25:29PM +0100, Emmanuel Fleury wrote:

> By the way, is there any news for the development of a driver for the
> meye of a PCG-C1MZX ?
> 
> lspci:
[...]
> 0000:00:0a.0 Multimedia controller: Fujitsu Limited.: Unknown device 2011
[...]
> 0000:00:12.0 CardBus bridge: Ricoh Co Ltd RL5c475 (rev 80)
[...]

> Chipset of the meye (I guess): 
> 
> Ricoh Co Ltd RL5c475 (rev 80)

No, that's the cardbus bridge.

The camera is the Fujitsu device (0x10cf/0x2011).

There is a page at http://r-engine.sourceforge.net/ but the project
seems dead. The manufacturer has given to several developers the
docs (under a non redistribution NDA), but nobody wrote some code
yet.

Stelian.
-- 
Stelian Pop <stelian@popies.net>    

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH 7/12] meye: the driver is no longer experimental and depends on PCI
  2004-11-04 12:32         ` Stelian Pop
@ 2004-11-04 13:16           ` Arjan van de Ven
  2004-11-04 14:09             ` Stelian Pop
  0 siblings, 1 reply; 26+ messages in thread
From: Arjan van de Ven @ 2004-11-04 13:16 UTC (permalink / raw)
  To: Stelian Pop
  Cc: Christoph Hellwig, Linux Kernel Mailing List, Linus Torvalds,
	Andrew Morton


> I thought that CONFIG_HIGHMEM64G is not cost-free and thus must
> be enabled only when needed...

having multiple kernels also isn't free... and there's a milion
different config options that cost/gain performance ;)



^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [PATCH 7/12] meye: the driver is no longer experimental and depends on PCI
  2004-11-04 13:16           ` Arjan van de Ven
@ 2004-11-04 14:09             ` Stelian Pop
  0 siblings, 0 replies; 26+ messages in thread
From: Stelian Pop @ 2004-11-04 14:09 UTC (permalink / raw)
  To: Arjan van de Ven
  Cc: Christoph Hellwig, Linux Kernel Mailing List, Linus Torvalds,
	Andrew Morton

On Thu, Nov 04, 2004 at 02:16:02PM +0100, Arjan van de Ven wrote:

> 
> > I thought that CONFIG_HIGHMEM64G is not cost-free and thus must
> > be enabled only when needed...
> 
> having multiple kernels also isn't free... and there's a milion
> different config options that cost/gain performance ;)

What about backward compatibility ? If I understand the PAE help text
correctly, a PAE enabled kernel will not boot on a processor which
doesn't support PAE, like my Crusoe:

processor	: 0
vendor_id	: GenuineTMx86
cpu family	: 6
model		: 4
model name	: Transmeta(tm) Crusoe(tm) Processor TM5600
stepping	: 3
cpu MHz		: 595.597
cache size	: 512 KB
fdiv_bug	: no
hlt_bug		: no
f00f_bug	: no
coma_bug	: no
fpu		: yes
fpu_exception	: yes
cpuid level	: 1
wp		: yes
flags		: fpu vme de pse tsc msr cx8 cmov mmx longrun
bogomips	: 1167.36

Stelian.
-- 
Stelian Pop <stelian@popies.net>    

^ permalink raw reply	[flat|nested] 26+ messages in thread

* meye bug? (was: meye driver update)
  2004-11-04 11:12 [PATCH 0/12] meye driver update Stelian Pop
                   ` (12 preceding siblings ...)
  2004-11-04 12:25 ` [PATCH 0/12] meye driver update Emmanuel Fleury
@ 2004-11-04 21:19 ` Roland Mas
  2004-11-04 21:42   ` Roland Mas
  2004-11-04 21:58   ` Stelian Pop
  13 siblings, 2 replies; 26+ messages in thread
From: Roland Mas @ 2004-11-04 21:19 UTC (permalink / raw)
  To: Stelian Pop; +Cc: Linux Kernel Mailing List

Stelian Pop, 2004-11-04 12:12:31 +0100 :

> Hi,
>
> Please find attached a collection of patches updating the meye driver
> to the latest version.

  I'd like to take the opportunity to report a bug with meye.  I've
ran various 2.6.* kernels on this recently acquired laptop, including
2.6.10-rc1 with your patches, all that with a Debian system on it
(Sarge/testing).  I figured the simplest way to test the meye driver,
and to grab a shot from it, would be to use "motioneye -j foo.jpeg".
Everytime I run that, though, the motioneye process gets stuck into an
apparently endless loop.  top shows it alternatively at states R and
D, I can't kill it (even -9), and the kernel repeatedly complains
"meye: need to reset HIC!".  Repeatedly, as in about twice a second
until reboot.  Oh, and no picture ever comes out, either :-)

  Bits of info you may want:

- lspci says:
0000:00:0b.0 Multimedia controller: Kawasaki Steel Corporation KL5A72002 Motion JPEG (rev 01)

- Sony Vaio model PCG 141C,  a member of the C1VE series;

- motioneye 1.2-3 from Sarge;

- dmesg says:
[...]
PCI: Enabling device 0000:00:09.0 (0006 -> 0007)
ACPI: PCI interrupt 0000:00:09.0[A] -> GSI 9 (level, low) -> IRQ 9
sonypi: Sony Programmable I/O Controller Driver v1.23.
sonypi: detected type1 model, verbose = 0, fnkeyinit = off, camera = off, compat = off, mask = 0xffffffff, useinput = on, acpi = on
sonypi: enabled at irq=11, port1=0x10c0, port2=0x10c4
sonypi: device allocated minor is 63
Sony VAIO Jog Dial installed.
Linux video capture interface: v1.00
meye: using 2 buffers with 600k (1200k total) for capture
PCI: Enabling device 0000:00:0b.0 (0010 -> 0012)
ACPI: PCI interrupt 0000:00:0b.0[A] -> GSI 9 (level, low) -> IRQ 9
meye: Motion Eye Camera Driver v1.10.
meye: mchip KL5A72002 rev. 1, base fc104800, irq 9
Linux Kernel Card Services
[...]

  Is there anything else I can provide?

  Thanks,

Roland.
-- 
Roland Mas

How does an octopus go into battle?
Fully-armed.

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: meye bug? (was: meye driver update)
  2004-11-04 21:19 ` meye bug? (was: meye driver update) Roland Mas
@ 2004-11-04 21:42   ` Roland Mas
  2004-11-04 21:58   ` Stelian Pop
  1 sibling, 0 replies; 26+ messages in thread
From: Roland Mas @ 2004-11-04 21:42 UTC (permalink / raw)
  To: Stelian Pop; +Cc: Linux Kernel Mailing List

Roland Mas, 2004-11-04 22:19:59 +0100 :

>   I'd like to take the opportunity to report a bug with meye.  I've
> ran various 2.6.* kernels on this recently acquired laptop,
> including 2.6.10-rc1 with your patches, all that with a Debian
> system on it (Sarge/testing).

Reading myself again, I realise this may not be very clear, sorry.
The bug happens with all versions of 2.6.* I've tried, including
2.6.10-rc1 + your patches.

I did some more testing with other userspace apps.

- With vgrabbj 0.9.3-1:
$ vgrabbj -d /dev/video0 foo.jpeg
Problem getting window information
Fatal Error (non-daemon), exiting...
There was no map allocated to be freed...
$
(And no complaint from kernel).

- With motion 3.1.14-2:
$ motion
Processing thread 0 - config file motion.conf
Thread0 device: /dev/video0 input: 8
[Nothing happens for a while, then I get bored and ^C]
$
(And exactly one "meye: need to reset HIC!" message).

Roland.
-- 
Roland Mas

Despite rumour, Death isn't cruel - merely terribly, terribly good at his job.
  -- in Sourcery (Terry Pratchett)

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: meye bug? (was: meye driver update)
  2004-11-04 21:19 ` meye bug? (was: meye driver update) Roland Mas
  2004-11-04 21:42   ` Roland Mas
@ 2004-11-04 21:58   ` Stelian Pop
  2004-11-05 11:18     ` meye bug? No Roland Mas
  1 sibling, 1 reply; 26+ messages in thread
From: Stelian Pop @ 2004-11-04 21:58 UTC (permalink / raw)
  To: Roland Mas; +Cc: Linux Kernel Mailing List

On Thu, Nov 04, 2004 at 10:19:59PM +0100, Roland Mas wrote:

>   I'd like to take the opportunity to report a bug with meye.  I've
> ran various 2.6.* kernels on this recently acquired laptop, including
> 2.6.10-rc1 with your patches, all that with a Debian system on it
> (Sarge/testing).  I figured the simplest way to test the meye driver,
> and to grab a shot from it, would be to use "motioneye -j foo.jpeg".
> Everytime I run that, though, the motioneye process gets stuck into an
> apparently endless loop.  top shows it alternatively at states R and
> D, I can't kill it (even -9), and the kernel repeatedly complains
> "meye: need to reset HIC!".  Repeatedly, as in about twice a second
> until reboot.  Oh, and no picture ever comes out, either :-)
[...]
> sonypi: detected type1 model, verbose = 0, fnkeyinit = off, camera = off, compat = off, mask = 0xffffffff, useinput = on, acpi = on
                                                              ^^^^^^^^^^^^

:)

Stelian.
-- 
Stelian Pop <stelian@popies.net>

^ permalink raw reply	[flat|nested] 26+ messages in thread

* meye bug?  No.
  2004-11-04 21:58   ` Stelian Pop
@ 2004-11-05 11:18     ` Roland Mas
  2004-11-05 22:25       ` Stelian Pop
  0 siblings, 1 reply; 26+ messages in thread
From: Roland Mas @ 2004-11-05 11:18 UTC (permalink / raw)
  To: Stelian Pop; +Cc: Linux Kernel Mailing List

Stelian Pop (2004-11-04 22:58:05 +0100) :

> On Thu, Nov 04, 2004 at 10:19:59PM +0100, Roland Mas wrote:

[...]

>> "meye: need to reset HIC!".  Repeatedly, as in about twice a second
>> until reboot.  Oh, and no picture ever comes out, either :-)
> [...]
>> sonypi: detected type1 model, verbose = 0, fnkeyinit = off, camera = off, compat = off, mask = 0xffffffff, useinput = on, acpi = on
>                                                               ^^^^^^^^^^^^
>
> :)

Okay, so I made a fool of myself, hope you had fun, sorry for the
inconvenience otherwise :-)

  Seriously though, and as much as I know I should have read the docs,
is this detectable from meye?  If it is, I suggest it would be a nice
thing to have a different or more explicit error message.  Just "meye:
need to reset HIC, is sonypi correctly configured?" would be cool.

Roland.
-- 
Roland Mas

Such compressed poems / With seventeen syllables / Can't have much meaning...
  -- in Gödel, Escher, Bach: an Eternal Golden Braid (Douglas Hofstadter)

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: meye bug?  No.
  2004-11-05 11:18     ` meye bug? No Roland Mas
@ 2004-11-05 22:25       ` Stelian Pop
  0 siblings, 0 replies; 26+ messages in thread
From: Stelian Pop @ 2004-11-05 22:25 UTC (permalink / raw)
  To: Roland Mas; +Cc: Linux Kernel Mailing List

On Fri, Nov 05, 2004 at 12:18:01PM +0100, Roland Mas wrote:

> > :)
> 
> Okay, so I made a fool of myself, hope you had fun, sorry for the
> inconvenience otherwise :-)

No problem :)
> 
>   Seriously though, and as much as I know I should have read the docs,
> is this detectable from meye?  If it is, I suggest it would be a nice
> thing to have a different or more explicit error message.  Just "meye:
> need to reset HIC, is sonypi correctly configured?" would be cool.

As a matter of fact it is quite detectable yes. I'll put in a check
which will even fail to load the meye module (with an explicit
error message) if sonypi isn't loaded with camera=1.

The only disadvantage of that is that it won't catch anymore the
users who don't RTFM :)

Stelian.
-- 
Stelian Pop <stelian@popies.net>

^ permalink raw reply	[flat|nested] 26+ messages in thread

end of thread, other threads:[~2004-11-05 22:26 UTC | newest]

Thread overview: 26+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-11-04 11:12 [PATCH 0/12] meye driver update Stelian Pop
2004-11-04 11:13 ` [PATCH 1/12] meye: module related fixes Stelian Pop
2004-11-04 11:13 ` [PATCH 2/12] meye: replace homebrew queue with kfifo Stelian Pop
2004-11-04 11:14 ` [PATCH 3/12] meye: picture depth is in bits not in bytes Stelian Pop
2004-11-04 11:14 ` [PATCH 4/12] meye: do lock properly when waiting for buffers Stelian Pop
2004-11-04 11:15 ` [PATCH 5/12] meye: implement non blocking access using poll() Stelian Pop
2004-11-04 11:15 ` [PATCH 6/12] meye: cleanup init/exit paths Stelian Pop
2004-11-04 11:16 ` [PATCH 7/12] meye: the driver is no longer experimental and depends on PCI Stelian Pop
2004-11-04 11:41   ` Christoph Hellwig
2004-11-04 11:49     ` Stelian Pop
2004-11-04 12:23       ` Arjan van de Ven
2004-11-04 12:32         ` Stelian Pop
2004-11-04 13:16           ` Arjan van de Ven
2004-11-04 14:09             ` Stelian Pop
2004-11-04 11:16 ` [PATCH 8/12] meye: module parameters documentation fixes Stelian Pop
2004-11-04 11:17 ` [PATCH 9/12] meye: add v4l2 support Stelian Pop
2004-11-04 11:17 ` [PATCH 10/12] meye: whitespace and coding style cleanups Stelian Pop
2004-11-04 11:18 ` [PATCH 11/12] meye: bump up the version number Stelian Pop
2004-11-04 11:18 ` [PATCH 12/12] meye: cache the camera settings in the driver Stelian Pop
2004-11-04 12:25 ` [PATCH 0/12] meye driver update Emmanuel Fleury
2004-11-04 12:36   ` Stelian Pop
2004-11-04 21:19 ` meye bug? (was: meye driver update) Roland Mas
2004-11-04 21:42   ` Roland Mas
2004-11-04 21:58   ` Stelian Pop
2004-11-05 11:18     ` meye bug? No Roland Mas
2004-11-05 22:25       ` Stelian Pop

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox