• Mika Westerberg's avatar
    gpio / ACPI: Add support for ACPI GPIO operation regions · 473ed7be
    Mika Westerberg authored
    GPIO operation regions is a new feature introduced in ACPI 5.0
    specification. This feature adds a way for platform ASL code to call back
    to OS GPIO driver and toggle GPIO pins.
    
    An example ASL code from Lenovo Miix 2 tablet with only relevant part
    listed:
    
     Device (\_SB.GPO0)
     {
         Name (AVBL, Zero)
         Method (_REG, 2, NotSerialized)
         {
             If (LEqual (Arg0, 0x08))
             {
                 // Marks the region available
                 Store (Arg1, AVBL)
             }
         }
    
         OperationRegion (GPOP, GeneralPurposeIo, Zero, 0x0C)
         Field (GPOP, ByteAcc, NoLock, Preserve)
         {
             Connection (
                 GpioIo (Exclusive, PullDefault, 0, 0, IoRestrictionOutputOnly,
                         "\\_SB.GPO0", 0x00, ResourceConsumer,,)
                 {
                     0x003B
                 }
             ),
             SHD3,   1,
         }
     }
    
     Device (SHUB)
     {
         Method (_PS0, 0, Serialized)
         {
             If (LEqual (\_SB.GPO0.AVBL, One))
             {
                 Store (One, \_SB.GPO0.SHD3)
                 Sleep (0x32)
             }
         }
         Method (_PS3, 0, Serialized)
         {
             If (LEqual (\_SB.GPO0.AVBL, One))
             {
                 Store (Zero, \_SB.GPO0.SHD3)
             }
         }
     }
    
    How this works is that whenever _PS0 or _PS3 method is run (typically when
    SHUB device is transitioned to D0 or D3 respectively), ASL code checks if
    the GPIO operation region is available (\_SB.GPO0.AVBL). If it is we go and
    store either 0 or 1 to \_SB.GPO0.SHD3.
    
    Now, when ACPICA notices ACPI GPIO operation region access (the store
    above) it will call acpi_gpio_adr_space_handler() that then toggles the
    GPIO accordingly using standard gpiolib interfaces.
    
    Implement the support by registering GPIO operation region handlers for all
    GPIO devices that have an ACPI handle. First time the GPIO is used by the
    ASL code we make sure that the GPIO stays requested until the GPIO chip
    driver itself is unloaded. If we find out that the GPIO is already
    requested we just toggle it according to the value got from ASL code.
    Signed-off-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
    Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    473ed7be
gpiolib-acpi.c 13.3 KB