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