Hi, On 11/6/20 8:22 PM, Andy Shevchenko wrote: > We didn't take into account the debounce settings supplied by ACPI. > This change is targeting the mentioned gap. > > Reported-by: Coiby Xu <coiby.xu@xxxxxxxxx> > Cc: Hans de Goede <hdegoede@xxxxxxxxxx> > Signed-off-by: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx> > Acked-by: Linus Walleij <linus.walleij@xxxxxxxxxx> I added an older version of this (which only modified acpi_dev_gpio_irq_get()) for testing and when booting a kernel with that version applied to it, on a Cherry Trail device I noticed that a whole bunch of devices where no longer seen by the kernel because of acpi_dev_gpio_irq_get() returning errors now (-ENOTSUPP). Quoting from the gpiod_set_debounce docs: /** * gpiod_set_debounce - sets @debounce time for a GPIO * @desc: descriptor of the GPIO for which to set debounce time * @debounce: debounce time in microseconds * * Returns: * 0 on success, %-ENOTSUPP if the controller doesn't support setting the * debounce time. */ This is expected on GPIO chips where setting the debounce time is not supported. So the error handling should be modified to ignore -ENOTSUPP errors here. This certainly MUST NOT be merged as is because it breaks a lot of things as is. Regards, Hans > --- > drivers/gpio/gpiolib-acpi.c | 18 ++++++++++++++++++ > drivers/gpio/gpiolib-acpi.h | 2 ++ > 2 files changed, 20 insertions(+) > > diff --git a/drivers/gpio/gpiolib-acpi.c b/drivers/gpio/gpiolib-acpi.c > index c127b410a7a2..b4a0decfeac2 100644 > --- a/drivers/gpio/gpiolib-acpi.c > +++ b/drivers/gpio/gpiolib-acpi.c > @@ -299,6 +299,10 @@ static acpi_status acpi_gpiochip_alloc_event(struct acpi_resource *ares, > return AE_OK; > } > > + ret = gpiod_set_debounce(desc, agpio->debounce_timeout); > + if (ret) > + goto fail_free_desc; > + > ret = gpiochip_lock_as_irq(chip, pin); > if (ret) { > dev_err(chip->parent, > @@ -664,6 +668,7 @@ static int acpi_populate_gpio_lookup(struct acpi_resource *ares, void *data) > lookup->desc = acpi_get_gpiod(agpio->resource_source.string_ptr, > agpio->pin_table[pin_index]); > lookup->info.pin_config = agpio->pin_config; > + lookup->info.debounce = agpio->debounce_timeout; > lookup->info.gpioint = gpioint; > > /* > @@ -961,6 +966,10 @@ int acpi_dev_gpio_irq_get(struct acpi_device *adev, int index) > if (ret < 0) > return ret; > > + ret = gpiod_set_debounce(desc, info.debounce); > + if (ret) > + return ret; > + > irq_flags = acpi_dev_get_irq_type(info.triggering, > info.polarity); > > @@ -1048,6 +1057,7 @@ acpi_gpio_adr_space_handler(u32 function, acpi_physical_address address, > if (!found) { > enum gpiod_flags flags = acpi_gpio_to_gpiod_flags(agpio); > const char *label = "ACPI:OpRegion"; > + int ret; > > desc = gpiochip_request_own_desc(chip, pin, label, > GPIO_ACTIVE_HIGH, > @@ -1058,6 +1068,14 @@ acpi_gpio_adr_space_handler(u32 function, acpi_physical_address address, > goto out; > } > > + ret = gpiod_set_debounce(desc, agpio->debounce_timeout); > + if (ret) { > + status = AE_ERROR; > + gpiochip_free_own_desc(desc); > + mutex_unlock(&achip->conn_lock); > + goto out; > + } > + > conn = kzalloc(sizeof(*conn), GFP_KERNEL); > if (!conn) { > status = AE_NO_MEMORY; > diff --git a/drivers/gpio/gpiolib-acpi.h b/drivers/gpio/gpiolib-acpi.h > index 1c6d65cf0629..e2edb632b2cc 100644 > --- a/drivers/gpio/gpiolib-acpi.h > +++ b/drivers/gpio/gpiolib-acpi.h > @@ -18,6 +18,7 @@ struct acpi_device; > * @pin_config: pin bias as provided by ACPI > * @polarity: interrupt polarity as provided by ACPI > * @triggering: triggering type as provided by ACPI > + * @debounce: debounce timeout as provided by ACPI > * @quirks: Linux specific quirks as provided by struct acpi_gpio_mapping > */ > struct acpi_gpio_info { > @@ -27,6 +28,7 @@ struct acpi_gpio_info { > int pin_config; > int polarity; > int triggering; > + unsigned int debounce; > unsigned int quirks; > }; > >