€•⨌sphinx.addnodes”Œdocument”“”)�”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)�”}”(hhh]”(hŒ pending_xref”“”)�”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…”�”}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ4/translations/zh_CN/admin-guide/gpio/gpio-aggregator”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)�”}”(hhh]”hŒChinese (Traditional)”…”�”}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ4/translations/zh_TW/admin-guide/gpio/gpio-aggregator”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒItalian”…”�”}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ4/translations/it_IT/admin-guide/gpio/gpio-aggregator”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒJapanese”…”�”}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ4/translations/ja_JP/admin-guide/gpio/gpio-aggregator”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒKorean”…”�”}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ4/translations/ko_KR/admin-guide/gpio/gpio-aggregator”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒPortuguese (Brazilian)”…”�”}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ4/translations/pt_BR/admin-guide/gpio/gpio-aggregator”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒSpanish”…”�”}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ4/translations/sp_SP/admin-guide/gpio/gpio-aggregator”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒcomment”“”)�”}”(hŒ%SPDX-License-Identifier: GPL-2.0-only”h]”hŒ%SPDX-License-Identifier: GPL-2.0-only”…”�”}”hh·sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1hµhhh²hh³ŒN/var/lib/git/docbuild/linux/Documentation/admin-guide/gpio/gpio-aggregator.rst”h´KubhŒsection”“”)�”}”(hhh]”(hŒtitle”“”)�”}”(hŒGPIO Aggregator”h]”hŒGPIO Aggregator”…”�”}”(hhÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhhÊh²hh³hÇh´KubhŒ paragraph”“”)�”}”(hŒˆThe GPIO Aggregator provides a mechanism to aggregate GPIOs, and expose them as a new gpio_chip. This supports the following use cases.”h]”hŒˆThe GPIO Aggregator provides a mechanism to aggregate GPIOs, and expose them as a new gpio_chip. This supports the following use cases.”…”�”}”(hhßh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KhhÊh²hubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒAggregating GPIOs using Sysfs”h]”hŒAggregating GPIOs using Sysfs”…”�”}”(hhðh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhhíh²hh³hÇh´K ubhÞ)�”}”(hXGPIO controllers are exported to userspace using /dev/gpiochip* character devices. Access control to these devices is provided by standard UNIX file system permissions, on an all-or-nothing basis: either a GPIO controller is accessible for a user, or it is not.”h]”hXGPIO controllers are exported to userspace using /dev/gpiochip* character devices. Access control to these devices is provided by standard UNIX file system permissions, on an all-or-nothing basis: either a GPIO controller is accessible for a user, or it is not.”…”�”}”(hhþh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K hhíh²hubhÞ)�”}”(hX¶The GPIO Aggregator provides access control for a set of one or more GPIOs, by aggregating them into a new gpio_chip, which can be assigned to a group or user using standard UNIX file ownership and permissions. Furthermore, this simplifies and hardens exporting GPIOs to a virtual machine, as the VM can just grab the full GPIO controller, and no longer needs to care about which GPIOs to grab and which not, reducing the attack surface.”h]”hX¶The GPIO Aggregator provides access control for a set of one or more GPIOs, by aggregating them into a new gpio_chip, which can be assigned to a group or user using standard UNIX file ownership and permissions. Furthermore, this simplifies and hardens exporting GPIOs to a virtual machine, as the VM can just grab the full GPIO controller, and no longer needs to care about which GPIOs to grab and which not, reducing the attack surface.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khhíh²hubhÞ)�”}”(hŒmAggregated GPIO controllers are instantiated and destroyed by writing to write-only attribute files in sysfs.”h]”hŒmAggregated GPIO controllers are instantiated and destroyed by writing to write-only attribute files in sysfs.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khhíh²hubhŒ block_quote”“”)�”}”(hX�/sys/bus/platform/drivers/gpio-aggregator/ "new_device" ... Userspace may ask the kernel to instantiate an aggregated GPIO controller by writing a string describing the GPIOs to aggregate to the "new_device" file, using the format .. code-block:: none [] [ ] ... Where: "" ... is a GPIO line name, "" ... is a GPIO chip label, and "" ... is a comma-separated list of GPIO offsets and/or GPIO offset ranges denoted by dashes. Example: Instantiate a new GPIO aggregator by aggregating GPIO line 19 of "e6052000.gpio" and GPIO lines 20-21 of "e6050000.gpio" into a new gpio_chip: .. code-block:: sh $ echo 'e6052000.gpio 19 e6050000.gpio 20-21' > new_device "delete_device" ... Userspace may ask the kernel to destroy an aggregated GPIO controller after use by writing its device name to the "delete_device" file. Example: Destroy the previously-created aggregated GPIO controller, assumed to be "gpio-aggregator.0": .. code-block:: sh $ echo gpio-aggregator.0 > delete_device ”h]”(hÞ)�”}”(hŒ*/sys/bus/platform/drivers/gpio-aggregator/”h]”hŒ*/sys/bus/platform/drivers/gpio-aggregator/”…”�”}”(hj.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khj*ubj))�”}”(hX÷"new_device" ... Userspace may ask the kernel to instantiate an aggregated GPIO controller by writing a string describing the GPIOs to aggregate to the "new_device" file, using the format .. code-block:: none [] [ ] ... Where: "" ... is a GPIO line name, "" ... is a GPIO chip label, and "" ... is a comma-separated list of GPIO offsets and/or GPIO offset ranges denoted by dashes. Example: Instantiate a new GPIO aggregator by aggregating GPIO line 19 of "e6052000.gpio" and GPIO lines 20-21 of "e6050000.gpio" into a new gpio_chip: .. code-block:: sh $ echo 'e6052000.gpio 19 e6050000.gpio 20-21' > new_device "delete_device" ... Userspace may ask the kernel to destroy an aggregated GPIO controller after use by writing its device name to the "delete_device" file. Example: Destroy the previously-created aggregated GPIO controller, assumed to be "gpio-aggregator.0": .. code-block:: sh $ echo gpio-aggregator.0 > delete_device ”h]”hŒdefinition_list”“”)�”}”(hhh]”(hŒdefinition_list_item”“”)�”}”(hXç"new_device" ... Userspace may ask the kernel to instantiate an aggregated GPIO controller by writing a string describing the GPIOs to aggregate to the "new_device" file, using the format .. code-block:: none [] [ ] ... Where: "" ... is a GPIO line name, "" ... is a GPIO chip label, and "" ... is a comma-separated list of GPIO offsets and/or GPIO offset ranges denoted by dashes. Example: Instantiate a new GPIO aggregator by aggregating GPIO line 19 of "e6052000.gpio" and GPIO lines 20-21 of "e6050000.gpio" into a new gpio_chip: .. code-block:: sh $ echo 'e6052000.gpio 19 e6050000.gpio 20-21' > new_device ”h]”(hŒterm”“”)�”}”(hŒ"new_device" ...”h]”hŒ“new_deviceâ€� ...”…”�”}”(hjMh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³hÇh´K9hjGubhŒ definition”“”)�”}”(hhh]”(hÞ)�”}”(hŒªUserspace may ask the kernel to instantiate an aggregated GPIO controller by writing a string describing the GPIOs to aggregate to the "new_device" file, using the format”h]”hŒ®Userspace may ask the kernel to instantiate an aggregated GPIO controller by writing a string describing the GPIOs to aggregate to the “new_deviceâ€� file, using the format”…”�”}”(hj`h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khj]ubhŒ literal_block”“”)�”}”(hŒ%[] [ ] ...”h]”hŒ%[] [ ] ...”…”�”}”hjpsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆŒforce”‰Œlanguage”Œnone”Œhighlight_args”}”uh1jnh³hÇh´K#hj]ubhÞ)�”}”(hŒWhere:”h]”hŒWhere:”…”�”}”(hjƒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K'hj]ubj))�”}”(hŒØ"" ... is a GPIO line name, "" ... is a GPIO chip label, and "" ... is a comma-separated list of GPIO offsets and/or GPIO offset ranges denoted by dashes. ”h]”jA)�”}”(hhh]”(jF)�”}”(hŒ#"" ... is a GPIO line name, ”h]”(jL)�”}”(hŒ "" ...”h]”hŒ“â€� ...”…”�”}”(hjœh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³hÇh´K*hj˜ubj\)�”}”(hhh]”hÞ)�”}”(hŒis a GPIO line name,”h]”hŒis a GPIO line name,”…”�”}”(hj­h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K*hjªubah}”(h]”h ]”h"]”h$]”h&]”uh1j[hj˜ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³hÇh´K*hj•ubjF)�”}”(hŒ,"" ... is a GPIO chip label, and ”h]”(jL)�”}”(hŒ"" ...”h]”hŒ“â€� ...”…”�”}”(hjËh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³hÇh´K-hjÇubj\)�”}”(hhh]”hÞ)�”}”(hŒis a GPIO chip label, and”h]”hŒis a GPIO chip label, and”…”�”}”(hjÜh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K-hjÙubah}”(h]”h ]”h"]”h$]”h&]”uh1j[hjÇubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³hÇh´K-hj•ubjF)�”}”(hŒg"" ... is a comma-separated list of GPIO offsets and/or GPIO offset ranges denoted by dashes. ”h]”(jL)�”}”(hŒ"" ...”h]”hŒ“â€� ...”…”�”}”(hjúh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³hÇh´K1hjöubj\)�”}”(hhh]”hÞ)�”}”(hŒVis a comma-separated list of GPIO offsets and/or GPIO offset ranges denoted by dashes.”h]”hŒVis a comma-separated list of GPIO offsets and/or GPIO offset ranges denoted by dashes.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K0hjubah}”(h]”h ]”h"]”h$]”h&]”uh1j[hjöubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³hÇh´K1hj•ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j@hj‘ubah}”(h]”h ]”h"]”h$]”h&]”uh1j(h³hÇh´K)hj]ubhÞ)�”}”(hŒ—Example: Instantiate a new GPIO aggregator by aggregating GPIO line 19 of "e6052000.gpio" and GPIO lines 20-21 of "e6050000.gpio" into a new gpio_chip:”h]”hŒŸExample: Instantiate a new GPIO aggregator by aggregating GPIO line 19 of “e6052000.gpioâ€� and GPIO lines 20-21 of “e6050000.gpioâ€� into a new gpio_chip:”…”�”}”(hj1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K3hj]ubjo)�”}”(hŒ:$ echo 'e6052000.gpio 19 e6050000.gpio 20-21' > new_device”h]”hŒ:$ echo 'e6052000.gpio 19 e6050000.gpio 20-21' > new_device”…”�”}”hj?sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj~‰jŒsh”j�}”uh1jnh³hÇh´K7hj]ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j[hjGubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³hÇh´K9hjBubjF)�”}”(hXG"delete_device" ... Userspace may ask the kernel to destroy an aggregated GPIO controller after use by writing its device name to the "delete_device" file. Example: Destroy the previously-created aggregated GPIO controller, assumed to be "gpio-aggregator.0": .. code-block:: sh $ echo gpio-aggregator.0 > delete_device ”h]”(jL)�”}”(hŒ"delete_device" ...”h]”hŒ“delete_deviceâ€� ...”…”�”}”(hj_h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jKh³hÇh´KFhj[ubj\)�”}”(hhh]”(hÞ)�”}”(hŒ‡Userspace may ask the kernel to destroy an aggregated GPIO controller after use by writing its device name to the "delete_device" file.”h]”hŒ‹Userspace may ask the kernel to destroy an aggregated GPIO controller after use by writing its device name to the “delete_deviceâ€� file.”…”�”}”(hjph²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K delete_device”h]”hŒ($ echo gpio-aggregator.0 > delete_device”…”�”}”hjŒsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj~‰jŒsh”j�}”uh1jnh³hÇh´KChjmubeh}”(h]”h ]”h"]”h$]”h&]”uh1j[hj[ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jEh³hÇh´KFhjBubeh}”(h]”h ]”h"]”h$]”h&]”uh1j@hj<ubah}”(h]”h ]”h"]”h$]”h&]”uh1j(h³hÇh´Khj*ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j(h³hÇh´Khhíh²hubeh}”(h]”Œaggregating-gpios-using-sysfs”ah ]”h"]”Œaggregating gpios using sysfs”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ Aggregating GPIOs using Configfs”h]”hŒ Aggregating GPIOs using Configfs”…”�”}”(hjÅh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjÂh²hh³hÇh´KIubhÞ)�”}”(hŒ&**Group:** ``/config/gpio-aggregator``”h]”(hŒstrong”“”)�”}”(hŒ **Group:**”h]”hŒGroup:”…”�”}”(hjÙh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j×hjÓubhŒ ”…”�”}”(hjÓh²hh³Nh´NubhŒliteral”“”)�”}”(hŒ``/config/gpio-aggregator``”h]”hŒ/config/gpio-aggregator”…”�”}”(hjíh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhjÓubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KKhjÂh²hubj))�”}”(hŒAThis is the root directory of the gpio-aggregator configfs tree. ”h]”hÞ)�”}”(hŒ@This is the root directory of the gpio-aggregator configfs tree.”h]”hŒ@This is the root directory of the gpio-aggregator configfs tree.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KMhjubah}”(h]”h ]”h"]”h$]”h&]”uh1j(h³hÇh´KMhjÂh²hubhÞ)�”}”(hŒ5**Group:** ``/config/gpio-aggregator/``”h]”(jØ)�”}”(hŒ **Group:**”h]”hŒGroup:”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j×hjubhŒ ”…”�”}”(hjh²hh³Nh´Nubjì)�”}”(hŒ*``/config/gpio-aggregator/``”h]”hŒ&/config/gpio-aggregator/”…”�”}”(hj/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KOhjÂh²hubj))�”}”(hXThis directory represents a GPIO aggregator device. You can assign any name to ```` (e.g. ``agg0``), except names starting with ``_sysfs`` prefix, which are reserved for auto-generated configfs entries corresponding to devices created via Sysfs. ”h]”hÞ)�”}”(hXThis directory represents a GPIO aggregator device. You can assign any name to ```` (e.g. ``agg0``), except names starting with ``_sysfs`` prefix, which are reserved for auto-generated configfs entries corresponding to devices created via Sysfs.”h]”(hŒOThis directory represents a GPIO aggregator device. You can assign any name to ”…”�”}”(hjGh²hh³Nh´Nubjì)�”}”(hŒ````”h]”hŒ”…”�”}”(hjOh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhjGubhŒ (e.g. ”…”�”}”(hjGh²hh³Nh´Nubjì)�”}”(hŒ``agg0``”h]”hŒagg0”…”�”}”(hjah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhjGubhŒ), except names starting with ”…”�”}”(hjGh²hh³Nh´Nubjì)�”}”(hŒ ``_sysfs``”h]”hŒ_sysfs”…”�”}”(hjsh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhjGubhŒk prefix, which are reserved for auto-generated configfs entries corresponding to devices created via Sysfs.”…”�”}”(hjGh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KQhjCubah}”(h]”h ]”h"]”h$]”h&]”uh1j(h³hÇh´KQhjÂh²hubhÞ)�”}”(hŒ>**Attribute:** ``/config/gpio-aggregator//live``”h]”(jØ)�”}”(hŒ**Attribute:**”h]”hŒ Attribute:”…”�”}”(hj•h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j×hj‘ubhŒ ”…”�”}”(hj‘h²hh³Nh´Nubjì)�”}”(hŒ/``/config/gpio-aggregator//live``”h]”hŒ+/config/gpio-aggregator//live”…”�”}”(hj§h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhj‘ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KVhjÂh²hubj))�”}”(hŒìThe ``live`` attribute allows to trigger the actual creation of the device once it's fully configured. Accepted values are: * ``1``, ``yes``, ``true`` : enable the virtual device * ``0``, ``no``, ``false`` : disable the virtual device ”h]”(hÞ)�”}”(hŒ{The ``live`` attribute allows to trigger the actual creation of the device once it's fully configured. Accepted values are:”h]”(hŒThe ”…”�”}”(hj¿h²hh³Nh´Nubjì)�”}”(hŒ``live``”h]”hŒlive”…”�”}”(hjÇh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhj¿ubhŒq attribute allows to trigger the actual creation of the device once it’s fully configured. Accepted values are:”…”�”}”(hj¿h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KXhj»ubhŒ bullet_list”“”)�”}”(hhh]”(hŒ list_item”“”)�”}”(hŒ4``1``, ``yes``, ``true`` : enable the virtual device”h]”hÞ)�”}”(hjèh]”(jì)�”}”(hŒ``1``”h]”hŒ1”…”�”}”(hjíh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhjêubhŒ, ”…”�”}”(hjêh²hh³Nh´Nubjì)�”}”(hŒ``yes``”h]”hŒyes”…”�”}”(hjÿh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhjêubhŒ, ”…”�”}”hjêsbjì)�”}”(hŒ``true``”h]”hŒtrue”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhjêubhŒ : enable the virtual device”…”�”}”(hjêh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K[hjæubah}”(h]”h ]”h"]”h$]”h&]”uh1jähjáubjå)�”}”(hŒ6``0``, ``no``, ``false`` : disable the virtual device ”h]”hÞ)�”}”(hŒ5``0``, ``no``, ``false`` : disable the virtual device”h]”(jì)�”}”(hŒ``0``”h]”hŒ0”…”�”}”(hj7h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhj3ubhŒ, ”…”�”}”(hj3h²hh³Nh´Nubjì)�”}”(hŒ``no``”h]”hŒno”…”�”}”(hjIh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhj3ubhŒ, ”…”�”}”hj3sbjì)�”}”(hŒ ``false``”h]”hŒfalse”…”�”}”(hj[h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhj3ubhŒ : disable the virtual device”…”�”}”(hj3h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K\hj/ubah}”(h]”h ]”h"]”h$]”h&]”uh1jähjáubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ*”uh1jßh³hÇh´K[hj»ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j(h³hÇh´KXhjÂh²hubhÞ)�”}”(hŒB**Attribute:** ``/config/gpio-aggregator//dev_name``”h]”(jØ)�”}”(hŒ**Attribute:**”h]”hŒ Attribute:”…”�”}”(hj‹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j×hj‡ubhŒ ”…”�”}”(hj‡h²hh³Nh´Nubjì)�”}”(hŒ3``/config/gpio-aggregator//dev_name``”h]”hŒ//config/gpio-aggregator//dev_name”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhj‡ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K^hjÂh²hubj))�”}”(hXpThe read-only ``dev_name`` attribute exposes the name of the device as it will appear in the system on the platform bus (e.g. ``gpio-aggregator.0``). This is useful for identifying a character device for the newly created aggregator. If it's ``gpio-aggregator.0``, ``/sys/devices/platform/gpio-aggregator.0/gpiochipX`` path tells you that the GPIO device id is ``X``. ”h]”hÞ)�”}”(hXoThe read-only ``dev_name`` attribute exposes the name of the device as it will appear in the system on the platform bus (e.g. ``gpio-aggregator.0``). This is useful for identifying a character device for the newly created aggregator. If it's ``gpio-aggregator.0``, ``/sys/devices/platform/gpio-aggregator.0/gpiochipX`` path tells you that the GPIO device id is ``X``.”h]”(hŒThe read-only ”…”�”}”(hjµh²hh³Nh´Nubjì)�”}”(hŒ ``dev_name``”h]”hŒdev_name”…”�”}”(hj½h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhjµubhŒd attribute exposes the name of the device as it will appear in the system on the platform bus (e.g. ”…”�”}”(hjµh²hh³Nh´Nubjì)�”}”(hŒ``gpio-aggregator.0``”h]”hŒgpio-aggregator.0”…”�”}”(hjÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhjµubhŒa). This is useful for identifying a character device for the newly created aggregator. If it’s ”…”�”}”(hjµh²hh³Nh´Nubjì)�”}”(hŒ``gpio-aggregator.0``”h]”hŒgpio-aggregator.0”…”�”}”(hjáh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhjµubhŒ, ”…”�”}”(hjµh²hh³Nh´Nubjì)�”}”(hŒ5``/sys/devices/platform/gpio-aggregator.0/gpiochipX``”h]”hŒ1/sys/devices/platform/gpio-aggregator.0/gpiochipX”…”�”}”(hjóh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhjµubhŒ+ path tells you that the GPIO device id is ”…”�”}”(hjµh²hh³Nh´Nubjì)�”}”(hŒ``X``”h]”hŒX”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhjµubhŒ.”…”�”}”(hjµh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K`hj±ubah}”(h]”h ]”h"]”h$]”h&]”uh1j(h³hÇh´K`hjÂh²hubhÞ)�”}”(hXYou must create subdirectories for each virtual line you want to instantiate, named exactly as ``line0``, ``line1``, ..., ``lineY``, when you want to instantiate ``Y+1`` (Y >= 0) lines. Configure all lines before activating the device by setting ``live`` to 1.”h]”(hŒ_You must create subdirectories for each virtual line you want to instantiate, named exactly as ”…”�”}”(hj#h²hh³Nh´Nubjì)�”}”(hŒ ``line0``”h]”hŒline0”…”�”}”(hj+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhj#ubhŒ, ”…”�”}”(hj#h²hh³Nh´Nubjì)�”}”(hŒ ``line1``”h]”hŒline1”…”�”}”(hj=h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhj#ubhŒ, ..., ”…”�”}”(hj#h²hh³Nh´Nubjì)�”}”(hŒ ``lineY``”h]”hŒlineY”…”�”}”(hjOh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhj#ubhŒ, when you want to instantiate ”…”�”}”(hj#h²hh³Nh´Nubjì)�”}”(hŒ``Y+1``”h]”hŒY+1”…”�”}”(hjah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhj#ubhŒN (Y >= 0) lines. Configure all lines before activating the device by setting ”…”�”}”(hj#h²hh³Nh´Nubjì)�”}”(hŒ``live``”h]”hŒlive”…”�”}”(hjsh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhj#ubhŒ to 1.”…”�”}”(hj#h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KghjÂh²hubhÞ)�”}”(hŒ>**Group:** ``/config/gpio-aggregator///``”h]”(jØ)�”}”(hŒ **Group:**”h]”hŒGroup:”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j×hj‹ubhŒ ”…”�”}”(hj‹h²hh³Nh´Nubjì)�”}”(hŒ3``/config/gpio-aggregator///``”h]”hŒ//config/gpio-aggregator///”…”�”}”(hj¡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhj‹ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KlhjÂh²hubj))�”}”(hŒDThis directory represents a GPIO line to include in the aggregator. ”h]”hÞ)�”}”(hŒCThis directory represents a GPIO line to include in the aggregator.”h]”hŒCThis directory represents a GPIO line to include in the aggregator.”…”�”}”(hj¹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Knhjµubah}”(h]”h ]”h"]”h$]”h&]”uh1j(h³hÇh´KnhjÂh²hubhÞ)�”}”(hŒE**Attribute:** ``/config/gpio-aggregator///key``”h]”(jØ)�”}”(hŒ**Attribute:**”h]”hŒ Attribute:”…”�”}”(hjÑh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j×hjÍubhŒ ”…”�”}”(hjÍh²hh³Nh´Nubjì)�”}”(hŒ6``/config/gpio-aggregator///key``”h]”hŒ2/config/gpio-aggregator///key”…”�”}”(hjãh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhjÍubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KphjÂh²hubhÞ)�”}”(hŒH**Attribute:** ``/config/gpio-aggregator///offset``”h]”(jØ)�”}”(hŒ**Attribute:**”h]”hŒ Attribute:”…”�”}”(hjûh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j×hj÷ubhŒ ”…”�”}”(hj÷h²hh³Nh´Nubjì)�”}”(hŒ9``/config/gpio-aggregator///offset``”h]”hŒ5/config/gpio-aggregator///offset”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhj÷ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KrhjÂh²hubj))�”}”(hXThe default values after creating the ```` directory are: * ``key`` : * ``offset`` : -1 ``key`` must always be explicitly configured, while ``offset`` depends. Two configuration patterns exist for each ````: (a). For lookup by GPIO line name: * Set ``key`` to the line name. * Ensure ``offset`` remains -1 (the default). (b). For lookup by GPIO chip name and the line offset within the chip: * Set ``key`` to the chip name. * Set ``offset`` to the line offset (0 <= ``offset`` < 65535). ”h]”(hÞ)�”}”(hŒ@The default values after creating the ```` directory are:”h]”(hŒ&The default values after creating the ”…”�”}”(hj%h²hh³Nh´Nubjì)�”}”(hŒ ````”h]”hŒ”…”�”}”(hj-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhj%ubhŒ directory are:”…”�”}”(hj%h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kthj!ubjà)�”}”(hhh]”(jå)�”}”(hŒ``key`` : ”h]”hÞ)�”}”(hjJh]”(jì)�”}”(hŒ``key``”h]”hŒkey”…”�”}”(hjOh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhjLubhŒ : ”…”�”}”(hjLh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KvhjHubah}”(h]”h ]”h"]”h$]”h&]”uh1jähjEubjå)�”}”(hŒ``offset`` : -1 ”h]”hÞ)�”}”(hŒ``offset`` : -1”h]”(jì)�”}”(hŒ ``offset``”h]”hŒoffset”…”�”}”(hjuh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhjqubhŒ : -1”…”�”}”(hjqh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kwhjmubah}”(h]”h ]”h"]”h$]”h&]”uh1jähjEubeh}”(h]”h ]”h"]”h$]”h&]”jj€uh1jßh³hÇh´Kvhj!ubhÞ)�”}”(hŒ~``key`` must always be explicitly configured, while ``offset`` depends. Two configuration patterns exist for each ````:”h]”(jì)�”}”(hŒ``key``”h]”hŒkey”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhj™ubhŒ- must always be explicitly configured, while ”…”�”}”(hj™h²hh³Nh´Nubjì)�”}”(hŒ ``offset``”h]”hŒoffset”…”�”}”(hj¯h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhj™ubhŒ4 depends. Two configuration patterns exist for each ”…”�”}”(hj™h²hh³Nh´Nubjì)�”}”(hŒ ````”h]”hŒ”…”�”}”(hjÁh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhj™ubhŒ:”…”�”}”(hj™h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kyhj!ubhÞ)�”}”(hŒ"(a). For lookup by GPIO line name:”h]”hŒ"(a). For lookup by GPIO line name:”…”�”}”(hjÙh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K|hj!ubj))�”}”(hŒN* Set ``key`` to the line name. * Ensure ``offset`` remains -1 (the default). ”h]”jà)�”}”(hhh]”(jå)�”}”(hŒSet ``key`` to the line name.”h]”hÞ)�”}”(hjðh]”(hŒSet ”…”�”}”(hjòh²hh³Nh´Nubjì)�”}”(hŒ``key``”h]”hŒkey”…”�”}”(hjùh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhjòubhŒ to the line name.”…”�”}”(hjòh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K~hjîubah}”(h]”h ]”h"]”h$]”h&]”uh1jähjëubjå)�”}”(hŒ,Ensure ``offset`` remains -1 (the default). ”h]”hÞ)�”}”(hŒ+Ensure ``offset`` remains -1 (the default).”h]”(hŒEnsure ”…”�”}”(hjh²hh³Nh´Nubjì)�”}”(hŒ ``offset``”h]”hŒoffset”…”�”}”(hj#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhjubhŒ remains -1 (the default).”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khjubah}”(h]”h ]”h"]”h$]”h&]”uh1jähjëubeh}”(h]”h ]”h"]”h$]”h&]”jj€uh1jßh³hÇh´K~hjçubah}”(h]”h ]”h"]”h$]”h&]”uh1j(h³hÇh´K~hj!ubhÞ)�”}”(hŒF(b). For lookup by GPIO chip name and the line offset within the chip:”h]”hŒF(b). For lookup by GPIO chip name and the line offset within the chip:”…”�”}”(hjMh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K�hj!ubj))�”}”(hŒ_* Set ``key`` to the chip name. * Set ``offset`` to the line offset (0 <= ``offset`` < 65535). ”h]”jà)�”}”(hhh]”(jå)�”}”(hŒSet ``key`` to the chip name.”h]”hÞ)�”}”(hjdh]”(hŒSet ”…”�”}”(hjfh²hh³Nh´Nubjì)�”}”(hŒ``key``”h]”hŒkey”…”�”}”(hjmh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhjfubhŒ to the chip name.”…”�”}”(hjfh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kƒhjbubah}”(h]”h ]”h"]”h$]”h&]”uh1jähj_ubjå)�”}”(hŒ=Set ``offset`` to the line offset (0 <= ``offset`` < 65535). ”h]”hÞ)�”}”(hŒ//name``”h]”(jØ)�”}”(hŒ**Attribute:**”h]”hŒ Attribute:”…”�”}”(hjÝh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j×hjÙubhŒ ”…”�”}”(hjÙh²hh³Nh´Nubjì)�”}”(hŒ7``/config/gpio-aggregator///name``”h]”hŒ3/config/gpio-aggregator///name”…”�”}”(hjïh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhjÙubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K†hjÂh²hubj))�”}”(hŒbThe ``name`` attribute sets a custom name for lineY. If left unset, the line will remain unnamed. ”h]”hÞ)�”}”(hŒaThe ``name`` attribute sets a custom name for lineY. If left unset, the line will remain unnamed.”h]”(hŒThe ”…”�”}”(hjh²hh³Nh´Nubjì)�”}”(hŒ``name``”h]”hŒname”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhjubhŒU attribute sets a custom name for lineY. If left unset, the line will remain unnamed.”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Kˆhjubah}”(h]”h ]”h"]”h$]”h&]”uh1j(h³hÇh´KˆhjÂh²hubhÞ)�”}”(hXºOnce the configuration is done, the ``'live'`` attribute must be set to 1 in order to instantiate the aggregator device. It can be set back to 0 to destroy the virtual device. The module will synchronously wait for the new aggregator device to be successfully probed and if this doesn't happen, writing to ``'live'`` will result in an error. This is a different behaviour from the case when you create it using sysfs ``new_device`` interface.”h]”(hŒ$Once the configuration is done, the ”…”�”}”(hj-h²hh³Nh´Nubjì)�”}”(hŒ ``'live'``”h]”hŒ'live'”…”�”}”(hj5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhj-ubhX attribute must be set to 1 in order to instantiate the aggregator device. It can be set back to 0 to destroy the virtual device. The module will synchronously wait for the new aggregator device to be successfully probed and if this doesn’t happen, writing to ”…”�”}”(hj-h²hh³Nh´Nubjì)�”}”(hŒ ``'live'``”h]”hŒ'live'”…”�”}”(hjGh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhj-ubhŒe will result in an error. This is a different behaviour from the case when you create it using sysfs ”…”�”}”(hj-h²hh³Nh´Nubjì)�”}”(hŒ``new_device``”h]”hŒ new_device”…”�”}”(hjYh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhj-ubhŒ interface.”…”�”}”(hj-h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K‹hjÂh²hubhŒnote”“”)�”}”(hX"For aggregators created via Sysfs, the configfs entries are auto-generated and appear as ``/config/gpio-aggregator/_sysfs./``. You cannot add or remove line directories with mkdir(2)/rmdir(2). To modify lines, you must use the "delete_device" interface to tear down the existing device and reconfigure it from scratch. However, you can still toggle the aggregator with the ``live`` attribute and adjust the ``key``, ``offset``, and ``name`` attributes for each line when ``live`` is set to 0 by hand (i.e. it's not waiting for deferred probe).”h]”hÞ)�”}”(hX"For aggregators created via Sysfs, the configfs entries are auto-generated and appear as ``/config/gpio-aggregator/_sysfs./``. You cannot add or remove line directories with mkdir(2)/rmdir(2). To modify lines, you must use the "delete_device" interface to tear down the existing device and reconfigure it from scratch. However, you can still toggle the aggregator with the ``live`` attribute and adjust the ``key``, ``offset``, and ``name`` attributes for each line when ``live`` is set to 0 by hand (i.e. it's not waiting for deferred probe).”h]”(hŒYFor aggregators created via Sysfs, the configfs entries are auto-generated and appear as ”…”�”}”(hjwh²hh³Nh´Nubjì)�”}”(hŒ'``/config/gpio-aggregator/_sysfs./``”h]”hŒ#/config/gpio-aggregator/_sysfs./”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhjwubhŒü. You cannot add or remove line directories with mkdir(2)/rmdir(2). To modify lines, you must use the “delete_deviceâ€� interface to tear down the existing device and reconfigure it from scratch. However, you can still toggle the aggregator with the ”…”�”}”(hjwh²hh³Nh´Nubjì)�”}”(hŒ``live``”h]”hŒlive”…”�”}”(hj‘h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhjwubhŒ attribute and adjust the ”…”�”}”(hjwh²hh³Nh´Nubjì)�”}”(hŒ``key``”h]”hŒkey”…”�”}”(hj£h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhjwubhŒ, ”…”�”}”(hjwh²hh³Nh´Nubjì)�”}”(hŒ ``offset``”h]”hŒoffset”…”�”}”(hjµh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhjwubhŒ, and ”…”�”}”(hjwh²hh³Nh´Nubjì)�”}”(hŒ``name``”h]”hŒname”…”�”}”(hjÇh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhjwubhŒ attributes for each line when ”…”�”}”(hjwh²hh³Nh´Nubjì)�”}”(hŒ``live``”h]”hŒlive”…”�”}”(hjÙh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jëhjwubhŒB is set to 0 by hand (i.e. it’s not waiting for deferred probe).”…”�”}”(hjwh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K”hjsubah}”(h]”h ]”h"]”h$]”h&]”uh1jqhjÂh²hh³hÇh´NubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒSample configuration commands”h]”hŒSample configuration commands”…”�”}”(hjúh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj÷h²hh³hÇh´Kžubjo)�”}”(hXè# Create a directory for an aggregator device $ mkdir /sys/kernel/config/gpio-aggregator/agg0 # Configure each line $ mkdir /sys/kernel/config/gpio-aggregator/agg0/line0 $ echo gpiochip0 > /sys/kernel/config/gpio-aggregator/agg0/line0/key $ echo 6 > /sys/kernel/config/gpio-aggregator/agg0/line0/offset $ echo test0 > /sys/kernel/config/gpio-aggregator/agg0/line0/name $ mkdir /sys/kernel/config/gpio-aggregator/agg0/line1 $ echo gpiochip0 > /sys/kernel/config/gpio-aggregator/agg0/line1/key $ echo 7 > /sys/kernel/config/gpio-aggregator/agg0/line1/offset $ echo test1 > /sys/kernel/config/gpio-aggregator/agg0/line1/name # Activate the aggregator device $ echo 1 > /sys/kernel/config/gpio-aggregator/agg0/live”h]”hXè# Create a directory for an aggregator device $ mkdir /sys/kernel/config/gpio-aggregator/agg0 # Configure each line $ mkdir /sys/kernel/config/gpio-aggregator/agg0/line0 $ echo gpiochip0 > /sys/kernel/config/gpio-aggregator/agg0/line0/key $ echo 6 > /sys/kernel/config/gpio-aggregator/agg0/line0/offset $ echo test0 > /sys/kernel/config/gpio-aggregator/agg0/line0/name $ mkdir /sys/kernel/config/gpio-aggregator/agg0/line1 $ echo gpiochip0 > /sys/kernel/config/gpio-aggregator/agg0/line1/key $ echo 7 > /sys/kernel/config/gpio-aggregator/agg0/line1/offset $ echo test1 > /sys/kernel/config/gpio-aggregator/agg0/line1/name # Activate the aggregator device $ echo 1 > /sys/kernel/config/gpio-aggregator/agg0/live”…”�”}”hj sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj~‰jŒsh”j�}”uh1jnh³hÇh´K hj÷h²hubeh}”(h]”Œsample-configuration-commands”ah ]”h"]”Œsample configuration commands”ah$]”h&]”uh1hÈhjÂh²hh³hÇh´Kžubeh}”(h]”Œ aggregating-gpios-using-configfs”ah ]”h"]”Œ aggregating gpios using configfs”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KIubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒGeneric GPIO Driver”h]”hŒGeneric GPIO Driver”…”�”}”(hj+ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj( h²hh³hÇh´K´ubhÞ)�”}”(hXThe GPIO Aggregator can also be used as a generic driver for a simple GPIO-operated device described in DT, without a dedicated in-kernel driver. This is useful in industrial control, and is not unlike e.g. spidev, which allows the user to communicate with an SPI device from userspace.”h]”hXThe GPIO Aggregator can also be used as a generic driver for a simple GPIO-operated device described in DT, without a dedicated in-kernel driver. This is useful in industrial control, and is not unlike e.g. spidev, which allows the user to communicate with an SPI device from userspace.”…”�”}”(hj9 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K¶hj( h²hubhÞ)�”}”(hŒšBinding a device to the GPIO Aggregator is performed either by modifying the gpio-aggregator driver, or by writing to the "driver_override" file in Sysfs.”h]”hŒžBinding a device to the GPIO Aggregator is performed either by modifying the gpio-aggregator driver, or by writing to the “driver_overrideâ€� file in Sysfs.”…”�”}”(hjG h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K»hj( h²hubhÞ)�”}”(hŒ^Example: If "door" is a GPIO-operated device described in DT, using its own compatible value::”h]”hŒaExample: If “doorâ€� is a GPIO-operated device described in DT, using its own compatible value:”…”�”}”(hjU h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K¾hj( h²hubjo)�”}”(hŒ·door { compatible = "myvendor,mydoor"; gpios = <&gpio2 19 GPIO_ACTIVE_HIGH>, <&gpio2 20 GPIO_ACTIVE_LOW>; gpio-line-names = "open", "lock"; };”h]”hŒ·door { compatible = "myvendor,mydoor"; gpios = <&gpio2 19 GPIO_ACTIVE_HIGH>, <&gpio2 20 GPIO_ACTIVE_LOW>; gpio-line-names = "open", "lock"; };”…”�”}”hjc sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jnh³hÇh´KÁhj( h²hubhÞ)�”}”(hŒ1it can be bound to the GPIO Aggregator by either:”h]”hŒ1it can be bound to the GPIO Aggregator by either:”…”�”}”(hjq h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÉhj( h²hubhŒenumerated_list”“”)�”}”(hhh]”(jå)�”}”(hŒ /sys/bus/platform/devices/door/driver_override $ echo door > /sys/bus/platform/drivers/gpio-aggregator/bind”h]”hŒ„$ echo gpio-aggregator > /sys/bus/platform/devices/door/driver_override $ echo door > /sys/bus/platform/drivers/gpio-aggregator/bind”…”�”}”hjÐ sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj~‰jŒsh”j�}”uh1jnh³hÇh´KÎhj( h²hubhÞ)�”}”(hŒ3After that, a new gpiochip "door" has been created:”h]”hŒ7After that, a new gpiochip “doorâ€� has been created:”…”�”}”(hjà h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KÓhj( h²hubjo)�”}”(hŒ§$ gpioinfo door gpiochip12 - 2 lines: line 0: "open" unused input active-high line 1: "lock" unused input active-high”h]”hŒ§$ gpioinfo door gpiochip12 - 2 lines: line 0: "open" unused input active-high line 1: "lock" unused input active-high”…”�”}”hjî sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj~‰jŒsh”j�}”uh1jnh³hÇh´KÕhj( h²hubeh}”(h]”Œgeneric-gpio-driver”ah ]”h"]”Œgeneric gpio driver”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K´ubeh}”(h]”Œgpio-aggregator”ah ]”h"]”Œgpio aggregator”ah$]”h&]”uh1hÈhhh²hh³hÇh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÇuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)�”}”(hÍNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”j1 Œerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÇŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(j j j¿j¼j% j" j j j j uŒ nametypes”}”(j ‰j¿‰j% ‰j ‰j ‰uh}”(j hÊj¼híj" jÂj j÷j j( uŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.