xref: /openbmc/linux/Documentation/firmware-guide/acpi/gpio-properties.rst (revision 1bd3387979bff49cb3115c497895d78ffd5092e3)
1b6dff0e1SChangbin Du.. SPDX-License-Identifier: GPL-2.0
2b6dff0e1SChangbin Du
3b6dff0e1SChangbin Du======================================
4b6dff0e1SChangbin Du_DSD Device Properties Related to GPIO
5b6dff0e1SChangbin Du======================================
6b6dff0e1SChangbin Du
7b6dff0e1SChangbin DuWith the release of ACPI 5.1, the _DSD configuration object finally
8b6dff0e1SChangbin Duallows names to be given to GPIOs (and other things as well) returned
9b6dff0e1SChangbin Duby _CRS.  Previously, we were only able to use an integer index to find
10b6dff0e1SChangbin Duthe corresponding GPIO, which is pretty error prone (it depends on
11b6dff0e1SChangbin Duthe _CRS output ordering, for example).
12b6dff0e1SChangbin Du
13b6dff0e1SChangbin DuWith _DSD we can now query GPIOs using a name instead of an integer
14b6dff0e1SChangbin Duindex, like the ASL example below shows::
15b6dff0e1SChangbin Du
16b6dff0e1SChangbin Du  // Bluetooth device with reset and shutdown GPIOs
17b6dff0e1SChangbin Du  Device (BTH)
18b6dff0e1SChangbin Du  {
19b6dff0e1SChangbin Du      Name (_HID, ...)
20b6dff0e1SChangbin Du
21b6dff0e1SChangbin Du      Name (_CRS, ResourceTemplate ()
22b6dff0e1SChangbin Du      {
23*1bd33879SAndy Shevchenko          GpioIo (Exclusive, PullUp, 0, 0, IoRestrictionOutputOnly,
24b6dff0e1SChangbin Du                  "\\_SB.GPO0", 0, ResourceConsumer) {15}
25*1bd33879SAndy Shevchenko          GpioIo (Exclusive, PullUp, 0, 0, IoRestrictionOutputOnly,
26b6dff0e1SChangbin Du                  "\\_SB.GPO0", 0, ResourceConsumer) {27, 31}
27b6dff0e1SChangbin Du      })
28b6dff0e1SChangbin Du
29b6dff0e1SChangbin Du      Name (_DSD, Package ()
30b6dff0e1SChangbin Du      {
31b6dff0e1SChangbin Du          ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
32b6dff0e1SChangbin Du          Package ()
33b6dff0e1SChangbin Du	  {
34b6dff0e1SChangbin Du              Package () {"reset-gpios", Package() {^BTH, 1, 1, 0 }},
35b6dff0e1SChangbin Du              Package () {"shutdown-gpios", Package() {^BTH, 0, 0, 0 }},
36b6dff0e1SChangbin Du          }
37b6dff0e1SChangbin Du      })
38b6dff0e1SChangbin Du  }
39b6dff0e1SChangbin Du
40b6dff0e1SChangbin DuThe format of the supported GPIO property is::
41b6dff0e1SChangbin Du
42b6dff0e1SChangbin Du  Package () { "name", Package () { ref, index, pin, active_low }}
43b6dff0e1SChangbin Du
44b6dff0e1SChangbin Duref
45b6dff0e1SChangbin Du  The device that has _CRS containing GpioIo()/GpioInt() resources,
46b6dff0e1SChangbin Du  typically this is the device itself (BTH in our case).
47b6dff0e1SChangbin Duindex
48b6dff0e1SChangbin Du  Index of the GpioIo()/GpioInt() resource in _CRS starting from zero.
49b6dff0e1SChangbin Dupin
50b6dff0e1SChangbin Du  Pin in the GpioIo()/GpioInt() resource. Typically this is zero.
51b6dff0e1SChangbin Duactive_low
52*1bd33879SAndy Shevchenko  If 1, the GPIO is marked as active_low.
53b6dff0e1SChangbin Du
54b6dff0e1SChangbin DuSince ACPI GpioIo() resource does not have a field saying whether it is
55b6dff0e1SChangbin Duactive low or high, the "active_low" argument can be used here.  Setting
56b6dff0e1SChangbin Duit to 1 marks the GPIO as active low.
57b6dff0e1SChangbin Du
58b6dff0e1SChangbin DuIn our Bluetooth example the "reset-gpios" refers to the second GpioIo()
59b6dff0e1SChangbin Duresource, second pin in that resource with the GPIO number of 31.
60b6dff0e1SChangbin Du
61b6dff0e1SChangbin DuIt is possible to leave holes in the array of GPIOs. This is useful in
62b6dff0e1SChangbin Ducases like with SPI host controllers where some chip selects may be
63b6dff0e1SChangbin Duimplemented as GPIOs and some as native signals. For example a SPI host
64b6dff0e1SChangbin Ducontroller can have chip selects 0 and 2 implemented as GPIOs and 1 as
65b6dff0e1SChangbin Dunative::
66b6dff0e1SChangbin Du
67b6dff0e1SChangbin Du  Package () {
68b6dff0e1SChangbin Du      "cs-gpios",
69b6dff0e1SChangbin Du      Package () {
70b6dff0e1SChangbin Du          ^GPIO, 19, 0, 0, // chip select 0: GPIO
71b6dff0e1SChangbin Du          0,               // chip select 1: native signal
72b6dff0e1SChangbin Du          ^GPIO, 20, 0, 0, // chip select 2: GPIO
73b6dff0e1SChangbin Du      }
74b6dff0e1SChangbin Du  }
75b6dff0e1SChangbin Du
76b6dff0e1SChangbin DuOther supported properties
77b6dff0e1SChangbin Du==========================
78b6dff0e1SChangbin Du
79b6dff0e1SChangbin DuFollowing Device Tree compatible device properties are also supported by
80b6dff0e1SChangbin Du_DSD device properties for GPIO controllers:
81b6dff0e1SChangbin Du
82b6dff0e1SChangbin Du- gpio-hog
83b6dff0e1SChangbin Du- output-high
84b6dff0e1SChangbin Du- output-low
85b6dff0e1SChangbin Du- input
86b6dff0e1SChangbin Du- line-name
87b6dff0e1SChangbin Du
88b6dff0e1SChangbin DuExample::
89b6dff0e1SChangbin Du
90b6dff0e1SChangbin Du  Name (_DSD, Package () {
91b6dff0e1SChangbin Du      // _DSD Hierarchical Properties Extension UUID
92b6dff0e1SChangbin Du      ToUUID("dbb8e3e6-5886-4ba6-8795-1319f52a966b"),
93b6dff0e1SChangbin Du      Package () {
94b6dff0e1SChangbin Du          Package () {"hog-gpio8", "G8PU"}
95b6dff0e1SChangbin Du      }
96b6dff0e1SChangbin Du  })
97b6dff0e1SChangbin Du
98b6dff0e1SChangbin Du  Name (G8PU, Package () {
99b6dff0e1SChangbin Du      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
100b6dff0e1SChangbin Du      Package () {
101b6dff0e1SChangbin Du          Package () {"gpio-hog", 1},
102b6dff0e1SChangbin Du          Package () {"gpios", Package () {8, 0}},
103b6dff0e1SChangbin Du          Package () {"output-high", 1},
104b6dff0e1SChangbin Du          Package () {"line-name", "gpio8-pullup"},
105b6dff0e1SChangbin Du      }
106b6dff0e1SChangbin Du  })
107b6dff0e1SChangbin Du
108b6dff0e1SChangbin Du- gpio-line-names
109b6dff0e1SChangbin Du
110b6dff0e1SChangbin DuExample::
111b6dff0e1SChangbin Du
112b6dff0e1SChangbin Du  Package () {
113b6dff0e1SChangbin Du      "gpio-line-names",
114b6dff0e1SChangbin Du      Package () {
115*1bd33879SAndy Shevchenko          "SPI0_CS_N", "EXP2_INT", "MUX6_IO", "UART0_RXD",
116*1bd33879SAndy Shevchenko          "MUX7_IO", "LVL_C_A1", "MUX0_IO", "SPI1_MISO",
117b6dff0e1SChangbin Du      }
118b6dff0e1SChangbin Du  }
119b6dff0e1SChangbin Du
120b6dff0e1SChangbin DuSee Documentation/devicetree/bindings/gpio/gpio.txt for more information
121b6dff0e1SChangbin Duabout these properties.
122b6dff0e1SChangbin Du
123b6dff0e1SChangbin DuACPI GPIO Mappings Provided by Drivers
124b6dff0e1SChangbin Du======================================
125b6dff0e1SChangbin Du
126b6dff0e1SChangbin DuThere are systems in which the ACPI tables do not contain _DSD but provide _CRS
127b6dff0e1SChangbin Duwith GpioIo()/GpioInt() resources and device drivers still need to work with
128b6dff0e1SChangbin Duthem.
129b6dff0e1SChangbin Du
130b6dff0e1SChangbin DuIn those cases ACPI device identification objects, _HID, _CID, _CLS, _SUB, _HRV,
131b6dff0e1SChangbin Duavailable to the driver can be used to identify the device and that is supposed
132b6dff0e1SChangbin Duto be sufficient to determine the meaning and purpose of all of the GPIO lines
133b6dff0e1SChangbin Dulisted by the GpioIo()/GpioInt() resources returned by _CRS.  In other words,
134b6dff0e1SChangbin Duthe driver is supposed to know what to use the GpioIo()/GpioInt() resources for
135b6dff0e1SChangbin Duonce it has identified the device.  Having done that, it can simply assign names
136b6dff0e1SChangbin Duto the GPIO lines it is going to use and provide the GPIO subsystem with a
137b6dff0e1SChangbin Dumapping between those names and the ACPI GPIO resources corresponding to them.
138b6dff0e1SChangbin Du
139b6dff0e1SChangbin DuTo do that, the driver needs to define a mapping table as a NULL-terminated
140*1bd33879SAndy Shevchenkoarray of struct acpi_gpio_mapping objects that each contains a name, a pointer
141b6dff0e1SChangbin Duto an array of line data (struct acpi_gpio_params) objects and the size of that
142b6dff0e1SChangbin Duarray.  Each struct acpi_gpio_params object consists of three fields,
143b6dff0e1SChangbin Ducrs_entry_index, line_index, active_low, representing the index of the target
144b6dff0e1SChangbin DuGpioIo()/GpioInt() resource in _CRS starting from zero, the index of the target
145b6dff0e1SChangbin Duline in that resource starting from zero, and the active-low flag for that line,
146b6dff0e1SChangbin Durespectively, in analogy with the _DSD GPIO property format specified above.
147b6dff0e1SChangbin Du
148b6dff0e1SChangbin DuFor the example Bluetooth device discussed previously the data structures in
149b6dff0e1SChangbin Duquestion would look like this::
150b6dff0e1SChangbin Du
151b6dff0e1SChangbin Du  static const struct acpi_gpio_params reset_gpio = { 1, 1, false };
152b6dff0e1SChangbin Du  static const struct acpi_gpio_params shutdown_gpio = { 0, 0, false };
153b6dff0e1SChangbin Du
154b6dff0e1SChangbin Du  static const struct acpi_gpio_mapping bluetooth_acpi_gpios[] = {
155b6dff0e1SChangbin Du    { "reset-gpios", &reset_gpio, 1 },
156b6dff0e1SChangbin Du    { "shutdown-gpios", &shutdown_gpio, 1 },
157*1bd33879SAndy Shevchenko    { }
158b6dff0e1SChangbin Du  };
159b6dff0e1SChangbin Du
160b6dff0e1SChangbin DuNext, the mapping table needs to be passed as the second argument to
161*1bd33879SAndy Shevchenkoacpi_dev_add_driver_gpios() or its managed analogue that will
162*1bd33879SAndy Shevchenkoregister it with the ACPI device object pointed to by its first
163*1bd33879SAndy Shevchenkoargument. That should be done in the driver's .probe() routine.
164*1bd33879SAndy ShevchenkoOn removal, the driver should unregister its GPIO mapping table by
165b6dff0e1SChangbin Ducalling acpi_dev_remove_driver_gpios() on the ACPI device object where that
166b6dff0e1SChangbin Dutable was previously registered.
167b6dff0e1SChangbin Du
168b6dff0e1SChangbin DuUsing the _CRS fallback
169b6dff0e1SChangbin Du=======================
170b6dff0e1SChangbin Du
171b6dff0e1SChangbin DuIf a device does not have _DSD or the driver does not create ACPI GPIO
172b6dff0e1SChangbin Dumapping, the Linux GPIO framework refuses to return any GPIOs. This is
173b6dff0e1SChangbin Dubecause the driver does not know what it actually gets. For example if we
174b6dff0e1SChangbin Duhave a device like below::
175b6dff0e1SChangbin Du
176b6dff0e1SChangbin Du  Device (BTH)
177b6dff0e1SChangbin Du  {
178b6dff0e1SChangbin Du      Name (_HID, ...)
179b6dff0e1SChangbin Du
180b6dff0e1SChangbin Du      Name (_CRS, ResourceTemplate () {
181b6dff0e1SChangbin Du          GpioIo (Exclusive, PullNone, 0, 0, IoRestrictionNone,
182b6dff0e1SChangbin Du                  "\\_SB.GPO0", 0, ResourceConsumer) {15}
183b6dff0e1SChangbin Du          GpioIo (Exclusive, PullNone, 0, 0, IoRestrictionNone,
184b6dff0e1SChangbin Du                  "\\_SB.GPO0", 0, ResourceConsumer) {27}
185b6dff0e1SChangbin Du      })
186b6dff0e1SChangbin Du  }
187b6dff0e1SChangbin Du
188b6dff0e1SChangbin DuThe driver might expect to get the right GPIO when it does::
189b6dff0e1SChangbin Du
190b6dff0e1SChangbin Du  desc = gpiod_get(dev, "reset", GPIOD_OUT_LOW);
191b6dff0e1SChangbin Du
192b6dff0e1SChangbin Dubut since there is no way to know the mapping between "reset" and
193b6dff0e1SChangbin Duthe GpioIo() in _CRS desc will hold ERR_PTR(-ENOENT).
194b6dff0e1SChangbin Du
195*1bd33879SAndy ShevchenkoThe driver author can solve this by passing the mapping explicitly
196*1bd33879SAndy Shevchenko(this is the recommended way and it's documented in the above chapter).
197b6dff0e1SChangbin Du
198b6dff0e1SChangbin DuThe ACPI GPIO mapping tables should not contaminate drivers that are not
199b6dff0e1SChangbin Duknowing about which exact device they are servicing on. It implies that
200*1bd33879SAndy Shevchenkothe ACPI GPIO mapping tables are hardly linked to an ACPI ID and certain
201b6dff0e1SChangbin Duobjects, as listed in the above chapter, of the device in question.
202b6dff0e1SChangbin Du
203b6dff0e1SChangbin DuGetting GPIO descriptor
204b6dff0e1SChangbin Du=======================
205b6dff0e1SChangbin Du
206b6dff0e1SChangbin DuThere are two main approaches to get GPIO resource from ACPI::
207b6dff0e1SChangbin Du
208b6dff0e1SChangbin Du  desc = gpiod_get(dev, connection_id, flags);
209b6dff0e1SChangbin Du  desc = gpiod_get_index(dev, connection_id, index, flags);
210b6dff0e1SChangbin Du
211b6dff0e1SChangbin DuWe may consider two different cases here, i.e. when connection ID is
212b6dff0e1SChangbin Duprovided and otherwise.
213b6dff0e1SChangbin Du
214b6dff0e1SChangbin DuCase 1::
215b6dff0e1SChangbin Du
216b6dff0e1SChangbin Du  desc = gpiod_get(dev, "non-null-connection-id", flags);
217b6dff0e1SChangbin Du  desc = gpiod_get_index(dev, "non-null-connection-id", index, flags);
218b6dff0e1SChangbin Du
219b6dff0e1SChangbin DuCase 2::
220b6dff0e1SChangbin Du
221b6dff0e1SChangbin Du  desc = gpiod_get(dev, NULL, flags);
222b6dff0e1SChangbin Du  desc = gpiod_get_index(dev, NULL, index, flags);
223b6dff0e1SChangbin Du
224b6dff0e1SChangbin DuCase 1 assumes that corresponding ACPI device description must have
225b6dff0e1SChangbin Dudefined device properties and will prevent to getting any GPIO resources
226b6dff0e1SChangbin Duotherwise.
227b6dff0e1SChangbin Du
228b6dff0e1SChangbin DuCase 2 explicitly tells GPIO core to look for resources in _CRS.
229b6dff0e1SChangbin Du
230b6dff0e1SChangbin DuBe aware that gpiod_get_index() in cases 1 and 2, assuming that there
231b6dff0e1SChangbin Duare two versions of ACPI device description provided and no mapping is
232b6dff0e1SChangbin Dupresent in the driver, will return different resources. That's why a
233*1bd33879SAndy Shevchenkocertain driver has to handle them carefully as explained in the previous
234b6dff0e1SChangbin Duchapter.
235