xref: /linux/tools/testing/selftests/gpio/gpio-line-name.c (revision 03ab8e6297acd1bc0eedaa050e2a1635c576fd11)
1*b2bb90c8SBartosz Golaszewski // SPDX-License-Identifier: GPL-2.0-or-later
2*b2bb90c8SBartosz Golaszewski /*
3*b2bb90c8SBartosz Golaszewski  * GPIO character device helper for reading line names.
4*b2bb90c8SBartosz Golaszewski  *
5*b2bb90c8SBartosz Golaszewski  * Copyright (C) 2021 Bartosz Golaszewski <brgl@bgdev.pl>
6*b2bb90c8SBartosz Golaszewski  */
7*b2bb90c8SBartosz Golaszewski 
8*b2bb90c8SBartosz Golaszewski #include <fcntl.h>
9*b2bb90c8SBartosz Golaszewski #include <linux/gpio.h>
10*b2bb90c8SBartosz Golaszewski #include <stdio.h>
11*b2bb90c8SBartosz Golaszewski #include <stdlib.h>
12*b2bb90c8SBartosz Golaszewski #include <string.h>
13*b2bb90c8SBartosz Golaszewski #include <sys/ioctl.h>
14*b2bb90c8SBartosz Golaszewski #include <sys/types.h>
15*b2bb90c8SBartosz Golaszewski 
print_usage(void)16*b2bb90c8SBartosz Golaszewski static void print_usage(void)
17*b2bb90c8SBartosz Golaszewski {
18*b2bb90c8SBartosz Golaszewski 	printf("usage:\n");
19*b2bb90c8SBartosz Golaszewski 	printf("  gpio-line-name <chip path> <line offset>\n");
20*b2bb90c8SBartosz Golaszewski }
21*b2bb90c8SBartosz Golaszewski 
main(int argc,char ** argv)22*b2bb90c8SBartosz Golaszewski int main(int argc, char **argv)
23*b2bb90c8SBartosz Golaszewski {
24*b2bb90c8SBartosz Golaszewski 	struct gpio_v2_line_info info;
25*b2bb90c8SBartosz Golaszewski 	int fd, ret;
26*b2bb90c8SBartosz Golaszewski 	char *endp;
27*b2bb90c8SBartosz Golaszewski 
28*b2bb90c8SBartosz Golaszewski 	if (argc != 3) {
29*b2bb90c8SBartosz Golaszewski 		print_usage();
30*b2bb90c8SBartosz Golaszewski 		return EXIT_FAILURE;
31*b2bb90c8SBartosz Golaszewski 	}
32*b2bb90c8SBartosz Golaszewski 
33*b2bb90c8SBartosz Golaszewski 	fd = open(argv[1], O_RDWR);
34*b2bb90c8SBartosz Golaszewski 	if (fd < 0) {
35*b2bb90c8SBartosz Golaszewski 		perror("unable to open the GPIO chip");
36*b2bb90c8SBartosz Golaszewski 		return EXIT_FAILURE;
37*b2bb90c8SBartosz Golaszewski 	}
38*b2bb90c8SBartosz Golaszewski 
39*b2bb90c8SBartosz Golaszewski 	memset(&info, 0, sizeof(info));
40*b2bb90c8SBartosz Golaszewski 	info.offset = strtoul(argv[2], &endp, 10);
41*b2bb90c8SBartosz Golaszewski 	if (*endp != '\0') {
42*b2bb90c8SBartosz Golaszewski 		print_usage();
43*b2bb90c8SBartosz Golaszewski 		return EXIT_FAILURE;
44*b2bb90c8SBartosz Golaszewski 	}
45*b2bb90c8SBartosz Golaszewski 
46*b2bb90c8SBartosz Golaszewski 	ret = ioctl(fd, GPIO_V2_GET_LINEINFO_IOCTL, &info);
47*b2bb90c8SBartosz Golaszewski 	if (ret) {
48*b2bb90c8SBartosz Golaszewski 		perror("line info ioctl failed");
49*b2bb90c8SBartosz Golaszewski 		return EXIT_FAILURE;
50*b2bb90c8SBartosz Golaszewski 	}
51*b2bb90c8SBartosz Golaszewski 
52*b2bb90c8SBartosz Golaszewski 	printf("%s\n", info.name);
53*b2bb90c8SBartosz Golaszewski 
54*b2bb90c8SBartosz Golaszewski 	return EXIT_SUCCESS;
55*b2bb90c8SBartosz Golaszewski }
56