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