1a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak/*
2a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak * v4l-test: Test environment for Video For Linux Two API
3a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak *
4c5d954a63f66d1ccf79ba9b92311fa7b57f0a895subrata_modak * 18 Apr 2009  0.4  More cleanup in frequency scan test case
5c5d954a63f66d1ccf79ba9b92311fa7b57f0a895subrata_modak * 28 Mar 2009  0.3  Clean up ret and errno variable names and dprintf() output
645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak *  1 Feb 2009  0.2  Added test cases for VIDIOC_S_FREQUENCY
7a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak * 31 Jan 2009  0.1  First release
8a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak *
9a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak * Written by M�rton N�meth <nm127@freemail.hu>
10a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak * Released under GPL
11a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak */
12a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak
13a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak#include <stdio.h>
14a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak#include <sys/types.h>
15a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak#include <sys/stat.h>
16a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak#include <fcntl.h>
17a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak#include <unistd.h>
18a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak#include <sys/ioctl.h>
19a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak#include <errno.h>
20a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak#include <string.h>
21a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak
22a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak#include <linux/videodev2.h>
23a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak#include <linux/errno.h>
24a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak
25a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak#include <CUnit/CUnit.h>
26a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak
27a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak#include "v4l2_test.h"
28a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak#include "dev_video.h"
29a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak#include "video_limits.h"
30a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak
31a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak#include "test_VIDIOC_FREQUENCY.h"
32a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak
33354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid test_VIDIOC_G_FREQUENCY()
34354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao{
35c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	int ret_get, errno_get;
36a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak	__u32 tuner;
37a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak	struct v4l2_frequency freq;
38a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak
39a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak	tuner = 0;
40a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak
41a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak	memset(&freq, 0xff, sizeof(freq));
42a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak	freq.tuner = tuner;
43c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	ret_get = ioctl(get_video_fd(), VIDIOC_G_FREQUENCY, &freq);
44c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	errno_get = errno;
45c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak
46c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	dprintf("\t%s:%u: VIDIOC_G_FREQUENCY, ret_get=%i, errno_get=%i\n",
47c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		__FILE__, __LINE__, ret_get, errno_get);
48a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak
49c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	if (ret_get == 0) {
50c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(ret_get, 0);
51a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak
52a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak		CU_ASSERT_EQUAL(freq.tuner, tuner);
53a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak
54a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak		//CU_ASSERT(freq.type, ???);
55a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak		//CU_ASSERT_EQUAL(freq.frequency, ???);
56a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak
57a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak		CU_ASSERT_EQUAL(freq.reserved[0], 0);
58a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak		CU_ASSERT_EQUAL(freq.reserved[1], 0);
59a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak		CU_ASSERT_EQUAL(freq.reserved[2], 0);
60a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak		CU_ASSERT_EQUAL(freq.reserved[3], 0);
61a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak		CU_ASSERT_EQUAL(freq.reserved[4], 0);
62a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak		CU_ASSERT_EQUAL(freq.reserved[5], 0);
63a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak		CU_ASSERT_EQUAL(freq.reserved[6], 0);
64a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak		CU_ASSERT_EQUAL(freq.reserved[7], 0);
65a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak
66a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak		dprintf("\tfreq = { "
67a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak			".tuner = %u, "
68a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak			".type = 0x%X, "
69a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak			".frequency = %u "
70a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak			".reserved[]={ 0x%X, 0x%X, 0x%X, 0x%X, 0x%X, 0x%X, 0x%X, 0x%X } }\n",
71a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak			freq.tuner,
72a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak			freq.type,
73a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak			freq.frequency,
74a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak			freq.reserved[0],
75a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak			freq.reserved[1],
76a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak			freq.reserved[2],
77a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak			freq.reserved[3],
78a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak			freq.reserved[4],
79354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			freq.reserved[5], freq.reserved[6], freq.reserved[7]
80354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		    );
81a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak	} else {
82c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(ret_get, -1);
83c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(errno_get, EINVAL);
84a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak	}
85a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak
86a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak}
87a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak
88354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid test_VIDIOC_G_FREQUENCY_S32_MAX()
89354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao{
90c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	int ret_get, errno_get;
91a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak	__u32 tuner;
92a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak	struct v4l2_frequency freq;
93a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak
94354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	tuner = (__u32) S32_MAX;
95a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak
96a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak	memset(&tuner, 0xff, sizeof(tuner));
97a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak	freq.tuner = tuner;
98c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	ret_get = ioctl(get_video_fd(), VIDIOC_G_FREQUENCY, &freq);
99c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	errno_get = errno;
100a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak
101c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	dprintf("\t%s:%u: VIDIOC_G_FREQUENCY, ret_get=%i, errno_get=%i\n",
102c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		__FILE__, __LINE__, ret_get, errno_get);
103a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak
104c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	CU_ASSERT_EQUAL(ret_get, -1);
105c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	CU_ASSERT_EQUAL(errno_get, EINVAL);
106a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak}
107a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak
108354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid test_VIDIOC_G_FREQUENCY_S32_MAX_1()
109354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao{
110c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	int ret_get, errno_get;
111a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak	__u32 tuner;
112a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak	struct v4l2_frequency freq;
113a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak
114354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	tuner = (__u32) S32_MAX + 1;
115a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak
116a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak	memset(&tuner, 0xff, sizeof(tuner));
117a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak	freq.tuner = tuner;
118c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	ret_get = ioctl(get_video_fd(), VIDIOC_G_FREQUENCY, &freq);
119c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	errno_get = errno;
120a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak
121c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	dprintf("\t%s:%u: VIDIOC_G_FREQUENCY, ret_get=%i, errno_get=%i\n",
122c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		__FILE__, __LINE__, ret_get, errno_get);
123a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak
124c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	CU_ASSERT_EQUAL(ret_get, -1);
125c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	CU_ASSERT_EQUAL(errno_get, EINVAL);
126a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak}
127a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak
128354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid test_VIDIOC_G_FREQUENCY_U32_MAX()
129354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao{
130c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	int ret_get, errno_get;
131a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak	__u32 tuner;
132a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak	struct v4l2_frequency freq;
133a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak
134a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak	tuner = U32_MAX;
135a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak
136a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak	memset(&tuner, 0xff, sizeof(tuner));
137a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak	freq.tuner = tuner;
138c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	ret_get = ioctl(get_video_fd(), VIDIOC_G_FREQUENCY, &freq);
139c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	errno_get = errno;
140a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak
141c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	dprintf("\t%s:%u: VIDIOC_G_FREQUENCY, ret_get=%i, errno_get=%i\n",
142c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		__FILE__, __LINE__, ret_get, errno_get);
143a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak
144c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	CU_ASSERT_EQUAL(ret_get, -1);
145c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	CU_ASSERT_EQUAL(errno_get, EINVAL);
146a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak}
147a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak
148354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid test_VIDIOC_G_FREQUENCY_NULL()
149354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao{
150c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	int ret_get, errno_get;
151c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	int ret_null, errno_null;
152a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak	struct v4l2_frequency freq;
153c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	__u32 tuner;
154c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak
155c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	tuner = 0;
156a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak
157a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak	memset(&freq, 0xff, sizeof(freq));
158c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	freq.tuner = tuner;
159c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	freq.type = V4L2_TUNER_ANALOG_TV;
160c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	ret_get = ioctl(get_video_fd(), VIDIOC_G_FREQUENCY, &freq);
161c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	errno_get = errno;
162a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak
163c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	dprintf("\t%s:%u: VIDIOC_G_FREQUENCY, ret_get=%i, errno_get=%i\n",
164c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		__FILE__, __LINE__, ret_get, errno_get);
165a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak
166c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	ret_null = ioctl(get_video_fd(), VIDIOC_G_FREQUENCY, NULL);
167c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	errno_null = errno;
168a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak
169c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	dprintf("\t%s:%u: VIDIOC_G_FREQUENCY, ret_null=%i, errno_null=%i\n",
170c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		__FILE__, __LINE__, ret_null, errno_null);
171c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak
172c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	/* check if VIDIOC_G_FREQUENCY is supported at all or not */
173c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	if (ret_get == 0) {
174a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak		/* VIDIOC_G_FREQUENCY is supported, the parameter should be checked */
175c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(ret_null, -1);
176c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(errno_null, EFAULT);
177c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	} else {
178c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		/* VIDIOC_G_FREQUENCY not supported at all, the parameter should not be evaluated */
179c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(ret_null, -1);
180c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(errno_null, EINVAL);
181a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak	}
182a8416d4639a5ea638dc4fc62c3f05512cd91e247subrata_modak}
18345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
184354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid test_VIDIOC_S_FREQUENCY()
185354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao{
186c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	int ret_get, errno_get;
187c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	int ret_set, errno_set;
18845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	__u32 tuner;
18945246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	struct v4l2_frequency orig_freq;
19045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	struct v4l2_frequency freq;
19145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	struct v4l2_frequency new_freq;
19245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
19345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	tuner = 0;
19445246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
19545246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	/* fetch the current frequency setting */
19645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	memset(&orig_freq, 0xff, sizeof(orig_freq));
19745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	orig_freq.tuner = tuner;
198c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	ret_get = ioctl(get_video_fd(), VIDIOC_G_FREQUENCY, &orig_freq);
199c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	errno_get = errno;
20045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
201c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	dprintf("\t%s:%u: VIDIOC_G_FREQUENCY, ret_get=%i, errno_get=%i\n",
202c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		__FILE__, __LINE__, ret_get, errno_get);
20345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
204c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	if (ret_get == 0) {
20545246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		CU_ASSERT_EQUAL(orig_freq.tuner, tuner);
20645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
20745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		/* try to set the frequency again to the actual value */
20845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		memset(&freq, 0xff, sizeof(freq));
20945246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		freq.tuner = tuner;
21045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		freq.frequency = orig_freq.frequency;
21145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		freq.type = V4L2_TUNER_ANALOG_TV;
212c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		ret_set = ioctl(get_video_fd(), VIDIOC_S_FREQUENCY, &orig_freq);
213c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		errno_set = errno;
21445246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
215354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		dprintf
216354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		    ("\t%s:%u: VIDIOC_S_FREQUENCY, ret_set=%i, errno_set=%i\n",
217354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		     __FILE__, __LINE__, ret_set, errno_set);
21845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
219c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(ret_set, 0);
220c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		if (ret_set == 0) {
22145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
22245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			/* check wheteher the frequency has not been changed */
22345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			memset(&new_freq, 0xff, sizeof(new_freq));
22445246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			new_freq.tuner = tuner;
225354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			ret_get =
226354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    ioctl(get_video_fd(), VIDIOC_G_FREQUENCY,
227354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				  &new_freq);
228c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak			errno_get = errno;
22945246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
230354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			dprintf
231354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    ("\t%s:%u: VIDIOC_G_FREQUENCY, ret_get=%i, errno_get=%i\n",
232354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			     __FILE__, __LINE__, ret_get, errno_get);
23345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
234c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak			CU_ASSERT_EQUAL(ret_get, 0);
235c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak			if (ret_get == 0) {
236354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				dprintf
237354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    ("\t%s:%u: current frequency=%u (expected %u)\n",
238354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				     __FILE__, __LINE__, new_freq.frequency,
239354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				     orig_freq.frequency);
240354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				CU_ASSERT_EQUAL(new_freq.frequency,
241354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						orig_freq.frequency);
24245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			}
24345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
24445246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		}
24545246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
24645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	} else {
247c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(ret_get, -1);
248c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(errno_get, EINVAL);
24945246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
25045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		/* VIDIOC_G_FREQUENCY not supported, so shall be VIDIOC_S_FREQUENCY */
25145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
25245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		memset(&freq, 0, sizeof(freq));
25345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		freq.tuner = tuner;
25445246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		freq.type = V4L2_TUNER_ANALOG_TV;
25545246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		freq.frequency = 0;
256c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		ret_set = ioctl(get_video_fd(), VIDIOC_S_FREQUENCY, &freq);
257c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		errno_set = errno;
25845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
259354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		dprintf
260354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		    ("\t%s:%u: VIDIOC_S_FREQUENCY, ret_set=%i, errno_set=%i\n",
261354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		     __FILE__, __LINE__, ret_set, errno_set);
26245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
263c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(ret_set, -1);
264c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(errno_set, EINVAL);
26545246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
26645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	}
26745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
26845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak}
26945246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
270354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid test_VIDIOC_S_FREQUENCY_boundaries()
271354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao{
27245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	int ret_g_tuner = 0;
27345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	int ret_g_freq = 0;
27445246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	int errno_g_tuner = 0;
27545246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	int errno_g_freq = 0;
27645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	int ret;
27745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	__u32 index;
27845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	struct v4l2_frequency orig_freq;
27945246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	struct v4l2_frequency freq;
28045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	struct v4l2_frequency new_freq;
28145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	struct v4l2_tuner tuner;
28245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
28345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	/* this test case depends on working VIDIOC_G_TUNER and VIDIOC_G_FREQUENCY commands */
28445246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
28545246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	index = 0;
28645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
28745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	/* fetch the minimum (tuner.rangelow) and maximum (tuner.rangehigh) frequency */
28845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	memset(&tuner, 0xff, sizeof(tuner));
28945246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	tuner.index = index;
29045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	ret_g_tuner = ioctl(get_video_fd(), VIDIOC_G_TUNER, &tuner);
29145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	errno_g_tuner = errno;
29245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
293354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	dprintf
294354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	    ("\t%s:%u: VIDIOC_G_TUNER, ret=%i, tuner.rangelow=%u, tuner.rangehigh=%u\n",
295354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	     __FILE__, __LINE__, ret_g_tuner, tuner.rangelow, tuner.rangehigh);
29645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	CU_ASSERT_EQUAL(tuner.index, index);
29745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
29845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	/* fetch the current frequency setting */
29945246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	memset(&orig_freq, 0xff, sizeof(orig_freq));
30045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	orig_freq.tuner = index;
30145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	ret_g_freq = ioctl(get_video_fd(), VIDIOC_G_FREQUENCY, &orig_freq);
30245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	errno_g_freq = errno;
30345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
304354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	dprintf
305354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	    ("\t%s:%u: VIDIOC_G_FREQUENCY, ret_g_freq=%i, orig_freq.frequency=%u\n",
306354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	     __FILE__, __LINE__, ret_g_freq, orig_freq.frequency);
30745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	CU_ASSERT_EQUAL(orig_freq.tuner, index);
30845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
30945246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	if (ret_g_tuner == 0 && ret_g_freq == 0) {
31045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		CU_ASSERT_EQUAL(orig_freq.tuner, index);
31145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
31245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		/* try to set the frequency to zero */
31345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		memset(&freq, 0xff, sizeof(freq));
31445246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		freq.tuner = index;
31545246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		freq.type = orig_freq.type;
31645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		freq.frequency = 0;
31745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		ret = ioctl(get_video_fd(), VIDIOC_S_FREQUENCY, &freq);
318c5d954a63f66d1ccf79ba9b92311fa7b57f0a895subrata_modak		dprintf("\t%s:%u: set to %u: VIDIOC_S_FREQUENCY, ret=%i\n",
319354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			__FILE__, __LINE__, 0, ret);
32045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
32145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		CU_ASSERT_EQUAL(ret, 0);
32245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		if (ret == 0) {
32345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
32445246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			/* check wheteher the frequency has been changed to the lowest
32545246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			 * possible value
32645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			 */
32745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			memset(&new_freq, 0xff, sizeof(new_freq));
32845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			new_freq.tuner = index;
329354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			ret =
330354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    ioctl(get_video_fd(), VIDIOC_G_FREQUENCY,
331354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				  &new_freq);
33245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
333354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			dprintf
334354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    ("\t%s:%u: VIDIOC_G_FREQUENCY, ret=%i, new_freq.frequency=%u\n",
335354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			     __FILE__, __LINE__, ret, new_freq.frequency);
33645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
33745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			CU_ASSERT_EQUAL(ret, 0);
33845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			if (ret == 0) {
339354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				CU_ASSERT_EQUAL(new_freq.frequency,
340354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						tuner.rangelow);
34145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			}
34245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		}
34345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
34445246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		/* try to set the frequency to tuner.rangelow-1, if applicable */
34545246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		if (0 < tuner.rangelow) {
34645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			memset(&freq, 0xff, sizeof(freq));
34745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			freq.tuner = index;
34845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			freq.type = orig_freq.type;
349354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			freq.frequency = tuner.rangelow - 1;
35045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			ret = ioctl(get_video_fd(), VIDIOC_S_FREQUENCY, &freq);
35145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
352354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			dprintf
353354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    ("\t%s:%u: set to %u: VIDIOC_S_FREQUENCY, ret=%i\n",
354354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			     __FILE__, __LINE__, tuner.rangelow - 1, ret);
35545246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
35645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			CU_ASSERT_EQUAL(ret, 0);
35745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			if (ret == 0) {
35845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
35945246f90c20c93f3e3539627e078196af4a0eae2subrata_modak				/* check wheteher the frequency has been changed to the lowest
36045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak				 * possible value
36145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak				 */
36245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak				memset(&new_freq, 0xff, sizeof(new_freq));
36345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak				new_freq.tuner = index;
364354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				ret =
365354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    ioctl(get_video_fd(), VIDIOC_G_FREQUENCY,
366354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					  &new_freq);
367354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
368354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				dprintf
369354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    ("\t%s:%u: VIDIOC_G_FREQUENCY, ret=%i, new_freq.frequency=%u\n",
370354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				     __FILE__, __LINE__, ret,
371354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				     new_freq.frequency);
37245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak				CU_ASSERT_EQUAL(ret, 0);
37345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak				if (ret == 0) {
374354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					dprintf
375354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    ("\t%s:%u: current frequency=%u (expected %u)\n",
376354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					     __FILE__, __LINE__,
377354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					     new_freq.frequency,
378354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					     tuner.rangelow);
379354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					CU_ASSERT_EQUAL(new_freq.frequency,
380354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							tuner.rangelow);
38145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak				}
38245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			}
38345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		}
38445246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
38545246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		/* try to set the frequency to tuner.rangelow */
38645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		memset(&freq, 0xff, sizeof(freq));
38745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		freq.tuner = index;
38845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		freq.type = orig_freq.type;
38945246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		freq.frequency = tuner.rangelow;
39045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		ret = ioctl(get_video_fd(), VIDIOC_S_FREQUENCY, &freq);
39145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
392c5d954a63f66d1ccf79ba9b92311fa7b57f0a895subrata_modak		dprintf("\t%s:%u: set to %u: VIDIOC_S_FREQUENCY, ret=%i\n",
393354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			__FILE__, __LINE__, tuner.rangelow, ret);
39445246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
39545246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		CU_ASSERT_EQUAL(ret, 0);
39645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		if (ret == 0) {
39745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
39845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			/* check wheteher the frequency has been changed to the lowest
39945246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			 * possible value
40045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			 */
40145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			memset(&new_freq, 0xff, sizeof(new_freq));
40245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			new_freq.tuner = index;
403354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			ret =
404354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    ioctl(get_video_fd(), VIDIOC_G_FREQUENCY,
405354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				  &new_freq);
40645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
407354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			dprintf
408354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    ("\t%s:%u: VIDIOC_G_FREQUENCY, ret=%i, new_freq.frequency=%u\n",
409354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			     __FILE__, __LINE__, ret, new_freq.frequency);
41045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
41145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			CU_ASSERT_EQUAL(ret, 0);
41245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			if (ret == 0) {
413354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				dprintf
414354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    ("\t%s:%u: current frequency=%u (expected %u)\n",
415354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				     __FILE__, __LINE__, new_freq.frequency,
416354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				     tuner.rangelow);
417354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				CU_ASSERT_EQUAL(new_freq.frequency,
418354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						tuner.rangelow);
41945246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			}
42045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		}
42145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
42245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		/* try to set the frequency to tuner.rangehigh */
42345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		memset(&freq, 0xff, sizeof(freq));
42445246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		freq.tuner = index;
42545246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		freq.type = orig_freq.type;
42645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		freq.frequency = tuner.rangehigh;
42745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		ret = ioctl(get_video_fd(), VIDIOC_S_FREQUENCY, &freq);
42845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
429c5d954a63f66d1ccf79ba9b92311fa7b57f0a895subrata_modak		dprintf("\t%s:%u: set to %u: VIDIOC_S_FREQUENCY, ret=%i\n",
430354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			__FILE__, __LINE__, tuner.rangehigh, ret);
43145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
43245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		CU_ASSERT_EQUAL(ret, 0);
43345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		if (ret == 0) {
43445246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
43545246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			/* check wheteher the frequency has been changed to the highest
43645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			 * possible value
43745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			 */
43845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			memset(&new_freq, 0xff, sizeof(new_freq));
43945246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			new_freq.tuner = index;
440354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			ret =
441354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    ioctl(get_video_fd(), VIDIOC_G_FREQUENCY,
442354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				  &new_freq);
44345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
444354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			dprintf
445354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    ("\t%s:%u: VIDIOC_G_FREQUENCY, ret=%i, new_freq.frequency=%u\n",
446354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			     __FILE__, __LINE__, ret, new_freq.frequency);
44745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
44845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			CU_ASSERT_EQUAL(ret, 0);
44945246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			if (ret == 0) {
450354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				dprintf
451354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    ("\t%s:%u: current frequency=%u (expected %u)\n",
452354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				     __FILE__, __LINE__, new_freq.frequency,
453354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				     tuner.rangehigh);
454354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				CU_ASSERT_EQUAL(new_freq.frequency,
455354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						tuner.rangehigh);
45645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			}
45745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		}
45845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
45945246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		/* try to set the frequency to tuner.rangehigh+1, if applicable */
46045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		if (tuner.rangehigh < U32_MAX) {
46145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			memset(&freq, 0xff, sizeof(freq));
46245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			freq.tuner = index;
46345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			freq.type = orig_freq.type;
464354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			freq.frequency = tuner.rangehigh + 1;
46545246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			ret = ioctl(get_video_fd(), VIDIOC_S_FREQUENCY, &freq);
46645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
467354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			dprintf
468354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    ("\t%s:%u: set to %u: VIDIOC_S_FREQUENCY, ret=%i\n",
469354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			     __FILE__, __LINE__, tuner.rangehigh + 1, ret);
47045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
47145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			CU_ASSERT_EQUAL(ret, 0);
47245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			if (ret == 0) {
47345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
47445246f90c20c93f3e3539627e078196af4a0eae2subrata_modak				/* check wheteher the frequency has been changed to the highest
47545246f90c20c93f3e3539627e078196af4a0eae2subrata_modak				 * possible value
47645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak				 */
47745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak				memset(&new_freq, 0xff, sizeof(new_freq));
47845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak				new_freq.tuner = index;
479354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				ret =
480354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    ioctl(get_video_fd(), VIDIOC_G_FREQUENCY,
481354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					  &new_freq);
48245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
483354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				dprintf
484354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    ("\t%s:%u: VIDIOC_G_FREQUENCY, ret=%i, new_freq.frequency=%u\n",
485354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				     __FILE__, __LINE__, ret,
486354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				     new_freq.frequency);
48745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
48845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak				CU_ASSERT_EQUAL(ret, 0);
48945246f90c20c93f3e3539627e078196af4a0eae2subrata_modak				if (ret == 0) {
490354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					dprintf
491354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    ("\t%s:%u: current frequency=%u (expected %u)\n",
492354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					     __FILE__, __LINE__,
493354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					     new_freq.frequency,
494354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					     tuner.rangehigh);
495354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					CU_ASSERT_EQUAL(new_freq.frequency,
496354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							tuner.rangehigh);
49745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak				}
49845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			}
49945246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		}
50045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
50145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		/* try to set the frequency to U32_MAX */
50245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		memset(&freq, 0xff, sizeof(freq));
50345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		freq.tuner = index;
50445246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		freq.type = orig_freq.type;
50545246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		freq.frequency = U32_MAX;
50645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		ret = ioctl(get_video_fd(), VIDIOC_S_FREQUENCY, &freq);
50745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
508c5d954a63f66d1ccf79ba9b92311fa7b57f0a895subrata_modak		dprintf("\t%s:%u: set to %u: VIDIOC_S_FREQUENCY, ret=%i\n",
509354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			__FILE__, __LINE__, U32_MAX, ret);
51045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		CU_ASSERT_EQUAL(ret, 0);
51145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		if (ret == 0) {
51245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
51345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			/* check wheteher the frequency has been changed to the highest
51445246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			 * possible value
51545246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			 */
51645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			memset(&new_freq, 0xff, sizeof(new_freq));
51745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			new_freq.tuner = index;
518354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			ret =
519354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    ioctl(get_video_fd(), VIDIOC_G_FREQUENCY,
520354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				  &new_freq);
52145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
522354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			dprintf
523354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    ("\t%s:%u: VIDIOC_G_FREQUENCY, ret=%i, new_freq.frequency=%u\n",
524354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			     __FILE__, __LINE__, ret, new_freq.frequency);
52545246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
52645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			CU_ASSERT_EQUAL(ret, 0);
52745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			if (ret == 0) {
528354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				dprintf
529354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    ("\t%s:%u: current frequency=%u (expected %u)\n",
530354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				     __FILE__, __LINE__, new_freq.frequency,
531354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				     tuner.rangehigh);
532354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				CU_ASSERT_EQUAL(new_freq.frequency,
533354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						tuner.rangehigh);
53445246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			}
53545246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		}
53645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
53745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		/* try restore the original frequency settings */
53845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		memset(&freq, 0xff, sizeof(freq));
53945246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		freq.tuner = index;
54045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		freq.type = orig_freq.type;
54145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		freq.frequency = orig_freq.frequency;
54245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		ret = ioctl(get_video_fd(), VIDIOC_S_FREQUENCY, &freq);
54345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
544c5d954a63f66d1ccf79ba9b92311fa7b57f0a895subrata_modak		dprintf("\t%s:%u: set to %u: VIDIOC_S_FREQUENCY, ret=%i\n",
545354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			__FILE__, __LINE__, orig_freq.frequency, ret);
54645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
54745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		CU_ASSERT_EQUAL(ret, 0);
54845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		if (ret == 0) {
54945246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
55045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			/* check wheteher the frequency has been restored */
55145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			memset(&new_freq, 0xff, sizeof(new_freq));
55245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			new_freq.tuner = index;
553354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			ret =
554354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    ioctl(get_video_fd(), VIDIOC_G_FREQUENCY,
555354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				  &new_freq);
55645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
557354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			dprintf
558354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    ("\t%s:%u: VIDIOC_G_FREQUENCY, ret=%i, new_freq.frequency=%u\n",
559354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			     __FILE__, __LINE__, ret, new_freq.frequency);
56045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
56145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			CU_ASSERT_EQUAL(ret, 0);
56245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			if (ret == 0) {
563354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				dprintf
564354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    ("\t%s:%u: current frequency=%u (expected %u)\n",
565354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				     __FILE__, __LINE__, new_freq.frequency,
566354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				     orig_freq.frequency);
567354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				CU_ASSERT_EQUAL(new_freq.frequency,
568354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						orig_freq.frequency);
56945246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			}
57045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		}
57145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	}
57245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
57345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	if (ret_g_freq != 0) {
574354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		dprintf("\t%s:%u: ret_g_freq=%d (expected %d)\n", __FILE__,
575354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			__LINE__, ret_g_freq, -1);
576354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		dprintf("\t%s:%u: errno_g_freq=%d (expected %d)\n", __FILE__,
577354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			__LINE__, errno_g_freq, EINVAL);
57845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		CU_ASSERT_EQUAL(ret_g_freq, -1);
57945246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		CU_ASSERT_EQUAL(errno, EINVAL);
58045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	}
58145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
58245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	if (ret_g_tuner != 0) {
583354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		dprintf("\t%s:%u: ret_g_tuner=%d (expected %d)\n", __FILE__,
584354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			__LINE__, ret_g_tuner, -1);
585354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		dprintf("\t%s:%u: errno_g_tuner=%d (expected %d)\n", __FILE__,
586354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			__LINE__, errno_g_tuner, EINVAL);
58745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		CU_ASSERT_EQUAL(ret_g_tuner, -1);
58845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		CU_ASSERT_EQUAL(errno, EINVAL);
58945246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	}
59045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
59145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak}
59245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
593354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid test_VIDIOC_S_FREQUENCY_scan()
594354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao{
595c5d954a63f66d1ccf79ba9b92311fa7b57f0a895subrata_modak	int ret_g_tuner, errno_g_tuner;
596c5d954a63f66d1ccf79ba9b92311fa7b57f0a895subrata_modak	int ret_g_freq, errno_g_freq;
597c5d954a63f66d1ccf79ba9b92311fa7b57f0a895subrata_modak	int ret_get, errno_get;
598c5d954a63f66d1ccf79ba9b92311fa7b57f0a895subrata_modak	int ret_set, errno_set;
59945246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	__u32 index;
60045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	struct v4l2_frequency orig_freq;
60145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	struct v4l2_frequency freq;
60245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	struct v4l2_frequency new_freq;
60345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	struct v4l2_frequency prev_freq;
60445246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	struct v4l2_tuner tuner;
60545246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	__u32 i;
60645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
60745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	/* this test case depends on working VIDIOC_G_FREQUENCY command */
60845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
60945246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	index = 0;
61045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
61145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	/* fetch the minimum (tuner.rangelow) and maximum (tuner.rangehigh) frequency */
61245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	memset(&tuner, 0xff, sizeof(tuner));
61345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	tuner.index = index;
61445246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	ret_g_tuner = ioctl(get_video_fd(), VIDIOC_G_TUNER, &tuner);
61545246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	errno_g_tuner = errno;
61645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
617c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	dprintf("\t%s:%u: VIDIOC_G_TUNER, ret_g_tuner=%i, errno_g_tuner=%i\n",
618c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		__FILE__, __LINE__, ret_g_tuner, errno_g_tuner);
61945246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	CU_ASSERT_EQUAL(tuner.index, index);
62045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
62145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	/* fetch the current frequency setting */
62245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	memset(&orig_freq, 0xff, sizeof(orig_freq));
62345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	orig_freq.tuner = index;
62445246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	ret_g_freq = ioctl(get_video_fd(), VIDIOC_G_FREQUENCY, &orig_freq);
62545246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	errno_g_freq = errno;
62645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
627354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	dprintf
628354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	    ("\t%s:%u: VIDIOC_G_FREQUENCY, ret_g_freq=%i, errno_g_freq=%i, orig_freq.frequency=%u\n",
629354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	     __FILE__, __LINE__, ret_g_freq, errno_g_freq, orig_freq.frequency);
63045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	CU_ASSERT_EQUAL(orig_freq.tuner, index);
63145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
63245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	if (ret_g_freq == 0) {
63345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		CU_ASSERT_EQUAL(orig_freq.tuner, index);
63445246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
635c5d954a63f66d1ccf79ba9b92311fa7b57f0a895subrata_modak		dprintf("\t%s:%u: tuner.rangelow=%u, tuner.rangehigh=%u\n",
636354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			__FILE__, __LINE__, tuner.rangelow, tuner.rangehigh);
63745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
63845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		i = tuner.rangelow;
63945246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		prev_freq.frequency = 0;
64045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		do {
64145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			/* try to set the frequency */
64245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			memset(&freq, 0xff, sizeof(freq));
64345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			freq.tuner = index;
64445246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			freq.type = orig_freq.type;
64545246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
64645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			freq.frequency = i;
647354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			ret_set =
648354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    ioctl(get_video_fd(), VIDIOC_S_FREQUENCY, &freq);
649c5d954a63f66d1ccf79ba9b92311fa7b57f0a895subrata_modak			errno_set = errno;
650354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			dprintf
651354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    ("\t%s:%u: VIDIOC_S_FREQUENCY, ret_set=%i, errno_set=%i, freq.frequency=%u\n",
652354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			     __FILE__, __LINE__, ret_set, errno_set, i);
65345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
654c5d954a63f66d1ccf79ba9b92311fa7b57f0a895subrata_modak			CU_ASSERT_EQUAL(ret_set, 0);
655c5d954a63f66d1ccf79ba9b92311fa7b57f0a895subrata_modak			if (ret_set == 0) {
65645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
65745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak				memset(&new_freq, 0xff, sizeof(new_freq));
65845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak				new_freq.tuner = index;
659354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				ret_get =
660354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    ioctl(get_video_fd(), VIDIOC_G_FREQUENCY,
661354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					  &new_freq);
662c5d954a63f66d1ccf79ba9b92311fa7b57f0a895subrata_modak				errno_get = errno;
66345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
664354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				dprintf
665354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    ("\t%s:%u: VIDIOC_G_FREQUENCY, ret_get=%i, errno_get=%i, new_freq.frequency=%u\n",
666354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				     __FILE__, __LINE__, ret_get, errno_get,
667354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				     new_freq.frequency);
66845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
669c5d954a63f66d1ccf79ba9b92311fa7b57f0a895subrata_modak				CU_ASSERT_EQUAL(ret_get, 0);
670c5d954a63f66d1ccf79ba9b92311fa7b57f0a895subrata_modak				if (ret_get == 0) {
671354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					CU_ASSERT(prev_freq.frequency <=
672354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						  new_freq.frequency);
673354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					CU_ASSERT(tuner.rangelow <=
674354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						  new_freq.frequency);
675354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					CU_ASSERT(new_freq.frequency <=
676354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						  tuner.rangehigh);
67745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak					prev_freq = new_freq;
67845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak				}
67945246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			} else {
680354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				printf("\tError %i while setting to %u\n",
681354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				       errno_set, i);
68245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			}
68345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			i++;
68445246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		} while (i <= tuner.rangehigh);
68545246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
68645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		/* try restore the original frequency settings */
68745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		memset(&freq, 0xff, sizeof(freq));
68845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		freq.tuner = index;
68945246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		freq.type = orig_freq.type;
69045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		freq.frequency = orig_freq.frequency;
691c5d954a63f66d1ccf79ba9b92311fa7b57f0a895subrata_modak		ret_set = ioctl(get_video_fd(), VIDIOC_S_FREQUENCY, &freq);
692c5d954a63f66d1ccf79ba9b92311fa7b57f0a895subrata_modak		errno_set = errno;
69345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
694354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		dprintf
695354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		    ("\t%s:%u: VIDIOC_S_FREQUENCY, ret_set=%i, errno_set=%i\n",
696354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		     __FILE__, __LINE__, ret_set, errno_set);
69745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
698c5d954a63f66d1ccf79ba9b92311fa7b57f0a895subrata_modak		CU_ASSERT_EQUAL(ret_set, 0);
699c5d954a63f66d1ccf79ba9b92311fa7b57f0a895subrata_modak		if (ret_set == 0) {
70045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
70145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			/* check wheteher the frequency has been restored */
70245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			memset(&new_freq, 0xff, sizeof(new_freq));
70345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			new_freq.tuner = index;
704354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			ret_get =
705354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    ioctl(get_video_fd(), VIDIOC_G_FREQUENCY,
706354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				  &new_freq);
707c5d954a63f66d1ccf79ba9b92311fa7b57f0a895subrata_modak			errno_get = errno;
70845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
709354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			dprintf
710354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    ("\t%s:%u: VIDIOC_G_FREQUENCY, ret_get=%i, errno_get=%i, new_freq.frequency=%u\n",
711354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			     __FILE__, __LINE__, ret_get, errno_get,
712354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			     new_freq.frequency);
71345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
714c5d954a63f66d1ccf79ba9b92311fa7b57f0a895subrata_modak			CU_ASSERT_EQUAL(ret_get, 0);
715c5d954a63f66d1ccf79ba9b92311fa7b57f0a895subrata_modak			if (ret_get == 0) {
716354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				CU_ASSERT_EQUAL(new_freq.frequency,
717354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						orig_freq.frequency);
71845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak			}
71945246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		}
72045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	}
72145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
72245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	if (ret_g_freq != 0) {
72345246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		CU_ASSERT_EQUAL(ret_g_freq, -1);
72445246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		CU_ASSERT_EQUAL(errno, EINVAL);
72545246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	}
72645246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
72745246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	if (ret_g_tuner != 0) {
72845246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		CU_ASSERT_EQUAL(ret_g_tuner, -1);
72945246f90c20c93f3e3539627e078196af4a0eae2subrata_modak		CU_ASSERT_EQUAL(errno, EINVAL);
73045246f90c20c93f3e3539627e078196af4a0eae2subrata_modak	}
73145246f90c20c93f3e3539627e078196af4a0eae2subrata_modak
73245246f90c20c93f3e3539627e078196af4a0eae2subrata_modak}
733c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak
734354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gaovoid test_VIDIOC_S_FREQUENCY_NULL()
735354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao{
736c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	int ret_get, errno_get;
737c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	int ret_set, errno_set;
738c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	int ret_null, errno_null;
739c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	struct v4l2_frequency freq_orig;
740c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	struct v4l2_frequency freq;
741c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	__u32 tuner;
742c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak
743c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	tuner = 0;
744c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak
745c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	memset(&freq_orig, 0, sizeof(freq_orig));
746c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	freq_orig.tuner = tuner;
747c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	freq_orig.type = V4L2_TUNER_ANALOG_TV;
748c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	ret_get = ioctl(get_video_fd(), VIDIOC_G_FREQUENCY, &freq_orig);
749c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	errno_get = errno;
750c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak
751c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	dprintf("\t%s:%u: VIDIOC_G_FREQUENCY, ret_get=%i, errno_get=%i\n",
752c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		__FILE__, __LINE__, ret_get, errno_get);
753c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak
754c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	memset(&freq, 0, sizeof(freq));
755c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	freq.tuner = 0;
756c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	freq.type = V4L2_TUNER_ANALOG_TV;
757c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	freq.frequency = freq_orig.frequency;
758c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	ret_set = ioctl(get_video_fd(), VIDIOC_S_FREQUENCY, &freq_orig);
759c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	errno_set = errno;
760c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak
761c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	dprintf("\t%s:%u: VIDIOC_G_FREQUENCY, ret_set=%i, errno_set=%i\n",
762c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		__FILE__, __LINE__, ret_set, errno_set);
763c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak
764c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	ret_null = ioctl(get_video_fd(), VIDIOC_S_FREQUENCY, NULL);
765c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	errno_null = errno;
766c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak
767c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	dprintf("\t%s:%u: VIDIOC_S_FREQUENCY, ret_null=%i, errno_null=%i\n",
768c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		__FILE__, __LINE__, ret_null, errno_null);
769c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak
7702c28215423293e443469a07ae7011135d058b671Garrett Cooper	/* Check whether any of VIDIOC_S_FREQUENCY or VIDIOC_G_FREQUENCY
771c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	 * is supported at all or not
772c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	 */
773c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	if (ret_get == 0 || ret_set == 0) {
774c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		/* VIDIOC_G_FREQUENCY or VIDIOC_S_FREQUENCY is supported, so
775c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		 * the parameter of VIDIOC_S_FREQUENCY should be checked
776c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		 */
777c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(ret_null, -1);
778c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(errno_null, EFAULT);
779c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	} else {
780c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		/* none of VIDIOC_G_FREQUENCY and VIDIOC_S_FREQUENCY is supported,
781c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		 * the parameter should not be evaluated
782c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		 */
783c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(ret_get, -1);
784c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(errno_get, EINVAL);
785c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(ret_set, -1);
786c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(errno_set, EINVAL);
787c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(ret_null, -1);
788c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak		CU_ASSERT_EQUAL(errno_null, EINVAL);
789c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak	}
790c6701fc589fbfd84c6219c5669f3b1a2716f50f3subrata_modak
791ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman}
792