0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include <linux/dmi.h>
0011 #include <linux/errno.h>
0012 #include <linux/gpio/consumer.h>
0013 #include <linux/gpio/driver.h>
0014 #include <linux/gpio/machine.h>
0015 #include <linux/export.h>
0016 #include <linux/acpi.h>
0017 #include <linux/interrupt.h>
0018 #include <linux/mutex.h>
0019 #include <linux/pinctrl/pinctrl.h>
0020
0021 #include "gpiolib.h"
0022 #include "gpiolib-acpi.h"
0023
0024 static int run_edge_events_on_boot = -1;
0025 module_param(run_edge_events_on_boot, int, 0444);
0026 MODULE_PARM_DESC(run_edge_events_on_boot,
0027 "Run edge _AEI event-handlers at boot: 0=no, 1=yes, -1=auto");
0028
0029 static char *ignore_wake;
0030 module_param(ignore_wake, charp, 0444);
0031 MODULE_PARM_DESC(ignore_wake,
0032 "controller@pin combos on which to ignore the ACPI wake flag "
0033 "ignore_wake=controller@pin[,controller@pin[,...]]");
0034
0035 static char *ignore_interrupt;
0036 module_param(ignore_interrupt, charp, 0444);
0037 MODULE_PARM_DESC(ignore_interrupt,
0038 "controller@pin combos on which to ignore interrupt "
0039 "ignore_interrupt=controller@pin[,controller@pin[,...]]");
0040
0041 struct acpi_gpiolib_dmi_quirk {
0042 bool no_edge_events_on_boot;
0043 char *ignore_wake;
0044 char *ignore_interrupt;
0045 };
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060 struct acpi_gpio_event {
0061 struct list_head node;
0062 acpi_handle handle;
0063 irq_handler_t handler;
0064 unsigned int pin;
0065 unsigned int irq;
0066 unsigned long irqflags;
0067 bool irq_is_wake;
0068 bool irq_requested;
0069 struct gpio_desc *desc;
0070 };
0071
0072 struct acpi_gpio_connection {
0073 struct list_head node;
0074 unsigned int pin;
0075 struct gpio_desc *desc;
0076 };
0077
0078 struct acpi_gpio_chip {
0079
0080
0081
0082
0083
0084 struct acpi_connection_info conn_info;
0085 struct list_head conns;
0086 struct mutex conn_lock;
0087 struct gpio_chip *chip;
0088 struct list_head events;
0089 struct list_head deferred_req_irqs_list_entry;
0090 };
0091
0092
0093
0094
0095
0096
0097
0098
0099 static DEFINE_MUTEX(acpi_gpio_deferred_req_irqs_lock);
0100 static LIST_HEAD(acpi_gpio_deferred_req_irqs_list);
0101 static bool acpi_gpio_deferred_req_irqs_done;
0102
0103 static int acpi_gpiochip_find(struct gpio_chip *gc, void *data)
0104 {
0105 return gc->parent && device_match_acpi_handle(gc->parent, data);
0106 }
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118 static struct gpio_desc *acpi_get_gpiod(char *path, unsigned int pin)
0119 {
0120 struct gpio_chip *chip;
0121 acpi_handle handle;
0122 acpi_status status;
0123
0124 status = acpi_get_handle(NULL, path, &handle);
0125 if (ACPI_FAILURE(status))
0126 return ERR_PTR(-ENODEV);
0127
0128 chip = gpiochip_find(handle, acpi_gpiochip_find);
0129 if (!chip)
0130 return ERR_PTR(-EPROBE_DEFER);
0131
0132 return gpiochip_get_desc(chip, pin);
0133 }
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146 struct gpio_desc *acpi_get_and_request_gpiod(char *path, unsigned int pin, char *label)
0147 {
0148 struct gpio_desc *gpio;
0149 int ret;
0150
0151 gpio = acpi_get_gpiod(path, pin);
0152 if (IS_ERR(gpio))
0153 return gpio;
0154
0155 ret = gpiod_request(gpio, label);
0156 if (ret)
0157 return ERR_PTR(ret);
0158
0159 return gpio;
0160 }
0161 EXPORT_SYMBOL_GPL(acpi_get_and_request_gpiod);
0162
0163 static irqreturn_t acpi_gpio_irq_handler(int irq, void *data)
0164 {
0165 struct acpi_gpio_event *event = data;
0166
0167 acpi_evaluate_object(event->handle, NULL, NULL, NULL);
0168
0169 return IRQ_HANDLED;
0170 }
0171
0172 static irqreturn_t acpi_gpio_irq_handler_evt(int irq, void *data)
0173 {
0174 struct acpi_gpio_event *event = data;
0175
0176 acpi_execute_simple_method(event->handle, NULL, event->pin);
0177
0178 return IRQ_HANDLED;
0179 }
0180
0181 static void acpi_gpio_chip_dh(acpi_handle handle, void *data)
0182 {
0183
0184 }
0185
0186 bool acpi_gpio_get_irq_resource(struct acpi_resource *ares,
0187 struct acpi_resource_gpio **agpio)
0188 {
0189 struct acpi_resource_gpio *gpio;
0190
0191 if (ares->type != ACPI_RESOURCE_TYPE_GPIO)
0192 return false;
0193
0194 gpio = &ares->data.gpio;
0195 if (gpio->connection_type != ACPI_RESOURCE_GPIO_TYPE_INT)
0196 return false;
0197
0198 *agpio = gpio;
0199 return true;
0200 }
0201 EXPORT_SYMBOL_GPL(acpi_gpio_get_irq_resource);
0202
0203
0204
0205
0206
0207
0208
0209 bool acpi_gpio_get_io_resource(struct acpi_resource *ares,
0210 struct acpi_resource_gpio **agpio)
0211 {
0212 struct acpi_resource_gpio *gpio;
0213
0214 if (ares->type != ACPI_RESOURCE_TYPE_GPIO)
0215 return false;
0216
0217 gpio = &ares->data.gpio;
0218 if (gpio->connection_type != ACPI_RESOURCE_GPIO_TYPE_IO)
0219 return false;
0220
0221 *agpio = gpio;
0222 return true;
0223 }
0224 EXPORT_SYMBOL_GPL(acpi_gpio_get_io_resource);
0225
0226 static void acpi_gpiochip_request_irq(struct acpi_gpio_chip *acpi_gpio,
0227 struct acpi_gpio_event *event)
0228 {
0229 struct device *parent = acpi_gpio->chip->parent;
0230 int ret, value;
0231
0232 ret = request_threaded_irq(event->irq, NULL, event->handler,
0233 event->irqflags | IRQF_ONESHOT, "ACPI:Event", event);
0234 if (ret) {
0235 dev_err(parent, "Failed to setup interrupt handler for %d\n", event->irq);
0236 return;
0237 }
0238
0239 if (event->irq_is_wake)
0240 enable_irq_wake(event->irq);
0241
0242 event->irq_requested = true;
0243
0244
0245 if (run_edge_events_on_boot &&
0246 (event->irqflags & (IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING))) {
0247 value = gpiod_get_raw_value_cansleep(event->desc);
0248 if (((event->irqflags & IRQF_TRIGGER_RISING) && value == 1) ||
0249 ((event->irqflags & IRQF_TRIGGER_FALLING) && value == 0))
0250 event->handler(event->irq, event);
0251 }
0252 }
0253
0254 static void acpi_gpiochip_request_irqs(struct acpi_gpio_chip *acpi_gpio)
0255 {
0256 struct acpi_gpio_event *event;
0257
0258 list_for_each_entry(event, &acpi_gpio->events, node)
0259 acpi_gpiochip_request_irq(acpi_gpio, event);
0260 }
0261
0262 static enum gpiod_flags
0263 acpi_gpio_to_gpiod_flags(const struct acpi_resource_gpio *agpio, int polarity)
0264 {
0265
0266 if (agpio->connection_type == ACPI_RESOURCE_GPIO_TYPE_INT)
0267 return GPIOD_IN;
0268
0269 switch (agpio->io_restriction) {
0270 case ACPI_IO_RESTRICT_INPUT:
0271 return GPIOD_IN;
0272 case ACPI_IO_RESTRICT_OUTPUT:
0273
0274
0275
0276
0277
0278
0279
0280
0281
0282 switch (agpio->pin_config) {
0283 case ACPI_PIN_CONFIG_PULLUP:
0284 return polarity == GPIO_ACTIVE_LOW ? GPIOD_OUT_LOW : GPIOD_OUT_HIGH;
0285 case ACPI_PIN_CONFIG_PULLDOWN:
0286 return polarity == GPIO_ACTIVE_LOW ? GPIOD_OUT_HIGH : GPIOD_OUT_LOW;
0287 default:
0288 break;
0289 }
0290 break;
0291 default:
0292 break;
0293 }
0294
0295
0296
0297
0298
0299 return GPIOD_ASIS;
0300 }
0301
0302 static struct gpio_desc *acpi_request_own_gpiod(struct gpio_chip *chip,
0303 struct acpi_resource_gpio *agpio,
0304 unsigned int index,
0305 const char *label)
0306 {
0307 int polarity = GPIO_ACTIVE_HIGH;
0308 enum gpiod_flags flags = acpi_gpio_to_gpiod_flags(agpio, polarity);
0309 unsigned int pin = agpio->pin_table[index];
0310 struct gpio_desc *desc;
0311 int ret;
0312
0313 desc = gpiochip_request_own_desc(chip, pin, label, polarity, flags);
0314 if (IS_ERR(desc))
0315 return desc;
0316
0317
0318 ret = gpio_set_debounce_timeout(desc, agpio->debounce_timeout * 10);
0319 if (ret)
0320 dev_warn(chip->parent,
0321 "Failed to set debounce-timeout for pin 0x%04X, err %d\n",
0322 pin, ret);
0323
0324 return desc;
0325 }
0326
0327 static bool acpi_gpio_in_ignore_list(const char *ignore_list, const char *controller_in,
0328 unsigned int pin_in)
0329 {
0330 const char *controller, *pin_str;
0331 unsigned int pin;
0332 char *endp;
0333 int len;
0334
0335 controller = ignore_list;
0336 while (controller) {
0337 pin_str = strchr(controller, '@');
0338 if (!pin_str)
0339 goto err;
0340
0341 len = pin_str - controller;
0342 if (len == strlen(controller_in) &&
0343 strncmp(controller, controller_in, len) == 0) {
0344 pin = simple_strtoul(pin_str + 1, &endp, 10);
0345 if (*endp != 0 && *endp != ',')
0346 goto err;
0347
0348 if (pin == pin_in)
0349 return true;
0350 }
0351
0352 controller = strchr(controller, ',');
0353 if (controller)
0354 controller++;
0355 }
0356
0357 return false;
0358 err:
0359 pr_err_once("Error: Invalid value for gpiolib_acpi.ignore_...: %s\n", ignore_list);
0360 return false;
0361 }
0362
0363 static bool acpi_gpio_irq_is_wake(struct device *parent,
0364 struct acpi_resource_gpio *agpio)
0365 {
0366 unsigned int pin = agpio->pin_table[0];
0367
0368 if (agpio->wake_capable != ACPI_WAKE_CAPABLE)
0369 return false;
0370
0371 if (acpi_gpio_in_ignore_list(ignore_wake, dev_name(parent), pin)) {
0372 dev_info(parent, "Ignoring wakeup on pin %u\n", pin);
0373 return false;
0374 }
0375
0376 return true;
0377 }
0378
0379
0380 static acpi_status acpi_gpiochip_alloc_event(struct acpi_resource *ares,
0381 void *context)
0382 {
0383 struct acpi_gpio_chip *acpi_gpio = context;
0384 struct gpio_chip *chip = acpi_gpio->chip;
0385 struct acpi_resource_gpio *agpio;
0386 acpi_handle handle, evt_handle;
0387 struct acpi_gpio_event *event;
0388 irq_handler_t handler = NULL;
0389 struct gpio_desc *desc;
0390 unsigned int pin;
0391 int ret, irq;
0392
0393 if (!acpi_gpio_get_irq_resource(ares, &agpio))
0394 return AE_OK;
0395
0396 handle = ACPI_HANDLE(chip->parent);
0397 pin = agpio->pin_table[0];
0398
0399 if (pin <= 255) {
0400 char ev_name[8];
0401 sprintf(ev_name, "_%c%02X",
0402 agpio->triggering == ACPI_EDGE_SENSITIVE ? 'E' : 'L',
0403 pin);
0404 if (ACPI_SUCCESS(acpi_get_handle(handle, ev_name, &evt_handle)))
0405 handler = acpi_gpio_irq_handler;
0406 }
0407 if (!handler) {
0408 if (ACPI_SUCCESS(acpi_get_handle(handle, "_EVT", &evt_handle)))
0409 handler = acpi_gpio_irq_handler_evt;
0410 }
0411 if (!handler)
0412 return AE_OK;
0413
0414 desc = acpi_request_own_gpiod(chip, agpio, 0, "ACPI:Event");
0415 if (IS_ERR(desc)) {
0416 dev_err(chip->parent,
0417 "Failed to request GPIO for pin 0x%04X, err %ld\n",
0418 pin, PTR_ERR(desc));
0419 return AE_OK;
0420 }
0421
0422 ret = gpiochip_lock_as_irq(chip, pin);
0423 if (ret) {
0424 dev_err(chip->parent,
0425 "Failed to lock GPIO pin 0x%04X as interrupt, err %d\n",
0426 pin, ret);
0427 goto fail_free_desc;
0428 }
0429
0430 irq = gpiod_to_irq(desc);
0431 if (irq < 0) {
0432 dev_err(chip->parent,
0433 "Failed to translate GPIO pin 0x%04X to IRQ, err %d\n",
0434 pin, irq);
0435 goto fail_unlock_irq;
0436 }
0437
0438 if (acpi_gpio_in_ignore_list(ignore_interrupt, dev_name(chip->parent), pin)) {
0439 dev_info(chip->parent, "Ignoring interrupt on pin %u\n", pin);
0440 return AE_OK;
0441 }
0442
0443 event = kzalloc(sizeof(*event), GFP_KERNEL);
0444 if (!event)
0445 goto fail_unlock_irq;
0446
0447 event->irqflags = IRQF_ONESHOT;
0448 if (agpio->triggering == ACPI_LEVEL_SENSITIVE) {
0449 if (agpio->polarity == ACPI_ACTIVE_HIGH)
0450 event->irqflags |= IRQF_TRIGGER_HIGH;
0451 else
0452 event->irqflags |= IRQF_TRIGGER_LOW;
0453 } else {
0454 switch (agpio->polarity) {
0455 case ACPI_ACTIVE_HIGH:
0456 event->irqflags |= IRQF_TRIGGER_RISING;
0457 break;
0458 case ACPI_ACTIVE_LOW:
0459 event->irqflags |= IRQF_TRIGGER_FALLING;
0460 break;
0461 default:
0462 event->irqflags |= IRQF_TRIGGER_RISING |
0463 IRQF_TRIGGER_FALLING;
0464 break;
0465 }
0466 }
0467
0468 event->handle = evt_handle;
0469 event->handler = handler;
0470 event->irq = irq;
0471 event->irq_is_wake = acpi_gpio_irq_is_wake(chip->parent, agpio);
0472 event->pin = pin;
0473 event->desc = desc;
0474
0475 list_add_tail(&event->node, &acpi_gpio->events);
0476
0477 return AE_OK;
0478
0479 fail_unlock_irq:
0480 gpiochip_unlock_as_irq(chip, pin);
0481 fail_free_desc:
0482 gpiochip_free_own_desc(desc);
0483
0484 return AE_OK;
0485 }
0486
0487
0488
0489
0490
0491
0492
0493
0494
0495
0496
0497 void acpi_gpiochip_request_interrupts(struct gpio_chip *chip)
0498 {
0499 struct acpi_gpio_chip *acpi_gpio;
0500 acpi_handle handle;
0501 acpi_status status;
0502 bool defer;
0503
0504 if (!chip->parent || !chip->to_irq)
0505 return;
0506
0507 handle = ACPI_HANDLE(chip->parent);
0508 if (!handle)
0509 return;
0510
0511 status = acpi_get_data(handle, acpi_gpio_chip_dh, (void **)&acpi_gpio);
0512 if (ACPI_FAILURE(status))
0513 return;
0514
0515 acpi_walk_resources(handle, "_AEI",
0516 acpi_gpiochip_alloc_event, acpi_gpio);
0517
0518 mutex_lock(&acpi_gpio_deferred_req_irqs_lock);
0519 defer = !acpi_gpio_deferred_req_irqs_done;
0520 if (defer)
0521 list_add(&acpi_gpio->deferred_req_irqs_list_entry,
0522 &acpi_gpio_deferred_req_irqs_list);
0523 mutex_unlock(&acpi_gpio_deferred_req_irqs_lock);
0524
0525 if (defer)
0526 return;
0527
0528 acpi_gpiochip_request_irqs(acpi_gpio);
0529 }
0530 EXPORT_SYMBOL_GPL(acpi_gpiochip_request_interrupts);
0531
0532
0533
0534
0535
0536
0537
0538
0539 void acpi_gpiochip_free_interrupts(struct gpio_chip *chip)
0540 {
0541 struct acpi_gpio_chip *acpi_gpio;
0542 struct acpi_gpio_event *event, *ep;
0543 acpi_handle handle;
0544 acpi_status status;
0545
0546 if (!chip->parent || !chip->to_irq)
0547 return;
0548
0549 handle = ACPI_HANDLE(chip->parent);
0550 if (!handle)
0551 return;
0552
0553 status = acpi_get_data(handle, acpi_gpio_chip_dh, (void **)&acpi_gpio);
0554 if (ACPI_FAILURE(status))
0555 return;
0556
0557 mutex_lock(&acpi_gpio_deferred_req_irqs_lock);
0558 if (!list_empty(&acpi_gpio->deferred_req_irqs_list_entry))
0559 list_del_init(&acpi_gpio->deferred_req_irqs_list_entry);
0560 mutex_unlock(&acpi_gpio_deferred_req_irqs_lock);
0561
0562 list_for_each_entry_safe_reverse(event, ep, &acpi_gpio->events, node) {
0563 if (event->irq_requested) {
0564 if (event->irq_is_wake)
0565 disable_irq_wake(event->irq);
0566
0567 free_irq(event->irq, event);
0568 }
0569
0570 gpiochip_unlock_as_irq(chip, event->pin);
0571 gpiochip_free_own_desc(event->desc);
0572 list_del(&event->node);
0573 kfree(event);
0574 }
0575 }
0576 EXPORT_SYMBOL_GPL(acpi_gpiochip_free_interrupts);
0577
0578 int acpi_dev_add_driver_gpios(struct acpi_device *adev,
0579 const struct acpi_gpio_mapping *gpios)
0580 {
0581 if (adev && gpios) {
0582 adev->driver_gpios = gpios;
0583 return 0;
0584 }
0585 return -EINVAL;
0586 }
0587 EXPORT_SYMBOL_GPL(acpi_dev_add_driver_gpios);
0588
0589 void acpi_dev_remove_driver_gpios(struct acpi_device *adev)
0590 {
0591 if (adev)
0592 adev->driver_gpios = NULL;
0593 }
0594 EXPORT_SYMBOL_GPL(acpi_dev_remove_driver_gpios);
0595
0596 static void acpi_dev_release_driver_gpios(void *adev)
0597 {
0598 acpi_dev_remove_driver_gpios(adev);
0599 }
0600
0601 int devm_acpi_dev_add_driver_gpios(struct device *dev,
0602 const struct acpi_gpio_mapping *gpios)
0603 {
0604 struct acpi_device *adev = ACPI_COMPANION(dev);
0605 int ret;
0606
0607 ret = acpi_dev_add_driver_gpios(adev, gpios);
0608 if (ret)
0609 return ret;
0610
0611 return devm_add_action_or_reset(dev, acpi_dev_release_driver_gpios, adev);
0612 }
0613 EXPORT_SYMBOL_GPL(devm_acpi_dev_add_driver_gpios);
0614
0615 static bool acpi_get_driver_gpio_data(struct acpi_device *adev,
0616 const char *name, int index,
0617 struct fwnode_reference_args *args,
0618 unsigned int *quirks)
0619 {
0620 const struct acpi_gpio_mapping *gm;
0621
0622 if (!adev->driver_gpios)
0623 return false;
0624
0625 for (gm = adev->driver_gpios; gm->name; gm++)
0626 if (!strcmp(name, gm->name) && gm->data && index < gm->size) {
0627 const struct acpi_gpio_params *par = gm->data + index;
0628
0629 args->fwnode = acpi_fwnode_handle(adev);
0630 args->args[0] = par->crs_entry_index;
0631 args->args[1] = par->line_index;
0632 args->args[2] = par->active_low;
0633 args->nargs = 3;
0634
0635 *quirks = gm->quirks;
0636 return true;
0637 }
0638
0639 return false;
0640 }
0641
0642 static int
0643 __acpi_gpio_update_gpiod_flags(enum gpiod_flags *flags, enum gpiod_flags update)
0644 {
0645 const enum gpiod_flags mask =
0646 GPIOD_FLAGS_BIT_DIR_SET | GPIOD_FLAGS_BIT_DIR_OUT |
0647 GPIOD_FLAGS_BIT_DIR_VAL;
0648 int ret = 0;
0649
0650
0651
0652
0653
0654
0655 if (update & GPIOD_FLAGS_BIT_DIR_SET) {
0656 enum gpiod_flags diff = *flags ^ update;
0657
0658
0659
0660
0661
0662
0663
0664
0665 if (((*flags & GPIOD_FLAGS_BIT_DIR_SET) && (diff & GPIOD_FLAGS_BIT_DIR_OUT)) ||
0666 ((*flags & GPIOD_FLAGS_BIT_DIR_OUT) && (diff & GPIOD_FLAGS_BIT_DIR_VAL)))
0667 ret = -EINVAL;
0668 *flags = (*flags & ~mask) | (update & mask);
0669 }
0670 return ret;
0671 }
0672
0673 int
0674 acpi_gpio_update_gpiod_flags(enum gpiod_flags *flags, struct acpi_gpio_info *info)
0675 {
0676 struct device *dev = &info->adev->dev;
0677 enum gpiod_flags old = *flags;
0678 int ret;
0679
0680 ret = __acpi_gpio_update_gpiod_flags(&old, info->flags);
0681 if (info->quirks & ACPI_GPIO_QUIRK_NO_IO_RESTRICTION) {
0682 if (ret)
0683 dev_warn(dev, FW_BUG "GPIO not in correct mode, fixing\n");
0684 } else {
0685 if (ret)
0686 dev_dbg(dev, "Override GPIO initialization flags\n");
0687 *flags = old;
0688 }
0689
0690 return ret;
0691 }
0692
0693 int acpi_gpio_update_gpiod_lookup_flags(unsigned long *lookupflags,
0694 struct acpi_gpio_info *info)
0695 {
0696 switch (info->pin_config) {
0697 case ACPI_PIN_CONFIG_PULLUP:
0698 *lookupflags |= GPIO_PULL_UP;
0699 break;
0700 case ACPI_PIN_CONFIG_PULLDOWN:
0701 *lookupflags |= GPIO_PULL_DOWN;
0702 break;
0703 case ACPI_PIN_CONFIG_NOPULL:
0704 *lookupflags |= GPIO_PULL_DISABLE;
0705 break;
0706 default:
0707 break;
0708 }
0709
0710 if (info->polarity == GPIO_ACTIVE_LOW)
0711 *lookupflags |= GPIO_ACTIVE_LOW;
0712
0713 return 0;
0714 }
0715
0716 struct acpi_gpio_lookup {
0717 struct acpi_gpio_info info;
0718 int index;
0719 u16 pin_index;
0720 bool active_low;
0721 struct gpio_desc *desc;
0722 int n;
0723 };
0724
0725 static int acpi_populate_gpio_lookup(struct acpi_resource *ares, void *data)
0726 {
0727 struct acpi_gpio_lookup *lookup = data;
0728
0729 if (ares->type != ACPI_RESOURCE_TYPE_GPIO)
0730 return 1;
0731
0732 if (!lookup->desc) {
0733 const struct acpi_resource_gpio *agpio = &ares->data.gpio;
0734 bool gpioint = agpio->connection_type == ACPI_RESOURCE_GPIO_TYPE_INT;
0735 struct gpio_desc *desc;
0736 u16 pin_index;
0737
0738 if (lookup->info.quirks & ACPI_GPIO_QUIRK_ONLY_GPIOIO && gpioint)
0739 lookup->index++;
0740
0741 if (lookup->n++ != lookup->index)
0742 return 1;
0743
0744 pin_index = lookup->pin_index;
0745 if (pin_index >= agpio->pin_table_length)
0746 return 1;
0747
0748 if (lookup->info.quirks & ACPI_GPIO_QUIRK_ABSOLUTE_NUMBER)
0749 desc = gpio_to_desc(agpio->pin_table[pin_index]);
0750 else
0751 desc = acpi_get_gpiod(agpio->resource_source.string_ptr,
0752 agpio->pin_table[pin_index]);
0753 lookup->desc = desc;
0754 lookup->info.pin_config = agpio->pin_config;
0755 lookup->info.debounce = agpio->debounce_timeout;
0756 lookup->info.gpioint = gpioint;
0757
0758
0759
0760
0761
0762
0763
0764
0765 if (lookup->info.gpioint) {
0766 lookup->info.polarity = agpio->polarity;
0767 lookup->info.triggering = agpio->triggering;
0768 } else {
0769 lookup->info.polarity = lookup->active_low;
0770 }
0771
0772 lookup->info.flags = acpi_gpio_to_gpiod_flags(agpio, lookup->info.polarity);
0773 }
0774
0775 return 1;
0776 }
0777
0778 static int acpi_gpio_resource_lookup(struct acpi_gpio_lookup *lookup,
0779 struct acpi_gpio_info *info)
0780 {
0781 struct acpi_device *adev = lookup->info.adev;
0782 struct list_head res_list;
0783 int ret;
0784
0785 INIT_LIST_HEAD(&res_list);
0786
0787 ret = acpi_dev_get_resources(adev, &res_list,
0788 acpi_populate_gpio_lookup,
0789 lookup);
0790 if (ret < 0)
0791 return ret;
0792
0793 acpi_dev_free_resource_list(&res_list);
0794
0795 if (!lookup->desc)
0796 return -ENOENT;
0797
0798 if (info)
0799 *info = lookup->info;
0800 return 0;
0801 }
0802
0803 static int acpi_gpio_property_lookup(struct fwnode_handle *fwnode,
0804 const char *propname, int index,
0805 struct acpi_gpio_lookup *lookup)
0806 {
0807 struct fwnode_reference_args args;
0808 unsigned int quirks = 0;
0809 int ret;
0810
0811 memset(&args, 0, sizeof(args));
0812 ret = __acpi_node_get_property_reference(fwnode, propname, index, 3,
0813 &args);
0814 if (ret) {
0815 struct acpi_device *adev = to_acpi_device_node(fwnode);
0816
0817 if (!adev)
0818 return ret;
0819
0820 if (!acpi_get_driver_gpio_data(adev, propname, index, &args,
0821 &quirks))
0822 return ret;
0823 }
0824
0825
0826
0827
0828 if (!to_acpi_device_node(args.fwnode))
0829 return -EINVAL;
0830 if (args.nargs != 3)
0831 return -EPROTO;
0832
0833 lookup->index = args.args[0];
0834 lookup->pin_index = args.args[1];
0835 lookup->active_low = !!args.args[2];
0836
0837 lookup->info.adev = to_acpi_device_node(args.fwnode);
0838 lookup->info.quirks = quirks;
0839
0840 return 0;
0841 }
0842
0843
0844
0845
0846
0847
0848
0849
0850
0851
0852
0853
0854
0855
0856
0857
0858
0859
0860
0861
0862
0863
0864
0865 static struct gpio_desc *acpi_get_gpiod_by_index(struct acpi_device *adev,
0866 const char *propname, int index,
0867 struct acpi_gpio_info *info)
0868 {
0869 struct acpi_gpio_lookup lookup;
0870 int ret;
0871
0872 if (!adev)
0873 return ERR_PTR(-ENODEV);
0874
0875 memset(&lookup, 0, sizeof(lookup));
0876 lookup.index = index;
0877
0878 if (propname) {
0879 dev_dbg(&adev->dev, "GPIO: looking up %s\n", propname);
0880
0881 ret = acpi_gpio_property_lookup(acpi_fwnode_handle(adev),
0882 propname, index, &lookup);
0883 if (ret)
0884 return ERR_PTR(ret);
0885
0886 dev_dbg(&adev->dev, "GPIO: _DSD returned %s %d %u %u\n",
0887 dev_name(&lookup.info.adev->dev), lookup.index,
0888 lookup.pin_index, lookup.active_low);
0889 } else {
0890 dev_dbg(&adev->dev, "GPIO: looking up %d in _CRS\n", index);
0891 lookup.info.adev = adev;
0892 }
0893
0894 ret = acpi_gpio_resource_lookup(&lookup, info);
0895 return ret ? ERR_PTR(ret) : lookup.desc;
0896 }
0897
0898 static bool acpi_can_fallback_to_crs(struct acpi_device *adev,
0899 const char *con_id)
0900 {
0901
0902 if (acpi_dev_has_props(adev) || adev->driver_gpios)
0903 return false;
0904
0905 return con_id == NULL;
0906 }
0907
0908 struct gpio_desc *acpi_find_gpio(struct device *dev,
0909 const char *con_id,
0910 unsigned int idx,
0911 enum gpiod_flags *dflags,
0912 unsigned long *lookupflags)
0913 {
0914 struct acpi_device *adev = ACPI_COMPANION(dev);
0915 struct acpi_gpio_info info;
0916 struct gpio_desc *desc;
0917 char propname[32];
0918 int i;
0919
0920
0921 for (i = 0; i < ARRAY_SIZE(gpio_suffixes); i++) {
0922 if (con_id) {
0923 snprintf(propname, sizeof(propname), "%s-%s",
0924 con_id, gpio_suffixes[i]);
0925 } else {
0926 snprintf(propname, sizeof(propname), "%s",
0927 gpio_suffixes[i]);
0928 }
0929
0930 desc = acpi_get_gpiod_by_index(adev, propname, idx, &info);
0931 if (!IS_ERR(desc))
0932 break;
0933 if (PTR_ERR(desc) == -EPROBE_DEFER)
0934 return ERR_CAST(desc);
0935 }
0936
0937
0938 if (IS_ERR(desc)) {
0939 if (!acpi_can_fallback_to_crs(adev, con_id))
0940 return ERR_PTR(-ENOENT);
0941
0942 desc = acpi_get_gpiod_by_index(adev, NULL, idx, &info);
0943 if (IS_ERR(desc))
0944 return desc;
0945 }
0946
0947 if (info.gpioint &&
0948 (*dflags == GPIOD_OUT_LOW || *dflags == GPIOD_OUT_HIGH)) {
0949 dev_dbg(&adev->dev, "refusing GpioInt() entry when doing GPIOD_OUT_* lookup\n");
0950 return ERR_PTR(-ENOENT);
0951 }
0952
0953 acpi_gpio_update_gpiod_flags(dflags, &info);
0954 acpi_gpio_update_gpiod_lookup_flags(lookupflags, &info);
0955 return desc;
0956 }
0957
0958
0959
0960
0961
0962
0963
0964
0965
0966
0967
0968
0969
0970
0971
0972
0973 struct gpio_desc *acpi_node_get_gpiod(struct fwnode_handle *fwnode,
0974 const char *propname, int index,
0975 struct acpi_gpio_info *info)
0976 {
0977 struct acpi_gpio_lookup lookup;
0978 struct acpi_device *adev;
0979 int ret;
0980
0981 adev = to_acpi_device_node(fwnode);
0982 if (adev)
0983 return acpi_get_gpiod_by_index(adev, propname, index, info);
0984
0985 if (!is_acpi_data_node(fwnode))
0986 return ERR_PTR(-ENODEV);
0987
0988 if (!propname)
0989 return ERR_PTR(-EINVAL);
0990
0991 memset(&lookup, 0, sizeof(lookup));
0992 lookup.index = index;
0993
0994 ret = acpi_gpio_property_lookup(fwnode, propname, index, &lookup);
0995 if (ret)
0996 return ERR_PTR(ret);
0997
0998 ret = acpi_gpio_resource_lookup(&lookup, info);
0999 return ret ? ERR_PTR(ret) : lookup.desc;
1000 }
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020 int acpi_dev_gpio_irq_get_by(struct acpi_device *adev, const char *name, int index)
1021 {
1022 int idx, i;
1023 unsigned int irq_flags;
1024 int ret;
1025
1026 for (i = 0, idx = 0; idx <= index; i++) {
1027 struct acpi_gpio_info info;
1028 struct gpio_desc *desc;
1029
1030 desc = acpi_get_gpiod_by_index(adev, name, i, &info);
1031
1032
1033 if (IS_ERR(desc) && PTR_ERR(desc) != -EPROBE_DEFER)
1034 return PTR_ERR(desc);
1035
1036 if (info.gpioint && idx++ == index) {
1037 unsigned long lflags = GPIO_LOOKUP_FLAGS_DEFAULT;
1038 enum gpiod_flags dflags = GPIOD_ASIS;
1039 char label[32];
1040 int irq;
1041
1042 if (IS_ERR(desc))
1043 return PTR_ERR(desc);
1044
1045 irq = gpiod_to_irq(desc);
1046 if (irq < 0)
1047 return irq;
1048
1049 acpi_gpio_update_gpiod_flags(&dflags, &info);
1050 acpi_gpio_update_gpiod_lookup_flags(&lflags, &info);
1051
1052 snprintf(label, sizeof(label), "GpioInt() %d", index);
1053 ret = gpiod_configure_flags(desc, label, lflags, dflags);
1054 if (ret < 0)
1055 return ret;
1056
1057
1058 ret = gpio_set_debounce_timeout(desc, info.debounce * 10);
1059 if (ret)
1060 return ret;
1061
1062 irq_flags = acpi_dev_get_irq_type(info.triggering,
1063 info.polarity);
1064
1065
1066
1067
1068
1069 if (can_request_irq(irq, irq_flags)) {
1070 if (irq_flags != IRQ_TYPE_NONE &&
1071 irq_flags != irq_get_trigger_type(irq))
1072 irq_set_irq_type(irq, irq_flags);
1073 } else {
1074 dev_dbg(&adev->dev, "IRQ %d already in use\n", irq);
1075 }
1076
1077 return irq;
1078 }
1079
1080 }
1081 return -ENOENT;
1082 }
1083 EXPORT_SYMBOL_GPL(acpi_dev_gpio_irq_get_by);
1084
1085 static acpi_status
1086 acpi_gpio_adr_space_handler(u32 function, acpi_physical_address address,
1087 u32 bits, u64 *value, void *handler_context,
1088 void *region_context)
1089 {
1090 struct acpi_gpio_chip *achip = region_context;
1091 struct gpio_chip *chip = achip->chip;
1092 struct acpi_resource_gpio *agpio;
1093 struct acpi_resource *ares;
1094 u16 pin_index = address;
1095 acpi_status status;
1096 int length;
1097 int i;
1098
1099 status = acpi_buffer_to_resource(achip->conn_info.connection,
1100 achip->conn_info.length, &ares);
1101 if (ACPI_FAILURE(status))
1102 return status;
1103
1104 if (WARN_ON(ares->type != ACPI_RESOURCE_TYPE_GPIO)) {
1105 ACPI_FREE(ares);
1106 return AE_BAD_PARAMETER;
1107 }
1108
1109 agpio = &ares->data.gpio;
1110
1111 if (WARN_ON(agpio->io_restriction == ACPI_IO_RESTRICT_INPUT &&
1112 function == ACPI_WRITE)) {
1113 ACPI_FREE(ares);
1114 return AE_BAD_PARAMETER;
1115 }
1116
1117 length = min_t(u16, agpio->pin_table_length, pin_index + bits);
1118 for (i = pin_index; i < length; ++i) {
1119 unsigned int pin = agpio->pin_table[i];
1120 struct acpi_gpio_connection *conn;
1121 struct gpio_desc *desc;
1122 bool found;
1123
1124 mutex_lock(&achip->conn_lock);
1125
1126 found = false;
1127 list_for_each_entry(conn, &achip->conns, node) {
1128 if (conn->pin == pin) {
1129 found = true;
1130 desc = conn->desc;
1131 break;
1132 }
1133 }
1134
1135
1136
1137
1138
1139
1140 if (!found && agpio->shareable == ACPI_SHARED &&
1141 function == ACPI_READ) {
1142 struct acpi_gpio_event *event;
1143
1144 list_for_each_entry(event, &achip->events, node) {
1145 if (event->pin == pin) {
1146 desc = event->desc;
1147 found = true;
1148 break;
1149 }
1150 }
1151 }
1152
1153 if (!found) {
1154 desc = acpi_request_own_gpiod(chip, agpio, i, "ACPI:OpRegion");
1155 if (IS_ERR(desc)) {
1156 mutex_unlock(&achip->conn_lock);
1157 status = AE_ERROR;
1158 goto out;
1159 }
1160
1161 conn = kzalloc(sizeof(*conn), GFP_KERNEL);
1162 if (!conn) {
1163 gpiochip_free_own_desc(desc);
1164 mutex_unlock(&achip->conn_lock);
1165 status = AE_NO_MEMORY;
1166 goto out;
1167 }
1168
1169 conn->pin = pin;
1170 conn->desc = desc;
1171 list_add_tail(&conn->node, &achip->conns);
1172 }
1173
1174 mutex_unlock(&achip->conn_lock);
1175
1176 if (function == ACPI_WRITE)
1177 gpiod_set_raw_value_cansleep(desc, !!(*value & BIT(i)));
1178 else
1179 *value |= (u64)gpiod_get_raw_value_cansleep(desc) << i;
1180 }
1181
1182 out:
1183 ACPI_FREE(ares);
1184 return status;
1185 }
1186
1187 static void acpi_gpiochip_request_regions(struct acpi_gpio_chip *achip)
1188 {
1189 struct gpio_chip *chip = achip->chip;
1190 acpi_handle handle = ACPI_HANDLE(chip->parent);
1191 acpi_status status;
1192
1193 INIT_LIST_HEAD(&achip->conns);
1194 mutex_init(&achip->conn_lock);
1195 status = acpi_install_address_space_handler(handle, ACPI_ADR_SPACE_GPIO,
1196 acpi_gpio_adr_space_handler,
1197 NULL, achip);
1198 if (ACPI_FAILURE(status))
1199 dev_err(chip->parent,
1200 "Failed to install GPIO OpRegion handler\n");
1201 }
1202
1203 static void acpi_gpiochip_free_regions(struct acpi_gpio_chip *achip)
1204 {
1205 struct gpio_chip *chip = achip->chip;
1206 acpi_handle handle = ACPI_HANDLE(chip->parent);
1207 struct acpi_gpio_connection *conn, *tmp;
1208 acpi_status status;
1209
1210 status = acpi_remove_address_space_handler(handle, ACPI_ADR_SPACE_GPIO,
1211 acpi_gpio_adr_space_handler);
1212 if (ACPI_FAILURE(status)) {
1213 dev_err(chip->parent,
1214 "Failed to remove GPIO OpRegion handler\n");
1215 return;
1216 }
1217
1218 list_for_each_entry_safe_reverse(conn, tmp, &achip->conns, node) {
1219 gpiochip_free_own_desc(conn->desc);
1220 list_del(&conn->node);
1221 kfree(conn);
1222 }
1223 }
1224
1225 static struct gpio_desc *
1226 acpi_gpiochip_parse_own_gpio(struct acpi_gpio_chip *achip,
1227 struct fwnode_handle *fwnode,
1228 const char **name,
1229 unsigned long *lflags,
1230 enum gpiod_flags *dflags)
1231 {
1232 struct gpio_chip *chip = achip->chip;
1233 struct gpio_desc *desc;
1234 u32 gpios[2];
1235 int ret;
1236
1237 *lflags = GPIO_LOOKUP_FLAGS_DEFAULT;
1238 *dflags = GPIOD_ASIS;
1239 *name = NULL;
1240
1241 ret = fwnode_property_read_u32_array(fwnode, "gpios", gpios,
1242 ARRAY_SIZE(gpios));
1243 if (ret < 0)
1244 return ERR_PTR(ret);
1245
1246 desc = gpiochip_get_desc(chip, gpios[0]);
1247 if (IS_ERR(desc))
1248 return desc;
1249
1250 if (gpios[1])
1251 *lflags |= GPIO_ACTIVE_LOW;
1252
1253 if (fwnode_property_present(fwnode, "input"))
1254 *dflags |= GPIOD_IN;
1255 else if (fwnode_property_present(fwnode, "output-low"))
1256 *dflags |= GPIOD_OUT_LOW;
1257 else if (fwnode_property_present(fwnode, "output-high"))
1258 *dflags |= GPIOD_OUT_HIGH;
1259 else
1260 return ERR_PTR(-EINVAL);
1261
1262 fwnode_property_read_string(fwnode, "line-name", name);
1263
1264 return desc;
1265 }
1266
1267 static void acpi_gpiochip_scan_gpios(struct acpi_gpio_chip *achip)
1268 {
1269 struct gpio_chip *chip = achip->chip;
1270 struct fwnode_handle *fwnode;
1271
1272 device_for_each_child_node(chip->parent, fwnode) {
1273 unsigned long lflags;
1274 enum gpiod_flags dflags;
1275 struct gpio_desc *desc;
1276 const char *name;
1277 int ret;
1278
1279 if (!fwnode_property_present(fwnode, "gpio-hog"))
1280 continue;
1281
1282 desc = acpi_gpiochip_parse_own_gpio(achip, fwnode, &name,
1283 &lflags, &dflags);
1284 if (IS_ERR(desc))
1285 continue;
1286
1287 ret = gpiod_hog(desc, name, lflags, dflags);
1288 if (ret) {
1289 dev_err(chip->parent, "Failed to hog GPIO\n");
1290 fwnode_handle_put(fwnode);
1291 return;
1292 }
1293 }
1294 }
1295
1296 void acpi_gpiochip_add(struct gpio_chip *chip)
1297 {
1298 struct acpi_gpio_chip *acpi_gpio;
1299 struct acpi_device *adev;
1300 acpi_status status;
1301
1302 if (!chip || !chip->parent)
1303 return;
1304
1305 adev = ACPI_COMPANION(chip->parent);
1306 if (!adev)
1307 return;
1308
1309 acpi_gpio = kzalloc(sizeof(*acpi_gpio), GFP_KERNEL);
1310 if (!acpi_gpio) {
1311 dev_err(chip->parent,
1312 "Failed to allocate memory for ACPI GPIO chip\n");
1313 return;
1314 }
1315
1316 acpi_gpio->chip = chip;
1317 INIT_LIST_HEAD(&acpi_gpio->events);
1318 INIT_LIST_HEAD(&acpi_gpio->deferred_req_irqs_list_entry);
1319
1320 status = acpi_attach_data(adev->handle, acpi_gpio_chip_dh, acpi_gpio);
1321 if (ACPI_FAILURE(status)) {
1322 dev_err(chip->parent, "Failed to attach ACPI GPIO chip\n");
1323 kfree(acpi_gpio);
1324 return;
1325 }
1326
1327 acpi_gpiochip_request_regions(acpi_gpio);
1328 acpi_gpiochip_scan_gpios(acpi_gpio);
1329 acpi_dev_clear_dependencies(adev);
1330 }
1331
1332 void acpi_gpiochip_remove(struct gpio_chip *chip)
1333 {
1334 struct acpi_gpio_chip *acpi_gpio;
1335 acpi_handle handle;
1336 acpi_status status;
1337
1338 if (!chip || !chip->parent)
1339 return;
1340
1341 handle = ACPI_HANDLE(chip->parent);
1342 if (!handle)
1343 return;
1344
1345 status = acpi_get_data(handle, acpi_gpio_chip_dh, (void **)&acpi_gpio);
1346 if (ACPI_FAILURE(status)) {
1347 dev_warn(chip->parent, "Failed to retrieve ACPI GPIO chip\n");
1348 return;
1349 }
1350
1351 acpi_gpiochip_free_regions(acpi_gpio);
1352
1353 acpi_detach_data(handle, acpi_gpio_chip_dh);
1354 kfree(acpi_gpio);
1355 }
1356
1357 void acpi_gpio_dev_init(struct gpio_chip *gc, struct gpio_device *gdev)
1358 {
1359
1360 if (gc->parent)
1361 ACPI_COMPANION_SET(&gdev->dev, ACPI_COMPANION(gc->parent));
1362
1363 if (gc->fwnode)
1364 device_set_node(&gdev->dev, gc->fwnode);
1365 }
1366
1367 static int acpi_gpio_package_count(const union acpi_object *obj)
1368 {
1369 const union acpi_object *element = obj->package.elements;
1370 const union acpi_object *end = element + obj->package.count;
1371 unsigned int count = 0;
1372
1373 while (element < end) {
1374 switch (element->type) {
1375 case ACPI_TYPE_LOCAL_REFERENCE:
1376 element += 3;
1377 fallthrough;
1378 case ACPI_TYPE_INTEGER:
1379 element++;
1380 count++;
1381 break;
1382
1383 default:
1384 return -EPROTO;
1385 }
1386 }
1387
1388 return count;
1389 }
1390
1391 static int acpi_find_gpio_count(struct acpi_resource *ares, void *data)
1392 {
1393 unsigned int *count = data;
1394
1395 if (ares->type == ACPI_RESOURCE_TYPE_GPIO)
1396 *count += ares->data.gpio.pin_table_length;
1397
1398 return 1;
1399 }
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410 int acpi_gpio_count(struct device *dev, const char *con_id)
1411 {
1412 struct acpi_device *adev = ACPI_COMPANION(dev);
1413 const union acpi_object *obj;
1414 const struct acpi_gpio_mapping *gm;
1415 int count = -ENOENT;
1416 int ret;
1417 char propname[32];
1418 unsigned int i;
1419
1420
1421 for (i = 0; i < ARRAY_SIZE(gpio_suffixes); i++) {
1422 if (con_id)
1423 snprintf(propname, sizeof(propname), "%s-%s",
1424 con_id, gpio_suffixes[i]);
1425 else
1426 snprintf(propname, sizeof(propname), "%s",
1427 gpio_suffixes[i]);
1428
1429 ret = acpi_dev_get_property(adev, propname, ACPI_TYPE_ANY,
1430 &obj);
1431 if (ret == 0) {
1432 if (obj->type == ACPI_TYPE_LOCAL_REFERENCE)
1433 count = 1;
1434 else if (obj->type == ACPI_TYPE_PACKAGE)
1435 count = acpi_gpio_package_count(obj);
1436 } else if (adev->driver_gpios) {
1437 for (gm = adev->driver_gpios; gm->name; gm++)
1438 if (strcmp(propname, gm->name) == 0) {
1439 count = gm->size;
1440 break;
1441 }
1442 }
1443 if (count > 0)
1444 break;
1445 }
1446
1447
1448 if (count < 0) {
1449 struct list_head resource_list;
1450 unsigned int crs_count = 0;
1451
1452 if (!acpi_can_fallback_to_crs(adev, con_id))
1453 return count;
1454
1455 INIT_LIST_HEAD(&resource_list);
1456 acpi_dev_get_resources(adev, &resource_list,
1457 acpi_find_gpio_count, &crs_count);
1458 acpi_dev_free_resource_list(&resource_list);
1459 if (crs_count > 0)
1460 count = crs_count;
1461 }
1462 return count ? count : -ENOENT;
1463 }
1464
1465
1466 static int __init acpi_gpio_handle_deferred_request_irqs(void)
1467 {
1468 struct acpi_gpio_chip *acpi_gpio, *tmp;
1469
1470 mutex_lock(&acpi_gpio_deferred_req_irqs_lock);
1471 list_for_each_entry_safe(acpi_gpio, tmp,
1472 &acpi_gpio_deferred_req_irqs_list,
1473 deferred_req_irqs_list_entry)
1474 acpi_gpiochip_request_irqs(acpi_gpio);
1475
1476 acpi_gpio_deferred_req_irqs_done = true;
1477 mutex_unlock(&acpi_gpio_deferred_req_irqs_lock);
1478
1479 return 0;
1480 }
1481
1482 late_initcall_sync(acpi_gpio_handle_deferred_request_irqs);
1483
1484 static const struct dmi_system_id gpiolib_acpi_quirks[] __initconst = {
1485 {
1486
1487
1488
1489
1490
1491 .matches = {
1492 DMI_MATCH(DMI_SYS_VENDOR, "MINIX"),
1493 DMI_MATCH(DMI_PRODUCT_NAME, "Z83-4"),
1494 },
1495 .driver_data = &(struct acpi_gpiolib_dmi_quirk) {
1496 .no_edge_events_on_boot = true,
1497 },
1498 },
1499 {
1500
1501
1502
1503
1504
1505
1506 .matches = {
1507 DMI_MATCH(DMI_SYS_VENDOR, "Wortmann_AG"),
1508 DMI_MATCH(DMI_PRODUCT_NAME, "TERRA_PAD_1061"),
1509 },
1510 .driver_data = &(struct acpi_gpiolib_dmi_quirk) {
1511 .no_edge_events_on_boot = true,
1512 },
1513 },
1514 {
1515
1516
1517
1518
1519
1520 .matches = {
1521 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
1522 DMI_MATCH(DMI_PRODUCT_NAME, "Venue 10 Pro 5055"),
1523 },
1524 .driver_data = &(struct acpi_gpiolib_dmi_quirk) {
1525 .ignore_wake = "INT33FC:02@12",
1526 },
1527 },
1528 {
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541 .matches = {
1542 DMI_MATCH(DMI_SYS_VENDOR, "HP"),
1543 DMI_MATCH(DMI_PRODUCT_NAME, "HP x2 Detachable 10-p0XX"),
1544 },
1545 .driver_data = &(struct acpi_gpiolib_dmi_quirk) {
1546 .ignore_wake = "INT33FF:01@0,INT0002:00@2",
1547 },
1548 },
1549 {
1550
1551
1552
1553
1554
1555 .matches = {
1556 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
1557 DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion x2 Detachable"),
1558 DMI_MATCH(DMI_BOARD_NAME, "815D"),
1559 },
1560 .driver_data = &(struct acpi_gpiolib_dmi_quirk) {
1561 .ignore_wake = "INT33FC:02@28",
1562 },
1563 },
1564 {
1565
1566
1567
1568
1569
1570 .matches = {
1571 DMI_MATCH(DMI_SYS_VENDOR, "HP"),
1572 DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion x2 Detachable"),
1573 DMI_MATCH(DMI_BOARD_NAME, "813E"),
1574 },
1575 .driver_data = &(struct acpi_gpiolib_dmi_quirk) {
1576 .ignore_wake = "INT33FF:01@0",
1577 },
1578 },
1579 {
1580
1581
1582
1583
1584
1585 .matches = {
1586 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
1587 DMI_MATCH(DMI_PRODUCT_NAME, "ZenBook UX325UAZ_UM325UAZ"),
1588 },
1589 .driver_data = &(struct acpi_gpiolib_dmi_quirk) {
1590 .ignore_interrupt = "AMDI0030:00@18",
1591 },
1592 },
1593 {}
1594 };
1595
1596 static int __init acpi_gpio_setup_params(void)
1597 {
1598 const struct acpi_gpiolib_dmi_quirk *quirk = NULL;
1599 const struct dmi_system_id *id;
1600
1601 id = dmi_first_match(gpiolib_acpi_quirks);
1602 if (id)
1603 quirk = id->driver_data;
1604
1605 if (run_edge_events_on_boot < 0) {
1606 if (quirk && quirk->no_edge_events_on_boot)
1607 run_edge_events_on_boot = 0;
1608 else
1609 run_edge_events_on_boot = 1;
1610 }
1611
1612 if (ignore_wake == NULL && quirk && quirk->ignore_wake)
1613 ignore_wake = quirk->ignore_wake;
1614
1615 if (ignore_interrupt == NULL && quirk && quirk->ignore_interrupt)
1616 ignore_interrupt = quirk->ignore_interrupt;
1617
1618 return 0;
1619 }
1620
1621
1622 postcore_initcall(acpi_gpio_setup_params);