xref: /openbmc/linux/tools/gpio/gpio-utils.h (revision d0034a7a4ac7fae708146ac0059b9c47a1543f0d)
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