111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/*
211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * v4l-test: Test environment for Video For Linux Two API
311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 20 Apr 2009  0.5  Added string content validation
511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 18 Apr 2009  0.4  More strict check for strings
611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 28 Mar 2009  0.3  Clean up ret and errno variable names and dprintf() output
711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *  9 Feb 2009  0.2  Added test cases for VIDIOC_S_TUNER;
811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *                   Some typos corrected;
911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *                   Add some debug messages
1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 31 Jan 2009  0.1  First release
1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *
1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Written by M�rton N�meth <nm127@freemail.hu>
1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Released under GPL
1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <stdio.h>
1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <sys/types.h>
1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <sys/stat.h>
1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <fcntl.h>
2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <unistd.h>
2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <sys/ioctl.h>
2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <errno.h>
2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <string.h>
2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <linux/videodev2.h>
2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <linux/errno.h>
2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <CUnit/CUnit.h>
2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include "v4l2_test.h"
3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include "dev_video.h"
3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include "video_limits.h"
3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include "v4l2_validator.h"
3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include "test_VIDIOC_TUNER.h"
3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint valid_tuner_type(enum v4l2_tuner_type type)
3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	int valid = 0;
4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	switch (type) {
4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	case V4L2_TUNER_RADIO:
4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	case V4L2_TUNER_ANALOG_TV:
4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		valid = 1;
4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		break;
4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	default:
4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		valid = 0;
4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	return valid;
5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint valid_tuner_sub(__u32 tuner_sub)
5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	int valid = 0;
5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	CU_ASSERT_EQUAL(V4L2_TUNER_SUB_SAP, V4L2_TUNER_SUB_LANG2);
5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	if ((tuner_sub & ~(V4L2_TUNER_SUB_MONO |
6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			   V4L2_TUNER_SUB_STEREO |
6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			   V4L2_TUNER_SUB_LANG1 |
6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			   V4L2_TUNER_SUB_LANG2 | V4L2_TUNER_SUB_SAP))
6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    == 0) {
6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		valid = 1;
6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	} else {
6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		valid = 0;
6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	return valid;
6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint valid_tuner_audmode(__u32 audmode)
7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	int valid = 0;
7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	CU_ASSERT_EQUAL(V4L2_TUNER_MODE_SAP, V4L2_TUNER_MODE_LANG2);
7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	switch (audmode) {
7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	case V4L2_TUNER_MODE_MONO:
7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	case V4L2_TUNER_MODE_STEREO:
8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	case V4L2_TUNER_MODE_LANG1:
8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	case V4L2_TUNER_MODE_LANG2:
8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	case V4L2_TUNER_MODE_LANG1_LANG2:
8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		valid = 1;
8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		break;
8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	default:
8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		valid = 0;
8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	return valid;
9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstatic int do_get_tuner(int f, __u32 index)
9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	int ret_get, errno_get;
9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	struct v4l2_tuner tuner;
9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	struct v4l2_tuner tuner2;
9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	memset(&tuner, 0xff, sizeof(tuner));
9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	tuner.index = index;
10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	ret_get = ioctl(f, VIDIOC_G_TUNER, &tuner);
10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	errno_get = errno;
10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	dprintf("\t%s:%u: VIDIOC_G_TUNER, ret_get=%i, errno_get=%i\n",
10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		__FILE__, __LINE__, ret_get, errno_get);
10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	if (ret_get == 0) {
10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		CU_ASSERT_EQUAL(ret_get, 0);
10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		CU_ASSERT_EQUAL(tuner.index, index);
11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		CU_ASSERT(0 < strlen((char *)tuner.name));
11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		CU_ASSERT(valid_string((char *)tuner.name, sizeof(tuner.name)));
11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		CU_ASSERT(valid_tuner_type(tuner.type));
11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		CU_ASSERT(valid_tuner_capability(tuner.capability));
11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		CU_ASSERT(tuner.rangelow <= tuner.rangehigh);
11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		CU_ASSERT(valid_tuner_sub(tuner.rxsubchans));
11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		CU_ASSERT(valid_tuner_audmode(tuner.audmode));
12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		/* tuner.signal can have any value */
12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		//CU_ASSERT_EQUAL(tuner.signal, ???);
12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		/* tuner.afc can have any value */
12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		//CU_ASSERT_EQUAL(tuner.afc, ???);
12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		CU_ASSERT_EQUAL(tuner.reserved[0], 0);
12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		CU_ASSERT_EQUAL(tuner.reserved[1], 0);
12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		CU_ASSERT_EQUAL(tuner.reserved[2], 0);
13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		CU_ASSERT_EQUAL(tuner.reserved[3], 0);
13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		/* Check if the unused bytes of the name string are also filled
13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 * with zeros. Also check if there is any padding byte between
13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 * any two fields then this padding byte is also filled with
13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 * zeros.
13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 */
13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		memset(&tuner2, 0, sizeof(tuner2));
13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		tuner2.index = tuner.index;
13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		strncpy((char *)tuner2.name, (char *)tuner.name,
14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			sizeof(tuner2.name));
14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		tuner2.type = tuner.type;
14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		tuner2.capability = tuner.capability;
14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		tuner2.rangelow = tuner.rangelow;
14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		tuner2.rangehigh = tuner.rangehigh;
14511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		tuner2.rxsubchans = tuner.rxsubchans;
14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		tuner2.audmode = tuner.audmode;
14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		tuner2.signal = tuner.signal;
14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		tuner2.afc = tuner.afc;
14911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		CU_ASSERT_EQUAL(memcmp(&tuner, &tuner2, sizeof(tuner)), 0);
15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		dprintf("\ttuner = { "
15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			".index = %u, "
15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			".name = \"%s\", "
15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			".type = %i, "
15511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			".capability = %u, "
15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			".rangelow = %u, "
15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			".rangehigh = %u, "
15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			".rxsubchans = %u, "
15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			".audmode = %u, "
16011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			".signal = %u, "
16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			".afc = %i, "
16211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			".reserved[]={ 0x%X, 0x%X, 0x%X, 0x%X } }\n",
16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			tuner.index,
16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			tuner.name,
16511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			tuner.type,
16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			tuner.capability,
16711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			tuner.rangelow,
16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			tuner.rangehigh,
16911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			tuner.rxsubchans,
17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			tuner.audmode,
17111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			tuner.signal,
17211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			tuner.afc,
17311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			tuner.reserved[0],
17411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			tuner.reserved[1], tuner.reserved[2], tuner.reserved[3]
17511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		    );
17611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
17711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	} else {
17811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		dprintf("\t%s:%u: ret_get=%d (expected %d)\n", __FILE__,
17911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			__LINE__, ret_get, -1);
18011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		dprintf("\t%s:%u: errno_get=%d (expected %d)\n", __FILE__,
18111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			__LINE__, errno_get, EINVAL);
18211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		CU_ASSERT_EQUAL(ret_get, -1);
18311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		CU_ASSERT_EQUAL(errno_get, EINVAL);
18411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
18511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
18611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	return ret_get;
18711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
18811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
18911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid test_VIDIOC_G_TUNER()
19011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
19111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	int ret;
19211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__u32 index;
19311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	int f;
19411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
19511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	f = get_video_fd();
19611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
19711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	index = 0;
19811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	do {
19911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		ret = do_get_tuner(f, index);
20011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		index++;
20111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	} while (ret == 0);
20211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
20311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
20411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
20511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid test_VIDIOC_G_TUNER_S32_MAX()
20611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
20711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	int ret_get, errno_get;
20811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__u32 index;
20911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	struct v4l2_tuner tuner;
21011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
21111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	index = (__u32) S32_MAX;
21211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
21311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	memset(&tuner, 0xff, sizeof(tuner));
21411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	tuner.index = index;
21511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	ret_get = ioctl(get_video_fd(), VIDIOC_G_TUNER, &tuner);
21611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	errno_get = errno;
21711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
21811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	dprintf("\t%s:%u: VIDIOC_G_TUNER, ret_get=%i, errno_get=%i\n",
21911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		__FILE__, __LINE__, ret_get, errno_get);
22011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
22111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	dprintf("\t%s:%u: ret_get=%d (expected %d)\n", __FILE__, __LINE__,
22211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		ret_get, -1);
22311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	dprintf("\t%s:%u: errno_get=%d (expected %d)\n", __FILE__, __LINE__,
22411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		errno_get, EINVAL);
22511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	CU_ASSERT_EQUAL(ret_get, -1);
22611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	CU_ASSERT_EQUAL(errno_get, EINVAL);
22711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
22811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
22911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid test_VIDIOC_G_TUNER_S32_MAX_1()
23011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
23111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	int ret_get, errno_get;
23211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__u32 index;
23311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	struct v4l2_tuner tuner;
23411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
23511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	index = (__u32) S32_MAX + 1;
23611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
23711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	memset(&tuner, 0xff, sizeof(tuner));
23811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	tuner.index = index;
23911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	ret_get = ioctl(get_video_fd(), VIDIOC_G_TUNER, &tuner);
24011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	errno_get = errno;
24111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
24211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	dprintf("\t%s:%u: VIDIOC_G_TUNER, ret_get=%i\n",
24311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		__FILE__, __LINE__, ret_get);
24411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
24511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	dprintf("\t%s:%u: ret_get=%d (expected %d)\n", __FILE__, __LINE__,
24611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		ret_get, -1);
24711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	dprintf("\t%s:%u: errno_get=%d (expected %d)\n", __FILE__, __LINE__,
24811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		errno_get, EINVAL);
24911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	CU_ASSERT_EQUAL(ret_get, -1);
25011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	CU_ASSERT_EQUAL(errno_get, EINVAL);
25111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
25211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
25311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid test_VIDIOC_G_TUNER_U32_MAX()
25411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
25511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	int ret_get, errno_get;
25611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__u32 index;
25711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	struct v4l2_tuner tuner;
25811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
25911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	index = U32_MAX;
26011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
26111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	memset(&tuner, 0xff, sizeof(tuner));
26211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	tuner.index = index;
26311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	ret_get = ioctl(get_video_fd(), VIDIOC_G_TUNER, &tuner);
26411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	errno_get = errno;
26511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
26611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	dprintf("\t%s:%u: VIDIOC_G_TUNER, ret_get=%i, errno_get=%i\n",
26711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		__FILE__, __LINE__, ret_get, errno_get);
26811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
26911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	dprintf("\t%s:%u: ret_get=%d (expected %d)\n", __FILE__, __LINE__,
27011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		ret_get, -1);
27111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	dprintf("\t%s:%u: errno_get=%d (expected %d)\n", __FILE__, __LINE__,
27211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		errno_get, EINVAL);
27311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	CU_ASSERT_EQUAL(ret_get, -1);
27411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	CU_ASSERT_EQUAL(errno_get, EINVAL);
27511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
27611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
27711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid test_VIDIOC_G_TUNER_NULL()
27811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
27911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	int ret_get, errno_get;
28011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	int ret_null, errno_null;
28111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	struct v4l2_tuner tuner;
28211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
28311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	memset(&tuner, 0xff, sizeof(tuner));
28411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	tuner.index = 0;
28511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	ret_get = ioctl(get_video_fd(), VIDIOC_G_TUNER, &tuner);
28611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	errno_get = errno;
28711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	dprintf("\t%s:%u: VIDIOC_G_TUNER: ret_get=%i, errno_get=%i\n",
28811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		__FILE__, __LINE__, ret_get, errno_get);
28911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
29011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	ret_null = ioctl(get_video_fd(), VIDIOC_G_TUNER, NULL);
29111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	errno_null = errno;
29211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
29311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	dprintf("\t%s:%u: VIDIOC_G_TUNER: ret_null=%i, errno_null=%i\n",
29411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		__FILE__, __LINE__, ret_null, errno_null);
29511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
29611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	/* check if VIDIOC_G_TUNER is supported at all or not */
29711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	if (ret_get == 0) {
29811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		/* VIDIOC_G_TUNER is supported, the parameter should be checked */
29911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		CU_ASSERT_EQUAL(ret_get, 0);
30011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		CU_ASSERT_EQUAL(ret_null, -1);
30111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		CU_ASSERT_EQUAL(errno_null, EFAULT);
30211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	} else {
30311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		/* VIDIOC_G_TUNER not supported at all, the parameter should not be evaluated */
30411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		CU_ASSERT_EQUAL(ret_get, -1);
30511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		CU_ASSERT_EQUAL(errno_get, EINVAL);
30611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		CU_ASSERT_EQUAL(ret_null, -1);
30711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		CU_ASSERT_EQUAL(errno_null, EINVAL);
30811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
30911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
31011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
31111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
31211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid do_set_tuner_audmode(__u32 index, __u32 audmode)
31311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
31411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	int ret_set, errno_set;
31511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	struct v4l2_tuner tuner;
31611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
31711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	memset(&tuner, 0xff, sizeof(tuner));
31811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	tuner.index = index;
31911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	tuner.audmode = audmode;
32011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	ret_set = ioctl(get_video_fd(), VIDIOC_S_TUNER, &tuner);
32111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	errno_set = errno;
32211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
32311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	dprintf("\t%s:%u: VIDIOC_S_TUNER: index=%u, audmode=%u, "
32411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		"ret_set=%i (expected %i), errno_set=%i\n",
32511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		__FILE__, __LINE__, index, audmode, ret_set, 0, errno_set);
32611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
32711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	CU_ASSERT_EQUAL(ret_set, 0);
32811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
32911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
33011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
33111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid do_set_tuner_audmode_invalid(__u32 index, __u32 audmode)
33211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
33311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	int ret_set, errno_set;
33411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	struct v4l2_tuner tuner;
33511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
33611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	memset(&tuner, 0xff, sizeof(tuner));
33711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	tuner.index = index;
33811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	tuner.audmode = audmode;
33911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	ret_set = ioctl(get_video_fd(), VIDIOC_S_TUNER, &tuner);
34011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	errno_set = errno;
34111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
34211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	dprintf("\t%s:%u: VIDIOC_S_TUNER: index=%u, audmode=%u, "
34311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		"ret_set=%i (expected %i), errno_set=%i (expected %i)\n",
34411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		__FILE__, __LINE__,
34511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		index, audmode, ret_set, -1, errno_set, EINVAL);
34611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
34711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	CU_ASSERT_EQUAL(ret_set, -1);
34811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	CU_ASSERT_EQUAL(errno_set, EINVAL);
34911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
35011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
35111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid test_VIDIOC_S_TUNER()
35211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
35311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	int ret_get, errno_get;
35411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	int ret_set, errno_set;
35511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	struct v4l2_tuner tuner_orig;
35611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	struct v4l2_tuner tuner_set;
35711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
35811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	/* remember the tuner settings */
35911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	memset(&tuner_orig, 0, sizeof(tuner_orig));
36011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	ret_get = ioctl(get_video_fd(), VIDIOC_G_TUNER, &tuner_orig);
36111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	errno_get = errno;
36211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
36311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	dprintf("\t%s:%u: VIDIOC_G_TUNER, ret_get=%i, errno_get=%i\n",
36411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		__FILE__, __LINE__, ret_get, errno_get);
36511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
36611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	if (ret_get == 0) {
36711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		CU_ASSERT_EQUAL(ret_get, 0);
36811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
36911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		do_set_tuner_audmode(tuner_orig.index, V4L2_TUNER_MODE_MONO);
37011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		do_set_tuner_audmode(tuner_orig.index, V4L2_TUNER_MODE_STEREO);
37111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		do_set_tuner_audmode(tuner_orig.index, V4L2_TUNER_MODE_LANG1);
37211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		do_set_tuner_audmode(tuner_orig.index, V4L2_TUNER_MODE_LANG2);
37311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		do_set_tuner_audmode(tuner_orig.index, V4L2_TUNER_MODE_SAP);
37411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		do_set_tuner_audmode(tuner_orig.index,
37511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert				     V4L2_TUNER_MODE_LANG1_LANG2);
37611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
37711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	} else {
37811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		CU_ASSERT_EQUAL(ret_get, -1);
37911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		CU_ASSERT_EQUAL(errno_get, EINVAL);
38011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
38111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		/* if VIDIOC_G_TUNER is not supported then VIDIOC_S_TUNER shall also
38211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 * not supported.
38311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		 */
38411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		do_set_tuner_audmode_invalid(tuner_orig.index,
38511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					     V4L2_TUNER_MODE_MONO);
38611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		do_set_tuner_audmode_invalid(tuner_orig.index,
38711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					     V4L2_TUNER_MODE_STEREO);
38811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		do_set_tuner_audmode_invalid(tuner_orig.index,
38911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					     V4L2_TUNER_MODE_LANG1);
39011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		do_set_tuner_audmode_invalid(tuner_orig.index,
39111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					     V4L2_TUNER_MODE_LANG2);
39211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		do_set_tuner_audmode_invalid(tuner_orig.index,
39311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					     V4L2_TUNER_MODE_SAP);
39411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		do_set_tuner_audmode_invalid(tuner_orig.index,
39511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					     V4L2_TUNER_MODE_LANG1_LANG2);
39611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
39711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
39811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
39911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	if (ret_get == 0) {
40011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
40111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		/* restore the tuner settings */
40211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		memset(&tuner_set, 0xff, sizeof(tuner_set));
40311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		tuner_set.index = tuner_orig.index;
40411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		tuner_set.audmode = tuner_orig.audmode;
40511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		ret_set = ioctl(get_video_fd(), VIDIOC_S_TUNER, &tuner_orig);
40611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		errno_set = errno;
40711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
40811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		dprintf("\t%s:%u: VIDIOC_S_TUNER, ret_set=%i, errno_set=%i\n",
40911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			__FILE__, __LINE__, ret_set, errno_set);
41011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
41111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		CU_ASSERT_EQUAL(ret_set, 0);
41211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
41311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
41411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
41511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
41611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid test_VIDIOC_S_TUNER_invalid()
41711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
41811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	int ret1, errno1;
41911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	int ret_set, errno_set;
42011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	struct v4l2_tuner tuner_orig;
42111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	struct v4l2_tuner tuner_set;
42211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
42311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	/* remember the tuner settings */
42411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	memset(&tuner_orig, 0, sizeof(tuner_orig));
42511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	ret1 = ioctl(get_video_fd(), VIDIOC_G_TUNER, &tuner_orig);
42611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	errno1 = errno;
42711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
42811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	dprintf("\t%s:%u: VIDIOC_G_TUNER, ret1=%i, errno1=%i\n",
42911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		__FILE__, __LINE__, ret1, errno1);
43011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
43111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	if (ret1 == 0) {
43211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		CU_ASSERT_EQUAL(ret1, 0);
43311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
43411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		/* try with invalid index */
43511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		do_set_tuner_audmode_invalid(tuner_orig.index + 1,
43611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					     V4L2_TUNER_MODE_MONO);
43711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		do_set_tuner_audmode_invalid(tuner_orig.index - 1,
43811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					     V4L2_TUNER_MODE_MONO);
43911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		do_set_tuner_audmode_invalid((__u32) S32_MAX,
44011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					     V4L2_TUNER_MODE_MONO);
44111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		do_set_tuner_audmode_invalid(((__u32) S32_MAX) + 1,
44211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					     V4L2_TUNER_MODE_MONO);
44311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		do_set_tuner_audmode_invalid(U32_MAX, V4L2_TUNER_MODE_MONO);
44411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
44511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		do_set_tuner_audmode_invalid(tuner_orig.index + 1,
44611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					     V4L2_TUNER_MODE_STEREO);
44711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		do_set_tuner_audmode_invalid(tuner_orig.index - 1,
44811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					     V4L2_TUNER_MODE_STEREO);
44911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		do_set_tuner_audmode_invalid((__u32) S32_MAX,
45011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					     V4L2_TUNER_MODE_STEREO);
45111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		do_set_tuner_audmode_invalid(((__u32) S32_MAX) + 1,
45211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					     V4L2_TUNER_MODE_STEREO);
45311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		do_set_tuner_audmode_invalid(U32_MAX, V4L2_TUNER_MODE_STEREO);
45411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
45511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		do_set_tuner_audmode_invalid(tuner_orig.index + 1,
45611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					     V4L2_TUNER_MODE_LANG1);
45711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		do_set_tuner_audmode_invalid(tuner_orig.index - 1,
45811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					     V4L2_TUNER_MODE_LANG1);
45911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		do_set_tuner_audmode_invalid((__u32) S32_MAX,
46011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					     V4L2_TUNER_MODE_LANG1);
46111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		do_set_tuner_audmode_invalid(((__u32) S32_MAX) + 1,
46211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					     V4L2_TUNER_MODE_LANG1);
46311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		do_set_tuner_audmode_invalid(U32_MAX, V4L2_TUNER_MODE_LANG1);
46411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
46511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		do_set_tuner_audmode_invalid(tuner_orig.index + 1,
46611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					     V4L2_TUNER_MODE_LANG2);
46711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		do_set_tuner_audmode_invalid(tuner_orig.index - 1,
46811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					     V4L2_TUNER_MODE_LANG2);
46911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		do_set_tuner_audmode_invalid((__u32) S32_MAX,
47011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					     V4L2_TUNER_MODE_LANG2);
47111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		do_set_tuner_audmode_invalid(((__u32) S32_MAX) + 1,
47211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					     V4L2_TUNER_MODE_LANG2);
47311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		do_set_tuner_audmode_invalid(U32_MAX, V4L2_TUNER_MODE_LANG2);
47411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
47511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		do_set_tuner_audmode_invalid(tuner_orig.index + 1,
47611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					     V4L2_TUNER_MODE_SAP);
47711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		do_set_tuner_audmode_invalid(tuner_orig.index - 1,
47811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					     V4L2_TUNER_MODE_SAP);
47911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		do_set_tuner_audmode_invalid((__u32) S32_MAX,
48011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					     V4L2_TUNER_MODE_SAP);
48111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		do_set_tuner_audmode_invalid(((__u32) S32_MAX) + 1,
48211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					     V4L2_TUNER_MODE_SAP);
48311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		do_set_tuner_audmode_invalid(U32_MAX, V4L2_TUNER_MODE_SAP);
48411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
48511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		do_set_tuner_audmode_invalid(tuner_orig.index + 1,
48611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					     V4L2_TUNER_MODE_LANG1_LANG2);
48711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		do_set_tuner_audmode_invalid(tuner_orig.index - 1,
48811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					     V4L2_TUNER_MODE_LANG1_LANG2);
48911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		do_set_tuner_audmode_invalid((__u32) S32_MAX,
49011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					     V4L2_TUNER_MODE_LANG1_LANG2);
49111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		do_set_tuner_audmode_invalid(((__u32) S32_MAX) + 1,
49211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					     V4L2_TUNER_MODE_LANG1_LANG2);
49311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		do_set_tuner_audmode_invalid(U32_MAX,
49411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					     V4L2_TUNER_MODE_LANG1_LANG2);
49511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
49611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	} else {
49711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		CU_ASSERT_EQUAL(ret1, -1);
49811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		CU_ASSERT_EQUAL(errno1, EINVAL);
49911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
50011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
50111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
50211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	/* try with invalid audmode */
50311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	do_set_tuner_audmode_invalid(tuner_orig.index, 5);
50411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	do_set_tuner_audmode_invalid(tuner_orig.index, (__u32) S32_MAX);
50511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	do_set_tuner_audmode_invalid(tuner_orig.index, ((__u32) S32_MAX) + 1);
50611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	do_set_tuner_audmode_invalid(tuner_orig.index, U32_MAX);
50711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
50811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	if (ret1 == 0) {
50911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
51011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		/* restore the tuner settings */
51111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		memset(&tuner_set, 0xff, sizeof(tuner_set));
51211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		tuner_set.index = tuner_orig.index;
51311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		tuner_set.audmode = tuner_orig.audmode;
51411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		ret_set = ioctl(get_video_fd(), VIDIOC_S_TUNER, &tuner_orig);
51511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		errno_set = errno;
51611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
51711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		dprintf("\t%s:%u: VIDIOC_S_TUNER, ret_set=%i, errno_set=%i\n",
51811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			__FILE__, __LINE__, ret_set, errno_set);
51911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
52011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		CU_ASSERT_EQUAL(ret_set, 0);
52111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
52211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
52311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
52411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
52511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid test_VIDIOC_S_TUNER_NULL()
52611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
52711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	int ret_orig, errno_orig;
52811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	int ret_null, errno_null;
52911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	int ret_set, errno_set;
53011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	struct v4l2_tuner tuner_orig;
53111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	struct v4l2_tuner tuner;
53211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
53311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	/* remember the tuner settings */
53411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	memset(&tuner_orig, 0, sizeof(tuner_orig));
53511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	ret_orig = ioctl(get_video_fd(), VIDIOC_G_TUNER, &tuner_orig);
53611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	errno_orig = errno;
53711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
53811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	dprintf("\t%s:%u: VIDIOC_G_TUNER, ret_orig=%i, errno_orig=%i\n",
53911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		__FILE__, __LINE__, ret_orig, errno_orig);
54011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
54111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	memset(&tuner, 0, sizeof(tuner));
54211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	tuner.index = tuner_orig.index;
54311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	tuner.audmode = tuner_orig.audmode;
54411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	ret_set = ioctl(get_video_fd(), VIDIOC_S_TUNER, &tuner);
54511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	errno_set = errno;
54611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
54711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	dprintf("\t%s:%u:VIDIOC_S_TUNER: ret_set=%i, errno_set=%i\n",
54811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		__FILE__, __LINE__, ret_set, errno_set);
54911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
55011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	ret_null = ioctl(get_video_fd(), VIDIOC_S_TUNER, NULL);
55111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	errno_null = errno;
55211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
55311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	dprintf("\t%s:%u:VIDIOC_S_TUNER: ret_null=%i, errno_null=%i\n",
55411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		__FILE__, __LINE__, ret_set, errno_set);
55511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
55611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	if (ret_set == 0) {
55711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		CU_ASSERT_EQUAL(ret_set, 0);
55811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		CU_ASSERT_EQUAL(ret_null, -1);
55911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		CU_ASSERT_EQUAL(errno_null, EFAULT);
56011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	} else {
56111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		CU_ASSERT_EQUAL(ret_set, -1);
56211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		CU_ASSERT_EQUAL(errno_set, EINVAL);
56311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		CU_ASSERT_EQUAL(ret_null, -1);
56411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		CU_ASSERT_EQUAL(errno_null, EINVAL);
56511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
56611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
56711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
56811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert