summaryrefslogtreecommitdiff
path: root/tools/testing/selftests/gpio/gpio-chip-info.c
diff options
context:
space:
mode:
authorBartosz Golaszewski <brgl@bgdev.pl>2021-12-13 13:21:56 +0300
committerBartosz Golaszewski <brgl@bgdev.pl>2021-12-17 14:26:13 +0300
commit16c138f338b62dd0a339b9d0ca819426231be7f6 (patch)
tree5bc5c7d2e6dc0d55a021306a1fc8f89b87b1ac52 /tools/testing/selftests/gpio/gpio-chip-info.c
parentcb8c474e79be458f58e9df073f51ca159f3a2aa0 (diff)
downloadlinux-16c138f338b62dd0a339b9d0ca819426231be7f6.tar.xz
selftests: gpio: provide a helper for reading chip info
Add a simple program that allows to retrieve chip properties from the GPIO character device. This will be used in gpio-sim selftests. Signed-off-by: Bartosz Golaszewski <brgl@bgdev.pl>
Diffstat (limited to 'tools/testing/selftests/gpio/gpio-chip-info.c')
-rw-r--r--tools/testing/selftests/gpio/gpio-chip-info.c57
1 files changed, 57 insertions, 0 deletions
diff --git a/tools/testing/selftests/gpio/gpio-chip-info.c b/tools/testing/selftests/gpio/gpio-chip-info.c
new file mode 100644
index 000000000000..fdc07e742fba
--- /dev/null
+++ b/tools/testing/selftests/gpio/gpio-chip-info.c
@@ -0,0 +1,57 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * GPIO character device helper for reading chip information.
+ *
+ * Copyright (C) 2021 Bartosz Golaszewski <brgl@bgdev.pl>
+ */
+
+#include <fcntl.h>
+#include <linux/gpio.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/ioctl.h>
+#include <sys/types.h>
+
+static void print_usage(void)
+{
+ printf("usage:\n");
+ printf(" gpio-chip-info <chip path> [name|label|num-lines]\n");
+}
+
+int main(int argc, char **argv)
+{
+ struct gpiochip_info info;
+ int fd, ret;
+
+ if (argc != 3) {
+ print_usage();
+ return EXIT_FAILURE;
+ }
+
+ fd = open(argv[1], O_RDWR);
+ if (fd < 0) {
+ perror("unable to open the GPIO chip");
+ return EXIT_FAILURE;
+ }
+
+ memset(&info, 0, sizeof(info));
+ ret = ioctl(fd, GPIO_GET_CHIPINFO_IOCTL, &info);
+ if (ret) {
+ perror("chip info ioctl failed");
+ return EXIT_FAILURE;
+ }
+
+ if (strcmp(argv[2], "name") == 0) {
+ printf("%s\n", info.name);
+ } else if (strcmp(argv[2], "label") == 0) {
+ printf("%s\n", info.label);
+ } else if (strcmp(argv[2], "num-lines") == 0) {
+ printf("%u\n", info.lines);
+ } else {
+ fprintf(stderr, "unknown command: %s\n", argv[2]);
+ return EXIT_FAILURE;
+ }
+
+ return EXIT_SUCCESS;
+}