Hi,

here is the v4l-test 0.7 for LTP.

Changes:  Test cases added for VIDIOC_G_AUDIO, VIDIOC_G_AUDOUT, VIDIOC_S_AUDIO
and VIDIOC_G_CROP. Added video_dummy kernel driver to verify the test 
environment.
Some cleanup.

Signed-off-by: Márton Németh <[email protected]>

Regards,

        Márton Németh

---
v4l-test project home page: http://v4l-test.sourceforge.net/
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/kernel_space/Makefile ltp/testcases/kernel/device-drivers/v4l/kernel_space/Makefile
--- ltp.orig/testcases/kernel/device-drivers/v4l/kernel_space/Makefile	1970-01-01 01:00:00.000000000 +0100
+++ ltp/testcases/kernel/device-drivers/v4l/kernel_space/Makefile	2009-02-08 11:57:08.000000000 +0100
@@ -0,0 +1,24 @@
+
+EXTRA_CFLAGS += -Wall -Wextra -Wno-unused-parameter
+
+ifneq ($(KERNELRELEASE),)
+
+obj-m	:= video_dummy.o
+else
+KDIR	:= /lib/modules/$(shell uname -r)/build
+PWD	:= $(shell pwd)
+
+modules:
+	$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
+
+clean:
+	$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) clean
+	rm -f modules.order
+
+help:
+	$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) help
+
+modules_install:
+	$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules_install
+
+endif
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/kernel_space/video_dummy.c ltp/testcases/kernel/device-drivers/v4l/kernel_space/video_dummy.c
--- ltp.orig/testcases/kernel/device-drivers/v4l/kernel_space/video_dummy.c	1970-01-01 01:00:00.000000000 +0100
+++ ltp/testcases/kernel/device-drivers/v4l/kernel_space/video_dummy.c	2009-02-09 07:49:09.000000000 +0100
@@ -0,0 +1,106 @@
+
+#include <linux/module.h>
+#include <linux/version.h>
+#include <linux/fs.h>
+#include <linux/videodev2.h>
+#include <media/v4l2-ioctl.h>
+#include <media/v4l2-dev.h>
+
+
+struct dummy_dev {
+	struct video_device        *vfd;
+};
+
+
+static int dummy_open(struct inode *inode, struct file *file)
+{
+	int minor = iminor(inode);
+
+	printk(KERN_DEBUG "video_dummy: open called (minor=%d)\n", minor);
+
+	return 0;
+}
+
+static int dummy_close(struct inode *inode, struct file *file)
+{
+	int minor = iminor(inode);
+
+	printk(KERN_DEBUG "video_dummy: close called (minor=%d)\n", minor);
+
+	return 0;
+}
+
+static int vidioc_querycap(struct file *file, void  *priv,
+					struct v4l2_capability *cap)
+{
+	strcpy(cap->driver, "dummy");
+	strcpy(cap->card, "dummy");
+	cap->version = KERNEL_VERSION(0, 0, 1);
+	cap->capabilities = 0;
+	return 0;
+}
+
+static struct file_operations dummy_fops = {
+	.owner		= THIS_MODULE,
+	.open           = dummy_open,
+	.release        = dummy_close,
+	.ioctl          = video_ioctl2, /* V4L2 ioctl handler */
+	.compat_ioctl   = v4l_compat_ioctl32,
+};
+
+
+static const struct v4l2_ioctl_ops dummy_ioctl_ops = {
+	.vidioc_querycap      = vidioc_querycap,
+};
+
+static const struct video_device dummy_template = {
+	.name		= "dummy",
+	.fops           = &dummy_fops,
+	.ioctl_ops 	= &dummy_ioctl_ops,
+	.minor		= -1,
+	.release	= video_device_release,
+
+	.tvnorms              = V4L2_STD_525_60,
+	.current_norm         = V4L2_STD_NTSC_M,
+};
+
+static struct video_device *dummy_vfd = NULL;
+
+static int __init video_dummy_init(void)
+{
+	int ret;
+
+	dummy_vfd = video_device_alloc();
+	if (!dummy_vfd)
+		return -ENOMEM;
+
+	*dummy_vfd = dummy_template;
+
+	ret = video_register_device(dummy_vfd, VFL_TYPE_GRABBER, -1);
+	if (ret < 0) {
+		video_device_release(dummy_vfd);
+		dummy_vfd = NULL;
+		return ret;
+	}
+
+	printk(KERN_INFO "video_dummy: V4L2 device registered as /dev/video%d\n",
+		dummy_vfd->num);
+
+	return 0;
+}
+
+static void __exit video_dummy_exit(void)
+{
+
+	printk(KERN_INFO "video_dummy: removing /dev/video%d\n", dummy_vfd->num);
+	video_unregister_device(dummy_vfd);
+	dummy_vfd = NULL;
+
+}
+
+module_init(video_dummy_init);
+module_exit(video_dummy_exit);
+
+MODULE_DESCRIPTION("Dummy video module");
+MODULE_AUTHOR("Márton Németh <[email protected]>");
+MODULE_LICENSE("GPL");
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/doc/index.html ltp/testcases/kernel/device-drivers/v4l/user_space/doc/index.html
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/doc/index.html	2009-02-13 08:39:59.000000000 +0100
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/doc/index.html	2009-02-09 07:41:51.000000000 +0100
@@ -189,7 +189,7 @@ implemented test cases.</p>
     </tr>
     <tr>
       <td>ioctl <a href="spec/r9539.htm">VIDIOC_S_AUDIO</a></td>
-      <td>no</td>
+      <td>yes, only when STREAM_OFF</td>
       <td>Opt.</td>
     </tr>
     <tr>
@@ -199,7 +199,7 @@ implemented test cases.</p>
     </tr>
     <tr>
       <td>ioctl <a href="spec/r9688.htm">VIDIOC_S_AUDOUT</a></td>
-      <td>no</td>
+      <td>yes, only when STREAM_OFF</td>
       <td>Opt.</td>
     </tr>
     <tr>
@@ -219,7 +219,7 @@ implemented test cases.</p>
     </tr>
     <tr>
       <td>ioctl <a href="spec/r10104.htm">VIDIOC_G_CTRL</a></td>
-      <td>yes, only private and user controls; only user controls with V4L2_CTRL_FLAG_NEXT_CTRL</td>
+      <td>no</td>
       <td><br></td>
     </tr>
     <tr>
@@ -364,7 +364,7 @@ implemented test cases.</p>
     </tr>
     <tr>
       <td>ioctl <a href="spec/r12342.htm">VIDIOC_S_TUNER</a></td>
-      <td>no</td>
+      <td>yes, only when STREAM_OFF</td>
       <td><br></td>
     </tr>
     <tr>
@@ -492,12 +492,24 @@ So far I could find the following:
 <p>
 Please let me know if this list misses other V4L or V4L2 test project.
 </p>
+<p>
+The following documents and articles are useful if you are dealing with V4L2:
+</p>
+<ul>
+  <li>
+  <a href="http://v4l2spec.bytesex.org/spec/";>Video for Linux Two API Specification</a>
+  </li>
+  <li>
+  <a href="http://lwn.net/Articles/203924/";>The Video4Linux2 API series</a> at
+  <a href="http://lwn.net/";>lwn.net</a>
+  </li>
+</ul>
 
 <h2><a name="feedback">Feedbacks</a></h2>
 <p>Any feedbacks, comments, ideas, etc. are welcome at the author's email address.</p>
 <hr style="width: 100%; height: 2px;">
 <p>Last changed:
-Tue Feb  3 22:20:46 2009
+Mon Feb  9 07:41:37 2009
 </p>
 <p>
   <a href="http://validator.w3.org/check?uri=referer";><img
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/Makefile ltp/testcases/kernel/device-drivers/v4l/user_space/Makefile
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/Makefile	2009-02-13 08:39:58.000000000 +0100
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/Makefile	2009-02-07 21:22:49.000000000 +0100
@@ -1,6 +1,7 @@
 #
 # v4l-test: Test environment for Video For Linux Two API
 #
+#  7 Feb 2009  0.8  test_VIDIOC_CROP.c added
 #  3 Feb 2009  0.7  test_VIDIOC_AUDIO.c added,
 #                   test_VIDIOC_AUDOUT.c added,
 #  2 Feb 2009  0.6  test_VIDIOC_MODULATOR.c added,
@@ -36,6 +37,7 @@ OBJS = dev_video.o \
        test_VIDIOC_ENUMSTD.o \
        test_VIDIOC_LOG_STATUS.o \
        test_VIDIOC_CROPCAP.o \
+       test_VIDIOC_CROP.o \
        test_VIDIOC_QUERYCTRL.o \
        test_VIDIOC_QUERYSTD.o \
        test_VIDIOC_STD.o \
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/README ltp/testcases/kernel/device-drivers/v4l/user_space/README
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/README	2009-02-13 08:39:58.000000000 +0100
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/README	2009-02-09 08:32:19.000000000 +0100
@@ -4,6 +4,11 @@
 Release History
 ---------------
 
+ 9 Feb 2009  0.10 Test cases added for VIDIOC_G_AUDIO, VIDIOC_G_AUDOUT,
+                  VIDIOC_S_AUDIO and VIDIOC_G_CROP;
+                  Added video_dummy kernel driver to verify the test
+                  environment;
+                  Some cleanup
  4 Feb 2009  0.6  Test cases added for VIDIOC_G_AUDIO, VIDIOC_G_AUDOUT,
                   VIDIOC_G_MODULATOR, VIDIOC_G_PRIORITY, VIDIOC_S_PRIORITY
                   and VIDIOC_S_FREQUENCY
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_AUDIO.c ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_AUDIO.c
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_AUDIO.c	2009-02-03 21:55:45.000000000 +0100
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_AUDIO.c	2009-02-09 08:24:45.000000000 +0100
@@ -1,6 +1,8 @@
 /*
  * v4l-test: Test environment for Video For Linux Two API
  *
+ *  9 Feb 2009  0.3  Typo corrected; added some debug messages
+ *  7 Feb 2009  0.2  Test case test_VIDIOC_G_AUDIO_ignore_index added
  *  3 Feb 2009  0.1  First release
  *
  * Written by Márton Németh <[email protected]>
@@ -61,7 +63,7 @@ void test_VIDIOC_G_AUDIO() {
 	memset(&audio, 0xff, sizeof(audio));
 	ret = ioctl(get_video_fd(), VIDIOC_G_AUDIO, &audio);
 
-	dprintf("VIDIOC_AUDIO, ret=%i\n", ret);
+	dprintf("VIDIOC_G_AUDIO, ret=%i\n", ret);
 
 	if (ret == 0) {
 		CU_ASSERT_EQUAL(ret, 0);
@@ -103,6 +105,43 @@ void test_VIDIOC_G_AUDIO() {
 
 }
 
+void test_VIDIOC_G_AUDIO_ignore_index() {
+	int ret1;
+	int errno1;
+	int ret2;
+	int errno2;
+	struct v4l2_audio audio;
+	struct v4l2_audio audio2;
+
+	/* check whether the "index" field is ignored by VIDIOC_G_AUDIO */
+
+	memset(&audio, 0, sizeof(audio));
+	dprintf("&audio=%p\n", &audio);
+	dprintf("audio.index=%u\n", audio.index);
+	ret1 = ioctl(get_video_fd(), VIDIOC_G_AUDIO, &audio);
+	errno1 = errno;
+
+	dprintf("VIDIOC_G_AUDIO, ret1=%i, errno1=%i\n", ret1, errno1);
+
+	memset(&audio2, 0, sizeof(audio2));
+	audio2.index = U32_MAX;
+	ret2 = ioctl(get_video_fd(), VIDIOC_G_AUDIO, &audio2);
+	errno2 = errno;
+
+	dprintf("VIDIOC_G_AUDIO, ret2=%i, errno2=%i\n", ret2, errno2);
+
+	if (ret1 == 0) {
+		CU_ASSERT_EQUAL(ret2, 0);
+		CU_ASSERT_EQUAL(memcmp(&audio, &audio2, sizeof(audio)), 0);
+	} else {
+		CU_ASSERT_EQUAL(ret1, -1);
+		CU_ASSERT_EQUAL(errno1, EINVAL);
+		CU_ASSERT_EQUAL(ret2, -1);
+		CU_ASSERT_EQUAL(errno2, EINVAL);
+	}
+
+}
+
 void test_VIDIOC_G_AUDIO_NULL() {
 	int ret1;
 	int errno1;
@@ -136,3 +175,302 @@ void test_VIDIOC_G_AUDIO_NULL() {
 	}
 
 }
+
+void test_VIDIOC_S_AUDIO() {
+	int ret_orig, errno_orig;
+	int ret;
+	__u32 index;
+	__u32 i;
+	struct v4l2_audio audio_orig;
+	struct v4l2_audio audio_enum;
+	struct v4l2_audio audio_set;
+
+	/* This testcase tries to find out the relations between the following
+	 * commands:
+	 *  - VIDIOC_ENUMAUDIO
+	 *  - VIDIOC_G_AUDIO
+	 *  - VIDIOC_S_AUDIO
+	 */
+
+	/* remember the original settings */
+	memset(&audio_orig, 0, sizeof(audio_orig));
+	ret_orig = ioctl(get_video_fd(), VIDIOC_G_AUDIO, &audio_orig);
+	errno_orig = errno;
+
+	dprintf("VIDIOC_G_AUDIO, ret_orig=%i, errno_orig=%i\n", ret_orig, errno_orig);
+
+	if (ret_orig == 0) {
+		CU_ASSERT_EQUAL(ret_orig, 0);
+	} else {
+		CU_ASSERT_EQUAL(ret_orig, -1);
+		CU_ASSERT_EQUAL(errno_orig, EINVAL);
+	}
+
+	/* try to continue even if VIDIOC_G_AUDIO seems to be not supported */
+
+	index = 0;
+	do {
+		memset(&audio_enum, 0, sizeof(audio_enum));
+		audio_enum.index = index;
+		ret = ioctl(get_video_fd(), VIDIOC_ENUMAUDIO, &audio_enum);
+
+		if (ret == 0) {
+			memset(&audio_set, 0xff, sizeof(audio_set));
+			audio_set.index = index;
+			ret = ioctl(get_video_fd(), VIDIOC_S_AUDIO, &audio_set);
+
+			/* It shall be always possible to set the audio input to the
+			 * enumerated values.
+			 */
+			CU_ASSERT_EQUAL(ret, 0);
+
+			index++;
+		}
+
+	} while (ret == 0);
+	CU_ASSERT_EQUAL(ret, -1);
+	CU_ASSERT_EQUAL(errno, EINVAL);
+
+	/* try to set audio input to beyond the enumerated values */
+	for (i=0; i<=32; i++) {
+		memset(&audio_set, 0xff, sizeof(audio_set));
+		audio_set.index = index;
+		ret = ioctl(get_video_fd(), VIDIOC_S_AUDIO, &audio_set);
+
+		CU_ASSERT_EQUAL(ret, -1);
+		CU_ASSERT_EQUAL(errno, EINVAL);
+
+		index++;
+	}
+
+	/* restore the original audio input settings */
+	memset(&audio_set, 0, sizeof(audio_set));
+	audio_set.index = audio_orig.index;
+	ret = ioctl(get_video_fd(), VIDIOC_S_AUDIO, &audio_set);
+
+	if (ret_orig == 0) {
+		/* If it was possible at the beginning to get the audio input then
+		 * it shall be possible to set it again.
+		 */
+		CU_ASSERT_EQUAL(ret, 0);
+	} else {
+		/* In case we could not fetch the audio input value at the start
+		 * of this test case: the VIDIOC_S_AUDIO shall also fail.
+		 */
+		CU_ASSERT_EQUAL(ret, -1);
+		CU_ASSERT_EQUAL(errno, EINVAL);
+	}
+
+}
+
+void test_VIDIOC_S_AUDIO_S32_MAX() {
+	int ret;
+	int ret_orig, errno_orig;
+	int ret_set, errno_set;
+	struct v4l2_audio audio;
+	struct v4l2_audio audio2;
+	struct v4l2_audio audio_orig;
+	struct v4l2_audio audio_set;
+
+	/* remember the original settings */
+	memset(&audio_orig, 0, sizeof(audio_orig));
+	ret_orig = ioctl(get_video_fd(), VIDIOC_G_AUDIO, &audio_orig);
+	errno_orig = errno;
+
+	dprintf("VIDIOC_G_AUDIO, ret_orig=%i, errno_orig=%i\n", ret_orig, errno_orig);
+
+	/* test invalid index */
+	memset(&audio, 0xff, sizeof(audio));
+	audio.index = (__u32)S32_MAX;
+	ret = ioctl(get_video_fd(), VIDIOC_S_AUDIO, &audio);
+
+	CU_ASSERT_EQUAL(ret, -1);
+	CU_ASSERT_EQUAL(errno, EINVAL);
+
+	/* Check whether the original audio struct is untouched */
+	memset(&audio2, 0xff, sizeof(audio2));
+	audio2.index = (__u32)S32_MAX;
+	CU_ASSERT_EQUAL(memcmp(&audio, &audio2, sizeof(audio)), 0);
+
+	/* restore the original audio input settings */
+	memset(&audio_set, 0, sizeof(audio_set));
+	audio_set.index = audio_orig.index;
+	ret_set = ioctl(get_video_fd(), VIDIOC_S_AUDIO, &audio_set);
+	errno_set = errno;
+
+	dprintf("VIDIOC_S_AUDIO, ret_set=%i, errno_set=%i\n", ret_set, errno_set);
+
+	if (ret_orig == 0) {
+		/* If it was possible at the beginning to get the audio input then
+		 * it shall be possible to set it again.
+		 */
+		CU_ASSERT_EQUAL(ret_set, 0);
+	} else {
+		/* In case we could not fetch the audio input value at the start
+		 * of this test case: the VIDIOC_S_AUDIO shall also fail.
+		 */
+		CU_ASSERT_EQUAL(ret_set, -1);
+		CU_ASSERT_EQUAL(errno_set, EINVAL);
+	}
+}
+
+void test_VIDIOC_S_AUDIO_S32_MAX_1() {
+	int ret;
+	int ret_orig, errno_orig;
+	int ret_set, errno_set;
+	struct v4l2_audio audio;
+	struct v4l2_audio audio2;
+	struct v4l2_audio audio_orig;
+	struct v4l2_audio audio_set;
+
+	/* remember the original settings */
+	memset(&audio_orig, 0, sizeof(audio_orig));
+	ret_orig = ioctl(get_video_fd(), VIDIOC_G_AUDIO, &audio_orig);
+	errno_orig = errno;
+
+	dprintf("VIDIOC_G_AUDIO, ret_orig=%i, errno_orig=%i\n", ret_orig, errno_orig);
+
+	/* test invalid index */
+	memset(&audio, 0xff, sizeof(audio));
+	audio.index = ((__u32)S32_MAX)+1;
+	ret = ioctl(get_video_fd(), VIDIOC_S_AUDIO, &audio);
+
+	CU_ASSERT_EQUAL(ret, -1);
+	CU_ASSERT_EQUAL(errno, EINVAL);
+
+	/* Check whether the original audio struct is untouched */
+	memset(&audio2, 0xff, sizeof(audio2));
+	audio2.index = ((__u32)S32_MAX)+1;
+	CU_ASSERT_EQUAL(memcmp(&audio, &audio2, sizeof(audio)), 0);
+
+	/* restore the original audio input settings */
+	memset(&audio_set, 0, sizeof(audio_set));
+	audio_set.index = audio_orig.index;
+	ret_set = ioctl(get_video_fd(), VIDIOC_S_AUDIO, &audio_set);
+	errno_set = errno;
+
+	dprintf("VIDIOC_S_AUDIO, ret_set=%i, errno_set=%i\n", ret_set, errno_set);
+
+	if (ret_orig == 0) {
+		/* If it was possible at the beginning to get the audio input then
+		 * it shall be possible to set it again.
+		 */
+		CU_ASSERT_EQUAL(ret_set, 0);
+	} else {
+		/* In case we could not fetch the audio input value at the start
+		 * of this test case: the VIDIOC_S_AUDIO shall also fail.
+		 */
+		CU_ASSERT_EQUAL(ret_set, -1);
+		CU_ASSERT_EQUAL(errno_set, EINVAL);
+	}
+}
+
+
+void test_VIDIOC_S_AUDIO_U32_MAX() {
+	int ret;
+	int ret_orig, errno_orig;
+	int ret_set, errno_set;
+	struct v4l2_audio audio;
+	struct v4l2_audio audio2;
+	struct v4l2_audio audio_orig;
+	struct v4l2_audio audio_set;
+
+	/* remember the original settings */
+	memset(&audio_orig, 0, sizeof(audio_orig));
+	ret_orig = ioctl(get_video_fd(), VIDIOC_G_AUDIO, &audio_orig);
+	errno_orig = errno;
+
+	dprintf("VIDIOC_G_AUDIO, ret_orig=%i, errno_orig=%i\n", ret_orig, errno_orig);
+	/* test invalid index */
+	memset(&audio, 0xff, sizeof(audio));
+	audio.index = U32_MAX;
+	ret = ioctl(get_video_fd(), VIDIOC_S_AUDIO, &audio);
+
+	CU_ASSERT_EQUAL(ret, -1);
+	CU_ASSERT_EQUAL(errno, EINVAL);
+
+	/* Check whether the original audio struct is untouched */
+	memset(&audio2, 0xff, sizeof(audio2));
+	audio2.index = U32_MAX;
+	CU_ASSERT_EQUAL(memcmp(&audio, &audio2, sizeof(audio)), 0);
+
+	/* restore the original audio input settings */
+	memset(&audio_set, 0, sizeof(audio_set));
+	audio_set.index = audio_orig.index;
+	ret_set = ioctl(get_video_fd(), VIDIOC_S_AUDIO, &audio_set);
+	errno_set = errno;
+
+	dprintf("VIDIOC_S_AUDIO, ret_set=%i, errno_set=%i\n", ret_set, errno_set);
+
+	if (ret_orig == 0) {
+		/* If it was possible at the beginning to get the audio input then
+		 * it shall be possible to set it again.
+		 */
+		CU_ASSERT_EQUAL(ret_set, 0);
+	} else {
+		/* In case we could not fetch the audio input value at the start
+		 * of this test case: the VIDIOC_S_AUDIO shall also fail.
+		 */
+		CU_ASSERT_EQUAL(ret_set, -1);
+		CU_ASSERT_EQUAL(errno_set, EINVAL);
+	}
+}
+
+void test_VIDIOC_S_AUDIO_NULL() {
+	int ret_orig, errno_orig;
+	int ret_set, errno_set;
+	int ret1, errno1;
+	int ret2, errno2;
+	struct v4l2_audio audio_orig;
+	struct v4l2_audio audio_set;
+
+	/* remember the original settings */
+	memset(&audio_orig, 0, sizeof(audio_orig));
+	ret_orig = ioctl(get_video_fd(), VIDIOC_G_AUDIO, &audio_orig);
+	errno_orig = errno;
+
+	dprintf("\tVIDIOC_G_AUDIO, ret_orig=%i, errno_orig=%i\n", ret_orig, errno_orig);
+
+	memset(&audio_set, 0, sizeof(audio_set));
+	ret1 = ioctl(get_video_fd(), VIDIOC_S_AUDIO, &audio_set);
+	errno1 = errno;
+
+	dprintf("\tVIDIOC_S_AUDIO, ret1=%i, errno1=%i\n", ret1, errno1);
+
+	ret2 = ioctl(get_video_fd(), VIDIOC_S_AUDIO, NULL);
+	errno2 = errno;
+
+	dprintf("\tVIDIOC_S_AUDIO, ret2=%i, errno2=%i\n", ret2, errno2);
+
+	if (ret1 == 0) {
+		CU_ASSERT_EQUAL(ret1, 0);
+		CU_ASSERT_EQUAL(ret2, -1);
+		CU_ASSERT_EQUAL(errno2, EFAULT);
+	} else {
+		CU_ASSERT_EQUAL(ret1, -1);
+		CU_ASSERT_EQUAL(errno1, EINVAL);
+		CU_ASSERT_EQUAL(ret2, -1);
+		CU_ASSERT_EQUAL(errno2, EINVAL);
+	}
+
+	/* restore the original audio input settings */
+	memset(&audio_set, 0, sizeof(audio_set));
+	audio_set.index = audio_orig.index;
+	ret_set = ioctl(get_video_fd(), VIDIOC_S_AUDIO, &audio_set);
+	errno_set = errno;
+
+	dprintf("VIDIOC_S_AUDIO, ret_set=%i, errno_set=%i\n", ret_set, errno_set);
+
+	if (ret_orig == 0) {
+		/* If it was possible at the beginning to get the audio input then
+		 * it shall be possible to set it again.
+		 */
+		CU_ASSERT_EQUAL(ret_set, 0);
+	} else {
+		/* In case we could not fetch the audio input value at the start
+		 * of this test case: the VIDIOC_S_AUDIO shall also fail.
+		 */
+		CU_ASSERT_EQUAL(ret_set, -1);
+		CU_ASSERT_EQUAL(errno_set, EINVAL);
+	}
+}
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_AUDIO.h ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_AUDIO.h
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_AUDIO.h	2009-02-03 21:30:34.000000000 +0100
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_AUDIO.h	2009-02-07 14:50:47.000000000 +0100
@@ -1,6 +1,7 @@
 /*
  * v4l-test: Test environment for Video For Linux Two API
  *
+ *  7 Feb 2009  0.2  Test case test_VIDIOC_G_AUDIO_ignore_index added
  *  3 Feb 2009  0.1  First release
  *
  * Written by Márton Németh <[email protected]>
@@ -8,4 +9,11 @@
  */
 
 void test_VIDIOC_G_AUDIO(void);
+void test_VIDIOC_G_AUDIO_ignore_index(void);
 void test_VIDIOC_G_AUDIO_NULL(void);
+
+void test_VIDIOC_S_AUDIO(void);
+void test_VIDIOC_S_AUDIO_S32_MAX(void);
+void test_VIDIOC_S_AUDIO_S32_MAX_1(void);
+void test_VIDIOC_S_AUDIO_U32_MAX(void);
+void test_VIDIOC_S_AUDIO_NULL(void);
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_AUDOUT.c ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_AUDOUT.c
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_AUDOUT.c	2009-02-03 22:07:52.000000000 +0100
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_AUDOUT.c	2009-02-09 08:27:29.000000000 +0100
@@ -1,6 +1,8 @@
 /*
  * v4l-test: Test environment for Video For Linux Two API
  *
+ *  9 Feb 2009  0.3  Typo corrected; added some debug messages
+ *  7 Feb 2009  0.2  Test case test_VIDIOC_G_AUDOUT_ignore_index added
  *  3 Feb 2009  0.1  First release
  *
  * Written by Márton Németh <[email protected]>
@@ -90,6 +92,42 @@ void test_VIDIOC_G_AUDOUT() {
 
 }
 
+void test_VIDIOC_G_AUDOUT_ignore_index() {
+	int ret1;
+	int errno1;
+	int ret2;
+	int errno2;
+	struct v4l2_audioout audioout;
+	struct v4l2_audioout audioout2;
+
+	/* check whether the "index" field is ignored by VIDIOC_G_AUDOUT */
+
+	memset(&audioout, 0, sizeof(audioout));
+	ret1 = ioctl(get_video_fd(), VIDIOC_G_AUDOUT, &audioout);
+	errno1 = errno;
+
+	dprintf("VIDIOC_G_AUDOUT, ret1=%i, errno1=%i\n", ret1, errno1);
+
+	memset(&audioout2, 0, sizeof(audioout2));
+	audioout2.index = U32_MAX;
+	ret2 = ioctl(get_video_fd(), VIDIOC_G_AUDOUT, &audioout2);
+	errno2 = errno;
+
+	dprintf("VIDIOC_G_AUDOUT, ret2=%i, errno2=%i\n", ret2, errno2);
+
+	if (ret1 == 0) {
+		CU_ASSERT_EQUAL(ret2, 0);
+		CU_ASSERT_EQUAL(memcmp(&audioout, &audioout2, sizeof(audioout)), 0);
+	} else {
+		CU_ASSERT_EQUAL(ret1, -1);
+		CU_ASSERT_EQUAL(errno1, EINVAL);
+		CU_ASSERT_EQUAL(ret2, -1);
+		CU_ASSERT_EQUAL(errno2, EINVAL);
+	}
+
+}
+
+
 void test_VIDIOC_G_AUDOUT_NULL() {
 	int ret1;
 	int errno1;
@@ -127,3 +165,302 @@ void test_VIDIOC_G_AUDOUT_NULL() {
 /* TODO: - try with all possible outputs (VIDIOC_ENUMOUTPUT)
  *       - try with STREAM_ON
  */
+
+void test_VIDIOC_S_AUDOUT() {
+	int ret_orig, errno_orig;
+	int ret;
+	__u32 index;
+	__u32 i;
+	struct v4l2_audioout audioout_orig;
+	struct v4l2_audioout audioout_enum;
+	struct v4l2_audioout audioout_set;
+
+	/* This testcase tries to find out the relations between the following
+	 * commands:
+	 *  - VIDIOC_ENUMAUDOUT
+	 *  - VIDIOC_G_AUDOUT
+	 *  - VIDIOC_S_AUDOUT
+	 */
+
+	/* remember the original settings */
+	memset(&audioout_orig, 0, sizeof(audioout_orig));
+	ret_orig = ioctl(get_video_fd(), VIDIOC_G_AUDOUT, &audioout_orig);
+	errno_orig = errno;
+
+	dprintf("VIDIOC_G_AUDOUT, ret_orig=%i, errno_orig=%i\n", ret_orig, errno_orig);
+
+	if (ret_orig == 0) {
+		CU_ASSERT_EQUAL(ret_orig, 0);
+	} else {
+		CU_ASSERT_EQUAL(ret_orig, -1);
+		CU_ASSERT_EQUAL(errno_orig, EINVAL);
+	}
+
+	/* try to continue even if VIDIOC_G_AUDOUT seems to be not supported */
+
+	index = 0;
+	do {
+		memset(&audioout_enum, 0, sizeof(audioout_enum));
+		audioout_enum.index = index;
+		ret = ioctl(get_video_fd(), VIDIOC_ENUMAUDOUT, &audioout_enum);
+
+		if (ret == 0) {
+			memset(&audioout_set, 0xff, sizeof(audioout_set));
+			audioout_set.index = index;
+			ret = ioctl(get_video_fd(), VIDIOC_S_AUDOUT, &audioout_set);
+
+			/* It shall be always possible to set the audio output to the
+			 * enumerated values.
+			 */
+			CU_ASSERT_EQUAL(ret, 0);
+
+			index++;
+		}
+
+	} while (ret == 0);
+	CU_ASSERT_EQUAL(ret, -1);
+	CU_ASSERT_EQUAL(errno, EINVAL);
+
+	/* try to set audio output to beyond the enumerated values */
+	for (i=0; i<=32; i++) {
+		memset(&audioout_set, 0xff, sizeof(audioout_set));
+		audioout_set.index = index;
+		ret = ioctl(get_video_fd(), VIDIOC_S_AUDOUT, &audioout_set);
+
+		CU_ASSERT_EQUAL(ret, -1);
+		CU_ASSERT_EQUAL(errno, EINVAL);
+
+		index++;
+	}
+
+	/* restore the original audio output settings */
+	memset(&audioout_set, 0, sizeof(audioout_set));
+	audioout_set.index = audioout_orig.index;
+	ret = ioctl(get_video_fd(), VIDIOC_S_AUDOUT, &audioout_set);
+
+	if (ret_orig == 0) {
+		/* If it was possible at the beginning to get the audio output then
+		 * it shall be possible to set it again.
+		 */
+		CU_ASSERT_EQUAL(ret, 0);
+	} else {
+		/* In case we could not fetch the audio output value at the start
+		 * of this test case: the VIDIOC_S_AUDOUT shall also fail.
+		 */
+		CU_ASSERT_EQUAL(ret, -1);
+		CU_ASSERT_EQUAL(errno, EINVAL);
+	}
+
+}
+
+void test_VIDIOC_S_AUDOUT_S32_MAX() {
+	int ret;
+	int ret_orig, errno_orig;
+	int ret_set, errno_set;
+	struct v4l2_audioout audioout;
+	struct v4l2_audioout audioout2;
+	struct v4l2_audioout audioout_orig;
+	struct v4l2_audioout audioout_set;
+
+	/* remember the original settings */
+	memset(&audioout_orig, 0, sizeof(audioout_orig));
+	ret_orig = ioctl(get_video_fd(), VIDIOC_G_AUDOUT, &audioout_orig);
+	errno_orig = errno;
+
+	dprintf("VIDIOC_G_AUDOUT, ret_orig=%i, errno_orig=%i\n", ret_orig, errno_orig);
+
+	/* test invalid index */
+	memset(&audioout, 0xff, sizeof(audioout));
+	audioout.index = (__u32)S32_MAX;
+	ret = ioctl(get_video_fd(), VIDIOC_S_AUDOUT, &audioout);
+
+	CU_ASSERT_EQUAL(ret, -1);
+	CU_ASSERT_EQUAL(errno, EINVAL);
+
+	/* Check whether the original audioout struct is untouched */
+	memset(&audioout2, 0xff, sizeof(audioout2));
+	audioout2.index = (__u32)S32_MAX;
+	CU_ASSERT_EQUAL(memcmp(&audioout, &audioout2, sizeof(audioout)), 0);
+
+	/* restore the original audio output settings */
+	memset(&audioout_set, 0, sizeof(audioout_set));
+	audioout_set.index = audioout_orig.index;
+	ret_set = ioctl(get_video_fd(), VIDIOC_S_AUDOUT, &audioout_set);
+	errno_set = errno;
+
+	dprintf("VIDIOC_S_AUDOUT, ret_set=%i, errno_set=%i\n", ret_set, errno_set);
+
+	if (ret_orig == 0) {
+		/* If it was possible at the beginning to get the audio output then
+		 * it shall be possible to set it again.
+		 */
+		CU_ASSERT_EQUAL(ret_set, 0);
+	} else {
+		/* In case we could not fetch the audio output value at the start
+		 * of this test case: the VIDIOC_S_AUDOUT shall also fail.
+		 */
+		CU_ASSERT_EQUAL(ret_set, -1);
+		CU_ASSERT_EQUAL(errno_set, EINVAL);
+	}
+}
+
+void test_VIDIOC_S_AUDOUT_S32_MAX_1() {
+	int ret;
+	int ret_orig, errno_orig;
+	int ret_set, errno_set;
+	struct v4l2_audioout audioout;
+	struct v4l2_audioout audioout2;
+	struct v4l2_audioout audioout_orig;
+	struct v4l2_audioout audioout_set;
+
+	/* remember the original settings */
+	memset(&audioout_orig, 0, sizeof(audioout_orig));
+	ret_orig = ioctl(get_video_fd(), VIDIOC_G_AUDOUT, &audioout_orig);
+	errno_orig = errno;
+
+	dprintf("VIDIOC_G_AUDOUT, ret_orig=%i, errno_orig=%i\n", ret_orig, errno_orig);
+
+	/* test invalid index */
+	memset(&audioout, 0xff, sizeof(audioout));
+	audioout.index = ((__u32)S32_MAX)+1;
+	ret = ioctl(get_video_fd(), VIDIOC_S_AUDOUT, &audioout);
+
+	CU_ASSERT_EQUAL(ret, -1);
+	CU_ASSERT_EQUAL(errno, EINVAL);
+
+	/* Check whether the original audioout struct is untouched */
+	memset(&audioout2, 0xff, sizeof(audioout2));
+	audioout2.index = ((__u32)S32_MAX)+1;
+	CU_ASSERT_EQUAL(memcmp(&audioout, &audioout2, sizeof(audioout)), 0);
+
+	/* restore the original audio output settings */
+	memset(&audioout_set, 0, sizeof(audioout_set));
+	audioout_set.index = audioout_orig.index;
+	ret_set = ioctl(get_video_fd(), VIDIOC_S_AUDOUT, &audioout_set);
+	errno_set = errno;
+
+	dprintf("VIDIOC_S_AUDOUT, ret_set=%i, errno_set=%i\n", ret_set, errno_set);
+
+	if (ret_orig == 0) {
+		/* If it was possible at the beginning to get the audio output then
+		 * it shall be possible to set it again.
+		 */
+		CU_ASSERT_EQUAL(ret_set, 0);
+	} else {
+		/* In case we could not fetch the audio output value at the start
+		 * of this test case: the VIDIOC_S_AUDOUT shall also fail.
+		 */
+		CU_ASSERT_EQUAL(ret_set, -1);
+		CU_ASSERT_EQUAL(errno_set, EINVAL);
+	}
+}
+
+
+void test_VIDIOC_S_AUDOUT_U32_MAX() {
+	int ret;
+	int ret_orig, errno_orig;
+	int ret_set, errno_set;
+	struct v4l2_audioout audioout;
+	struct v4l2_audioout audioout2;
+	struct v4l2_audioout audioout_orig;
+	struct v4l2_audioout audioout_set;
+
+	/* remember the original settings */
+	memset(&audioout_orig, 0, sizeof(audioout_orig));
+	ret_orig = ioctl(get_video_fd(), VIDIOC_G_AUDOUT, &audioout_orig);
+	errno_orig = errno;
+
+	dprintf("VIDIOC_G_AUDOUT, ret_orig=%i, errno_orig=%i\n", ret_orig, errno_orig);
+	/* test invalid index */
+	memset(&audioout, 0xff, sizeof(audioout));
+	audioout.index = U32_MAX;
+	ret = ioctl(get_video_fd(), VIDIOC_S_AUDOUT, &audioout);
+
+	CU_ASSERT_EQUAL(ret, -1);
+	CU_ASSERT_EQUAL(errno, EINVAL);
+
+	/* Check whether the original audioout struct is untouched */
+	memset(&audioout2, 0xff, sizeof(audioout2));
+	audioout2.index = U32_MAX;
+	CU_ASSERT_EQUAL(memcmp(&audioout, &audioout2, sizeof(audioout)), 0);
+
+	/* restore the original audio output settings */
+	memset(&audioout_set, 0, sizeof(audioout_set));
+	audioout_set.index = audioout_orig.index;
+	ret_set = ioctl(get_video_fd(), VIDIOC_S_AUDOUT, &audioout_set);
+	errno_set = errno;
+
+	dprintf("VIDIOC_S_AUDOUT, ret_set=%i, errno_set=%i\n", ret_set, errno_set);
+
+	if (ret_orig == 0) {
+		/* If it was possible at the beginning to get the audio output then
+		 * it shall be possible to set it again.
+		 */
+		CU_ASSERT_EQUAL(ret_set, 0);
+	} else {
+		/* In case we could not fetch the audio output value at the start
+		 * of this test case: the VIDIOC_S_AUDOUT shall also fail.
+		 */
+		CU_ASSERT_EQUAL(ret_set, -1);
+		CU_ASSERT_EQUAL(errno_set, EINVAL);
+	}
+}
+
+void test_VIDIOC_S_AUDOUT_NULL() {
+	int ret_orig, errno_orig;
+	int ret_set, errno_set;
+	int ret1, errno1;
+	int ret2, errno2;
+	struct v4l2_audio audio_orig;
+	struct v4l2_audio audio_set;
+
+	/* remember the original settings */
+	memset(&audio_orig, 0, sizeof(audio_orig));
+	ret_orig = ioctl(get_video_fd(), VIDIOC_G_AUDOUT, &audio_orig);
+	errno_orig = errno;
+
+	dprintf("\tVIDIOC_G_AUDOUT, ret_orig=%i, errno_orig=%i\n", ret_orig, errno_orig);
+
+	memset(&audio_set, 0, sizeof(audio_set));
+	ret1 = ioctl(get_video_fd(), VIDIOC_S_AUDOUT, &audio_set);
+	errno1 = errno;
+
+	dprintf("\tVIDIOC_S_AUDOUT, ret1=%i, errno1=%i\n", ret1, errno1);
+
+	ret2 = ioctl(get_video_fd(), VIDIOC_S_AUDOUT, NULL);
+	errno2 = errno;
+
+	dprintf("\tVIDIOC_S_AUDOUT, ret2=%i, errno2=%i\n", ret2, errno2);
+
+	if (ret1 == 0) {
+		CU_ASSERT_EQUAL(ret1, 0);
+		CU_ASSERT_EQUAL(ret2, -1);
+		CU_ASSERT_EQUAL(errno2, EFAULT);
+	} else {
+		CU_ASSERT_EQUAL(ret1, -1);
+		CU_ASSERT_EQUAL(errno1, EINVAL);
+		CU_ASSERT_EQUAL(ret2, -1);
+		CU_ASSERT_EQUAL(errno2, EINVAL);
+	}
+
+	/* restore the original audio input settings */
+	memset(&audio_set, 0, sizeof(audio_set));
+	audio_set.index = audio_orig.index;
+	ret_set = ioctl(get_video_fd(), VIDIOC_S_AUDOUT, &audio_set);
+	errno_set = errno;
+
+	dprintf("VIDIOC_S_AUDOUT, ret_set=%i, errno_set=%i\n", ret_set, errno_set);
+
+	if (ret_orig == 0) {
+		/* If it was possible at the beginning to get the audio input then
+		 * it shall be possible to set it again.
+		 */
+		CU_ASSERT_EQUAL(ret_set, 0);
+	} else {
+		/* In case we could not fetch the audio input value at the start
+		 * of this test case: the VIDIOC_S_AUDOUT shall also fail.
+		 */
+		CU_ASSERT_EQUAL(ret_set, -1);
+		CU_ASSERT_EQUAL(errno_set, EINVAL);
+	}
+}
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_AUDOUT.h ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_AUDOUT.h
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_AUDOUT.h	2009-02-03 22:04:56.000000000 +0100
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_AUDOUT.h	2009-02-07 15:03:14.000000000 +0100
@@ -1,6 +1,7 @@
 /*
  * v4l-test: Test environment for Video For Linux Two API
  *
+ *  7 Feb 2009  0.2  Test case test_VIDIOC_G_AUDOUT_ignore_index added
  *  3 Feb 2009  0.1  First release
  *
  * Written by Márton Németh <[email protected]>
@@ -8,4 +9,11 @@
  */
 
 void test_VIDIOC_G_AUDOUT(void);
+void test_VIDIOC_G_AUDOUT_ignore_index(void);
 void test_VIDIOC_G_AUDOUT_NULL(void);
+
+void test_VIDIOC_S_AUDOUT(void);
+void test_VIDIOC_S_AUDOUT_S32_MAX(void);
+void test_VIDIOC_S_AUDOUT_S32_MAX_1(void);
+void test_VIDIOC_S_AUDOUT_U32_MAX(void);
+void test_VIDIOC_S_AUDOUT_NULL(void);
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_CROP.c ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_CROP.c
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_CROP.c	1970-01-01 01:00:00.000000000 +0100
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_CROP.c	2009-02-07 21:29:05.000000000 +0100
@@ -0,0 +1,77 @@
+/*
+ * v4l-test: Test environment for Video For Linux Two API
+ *
+ *  7 Feb 2009  0.1  First release
+ *
+ * Written by Márton Németh <[email protected]>
+ * Released under GPL
+ */
+
+#include <sys/ioctl.h>
+#include <errno.h>
+#include <string.h>
+
+#include <linux/videodev2.h>
+#include <linux/errno.h>
+
+#include <CUnit/CUnit.h>
+
+#include "v4l2_test.h"
+#include "dev_video.h"
+#include "video_limits.h"
+
+#include "test_VIDIOC_CROP.h"
+
+
+void test_VIDIOC_G_CROP() {
+	int ret1, errno1;
+	struct v4l2_crop crop;
+
+	memset(&crop, 0xff, sizeof(crop));
+	ret1 = ioctl(get_video_fd(), VIDIOC_G_CROP, &crop);
+	errno1 = errno;
+
+	dprintf("VIDIOC_G_CROP ret1=%i, errno1=%i\n", ret1, errno1);
+
+	if (ret1 == 0) {
+		CU_ASSERT_EQUAL(ret1, 0);
+
+	} else {
+		CU_ASSERT_EQUAL(ret1, -1);
+		CU_ASSERT_EQUAL(errno1, EINVAL);
+
+	}
+
+}
+
+void test_VIDIOC_G_CROP_NULL() {
+	int ret1, errno1;
+	int ret2, errno2;
+	struct v4l2_crop crop;
+
+	memset(&crop, 0xff, sizeof(crop));
+	ret1 = ioctl(get_video_fd(), VIDIOC_G_CROP, &crop);
+	errno1 = errno;
+
+	dprintf("VIDIOC_G_CROP ret1=%i, errno1=%i\n", ret1, errno1);
+
+	memset(&crop, 0xff, sizeof(crop));
+	ret2 = ioctl(get_video_fd(), VIDIOC_G_CROP, NULL);
+	errno2 = errno;
+
+	dprintf("VIDIOC_G_CROP ret2=%i, errno2=%i\n", ret2, errno2);
+
+	if (ret1 == 0) {
+		CU_ASSERT_EQUAL(ret1, 0);
+		CU_ASSERT_EQUAL(ret2, -1);
+		CU_ASSERT_EQUAL(errno2, EFAULT);
+
+	} else {
+		CU_ASSERT_EQUAL(ret1, -1);
+		CU_ASSERT_EQUAL(errno1, EINVAL);
+		CU_ASSERT_EQUAL(ret2, -1);
+		CU_ASSERT_EQUAL(errno2, EINVAL);
+
+	}
+
+}
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_CROPCAP.c ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_CROPCAP.c
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_CROPCAP.c	2009-02-13 08:39:58.000000000 +0100
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_CROPCAP.c	2009-02-09 07:56:16.000000000 +0100
@@ -1,6 +1,8 @@
 /*
  * v4l-test: Test environment for Video For Linux Two API
  *
+ *  9 Feb 2009  0.3  Modify test_VIDIOC_CROPCAP_enum_INPUT() to support drivers
+ *                   without any inputs
  *  3 Feb 2009  0.2  Typo fixed
  * 21 Dec 2008  0.1  First release
  *
@@ -151,8 +153,8 @@ void test_VIDIOC_CROPCAP_enum_INPUT() {
 
 	memset(&input_index_orig, 0xff, sizeof(input_index_orig));
 	ret = ioctl(f, VIDIOC_G_INPUT, &input_index_orig);
-	CU_ASSERT_EQUAL(ret, 0);
 	if (ret == 0) {
+		CU_ASSERT_EQUAL(ret, 0);
 		i = 0;
 		do {
 			memset(&input, 0xff, sizeof(input));
@@ -176,6 +178,9 @@ void test_VIDIOC_CROPCAP_enum_INPUT() {
 		/* Setting the original input_id should not fail */
 		ret = ioctl(f, VIDIOC_S_INPUT, &input_index_orig);
 		CU_ASSERT_EQUAL(ret, 0);
+	} else {
+		CU_ASSERT_EQUAL(ret, -1);
+		CU_ASSERT_EQUAL(errno, EINVAL);
 	}
 }
 
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_CROP.h ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_CROP.h
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_CROP.h	1970-01-01 01:00:00.000000000 +0100
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_CROP.h	2009-02-07 21:22:01.000000000 +0100
@@ -0,0 +1,11 @@
+/*
+ * v4l-test: Test environment for Video For Linux Two API
+ *
+ *  7 Feb 2009  0.1  First release
+ *
+ * Written by Márton Németh <[email protected]>
+ * Released under GPL
+ */
+
+void test_VIDIOC_G_CROP(void);
+void test_VIDIOC_G_CROP_NULL(void);
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_INPUT.c ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_INPUT.c
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_INPUT.c	2009-01-04 12:45:22.000000000 +0100
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_INPUT.c	2009-02-09 08:16:18.000000000 +0100
@@ -1,6 +1,7 @@
 /*
  * v4l-test: Test environment for Video For Linux Two API
  *
+ *  9 Feb 2009  0.3  Modify test cases to support drivers without any inputs
  * 22 Dec 2008  0.2  Test case with NULL parameter added
  * 18 Dec 2008  0.1  First release
  *
@@ -63,14 +64,17 @@ void test_VIDIOC_G_INPUT() {
 	memset(&index, 0xff, sizeof(index));
 	ret = ioctl(f, VIDIOC_G_INPUT, &index);
 
-	dprintf("VIDIOC_G_INPUT, ret=%i\n", ret);
+	dprintf("\tVIDIOC_G_INPUT, ret=%i, errno=%i\n", ret, errno);
 
-	CU_ASSERT_EQUAL(ret, 0);
 	if (ret == 0) {
+		CU_ASSERT_EQUAL(ret, 0);
 		CU_ASSERT(valid_input_index(f, index));
 
-		dprintf("index=0x%X\n", index);
+		dprintf("\tindex=0x%X\n", index);
 
+	} else {
+		CU_ASSERT_EQUAL(ret, -1);
+		CU_ASSERT_EQUAL(errno, EINVAL);
 	}
 
 }
@@ -87,8 +91,9 @@ void test_VIDIOC_S_INPUT_from_enum() {
 
 	memset(&input_index_orig, 0xff, sizeof(input_index_orig));
 	ret = ioctl(f, VIDIOC_G_INPUT, &input_index_orig);
-	CU_ASSERT_EQUAL(ret, 0);
 	if (ret == 0) {
+		CU_ASSERT_EQUAL(ret, 0);
+
 		i = 0;
 		do {
 			memset(&input, 0xff, sizeof(input));
@@ -110,6 +115,9 @@ void test_VIDIOC_S_INPUT_from_enum() {
 		/* Setting the original input_id should not fail */
 		ret = ioctl(f, VIDIOC_S_INPUT, &input_index_orig);
 		CU_ASSERT_EQUAL(ret, 0);
+	} else {
+		CU_ASSERT_EQUAL(ret, -1);
+		CU_ASSERT_EQUAL(errno, EINVAL);
 	}
 }
 
@@ -145,8 +153,8 @@ void test_VIDIOC_S_INPUT_invalid_inputs(
 
 	memset(&input_index_orig, 0xff, sizeof(input_index_orig));
 	ret = ioctl(f, VIDIOC_G_INPUT, &input_index_orig);
-	CU_ASSERT_EQUAL(ret, 0);
 	if (ret == 0) {
+		CU_ASSERT_EQUAL(ret, 0);
 		i = 0;
 		do {
 			memset(&input, 0xff, sizeof(input));
@@ -181,15 +189,38 @@ void test_VIDIOC_S_INPUT_invalid_inputs(
 		/* Setting the original input_id should not fail */
 		ret = ioctl(f, VIDIOC_S_INPUT, &input_index_orig);
 		CU_ASSERT_EQUAL(ret, 0);
+	} else {
+		CU_ASSERT_EQUAL(ret, -1);
+		CU_ASSERT_EQUAL(errno, EINVAL);
 	}
 }
 
 void test_VIDIOC_G_INPUT_NULL() {
-	int ret;
+	int ret1, errno1;
+	int ret2, errno2;
+	__u32 index;
 
-	ret = ioctl(get_video_fd(), VIDIOC_G_INPUT, NULL);
-	CU_ASSERT_EQUAL(ret, -1);
-	CU_ASSERT_EQUAL(errno, EFAULT);
+	memset(&index, 0xff, sizeof(index));
+	ret1 = ioctl(get_video_fd(), VIDIOC_G_INPUT, &index);
+	errno1 = errno;
+
+	dprintf("\tVIDIOC_G_INPUT, ret1=%i, errno1=%i\n", ret1, errno1);
+
+	ret2 = ioctl(get_video_fd(), VIDIOC_G_INPUT, NULL);
+	errno2 = errno;
+
+	dprintf("\tVIDIOC_G_INPUT: ret2=%i, errno2=%i\n", ret2, errno2);
+
+	if (ret1 == 0) {
+		CU_ASSERT_EQUAL(ret1, 0);
+		CU_ASSERT_EQUAL(ret2, -1);
+		CU_ASSERT_EQUAL(errno2, EFAULT);
+	} else {
+		CU_ASSERT_EQUAL(ret1, -1);
+		CU_ASSERT_EQUAL(errno1, EINVAL);
+		CU_ASSERT_EQUAL(ret2, -1);
+		CU_ASSERT_EQUAL(errno2, EINVAL);
+	}
 
 }
 
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_STD.c ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_STD.c
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_STD.c	2009-01-30 21:50:13.000000000 +0100
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_STD.c	2009-02-09 08:09:37.000000000 +0100
@@ -1,6 +1,8 @@
 /*
  * v4l-test: Test environment for Video For Linux Two API
  *
+ *  9 Feb 2009  0.3  Modify test cases to support drivers without any inputs;
+ *                   cleanup debug printouts
  * 30 Jan 2009  0.5  valid_v4l2_std_id() moved to v4l2_validator.c
  * 18 Jan 2009  0.4  Typo corrected
  * 23 Dec 2008  0.3  Debug messages added
@@ -39,13 +41,13 @@ void test_VIDIOC_G_STD() {
 	memset(&std_id, 0xff, sizeof(std_id));
 	ret = ioctl(get_video_fd(), VIDIOC_G_STD, &std_id);
 
-	dprintf("VIDIOC_G_STD, ret=%i\n", ret);
+	dprintf("\tVIDIOC_G_STD, ret=%i\n", ret);
 
 	CU_ASSERT_EQUAL(ret, 0);
 	if (ret == 0) {
 		CU_ASSERT(valid_v4l2_std_id(std_id));
 
-		dprintf("std_id=0x%llX\n", std_id);
+		dprintf("\tstd_id=0x%llX\n", std_id);
 
 	}
 
@@ -67,7 +69,7 @@ static int do_set_video_standard(int f, 
 			CU_ASSERT( (id & std_id) == id);
 
 			if (std_id != id) {
-				dprintf("ret=%i, errno=%i, std_id=0x%llX, id=0x%llX\n", ret, errno, std_id, id);
+				dprintf("\tret=%i, errno=%i, std_id=0x%llX, id=0x%llX\n", ret, errno, std_id, id);
 			}
 
 		}
@@ -76,7 +78,7 @@ static int do_set_video_standard(int f, 
 		CU_ASSERT_EQUAL(errno, EINVAL);
 
 		if (ret_set != -1) {
-			dprintf("ret_set=%i, errno=%i\n", ret_set, errno);
+			dprintf("\tret_set=%i, errno=%i\n", ret_set, errno);
 		}
 	}
 
@@ -92,8 +94,9 @@ void test_VIDIOC_S_STD() {
 
 	memset(&std_id_orig, 0xff, sizeof(std_id_orig));
 	ret = ioctl(f, VIDIOC_G_STD, &std_id_orig);
-	CU_ASSERT_EQUAL(ret, 0);
 	if (ret == 0) {
+		CU_ASSERT_EQUAL(ret, 0);
+
 		ret = do_set_video_standard(f, V4L2_STD_PAL_B);
 		ret = do_set_video_standard(f, V4L2_STD_PAL_B1);
 		ret = do_set_video_standard(f, V4L2_STD_PAL_G);
@@ -124,6 +127,9 @@ void test_VIDIOC_S_STD() {
 		/* Setting the original std_id should not fail */
 		ret = do_set_video_standard(f, std_id_orig);
 		CU_ASSERT_EQUAL(ret, 0);
+	} else {
+		CU_ASSERT_EQUAL(ret, -1);
+		CU_ASSERT_EQUAL(errno, EINVAL);
 	}
 
 }
@@ -148,19 +154,21 @@ void test_VIDIOC_S_STD_from_enum() {
 			std.index = i;
 			enum_ret = ioctl(f, VIDIOC_ENUMSTD, &std);
 
-			dprintf("ENUMSTD: i=%u, enum_ret=%i, errno=%i\n", i, enum_ret, errno);
+			dprintf("\tENUMSTD: i=%u, enum_ret=%i, errno=%i\n", i, enum_ret, errno);
 
 			if (enum_ret == 0) {
 				ret = do_set_video_standard(f, std.id);
 				CU_ASSERT_EQUAL(ret, 0);
 
-				dprintf("std.id=0x%llX, ret=%i\n", std.id, ret);
+				dprintf("\tstd.id=0x%llX, ret=%i\n", std.id, ret);
 			}
 			i++;
 		} while (enum_ret == 0 && i != 0);
 
 		/* Setting the original std_id should not fail */
 		ret = do_set_video_standard(f, std_id_orig);
+		dprintf("\tVIDIOC_S_STD: ret=%i (expected %i), errno=%i\n",
+			ret, 0, errno);
 		CU_ASSERT_EQUAL(ret, 0);
 	}
 
@@ -185,13 +193,14 @@ void test_VIDIOC_S_STD_invalid_standard(
 				ret = do_set_video_standard(f, std_id);
 				CU_ASSERT_EQUAL(ret, -1);
 				CU_ASSERT_EQUAL(errno, EINVAL);
-				dprintf("ret=%i, errno=%i\n", ret, errno);
+				dprintf("\tVIDIOC_S_STD: ret=%i, errno=%i\n", ret, errno);
 			}
 			std_id = std_id<<1;
 		}
 
 		/* Setting the original std_id should not fail */
 		ret = do_set_video_standard(f, std_id_orig);
+		dprintf("\tVIDIOC_S_STD: ret=%i (expected 0), errno=%i\n", ret, errno);
 		CU_ASSERT_EQUAL(ret, 0);
 	}
 }
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_TUNER.c ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_TUNER.c
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_TUNER.c	2009-02-13 08:39:59.000000000 +0100
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_TUNER.c	2009-02-09 08:44:06.000000000 +0100
@@ -1,6 +1,9 @@
 /*
  * v4l-test: Test environment for Video For Linux Two API
  *
+ *  9 Feb 2009  0.2  Added test cases for VIDIOC_S_TUNER;
+ *                   Some typos corrected;
+ *                   Add some debug messages
  * 31 Jan 2009  0.1  First release
  *
  * Written by Márton Németh <[email protected]>
@@ -236,6 +239,7 @@ void test_VIDIOC_G_TUNER_NULL() {
 	tuner.index = 0;
 	ret1 = ioctl(get_video_fd(), VIDIOC_G_TUNER, &tuner);
 	errno1 = errno;
+	dprintf("\t%s:%u: VIDIOC_G_TUNER: ret1=%i, errno1=%i\n", __FILE__, __LINE__, ret1, errno1);
 
 	ret2 = ioctl(get_video_fd(), VIDIOC_G_TUNER, NULL);
 
@@ -256,3 +260,229 @@ void test_VIDIOC_G_TUNER_NULL() {
 	}
 
 }
+
+void do_set_tuner_audmode(__u32 index, __u32 audmode) {
+	int ret;
+	struct v4l2_tuner tuner;
+
+	memset(&tuner, 0xff, sizeof(tuner));
+	tuner.index = index;
+	tuner.audmode = audmode;
+	ret = ioctl(get_video_fd(), VIDIOC_S_TUNER, &tuner);
+
+	dprintf("VIDIOC_S_TUNER: index=%u, audmode=%u, "
+		"ret=%i (expected %i), errno=%i\n",
+		index, audmode, ret, 0, errno);
+
+	CU_ASSERT_EQUAL(ret, 0);
+
+}
+
+void do_set_tuner_audmode_invalid(__u32 index, __u32 audmode) {
+	int ret;
+	struct v4l2_tuner tuner;
+
+	memset(&tuner, 0xff, sizeof(tuner));
+	tuner.index = index;
+	tuner.audmode = audmode;
+	ret = ioctl(get_video_fd(), VIDIOC_S_TUNER, &tuner);
+
+	dprintf("VIDIOC_S_TUNER: index=%u, audmode=%u, "
+		"ret=%i (expected %i), errno=%i (expected %i)\n",
+		index, audmode, ret, -1, errno, EINVAL);
+
+	CU_ASSERT_EQUAL(ret, -1);
+	CU_ASSERT_EQUAL(errno, EINVAL);
+}
+
+void test_VIDIOC_S_TUNER() {
+	int ret1, errno1;
+	int ret_set, errno_set;
+	struct v4l2_tuner tuner_orig;
+	struct v4l2_tuner tuner_set;
+
+	/* remember the tuner settings */
+	memset(&tuner_orig, 0, sizeof(tuner_orig));
+	ret1 = ioctl(get_video_fd(), VIDIOC_G_TUNER, &tuner_orig);
+	errno1 = errno;
+
+	dprintf("VIDIOC_G_TUNER, ret1=%i, errno1=%i\n", ret1, errno1);
+
+	if (ret1 == 0) {
+		CU_ASSERT_EQUAL(ret1, 0);
+
+		do_set_tuner_audmode(tuner_orig.index, V4L2_TUNER_MODE_MONO);
+		do_set_tuner_audmode(tuner_orig.index, V4L2_TUNER_MODE_STEREO);
+		do_set_tuner_audmode(tuner_orig.index, V4L2_TUNER_MODE_LANG1);
+		do_set_tuner_audmode(tuner_orig.index, V4L2_TUNER_MODE_LANG2);
+		do_set_tuner_audmode(tuner_orig.index, V4L2_TUNER_MODE_SAP);
+		do_set_tuner_audmode(tuner_orig.index, V4L2_TUNER_MODE_LANG1_LANG2);
+
+	} else {
+		CU_ASSERT_EQUAL(ret1, -1);
+		CU_ASSERT_EQUAL(errno1, EINVAL);
+
+		/* if VIDIOC_G_TUNER is not supported then VIDIOC_S_TUNER shall also
+		 * not supported.
+		 */
+		do_set_tuner_audmode_invalid(tuner_orig.index, V4L2_TUNER_MODE_MONO);
+		do_set_tuner_audmode_invalid(tuner_orig.index, V4L2_TUNER_MODE_STEREO);
+		do_set_tuner_audmode_invalid(tuner_orig.index, V4L2_TUNER_MODE_LANG1);
+		do_set_tuner_audmode_invalid(tuner_orig.index, V4L2_TUNER_MODE_LANG2);
+		do_set_tuner_audmode_invalid(tuner_orig.index, V4L2_TUNER_MODE_SAP);
+		do_set_tuner_audmode_invalid(tuner_orig.index, V4L2_TUNER_MODE_LANG1_LANG2);
+
+	}
+
+	if (ret1 == 0) {
+
+		/* restore the tuner settings */
+		memset(&tuner_set, 0xff, sizeof(tuner_set));
+		tuner_set.index = tuner_orig.index;
+		tuner_set.audmode = tuner_orig.audmode;
+		ret_set = ioctl(get_video_fd(), VIDIOC_S_TUNER, &tuner_orig);
+		errno_set = errno;
+
+		dprintf("VIDIOC_S_TUNER, ret_set=%i, errno_set=%i\n", ret_set, errno_set);
+
+		CU_ASSERT_EQUAL(ret_set, 0);
+	}
+
+}
+
+void test_VIDIOC_S_TUNER_invalid() {
+	int ret1, errno1;
+	int ret_set, errno_set;
+	struct v4l2_tuner tuner_orig;
+	struct v4l2_tuner tuner_set;
+
+	/* remember the tuner settings */
+	memset(&tuner_orig, 0, sizeof(tuner_orig));
+	ret1 = ioctl(get_video_fd(), VIDIOC_G_TUNER, &tuner_orig);
+	errno1 = errno;
+
+	dprintf("VIDIOC_G_TUNER, ret1=%i, errno1=%i\n", ret1, errno1);
+
+	if (ret1 == 0) {
+		CU_ASSERT_EQUAL(ret1, 0);
+
+		/* try with invalid index */
+		do_set_tuner_audmode_invalid(tuner_orig.index+1, V4L2_TUNER_MODE_MONO);
+		do_set_tuner_audmode_invalid(tuner_orig.index-1, V4L2_TUNER_MODE_MONO);
+		do_set_tuner_audmode_invalid((__u32)S32_MAX, V4L2_TUNER_MODE_MONO);
+		do_set_tuner_audmode_invalid(((__u32)S32_MAX)+1, V4L2_TUNER_MODE_MONO);
+		do_set_tuner_audmode_invalid(U32_MAX, V4L2_TUNER_MODE_MONO);
+
+		do_set_tuner_audmode_invalid(tuner_orig.index+1, V4L2_TUNER_MODE_STEREO);
+		do_set_tuner_audmode_invalid(tuner_orig.index-1, V4L2_TUNER_MODE_STEREO);
+		do_set_tuner_audmode_invalid((__u32)S32_MAX, V4L2_TUNER_MODE_STEREO);
+		do_set_tuner_audmode_invalid(((__u32)S32_MAX)+1, V4L2_TUNER_MODE_STEREO);
+		do_set_tuner_audmode_invalid(U32_MAX, V4L2_TUNER_MODE_STEREO);
+
+		do_set_tuner_audmode_invalid(tuner_orig.index+1, V4L2_TUNER_MODE_LANG1);
+		do_set_tuner_audmode_invalid(tuner_orig.index-1, V4L2_TUNER_MODE_LANG1);
+		do_set_tuner_audmode_invalid((__u32)S32_MAX, V4L2_TUNER_MODE_LANG1);
+		do_set_tuner_audmode_invalid(((__u32)S32_MAX)+1, V4L2_TUNER_MODE_LANG1);
+		do_set_tuner_audmode_invalid(U32_MAX, V4L2_TUNER_MODE_LANG1);
+
+		do_set_tuner_audmode_invalid(tuner_orig.index+1, V4L2_TUNER_MODE_LANG2);
+		do_set_tuner_audmode_invalid(tuner_orig.index-1, V4L2_TUNER_MODE_LANG2);
+		do_set_tuner_audmode_invalid((__u32)S32_MAX, V4L2_TUNER_MODE_LANG2);
+		do_set_tuner_audmode_invalid(((__u32)S32_MAX)+1, V4L2_TUNER_MODE_LANG2);
+		do_set_tuner_audmode_invalid(U32_MAX, V4L2_TUNER_MODE_LANG2);
+
+		do_set_tuner_audmode_invalid(tuner_orig.index+1, V4L2_TUNER_MODE_SAP);
+		do_set_tuner_audmode_invalid(tuner_orig.index-1, V4L2_TUNER_MODE_SAP);
+		do_set_tuner_audmode_invalid((__u32)S32_MAX, V4L2_TUNER_MODE_SAP);
+		do_set_tuner_audmode_invalid(((__u32)S32_MAX)+1, V4L2_TUNER_MODE_SAP);
+		do_set_tuner_audmode_invalid(U32_MAX, V4L2_TUNER_MODE_SAP);
+
+		do_set_tuner_audmode_invalid(tuner_orig.index+1, V4L2_TUNER_MODE_LANG1_LANG2);
+		do_set_tuner_audmode_invalid(tuner_orig.index-1, V4L2_TUNER_MODE_LANG1_LANG2);
+		do_set_tuner_audmode_invalid((__u32)S32_MAX, V4L2_TUNER_MODE_LANG1_LANG2);
+		do_set_tuner_audmode_invalid(((__u32)S32_MAX)+1, V4L2_TUNER_MODE_LANG1_LANG2);
+		do_set_tuner_audmode_invalid(U32_MAX, V4L2_TUNER_MODE_LANG1_LANG2);
+
+	} else {
+		CU_ASSERT_EQUAL(ret1, -1);
+		CU_ASSERT_EQUAL(errno1, EINVAL);
+
+	}
+
+	/* try with invalid audmode */
+	do_set_tuner_audmode_invalid(tuner_orig.index, 5);
+	do_set_tuner_audmode_invalid(tuner_orig.index, (__u32)S32_MAX);
+	do_set_tuner_audmode_invalid(tuner_orig.index, ((__u32)S32_MAX)+1);
+	do_set_tuner_audmode_invalid(tuner_orig.index, U32_MAX);
+
+	if (ret1 == 0) {
+
+		/* restore the tuner settings */
+		memset(&tuner_set, 0xff, sizeof(tuner_set));
+		tuner_set.index = tuner_orig.index;
+		tuner_set.audmode = tuner_orig.audmode;
+		ret_set = ioctl(get_video_fd(), VIDIOC_S_TUNER, &tuner_orig);
+		errno_set = errno;
+
+		dprintf("VIDIOC_S_TUNER, ret_set=%i, errno_set=%i\n", ret_set, errno_set);
+
+		CU_ASSERT_EQUAL(ret_set, 0);
+	}
+
+}
+
+void test_VIDIOC_S_TUNER_NULL() {
+	int ret_orig, errno_orig;
+	int ret1, errno1;
+	int ret2, errno2;
+	int ret_set, errno_set;
+	struct v4l2_tuner tuner_orig;
+	struct v4l2_tuner tuner;
+	struct v4l2_tuner tuner_set;
+
+	/* remember the tuner settings */
+	memset(&tuner_orig, 0, sizeof(tuner_orig));
+	ret_orig = ioctl(get_video_fd(), VIDIOC_G_TUNER, &tuner_orig);
+	errno_orig = errno;
+
+	dprintf("\tVIDIOC_G_TUNER, ret_orig=%i, errno_orig=%i\n", ret_set, errno_set);
+
+	memset(&tuner, 0, sizeof(tuner));
+	tuner.index = tuner_orig.index;
+	tuner.audmode = tuner_orig.audmode;
+	ret1 = ioctl(get_video_fd(), VIDIOC_S_TUNER, &tuner);
+	errno1 = errno;
+
+	dprintf("\tVIDIOC_S_TUNER: ret1=%i, errno1=%i\n", ret1, errno1);
+
+	ret2 = ioctl(get_video_fd(), VIDIOC_S_TUNER, NULL);
+	errno2 = errno;
+
+	dprintf("\tVIDIOC_S_TUNER: ret2=%i, errno2=%i\n", ret1, errno1);
+
+	if (ret1 == 0) {
+		CU_ASSERT_EQUAL(ret1, 0);
+		CU_ASSERT_EQUAL(ret2, -1);
+		CU_ASSERT_EQUAL(errno2, EFAULT);
+	} else {
+		CU_ASSERT_EQUAL(ret1, -1);
+		CU_ASSERT_EQUAL(errno1, EINVAL);
+		CU_ASSERT_EQUAL(ret2, -1);
+		CU_ASSERT_EQUAL(errno2, EINVAL);
+	}
+
+	if (ret_orig == 0) {
+
+		/* restore the tuner settings */
+		memset(&tuner_set, 0xff, sizeof(tuner_set));
+		tuner_set.index = tuner_orig.index;
+		tuner_set.audmode = tuner_orig.audmode;
+		ret_set = ioctl(get_video_fd(), VIDIOC_S_TUNER, &tuner_orig);
+		errno_set = errno;
+
+		dprintf("\tVIDIOC_S_TUNER, ret_set=%i, errno_set=%i\n", ret_set, errno_set);
+
+		CU_ASSERT_EQUAL(ret_set, 0);
+	}
+
+}
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_TUNER.h ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_TUNER.h
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_TUNER.h	2009-01-31 08:35:05.000000000 +0100
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_TUNER.h	2009-02-07 23:19:22.000000000 +0100
@@ -12,3 +12,7 @@ void test_VIDIOC_G_TUNER_S32_MAX(void);
 void test_VIDIOC_G_TUNER_S32_MAX_1(void);
 void test_VIDIOC_G_TUNER_U32_MAX(void);
 void test_VIDIOC_G_TUNER_NULL(void);
+
+void test_VIDIOC_S_TUNER(void);
+void test_VIDIOC_S_TUNER_invalid(void);
+void test_VIDIOC_S_TUNER_NULL(void);
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/v4l2_test.c ltp/testcases/kernel/device-drivers/v4l/user_space/v4l2_test.c
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/v4l2_test.c	2009-02-13 08:39:59.000000000 +0100
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/v4l2_test.c	2009-02-07 23:35:06.000000000 +0100
@@ -1,6 +1,8 @@
 /*
  * v4l-test: Test environment for Video For Linux Two API
  *
+ *  7 Feb 2009  0.10 Test cases added for VIDIOC_G_AUDIO, VIDIOC_G_AUDOUT,
+ *                   VIDIOC_S_AUDIO and VIDIOC_G_CROP
  *  3 Feb 2009  0.9  Test cases for VIDIOC_G_AUDIO and VIDIOC_G_AUDOUT added
  *  2 Feb 2009  0.8  Test cases for VIDIOC_G_MODULATOR, VIDIOC_G_PRIORITY
  *                   and VIDIOC_S_PRIORITY added
@@ -60,6 +62,7 @@
 #include "test_VIDIOC_PRIORITY.h"
 #include "test_VIDIOC_AUDIO.h"
 #include "test_VIDIOC_AUDOUT.h"
+#include "test_VIDIOC_CROP.h"
 
 #include "test_VIDIOC_LOG_STATUS.h"
 #include "test_invalid_ioctl.h"
@@ -147,6 +150,10 @@ static CU_TestInfo suite_get_set_try[] =
   { "VIDIOC_G_TUNER, index=U32_MAX", test_VIDIOC_G_TUNER_U32_MAX },
   { "VIDIOC_G_TUNER with NULL parameter", test_VIDIOC_G_TUNER_NULL },
 
+  { "VIDIOC_S_TUNER", test_VIDIOC_S_TUNER },
+  { "VIDIOC_S_TUNER with invalid index and audmode parameters", test_VIDIOC_S_TUNER_invalid },
+  { "VIDIOC_S_TUNER with NULL parameter", test_VIDIOC_S_TUNER_NULL },
+
   { "VIDIOC_G_MODULATOR", test_VIDIOC_G_MODULATOR },
   { "VIDIOC_G_MODULATOR, index=S32_MAX", test_VIDIOC_G_MODULATOR_S32_MAX },
   { "VIDIOC_G_MODULATOR, index=S32_MAX+1", test_VIDIOC_G_MODULATOR_S32_MAX_1 },
@@ -170,11 +177,28 @@ static CU_TestInfo suite_get_set_try[] =
   { "VIDIOC_S_PRIORITY with NULL parameter", test_VIDIOC_S_PRIORITY_NULL },
 
   { "VIDIOC_G_AUDIO", test_VIDIOC_G_AUDIO },
+  { "VIDIOC_G_AUDIO, ignore index value", test_VIDIOC_G_AUDIO_ignore_index },
   { "VIDIOC_G_AUDIO with NULL parameter", test_VIDIOC_G_AUDIO_NULL },
 
+  { "VIDIOC_S_AUDIO", test_VIDIOC_S_AUDIO },
+  { "VIDIOC_S_AUDIO, index=S32_MAX", test_VIDIOC_S_AUDIO_S32_MAX },
+  { "VIDIOC_S_AUDIO, index=S32_MAX+1", test_VIDIOC_S_AUDIO_S32_MAX_1 },
+  { "VIDIOC_S_AUDIO, index=U32_MAX", test_VIDIOC_S_AUDIO_U32_MAX },
+  { "VIDIOC_S_AUDIO with NULL parameter", test_VIDIOC_S_AUDIO_NULL },
+
   { "VIDIOC_G_AUDOUT", test_VIDIOC_G_AUDOUT },
+  { "VIDIOC_G_AUDOUT, ignore index value", test_VIDIOC_G_AUDOUT_ignore_index },
   { "VIDIOC_G_AUDOUT with NULL parameter", test_VIDIOC_G_AUDOUT_NULL },
 
+  { "VIDIOC_S_AUDOUT", test_VIDIOC_S_AUDOUT },
+  { "VIDIOC_S_AUDOUT, index=S32_MAX", test_VIDIOC_S_AUDOUT_S32_MAX },
+  { "VIDIOC_S_AUDOUT, index=S32_MAX+1", test_VIDIOC_S_AUDOUT_S32_MAX_1 },
+  { "VIDIOC_S_AUDOUT, index=U32_MAX", test_VIDIOC_S_AUDOUT_U32_MAX },
+  { "VIDIOC_S_AUDOUT with NULL parameter", test_VIDIOC_S_AUDOUT_NULL },
+
+  { "VIDIOC_G_CROP", test_VIDIOC_G_CROP },
+  { "VIDIOC_G_CROP with NULL parameter", test_VIDIOC_G_CROP_NULL },
+
   CU_TEST_INFO_NULL,
 };
 
------------------------------------------------------------------------------
Open Source Business Conference (OSBC), March 24-25, 2009, San Francisco, CA
-OSBC tackles the biggest issue in open source: Open Sourcing the Enterprise
-Strategies to boost innovation and cut costs with open source participation
-Receive a $600 discount off the registration fee with the source code: SFAD
http://p.sf.net/sfu/XcvMzF8H
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list

Reply via email to