Hi, On 8/3/22 06:24, Mario Limonciello wrote: > gpiolib-acpi already had support for ignoring a pin for wakeup, but > if an OEM configures a floating pin as an interrupt source then > stopping it from being a wakeup won't do much good to stop the > interrupt storm. > > Add support for a module parameter and quirk infrastructure to > ignore interrupts as well. > > Signed-off-by: Mario Limonciello <mario.limonciello@xxxxxxx> Thanks, patch looks good to me: Reviewed-by: Hans de Goede <hdegoede@xxxxxxxxxx> Regards, Hans > --- > v1->v2: > * Drop enum > * Drop Tested-by tag > > drivers/gpio/gpiolib-acpi.c | 24 ++++++++++++++++++++---- > 1 file changed, 20 insertions(+), 4 deletions(-) > > diff --git a/drivers/gpio/gpiolib-acpi.c b/drivers/gpio/gpiolib-acpi.c > index c2523ac26fac..f993f6f728ad 100644 > --- a/drivers/gpio/gpiolib-acpi.c > +++ b/drivers/gpio/gpiolib-acpi.c > @@ -32,9 +32,16 @@ MODULE_PARM_DESC(ignore_wake, > "controller@pin combos on which to ignore the ACPI wake flag " > "ignore_wake=controller@pin[,controller@pin[,...]]"); > > +static char *ignore_interrupt; > +module_param(ignore_interrupt, charp, 0444); > +MODULE_PARM_DESC(ignore_interrupt, > + "controller@pin combos on which to ignore interrupt " > + "ignore_interrupt=controller@pin[,controller@pin[,...]]"); > + > struct acpi_gpiolib_dmi_quirk { > bool no_edge_events_on_boot; > char *ignore_wake; > + char *ignore_interrupt; > }; > > /** > @@ -317,14 +324,15 @@ static struct gpio_desc *acpi_request_own_gpiod(struct gpio_chip *chip, > return desc; > } > > -static bool acpi_gpio_in_ignore_list(const char *controller_in, unsigned int pin_in) > +static bool acpi_gpio_in_ignore_list(const char *ignore_list, const char *controller_in, > + unsigned int pin_in) > { > const char *controller, *pin_str; > unsigned int pin; > char *endp; > int len; > > - controller = ignore_wake; > + controller = ignore_list; > while (controller) { > pin_str = strchr(controller, '@'); > if (!pin_str) > @@ -348,7 +356,7 @@ static bool acpi_gpio_in_ignore_list(const char *controller_in, unsigned int pin > > return false; > err: > - pr_err_once("Error: Invalid value for gpiolib_acpi.ignore_wake: %s\n", ignore_wake); > + pr_err_once("Error: Invalid value for gpiolib_acpi.ignore_...: %s\n", ignore_list); > return false; > } > > @@ -360,7 +368,7 @@ static bool acpi_gpio_irq_is_wake(struct device *parent, > if (agpio->wake_capable != ACPI_WAKE_CAPABLE) > return false; > > - if (acpi_gpio_in_ignore_list(dev_name(parent), pin)) { > + if (acpi_gpio_in_ignore_list(ignore_wake, dev_name(parent), pin)) { > dev_info(parent, "Ignoring wakeup on pin %u\n", pin); > return false; > } > @@ -427,6 +435,11 @@ static acpi_status acpi_gpiochip_alloc_event(struct acpi_resource *ares, > goto fail_unlock_irq; > } > > + if (acpi_gpio_in_ignore_list(ignore_interrupt, dev_name(chip->parent), pin)) { > + dev_info(chip->parent, "Ignoring interrupt on pin %u\n", pin); > + return AE_OK; > + } > + > event = kzalloc(sizeof(*event), GFP_KERNEL); > if (!event) > goto fail_unlock_irq; > @@ -1582,6 +1595,9 @@ static int __init acpi_gpio_setup_params(void) > if (ignore_wake == NULL && quirk && quirk->ignore_wake) > ignore_wake = quirk->ignore_wake; > > + if (ignore_interrupt == NULL && quirk && quirk->ignore_interrupt) > + ignore_interrupt = quirk->ignore_interrupt; > + > return 0; > } >