1d2912cb1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
26d591c46SLinus Walleij /*
36d591c46SLinus Walleij * GPIO tools - utility helpers library for the GPIO tools
46d591c46SLinus Walleij *
56d591c46SLinus Walleij * Copyright (C) 2015 Linus Walleij
66d591c46SLinus Walleij *
76d591c46SLinus Walleij * Portions copied from iio_utils and lssio:
86d591c46SLinus Walleij * Copyright (c) 2010 Manuel Stahl <manuel.stahl@iis.fraunhofer.de>
96d591c46SLinus Walleij * Copyright (c) 2008 Jonathan Cameron
106d591c46SLinus Walleij * *
116d591c46SLinus Walleij */
126d591c46SLinus Walleij #ifndef _GPIO_UTILS_H_
136d591c46SLinus Walleij #define _GPIO_UTILS_H_
146d591c46SLinus Walleij
15*7ff6d1d2SKent Gibson #include <stdbool.h>
166d591c46SLinus Walleij #include <string.h>
17*7ff6d1d2SKent Gibson #include <linux/types.h>
186d591c46SLinus Walleij
19521a2ad6SLinus Walleij #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
20521a2ad6SLinus Walleij
check_prefix(const char * str,const char * prefix)216d591c46SLinus Walleij static inline int check_prefix(const char *str, const char *prefix)
226d591c46SLinus Walleij {
236d591c46SLinus Walleij return strlen(str) > strlen(prefix) &&
246d591c46SLinus Walleij strncmp(str, prefix, strlen(prefix)) == 0;
256d591c46SLinus Walleij }
266d591c46SLinus Walleij
27*7ff6d1d2SKent Gibson int gpiotools_request_line(const char *device_name,
28*7ff6d1d2SKent Gibson unsigned int *lines,
29*7ff6d1d2SKent Gibson unsigned int num_lines,
30*7ff6d1d2SKent Gibson struct gpio_v2_line_config *config,
31*7ff6d1d2SKent Gibson const char *consumer);
32*7ff6d1d2SKent Gibson int gpiotools_set_values(const int fd, struct gpio_v2_line_values *values);
33*7ff6d1d2SKent Gibson int gpiotools_get_values(const int fd, struct gpio_v2_line_values *values);
34*7ff6d1d2SKent Gibson int gpiotools_release_line(const int fd);
35*7ff6d1d2SKent Gibson
36e1acec0eSBamvor Jian Zhang int gpiotools_get(const char *device_name, unsigned int line);
37e1acec0eSBamvor Jian Zhang int gpiotools_gets(const char *device_name, unsigned int *lines,
38*7ff6d1d2SKent Gibson unsigned int num_lines, unsigned int *values);
39e1acec0eSBamvor Jian Zhang int gpiotools_set(const char *device_name, unsigned int line,
40e1acec0eSBamvor Jian Zhang unsigned int value);
41e1acec0eSBamvor Jian Zhang int gpiotools_sets(const char *device_name, unsigned int *lines,
42*7ff6d1d2SKent Gibson unsigned int num_lines, unsigned int *values);
43*7ff6d1d2SKent Gibson
44*7ff6d1d2SKent Gibson /* helper functions for gpio_v2_line_values bits */
gpiotools_set_bit(__u64 * b,int n)45*7ff6d1d2SKent Gibson static inline void gpiotools_set_bit(__u64 *b, int n)
46*7ff6d1d2SKent Gibson {
47*7ff6d1d2SKent Gibson *b |= _BITULL(n);
48*7ff6d1d2SKent Gibson }
49*7ff6d1d2SKent Gibson
gpiotools_change_bit(__u64 * b,int n)50*7ff6d1d2SKent Gibson static inline void gpiotools_change_bit(__u64 *b, int n)
51*7ff6d1d2SKent Gibson {
52*7ff6d1d2SKent Gibson *b ^= _BITULL(n);
53*7ff6d1d2SKent Gibson }
54*7ff6d1d2SKent Gibson
gpiotools_clear_bit(__u64 * b,int n)55*7ff6d1d2SKent Gibson static inline void gpiotools_clear_bit(__u64 *b, int n)
56*7ff6d1d2SKent Gibson {
57*7ff6d1d2SKent Gibson *b &= ~_BITULL(n);
58*7ff6d1d2SKent Gibson }
59*7ff6d1d2SKent Gibson
gpiotools_test_bit(__u64 b,int n)60*7ff6d1d2SKent Gibson static inline int gpiotools_test_bit(__u64 b, int n)
61*7ff6d1d2SKent Gibson {
62*7ff6d1d2SKent Gibson return !!(b & _BITULL(n));
63*7ff6d1d2SKent Gibson }
64*7ff6d1d2SKent Gibson
gpiotools_assign_bit(__u64 * b,int n,bool value)65*7ff6d1d2SKent Gibson static inline void gpiotools_assign_bit(__u64 *b, int n, bool value)
66*7ff6d1d2SKent Gibson {
67*7ff6d1d2SKent Gibson if (value)
68*7ff6d1d2SKent Gibson gpiotools_set_bit(b, n);
69*7ff6d1d2SKent Gibson else
70*7ff6d1d2SKent Gibson gpiotools_clear_bit(b, n);
71*7ff6d1d2SKent Gibson }
72e1acec0eSBamvor Jian Zhang
736d591c46SLinus Walleij #endif /* _GPIO_UTILS_H_ */
74