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 { 231bd33879SAndy Shevchenko GpioIo (Exclusive, PullUp, 0, 0, IoRestrictionOutputOnly, 24b6dff0e1SChangbin Du "\\_SB.GPO0", 0, ResourceConsumer) {15} 251bd33879SAndy 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 521bd33879SAndy 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 580d6c41cfSAndy ShevchenkoNote, active_low in _DSD does not make sense for GpioInt() resource and 590d6c41cfSAndy Shevchenkomust be 0. GpioInt() resource has its own means of defining it. 600d6c41cfSAndy Shevchenko 61b6dff0e1SChangbin DuIn our Bluetooth example the "reset-gpios" refers to the second GpioIo() 62b6dff0e1SChangbin Duresource, second pin in that resource with the GPIO number of 31. 63b6dff0e1SChangbin Du 648b31e972SAndy ShevchenkoThe GpioIo() resource unfortunately doesn't explicitly provide an initial 658b31e972SAndy Shevchenkostate of the output pin which driver should use during its initialization. 668b31e972SAndy Shevchenko 678b31e972SAndy ShevchenkoLinux tries to use common sense here and derives the state from the bias 688b31e972SAndy Shevchenkoand polarity settings. The table below shows the expectations: 698b31e972SAndy Shevchenko 708b31e972SAndy Shevchenko========= ============= ============== 718b31e972SAndy ShevchenkoPull Bias Polarity Requested... 728b31e972SAndy Shevchenko========= ============= ============== 738b31e972SAndy ShevchenkoImplicit x AS IS (assumed firmware configured for us) 748b31e972SAndy ShevchenkoExplicit x (no _DSD) as Pull Bias (Up == High, Down == Low), 758b31e972SAndy Shevchenko assuming non-active (Polarity = !Pull Bias) 768b31e972SAndy ShevchenkoDown Low as low, assuming active 778b31e972SAndy ShevchenkoDown High as low, assuming non-active 788b31e972SAndy ShevchenkoUp Low as high, assuming non-active 798b31e972SAndy ShevchenkoUp High as high, assuming active 808b31e972SAndy Shevchenko========= ============= ============== 818b31e972SAndy Shevchenko 828b31e972SAndy ShevchenkoThat said, for our above example the both GPIOs, since the bias setting 838b31e972SAndy Shevchenkois explicit and _DSD is present, will be treated as active with a high 848b31e972SAndy Shevchenkopolarity and Linux will configure the pins in this state until a driver 858b31e972SAndy Shevchenkoreprograms them differently. 868b31e972SAndy Shevchenko 87b6dff0e1SChangbin DuIt is possible to leave holes in the array of GPIOs. This is useful in 88b6dff0e1SChangbin Ducases like with SPI host controllers where some chip selects may be 89b6dff0e1SChangbin Duimplemented as GPIOs and some as native signals. For example a SPI host 90b6dff0e1SChangbin Ducontroller can have chip selects 0 and 2 implemented as GPIOs and 1 as 91b6dff0e1SChangbin Dunative:: 92b6dff0e1SChangbin Du 93b6dff0e1SChangbin Du Package () { 94b6dff0e1SChangbin Du "cs-gpios", 95b6dff0e1SChangbin Du Package () { 96b6dff0e1SChangbin Du ^GPIO, 19, 0, 0, // chip select 0: GPIO 97b6dff0e1SChangbin Du 0, // chip select 1: native signal 98b6dff0e1SChangbin Du ^GPIO, 20, 0, 0, // chip select 2: GPIO 99b6dff0e1SChangbin Du } 100b6dff0e1SChangbin Du } 101b6dff0e1SChangbin Du 102*ec3576eaSAndy ShevchenkoNote, that historically ACPI has no means of the GPIO polarity and thus 103*ec3576eaSAndy Shevchenkothe SPISerialBus() resource defines it on the per-chip basis. In order 104*ec3576eaSAndy Shevchenkoto avoid a chain of negations, the GPIO polarity is considered being 105*ec3576eaSAndy ShevchenkoActive High. Even for the cases when _DSD() is involved (see the example 106*ec3576eaSAndy Shevchenkoabove) the GPIO CS polarity must be defined Active High to avoid ambiguity. 107*ec3576eaSAndy Shevchenko 108b6dff0e1SChangbin DuOther supported properties 109b6dff0e1SChangbin Du========================== 110b6dff0e1SChangbin Du 111b6dff0e1SChangbin DuFollowing Device Tree compatible device properties are also supported by 112b6dff0e1SChangbin Du_DSD device properties for GPIO controllers: 113b6dff0e1SChangbin Du 114b6dff0e1SChangbin Du- gpio-hog 115b6dff0e1SChangbin Du- output-high 116b6dff0e1SChangbin Du- output-low 117b6dff0e1SChangbin Du- input 118b6dff0e1SChangbin Du- line-name 119b6dff0e1SChangbin Du 120b6dff0e1SChangbin DuExample:: 121b6dff0e1SChangbin Du 122b6dff0e1SChangbin Du Name (_DSD, Package () { 123b6dff0e1SChangbin Du // _DSD Hierarchical Properties Extension UUID 124b6dff0e1SChangbin Du ToUUID("dbb8e3e6-5886-4ba6-8795-1319f52a966b"), 125b6dff0e1SChangbin Du Package () { 126b6dff0e1SChangbin Du Package () {"hog-gpio8", "G8PU"} 127b6dff0e1SChangbin Du } 128b6dff0e1SChangbin Du }) 129b6dff0e1SChangbin Du 130b6dff0e1SChangbin Du Name (G8PU, Package () { 131b6dff0e1SChangbin Du ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), 132b6dff0e1SChangbin Du Package () { 133b6dff0e1SChangbin Du Package () {"gpio-hog", 1}, 134b6dff0e1SChangbin Du Package () {"gpios", Package () {8, 0}}, 135b6dff0e1SChangbin Du Package () {"output-high", 1}, 136b6dff0e1SChangbin Du Package () {"line-name", "gpio8-pullup"}, 137b6dff0e1SChangbin Du } 138b6dff0e1SChangbin Du }) 139b6dff0e1SChangbin Du 140b6dff0e1SChangbin Du- gpio-line-names 141b6dff0e1SChangbin Du 1424697958bSFlavio SuligoiThe ``gpio-line-names`` declaration is a list of strings ("names"), which 1434697958bSFlavio Suligoidescribes each line/pin of a GPIO controller/expander. This list, contained in 1444697958bSFlavio Suligoia package, must be inserted inside the GPIO controller declaration of an ACPI 1454697958bSFlavio Suligoitable (typically inside the DSDT). The ``gpio-line-names`` list must respect the 1464697958bSFlavio Suligoifollowing rules (see also the examples): 1474697958bSFlavio Suligoi 1484697958bSFlavio Suligoi - the first name in the list corresponds with the first line/pin of the GPIO 1494697958bSFlavio Suligoi controller/expander 1504697958bSFlavio Suligoi - the names inside the list must be consecutive (no "holes" are permitted) 1514697958bSFlavio Suligoi - the list can be incomplete and can end before the last GPIO line: in 1524697958bSFlavio Suligoi other words, it is not mandatory to fill all the GPIO lines 1534697958bSFlavio Suligoi - empty names are allowed (two quotation marks ``""`` correspond to an empty 1544697958bSFlavio Suligoi name) 155731e97e0SFlavio Suligoi - names inside one GPIO controller/expander must be unique 1564697958bSFlavio Suligoi 1574697958bSFlavio SuligoiExample of a GPIO controller of 16 lines, with an incomplete list with two 1584697958bSFlavio Suligoiempty names:: 1594697958bSFlavio Suligoi 1604697958bSFlavio Suligoi Package () { 1614697958bSFlavio Suligoi "gpio-line-names", 1624697958bSFlavio Suligoi Package () { 1634697958bSFlavio Suligoi "pin_0", 1644697958bSFlavio Suligoi "pin_1", 1654697958bSFlavio Suligoi "", 1664697958bSFlavio Suligoi "", 1674697958bSFlavio Suligoi "pin_3", 1684697958bSFlavio Suligoi "pin_4_push_button", 1694697958bSFlavio Suligoi } 1704697958bSFlavio Suligoi } 1714697958bSFlavio Suligoi 1724697958bSFlavio SuligoiAt runtime, the above declaration produces the following result (using the 1734697958bSFlavio Suligoi"libgpiod" tools):: 1744697958bSFlavio Suligoi 1754697958bSFlavio Suligoi root@debian:~# gpioinfo gpiochip4 1764697958bSFlavio Suligoi gpiochip4 - 16 lines: 1774697958bSFlavio Suligoi line 0: "pin_0" unused input active-high 1784697958bSFlavio Suligoi line 1: "pin_1" unused input active-high 1794697958bSFlavio Suligoi line 2: unnamed unused input active-high 1804697958bSFlavio Suligoi line 3: unnamed unused input active-high 1814697958bSFlavio Suligoi line 4: "pin_3" unused input active-high 1824697958bSFlavio Suligoi line 5: "pin_4_push_button" unused input active-high 1834697958bSFlavio Suligoi line 6: unnamed unused input active-high 1844697958bSFlavio Suligoi line 7 unnamed unused input active-high 1854697958bSFlavio Suligoi line 8: unnamed unused input active-high 1864697958bSFlavio Suligoi line 9: unnamed unused input active-high 1874697958bSFlavio Suligoi line 10: unnamed unused input active-high 1884697958bSFlavio Suligoi line 11: unnamed unused input active-high 1894697958bSFlavio Suligoi line 12: unnamed unused input active-high 1904697958bSFlavio Suligoi line 13: unnamed unused input active-high 1914697958bSFlavio Suligoi line 14: unnamed unused input active-high 1924697958bSFlavio Suligoi line 15: unnamed unused input active-high 1934697958bSFlavio Suligoi root@debian:~# gpiofind pin_4_push_button 1944697958bSFlavio Suligoi gpiochip4 5 1954697958bSFlavio Suligoi root@debian:~# 1964697958bSFlavio Suligoi 1974697958bSFlavio SuligoiAnother example:: 198b6dff0e1SChangbin Du 199b6dff0e1SChangbin Du Package () { 200b6dff0e1SChangbin Du "gpio-line-names", 201b6dff0e1SChangbin Du Package () { 2021bd33879SAndy Shevchenko "SPI0_CS_N", "EXP2_INT", "MUX6_IO", "UART0_RXD", 2031bd33879SAndy Shevchenko "MUX7_IO", "LVL_C_A1", "MUX0_IO", "SPI1_MISO", 204b6dff0e1SChangbin Du } 205b6dff0e1SChangbin Du } 206b6dff0e1SChangbin Du 207b6dff0e1SChangbin DuSee Documentation/devicetree/bindings/gpio/gpio.txt for more information 208b6dff0e1SChangbin Duabout these properties. 209b6dff0e1SChangbin Du 210b6dff0e1SChangbin DuACPI GPIO Mappings Provided by Drivers 211b6dff0e1SChangbin Du====================================== 212b6dff0e1SChangbin Du 213b6dff0e1SChangbin DuThere are systems in which the ACPI tables do not contain _DSD but provide _CRS 214b6dff0e1SChangbin Duwith GpioIo()/GpioInt() resources and device drivers still need to work with 215b6dff0e1SChangbin Duthem. 216b6dff0e1SChangbin Du 217b6dff0e1SChangbin DuIn those cases ACPI device identification objects, _HID, _CID, _CLS, _SUB, _HRV, 218b6dff0e1SChangbin Duavailable to the driver can be used to identify the device and that is supposed 219b6dff0e1SChangbin Duto be sufficient to determine the meaning and purpose of all of the GPIO lines 220b6dff0e1SChangbin Dulisted by the GpioIo()/GpioInt() resources returned by _CRS. In other words, 221b6dff0e1SChangbin Duthe driver is supposed to know what to use the GpioIo()/GpioInt() resources for 222b6dff0e1SChangbin Duonce it has identified the device. Having done that, it can simply assign names 223b6dff0e1SChangbin Duto the GPIO lines it is going to use and provide the GPIO subsystem with a 224b6dff0e1SChangbin Dumapping between those names and the ACPI GPIO resources corresponding to them. 225b6dff0e1SChangbin Du 226b6dff0e1SChangbin DuTo do that, the driver needs to define a mapping table as a NULL-terminated 2271bd33879SAndy Shevchenkoarray of struct acpi_gpio_mapping objects that each contains a name, a pointer 228b6dff0e1SChangbin Duto an array of line data (struct acpi_gpio_params) objects and the size of that 229b6dff0e1SChangbin Duarray. Each struct acpi_gpio_params object consists of three fields, 230b6dff0e1SChangbin Ducrs_entry_index, line_index, active_low, representing the index of the target 231b6dff0e1SChangbin DuGpioIo()/GpioInt() resource in _CRS starting from zero, the index of the target 232b6dff0e1SChangbin Duline in that resource starting from zero, and the active-low flag for that line, 233b6dff0e1SChangbin Durespectively, in analogy with the _DSD GPIO property format specified above. 234b6dff0e1SChangbin Du 235b6dff0e1SChangbin DuFor the example Bluetooth device discussed previously the data structures in 236b6dff0e1SChangbin Duquestion would look like this:: 237b6dff0e1SChangbin Du 238b6dff0e1SChangbin Du static const struct acpi_gpio_params reset_gpio = { 1, 1, false }; 239b6dff0e1SChangbin Du static const struct acpi_gpio_params shutdown_gpio = { 0, 0, false }; 240b6dff0e1SChangbin Du 241b6dff0e1SChangbin Du static const struct acpi_gpio_mapping bluetooth_acpi_gpios[] = { 242b6dff0e1SChangbin Du { "reset-gpios", &reset_gpio, 1 }, 243b6dff0e1SChangbin Du { "shutdown-gpios", &shutdown_gpio, 1 }, 2441bd33879SAndy Shevchenko { } 245b6dff0e1SChangbin Du }; 246b6dff0e1SChangbin Du 247b6dff0e1SChangbin DuNext, the mapping table needs to be passed as the second argument to 2481bd33879SAndy Shevchenkoacpi_dev_add_driver_gpios() or its managed analogue that will 2491bd33879SAndy Shevchenkoregister it with the ACPI device object pointed to by its first 2501bd33879SAndy Shevchenkoargument. That should be done in the driver's .probe() routine. 2511bd33879SAndy ShevchenkoOn removal, the driver should unregister its GPIO mapping table by 252b6dff0e1SChangbin Ducalling acpi_dev_remove_driver_gpios() on the ACPI device object where that 253b6dff0e1SChangbin Dutable was previously registered. 254b6dff0e1SChangbin Du 255b6dff0e1SChangbin DuUsing the _CRS fallback 256b6dff0e1SChangbin Du======================= 257b6dff0e1SChangbin Du 258b6dff0e1SChangbin DuIf a device does not have _DSD or the driver does not create ACPI GPIO 259b6dff0e1SChangbin Dumapping, the Linux GPIO framework refuses to return any GPIOs. This is 260b6dff0e1SChangbin Dubecause the driver does not know what it actually gets. For example if we 261b6dff0e1SChangbin Duhave a device like below:: 262b6dff0e1SChangbin Du 263b6dff0e1SChangbin Du Device (BTH) 264b6dff0e1SChangbin Du { 265b6dff0e1SChangbin Du Name (_HID, ...) 266b6dff0e1SChangbin Du 267b6dff0e1SChangbin Du Name (_CRS, ResourceTemplate () { 268b6dff0e1SChangbin Du GpioIo (Exclusive, PullNone, 0, 0, IoRestrictionNone, 269b6dff0e1SChangbin Du "\\_SB.GPO0", 0, ResourceConsumer) {15} 270b6dff0e1SChangbin Du GpioIo (Exclusive, PullNone, 0, 0, IoRestrictionNone, 271b6dff0e1SChangbin Du "\\_SB.GPO0", 0, ResourceConsumer) {27} 272b6dff0e1SChangbin Du }) 273b6dff0e1SChangbin Du } 274b6dff0e1SChangbin Du 275b6dff0e1SChangbin DuThe driver might expect to get the right GPIO when it does:: 276b6dff0e1SChangbin Du 277b6dff0e1SChangbin Du desc = gpiod_get(dev, "reset", GPIOD_OUT_LOW); 278b6dff0e1SChangbin Du 279b6dff0e1SChangbin Dubut since there is no way to know the mapping between "reset" and 280b6dff0e1SChangbin Duthe GpioIo() in _CRS desc will hold ERR_PTR(-ENOENT). 281b6dff0e1SChangbin Du 2821bd33879SAndy ShevchenkoThe driver author can solve this by passing the mapping explicitly 2831bd33879SAndy Shevchenko(this is the recommended way and it's documented in the above chapter). 284b6dff0e1SChangbin Du 285b6dff0e1SChangbin DuThe ACPI GPIO mapping tables should not contaminate drivers that are not 286b6dff0e1SChangbin Duknowing about which exact device they are servicing on. It implies that 2871bd33879SAndy Shevchenkothe ACPI GPIO mapping tables are hardly linked to an ACPI ID and certain 288b6dff0e1SChangbin Duobjects, as listed in the above chapter, of the device in question. 289b6dff0e1SChangbin Du 290b6dff0e1SChangbin DuGetting GPIO descriptor 291b6dff0e1SChangbin Du======================= 292b6dff0e1SChangbin Du 293b6dff0e1SChangbin DuThere are two main approaches to get GPIO resource from ACPI:: 294b6dff0e1SChangbin Du 295b6dff0e1SChangbin Du desc = gpiod_get(dev, connection_id, flags); 296b6dff0e1SChangbin Du desc = gpiod_get_index(dev, connection_id, index, flags); 297b6dff0e1SChangbin Du 298b6dff0e1SChangbin DuWe may consider two different cases here, i.e. when connection ID is 299b6dff0e1SChangbin Duprovided and otherwise. 300b6dff0e1SChangbin Du 301b6dff0e1SChangbin DuCase 1:: 302b6dff0e1SChangbin Du 303b6dff0e1SChangbin Du desc = gpiod_get(dev, "non-null-connection-id", flags); 304b6dff0e1SChangbin Du desc = gpiod_get_index(dev, "non-null-connection-id", index, flags); 305b6dff0e1SChangbin Du 306b6dff0e1SChangbin DuCase 2:: 307b6dff0e1SChangbin Du 308b6dff0e1SChangbin Du desc = gpiod_get(dev, NULL, flags); 309b6dff0e1SChangbin Du desc = gpiod_get_index(dev, NULL, index, flags); 310b6dff0e1SChangbin Du 311b6dff0e1SChangbin DuCase 1 assumes that corresponding ACPI device description must have 312b6dff0e1SChangbin Dudefined device properties and will prevent to getting any GPIO resources 313b6dff0e1SChangbin Duotherwise. 314b6dff0e1SChangbin Du 315b6dff0e1SChangbin DuCase 2 explicitly tells GPIO core to look for resources in _CRS. 316b6dff0e1SChangbin Du 317b6dff0e1SChangbin DuBe aware that gpiod_get_index() in cases 1 and 2, assuming that there 318b6dff0e1SChangbin Duare two versions of ACPI device description provided and no mapping is 319b6dff0e1SChangbin Dupresent in the driver, will return different resources. That's why a 3201bd33879SAndy Shevchenkocertain driver has to handle them carefully as explained in the previous 321b6dff0e1SChangbin Duchapter. 322