xref: /openbmc/linux/tools/testing/selftests/media_tests/media_device_open.c (revision 3eb66e91a25497065c5322b1268cbc3953642227)
1a4f0e38eSShuah Khan // SPDX-License-Identifier: GPL-2.0
2a4f0e38eSShuah Khan 
3b96da0fcSShuah Khan /*
4b96da0fcSShuah Khan  * media_device_open.c - Media Controller Device Open Test
5b96da0fcSShuah Khan  *
6b96da0fcSShuah Khan  * Copyright (c) 2016 Shuah Khan <shuahkh@osg.samsung.com>
7b96da0fcSShuah Khan  * Copyright (c) 2016 Samsung Electronics Co., Ltd.
8b96da0fcSShuah Khan  *
9b96da0fcSShuah Khan  */
10b96da0fcSShuah Khan 
11b96da0fcSShuah Khan /*
12b96da0fcSShuah Khan  * This file adds a test for Media Controller API.
13b96da0fcSShuah Khan  * This test should be run as root and should not be
14b96da0fcSShuah Khan  * included in the Kselftest run. This test should be
15b96da0fcSShuah Khan  * run when hardware and driver that makes use Media
16b96da0fcSShuah Khan  * Controller API are present in the system.
17b96da0fcSShuah Khan  *
18b96da0fcSShuah Khan  * This test opens user specified Media Device and calls
19b96da0fcSShuah Khan  * MEDIA_IOC_DEVICE_INFO ioctl, closes the file, and exits.
20b96da0fcSShuah Khan  *
21b96da0fcSShuah Khan  * Usage:
22b96da0fcSShuah Khan  *	sudo ./media_device_open -d /dev/mediaX
23b96da0fcSShuah Khan  *
24b96da0fcSShuah Khan  *	Run this test is a loop and run bind/unbind on the driver.
25b96da0fcSShuah Khan */
26b96da0fcSShuah Khan 
27b96da0fcSShuah Khan #include <stdio.h>
28b96da0fcSShuah Khan #include <unistd.h>
29b96da0fcSShuah Khan #include <stdlib.h>
30b96da0fcSShuah Khan #include <errno.h>
31b96da0fcSShuah Khan #include <string.h>
32b96da0fcSShuah Khan #include <fcntl.h>
33b96da0fcSShuah Khan #include <sys/ioctl.h>
34b96da0fcSShuah Khan #include <sys/stat.h>
35b96da0fcSShuah Khan #include <linux/media.h>
36b96da0fcSShuah Khan 
37*11381286SShuah Khan (Samsung OSG) #include "../kselftest.h"
38*11381286SShuah Khan (Samsung OSG) 
main(int argc,char ** argv)39b96da0fcSShuah Khan int main(int argc, char **argv)
40b96da0fcSShuah Khan {
41b96da0fcSShuah Khan 	int opt;
42b96da0fcSShuah Khan 	char media_device[256];
43b96da0fcSShuah Khan 	int count = 0;
44b96da0fcSShuah Khan 	struct media_device_info mdi;
45b96da0fcSShuah Khan 	int ret;
46b96da0fcSShuah Khan 	int fd;
47b96da0fcSShuah Khan 
48b96da0fcSShuah Khan 	if (argc < 2) {
49b96da0fcSShuah Khan 		printf("Usage: %s [-d </dev/mediaX>]\n", argv[0]);
50b96da0fcSShuah Khan 		exit(-1);
51b96da0fcSShuah Khan 	}
52b96da0fcSShuah Khan 
53b96da0fcSShuah Khan 	/* Process arguments */
54b96da0fcSShuah Khan 	while ((opt = getopt(argc, argv, "d:")) != -1) {
55b96da0fcSShuah Khan 		switch (opt) {
56b96da0fcSShuah Khan 		case 'd':
57b96da0fcSShuah Khan 			strncpy(media_device, optarg, sizeof(media_device) - 1);
58b96da0fcSShuah Khan 			media_device[sizeof(media_device)-1] = '\0';
59b96da0fcSShuah Khan 			break;
60b96da0fcSShuah Khan 		default:
61b96da0fcSShuah Khan 			printf("Usage: %s [-d </dev/mediaX>]\n", argv[0]);
62b96da0fcSShuah Khan 			exit(-1);
63b96da0fcSShuah Khan 		}
64b96da0fcSShuah Khan 	}
65b96da0fcSShuah Khan 
66*11381286SShuah Khan (Samsung OSG) 	if (getuid() != 0)
67*11381286SShuah Khan (Samsung OSG) 		ksft_exit_skip("Please run the test as root - Exiting.\n");
68b96da0fcSShuah Khan 
69b96da0fcSShuah Khan 	/* Open Media device and keep it open */
70b96da0fcSShuah Khan 	fd = open(media_device, O_RDWR);
71b96da0fcSShuah Khan 	if (fd == -1) {
72b96da0fcSShuah Khan 		printf("Media Device open errno %s\n", strerror(errno));
73b96da0fcSShuah Khan 		exit(-1);
74b96da0fcSShuah Khan 	}
75b96da0fcSShuah Khan 
76b96da0fcSShuah Khan 	ret = ioctl(fd, MEDIA_IOC_DEVICE_INFO, &mdi);
77b96da0fcSShuah Khan 	if (ret < 0)
78b96da0fcSShuah Khan 		printf("Media Device Info errno %s\n", strerror(errno));
79b96da0fcSShuah Khan 	else
80b96da0fcSShuah Khan 		printf("Media device model %s driver %s\n",
81b96da0fcSShuah Khan 			mdi.model, mdi.driver);
82b96da0fcSShuah Khan }
83