| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775 | 
							- /* SPDX-License-Identifier: LGPL-2.1-or-later */
 
- /*
 
-  * This file is part of libgpiod.
 
-  *
 
-  * Copyright (C) 2017-2018 Bartosz Golaszewski <bartekgola@gmail.com>
 
-  */
 
- #ifndef __LIBGPIOD_GPIOD_H__
 
- #define __LIBGPIOD_GPIOD_H__
 
- #include <stdbool.h>
 
- #include <stdlib.h>
 
- #include <time.h>
 
- #ifdef __cplusplus
 
- extern "C" {
 
- #endif
 
- /**
 
-  * @file gpiod.h
 
-  */
 
- /**
 
-  * @mainpage libgpiod public API
 
-  *
 
-  * This is the complete documentation of the public API made available to
 
-  * users of libgpiod.
 
-  *
 
-  * <p>The public header is logically split into two high-level parts: the
 
-  * simple API and the low-level API. The former allows users to easily
 
-  * interact with the GPIOs in the system without dealing with the low-level
 
-  * data structures and resource control. The latter gives the user much more
 
-  * fine-grained control over the GPIO interface.
 
-  *
 
-  * <p>The low-level API is further logically split into several parts such
 
-  * as: GPIO chip & line operators, iterators, GPIO events handling etc.
 
-  *
 
-  * <p>General note on error handling: all routines exported by libgpiod  set
 
-  * errno to one of the error values defined in errno.h upon failure. The way
 
-  * of notifying the caller that an error occurred varies between functions,
 
-  * but in general a function that returns an int, returns -1 on error, while
 
-  * a function returning a pointer bails out on error condition by returning
 
-  * a NULL pointer.
 
-  */
 
- struct gpiod_chip;
 
- struct gpiod_line;
 
- struct gpiod_chip_iter;
 
- struct gpiod_line_iter;
 
- struct gpiod_line_bulk;
 
- /**
 
-  * @defgroup common Common helper macros
 
-  * @{
 
-  *
 
-  * Commonly used utility macros.
 
-  */
 
- /**
 
-  * @brief Makes symbol visible.
 
-  */
 
- #define GPIOD_API		__attribute__((visibility("default")))
 
- /**
 
-  * @brief Marks a function argument or variable as potentially unused.
 
-  */
 
- #define GPIOD_UNUSED		__attribute__((unused))
 
- /**
 
-  * @brief Shift 1 by given offset.
 
-  * @param nr Bit position.
 
-  * @return 1 shifted by nr.
 
-  */
 
- #define GPIOD_BIT(nr)		(1UL << (nr))
 
- /**
 
-  * @brief Marks a public function as deprecated.
 
-  */
 
- #define GPIOD_DEPRECATED	__attribute__((deprecated))
 
- /**
 
-  * @}
 
-  *
 
-  * @defgroup high_level High-level API
 
-  * @{
 
-  *
 
-  * Simple high-level routines for straightforward GPIO manipulation without
 
-  * the need to use the gpiod_* structures or to keep track of resources.
 
-  */
 
- /**
 
-  * @brief Miscellaneous GPIO flags.
 
-  */
 
- enum {
 
- 	GPIOD_CTXLESS_FLAG_OPEN_DRAIN		= GPIOD_BIT(0),
 
- 	/**< The line is an open-drain port. */
 
- 	GPIOD_CTXLESS_FLAG_OPEN_SOURCE		= GPIOD_BIT(1),
 
- 	/**< The line is an open-source port. */
 
- 	GPIOD_CTXLESS_FLAG_BIAS_DISABLE		= GPIOD_BIT(2),
 
- 	/**< The line has neither either pull-up nor pull-down resistor */
 
- 	GPIOD_CTXLESS_FLAG_BIAS_PULL_DOWN	= GPIOD_BIT(3),
 
- 	/**< The line has pull-down resistor enabled */
 
- 	GPIOD_CTXLESS_FLAG_BIAS_PULL_UP		= GPIOD_BIT(4),
 
- 	/**< The line has pull-up resistor enabled */
 
- };
 
- /**
 
-  * @brief Read current value from a single GPIO line.
 
-  * @param device Name, path, number or label of the gpiochip.
 
-  * @param offset Offset of the GPIO line.
 
-  * @param active_low The active state of this line - true if low.
 
-  * @param consumer Name of the consumer.
 
-  * @return 0 or 1 (GPIO value) if the operation succeeds, -1 on error.
 
-  */
 
- int gpiod_ctxless_get_value(const char *device, unsigned int offset,
 
- 			    bool active_low, const char *consumer) GPIOD_API;
 
- /**
 
-  * @brief Read current value from a single GPIO line.
 
-  * @param device Name, path, number or label of the gpiochip.
 
-  * @param offset Offset of the GPIO line.
 
-  * @param active_low The active state of this line - true if low.
 
-  * @param consumer Name of the consumer.
 
-  * @param flags The flags for the line.
 
-  * @return 0 or 1 (GPIO value) if the operation succeeds, -1 on error.
 
-  */
 
- int gpiod_ctxless_get_value_ext(const char *device, unsigned int offset,
 
- 				bool active_low, const char *consumer,
 
- 				int flags) GPIOD_API;
 
- /**
 
-  * @brief Read current values from a set of GPIO lines.
 
-  * @param device Name, path, number or label of the gpiochip.
 
-  * @param offsets Array of offsets of lines whose values should be read.
 
-  * @param values Buffer in which the values will be stored.
 
-  * @param num_lines Number of lines, must be > 0.
 
-  * @param active_low The active state of the lines - true if low.
 
-  * @param consumer Name of the consumer.
 
-  * @return 0 if the operation succeeds, -1 on error.
 
-  */
 
- int gpiod_ctxless_get_value_multiple(const char *device,
 
- 				     const unsigned int *offsets, int *values,
 
- 				     unsigned int num_lines, bool active_low,
 
- 				     const char *consumer) GPIOD_API;
 
- /**
 
-  * @brief Read current values from a set of GPIO lines.
 
-  * @param device Name, path, number or label of the gpiochip.
 
-  * @param offsets Array of offsets of lines whose values should be read.
 
-  * @param values Buffer in which the values will be stored.
 
-  * @param num_lines Number of lines, must be > 0.
 
-  * @param active_low The active state of this line - true if low.
 
-  * @param consumer Name of the consumer.
 
-  * @param flags The flags for the lines.
 
-  * @return 0 if the operation succeeds, -1 on error.
 
-  */
 
- int gpiod_ctxless_get_value_multiple_ext(const char *device,
 
- 					 const unsigned int *offsets,
 
- 					 int *values, unsigned int num_lines,
 
- 					 bool active_low, const char *consumer,
 
- 					 int flags) GPIOD_API;
 
- /**
 
-  * @brief Simple set value callback signature.
 
-  */
 
- typedef void (*gpiod_ctxless_set_value_cb)(void *);
 
- /**
 
-  * @brief Set value of a single GPIO line.
 
-  * @param device Name, path, number or label of the gpiochip.
 
-  * @param offset The offset of the GPIO line.
 
-  * @param value New value (0 or 1).
 
-  * @param active_low The active state of this line - true if low.
 
-  * @param consumer Name of the consumer.
 
-  * @param cb Optional callback function that will be called right after setting
 
-  *           the value. Users can use this, for example, to pause the execution
 
-  *           after toggling a GPIO.
 
-  * @param data Optional user data that will be passed to the callback function.
 
-  * @return 0 if the operation succeeds, -1 on error.
 
-  */
 
- int gpiod_ctxless_set_value(const char *device, unsigned int offset, int value,
 
- 			    bool active_low, const char *consumer,
 
- 			    gpiod_ctxless_set_value_cb cb,
 
- 			    void *data) GPIOD_API;
 
- /**
 
-  * @brief Set value of a single GPIO line.
 
-  * @param device Name, path, number or label of the gpiochip.
 
-  * @param offset The offset of the GPIO line.
 
-  * @param value New value (0 or 1).
 
-  * @param active_low The active state of this line - true if low.
 
-  * @param consumer Name of the consumer.
 
-  * @param cb Optional callback function that will be called right after setting
 
-  *           the value. Users can use this, for example, to pause the execution
 
-  *           after toggling a GPIO.
 
-  * @param data Optional user data that will be passed to the callback function.
 
-  * @param flags The flags for the line.
 
-  * @return 0 if the operation succeeds, -1 on error.
 
-  */
 
- int gpiod_ctxless_set_value_ext(const char *device, unsigned int offset,
 
- 				int value, bool active_low,
 
- 				const char *consumer,
 
- 				gpiod_ctxless_set_value_cb cb,
 
- 				void *data, int flags) GPIOD_API;
 
- /**
 
-  * @brief Set values of multiple GPIO lines.
 
-  * @param device Name, path, number or label of the gpiochip.
 
-  * @param offsets Array of offsets of lines the values of which should be set.
 
-  * @param values Array of integers containing new values.
 
-  * @param num_lines Number of lines, must be > 0.
 
-  * @param active_low The active state of the lines - true if low.
 
-  * @param consumer Name of the consumer.
 
-  * @param cb Optional callback function that will be called right after setting
 
-  *           all values. Works the same as in ::gpiod_ctxless_set_value.
 
-  * @param data Optional user data that will be passed to the callback function.
 
-  * @return 0 if the operation succeeds, -1 on error.
 
-  */
 
- int gpiod_ctxless_set_value_multiple(const char *device,
 
- 				     const unsigned int *offsets,
 
- 				     const int *values, unsigned int num_lines,
 
- 				     bool active_low, const char *consumer,
 
- 				     gpiod_ctxless_set_value_cb cb,
 
- 				     void *data) GPIOD_API;
 
- /**
 
-  * @brief Set values of multiple GPIO lines.
 
-  * @param device Name, path, number or label of the gpiochip.
 
-  * @param offsets Array of offsets of lines the values of which should be set.
 
-  * @param values Array of integers containing new values.
 
-  * @param num_lines Number of lines, must be > 0.
 
-  * @param active_low The active state of this line - true if low.
 
-  * @param consumer Name of the consumer.
 
-  * @param cb Optional callback function that will be called right after setting
 
-  *           all values. Works the same as in ::gpiod_ctxless_set_value.
 
-  * @param data Optional user data that will be passed to the callback function.
 
-  * @param flags The flags for the lines.
 
-  * @return 0 if the operation succeeds, -1 on error.
 
-  */
 
- int gpiod_ctxless_set_value_multiple_ext(const char *device,
 
- 					 const unsigned int *offsets,
 
- 					 const int *values,
 
- 					 unsigned int num_lines,
 
- 					 bool active_low,
 
- 					 const char *consumer,
 
- 					 gpiod_ctxless_set_value_cb cb,
 
- 					 void *data, int flags) GPIOD_API;
 
- /**
 
-  * @brief Event types that the ctxless event monitor can wait for.
 
-  */
 
- enum {
 
- 	/**< Wait for rising edge events only. */
 
- 	GPIOD_CTXLESS_EVENT_RISING_EDGE = 1,
 
- 	/**< Wait for falling edge events only. */
 
- 	GPIOD_CTXLESS_EVENT_FALLING_EDGE,
 
- 	/**< Wait for both types of events. */
 
- 	GPIOD_CTXLESS_EVENT_BOTH_EDGES,
 
- };
 
- /**
 
-  * @brief Event types that can be passed to the ctxless event callback.
 
-  */
 
- enum {
 
- 	GPIOD_CTXLESS_EVENT_CB_TIMEOUT = 1,
 
- 	/**< Waiting for events timed out. */
 
- 	GPIOD_CTXLESS_EVENT_CB_RISING_EDGE,
 
- 	/**< Rising edge event occured. */
 
- 	GPIOD_CTXLESS_EVENT_CB_FALLING_EDGE,
 
- 	/**< Falling edge event occured. */
 
- };
 
- /**
 
-  * @brief Return status values that the ctxless event callback can return.
 
-  */
 
- enum {
 
- 	GPIOD_CTXLESS_EVENT_CB_RET_ERR = -1,
 
- 	/**< Stop processing events and indicate an error. */
 
- 	GPIOD_CTXLESS_EVENT_CB_RET_OK = 0,
 
- 	/**< Continue processing events. */
 
- 	GPIOD_CTXLESS_EVENT_CB_RET_STOP = 1,
 
- 	/**< Stop processing events. */
 
- };
 
- /**
 
-  * @brief Simple event callback signature.
 
-  *
 
-  * The callback function takes the following arguments: event type (int),
 
-  * GPIO line offset (unsigned int), event timestamp (const struct timespec *)
 
-  * and a pointer to user data (void *).
 
-  *
 
-  * This callback is called by the ctxless event loop functions for each GPIO
 
-  * event. If the callback returns ::GPIOD_CTXLESS_EVENT_CB_RET_ERR, it should
 
-  * also set errno.
 
-  */
 
- typedef int (*gpiod_ctxless_event_handle_cb)(int, unsigned int,
 
- 					     const struct timespec *, void *);
 
- /**
 
-  * @brief Return status values that the ctxless event poll callback can return.
 
-  *
 
-  * Positive value returned from the polling callback indicates the number of
 
-  * events that occurred on the set of monitored lines.
 
-  */
 
- enum {
 
- 	GPIOD_CTXLESS_EVENT_POLL_RET_STOP = -2,
 
- 	/**< The event loop should stop processing events. */
 
- 	GPIOD_CTXLESS_EVENT_POLL_RET_ERR = -1,
 
- 	/**< Polling error occurred (the polling function should set errno). */
 
- 	GPIOD_CTXLESS_EVENT_POLL_RET_TIMEOUT = 0,
 
- 	/**< Poll timed out. */
 
- };
 
- /**
 
-  * @brief Helper structure for the ctxless event loop poll callback.
 
-  */
 
- struct gpiod_ctxless_event_poll_fd {
 
- 	int fd;
 
- 	/**< File descriptor number. */
 
- 	bool event;
 
- 	/**< Indicates whether an event occurred on this file descriptor. */
 
- };
 
- /**
 
-  * @brief Simple event poll callback signature.
 
-  *
 
-  * The poll callback function takes the following arguments: number of lines
 
-  * (unsigned int), an array of file descriptors on which input events should
 
-  * be monitored (struct gpiod_ctxless_event_poll_fd *), poll timeout
 
-  * (const struct timespec *) and a pointer to user data (void *).
 
-  *
 
-  * The callback should poll for input events on the set of descriptors and
 
-  * return an appropriate value that can be interpreted by the event loop
 
-  * routine.
 
-  */
 
- typedef int (*gpiod_ctxless_event_poll_cb)(unsigned int,
 
- 				struct gpiod_ctxless_event_poll_fd *,
 
- 				const struct timespec *, void *);
 
- /**
 
-  * @brief Wait for events on a single GPIO line.
 
-  * @param device Name, path, number or label of the gpiochip.
 
-  * @param offset GPIO line offset to monitor.
 
-  * @param active_low The active state of this line - true if low.
 
-  * @param consumer Name of the consumer.
 
-  * @param timeout Maximum wait time for each iteration.
 
-  * @param poll_cb Callback function to call when waiting for events.
 
-  * @param event_cb Callback function to call for each line event.
 
-  * @param data User data passed to the callback.
 
-  * @return 0 if no errors were encountered, -1 if an error occurred.
 
-  * @note The way the ctxless event loop works is described in detail in
 
-  *       ::gpiod_ctxless_event_loop_multiple - this is just a wrapper aound
 
-  *       this routine which calls it for a single GPIO line.
 
-  * @deprecated This function suffers from an issue where HW may not allow
 
-  *             setting up both rising and falling egde interrupts at the same
 
-  *             time.
 
-  */
 
- int gpiod_ctxless_event_loop(const char *device, unsigned int offset,
 
- 			     bool active_low, const char *consumer,
 
- 			     const struct timespec *timeout,
 
- 			     gpiod_ctxless_event_poll_cb poll_cb,
 
- 			     gpiod_ctxless_event_handle_cb event_cb,
 
- 			     void *data) GPIOD_API GPIOD_DEPRECATED;
 
- /**
 
-  * @brief Wait for events on multiple GPIO lines.
 
-  * @param device Name, path, number or label of the gpiochip.
 
-  * @param offsets Array of GPIO line offsets to monitor.
 
-  * @param num_lines Number of lines to monitor.
 
-  * @param active_low The active state of this line - true if low.
 
-  * @param consumer Name of the consumer.
 
-  * @param timeout Maximum wait time for each iteration.
 
-  * @param poll_cb Callback function to call when waiting for events. Can
 
-  *                be NULL.
 
-  * @param event_cb Callback function to call on event occurrence.
 
-  * @param data User data passed to the callback.
 
-  * @return 0 no errors were encountered, -1 if an error occurred.
 
-  * @note The poll callback can be NULL in which case the routine will fall
 
-  *       back to a basic, ppoll() based callback.
 
-  * @deprecated This function suffers from an issue where HW may not allow
 
-  *             setting up both rising and falling egde interrupts at the same
 
-  *             time.
 
-  *
 
-  * Internally this routine opens the GPIO chip, requests the set of lines for
 
-  * both-edges events and calls the polling callback in a loop. The role of the
 
-  * polling callback is to detect input events on a set of file descriptors and
 
-  * notify the caller about the fds ready for reading.
 
-  *
 
-  * The ctxless event loop then reads each queued event from marked descriptors
 
-  * and calls the event callback. Both callbacks can stop the loop at any
 
-  * point.
 
-  *
 
-  * The poll_cb argument can be NULL in which case the function falls back to
 
-  * a default, ppoll() based callback.
 
-  */
 
- int gpiod_ctxless_event_loop_multiple(const char *device,
 
- 				      const unsigned int *offsets,
 
- 				      unsigned int num_lines, bool active_low,
 
- 				      const char *consumer,
 
- 				      const struct timespec *timeout,
 
- 				      gpiod_ctxless_event_poll_cb poll_cb,
 
- 				      gpiod_ctxless_event_handle_cb event_cb,
 
- 				      void *data) GPIOD_API GPIOD_DEPRECATED;
 
- /**
 
-  * @brief Wait for events on a single GPIO line.
 
-  * @param device Name, path, number or label of the gpiochip.
 
-  * @param event_type Type of events to listen for.
 
-  * @param offset GPIO line offset to monitor.
 
-  * @param active_low The active state of this line - true if low.
 
-  * @param consumer Name of the consumer.
 
-  * @param timeout Maximum wait time for each iteration.
 
-  * @param poll_cb Callback function to call when waiting for events.
 
-  * @param event_cb Callback function to call for each line event.
 
-  * @param data User data passed to the callback.
 
-  * @return 0 if no errors were encountered, -1 if an error occurred.
 
-  * @note The way the ctxless event loop works is described in detail in
 
-  *       ::gpiod_ctxless_event_monitor_multiple - this is just a wrapper aound
 
-  *       this routine which calls it for a single GPIO line.
 
-  */
 
- int gpiod_ctxless_event_monitor(const char *device, int event_type,
 
- 				unsigned int offset, bool active_low,
 
- 				const char *consumer,
 
- 				const struct timespec *timeout,
 
- 				gpiod_ctxless_event_poll_cb poll_cb,
 
- 				gpiod_ctxless_event_handle_cb event_cb,
 
- 				void *data) GPIOD_API;
 
- /**
 
-  * @brief Wait for events on a single GPIO line.
 
-  * @param device Name, path, number or label of the gpiochip.
 
-  * @param event_type Type of events to listen for.
 
-  * @param offset GPIO line offset to monitor.
 
-  * @param active_low The active state of this line - true if low.
 
-  * @param consumer Name of the consumer.
 
-  * @param timeout Maximum wait time for each iteration.
 
-  * @param poll_cb Callback function to call when waiting for events.
 
-  * @param event_cb Callback function to call for each line event.
 
-  * @param data User data passed to the callback.
 
-  * @param flags The flags for the line.
 
-  * @return 0 if no errors were encountered, -1 if an error occurred.
 
-  * @note The way the ctxless event loop works is described in detail in
 
-  *       ::gpiod_ctxless_event_monitor_multiple - this is just a wrapper aound
 
-  *       this routine which calls it for a single GPIO line.
 
-  */
 
- int gpiod_ctxless_event_monitor_ext(const char *device, int event_type,
 
- 				    unsigned int offset, bool active_low,
 
- 				    const char *consumer,
 
- 				    const struct timespec *timeout,
 
- 				    gpiod_ctxless_event_poll_cb poll_cb,
 
- 				    gpiod_ctxless_event_handle_cb event_cb,
 
- 				    void *data, int flags) GPIOD_API;
 
- /**
 
-  * @brief Wait for events on multiple GPIO lines.
 
-  * @param device Name, path, number or label of the gpiochip.
 
-  * @param event_type Type of events to listen for.
 
-  * @param offsets Array of GPIO line offsets to monitor.
 
-  * @param num_lines Number of lines to monitor.
 
-  * @param active_low The active state of this line - true if low.
 
-  * @param consumer Name of the consumer.
 
-  * @param timeout Maximum wait time for each iteration.
 
-  * @param poll_cb Callback function to call when waiting for events. Can
 
-  *                be NULL.
 
-  * @param event_cb Callback function to call on event occurrence.
 
-  * @param data User data passed to the callback.
 
-  * @return 0 no errors were encountered, -1 if an error occurred.
 
-  * @note The poll callback can be NULL in which case the routine will fall
 
-  *       back to a basic, ppoll() based callback.
 
-  *
 
-  * Internally this routine opens the GPIO chip, requests the set of lines for
 
-  * the type of events specified in the event_type parameter and calls the
 
-  * polling callback in a loop. The role of the polling callback is to detect
 
-  * input events on a set of file descriptors and notify the caller about the
 
-  * fds ready for reading.
 
-  *
 
-  * The ctxless event loop then reads each queued event from marked descriptors
 
-  * and calls the event callback. Both callbacks can stop the loop at any
 
-  * point.
 
-  *
 
-  * The poll_cb argument can be NULL in which case the function falls back to
 
-  * a default, ppoll() based callback.
 
-  */
 
- int gpiod_ctxless_event_monitor_multiple(
 
- 			const char *device, int event_type,
 
- 			const unsigned int *offsets,
 
- 			unsigned int num_lines, bool active_low,
 
- 			const char *consumer, const struct timespec *timeout,
 
- 			gpiod_ctxless_event_poll_cb poll_cb,
 
- 			gpiod_ctxless_event_handle_cb event_cb,
 
- 			void *data) GPIOD_API;
 
- /**
 
-  * @brief Wait for events on multiple GPIO lines.
 
-  * @param device Name, path, number or label of the gpiochip.
 
-  * @param event_type Type of events to listen for.
 
-  * @param offsets Array of GPIO line offsets to monitor.
 
-  * @param num_lines Number of lines to monitor.
 
-  * @param active_low The active state of this line - true if low.
 
-  * @param consumer Name of the consumer.
 
-  * @param timeout Maximum wait time for each iteration.
 
-  * @param poll_cb Callback function to call when waiting for events. Can
 
-  *                be NULL.
 
-  * @param event_cb Callback function to call on event occurrence.
 
-  * @param data User data passed to the callback.
 
-  * @param flags The flags for the lines.
 
-  * @return 0 no errors were encountered, -1 if an error occurred.
 
-  * @note The poll callback can be NULL in which case the routine will fall
 
-  *       back to a basic, ppoll() based callback.
 
-  *
 
-  * Internally this routine opens the GPIO chip, requests the set of lines for
 
-  * the type of events specified in the event_type parameter and calls the
 
-  * polling callback in a loop. The role of the polling callback is to detect
 
-  * input events on a set of file descriptors and notify the caller about the
 
-  * fds ready for reading.
 
-  *
 
-  * The ctxless event loop then reads each queued event from marked descriptors
 
-  * and calls the event callback. Both callbacks can stop the loop at any
 
-  * point.
 
-  *
 
-  * The poll_cb argument can be NULL in which case the function falls back to
 
-  * a default, ppoll() based callback.
 
-  */
 
- int gpiod_ctxless_event_monitor_multiple_ext(
 
- 			const char *device, int event_type,
 
- 			const unsigned int *offsets,
 
- 			unsigned int num_lines, bool active_low,
 
- 			const char *consumer, const struct timespec *timeout,
 
- 			gpiod_ctxless_event_poll_cb poll_cb,
 
- 			gpiod_ctxless_event_handle_cb event_cb,
 
- 			void *data, int flags) GPIOD_API;
 
- /**
 
-  * @brief Determine the chip name and line offset of a line with given name.
 
-  * @param name The name of the GPIO line to lookup.
 
-  * @param chipname Buffer in which the name of the GPIO chip will be stored.
 
-  * @param chipname_size Size of the chip name buffer.
 
-  * @param offset Pointer to an integer in which the line offset will be stored.
 
-  * @return -1 on error, 0 if the line with given name doesn't exist and 1 if
 
-  *         the line was found. In the first two cases the contents of chipname
 
-  *         and offset remain unchanged.
 
-  * @note The chip name is truncated if the buffer can't hold its entire size.
 
-  * @attention GPIO line names are not unique in the linux kernel, neither
 
-  *            globally nor within a single chip. This function finds the first
 
-  *            line with given name.
 
-  */
 
- int gpiod_ctxless_find_line(const char *name, char *chipname,
 
- 			    size_t chipname_size,
 
- 			    unsigned int *offset) GPIOD_API;
 
- /**
 
-  * @}
 
-  *
 
-  * @defgroup chips GPIO chip operations
 
-  * @{
 
-  *
 
-  * Functions and data structures dealing with GPIO chips.
 
-  */
 
- /**
 
-  * @brief Open a gpiochip by path.
 
-  * @param path Path to the gpiochip device file.
 
-  * @return GPIO chip handle or NULL if an error occurred.
 
-  */
 
- struct gpiod_chip *gpiod_chip_open(const char *path) GPIOD_API;
 
- /**
 
-  * @brief Open a gpiochip by name.
 
-  * @param name Name of the gpiochip to open.
 
-  * @return GPIO chip handle or NULL if an error occurred.
 
-  *
 
-  * This routine appends name to '/dev/' to create the path.
 
-  */
 
- struct gpiod_chip *gpiod_chip_open_by_name(const char *name) GPIOD_API;
 
- /**
 
-  * @brief Open a gpiochip by number.
 
-  * @param num Number of the gpiochip.
 
-  * @return GPIO chip handle or NULL if an error occurred.
 
-  *
 
-  * This routine appends num to '/dev/gpiochip' to create the path.
 
-  */
 
- struct gpiod_chip *gpiod_chip_open_by_number(unsigned int num) GPIOD_API;
 
- /**
 
-  * @brief Open a gpiochip by label.
 
-  * @param label Label of the gpiochip to open.
 
-  * @return GPIO chip handle or NULL if the chip with given label was not found
 
-  *         or an error occured.
 
-  * @note If the chip cannot be found but no other error occurred, errno is set
 
-  *       to ENOENT.
 
-  */
 
- struct gpiod_chip *gpiod_chip_open_by_label(const char *label) GPIOD_API;
 
- /**
 
-  * @brief Open a gpiochip based on the best guess what the path is.
 
-  * @param descr String describing the gpiochip.
 
-  * @return GPIO chip handle or NULL if an error occurred.
 
-  *
 
-  * This routine tries to figure out whether the user passed it the path to the
 
-  * GPIO chip, its name, label or number as a string. Then it tries to open it
 
-  * using one of the gpiod_chip_open** variants.
 
-  */
 
- struct gpiod_chip *gpiod_chip_open_lookup(const char *descr) GPIOD_API;
 
- /**
 
-  * @brief Close a GPIO chip handle and release all allocated resources.
 
-  * @param chip The GPIO chip object.
 
-  */
 
- void gpiod_chip_close(struct gpiod_chip *chip) GPIOD_API;
 
- /**
 
-  * @brief Get the GPIO chip name as represented in the kernel.
 
-  * @param chip The GPIO chip object.
 
-  * @return Pointer to a human-readable string containing the chip name.
 
-  */
 
- const char *gpiod_chip_name(struct gpiod_chip *chip) GPIOD_API;
 
- /**
 
-  * @brief Get the GPIO chip label as represented in the kernel.
 
-  * @param chip The GPIO chip object.
 
-  * @return Pointer to a human-readable string containing the chip label.
 
-  */
 
- const char *gpiod_chip_label(struct gpiod_chip *chip) GPIOD_API;
 
- /**
 
-  * @brief Get the number of GPIO lines exposed by this chip.
 
-  * @param chip The GPIO chip object.
 
-  * @return Number of GPIO lines.
 
-  */
 
- unsigned int gpiod_chip_num_lines(struct gpiod_chip *chip) GPIOD_API;
 
- /**
 
-  * @brief Get the handle to the GPIO line at given offset.
 
-  * @param chip The GPIO chip object.
 
-  * @param offset The offset of the GPIO line.
 
-  * @return Pointer to the GPIO line handle or NULL if an error occured.
 
-  */
 
- struct gpiod_line *
 
- gpiod_chip_get_line(struct gpiod_chip *chip, unsigned int offset) GPIOD_API;
 
- /**
 
-  * @brief Retrieve a set of lines and store them in a line bulk object.
 
-  * @param chip The GPIO chip object.
 
-  * @param offsets Array of offsets of lines to retrieve.
 
-  * @param num_offsets Number of lines to retrieve.
 
-  * @param bulk Line bulk object in which to store the line handles.
 
-  * @return 0 on success, -1 on error.
 
-  */
 
- int gpiod_chip_get_lines(struct gpiod_chip *chip,
 
- 			 unsigned int *offsets, unsigned int num_offsets,
 
- 			 struct gpiod_line_bulk *bulk) GPIOD_API;
 
- /**
 
-  * @brief Retrieve all lines exposed by a chip and store them in a bulk object.
 
-  * @param chip The GPIO chip object.
 
-  * @param bulk Line bulk object in which to store the line handles.
 
-  * @return 0 on success, -1 on error.
 
-  */
 
- int gpiod_chip_get_all_lines(struct gpiod_chip *chip,
 
- 			     struct gpiod_line_bulk *bulk) GPIOD_API;
 
- /**
 
-  * @brief Find a GPIO line by name among lines associated with given GPIO chip.
 
-  * @param chip The GPIO chip object.
 
-  * @param name The name of the GPIO line.
 
-  * @return Pointer to the GPIO line handle or NULL if the line could not be
 
-  *         found or an error occurred.
 
-  * @note In case a line with given name is not associated with given chip, the
 
-  *       function sets errno to ENOENT.
 
-  * @attention GPIO line names are not unique in the linux kernel, neither
 
-  *            globally nor within a single chip. This function finds the first
 
-  *            line with given name.
 
-  */
 
- struct gpiod_line *
 
- gpiod_chip_find_line(struct gpiod_chip *chip, const char *name) GPIOD_API;
 
- /**
 
-  * @brief Find a set of GPIO lines by names among lines exposed by this chip.
 
-  * @param chip The GPIO chip object.
 
-  * @param names Array of pointers to C-strings containing the names of the
 
-  *              lines to lookup. Must end with a NULL-pointer.
 
-  * @param bulk Line bulk object in which the located lines will be stored.
 
-  * @return 0 if all lines were located, -1 on error.
 
-  * @note If at least one line from the list could not be found among the lines
 
-  *       exposed by this chip, the function sets errno to ENOENT.
 
-  * @attention GPIO line names are not unique in the linux kernel, neither
 
-  *            globally nor within a single chip. This function finds the first
 
-  *            line with given name.
 
-  */
 
- int gpiod_chip_find_lines(struct gpiod_chip *chip, const char **names,
 
- 			  struct gpiod_line_bulk *bulk) GPIOD_API;
 
- /**
 
-  * @}
 
-  *
 
-  * @defgroup lines GPIO line operations
 
-  * @{
 
-  *
 
-  * Functions and data structures dealing with GPIO lines.
 
-  *
 
-  * @defgroup line_bulk Operating on multiple lines
 
-  * @{
 
-  *
 
-  * Convenience data structures and helper functions for storing and operating
 
-  * on multiple lines at once.
 
-  */
 
- /**
 
-  * @brief Maximum number of GPIO lines that can be requested at once.
 
-  */
 
- #define GPIOD_LINE_BULK_MAX_LINES	64
 
- /**
 
-  * @brief Helper structure for storing a set of GPIO line objects.
 
-  *
 
-  * This structure is used in all operations involving sets of GPIO lines. If
 
-  * a bulk object is being passed to a function while containing zero lines,
 
-  * the result is undefined.
 
-  */
 
- struct gpiod_line_bulk {
 
- 	struct gpiod_line *lines[GPIOD_LINE_BULK_MAX_LINES];
 
- 	/**< Buffer for line pointers. */
 
- 	unsigned int num_lines;
 
- 	/**< Number of lines currently held in this structure. */
 
- };
 
- /**
 
-  * @brief Static initializer for GPIO bulk objects.
 
-  *
 
-  * This macro simply sets the internally held number of lines to 0.
 
-  */
 
- #define GPIOD_LINE_BULK_INITIALIZER	{ { NULL }, 0 }
 
- /**
 
-  * @brief Initialize a GPIO bulk object.
 
-  * @param bulk Line bulk object.
 
-  *
 
-  * This routine simply sets the internally held number of lines to 0.
 
-  */
 
- static inline void gpiod_line_bulk_init(struct gpiod_line_bulk *bulk)
 
- {
 
- 	bulk->num_lines = 0;
 
- }
 
- /**
 
-  * @brief Add a single line to a GPIO bulk object.
 
-  * @param bulk Line bulk object.
 
-  * @param line Line to add.
 
-  */
 
- static inline void gpiod_line_bulk_add(struct gpiod_line_bulk *bulk,
 
- 				       struct gpiod_line *line)
 
- {
 
- 	bulk->lines[bulk->num_lines++] = line;
 
- }
 
- /**
 
-  * @brief Retrieve the line handle from a line bulk object at given offset.
 
-  * @param bulk Line bulk object.
 
-  * @param offset Line offset.
 
-  * @return Line handle at given offset.
 
-  */
 
- static inline struct gpiod_line *
 
- gpiod_line_bulk_get_line(struct gpiod_line_bulk *bulk, unsigned int offset)
 
- {
 
- 	return bulk->lines[offset];
 
- }
 
- /**
 
-  * @brief Retrieve the number of GPIO lines held by this line bulk object.
 
-  * @param bulk Line bulk object.
 
-  * @return Number of lines held by this line bulk.
 
-  */
 
- static inline unsigned int
 
- gpiod_line_bulk_num_lines(struct gpiod_line_bulk *bulk)
 
- {
 
- 	return bulk->num_lines;
 
- }
 
- /**
 
-  * @brief Iterate over all line handles held by a line bulk object.
 
-  * @param bulk Line bulk object.
 
-  * @param line GPIO line handle. On each iteration, the subsequent line handle
 
-  *             is assigned to this pointer.
 
-  * @param lineptr Pointer to a GPIO line handle used to store the loop state.
 
-  */
 
- #define gpiod_line_bulk_foreach_line(bulk, line, lineptr)		\
 
- 	for ((lineptr) = (bulk)->lines, (line) = *(lineptr);		\
 
- 	     (lineptr) <= (bulk)->lines + ((bulk)->num_lines - 1);	\
 
- 	     (lineptr)++, (line) = *(lineptr))
 
- /**
 
-  * @brief Iterate over all line handles held by a line bulk object (integer
 
-  *        counter variant).
 
-  * @param bulk Line bulk object.
 
-  * @param line GPIO line handle. On each iteration, the subsequent line handle
 
-  *             is assigned to this pointer.
 
-  * @param offset An integer variable used to store the loop state.
 
-  *
 
-  * This is a variant of ::gpiod_line_bulk_foreach_line which uses an integer
 
-  * variable (either signed or unsigned) to store the loop state. This offset
 
-  * variable is guaranteed to correspond to the offset of the current line in
 
-  * the bulk->lines array.
 
-  */
 
- #define gpiod_line_bulk_foreach_line_off(bulk, line, offset)		\
 
- 	for ((offset) = 0, (line) = (bulk)->lines[0];			\
 
- 	     (offset) < (bulk)->num_lines;				\
 
- 	     (offset)++, (line) = (bulk)->lines[(offset)])
 
- /**
 
-  * @}
 
-  *
 
-  * @defgroup line_info Line info
 
-  * @{
 
-  *
 
-  * Definitions and functions for retrieving kernel information about both
 
-  * requested and free lines.
 
-  */
 
- /**
 
-  * @brief Possible direction settings.
 
-  */
 
- enum {
 
- 	GPIOD_LINE_DIRECTION_INPUT = 1,
 
- 	/**< Direction is input - we're reading the state of a GPIO line. */
 
- 	GPIOD_LINE_DIRECTION_OUTPUT,
 
- 	/**< Direction is output - we're driving the GPIO line. */
 
- };
 
- /**
 
-  * @brief Possible active state settings.
 
-  */
 
- enum {
 
- 	GPIOD_LINE_ACTIVE_STATE_HIGH = 1,
 
- 	/**< The active state of a GPIO is active-high. */
 
- 	GPIOD_LINE_ACTIVE_STATE_LOW,
 
- 	/**< The active state of a GPIO is active-low. */
 
- };
 
- /**
 
-  * @brief Possible internal bias settings.
 
-  */
 
- enum {
 
- 	GPIOD_LINE_BIAS_AS_IS = 1,
 
- 	/**< The internal bias state is unknown. */
 
- 	GPIOD_LINE_BIAS_DISABLE,
 
- 	/**< The internal bias is disabled. */
 
- 	GPIOD_LINE_BIAS_PULL_UP,
 
- 	/**< The internal pull-up bias is enabled. */
 
- 	GPIOD_LINE_BIAS_PULL_DOWN,
 
- 	/**< The internal pull-down bias is enabled. */
 
- };
 
- /**
 
-  * @brief Read the GPIO line offset.
 
-  * @param line GPIO line object.
 
-  * @return Line offset.
 
-  */
 
- unsigned int gpiod_line_offset(struct gpiod_line *line) GPIOD_API;
 
- /**
 
-  * @brief Read the GPIO line name.
 
-  * @param line GPIO line object.
 
-  * @return Name of the GPIO line as it is represented in the kernel. This
 
-  *         routine returns a pointer to a null-terminated string or NULL if
 
-  *         the line is unnamed.
 
-  */
 
- const char *gpiod_line_name(struct gpiod_line *line) GPIOD_API;
 
- /**
 
-  * @brief Read the GPIO line consumer name.
 
-  * @param line GPIO line object.
 
-  * @return Name of the GPIO consumer name as it is represented in the
 
-  *         kernel. This routine returns a pointer to a null-terminated string
 
-  *         or NULL if the line is not used.
 
-  */
 
- const char *gpiod_line_consumer(struct gpiod_line *line) GPIOD_API;
 
- /**
 
-  * @brief Read the GPIO line direction setting.
 
-  * @param line GPIO line object.
 
-  * @return Returns GPIOD_LINE_DIRECTION_INPUT or GPIOD_LINE_DIRECTION_OUTPUT.
 
-  */
 
- int gpiod_line_direction(struct gpiod_line *line) GPIOD_API;
 
- /**
 
-  * @brief Read the GPIO line active state setting.
 
-  * @param line GPIO line object.
 
-  * @return Returns GPIOD_LINE_ACTIVE_STATE_HIGH or GPIOD_LINE_ACTIVE_STATE_LOW.
 
-  */
 
- int gpiod_line_active_state(struct gpiod_line *line) GPIOD_API;
 
- /**
 
-  * @brief Read the GPIO line bias setting.
 
-  * @param line GPIO line object.
 
-  * @return Returns GPIOD_LINE_BIAS_PULL_UP, GPIOD_LINE_BIAS_PULL_DOWN,
 
-  *         GPIOD_LINE_BIAS_DISABLE or GPIOD_LINE_BIAS_AS_IS.
 
-  */
 
- int gpiod_line_bias(struct gpiod_line *line) GPIOD_API;
 
- /**
 
-  * @brief Check if the line is currently in use.
 
-  * @param line GPIO line object.
 
-  * @return True if the line is in use, false otherwise.
 
-  *
 
-  * The user space can't know exactly why a line is busy. It may have been
 
-  * requested by another process or hogged by the kernel. It only matters that
 
-  * the line is used and we can't request it.
 
-  */
 
- bool gpiod_line_is_used(struct gpiod_line *line) GPIOD_API;
 
- /**
 
-  * @brief Check if the line is an open-drain GPIO.
 
-  * @param line GPIO line object.
 
-  * @return True if the line is an open-drain GPIO, false otherwise.
 
-  */
 
- bool gpiod_line_is_open_drain(struct gpiod_line *line) GPIOD_API;
 
- /**
 
-  * @brief Check if the line is an open-source GPIO.
 
-  * @param line GPIO line object.
 
-  * @return True if the line is an open-source GPIO, false otherwise.
 
-  */
 
- bool gpiod_line_is_open_source(struct gpiod_line *line) GPIOD_API;
 
- /**
 
-  * @brief Re-read the line info.
 
-  * @param line GPIO line object.
 
-  * @return 0 if the operation succeeds. In case of an error this routine
 
-  *         returns -1 and sets the last error number.
 
-  *
 
-  * The line info is initially retrieved from the kernel by
 
-  * gpiod_chip_get_line() and is later re-read after every successful request.
 
-  * Users can use this function to manually re-read the line info when needed.
 
-  *
 
-  * We currently have no mechanism provided by the kernel for keeping the line
 
-  * info synchronized and for the sake of speed and simplicity of this low-level
 
-  * library we don't want to re-read the line info automatically everytime
 
-  * a property is retrieved. Any daemon using this library must track the state
 
-  * of lines on its own and call this routine if needed.
 
-  *
 
-  * The state of requested lines is kept synchronized (or rather cannot be
 
-  * changed by external agents while the ownership of the line is taken) so
 
-  * there's no need to call this function in that case.
 
-  */
 
- int gpiod_line_update(struct gpiod_line *line) GPIOD_API;
 
- /**
 
-  * @brief Check if the line info needs to be updated.
 
-  * @param line GPIO line object.
 
-  * @return Always returns false.
 
-  * @deprecated This mechanism no longer exists in the library and this function
 
-  *             does nothing.
 
-  */
 
- bool
 
- gpiod_line_needs_update(struct gpiod_line *line) GPIOD_API GPIOD_DEPRECATED;
 
- /**
 
-  * @}
 
-  *
 
-  * @defgroup line_request Line requests
 
-  * @{
 
-  *
 
-  * Interface for requesting GPIO lines from userspace for both values and
 
-  * events.
 
-  */
 
- /**
 
-  * @brief Available types of requests.
 
-  */
 
- enum {
 
- 	GPIOD_LINE_REQUEST_DIRECTION_AS_IS = 1,
 
- 	/**< Request the line(s), but don't change current direction. */
 
- 	GPIOD_LINE_REQUEST_DIRECTION_INPUT,
 
- 	/**< Request the line(s) for reading the GPIO line state. */
 
- 	GPIOD_LINE_REQUEST_DIRECTION_OUTPUT,
 
- 	/**< Request the line(s) for setting the GPIO line state. */
 
- 	GPIOD_LINE_REQUEST_EVENT_FALLING_EDGE,
 
- 	/**< Only watch falling edge events. */
 
- 	GPIOD_LINE_REQUEST_EVENT_RISING_EDGE,
 
- 	/**< Only watch rising edge events. */
 
- 	GPIOD_LINE_REQUEST_EVENT_BOTH_EDGES,
 
- 	/**< Monitor both types of events. */
 
- };
 
- /**
 
-  * @brief Miscellaneous GPIO request flags.
 
-  */
 
- enum {
 
- 	GPIOD_LINE_REQUEST_FLAG_OPEN_DRAIN	= GPIOD_BIT(0),
 
- 	/**< The line is an open-drain port. */
 
- 	GPIOD_LINE_REQUEST_FLAG_OPEN_SOURCE	= GPIOD_BIT(1),
 
- 	/**< The line is an open-source port. */
 
- 	GPIOD_LINE_REQUEST_FLAG_ACTIVE_LOW	= GPIOD_BIT(2),
 
- 	/**< The active state of the line is low (high is the default). */
 
- 	GPIOD_LINE_REQUEST_FLAG_BIAS_DISABLE	= GPIOD_BIT(3),
 
- 	/**< The line has neither either pull-up nor pull-down resistor. */
 
- 	GPIOD_LINE_REQUEST_FLAG_BIAS_PULL_DOWN	= GPIOD_BIT(4),
 
- 	/**< The line has pull-down resistor enabled. */
 
- 	GPIOD_LINE_REQUEST_FLAG_BIAS_PULL_UP	= GPIOD_BIT(5),
 
- 	/**< The line has pull-up resistor enabled. */
 
- };
 
- /**
 
-  * @brief Structure holding configuration of a line request.
 
-  */
 
- struct gpiod_line_request_config {
 
- 	const char *consumer;
 
- 	/**< Name of the consumer. */
 
- 	int request_type;
 
- 	/**< Request type. */
 
- 	int flags;
 
- 	/**< Other configuration flags. */
 
- };
 
- /**
 
-  * @brief Reserve a single line.
 
-  * @param line GPIO line object.
 
-  * @param config Request options.
 
-  * @param default_val Initial line value - only relevant if we're setting
 
-  *                    the direction to output.
 
-  * @return 0 if the line was properly reserved. In case of an error this
 
-  *         routine returns -1 and sets the last error number.
 
-  *
 
-  * If this routine succeeds, the caller takes ownership of the GPIO line until
 
-  * it's released.
 
-  */
 
- int gpiod_line_request(struct gpiod_line *line,
 
- 		       const struct gpiod_line_request_config *config,
 
- 		       int default_val) GPIOD_API;
 
- /**
 
-  * @brief Reserve a single line, set the direction to input.
 
-  * @param line GPIO line object.
 
-  * @param consumer Name of the consumer.
 
-  * @return 0 if the line was properly reserved, -1 on failure.
 
-  */
 
- int gpiod_line_request_input(struct gpiod_line *line,
 
- 			     const char *consumer) GPIOD_API;
 
- /**
 
-  * @brief Reserve a single line, set the direction to output.
 
-  * @param line GPIO line object.
 
-  * @param consumer Name of the consumer.
 
-  * @param default_val Initial line value.
 
-  * @return 0 if the line was properly reserved, -1 on failure.
 
-  */
 
- int gpiod_line_request_output(struct gpiod_line *line,
 
- 			      const char *consumer, int default_val) GPIOD_API;
 
- /**
 
-  * @brief Request rising edge event notifications on a single line.
 
-  * @param line GPIO line object.
 
-  * @param consumer Name of the consumer.
 
-  * @return 0 if the operation succeeds, -1 on failure.
 
-  */
 
- int gpiod_line_request_rising_edge_events(struct gpiod_line *line,
 
- 					  const char *consumer) GPIOD_API;
 
- /**
 
-  * @brief Request falling edge event notifications on a single line.
 
-  * @param line GPIO line object.
 
-  * @param consumer Name of the consumer.
 
-  * @return 0 if the operation succeeds, -1 on failure.
 
-  */
 
- int gpiod_line_request_falling_edge_events(struct gpiod_line *line,
 
- 					   const char *consumer) GPIOD_API;
 
- /**
 
-  * @brief Request all event type notifications on a single line.
 
-  * @param line GPIO line object.
 
-  * @param consumer Name of the consumer.
 
-  * @return 0 if the operation succeeds, -1 on failure.
 
-  */
 
- int gpiod_line_request_both_edges_events(struct gpiod_line *line,
 
- 					 const char *consumer) GPIOD_API;
 
- /**
 
-  * @brief Reserve a single line, set the direction to input.
 
-  * @param line GPIO line object.
 
-  * @param consumer Name of the consumer.
 
-  * @param flags Additional request flags.
 
-  * @return 0 if the line was properly reserved, -1 on failure.
 
-  */
 
- int gpiod_line_request_input_flags(struct gpiod_line *line,
 
- 				   const char *consumer, int flags) GPIOD_API;
 
- /**
 
-  * @brief Reserve a single line, set the direction to output.
 
-  * @param line GPIO line object.
 
-  * @param consumer Name of the consumer.
 
-  * @param flags Additional request flags.
 
-  * @param default_val Initial line value.
 
-  * @return 0 if the line was properly reserved, -1 on failure.
 
-  */
 
- int gpiod_line_request_output_flags(struct gpiod_line *line,
 
- 				    const char *consumer, int flags,
 
- 				    int default_val) GPIOD_API;
 
- /**
 
-  * @brief Request rising edge event notifications on a single line.
 
-  * @param line GPIO line object.
 
-  * @param consumer Name of the consumer.
 
-  * @param flags Additional request flags.
 
-  * @return 0 if the operation succeeds, -1 on failure.
 
-  */
 
- int gpiod_line_request_rising_edge_events_flags(struct gpiod_line *line,
 
- 						const char *consumer,
 
- 						int flags) GPIOD_API;
 
- /**
 
-  * @brief Request falling edge event notifications on a single line.
 
-  * @param line GPIO line object.
 
-  * @param consumer Name of the consumer.
 
-  * @param flags Additional request flags.
 
-  * @return 0 if the operation succeeds, -1 on failure.
 
-  */
 
- int gpiod_line_request_falling_edge_events_flags(struct gpiod_line *line,
 
- 						 const char *consumer,
 
- 						 int flags) GPIOD_API;
 
- /**
 
-  * @brief Request all event type notifications on a single line.
 
-  * @param line GPIO line object.
 
-  * @param consumer Name of the consumer.
 
-  * @param flags Additional request flags.
 
-  * @return 0 if the operation succeeds, -1 on failure.
 
-  */
 
- int gpiod_line_request_both_edges_events_flags(struct gpiod_line *line,
 
- 					       const char *consumer,
 
- 					       int flags) GPIOD_API;
 
- /**
 
-  * @brief Reserve a set of GPIO lines.
 
-  * @param bulk Set of GPIO lines to reserve.
 
-  * @param config Request options.
 
-  * @param default_vals Initial line values - only relevant if we're setting
 
-  *                     the direction to output.
 
-  * @return 0 if the all lines were properly requested. In case of an error
 
-  *         this routine returns -1 and sets the last error number.
 
-  *
 
-  * If this routine succeeds, the caller takes ownership of the GPIO lines
 
-  * until they're released. All the requested lines must be prodivided by the
 
-  * same gpiochip.
 
-  */
 
- int gpiod_line_request_bulk(struct gpiod_line_bulk *bulk,
 
- 			    const struct gpiod_line_request_config *config,
 
- 			    const int *default_vals) GPIOD_API;
 
- /**
 
-  * @brief Reserve a set of GPIO lines, set the direction to input.
 
-  * @param bulk Set of GPIO lines to reserve.
 
-  * @param consumer Name of the consumer.
 
-  * @return 0 if the lines were properly reserved, -1 on failure.
 
-  */
 
- int gpiod_line_request_bulk_input(struct gpiod_line_bulk *bulk,
 
- 				  const char *consumer) GPIOD_API;
 
- /**
 
-  * @brief Reserve a set of GPIO lines, set the direction to output.
 
-  * @param bulk Set of GPIO lines to reserve.
 
-  * @param consumer Name of the consumer.
 
-  * @param default_vals Initial line values.
 
-  * @return 0 if the lines were properly reserved, -1 on failure.
 
-  */
 
- int gpiod_line_request_bulk_output(struct gpiod_line_bulk *bulk,
 
- 				   const char *consumer,
 
- 				   const int *default_vals) GPIOD_API;
 
- /**
 
-  * @brief Request rising edge event notifications on a set of lines.
 
-  * @param bulk Set of GPIO lines to request.
 
-  * @param consumer Name of the consumer.
 
-  * @return 0 if the operation succeeds, -1 on failure.
 
-  */
 
- int gpiod_line_request_bulk_rising_edge_events(struct gpiod_line_bulk *bulk,
 
- 					       const char *consumer) GPIOD_API;
 
- /**
 
-  * @brief Request falling edge event notifications on a set of lines.
 
-  * @param bulk Set of GPIO lines to request.
 
-  * @param consumer Name of the consumer.
 
-  * @return 0 if the operation succeeds, -1 on failure.
 
-  */
 
- int gpiod_line_request_bulk_falling_edge_events(struct gpiod_line_bulk *bulk,
 
- 						const char *consumer) GPIOD_API;
 
- /**
 
-  * @brief Request all event type notifications on a set of lines.
 
-  * @param bulk Set of GPIO lines to request.
 
-  * @param consumer Name of the consumer.
 
-  * @return 0 if the operation succeeds, -1 on failure.
 
-  */
 
- int gpiod_line_request_bulk_both_edges_events(struct gpiod_line_bulk *bulk,
 
- 					      const char *consumer) GPIOD_API;
 
- /**
 
-  * @brief Reserve a set of GPIO lines, set the direction to input.
 
-  * @param bulk Set of GPIO lines to reserve.
 
-  * @param consumer Name of the consumer.
 
-  * @param flags Additional request flags.
 
-  * @return 0 if the lines were properly reserved, -1 on failure.
 
-  */
 
- int gpiod_line_request_bulk_input_flags(struct gpiod_line_bulk *bulk,
 
- 					const char *consumer,
 
- 					int flags) GPIOD_API;
 
- /**
 
-  * @brief Reserve a set of GPIO lines, set the direction to output.
 
-  * @param bulk Set of GPIO lines to reserve.
 
-  * @param consumer Name of the consumer.
 
-  * @param flags Additional request flags.
 
-  * @param default_vals Initial line values.
 
-  * @return 0 if the lines were properly reserved, -1 on failure.
 
-  */
 
- int gpiod_line_request_bulk_output_flags(struct gpiod_line_bulk *bulk,
 
- 					 const char *consumer, int flags,
 
- 					 const int *default_vals) GPIOD_API;
 
- /**
 
-  * @brief Request rising edge event notifications on a set of lines.
 
-  * @param bulk Set of GPIO lines to request.
 
-  * @param consumer Name of the consumer.
 
-  * @param flags Additional request flags.
 
-  * @return 0 if the operation succeeds, -1 on failure.
 
-  */
 
- int gpiod_line_request_bulk_rising_edge_events_flags(
 
- 					struct gpiod_line_bulk *bulk,
 
- 					const char *consumer,
 
- 					int flags) GPIOD_API;
 
- /**
 
-  * @brief Request falling edge event notifications on a set of lines.
 
-  * @param bulk Set of GPIO lines to request.
 
-  * @param consumer Name of the consumer.
 
-  * @param flags Additional request flags.
 
-  * @return 0 if the operation succeeds, -1 on failure.
 
-  */
 
- int gpiod_line_request_bulk_falling_edge_events_flags(
 
- 					struct gpiod_line_bulk *bulk,
 
- 					const char *consumer,
 
- 					int flags) GPIOD_API;
 
- /**
 
-  * @brief Request all event type notifications on a set of lines.
 
-  * @param bulk Set of GPIO lines to request.
 
-  * @param consumer Name of the consumer.
 
-  * @param flags Additional request flags.
 
-  * @return 0 if the operation succeeds, -1 on failure.
 
-  */
 
- int gpiod_line_request_bulk_both_edges_events_flags(
 
- 					struct gpiod_line_bulk *bulk,
 
- 					const char *consumer,
 
- 					int flags) GPIOD_API;
 
- /**
 
-  * @brief Release a previously reserved line.
 
-  * @param line GPIO line object.
 
-  */
 
- void gpiod_line_release(struct gpiod_line *line) GPIOD_API;
 
- /**
 
-  * @brief Release a set of previously reserved lines.
 
-  * @param bulk Set of GPIO lines to release.
 
-  *
 
-  * If the lines were not previously requested together, the behavior is
 
-  * undefined.
 
-  */
 
- void gpiod_line_release_bulk(struct gpiod_line_bulk *bulk) GPIOD_API;
 
- /**
 
-  * @brief Check if the calling user has ownership of this line.
 
-  * @param line GPIO line object.
 
-  * @return True if given line was requested, false otherwise.
 
-  */
 
- bool gpiod_line_is_requested(struct gpiod_line *line) GPIOD_API;
 
- /**
 
-  * @brief Check if the calling user has neither requested ownership of this
 
-  *        line nor configured any event notifications.
 
-  * @param line GPIO line object.
 
-  * @return True if given line is free, false otherwise.
 
-  */
 
- bool gpiod_line_is_free(struct gpiod_line *line) GPIOD_API;
 
- /**
 
-  * @}
 
-  *
 
-  * @defgroup line_value Reading & setting line values
 
-  * @{
 
-  *
 
-  * Functions allowing to read and set GPIO line values for single lines and
 
-  * in bulk.
 
-  */
 
- /**
 
-  * @brief Read current value of a single GPIO line.
 
-  * @param line GPIO line object.
 
-  * @return 0 or 1 if the operation succeeds. On error this routine returns -1
 
-  *         and sets the last error number.
 
-  */
 
- int gpiod_line_get_value(struct gpiod_line *line) GPIOD_API;
 
- /**
 
-  * @brief Read current values of a set of GPIO lines.
 
-  * @param bulk Set of GPIO lines to reserve.
 
-  * @param values An array big enough to hold line_bulk->num_lines values.
 
-  * @return 0 is the operation succeeds. In case of an error this routine
 
-  *         returns -1 and sets the last error number.
 
-  *
 
-  * If succeeds, this routine fills the values array with a set of values in
 
-  * the same order, the lines are added to line_bulk. If the lines were not
 
-  * previously requested together, the behavior is undefined.
 
-  */
 
- int gpiod_line_get_value_bulk(struct gpiod_line_bulk *bulk,
 
- 			      int *values) GPIOD_API;
 
- /**
 
-  * @brief Set the value of a single GPIO line.
 
-  * @param line GPIO line object.
 
-  * @param value New value.
 
-  * @return 0 is the operation succeeds. In case of an error this routine
 
-  *         returns -1 and sets the last error number.
 
-  */
 
- int gpiod_line_set_value(struct gpiod_line *line, int value) GPIOD_API;
 
- /**
 
-  * @brief Set the values of a set of GPIO lines.
 
-  * @param bulk Set of GPIO lines to reserve.
 
-  * @param values An array holding line_bulk->num_lines new values for lines.
 
-  *               A NULL pointer is interpreted as a logical low for all lines.
 
-  * @return 0 is the operation succeeds. In case of an error this routine
 
-  *         returns -1 and sets the last error number.
 
-  *
 
-  * If the lines were not previously requested together, the behavior is
 
-  * undefined.
 
-  */
 
- int gpiod_line_set_value_bulk(struct gpiod_line_bulk *bulk,
 
- 			      const int *values) GPIOD_API;
 
- /**
 
-  * @}
 
-  *
 
-  * @defgroup line_config Setting line configuration
 
-  * @{
 
-  *
 
-  * Functions allowing modification of config options of GPIO lines requested
 
-  * from user-space.
 
-  */
 
- /**
 
-  * @brief Update the configuration of a single GPIO line.
 
-  * @param line GPIO line object.
 
-  * @param direction Updated direction which may be one of
 
-  *                  GPIOD_LINE_REQUEST_DIRECTION_AS_IS,
 
-  *                  GPIOD_LINE_REQUEST_DIRECTION_INPUT, or
 
-  *                  GPIOD_LINE_REQUEST_DIRECTION_OUTPUT.
 
-  * @param flags Replacement flags.
 
-  * @param value The new output value for the line when direction is
 
-  *              GPIOD_LINE_REQUEST_DIRECTION_OUTPUT.
 
-  * @return 0 is the operation succeeds. In case of an error this routine
 
-  *         returns -1 and sets the last error number.
 
-  */
 
- int gpiod_line_set_config(struct gpiod_line *line, int direction,
 
- 			  int flags, int value) GPIOD_API;
 
- /**
 
-  * @brief Update the configuration of a set of GPIO lines.
 
-  * @param bulk Set of GPIO lines.
 
-  * @param direction Updated direction which may be one of
 
-  *                  GPIOD_LINE_REQUEST_DIRECTION_AS_IS,
 
-  *                  GPIOD_LINE_REQUEST_DIRECTION_INPUT, or
 
-  *                  GPIOD_LINE_REQUEST_DIRECTION_OUTPUT.
 
-  * @param flags Replacement flags.
 
-  * @param values An array holding line_bulk->num_lines new logical values
 
-  *               for lines when direction is
 
-  *               GPIOD_LINE_REQUEST_DIRECTION_OUTPUT.
 
-  *               A NULL pointer is interpreted as a logical low for all lines.
 
-  * @return 0 is the operation succeeds. In case of an error this routine
 
-  *         returns -1 and sets the last error number.
 
-  *
 
-  * If the lines were not previously requested together, the behavior is
 
-  * undefined.
 
-  */
 
- int gpiod_line_set_config_bulk(struct gpiod_line_bulk *bulk,
 
- 			       int direction, int flags,
 
- 			       const int *values) GPIOD_API;
 
- /**
 
-  * @brief Update the configuration flags of a single GPIO line.
 
-  * @param line GPIO line object.
 
-  * @param flags Replacement flags.
 
-  * @return 0 is the operation succeeds. In case of an error this routine
 
-  *         returns -1 and sets the last error number.
 
-  */
 
- int gpiod_line_set_flags(struct gpiod_line *line, int flags) GPIOD_API;
 
- /**
 
-  * @brief Update the configuration flags of a set of GPIO lines.
 
-  * @param bulk Set of GPIO lines.
 
-  * @param flags Replacement flags.
 
-  * @return 0 is the operation succeeds. In case of an error this routine
 
-  *         returns -1 and sets the last error number.
 
-  *
 
-  * If the lines were not previously requested together, the behavior is
 
-  * undefined.
 
-  */
 
- int gpiod_line_set_flags_bulk(struct gpiod_line_bulk *bulk,
 
- 			      int flags) GPIOD_API;
 
- /**
 
-  * @brief Set the direction of a single GPIO line to input.
 
-  * @param line GPIO line object.
 
-  * @return 0 is the operation succeeds. In case of an error this routine
 
-  *         returns -1 and sets the last error number.
 
-  */
 
- int gpiod_line_set_direction_input(struct gpiod_line *line) GPIOD_API;
 
- /**
 
-  * @brief Set the direction of a set of GPIO lines to input.
 
-  * @param bulk Set of GPIO lines.
 
-  * @return 0 is the operation succeeds. In case of an error this routine
 
-  *         returns -1 and sets the last error number.
 
-  *
 
-  * If the lines were not previously requested together, the behavior is
 
-  * undefined.
 
-  */
 
- int
 
- gpiod_line_set_direction_input_bulk(struct gpiod_line_bulk *bulk) GPIOD_API;
 
- /**
 
-  * @brief Set the direction of a single GPIO line to output.
 
-  * @param line GPIO line object.
 
-  * @param value The logical value output on the line.
 
-  * @return 0 is the operation succeeds. In case of an error this routine
 
-  *         returns -1 and sets the last error number.
 
-  */
 
- int gpiod_line_set_direction_output(struct gpiod_line *line,
 
- 				    int value) GPIOD_API;
 
- /**
 
-  * @brief Set the direction of a set of GPIO lines to output.
 
-  * @param bulk Set of GPIO lines.
 
-  * @param values An array holding line_bulk->num_lines new logical values
 
-  *               for lines.  A NULL pointer is interpreted as a logical low
 
-  *               for all lines.
 
-  * @return 0 is the operation succeeds. In case of an error this routine
 
-  *         returns -1 and sets the last error number.
 
-  *
 
-  * If the lines were not previously requested together, the behavior is
 
-  * undefined.
 
-  */
 
- int gpiod_line_set_direction_output_bulk(struct gpiod_line_bulk *bulk,
 
- 					 const int *values) GPIOD_API;
 
- /**
 
-  * @}
 
-  *
 
-  * @defgroup line_event Line events handling
 
-  * @{
 
-  *
 
-  * Structures and functions allowing to poll lines for events and read them,
 
-  * both for individual lines as well as in bulk. Also contains functions for
 
-  * retrieving the associated file descriptors and operate on them for easy
 
-  * integration with standard unix interfaces.
 
-  */
 
- /**
 
-  * @brief Event types.
 
-  */
 
- enum {
 
- 	GPIOD_LINE_EVENT_RISING_EDGE = 1,
 
- 	/**< Rising edge event. */
 
- 	GPIOD_LINE_EVENT_FALLING_EDGE,
 
- 	/**< Falling edge event. */
 
- };
 
- /**
 
-  * @brief Structure holding event info.
 
-  */
 
- struct gpiod_line_event {
 
- 	struct timespec ts;
 
- 	/**< Best estimate of time of event occurrence. */
 
- 	int event_type;
 
- 	/**< Type of the event that occurred. */
 
- };
 
- /**
 
-  * @brief Wait for an event on a single line.
 
-  * @param line GPIO line object.
 
-  * @param timeout Wait time limit.
 
-  * @return 0 if wait timed out, -1 if an error occurred, 1 if an event
 
-  *         occurred.
 
-  */
 
- int gpiod_line_event_wait(struct gpiod_line *line,
 
- 			  const struct timespec *timeout) GPIOD_API;
 
- /**
 
-  * @brief Wait for events on a set of lines.
 
-  * @param bulk Set of GPIO lines to monitor.
 
-  * @param timeout Wait time limit.
 
-  * @param event_bulk Bulk object in which to store the line handles on which
 
-  *                   events occurred. Can be NULL.
 
-  * @return 0 if wait timed out, -1 if an error occurred, 1 if at least one
 
-  *         event occurred.
 
-  */
 
- int gpiod_line_event_wait_bulk(struct gpiod_line_bulk *bulk,
 
- 			       const struct timespec *timeout,
 
- 			       struct gpiod_line_bulk *event_bulk) GPIOD_API;
 
- /**
 
-  * @brief Read next pending event from the GPIO line.
 
-  * @param line GPIO line object.
 
-  * @param event Buffer to which the event data will be copied.
 
-  * @return 0 if the event was read correctly, -1 on error.
 
-  * @note This function will block if no event was queued for this line.
 
-  */
 
- int gpiod_line_event_read(struct gpiod_line *line,
 
- 			  struct gpiod_line_event *event) GPIOD_API;
 
- /**
 
-  * @brief Read up to a certain number of events from the GPIO line.
 
-  * @param line GPIO line object.
 
-  * @param events Buffer to which the event data will be copied. Must hold at
 
-  *               least the amount of events specified in num_events.
 
-  * @param num_events Specifies how many events can be stored in the buffer.
 
-  * @return On success returns the number of events stored in the buffer, on
 
-  *         failure -1 is returned.
 
-  */
 
- int gpiod_line_event_read_multiple(struct gpiod_line *line,
 
- 				   struct gpiod_line_event *events,
 
- 				   unsigned int num_events) GPIOD_API;
 
- /**
 
-  * @brief Get the event file descriptor.
 
-  * @param line GPIO line object.
 
-  * @return Number of the event file descriptor or -1 if the user tries to
 
-  *         retrieve the descriptor from a line that wasn't configured for
 
-  *         event monitoring.
 
-  *
 
-  * Users may want to poll the event file descriptor on their own. This routine
 
-  * allows to access it.
 
-  */
 
- int gpiod_line_event_get_fd(struct gpiod_line *line) GPIOD_API;
 
- /**
 
-  * @brief Read the last GPIO event directly from a file descriptor.
 
-  * @param fd File descriptor.
 
-  * @param event Buffer in which the event data will be stored.
 
-  * @return 0 if the event was read correctly, -1 on error.
 
-  *
 
-  * Users who directly poll the file descriptor for incoming events can also
 
-  * directly read the event data from it using this routine. This function
 
-  * translates the kernel representation of the event to the libgpiod format.
 
-  */
 
- int gpiod_line_event_read_fd(int fd, struct gpiod_line_event *event) GPIOD_API;
 
- /**
 
-  * @brief Read up to a certain number of events directly from a file descriptor.
 
-  * @param fd File descriptor.
 
-  * @param events Buffer to which the event data will be copied. Must hold at
 
-  *               least the amount of events specified in num_events.
 
-  * @param num_events Specifies how many events can be stored in the buffer.
 
-  * @return On success returns the number of events stored in the buffer, on
 
-  *         failure -1 is returned.
 
-  */
 
- int gpiod_line_event_read_fd_multiple(int fd, struct gpiod_line_event *events,
 
- 				      unsigned int num_events) GPIOD_API;
 
- /**
 
-  * @}
 
-  *
 
-  * @defgroup line_misc Misc line functions
 
-  * @{
 
-  *
 
-  * Functions that didn't fit anywhere else.
 
-  */
 
- /**
 
-  * @brief Get a GPIO line handle by GPIO chip description and offset.
 
-  * @param device String describing the gpiochip.
 
-  * @param offset The offset of the GPIO line.
 
-  * @return GPIO line handle or NULL if an error occurred.
 
-  *
 
-  * This routine provides a shorter alternative to calling
 
-  * ::gpiod_chip_open_lookup and ::gpiod_chip_get_line.
 
-  *
 
-  * If this function succeeds, the caller is responsible for closing the
 
-  * associated GPIO chip.
 
-  */
 
- struct gpiod_line *
 
- gpiod_line_get(const char *device, unsigned int offset) GPIOD_API;
 
- /**
 
-  * @brief Find a GPIO line by its name.
 
-  * @param name Name of the GPIO line.
 
-  * @return Returns the GPIO line handle if the line exists in the system or
 
-  *         NULL if it couldn't be located or an error occurred.
 
-  * @attention GPIO lines are not unique in the linux kernel, neither globally
 
-  *            nor within a single chip. This function finds the first line with
 
-  *            given name.
 
-  *
 
-  * If this routine succeeds, the user must manually close the GPIO chip owning
 
-  * this line to avoid memory leaks. If the line could not be found, this
 
-  * functions sets errno to ENOENT.
 
-  */
 
- struct gpiod_line *gpiod_line_find(const char *name) GPIOD_API;
 
- /**
 
-  * @brief Close a GPIO chip owning this line and release all resources.
 
-  * @param line GPIO line object
 
-  *
 
-  * After this function returns, the line must no longer be used.
 
-  */
 
- void gpiod_line_close_chip(struct gpiod_line *line) GPIOD_API;
 
- /**
 
-  * @brief Get the handle to the GPIO chip controlling this line.
 
-  * @param line The GPIO line object.
 
-  * @return Pointer to the GPIO chip handle controlling this line.
 
-  */
 
- struct gpiod_chip *gpiod_line_get_chip(struct gpiod_line *line) GPIOD_API;
 
- /**
 
-  * @}
 
-  *
 
-  * @}
 
-  *
 
-  * @defgroup iterators Iterators for GPIO chips and lines
 
-  * @{
 
-  *
 
-  * These functions and data structures allow easy iterating over GPIO
 
-  * chips and lines.
 
-  */
 
- /**
 
-  * @brief Create a new gpiochip iterator.
 
-  * @return Pointer to a new chip iterator object or NULL if an error occurred.
 
-  *
 
-  * Internally this routine scans the /dev/ directory for GPIO chip device
 
-  * files, opens them and stores their the handles until ::gpiod_chip_iter_free
 
-  * or ::gpiod_chip_iter_free_noclose is called.
 
-  */
 
- struct gpiod_chip_iter *gpiod_chip_iter_new(void) GPIOD_API;
 
- /**
 
-  * @brief Release all resources allocated for the gpiochip iterator and close
 
-  *        the most recently opened gpiochip (if any).
 
-  * @param iter The gpiochip iterator object.
 
-  */
 
- void gpiod_chip_iter_free(struct gpiod_chip_iter *iter) GPIOD_API;
 
- /**
 
-  * @brief Release all resources allocated for the gpiochip iterator but
 
-  *        don't close the most recently opened gpiochip (if any).
 
-  * @param iter The gpiochip iterator object.
 
-  *
 
-  * Users may want to break the loop when iterating over gpiochips and keep
 
-  * the most recently opened chip active while freeing the iterator data.
 
-  * This routine enables that.
 
-  */
 
- void gpiod_chip_iter_free_noclose(struct gpiod_chip_iter *iter) GPIOD_API;
 
- /**
 
-  * @brief Get the next gpiochip handle.
 
-  * @param iter The gpiochip iterator object.
 
-  * @return Pointer to the next open gpiochip handle or NULL if no more chips
 
-  *         are present in the system.
 
-  * @note The previous chip handle will be closed using ::gpiod_chip_iter_free.
 
-  */
 
- struct gpiod_chip *
 
- gpiod_chip_iter_next(struct gpiod_chip_iter *iter) GPIOD_API;
 
- /**
 
-  * @brief Get the next gpiochip handle without closing the previous one.
 
-  * @param iter The gpiochip iterator object.
 
-  * @return Pointer to the next open gpiochip handle or NULL if no more chips
 
-  *         are present in the system.
 
-  * @note This function works just like ::gpiod_chip_iter_next but doesn't
 
-  *       close the most recently opened chip handle.
 
-  */
 
- struct gpiod_chip *
 
- gpiod_chip_iter_next_noclose(struct gpiod_chip_iter *iter) GPIOD_API;
 
- /**
 
-  * @brief Iterate over all GPIO chips present in the system.
 
-  * @param iter An initialized GPIO chip iterator.
 
-  * @param chip Pointer to a GPIO chip handle. On each iteration the newly
 
-  *             opened chip handle is assigned to this argument.
 
-  *
 
-  * The user must not close the GPIO chip manually - instead the previous chip
 
-  * handle is closed automatically on the next iteration. The last chip to be
 
-  * opened is closed internally by ::gpiod_chip_iter_free.
 
-  */
 
- #define gpiod_foreach_chip(iter, chip)					\
 
- 	for ((chip) = gpiod_chip_iter_next(iter);			\
 
- 	     (chip);							\
 
- 	     (chip) = gpiod_chip_iter_next(iter))
 
- /**
 
-  * @brief Iterate over all chips present in the system without closing them.
 
-  * @param iter An initialized GPIO chip iterator.
 
-  * @param chip Pointer to a GPIO chip handle. On each iteration the newly
 
-  *             opened chip handle is assigned to this argument.
 
-  *
 
-  * The user must close all the GPIO chips manually after use, until then, the
 
-  * chips remain open. Free the iterator by calling
 
-  * ::gpiod_chip_iter_free_noclose to avoid closing the last chip automatically.
 
-  */
 
- #define gpiod_foreach_chip_noclose(iter, chip)				\
 
- 	for ((chip) = gpiod_chip_iter_next_noclose(iter);		\
 
- 	     (chip);							\
 
- 	     (chip) = gpiod_chip_iter_next_noclose(iter))
 
- /**
 
-  * @brief Create a new line iterator.
 
-  * @param chip Active gpiochip handle over the lines of which we want
 
-  *             to iterate.
 
-  * @return New line iterator or NULL if an error occurred.
 
-  */
 
- struct gpiod_line_iter *
 
- gpiod_line_iter_new(struct gpiod_chip *chip) GPIOD_API;
 
- /**
 
-  * @brief Free all resources associated with a GPIO line iterator.
 
-  * @param iter Line iterator object.
 
-  */
 
- void gpiod_line_iter_free(struct gpiod_line_iter *iter) GPIOD_API;
 
- /**
 
-  * @brief Get the next GPIO line handle.
 
-  * @param iter The GPIO line iterator object.
 
-  * @return Pointer to the next GPIO line handle or NULL if there are no more
 
-  *         lines left.
 
-  */
 
- struct gpiod_line *
 
- gpiod_line_iter_next(struct gpiod_line_iter *iter) GPIOD_API;
 
- /**
 
-  * @brief Iterate over all GPIO lines of a single chip.
 
-  * @param iter An initialized GPIO line iterator.
 
-  * @param line Pointer to a GPIO line handle - on each iteration, the
 
-  *             next GPIO line will be assigned to this argument.
 
-  */
 
- #define gpiod_foreach_line(iter, line)					\
 
- 	for ((line) = gpiod_line_iter_next(iter);			\
 
- 	     (line);							\
 
- 	     (line) = gpiod_line_iter_next(iter))
 
- /**
 
-  * @}
 
-  *
 
-  * @defgroup misc Stuff that didn't fit anywhere else
 
-  * @{
 
-  *
 
-  * Various libgpiod-related functions.
 
-  */
 
- /**
 
-  * @brief Get the API version of the library as a human-readable string.
 
-  * @return Human-readable string containing the library version.
 
-  */
 
- const char *gpiod_version_string(void) GPIOD_API;
 
- /**
 
-  * @}
 
-  */
 
- #ifdef __cplusplus
 
- } /* extern "C" */
 
- #endif
 
- #endif /* __LIBGPIOD_GPIOD_H__ */
 
 
  |