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 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 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