Message ID | 20180706093229.19072-2-hdegoede@redhat.com |
---|---|
State | New |
Headers | show |
Series | [RFC] gpiolib-acpi: make sure we trigger edge events at least once on boot | expand |
On Fri, Jul 06, 2018 at 11:32:29AM +0200, Hans de Goede wrote: > + > + /* > + * Make sure we trigger the initial state of the IRQ when > + * using RISING or FALLING. > + */ > + if (((irqflags & IRQF_TRIGGER_RISING) && value == 1) || > + ((irqflags & IRQF_TRIGGER_FALLING) && value == 0)) > + handler(-1, event); > + While I don't have anything against this it makes me wonder how it is handled in Windows side? Any idea? -- To unsubscribe from this list: send the line "unsubscribe linux-gpio" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi, On 07/06/2018 11:46 AM, Mika Westerberg wrote: > On Fri, Jul 06, 2018 at 11:32:29AM +0200, Hans de Goede wrote: >> + >> + /* >> + * Make sure we trigger the initial state of the IRQ when >> + * using RISING or FALLING. >> + */ >> + if (((irqflags & IRQF_TRIGGER_RISING) && value == 1) || >> + ((irqflags & IRQF_TRIGGER_FALLING) && value == 0)) >> + handler(-1, event); >> + > > While I don't have anything against this it makes me wonder how it is > handled in Windows side? Any idea? I guess Windows does the same, otherwise it should have similar issues, but that is just a guess. Regards, Hans -- To unsubscribe from this list: send the line "unsubscribe linux-gpio" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Fri, Jul 06, 2018 at 11:52:51AM +0200, Hans de Goede wrote: > Hi, > > On 07/06/2018 11:46 AM, Mika Westerberg wrote: > > On Fri, Jul 06, 2018 at 11:32:29AM +0200, Hans de Goede wrote: > > > + > > > + /* > > > + * Make sure we trigger the initial state of the IRQ when > > > + * using RISING or FALLING. > > > + */ > > > + if (((irqflags & IRQF_TRIGGER_RISING) && value == 1) || > > > + ((irqflags & IRQF_TRIGGER_FALLING) && value == 0)) > > > + handler(-1, event); > > > + > > > > While I don't have anything against this it makes me wonder how it is > > handled in Windows side? Any idea? > > I guess Windows does the same, otherwise it should have similar issues, > but that is just a guess. I see. Is this the ACPI control method lid device (PNP0C0D)? Maybe we can read its initial state using _LID method? -- To unsubscribe from this list: send the line "unsubscribe linux-gpio" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi, On 07/06/2018 12:27 PM, Mika Westerberg wrote: > On Fri, Jul 06, 2018 at 11:52:51AM +0200, Hans de Goede wrote: >> Hi, >> >> On 07/06/2018 11:46 AM, Mika Westerberg wrote: >>> On Fri, Jul 06, 2018 at 11:32:29AM +0200, Hans de Goede wrote: >>>> + >>>> + /* >>>> + * Make sure we trigger the initial state of the IRQ when >>>> + * using RISING or FALLING. >>>> + */ >>>> + if (((irqflags & IRQF_TRIGGER_RISING) && value == 1) || >>>> + ((irqflags & IRQF_TRIGGER_FALLING) && value == 0)) >>>> + handler(-1, event); >>>> + >>> >>> While I don't have anything against this it makes me wonder how it is >>> handled in Windows side? Any idea? >> >> I guess Windows does the same, otherwise it should have similar issues, >> but that is just a guess. > > I see. Is this the ACPI control method lid device (PNP0C0D)? Maybe we > can read its initial state using _LID method? No the problem is the _LID method reads an APCI variable which gets set by the _AEI handler. So if the _AEI handler has not run that variable will just be 0, which may or may not reflect the actual LID state. The 2nd case described in the commit message is the _AIE handler driving a GPIO and that GPIO / the mux controlled by that GPIO not reflecting the cable-type plugged into the micro-usb until the handler runs (this is the one I still need to verify it is actually fixed by this patch). Regards, Hans -- To unsubscribe from this list: send the line "unsubscribe linux-gpio" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Fri, 2018-07-06 at 11:32 +0200, Hans de Goede wrote: > From: Benjamin Tissoires <benjamin.tissoires@redhat.com> > > 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. I have read the discussion and it sounds like the best we can have right now (if it's indeed fixes all issues listed). One nit > + handler(-1, event); use 'irq' instead of '-1'.
On Fri, Jul 06, 2018 at 12:30:47PM +0200, Hans de Goede wrote: > > I see. Is this the ACPI control method lid device (PNP0C0D)? Maybe we > > can read its initial state using _LID method? > > No the problem is the _LID method reads an APCI variable which gets set > by the _AEI handler. So if the _AEI handler has not run that variable will > just be 0, which may or may not reflect the actual LID state. > > The 2nd case described in the commit message is the _AIE handler driving > a GPIO and that GPIO / the mux controlled by that GPIO not reflecting the > cable-type plugged into the micro-usb until the handler runs (this is the > one I still need to verify it is actually fixed by this patch). OK, thanks for the explanation. -- To unsubscribe from this list: send the line "unsubscribe linux-gpio" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi, On 07/06/2018 01:13 PM, Andy Shevchenko wrote: > On Fri, 2018-07-06 at 11:32 +0200, Hans de Goede wrote: >> From: Benjamin Tissoires <benjamin.tissoires@redhat.com> >> >> 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. > > I have read the discussion and it sounds like the best we can have right > now (if it's indeed fixes all issues listed). > > > One nit > >> + handler(-1, event); > > use 'irq' instead of '-1'. Ok, I've fixed this up in my local version. I will send out a non RFC version with this fixed once I've had a chance to run the tests which I want to run. Regards, Hans -- To unsubscribe from this list: send the line "unsubscribe linux-gpio" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/gpio/gpiolib-acpi.c b/drivers/gpio/gpiolib-acpi.c index e2232cbcec8b..7749b2ff7367 100644 --- a/drivers/gpio/gpiolib-acpi.c +++ b/drivers/gpio/gpiolib-acpi.c @@ -136,7 +136,7 @@ static acpi_status acpi_gpiochip_request_interrupt(struct acpi_resource *ares, irq_handler_t handler = NULL; struct gpio_desc *desc; unsigned long irqflags; - int ret, pin, irq; + int ret, pin, irq, value; if (!acpi_gpio_get_irq_resource(ares, &agpio)) return AE_OK; @@ -167,6 +167,8 @@ static acpi_status acpi_gpiochip_request_interrupt(struct acpi_resource *ares, gpiod_direction_input(desc); + value = gpiod_get_value(desc); + ret = gpiochip_lock_as_irq(chip, pin); if (ret) { dev_err(chip->parent, "Failed to lock GPIO as interrupt\n"); @@ -222,6 +224,15 @@ static acpi_status acpi_gpiochip_request_interrupt(struct acpi_resource *ares, enable_irq_wake(irq); list_add_tail(&event->node, &acpi_gpio->events); + + /* + * Make sure we trigger the initial state of the IRQ when + * using RISING or FALLING. + */ + if (((irqflags & IRQF_TRIGGER_RISING) && value == 1) || + ((irqflags & IRQF_TRIGGER_FALLING) && value == 0)) + handler(-1, event); + return AE_OK; fail_free_event: