Re: [PATCH v2] gpiolib-acpi: make sure we trigger edge events at least once on boot

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Jul 12, 2018 at 5:25 PM Hans de Goede <hdegoede@xxxxxxxxxx> wrote:

> From: Benjamin Tissoires <benjamin.tissoires@xxxxxxxxxx>
>
> On some systems using edge triggered ACPI Event Interrupts, the initial
> state at boot is not setup by the firmware, instead relying on the edge
> irq event handler running at least once to setup the initial state.
>
> 2 known examples of this are:
>
> 1) The Surface 3 has its _LID state controlled by an ACPI operation region
>  triggered by a GPIO event:
>
>  OperationRegion (GPOR, GeneralPurposeIo, Zero, One)
>  Field (GPOR, ByteAcc, NoLock, Preserve)
>  {
>      Connection (
>          GpioIo (Shared, PullNone, 0x0000, 0x0000, IoRestrictionNone,
>              "\\_SB.GPO0", 0x00, ResourceConsumer, ,
>              )
>              {   // Pin list
>                  0x004C
>              }
>      ),
>      HELD,   1
>  }
>
>  Method (_E4C, 0, Serialized)  // _Exx: Edge-Triggered GPE
>  {
>      If ((HELD == One))
>      {
>          ^^LID.LIDB = One
>      }
>      Else
>      {
>          ^^LID.LIDB = Zero
>          Notify (LID, 0x80) // Status Change
>      }
>
>      Notify (^^PCI0.SPI1.NTRG, One) // Device Check
>  }
>
>  Currently, the state of LIDB is wrong until the user actually closes or
>  open the cover. We need to trigger the GPIO event once to update the
>  internal ACPI state.
>
>  Coincidentally, this also enables the Surface 2 integrated HID sensor hub
>  which also requires an ACPI gpio operation region to start initialization.
>
> 2) Various Bay Trail based tablets come with an external USB mux and
>  TI T1210B USB phy to enable USB gadget mode. The mux is controlled by a
>  GPIO which is controlled by an edge triggered ACPI Event Interrupt which
>  monitors the micro-USB ID pin.
>
>  When the tablet is connected to a PC (or no cable is plugged in), the ID
>  pin is high and the tablet should be in gadget mode. But the GPIO
>  controlling the mux is initialized by the firmware so that the USB data
>  lines are muxed to the host controller.
>
>  This means that if the user wants to use gadget mode, the user needs to
>  first plug in a host-cable to force the ID pin low and then unplug it
>  and connect the tablet to a PC, to get the ACPI event handler to run and
>  switch the mux to device mode,
>
> This commit fixes both by running the event-handler once on boot.
>
> Note that the running of the event-handler is done from a late_initcall,
> this is done because the handler AML code may rely on OperationRegions
> registered by other builtin drivers. This avoids errors like these:
>
> [    0.133026] ACPI Error: No handler for Region [XSCG] ((____ptrval____)) [GenericSerialBus] (20180531/evregion-132)
> [    0.133036] ACPI Error: Region GenericSerialBus (ID=9) has no handler (20180531/exfldio-265)
> [    0.133046] ACPI Error: Method parse/execution failed \_SB.GPO2._E12, AE_NOT_EXIST (20180531/psparse-516)
>
> Signed-off-by: Benjamin Tissoires <benjamin.tissoires@xxxxxxxxxx>
> [hdegoede: Document BYT USB mux reliance on initial trigger]
> [hdegoede: Run event handler from a late_initcall, rather then immediately]
> Signed-off-by: Hans de Goede <hdegoede@xxxxxxxxxx>
> ---
> Changes in v2:
> -Use late_initcall_sync to delay running the handler till other drivers
>  have been probed, rather then using a delayed_workqueue

I've applied this for fixes.

Sorry for the delay. I'm technically on vacation.

Yours,
Linus Walleij
--
To unsubscribe from this list: send the line "unsubscribe linux-gpio" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux SPI]     [Linux Kernel]     [Linux ARM (vger)]     [Linux ARM MSM]     [Linux Omap]     [Linux Arm]     [Linux Tegra]     [Fedora ARM]     [Linux for Samsung SOC]     [eCos]     [Linux Fastboot]     [Gcc Help]     [Git]     [DCCP]     [IETF Announce]     [Security]     [Linux MIPS]     [Yosemite Campsites]

  Powered by Linux