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