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