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 line names.
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-line-name <chip path> <line offset>\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 gpio_v2_line_info info;
25*053f45beSAndroid Build Coastguard Worker int fd, ret;
26*053f45beSAndroid Build Coastguard Worker char *endp;
27*053f45beSAndroid Build Coastguard Worker
28*053f45beSAndroid Build Coastguard Worker if (argc != 3) {
29*053f45beSAndroid Build Coastguard Worker print_usage();
30*053f45beSAndroid Build Coastguard Worker return EXIT_FAILURE;
31*053f45beSAndroid Build Coastguard Worker }
32*053f45beSAndroid Build Coastguard Worker
33*053f45beSAndroid Build Coastguard Worker fd = open(argv[1], O_RDWR);
34*053f45beSAndroid Build Coastguard Worker if (fd < 0) {
35*053f45beSAndroid Build Coastguard Worker perror("unable to open the GPIO chip");
36*053f45beSAndroid Build Coastguard Worker return EXIT_FAILURE;
37*053f45beSAndroid Build Coastguard Worker }
38*053f45beSAndroid Build Coastguard Worker
39*053f45beSAndroid Build Coastguard Worker memset(&info, 0, sizeof(info));
40*053f45beSAndroid Build Coastguard Worker info.offset = strtoul(argv[2], &endp, 10);
41*053f45beSAndroid Build Coastguard Worker if (*endp != '\0') {
42*053f45beSAndroid Build Coastguard Worker print_usage();
43*053f45beSAndroid Build Coastguard Worker return EXIT_FAILURE;
44*053f45beSAndroid Build Coastguard Worker }
45*053f45beSAndroid Build Coastguard Worker
46*053f45beSAndroid Build Coastguard Worker ret = ioctl(fd, GPIO_V2_GET_LINEINFO_IOCTL, &info);
47*053f45beSAndroid Build Coastguard Worker if (ret) {
48*053f45beSAndroid Build Coastguard Worker perror("line info ioctl failed");
49*053f45beSAndroid Build Coastguard Worker return EXIT_FAILURE;
50*053f45beSAndroid Build Coastguard Worker }
51*053f45beSAndroid Build Coastguard Worker
52*053f45beSAndroid Build Coastguard Worker printf("%s\n", info.name);
53*053f45beSAndroid Build Coastguard Worker
54*053f45beSAndroid Build Coastguard Worker return EXIT_SUCCESS;
55*053f45beSAndroid Build Coastguard Worker }
56