Documentation/driver-api/gpio/consumer.rst GitHub 원문 ↗

Linux 6.18.37 · Driver API

GPIO Descriptor Consumer Interface

GPIO descriptor 획득·direction·value·array·IRQ·ACPI와 legacy 변환 API를 설명합니다.

Source pathDocumentation/driver-api/gpio/consumer.rst
Source versionLinux v6.18.37
TranslationDUJINLABS 전문 번역 + 해설

요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.

1. 요약·해설

원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.

요약과 해설

consumer.rst:1-470

GPIO consumer는 opaque descriptor를 획득한 뒤 direction을 먼저 설정하고 실행 context에 맞는 logical-value accessor를 사용해야 합니다. Mapping layer가 active-low와 open-drain/source semantics를 처리하며, array API는 chip topology가 맞으면 bitmap fast path를 사용합니다.

Legacy integer API와 descriptor API의 소유권은 섞어 해제할 수 없습니다. ACPI에서는 _CRS resource와 _DSD connection ID를 GPIO subsystem이 연결합니다.

2. 영어 원문 전체

번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.

원문 전체 펼치기
1 ==================================
2 GPIO Descriptor Consumer Interface
3 ==================================
4
5 This document describes the consumer interface of the GPIO framework.
6
7
8 Guidelines for GPIOs consumers
9 ==============================
10
11 Drivers that can't work without standard GPIO calls should have Kconfig entries
12 that depend on GPIOLIB or select GPIOLIB. The functions that allow a driver to
13 obtain and use GPIOs are available by including the following file::
14
15 #include <linux/gpio/consumer.h>
16
17 There are static inline stubs for all functions in the header file in the case
18 where GPIOLIB is disabled. When these stubs are called they will emit
19 warnings. These stubs are used for two use cases:
20
21 - Simple compile coverage with e.g. COMPILE_TEST - it does not matter that
22 the current platform does not enable or select GPIOLIB because we are not
23 going to execute the system anyway.
24
25 - Truly optional GPIOLIB support - where the driver does not really make use
26 of the GPIOs on certain compile-time configurations for certain systems, but
27 will use it under other compile-time configurations. In this case the
28 consumer must make sure not to call into these functions, or the user will
29 be met with console warnings that may be perceived as intimidating.
30 Combining truly optional GPIOLIB usage with calls to
31 ``[devm_]gpiod_get_optional()`` is a *bad idea*, and will result in weird
32 error messages. Use the ordinary getter functions with optional GPIOLIB:
33 some open coding of error handling should be expected when you do this.
34
35 All the functions that work with the descriptor-based GPIO interface are
36 prefixed with ``gpiod_``. The ``gpio_`` prefix is used for the legacy
37 interface. No other function in the kernel should use these prefixes. The use
38 of the legacy functions is strongly discouraged, new code should use
39 <linux/gpio/consumer.h> and descriptors exclusively.
40
41
42 Obtaining and Disposing GPIOs
43 =============================
44
45 With the descriptor-based interface, GPIOs are identified with an opaque,
46 non-forgeable handler that must be obtained through a call to one of the
47 gpiod_get() functions. Like many other kernel subsystems, gpiod_get() takes the
48 device that will use the GPIO and the function the requested GPIO is supposed to
49 fulfill::
50
51 struct gpio_desc *gpiod_get(struct device *dev, const char *con_id,
52 enum gpiod_flags flags)
53
54 If a function is implemented by using several GPIOs together (e.g. a simple LED
55 device that displays digits), an additional index argument can be specified::
56
57 struct gpio_desc *gpiod_get_index(struct device *dev,
58 const char *con_id, unsigned int idx,
59 enum gpiod_flags flags)
60
61 For a more detailed description of the con_id parameter in the DeviceTree case
62 see Documentation/driver-api/gpio/board.rst
63
64 The flags parameter is used to optionally specify a direction and initial value
65 for the GPIO. Values can be:
66
67 * GPIOD_ASIS or 0 to not initialize the GPIO at all. The direction must be set
68 later with one of the dedicated functions.
69 * GPIOD_IN to initialize the GPIO as input.
70 * GPIOD_OUT_LOW to initialize the GPIO as output with a value of 0.
71 * GPIOD_OUT_HIGH to initialize the GPIO as output with a value of 1.
72 * GPIOD_OUT_LOW_OPEN_DRAIN same as GPIOD_OUT_LOW but also enforce the line
73 to be electrically used with open drain.
74 * GPIOD_OUT_HIGH_OPEN_DRAIN same as GPIOD_OUT_HIGH but also enforce the line
75 to be electrically used with open drain.
76
77 Note that the initial value is *logical* and the physical line level depends on
78 whether the line is configured active high or active low (see
79 :ref:`active_low_semantics`).
80
81 The two last flags are used for use cases where open drain is mandatory, such
82 as I2C: if the line is not already configured as open drain in the mappings
83 (see board.rst), then open drain will be enforced anyway and a warning will be
84 printed that the board configuration needs to be updated to match the use case.
85
86 Both functions return either a valid GPIO descriptor, or an error code checkable
87 with IS_ERR() (they will never return a NULL pointer). -ENOENT will be returned
88 if and only if no GPIO has been assigned to the device/function/index triplet,
89 other error codes are used for cases where a GPIO has been assigned but an error
90 occurred while trying to acquire it. This is useful to discriminate between mere
91 errors and an absence of GPIO for optional GPIO parameters. For the common
92 pattern where a GPIO is optional, the gpiod_get_optional() and
93 gpiod_get_index_optional() functions can be used. These functions return NULL
94 instead of -ENOENT if no GPIO has been assigned to the requested function::
95
96 struct gpio_desc *gpiod_get_optional(struct device *dev,
97 const char *con_id,
98 enum gpiod_flags flags)
99
100 struct gpio_desc *gpiod_get_index_optional(struct device *dev,
101 const char *con_id,
102 unsigned int index,
103 enum gpiod_flags flags)
104
105 Note that gpio_get*_optional() functions (and their managed variants), unlike
106 the rest of gpiolib API, also return NULL when gpiolib support is disabled.
107 This is helpful to driver authors, since they do not need to special case
108 -ENOSYS return codes. System integrators should however be careful to enable
109 gpiolib on systems that need it.
110
111 For a function using multiple GPIOs all of those can be obtained with one call::
112
113 struct gpio_descs *gpiod_get_array(struct device *dev,
114 const char *con_id,
115 enum gpiod_flags flags)
116
117 This function returns a struct gpio_descs which contains an array of
118 descriptors. It also contains a pointer to a gpiolib private structure which,
119 if passed back to get/set array functions, may speed up I/O processing::
120
121 struct gpio_descs {
122 struct gpio_array *info;
123 unsigned int ndescs;
124 struct gpio_desc *desc[];
125 }
126
127 The following function returns NULL instead of -ENOENT if no GPIOs have been
128 assigned to the requested function::
129
130 struct gpio_descs *gpiod_get_array_optional(struct device *dev,
131 const char *con_id,
132 enum gpiod_flags flags)
133
134 Device-managed variants of these functions are also defined::
135
136 struct gpio_desc *devm_gpiod_get(struct device *dev, const char *con_id,
137 enum gpiod_flags flags)
138
139 struct gpio_desc *devm_gpiod_get_index(struct device *dev,
140 const char *con_id,
141 unsigned int idx,
142 enum gpiod_flags flags)
143
144 struct gpio_desc *devm_gpiod_get_optional(struct device *dev,
145 const char *con_id,
146 enum gpiod_flags flags)
147
148 struct gpio_desc *devm_gpiod_get_index_optional(struct device *dev,
149 const char *con_id,
150 unsigned int index,
151 enum gpiod_flags flags)
152
153 struct gpio_descs *devm_gpiod_get_array(struct device *dev,
154 const char *con_id,
155 enum gpiod_flags flags)
156
157 struct gpio_descs *devm_gpiod_get_array_optional(struct device *dev,
158 const char *con_id,
159 enum gpiod_flags flags)
160
161 A GPIO descriptor can be disposed of using the gpiod_put() function::
162
163 void gpiod_put(struct gpio_desc *desc)
164
165 For an array of GPIOs this function can be used::
166
167 void gpiod_put_array(struct gpio_descs *descs)
168
169 It is strictly forbidden to use a descriptor after calling these functions.
170 It is also not allowed to individually release descriptors (using gpiod_put())
171 from an array acquired with gpiod_get_array().
172
173 The device-managed variants are, unsurprisingly::
174
175 void devm_gpiod_put(struct device *dev, struct gpio_desc *desc)
176
177 void devm_gpiod_put_array(struct device *dev, struct gpio_descs *descs)
178
179
180 Using GPIOs
181 ===========
182
183 Setting Direction
184 -----------------
185 The first thing a driver must do with a GPIO is setting its direction. If no
186 direction-setting flags have been given to gpiod_get*(), this is done by
187 invoking one of the gpiod_direction_*() functions::
188
189 int gpiod_direction_input(struct gpio_desc *desc)
190 int gpiod_direction_output(struct gpio_desc *desc, int value)
191
192 The return value is zero for success, else a negative errno. It should be
193 checked, since the get/set calls don't return errors and since misconfiguration
194 is possible. You should normally issue these calls from a task context. However,
195 for spinlock-safe GPIOs it is OK to use them before tasking is enabled, as part
196 of early board setup.
197
198 For output GPIOs, the value provided becomes the initial output value. This
199 helps avoid signal glitching during system startup.
200
201 A driver can also query the current direction of a GPIO::
202
203 int gpiod_get_direction(const struct gpio_desc *desc)
204
205 This function returns 0 for output, 1 for input, or an error code in case of error.
206
207 Be aware that there is no default direction for GPIOs. Therefore, **using a GPIO
208 without setting its direction first is illegal and will result in undefined
209 behavior!**
210
211
212 Spinlock-Safe GPIO Access
213 -------------------------
214 Most GPIO controllers can be accessed with memory read/write instructions. Those
215 don't need to sleep, and can safely be done from inside hard (non-threaded) IRQ
216 handlers and similar contexts.
217
218 Use the following calls to access GPIOs from an atomic context::
219
220 int gpiod_get_value(const struct gpio_desc *desc);
221 void gpiod_set_value(struct gpio_desc *desc, int value);
222
223 The values are boolean, zero for inactive, nonzero for active. When reading the
224 value of an output pin, the value returned should be what's seen on the pin.
225 That won't always match the specified output value, because of issues including
226 open-drain signaling and output latencies.
227
228 The get/set calls do not return errors because "invalid GPIO" should have been
229 reported earlier from gpiod_direction_*(). However, note that not all platforms
230 can read the value of output pins; those that can't should always return zero.
231 Also, using these calls for GPIOs that can't safely be accessed without sleeping
232 (see below) is an error.
233
234
235 GPIO Access That May Sleep
236 --------------------------
237 Some GPIO controllers must be accessed using message based buses like I2C or
238 SPI. Commands to read or write those GPIO values require waiting to get to the
239 head of a queue to transmit a command and get its response. This requires
240 sleeping, which can't be done from inside IRQ handlers.
241
242 Platforms that support this type of GPIO distinguish them from other GPIOs by
243 returning nonzero from this call::
244
245 int gpiod_cansleep(const struct gpio_desc *desc)
246
247 To access such GPIOs, a different set of accessors is defined::
248
249 int gpiod_get_value_cansleep(const struct gpio_desc *desc)
250 void gpiod_set_value_cansleep(struct gpio_desc *desc, int value)
251
252 Accessing such GPIOs requires a context which may sleep, for example a threaded
253 IRQ handler, and those accessors must be used instead of spinlock-safe
254 accessors without the cansleep() name suffix.
255
256 Other than the fact that these accessors might sleep, and will work on GPIOs
257 that can't be accessed from hardIRQ handlers, these calls act the same as the
258 spinlock-safe calls.
259
260
261 .. _active_low_semantics:
262
263 The active low and open drain semantics
264 ---------------------------------------
265 As a consumer should not have to care about the physical line level, all of the
266 gpiod_set_value_xxx() or gpiod_set_array_value_xxx() functions operate with
267 the *logical* value. With this they take the active low property into account.
268 This means that they check whether the GPIO is configured to be active low,
269 and if so, they manipulate the passed value before the physical line level is
270 driven.
271
272 The same is applicable for open drain or open source output lines: those do not
273 actively drive their output high (open drain) or low (open source), they just
274 switch their output to a high impedance value. The consumer should not need to
275 care. (For details read about open drain in driver.rst.)
276
277 With this, all the gpiod_set_(array)_value_xxx() functions interpret the
278 parameter "value" as "active" ("1") or "inactive" ("0"). The physical line
279 level will be driven accordingly.
280
281 As an example, if the active low property for a dedicated GPIO is set, and the
282 gpiod_set_(array)_value_xxx() passes "active" ("1"), the physical line level
283 will be driven low.
284
285 To summarize::
286
287 Function (example) line property physical line
288 gpiod_set_raw_value(desc, 0); don't care low
289 gpiod_set_raw_value(desc, 1); don't care high
290 gpiod_set_value(desc, 0); default (active high) low
291 gpiod_set_value(desc, 1); default (active high) high
292 gpiod_set_value(desc, 0); active low high
293 gpiod_set_value(desc, 1); active low low
294 gpiod_set_value(desc, 0); open drain low
295 gpiod_set_value(desc, 1); open drain high impedance
296 gpiod_set_value(desc, 0); open source high impedance
297 gpiod_set_value(desc, 1); open source high
298
299 It is possible to override these semantics using the set_raw/get_raw functions
300 but it should be avoided as much as possible, especially by system-agnostic drivers
301 which should not need to care about the actual physical line level and worry about
302 the logical value instead.
303
304
305 Accessing raw GPIO values
306 -------------------------
307 Consumers exist that need to manage the logical state of a GPIO line, i.e. the value
308 their device will actually receive, no matter what lies between it and the GPIO
309 line.
310
311 The following set of calls ignore the active-low or open drain property of a GPIO and
312 work on the raw line value::
313
314 int gpiod_get_raw_value(const struct gpio_desc *desc)
315 void gpiod_set_raw_value(struct gpio_desc *desc, int value)
316 int gpiod_get_raw_value_cansleep(const struct gpio_desc *desc)
317 void gpiod_set_raw_value_cansleep(struct gpio_desc *desc, int value)
318 int gpiod_direction_output_raw(struct gpio_desc *desc, int value)
319
320 The active low state of a GPIO can also be queried and toggled using the
321 following calls::
322
323 int gpiod_is_active_low(const struct gpio_desc *desc)
324 void gpiod_toggle_active_low(struct gpio_desc *desc)
325
326 Note that these functions should only be used with great moderation; a driver
327 should not have to care about the physical line level or open drain semantics.
328
329
330 Access multiple GPIOs with a single function call
331 -------------------------------------------------
332 The following functions get or set the values of an array of GPIOs::
333
334 int gpiod_get_array_value(unsigned int array_size,
335 struct gpio_desc **desc_array,
336 struct gpio_array *array_info,
337 unsigned long *value_bitmap);
338 int gpiod_get_raw_array_value(unsigned int array_size,
339 struct gpio_desc **desc_array,
340 struct gpio_array *array_info,
341 unsigned long *value_bitmap);
342 int gpiod_get_array_value_cansleep(unsigned int array_size,
343 struct gpio_desc **desc_array,
344 struct gpio_array *array_info,
345 unsigned long *value_bitmap);
346 int gpiod_get_raw_array_value_cansleep(unsigned int array_size,
347 struct gpio_desc **desc_array,
348 struct gpio_array *array_info,
349 unsigned long *value_bitmap);
350
351 int gpiod_set_array_value(unsigned int array_size,
352 struct gpio_desc **desc_array,
353 struct gpio_array *array_info,
354 unsigned long *value_bitmap)
355 int gpiod_set_raw_array_value(unsigned int array_size,
356 struct gpio_desc **desc_array,
357 struct gpio_array *array_info,
358 unsigned long *value_bitmap)
359 int gpiod_set_array_value_cansleep(unsigned int array_size,
360 struct gpio_desc **desc_array,
361 struct gpio_array *array_info,
362 unsigned long *value_bitmap)
363 int gpiod_set_raw_array_value_cansleep(unsigned int array_size,
364 struct gpio_desc **desc_array,
365 struct gpio_array *array_info,
366 unsigned long *value_bitmap)
367
368 The array can be an arbitrary set of GPIOs. The functions will try to access
369 GPIOs belonging to the same bank or chip simultaneously if supported by the
370 corresponding chip driver. In that case a significantly improved performance
371 can be expected. If simultaneous access is not possible the GPIOs will be
372 accessed sequentially.
373
374 The functions take four arguments:
375
376 * array_size - the number of array elements
377 * desc_array - an array of GPIO descriptors
378 * array_info - optional information obtained from gpiod_get_array()
379 * value_bitmap - a bitmap to store the GPIOs' values (get) or
380 a bitmap of values to assign to the GPIOs (set)
381
382 The descriptor array can be obtained using the gpiod_get_array() function
383 or one of its variants. If the group of descriptors returned by that function
384 matches the desired group of GPIOs, those GPIOs can be accessed by simply using
385 the struct gpio_descs returned by gpiod_get_array()::
386
387 struct gpio_descs *my_gpio_descs = gpiod_get_array(...);
388 gpiod_set_array_value(my_gpio_descs->ndescs, my_gpio_descs->desc,
389 my_gpio_descs->info, my_gpio_value_bitmap);
390
391 It is also possible to access a completely arbitrary array of descriptors. The
392 descriptors may be obtained using any combination of gpiod_get() and
393 gpiod_get_array(). Afterwards the array of descriptors has to be setup
394 manually before it can be passed to one of the above functions. In that case,
395 array_info should be set to NULL.
396
397 Note that for optimal performance GPIOs belonging to the same chip should be
398 contiguous within the array of descriptors.
399
400 Still better performance may be achieved if array indexes of the descriptors
401 match hardware pin numbers of a single chip. If an array passed to a get/set
402 array function matches the one obtained from gpiod_get_array() and array_info
403 associated with the array is also passed, the function may take a fast bitmap
404 processing path, passing the value_bitmap argument directly to the respective
405 .get/set_multiple() callback of the chip. That allows for utilization of GPIO
406 banks as data I/O ports without much loss of performance.
407
408 The return value of gpiod_get_array_value() and its variants is 0 on success
409 or negative on error. Note the difference to gpiod_get_value(), which returns
410 0 or 1 on success to convey the GPIO value. With the array functions, the GPIO
411 values are stored in value_array rather than passed back as return value.
412
413
414 GPIOs mapped to IRQs
415 --------------------
416 GPIO lines can quite often be used as IRQs. You can get the IRQ number
417 corresponding to a given GPIO using the following call::
418
419 int gpiod_to_irq(const struct gpio_desc *desc)
420
421 It will return an IRQ number, or a negative errno code if the mapping can't be
422 done (most likely because that particular GPIO cannot be used as IRQ). It is an
423 unchecked error to use a GPIO that wasn't set up as an input using
424 gpiod_direction_input(), or to use an IRQ number that didn't originally come
425 from gpiod_to_irq(). gpiod_to_irq() is not allowed to sleep.
426
427 Non-error values returned from gpiod_to_irq() can be passed to request_irq() or
428 free_irq(). They will often be stored into IRQ resources for platform devices,
429 by the board-specific initialization code. Note that IRQ trigger options are
430 part of the IRQ interface, e.g. IRQF_TRIGGER_FALLING, as are system wakeup
431 capabilities.
432
433
434 GPIOs and ACPI
435 ==============
436
437 On ACPI systems, GPIOs are described by GpioIo()/GpioInt() resources listed by
438 the _CRS configuration objects of devices. Those resources do not provide
439 connection IDs (names) for GPIOs, so it is necessary to use an additional
440 mechanism for this purpose.
441
442 Systems compliant with ACPI 5.1 or newer may provide a _DSD configuration object
443 which, among other things, may be used to provide connection IDs for specific
444 GPIOs described by the GpioIo()/GpioInt() resources in _CRS. If that is the
445 case, it will be handled by the GPIO subsystem automatically. However, if the
446 _DSD is not present, the mappings between GpioIo()/GpioInt() resources and GPIO
447 connection IDs need to be provided by device drivers.
448
449 For details refer to Documentation/firmware-guide/acpi/gpio-properties.rst
450
451
452 Interacting With the Legacy GPIO Subsystem
453 ==========================================
454 Many kernel subsystems and drivers still handle GPIOs using the legacy
455 integer-based interface. It is strongly recommended to update these to the new
456 gpiod interface. For cases where both interfaces need to be used, the following
457 two functions allow to convert a GPIO descriptor into the GPIO integer namespace
458 and vice-versa::
459
460 int desc_to_gpio(const struct gpio_desc *desc)
461 struct gpio_desc *gpio_to_desc(unsigned gpio)
462
463 The GPIO number returned by desc_to_gpio() can safely be used as a parameter of
464 the gpio\_*() functions for as long as the GPIO descriptor `desc` is not freed.
465 All the same, a GPIO number passed to gpio_to_desc() must first be properly
466 acquired using e.g. gpio_request_one(), and the returned GPIO descriptor is only
467 considered valid until that GPIO number is released using gpio_free().
468
469 Freeing a GPIO obtained by one API with the other API is forbidden and an
470 unchecked error.
471

3. 한국어 전문 번역

영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.

GPIO consumer 지침

1-40

문서 제목은 `GPIO Descriptor Consumer Interface`이며 GPIO framework의 consumer interface를 설명합니다.

표준 GPIO call 없이는 동작할 수 없는 driver의 Kconfig entry는 `GPIOLIB`에 depend하거나 이를 select해야 합니다. Driver가 GPIO를 얻고 사용하는 function은 source path `include/linux/gpio/consumer.h`를 include하면 사용할 수 있습니다.

#include <linux/gpio/consumer.h>

`GPIOLIB`이 disable된 경우 header의 모든 function에는 static inline stub가 있고 호출 시 warning을 냅니다. Stub는 두 경우를 지원합니다.

첫째, `COMPILE_TEST` 같은 단순 compile coverage에서는 실제 system을 실행하지 않으므로 현재 platform이 `GPIOLIB`을 enable·select하지 않아도 상관없습니다.

둘째, compile-time configuration에 따라 일부 system에서는 GPIO를 쓰지 않고 다른 system에서는 사용하는 진정한 optional `GPIOLIB` 지원입니다. 이 경우 consumer는 disabled configuration에서 stub를 호출하지 않도록 해야 하며, 그렇지 않으면 console warning이 발생합니다.

진정한 optional `GPIOLIB` 사용과 `[devm_]gpiod_get_optional()` 호출을 결합하면 이상한 error message가 생기므로 피해야 합니다. Optional GPIOLIB에서는 일반 getter와 명시적 error handling을 사용합니다.

Descriptor interface function은 `gpiod_` prefix를, legacy interface는 `gpio_` prefix를 사용합니다. Kernel의 다른 function은 이 prefix를 쓰지 않아야 합니다. 새 code는 legacy function 대신 `<linux/gpio/consumer.h>`와 descriptor만 사용해야 합니다.

GPIOLIB consumer 구성 지침
사용 형태Kconfig·API 지침
GPIO 필수depend on 또는 select GPIOLIB
COMPILE_TESTStub로 compile coverage, 실행하지 않음
진정한 optionalDisabled 구성에서 GPIO call 금지, 일반 getter로 error 처리
새 codegpiod_ descriptor API만 사용

필수·compile-test·진정한 optional 사용의 처리 차이입니다.

GPIO descriptor 획득과 초기 flag

41-84

Descriptor interface에서 GPIO는 위조할 수 없는 opaque handler로 식별하며 `gpiod_get()` 계열을 통해 얻어야 합니다. `gpiod_get()`은 GPIO를 사용할 device와 요청한 GPIO의 function을 받습니다.

struct gpio_desc *gpiod_get(struct device *dev, const char *con_id,
                            enum gpiod_flags flags)

여러 GPIO가 하나의 function을 구현한다면 추가 index를 받는 `gpiod_get_index()`를 사용합니다.

struct gpio_desc *gpiod_get_index(struct device *dev,
                                  const char *con_id, unsigned int idx,
                                  enum gpiod_flags flags)

Device Tree에서 `con_id` parameter가 mapping되는 자세한 방식은 `Documentation/driver-api/gpio/board.rst`를 참조합니다.

`flags`는 GPIO direction과 초기 logical value를 선택적으로 지정합니다.

  • `GPIOD_ASIS` 또는 0: 초기화하지 않으며 나중에 전용 function으로 direction 설정
  • `GPIOD_IN`: input으로 초기화
  • `GPIOD_OUT_LOW`: logical 0 output으로 초기화
  • `GPIOD_OUT_HIGH`: logical 1 output으로 초기화
  • `GPIOD_OUT_LOW_OPEN_DRAIN`: logical 0 output과 open-drain electrical mode 강제
  • `GPIOD_OUT_HIGH_OPEN_DRAIN`: logical 1 output과 open-drain electrical mode 강제

초기값은 logical value이며 실제 line level은 active-high 또는 active-low 설정에 따라 달라집니다.

마지막 두 flag는 I2C처럼 open drain이 필수인 경우에 사용합니다. Mapping에서 open drain으로 구성하지 않았더라도 mode를 강제하고 board configuration을 고쳐야 한다는 warning을 출력합니다.

gpiod_get() direction flag
FlagDirectionLogical initialElectrical
GPIOD_ASIS변경 안 함없음Mapping 유지
GPIOD_INInput없음Input
GPIOD_OUT_LOWOutput0Mapping 유지
GPIOD_OUT_HIGHOutput1Mapping 유지
GPIOD_OUT_LOW_OPEN_DRAINOutput0Open drain 강제
GPIOD_OUT_HIGH_OPEN_DRAINOutput1Open drain 강제

초기 direction·logical value·electrical mode를 정리했습니다.

Optional GPIO와 return semantics

85-110

`gpiod_get()`과 `gpiod_get_index()`는 valid descriptor 또는 `IS_ERR()`로 검사할 error code를 반환하며 `NULL`은 반환하지 않습니다.

Device/function/index 조합에 GPIO가 전혀 할당되지 않았을 때만 `-ENOENT`를 반환합니다. GPIO가 할당됐지만 획득 중 실패한 경우에는 다른 error code를 사용하므로 optional parameter의 부재와 실제 error를 구분할 수 있습니다.

Optional GPIO에는 `gpiod_get_optional()`과 `gpiod_get_index_optional()`을 사용할 수 있으며 mapping이 없으면 `-ENOENT` 대신 `NULL`을 반환합니다.

struct gpio_desc *gpiod_get_optional(struct device *dev,
                                     const char *con_id,
                                     enum gpiod_flags flags)

struct gpio_desc *gpiod_get_index_optional(struct device *dev,
                                           const char *con_id,
                                           unsigned int index,
                                           enum gpiod_flags flags)

`gpio_get*_optional()` function과 managed variant는 나머지 gpiolib API와 달리 gpiolib support가 disable된 경우에도 `NULL`을 반환합니다. Driver는 `-ENOSYS`를 따로 처리할 필요가 없지만 system integrator는 필요한 system에서 gpiolib을 enable해야 합니다.

GPIO getter return 구분
GetterMapping 있음·성공Mapping 없음획득 error
gpiod_get*gpio_desc-ENOENT다른 ERR_PTR
gpiod_get*_optionalgpio_descNULLERR_PTR
Optional + GPIOLIB disabled해당 없음NULL해당 없음

일반·optional getter의 mapping 부재와 실제 error 반환입니다.

GPIO array 획득·해제와 devm

111-179

하나의 function이 여러 GPIO를 사용하면 `gpiod_get_array()` 한 번으로 모두 얻을 수 있습니다.

struct gpio_descs *gpiod_get_array(struct device *dev,
                                   const char *con_id,
                                   enum gpiod_flags flags)

반환되는 `struct gpio_descs`에는 descriptor array와 I/O를 빠르게 할 수 있는 gpiolib private `gpio_array` pointer가 들어 있습니다.

struct gpio_descs {
        struct gpio_array *info;
        unsigned int ndescs;
        struct gpio_desc *desc[];
}

Mapping이 없을 때 `NULL`을 반환하는 array optional variant도 있습니다.

struct gpio_descs *gpiod_get_array_optional(struct device *dev,
                                            const char *con_id,
                                            enum gpiod_flags flags)

Single·indexed·optional·array getter에는 device-managed variant가 모두 정의됩니다.

struct gpio_desc *devm_gpiod_get(struct device *dev, const char *con_id,
                                 enum gpiod_flags flags)

struct gpio_desc *devm_gpiod_get_index(struct device *dev,
                                       const char *con_id,
                                       unsigned int idx,
                                       enum gpiod_flags flags)

struct gpio_desc *devm_gpiod_get_optional(struct device *dev,
                                          const char *con_id,
                                          enum gpiod_flags flags)

struct gpio_desc *devm_gpiod_get_index_optional(struct device *dev,
                                                const char *con_id,
                                                unsigned int index,
                                                enum gpiod_flags flags)

struct gpio_descs *devm_gpiod_get_array(struct device *dev,
                                        const char *con_id,
                                        enum gpiod_flags flags)

struct gpio_descs *devm_gpiod_get_array_optional(struct device *dev,
                                                 const char *con_id,
                                                 enum gpiod_flags flags)

Single descriptor는 `gpiod_put()`으로 해제합니다.

void gpiod_put(struct gpio_desc *desc)

Array는 `gpiod_put_array()`로 전체를 해제합니다.

void gpiod_put_array(struct gpio_descs *descs)

해제한 descriptor는 절대 다시 사용하면 안 됩니다. `gpiod_get_array()`로 얻은 array의 개별 descriptor를 `gpiod_put()`으로 따로 해제하는 것도 허용되지 않습니다.

Device-managed 해제 variant는 다음과 같습니다.

void devm_gpiod_put(struct device *dev, struct gpio_desc *desc)

void devm_gpiod_put_array(struct device *dev, struct gpio_descs *descs)
GPIO descriptor lifecycle
gpiod_get*() 또는 gpiod_get_array()Direction 설정 후 descriptor 사용Single은 gpiod_put()Array는 gpiod_put_array()만 사용devm variant는 device lifecycle로 관리해제 후 descriptor 사용 금지

일반·array·devm descriptor의 획득과 해제 규칙입니다.

GPIO direction 설정

180-211

Driver가 GPIO에서 가장 먼저 해야 할 일은 direction 설정입니다. `gpiod_get*()`에 direction flag를 주지 않았다면 `gpiod_direction_*()` function을 호출합니다.

int gpiod_direction_input(struct gpio_desc *desc)
int gpiod_direction_output(struct gpio_desc *desc, int value)

성공하면 0, 실패하면 negative errno를 반환합니다. Get/set value call은 error를 반환하지 않고 misconfiguration 가능성이 있으므로 direction call의 return을 반드시 검사해야 합니다.

보통 task context에서 호출합니다. 다만 spinlock-safe GPIO라면 early board setup에서 tasking enable 전에도 사용할 수 있습니다.

Output GPIO에 전달한 value는 초기 output value가 되어 system startup 중 signal glitch를 방지합니다.

현재 direction은 다음 function으로 조회합니다.

int gpiod_get_direction(const struct gpio_desc *desc)

`gpiod_get_direction()`은 output이면 0, input이면 1, 실패하면 error code를 반환합니다. GPIO에는 default direction이 없으므로 먼저 direction을 설정하지 않고 사용하는 것은 illegal이며 undefined behavior입니다.

GPIO direction API
API역할Return
gpiod_direction_inputInput 설정0 또는 negative errno
gpiod_direction_outputOutput·초기 value 설정0 또는 negative errno
gpiod_get_direction현재 direction 조회0 output, 1 input, error

Direction 설정·조회와 return semantics입니다.

Spinlock-safe GPIO access

212-234

대부분의 GPIO controller는 sleep이 필요 없는 memory read/write instruction으로 접근할 수 있어 hard non-threaded IRQ handler 같은 context에서도 안전합니다.

Atomic context에서는 다음 call을 사용합니다.

int gpiod_get_value(const struct gpio_desc *desc);
void gpiod_set_value(struct gpio_desc *desc, int value);

Value는 boolean이며 0은 inactive, nonzero는 active입니다. Output pin을 읽으면 pin에서 실제로 보이는 값을 반환해야 하므로 open-drain signaling이나 output latency 때문에 지정한 output value와 다를 수 있습니다.

Invalid GPIO는 앞선 `gpiod_direction_*()`에서 보고되어야 하므로 get/set call은 error를 반환하지 않습니다. Output read를 지원하지 않는 platform은 항상 0을 반환해야 합니다. Sleep 없이 안전하게 접근할 수 없는 GPIO에 이 call을 사용하는 것은 error입니다.

Atomic GPIO value access
APIContextValue
gpiod_get_valueAtomic·hard IRQ 가능0 inactive, nonzero active
gpiod_set_valueAtomic·hard IRQ 가능Logical inactive·active

Hard IRQ에서도 가능한 accessor와 제한입니다.

Sleep 가능한 GPIO access

235-260

일부 GPIO controller는 I2C나 SPI 같은 message bus를 사용합니다. Command 전송과 response를 기다리려면 sleep해야 하므로 IRQ handler 안에서는 접근할 수 없습니다.

이런 GPIO는 다음 function이 nonzero를 반환해 구분합니다.

int gpiod_cansleep(const struct gpio_desc *desc)

Sleep이 필요한 GPIO에는 다음 accessor를 사용합니다.

int gpiod_get_value_cansleep(const struct gpio_desc *desc)
void gpiod_set_value_cansleep(struct gpio_desc *desc, int value)

Threaded IRQ handler처럼 sleep할 수 있는 context가 필요하며 `cansleep()` suffix가 없는 spinlock-safe accessor 대신 이 function을 사용해야 합니다. Sleep 가능성과 hardIRQ 사용 불가를 제외하면 동작은 spinlock-safe call과 같습니다.

GPIO context별 accessor 선택
Controller판별Accessor허용 context
Memory-mappedgpiod_cansleep() = 0gpiod_get/set_valueAtomic·hard IRQ
I2C·SPI 등 message busgpiod_cansleep() != 0gpiod_get/set_value_cansleepSleep 가능한 context

Controller 접근 방식과 실행 context에 따른 API입니다.

Active-low·open-drain logical semantics

261-304

Consumer가 실제 physical line level을 신경 쓰지 않도록 모든 `gpiod_set_value_xxx()`와 `gpiod_set_array_value_xxx()`는 logical value를 사용합니다. GPIO가 active low이면 전달된 value를 변환한 뒤 physical line을 구동합니다.

Open drain output은 high를 적극 구동하지 않고, open source output은 low를 적극 구동하지 않으며 대신 high-impedance 상태로 전환합니다. 이 electrical detail 역시 consumer가 처리할 필요가 없습니다. 자세한 내용은 `driver.rst`의 open-drain 설명을 참조합니다.

따라서 `gpiod_set_(array)_value_xxx()`의 `value`는 1이면 active, 0이면 inactive를 뜻합니다. 예를 들어 active-low GPIO에 active 1을 전달하면 실제 line level은 low가 됩니다.

Logical value와 physical line level
Function·valueLine propertyPhysical line
gpiod_set_raw_value(..., 0)무관Low
gpiod_set_raw_value(..., 1)무관High
gpiod_set_value(..., 0)Active highLow
gpiod_set_value(..., 1)Active highHigh
gpiod_set_value(..., 0)Active lowHigh
gpiod_set_value(..., 1)Active lowLow
gpiod_set_value(..., 0)Open drainLow
gpiod_set_value(..., 1)Open drainHigh impedance
gpiod_set_value(..., 0)Open sourceHigh impedance
gpiod_set_value(..., 1)Open sourceHigh

원문의 active-low·open-drain/source ASCII 표를 구조화했습니다.

`set_raw/get_raw` function으로 이 semantics를 override할 수 있지만 가능한 한 피해야 합니다. 특히 system-agnostic driver는 실제 physical level이 아니라 logical value에 집중해야 합니다.

Raw GPIO value access

305-329

일부 consumer는 GPIO line과 device 사이의 요소와 무관하게 device가 실제로 받을 logical state를 직접 관리해야 합니다.

다음 call은 active-low나 open-drain property를 무시하고 raw line value에 작동합니다.

int gpiod_get_raw_value(const struct gpio_desc *desc)
void gpiod_set_raw_value(struct gpio_desc *desc, int value)
int gpiod_get_raw_value_cansleep(const struct gpio_desc *desc)
void gpiod_set_raw_value_cansleep(struct gpio_desc *desc, int value)
int gpiod_direction_output_raw(struct gpio_desc *desc, int value)

GPIO의 active-low state도 다음 call로 조회하고 toggle할 수 있습니다.

int gpiod_is_active_low(const struct gpio_desc *desc)
void gpiod_toggle_active_low(struct gpio_desc *desc)

이 function은 매우 제한적으로 사용해야 합니다. 일반 driver는 physical line level이나 open-drain semantics를 직접 다룰 필요가 없어야 합니다.

Logical API와 raw API
API 계열Active-low 적용Open drain/source 적용권장
gpiod_get/set_value일반 consumer
gpiod_get/set_raw_value아니요아니요특수한 경우만
gpiod_direction_output_raw아니요아니요특수한 초기 output

Mapping semantics 적용 여부를 비교합니다.

여러 GPIO 동시 access

330-413

다음 function은 GPIO array의 value를 get 또는 set합니다.

int gpiod_get_array_value(unsigned int array_size,
                          struct gpio_desc **desc_array,
                          struct gpio_array *array_info,
                          unsigned long *value_bitmap);
int gpiod_get_raw_array_value(unsigned int array_size,
                              struct gpio_desc **desc_array,
                              struct gpio_array *array_info,
                              unsigned long *value_bitmap);
int gpiod_get_array_value_cansleep(unsigned int array_size,
                                   struct gpio_desc **desc_array,
                                   struct gpio_array *array_info,
                                   unsigned long *value_bitmap);
int gpiod_get_raw_array_value_cansleep(unsigned int array_size,
                                   struct gpio_desc **desc_array,
                                   struct gpio_array *array_info,
                                   unsigned long *value_bitmap);

int gpiod_set_array_value(unsigned int array_size,
                          struct gpio_desc **desc_array,
                          struct gpio_array *array_info,
                          unsigned long *value_bitmap)
int gpiod_set_raw_array_value(unsigned int array_size,
                              struct gpio_desc **desc_array,
                              struct gpio_array *array_info,
                              unsigned long *value_bitmap)
int gpiod_set_array_value_cansleep(unsigned int array_size,
                                   struct gpio_desc **desc_array,
                                   struct gpio_array *array_info,
                                   unsigned long *value_bitmap)
int gpiod_set_raw_array_value_cansleep(unsigned int array_size,
                                       struct gpio_desc **desc_array,
                                       struct gpio_array *array_info,
                                       unsigned long *value_bitmap)

Array는 임의의 GPIO 집합일 수 있습니다. Chip driver가 지원하면 같은 bank나 chip의 GPIO를 동시에 접근해 성능을 크게 높이고, 지원하지 않으면 순차 접근합니다.

Function은 네 argument를 받습니다.

  • `array_size`: array element 수
  • `desc_array`: GPIO descriptor array
  • `array_info`: `gpiod_get_array()`에서 얻은 optional 정보
  • `value_bitmap`: get 결과를 저장하거나 set 값을 제공하는 bitmap

`gpiod_get_array()`가 반환한 descriptor group이 원하는 GPIO 집합과 같다면 `struct gpio_descs`를 그대로 사용할 수 있습니다.

struct gpio_descs *my_gpio_descs = gpiod_get_array(...);
gpiod_set_array_value(my_gpio_descs->ndescs, my_gpio_descs->desc,
                      my_gpio_descs->info, my_gpio_value_bitmap);

`gpiod_get()`과 `gpiod_get_array()`를 조합해 완전히 임의의 descriptor array도 만들 수 있습니다. 이 경우 array를 수동으로 구성하고 `array_info`는 `NULL`로 둡니다.

최적 성능을 위해 같은 chip의 GPIO는 descriptor array 안에서 연속해야 합니다. Descriptor index가 한 chip의 hardware pin number와 일치하고 array와 `array_info`가 `gpiod_get_array()` 결과와 같으면 `value_bitmap`을 chip의 `.get/set_multiple()` callback에 직접 전달하는 fast bitmap path를 사용할 수 있습니다.

`gpiod_get_array_value()` 계열은 성공 시 0, 실패 시 negative error를 반환합니다. 성공 시 GPIO value 0 또는 1을 return하는 `gpiod_get_value()`와 달리 array value는 `value_bitmap`에 저장됩니다.

GPIO array API argument
Argument역할
array_sizeDescriptor 수
desc_arrayGPIO descriptor pointer array
array_infoOptional gpiod_get_array() private info
value_bitmapGet output 또는 set input bitmap

Array get/set에 공통인 네 argument입니다.

GPIO array performance path
같은 bank·chip GPIO를 묶음Chip driver가 simultaneous access 지원하면 병렬 처리같은 chip descriptor를 연속 배치Index와 hardware pin number 일치gpiod_get_array()의 array_info 전달value_bitmap을 .get/set_multiple()에 직접 전달

Sequential access에서 fast bitmap processing까지의 선택입니다.

GPIO를 IRQ로 mapping

414-433

GPIO line은 흔히 IRQ로 사용할 수 있습니다. 해당 GPIO의 IRQ number는 다음 call로 얻습니다.

int gpiod_to_irq(const struct gpio_desc *desc)

성공하면 IRQ number, mapping할 수 없으면 negative errno를 반환합니다. `gpiod_direction_input()`으로 input 설정하지 않은 GPIO를 사용하거나 `gpiod_to_irq()`에서 얻지 않은 IRQ number를 이 경로에서 사용하는 것은 unchecked error입니다. `gpiod_to_irq()`는 sleep할 수 없습니다.

성공한 IRQ number는 `request_irq()`와 `free_irq()`에 전달할 수 있고 board-specific initialization code가 platform device IRQ resource에 저장하기도 합니다. `IRQF_TRIGGER_FALLING` 같은 trigger option과 system wakeup 기능은 GPIO가 아니라 IRQ interface의 일부입니다.

GPIO IRQ 사용 순서
gpiod_direction_input(desc)gpiod_to_irq(desc)Negative errno 검사request_irq() 또는 platform IRQ resourceIRQ trigger·wakeup option은 IRQ interface에서 설정free_irq()

Descriptor를 input으로 설정한 뒤 IRQ interface로 넘기는 과정입니다.

GPIO와 ACPI

434-451

ACPI system에서 GPIO는 device의 `_CRS` configuration object에 나열된 `GpioIo()`와 `GpioInt()` resource로 기술됩니다. 이 resource에는 GPIO connection ID 또는 name이 없으므로 추가 mechanism이 필요합니다.

ACPI 5.1 이상 system은 `_DSD` configuration object로 `_CRS`의 특정 GPIO resource에 connection ID를 제공할 수 있으며 GPIO subsystem이 자동 처리합니다. `_DSD`가 없으면 device driver가 `GpioIo()`·`GpioInt()` resource와 GPIO connection ID의 mapping을 제공해야 합니다.

자세한 내용은 `Documentation/firmware-guide/acpi/gpio-properties.rst`를 참조합니다.

ACPI GPIO connection ID 해석
_CRS에 GpioIo() 또는 GpioInt() resourceACPI 5.1+에서 _DSD connection ID 확인_DSD가 있으면 GPIO subsystem이 자동 mapping_DSD가 없으면 device driver가 mapping 제공Consumer가 con_id로 descriptor 요청

_CRS resource와 _DSD name mapping의 관계입니다.

Legacy GPIO subsystem과 상호 운용

452-470

많은 kernel subsystem과 driver가 아직 legacy integer-based GPIO interface를 사용하지만 새 `gpiod` interface로 갱신하는 것을 강하게 권장합니다.

두 interface를 함께 써야 할 때 descriptor와 integer namespace를 다음 function으로 변환합니다.

int desc_to_gpio(const struct gpio_desc *desc)
struct gpio_desc *gpio_to_desc(unsigned gpio)

`desc_to_gpio()`가 반환한 GPIO number는 descriptor `desc`를 해제하기 전까지 `gpio_*()` function parameter로 안전하게 사용할 수 있습니다.

`gpio_to_desc()`에 전달할 GPIO number는 먼저 `gpio_request_one()` 같은 function으로 적절히 획득해야 하며, 반환 descriptor는 `gpio_free()`로 그 number를 해제할 때까지만 valid합니다.

한 API로 얻은 GPIO를 다른 API로 해제하는 것은 금지되며 unchecked error입니다.

Descriptor·legacy integer ownership
출발 API변환Valid 기간해제
gpiod descriptordesc_to_gpio()Descriptor가 valid한 동안gpiod_put() 계열
Legacy GPIO numbergpio_to_desc()gpio_free() 전까지gpio_free()

변환 후 validity와 해제 API의 소유권 규칙입니다.