linux/drivers/gpio/gpiolib-acpi.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * ACPI helpers for GPIO API
   4 *
   5 * Copyright (C) 2012, Intel Corporation
   6 * Authors: Mathias Nyman <mathias.nyman@linux.intel.com>
   7 *          Mika Westerberg <mika.westerberg@linux.intel.com>
   8 */
   9
  10#include <linux/dmi.h>
  11#include <linux/errno.h>
  12#include <linux/gpio/consumer.h>
  13#include <linux/gpio/driver.h>
  14#include <linux/gpio/machine.h>
  15#include <linux/export.h>
  16#include <linux/acpi.h>
  17#include <linux/interrupt.h>
  18#include <linux/mutex.h>
  19#include <linux/pinctrl/pinctrl.h>
  20
  21#include "gpiolib.h"
  22
  23static int run_edge_events_on_boot = -1;
  24module_param(run_edge_events_on_boot, int, 0444);
  25MODULE_PARM_DESC(run_edge_events_on_boot,
  26                 "Run edge _AEI event-handlers at boot: 0=no, 1=yes, -1=auto");
  27
  28/**
  29 * struct acpi_gpio_event - ACPI GPIO event handler data
  30 *
  31 * @node:         list-entry of the events list of the struct acpi_gpio_chip
  32 * @handle:       handle of ACPI method to execute when the IRQ triggers
  33 * @handler:      handler function to pass to request_irq() when requesting the IRQ
  34 * @pin:          GPIO pin number on the struct gpio_chip
  35 * @irq:          Linux IRQ number for the event, for request_irq() / free_irq()
  36 * @irqflags:     flags to pass to request_irq() when requesting the IRQ
  37 * @irq_is_wake:  If the ACPI flags indicate the IRQ is a wakeup source
  38 * @irq_requested:True if request_irq() has been done
  39 * @desc:         struct gpio_desc for the GPIO pin for this event
  40 */
  41struct acpi_gpio_event {
  42        struct list_head node;
  43        acpi_handle handle;
  44        irq_handler_t handler;
  45        unsigned int pin;
  46        unsigned int irq;
  47        unsigned long irqflags;
  48        bool irq_is_wake;
  49        bool irq_requested;
  50        struct gpio_desc *desc;
  51};
  52
  53struct acpi_gpio_connection {
  54        struct list_head node;
  55        unsigned int pin;
  56        struct gpio_desc *desc;
  57};
  58
  59struct acpi_gpio_chip {
  60        /*
  61         * ACPICA requires that the first field of the context parameter
  62         * passed to acpi_install_address_space_handler() is large enough
  63         * to hold struct acpi_connection_info.
  64         */
  65        struct acpi_connection_info conn_info;
  66        struct list_head conns;
  67        struct mutex conn_lock;
  68        struct gpio_chip *chip;
  69        struct list_head events;
  70        struct list_head deferred_req_irqs_list_entry;
  71};
  72
  73/*
  74 * For GPIO chips which call acpi_gpiochip_request_interrupts() before late_init
  75 * (so builtin drivers) we register the ACPI GpioInt IRQ handlers from a
  76 * late_initcall_sync() handler, so that other builtin drivers can register their
  77 * OpRegions before the event handlers can run. This list contains GPIO chips
  78 * for which the acpi_gpiochip_request_irqs() call has been deferred.
  79 */
  80static DEFINE_MUTEX(acpi_gpio_deferred_req_irqs_lock);
  81static LIST_HEAD(acpi_gpio_deferred_req_irqs_list);
  82static bool acpi_gpio_deferred_req_irqs_done;
  83
  84static int acpi_gpiochip_find(struct gpio_chip *gc, void *data)
  85{
  86        if (!gc->parent)
  87                return false;
  88
  89        return ACPI_HANDLE(gc->parent) == data;
  90}
  91
  92/**
  93 * acpi_get_gpiod() - Translate ACPI GPIO pin to GPIO descriptor usable with GPIO API
  94 * @path:       ACPI GPIO controller full path name, (e.g. "\\_SB.GPO1")
  95 * @pin:        ACPI GPIO pin number (0-based, controller-relative)
  96 *
  97 * Return: GPIO descriptor to use with Linux generic GPIO API, or ERR_PTR
  98 * error value. Specifically returns %-EPROBE_DEFER if the referenced GPIO
  99 * controller does not have GPIO chip registered at the moment. This is to
 100 * support probe deferral.
 101 */
 102static struct gpio_desc *acpi_get_gpiod(char *path, int pin)
 103{
 104        struct gpio_chip *chip;
 105        acpi_handle handle;
 106        acpi_status status;
 107
 108        status = acpi_get_handle(NULL, path, &handle);
 109        if (ACPI_FAILURE(status))
 110                return ERR_PTR(-ENODEV);
 111
 112        chip = gpiochip_find(handle, acpi_gpiochip_find);
 113        if (!chip)
 114                return ERR_PTR(-EPROBE_DEFER);
 115
 116        return gpiochip_get_desc(chip, pin);
 117}
 118
 119static irqreturn_t acpi_gpio_irq_handler(int irq, void *data)
 120{
 121        struct acpi_gpio_event *event = data;
 122
 123        acpi_evaluate_object(event->handle, NULL, NULL, NULL);
 124
 125        return IRQ_HANDLED;
 126}
 127
 128static irqreturn_t acpi_gpio_irq_handler_evt(int irq, void *data)
 129{
 130        struct acpi_gpio_event *event = data;
 131
 132        acpi_execute_simple_method(event->handle, NULL, event->pin);
 133
 134        return IRQ_HANDLED;
 135}
 136
 137static void acpi_gpio_chip_dh(acpi_handle handle, void *data)
 138{
 139        /* The address of this function is used as a key. */
 140}
 141
 142bool acpi_gpio_get_irq_resource(struct acpi_resource *ares,
 143                                struct acpi_resource_gpio **agpio)
 144{
 145        struct acpi_resource_gpio *gpio;
 146
 147        if (ares->type != ACPI_RESOURCE_TYPE_GPIO)
 148                return false;
 149
 150        gpio = &ares->data.gpio;
 151        if (gpio->connection_type != ACPI_RESOURCE_GPIO_TYPE_INT)
 152                return false;
 153
 154        *agpio = gpio;
 155        return true;
 156}
 157EXPORT_SYMBOL_GPL(acpi_gpio_get_irq_resource);
 158
 159static void acpi_gpiochip_request_irq(struct acpi_gpio_chip *acpi_gpio,
 160                                      struct acpi_gpio_event *event)
 161{
 162        int ret, value;
 163
 164        ret = request_threaded_irq(event->irq, NULL, event->handler,
 165                                   event->irqflags, "ACPI:Event", event);
 166        if (ret) {
 167                dev_err(acpi_gpio->chip->parent,
 168                        "Failed to setup interrupt handler for %d\n",
 169                        event->irq);
 170                return;
 171        }
 172
 173        if (event->irq_is_wake)
 174                enable_irq_wake(event->irq);
 175
 176        event->irq_requested = true;
 177
 178        /* Make sure we trigger the initial state of edge-triggered IRQs */
 179        if (run_edge_events_on_boot &&
 180            (event->irqflags & (IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING))) {
 181                value = gpiod_get_raw_value_cansleep(event->desc);
 182                if (((event->irqflags & IRQF_TRIGGER_RISING) && value == 1) ||
 183                    ((event->irqflags & IRQF_TRIGGER_FALLING) && value == 0))
 184                        event->handler(event->irq, event);
 185        }
 186}
 187
 188static void acpi_gpiochip_request_irqs(struct acpi_gpio_chip *acpi_gpio)
 189{
 190        struct acpi_gpio_event *event;
 191
 192        list_for_each_entry(event, &acpi_gpio->events, node)
 193                acpi_gpiochip_request_irq(acpi_gpio, event);
 194}
 195
 196static acpi_status acpi_gpiochip_alloc_event(struct acpi_resource *ares,
 197                                             void *context)
 198{
 199        struct acpi_gpio_chip *acpi_gpio = context;
 200        struct gpio_chip *chip = acpi_gpio->chip;
 201        struct acpi_resource_gpio *agpio;
 202        acpi_handle handle, evt_handle;
 203        struct acpi_gpio_event *event;
 204        irq_handler_t handler = NULL;
 205        struct gpio_desc *desc;
 206        int ret, pin, irq;
 207
 208        if (!acpi_gpio_get_irq_resource(ares, &agpio))
 209                return AE_OK;
 210
 211        handle = ACPI_HANDLE(chip->parent);
 212        pin = agpio->pin_table[0];
 213
 214        if (pin <= 255) {
 215                char ev_name[5];
 216                sprintf(ev_name, "_%c%02hhX",
 217                        agpio->triggering == ACPI_EDGE_SENSITIVE ? 'E' : 'L',
 218                        pin);
 219                if (ACPI_SUCCESS(acpi_get_handle(handle, ev_name, &evt_handle)))
 220                        handler = acpi_gpio_irq_handler;
 221        }
 222        if (!handler) {
 223                if (ACPI_SUCCESS(acpi_get_handle(handle, "_EVT", &evt_handle)))
 224                        handler = acpi_gpio_irq_handler_evt;
 225        }
 226        if (!handler)
 227                return AE_OK;
 228
 229        desc = gpiochip_request_own_desc(chip, pin, "ACPI:Event",
 230                                         GPIO_ACTIVE_HIGH, GPIOD_IN);
 231        if (IS_ERR(desc)) {
 232                dev_err(chip->parent, "Failed to request GPIO\n");
 233                return AE_ERROR;
 234        }
 235
 236        ret = gpiochip_lock_as_irq(chip, pin);
 237        if (ret) {
 238                dev_err(chip->parent, "Failed to lock GPIO as interrupt\n");
 239                goto fail_free_desc;
 240        }
 241
 242        irq = gpiod_to_irq(desc);
 243        if (irq < 0) {
 244                dev_err(chip->parent, "Failed to translate GPIO to IRQ\n");
 245                goto fail_unlock_irq;
 246        }
 247
 248        event = kzalloc(sizeof(*event), GFP_KERNEL);
 249        if (!event)
 250                goto fail_unlock_irq;
 251
 252        event->irqflags = IRQF_ONESHOT;
 253        if (agpio->triggering == ACPI_LEVEL_SENSITIVE) {
 254                if (agpio->polarity == ACPI_ACTIVE_HIGH)
 255                        event->irqflags |= IRQF_TRIGGER_HIGH;
 256                else
 257                        event->irqflags |= IRQF_TRIGGER_LOW;
 258        } else {
 259                switch (agpio->polarity) {
 260                case ACPI_ACTIVE_HIGH:
 261                        event->irqflags |= IRQF_TRIGGER_RISING;
 262                        break;
 263                case ACPI_ACTIVE_LOW:
 264                        event->irqflags |= IRQF_TRIGGER_FALLING;
 265                        break;
 266                default:
 267                        event->irqflags |= IRQF_TRIGGER_RISING |
 268                                           IRQF_TRIGGER_FALLING;
 269                        break;
 270                }
 271        }
 272
 273        event->handle = evt_handle;
 274        event->handler = handler;
 275        event->irq = irq;
 276        event->irq_is_wake = agpio->wake_capable == ACPI_WAKE_CAPABLE;
 277        event->pin = pin;
 278        event->desc = desc;
 279
 280        list_add_tail(&event->node, &acpi_gpio->events);
 281
 282        return AE_OK;
 283
 284fail_unlock_irq:
 285        gpiochip_unlock_as_irq(chip, pin);
 286fail_free_desc:
 287        gpiochip_free_own_desc(desc);
 288
 289        return AE_ERROR;
 290}
 291
 292/**
 293 * acpi_gpiochip_request_interrupts() - Register isr for gpio chip ACPI events
 294 * @chip:      GPIO chip
 295 *
 296 * ACPI5 platforms can use GPIO signaled ACPI events. These GPIO interrupts are
 297 * handled by ACPI event methods which need to be called from the GPIO
 298 * chip's interrupt handler. acpi_gpiochip_request_interrupts() finds out which
 299 * GPIO pins have ACPI event methods and assigns interrupt handlers that calls
 300 * the ACPI event methods for those pins.
 301 */
 302void acpi_gpiochip_request_interrupts(struct gpio_chip *chip)
 303{
 304        struct acpi_gpio_chip *acpi_gpio;
 305        acpi_handle handle;
 306        acpi_status status;
 307        bool defer;
 308
 309        if (!chip->parent || !chip->to_irq)
 310                return;
 311
 312        handle = ACPI_HANDLE(chip->parent);
 313        if (!handle)
 314                return;
 315
 316        status = acpi_get_data(handle, acpi_gpio_chip_dh, (void **)&acpi_gpio);
 317        if (ACPI_FAILURE(status))
 318                return;
 319
 320        acpi_walk_resources(handle, "_AEI",
 321                            acpi_gpiochip_alloc_event, acpi_gpio);
 322
 323        mutex_lock(&acpi_gpio_deferred_req_irqs_lock);
 324        defer = !acpi_gpio_deferred_req_irqs_done;
 325        if (defer)
 326                list_add(&acpi_gpio->deferred_req_irqs_list_entry,
 327                         &acpi_gpio_deferred_req_irqs_list);
 328        mutex_unlock(&acpi_gpio_deferred_req_irqs_lock);
 329
 330        if (defer)
 331                return;
 332
 333        acpi_gpiochip_request_irqs(acpi_gpio);
 334}
 335EXPORT_SYMBOL_GPL(acpi_gpiochip_request_interrupts);
 336
 337/**
 338 * acpi_gpiochip_free_interrupts() - Free GPIO ACPI event interrupts.
 339 * @chip:      GPIO chip
 340 *
 341 * Free interrupts associated with GPIO ACPI event method for the given
 342 * GPIO chip.
 343 */
 344void acpi_gpiochip_free_interrupts(struct gpio_chip *chip)
 345{
 346        struct acpi_gpio_chip *acpi_gpio;
 347        struct acpi_gpio_event *event, *ep;
 348        acpi_handle handle;
 349        acpi_status status;
 350
 351        if (!chip->parent || !chip->to_irq)
 352                return;
 353
 354        handle = ACPI_HANDLE(chip->parent);
 355        if (!handle)
 356                return;
 357
 358        status = acpi_get_data(handle, acpi_gpio_chip_dh, (void **)&acpi_gpio);
 359        if (ACPI_FAILURE(status))
 360                return;
 361
 362        mutex_lock(&acpi_gpio_deferred_req_irqs_lock);
 363        if (!list_empty(&acpi_gpio->deferred_req_irqs_list_entry))
 364                list_del_init(&acpi_gpio->deferred_req_irqs_list_entry);
 365        mutex_unlock(&acpi_gpio_deferred_req_irqs_lock);
 366
 367        list_for_each_entry_safe_reverse(event, ep, &acpi_gpio->events, node) {
 368                if (event->irq_requested) {
 369                        if (event->irq_is_wake)
 370                                disable_irq_wake(event->irq);
 371
 372                        free_irq(event->irq, event);
 373                }
 374
 375                gpiochip_unlock_as_irq(chip, event->pin);
 376                gpiochip_free_own_desc(event->desc);
 377                list_del(&event->node);
 378                kfree(event);
 379        }
 380}
 381EXPORT_SYMBOL_GPL(acpi_gpiochip_free_interrupts);
 382
 383int acpi_dev_add_driver_gpios(struct acpi_device *adev,
 384                              const struct acpi_gpio_mapping *gpios)
 385{
 386        if (adev && gpios) {
 387                adev->driver_gpios = gpios;
 388                return 0;
 389        }
 390        return -EINVAL;
 391}
 392EXPORT_SYMBOL_GPL(acpi_dev_add_driver_gpios);
 393
 394static void devm_acpi_dev_release_driver_gpios(struct device *dev, void *res)
 395{
 396        acpi_dev_remove_driver_gpios(ACPI_COMPANION(dev));
 397}
 398
 399int devm_acpi_dev_add_driver_gpios(struct device *dev,
 400                                   const struct acpi_gpio_mapping *gpios)
 401{
 402        void *res;
 403        int ret;
 404
 405        res = devres_alloc(devm_acpi_dev_release_driver_gpios, 0, GFP_KERNEL);
 406        if (!res)
 407                return -ENOMEM;
 408
 409        ret = acpi_dev_add_driver_gpios(ACPI_COMPANION(dev), gpios);
 410        if (ret) {
 411                devres_free(res);
 412                return ret;
 413        }
 414        devres_add(dev, res);
 415        return 0;
 416}
 417EXPORT_SYMBOL_GPL(devm_acpi_dev_add_driver_gpios);
 418
 419void devm_acpi_dev_remove_driver_gpios(struct device *dev)
 420{
 421        WARN_ON(devres_release(dev, devm_acpi_dev_release_driver_gpios, NULL, NULL));
 422}
 423EXPORT_SYMBOL_GPL(devm_acpi_dev_remove_driver_gpios);
 424
 425static bool acpi_get_driver_gpio_data(struct acpi_device *adev,
 426                                      const char *name, int index,
 427                                      struct fwnode_reference_args *args,
 428                                      unsigned int *quirks)
 429{
 430        const struct acpi_gpio_mapping *gm;
 431
 432        if (!adev->driver_gpios)
 433                return false;
 434
 435        for (gm = adev->driver_gpios; gm->name; gm++)
 436                if (!strcmp(name, gm->name) && gm->data && index < gm->size) {
 437                        const struct acpi_gpio_params *par = gm->data + index;
 438
 439                        args->fwnode = acpi_fwnode_handle(adev);
 440                        args->args[0] = par->crs_entry_index;
 441                        args->args[1] = par->line_index;
 442                        args->args[2] = par->active_low;
 443                        args->nargs = 3;
 444
 445                        *quirks = gm->quirks;
 446                        return true;
 447                }
 448
 449        return false;
 450}
 451
 452static enum gpiod_flags
 453acpi_gpio_to_gpiod_flags(const struct acpi_resource_gpio *agpio)
 454{
 455        switch (agpio->io_restriction) {
 456        case ACPI_IO_RESTRICT_INPUT:
 457                return GPIOD_IN;
 458        case ACPI_IO_RESTRICT_OUTPUT:
 459                /*
 460                 * ACPI GPIO resources don't contain an initial value for the
 461                 * GPIO. Therefore we deduce that value from the pull field
 462                 * instead. If the pin is pulled up we assume default to be
 463                 * high, if it is pulled down we assume default to be low,
 464                 * otherwise we leave pin untouched.
 465                 */
 466                switch (agpio->pin_config) {
 467                case ACPI_PIN_CONFIG_PULLUP:
 468                        return GPIOD_OUT_HIGH;
 469                case ACPI_PIN_CONFIG_PULLDOWN:
 470                        return GPIOD_OUT_LOW;
 471                default:
 472                        break;
 473                }
 474        default:
 475                break;
 476        }
 477
 478        /*
 479         * Assume that the BIOS has configured the direction and pull
 480         * accordingly.
 481         */
 482        return GPIOD_ASIS;
 483}
 484
 485static int
 486__acpi_gpio_update_gpiod_flags(enum gpiod_flags *flags, enum gpiod_flags update)
 487{
 488        const enum gpiod_flags mask =
 489                GPIOD_FLAGS_BIT_DIR_SET | GPIOD_FLAGS_BIT_DIR_OUT |
 490                GPIOD_FLAGS_BIT_DIR_VAL;
 491        int ret = 0;
 492
 493        /*
 494         * Check if the BIOS has IoRestriction with explicitly set direction
 495         * and update @flags accordingly. Otherwise use whatever caller asked
 496         * for.
 497         */
 498        if (update & GPIOD_FLAGS_BIT_DIR_SET) {
 499                enum gpiod_flags diff = *flags ^ update;
 500
 501                /*
 502                 * Check if caller supplied incompatible GPIO initialization
 503                 * flags.
 504                 *
 505                 * Return %-EINVAL to notify that firmware has different
 506                 * settings and we are going to use them.
 507                 */
 508                if (((*flags & GPIOD_FLAGS_BIT_DIR_SET) && (diff & GPIOD_FLAGS_BIT_DIR_OUT)) ||
 509                    ((*flags & GPIOD_FLAGS_BIT_DIR_OUT) && (diff & GPIOD_FLAGS_BIT_DIR_VAL)))
 510                        ret = -EINVAL;
 511                *flags = (*flags & ~mask) | (update & mask);
 512        }
 513        return ret;
 514}
 515
 516int
 517acpi_gpio_update_gpiod_flags(enum gpiod_flags *flags, struct acpi_gpio_info *info)
 518{
 519        struct device *dev = &info->adev->dev;
 520        enum gpiod_flags old = *flags;
 521        int ret;
 522
 523        ret = __acpi_gpio_update_gpiod_flags(&old, info->flags);
 524        if (info->quirks & ACPI_GPIO_QUIRK_NO_IO_RESTRICTION) {
 525                if (ret)
 526                        dev_warn(dev, FW_BUG "GPIO not in correct mode, fixing\n");
 527        } else {
 528                if (ret)
 529                        dev_dbg(dev, "Override GPIO initialization flags\n");
 530                *flags = old;
 531        }
 532
 533        return ret;
 534}
 535
 536int acpi_gpio_update_gpiod_lookup_flags(unsigned long *lookupflags,
 537                                        struct acpi_gpio_info *info)
 538{
 539        switch (info->pin_config) {
 540        case ACPI_PIN_CONFIG_PULLUP:
 541                *lookupflags |= GPIO_PULL_UP;
 542                break;
 543        case ACPI_PIN_CONFIG_PULLDOWN:
 544                *lookupflags |= GPIO_PULL_DOWN;
 545                break;
 546        default:
 547                break;
 548        }
 549
 550        if (info->polarity == GPIO_ACTIVE_LOW)
 551                *lookupflags |= GPIO_ACTIVE_LOW;
 552
 553        return 0;
 554}
 555
 556struct acpi_gpio_lookup {
 557        struct acpi_gpio_info info;
 558        int index;
 559        int pin_index;
 560        bool active_low;
 561        struct gpio_desc *desc;
 562        int n;
 563};
 564
 565static int acpi_populate_gpio_lookup(struct acpi_resource *ares, void *data)
 566{
 567        struct acpi_gpio_lookup *lookup = data;
 568
 569        if (ares->type != ACPI_RESOURCE_TYPE_GPIO)
 570                return 1;
 571
 572        if (!lookup->desc) {
 573                const struct acpi_resource_gpio *agpio = &ares->data.gpio;
 574                bool gpioint = agpio->connection_type == ACPI_RESOURCE_GPIO_TYPE_INT;
 575                int pin_index;
 576
 577                if (lookup->info.quirks & ACPI_GPIO_QUIRK_ONLY_GPIOIO && gpioint)
 578                        lookup->index++;
 579
 580                if (lookup->n++ != lookup->index)
 581                        return 1;
 582
 583                pin_index = lookup->pin_index;
 584                if (pin_index >= agpio->pin_table_length)
 585                        return 1;
 586
 587                lookup->desc = acpi_get_gpiod(agpio->resource_source.string_ptr,
 588                                              agpio->pin_table[pin_index]);
 589                lookup->info.pin_config = agpio->pin_config;
 590                lookup->info.gpioint = gpioint;
 591
 592                /*
 593                 * Polarity and triggering are only specified for GpioInt
 594                 * resource.
 595                 * Note: we expect here:
 596                 * - ACPI_ACTIVE_LOW == GPIO_ACTIVE_LOW
 597                 * - ACPI_ACTIVE_HIGH == GPIO_ACTIVE_HIGH
 598                 */
 599                if (lookup->info.gpioint) {
 600                        lookup->info.flags = GPIOD_IN;
 601                        lookup->info.polarity = agpio->polarity;
 602                        lookup->info.triggering = agpio->triggering;
 603                } else {
 604                        lookup->info.flags = acpi_gpio_to_gpiod_flags(agpio);
 605                        lookup->info.polarity = lookup->active_low;
 606                }
 607        }
 608
 609        return 1;
 610}
 611
 612static int acpi_gpio_resource_lookup(struct acpi_gpio_lookup *lookup,
 613                                     struct acpi_gpio_info *info)
 614{
 615        struct acpi_device *adev = lookup->info.adev;
 616        struct list_head res_list;
 617        int ret;
 618
 619        INIT_LIST_HEAD(&res_list);
 620
 621        ret = acpi_dev_get_resources(adev, &res_list,
 622                                     acpi_populate_gpio_lookup,
 623                                     lookup);
 624        if (ret < 0)
 625                return ret;
 626
 627        acpi_dev_free_resource_list(&res_list);
 628
 629        if (!lookup->desc)
 630                return -ENOENT;
 631
 632        if (info)
 633                *info = lookup->info;
 634        return 0;
 635}
 636
 637static int acpi_gpio_property_lookup(struct fwnode_handle *fwnode,
 638                                     const char *propname, int index,
 639                                     struct acpi_gpio_lookup *lookup)
 640{
 641        struct fwnode_reference_args args;
 642        unsigned int quirks = 0;
 643        int ret;
 644
 645        memset(&args, 0, sizeof(args));
 646        ret = __acpi_node_get_property_reference(fwnode, propname, index, 3,
 647                                                 &args);
 648        if (ret) {
 649                struct acpi_device *adev = to_acpi_device_node(fwnode);
 650
 651                if (!adev)
 652                        return ret;
 653
 654                if (!acpi_get_driver_gpio_data(adev, propname, index, &args,
 655                                               &quirks))
 656                        return ret;
 657        }
 658        /*
 659         * The property was found and resolved, so need to lookup the GPIO based
 660         * on returned args.
 661         */
 662        if (!to_acpi_device_node(args.fwnode))
 663                return -EINVAL;
 664        if (args.nargs != 3)
 665                return -EPROTO;
 666
 667        lookup->index = args.args[0];
 668        lookup->pin_index = args.args[1];
 669        lookup->active_low = !!args.args[2];
 670
 671        lookup->info.adev = to_acpi_device_node(args.fwnode);
 672        lookup->info.quirks = quirks;
 673
 674        return 0;
 675}
 676
 677/**
 678 * acpi_get_gpiod_by_index() - get a GPIO descriptor from device resources
 679 * @adev: pointer to a ACPI device to get GPIO from
 680 * @propname: Property name of the GPIO (optional)
 681 * @index: index of GpioIo/GpioInt resource (starting from %0)
 682 * @info: info pointer to fill in (optional)
 683 *
 684 * Function goes through ACPI resources for @adev and based on @index looks
 685 * up a GpioIo/GpioInt resource, translates it to the Linux GPIO descriptor,
 686 * and returns it. @index matches GpioIo/GpioInt resources only so if there
 687 * are total %3 GPIO resources, the index goes from %0 to %2.
 688 *
 689 * If @propname is specified the GPIO is looked using device property. In
 690 * that case @index is used to select the GPIO entry in the property value
 691 * (in case of multiple).
 692 *
 693 * If the GPIO cannot be translated or there is an error, an ERR_PTR is
 694 * returned.
 695 *
 696 * Note: if the GPIO resource has multiple entries in the pin list, this
 697 * function only returns the first.
 698 */
 699static struct gpio_desc *acpi_get_gpiod_by_index(struct acpi_device *adev,
 700                                          const char *propname, int index,
 701                                          struct acpi_gpio_info *info)
 702{
 703        struct acpi_gpio_lookup lookup;
 704        int ret;
 705
 706        if (!adev)
 707                return ERR_PTR(-ENODEV);
 708
 709        memset(&lookup, 0, sizeof(lookup));
 710        lookup.index = index;
 711
 712        if (propname) {
 713                dev_dbg(&adev->dev, "GPIO: looking up %s\n", propname);
 714
 715                ret = acpi_gpio_property_lookup(acpi_fwnode_handle(adev),
 716                                                propname, index, &lookup);
 717                if (ret)
 718                        return ERR_PTR(ret);
 719
 720                dev_dbg(&adev->dev, "GPIO: _DSD returned %s %d %d %u\n",
 721                        dev_name(&lookup.info.adev->dev), lookup.index,
 722                        lookup.pin_index, lookup.active_low);
 723        } else {
 724                dev_dbg(&adev->dev, "GPIO: looking up %d in _CRS\n", index);
 725                lookup.info.adev = adev;
 726        }
 727
 728        ret = acpi_gpio_resource_lookup(&lookup, info);
 729        return ret ? ERR_PTR(ret) : lookup.desc;
 730}
 731
 732struct gpio_desc *acpi_find_gpio(struct device *dev,
 733                                 const char *con_id,
 734                                 unsigned int idx,
 735                                 enum gpiod_flags *dflags,
 736                                 unsigned long *lookupflags)
 737{
 738        struct acpi_device *adev = ACPI_COMPANION(dev);
 739        struct acpi_gpio_info info;
 740        struct gpio_desc *desc;
 741        char propname[32];
 742        int i;
 743
 744        /* Try first from _DSD */
 745        for (i = 0; i < ARRAY_SIZE(gpio_suffixes); i++) {
 746                if (con_id) {
 747                        snprintf(propname, sizeof(propname), "%s-%s",
 748                                 con_id, gpio_suffixes[i]);
 749                } else {
 750                        snprintf(propname, sizeof(propname), "%s",
 751                                 gpio_suffixes[i]);
 752                }
 753
 754                desc = acpi_get_gpiod_by_index(adev, propname, idx, &info);
 755                if (!IS_ERR(desc))
 756                        break;
 757                if (PTR_ERR(desc) == -EPROBE_DEFER)
 758                        return ERR_CAST(desc);
 759        }
 760
 761        /* Then from plain _CRS GPIOs */
 762        if (IS_ERR(desc)) {
 763                if (!acpi_can_fallback_to_crs(adev, con_id))
 764                        return ERR_PTR(-ENOENT);
 765
 766                desc = acpi_get_gpiod_by_index(adev, NULL, idx, &info);
 767                if (IS_ERR(desc))
 768                        return desc;
 769        }
 770
 771        if (info.gpioint &&
 772            (*dflags == GPIOD_OUT_LOW || *dflags == GPIOD_OUT_HIGH)) {
 773                dev_dbg(dev, "refusing GpioInt() entry when doing GPIOD_OUT_* lookup\n");
 774                return ERR_PTR(-ENOENT);
 775        }
 776
 777        acpi_gpio_update_gpiod_flags(dflags, &info);
 778        acpi_gpio_update_gpiod_lookup_flags(lookupflags, &info);
 779        return desc;
 780}
 781
 782/**
 783 * acpi_node_get_gpiod() - get a GPIO descriptor from ACPI resources
 784 * @fwnode: pointer to an ACPI firmware node to get the GPIO information from
 785 * @propname: Property name of the GPIO
 786 * @index: index of GpioIo/GpioInt resource (starting from %0)
 787 * @info: info pointer to fill in (optional)
 788 *
 789 * If @fwnode is an ACPI device object, call acpi_get_gpiod_by_index() for it.
 790 * Otherwise (i.e. it is a data-only non-device object), use the property-based
 791 * GPIO lookup to get to the GPIO resource with the relevant information and use
 792 * that to obtain the GPIO descriptor to return.
 793 *
 794 * If the GPIO cannot be translated or there is an error an ERR_PTR is
 795 * returned.
 796 */
 797struct gpio_desc *acpi_node_get_gpiod(struct fwnode_handle *fwnode,
 798                                      const char *propname, int index,
 799                                      struct acpi_gpio_info *info)
 800{
 801        struct acpi_gpio_lookup lookup;
 802        struct acpi_device *adev;
 803        int ret;
 804
 805        adev = to_acpi_device_node(fwnode);
 806        if (adev)
 807                return acpi_get_gpiod_by_index(adev, propname, index, info);
 808
 809        if (!is_acpi_data_node(fwnode))
 810                return ERR_PTR(-ENODEV);
 811
 812        if (!propname)
 813                return ERR_PTR(-EINVAL);
 814
 815        memset(&lookup, 0, sizeof(lookup));
 816        lookup.index = index;
 817
 818        ret = acpi_gpio_property_lookup(fwnode, propname, index, &lookup);
 819        if (ret)
 820                return ERR_PTR(ret);
 821
 822        ret = acpi_gpio_resource_lookup(&lookup, info);
 823        return ret ? ERR_PTR(ret) : lookup.desc;
 824}
 825
 826/**
 827 * acpi_dev_gpio_irq_get() - Find GpioInt and translate it to Linux IRQ number
 828 * @adev: pointer to a ACPI device to get IRQ from
 829 * @index: index of GpioInt resource (starting from %0)
 830 *
 831 * If the device has one or more GpioInt resources, this function can be
 832 * used to translate from the GPIO offset in the resource to the Linux IRQ
 833 * number.
 834 *
 835 * The function is idempotent, though each time it runs it will configure GPIO
 836 * pin direction according to the flags in GpioInt resource.
 837 *
 838 * Return: Linux IRQ number (> %0) on success, negative errno on failure.
 839 */
 840int acpi_dev_gpio_irq_get(struct acpi_device *adev, int index)
 841{
 842        int idx, i;
 843        unsigned int irq_flags;
 844        int ret;
 845
 846        for (i = 0, idx = 0; idx <= index; i++) {
 847                struct acpi_gpio_info info;
 848                struct gpio_desc *desc;
 849
 850                desc = acpi_get_gpiod_by_index(adev, NULL, i, &info);
 851
 852                /* Ignore -EPROBE_DEFER, it only matters if idx matches */
 853                if (IS_ERR(desc) && PTR_ERR(desc) != -EPROBE_DEFER)
 854                        return PTR_ERR(desc);
 855
 856                if (info.gpioint && idx++ == index) {
 857                        unsigned long lflags = GPIO_LOOKUP_FLAGS_DEFAULT;
 858                        char label[32];
 859                        int irq;
 860
 861                        if (IS_ERR(desc))
 862                                return PTR_ERR(desc);
 863
 864                        irq = gpiod_to_irq(desc);
 865                        if (irq < 0)
 866                                return irq;
 867
 868                        snprintf(label, sizeof(label), "GpioInt() %d", index);
 869                        ret = gpiod_configure_flags(desc, label, lflags, info.flags);
 870                        if (ret < 0)
 871                                return ret;
 872
 873                        irq_flags = acpi_dev_get_irq_type(info.triggering,
 874                                                          info.polarity);
 875
 876                        /* Set type if specified and different than the current one */
 877                        if (irq_flags != IRQ_TYPE_NONE &&
 878                            irq_flags != irq_get_trigger_type(irq))
 879                                irq_set_irq_type(irq, irq_flags);
 880
 881                        return irq;
 882                }
 883
 884        }
 885        return -ENOENT;
 886}
 887EXPORT_SYMBOL_GPL(acpi_dev_gpio_irq_get);
 888
 889static acpi_status
 890acpi_gpio_adr_space_handler(u32 function, acpi_physical_address address,
 891                            u32 bits, u64 *value, void *handler_context,
 892                            void *region_context)
 893{
 894        struct acpi_gpio_chip *achip = region_context;
 895        struct gpio_chip *chip = achip->chip;
 896        struct acpi_resource_gpio *agpio;
 897        struct acpi_resource *ares;
 898        int pin_index = (int)address;
 899        acpi_status status;
 900        int length;
 901        int i;
 902
 903        status = acpi_buffer_to_resource(achip->conn_info.connection,
 904                                         achip->conn_info.length, &ares);
 905        if (ACPI_FAILURE(status))
 906                return status;
 907
 908        if (WARN_ON(ares->type != ACPI_RESOURCE_TYPE_GPIO)) {
 909                ACPI_FREE(ares);
 910                return AE_BAD_PARAMETER;
 911        }
 912
 913        agpio = &ares->data.gpio;
 914
 915        if (WARN_ON(agpio->io_restriction == ACPI_IO_RESTRICT_INPUT &&
 916            function == ACPI_WRITE)) {
 917                ACPI_FREE(ares);
 918                return AE_BAD_PARAMETER;
 919        }
 920
 921        length = min(agpio->pin_table_length, (u16)(pin_index + bits));
 922        for (i = pin_index; i < length; ++i) {
 923                int pin = agpio->pin_table[i];
 924                struct acpi_gpio_connection *conn;
 925                struct gpio_desc *desc;
 926                bool found;
 927
 928                mutex_lock(&achip->conn_lock);
 929
 930                found = false;
 931                list_for_each_entry(conn, &achip->conns, node) {
 932                        if (conn->pin == pin) {
 933                                found = true;
 934                                desc = conn->desc;
 935                                break;
 936                        }
 937                }
 938
 939                /*
 940                 * The same GPIO can be shared between operation region and
 941                 * event but only if the access here is ACPI_READ. In that
 942                 * case we "borrow" the event GPIO instead.
 943                 */
 944                if (!found && agpio->shareable == ACPI_SHARED &&
 945                     function == ACPI_READ) {
 946                        struct acpi_gpio_event *event;
 947
 948                        list_for_each_entry(event, &achip->events, node) {
 949                                if (event->pin == pin) {
 950                                        desc = event->desc;
 951                                        found = true;
 952                                        break;
 953                                }
 954                        }
 955                }
 956
 957                if (!found) {
 958                        enum gpiod_flags flags = acpi_gpio_to_gpiod_flags(agpio);
 959                        const char *label = "ACPI:OpRegion";
 960
 961                        desc = gpiochip_request_own_desc(chip, pin, label,
 962                                                         GPIO_ACTIVE_HIGH,
 963                                                         flags);
 964                        if (IS_ERR(desc)) {
 965                                status = AE_ERROR;
 966                                mutex_unlock(&achip->conn_lock);
 967                                goto out;
 968                        }
 969
 970                        conn = kzalloc(sizeof(*conn), GFP_KERNEL);
 971                        if (!conn) {
 972                                status = AE_NO_MEMORY;
 973                                gpiochip_free_own_desc(desc);
 974                                mutex_unlock(&achip->conn_lock);
 975                                goto out;
 976                        }
 977
 978                        conn->pin = pin;
 979                        conn->desc = desc;
 980                        list_add_tail(&conn->node, &achip->conns);
 981                }
 982
 983                mutex_unlock(&achip->conn_lock);
 984
 985                if (function == ACPI_WRITE)
 986                        gpiod_set_raw_value_cansleep(desc,
 987                                                     !!((1 << i) & *value));
 988                else
 989                        *value |= (u64)gpiod_get_raw_value_cansleep(desc) << i;
 990        }
 991
 992out:
 993        ACPI_FREE(ares);
 994        return status;
 995}
 996
 997static void acpi_gpiochip_request_regions(struct acpi_gpio_chip *achip)
 998{
 999        struct gpio_chip *chip = achip->chip;
1000        acpi_handle handle = ACPI_HANDLE(chip->parent);
1001        acpi_status status;
1002
1003        INIT_LIST_HEAD(&achip->conns);
1004        mutex_init(&achip->conn_lock);
1005        status = acpi_install_address_space_handler(handle, ACPI_ADR_SPACE_GPIO,
1006                                                    acpi_gpio_adr_space_handler,
1007                                                    NULL, achip);
1008        if (ACPI_FAILURE(status))
1009                dev_err(chip->parent,
1010                        "Failed to install GPIO OpRegion handler\n");
1011}
1012
1013static void acpi_gpiochip_free_regions(struct acpi_gpio_chip *achip)
1014{
1015        struct gpio_chip *chip = achip->chip;
1016        acpi_handle handle = ACPI_HANDLE(chip->parent);
1017        struct acpi_gpio_connection *conn, *tmp;
1018        acpi_status status;
1019
1020        status = acpi_remove_address_space_handler(handle, ACPI_ADR_SPACE_GPIO,
1021                                                   acpi_gpio_adr_space_handler);
1022        if (ACPI_FAILURE(status)) {
1023                dev_err(chip->parent,
1024                        "Failed to remove GPIO OpRegion handler\n");
1025                return;
1026        }
1027
1028        list_for_each_entry_safe_reverse(conn, tmp, &achip->conns, node) {
1029                gpiochip_free_own_desc(conn->desc);
1030                list_del(&conn->node);
1031                kfree(conn);
1032        }
1033}
1034
1035static struct gpio_desc *
1036acpi_gpiochip_parse_own_gpio(struct acpi_gpio_chip *achip,
1037                             struct fwnode_handle *fwnode,
1038                             const char **name,
1039                             unsigned long *lflags,
1040                             enum gpiod_flags *dflags)
1041{
1042        struct gpio_chip *chip = achip->chip;
1043        struct gpio_desc *desc;
1044        u32 gpios[2];
1045        int ret;
1046
1047        *lflags = GPIO_LOOKUP_FLAGS_DEFAULT;
1048        *dflags = 0;
1049        *name = NULL;
1050
1051        ret = fwnode_property_read_u32_array(fwnode, "gpios", gpios,
1052                                             ARRAY_SIZE(gpios));
1053        if (ret < 0)
1054                return ERR_PTR(ret);
1055
1056        desc = gpiochip_get_desc(chip, gpios[0]);
1057        if (IS_ERR(desc))
1058                return desc;
1059
1060        if (gpios[1])
1061                *lflags |= GPIO_ACTIVE_LOW;
1062
1063        if (fwnode_property_present(fwnode, "input"))
1064                *dflags |= GPIOD_IN;
1065        else if (fwnode_property_present(fwnode, "output-low"))
1066                *dflags |= GPIOD_OUT_LOW;
1067        else if (fwnode_property_present(fwnode, "output-high"))
1068                *dflags |= GPIOD_OUT_HIGH;
1069        else
1070                return ERR_PTR(-EINVAL);
1071
1072        fwnode_property_read_string(fwnode, "line-name", name);
1073
1074        return desc;
1075}
1076
1077static void acpi_gpiochip_scan_gpios(struct acpi_gpio_chip *achip)
1078{
1079        struct gpio_chip *chip = achip->chip;
1080        struct fwnode_handle *fwnode;
1081
1082        device_for_each_child_node(chip->parent, fwnode) {
1083                unsigned long lflags;
1084                enum gpiod_flags dflags;
1085                struct gpio_desc *desc;
1086                const char *name;
1087                int ret;
1088
1089                if (!fwnode_property_present(fwnode, "gpio-hog"))
1090                        continue;
1091
1092                desc = acpi_gpiochip_parse_own_gpio(achip, fwnode, &name,
1093                                                    &lflags, &dflags);
1094                if (IS_ERR(desc))
1095                        continue;
1096
1097                ret = gpiod_hog(desc, name, lflags, dflags);
1098                if (ret) {
1099                        dev_err(chip->parent, "Failed to hog GPIO\n");
1100                        fwnode_handle_put(fwnode);
1101                        return;
1102                }
1103        }
1104}
1105
1106void acpi_gpiochip_add(struct gpio_chip *chip)
1107{
1108        struct acpi_gpio_chip *acpi_gpio;
1109        acpi_handle handle;
1110        acpi_status status;
1111
1112        if (!chip || !chip->parent)
1113                return;
1114
1115        handle = ACPI_HANDLE(chip->parent);
1116        if (!handle)
1117                return;
1118
1119        acpi_gpio = kzalloc(sizeof(*acpi_gpio), GFP_KERNEL);
1120        if (!acpi_gpio) {
1121                dev_err(chip->parent,
1122                        "Failed to allocate memory for ACPI GPIO chip\n");
1123                return;
1124        }
1125
1126        acpi_gpio->chip = chip;
1127        INIT_LIST_HEAD(&acpi_gpio->events);
1128        INIT_LIST_HEAD(&acpi_gpio->deferred_req_irqs_list_entry);
1129
1130        status = acpi_attach_data(handle, acpi_gpio_chip_dh, acpi_gpio);
1131        if (ACPI_FAILURE(status)) {
1132                dev_err(chip->parent, "Failed to attach ACPI GPIO chip\n");
1133                kfree(acpi_gpio);
1134                return;
1135        }
1136
1137        if (!chip->names)
1138                devprop_gpiochip_set_names(chip, dev_fwnode(chip->parent));
1139
1140        acpi_gpiochip_request_regions(acpi_gpio);
1141        acpi_gpiochip_scan_gpios(acpi_gpio);
1142        acpi_walk_dep_device_list(handle);
1143}
1144
1145void acpi_gpiochip_remove(struct gpio_chip *chip)
1146{
1147        struct acpi_gpio_chip *acpi_gpio;
1148        acpi_handle handle;
1149        acpi_status status;
1150
1151        if (!chip || !chip->parent)
1152                return;
1153
1154        handle = ACPI_HANDLE(chip->parent);
1155        if (!handle)
1156                return;
1157
1158        status = acpi_get_data(handle, acpi_gpio_chip_dh, (void **)&acpi_gpio);
1159        if (ACPI_FAILURE(status)) {
1160                dev_warn(chip->parent, "Failed to retrieve ACPI GPIO chip\n");
1161                return;
1162        }
1163
1164        acpi_gpiochip_free_regions(acpi_gpio);
1165
1166        acpi_detach_data(handle, acpi_gpio_chip_dh);
1167        kfree(acpi_gpio);
1168}
1169
1170static int acpi_gpio_package_count(const union acpi_object *obj)
1171{
1172        const union acpi_object *element = obj->package.elements;
1173        const union acpi_object *end = element + obj->package.count;
1174        unsigned int count = 0;
1175
1176        while (element < end) {
1177                switch (element->type) {
1178                case ACPI_TYPE_LOCAL_REFERENCE:
1179                        element += 3;
1180                        /* Fallthrough */
1181                case ACPI_TYPE_INTEGER:
1182                        element++;
1183                        count++;
1184                        break;
1185
1186                default:
1187                        return -EPROTO;
1188                }
1189        }
1190
1191        return count;
1192}
1193
1194static int acpi_find_gpio_count(struct acpi_resource *ares, void *data)
1195{
1196        unsigned int *count = data;
1197
1198        if (ares->type == ACPI_RESOURCE_TYPE_GPIO)
1199                *count += ares->data.gpio.pin_table_length;
1200
1201        return 1;
1202}
1203
1204/**
1205 * acpi_gpio_count - count the GPIOs associated with a device / function
1206 * @dev:        GPIO consumer, can be %NULL for system-global GPIOs
1207 * @con_id:     function within the GPIO consumer
1208 *
1209 * Return:
1210 * The number of GPIOs associated with a device / function or %-ENOENT,
1211 * if no GPIO has been assigned to the requested function.
1212 */
1213int acpi_gpio_count(struct device *dev, const char *con_id)
1214{
1215        struct acpi_device *adev = ACPI_COMPANION(dev);
1216        const union acpi_object *obj;
1217        const struct acpi_gpio_mapping *gm;
1218        int count = -ENOENT;
1219        int ret;
1220        char propname[32];
1221        unsigned int i;
1222
1223        /* Try first from _DSD */
1224        for (i = 0; i < ARRAY_SIZE(gpio_suffixes); i++) {
1225                if (con_id)
1226                        snprintf(propname, sizeof(propname), "%s-%s",
1227                                 con_id, gpio_suffixes[i]);
1228                else
1229                        snprintf(propname, sizeof(propname), "%s",
1230                                 gpio_suffixes[i]);
1231
1232                ret = acpi_dev_get_property(adev, propname, ACPI_TYPE_ANY,
1233                                            &obj);
1234                if (ret == 0) {
1235                        if (obj->type == ACPI_TYPE_LOCAL_REFERENCE)
1236                                count = 1;
1237                        else if (obj->type == ACPI_TYPE_PACKAGE)
1238                                count = acpi_gpio_package_count(obj);
1239                } else if (adev->driver_gpios) {
1240                        for (gm = adev->driver_gpios; gm->name; gm++)
1241                                if (strcmp(propname, gm->name) == 0) {
1242                                        count = gm->size;
1243                                        break;
1244                                }
1245                }
1246                if (count > 0)
1247                        break;
1248        }
1249
1250        /* Then from plain _CRS GPIOs */
1251        if (count < 0) {
1252                struct list_head resource_list;
1253                unsigned int crs_count = 0;
1254
1255                if (!acpi_can_fallback_to_crs(adev, con_id))
1256                        return count;
1257
1258                INIT_LIST_HEAD(&resource_list);
1259                acpi_dev_get_resources(adev, &resource_list,
1260                                       acpi_find_gpio_count, &crs_count);
1261                acpi_dev_free_resource_list(&resource_list);
1262                if (crs_count > 0)
1263                        count = crs_count;
1264        }
1265        return count ? count : -ENOENT;
1266}
1267
1268bool acpi_can_fallback_to_crs(struct acpi_device *adev, const char *con_id)
1269{
1270        /* Never allow fallback if the device has properties */
1271        if (acpi_dev_has_props(adev) || adev->driver_gpios)
1272                return false;
1273
1274        return con_id == NULL;
1275}
1276
1277/* Run deferred acpi_gpiochip_request_irqs() */
1278static int acpi_gpio_handle_deferred_request_irqs(void)
1279{
1280        struct acpi_gpio_chip *acpi_gpio, *tmp;
1281
1282        mutex_lock(&acpi_gpio_deferred_req_irqs_lock);
1283        list_for_each_entry_safe(acpi_gpio, tmp,
1284                                 &acpi_gpio_deferred_req_irqs_list,
1285                                 deferred_req_irqs_list_entry)
1286                acpi_gpiochip_request_irqs(acpi_gpio);
1287
1288        acpi_gpio_deferred_req_irqs_done = true;
1289        mutex_unlock(&acpi_gpio_deferred_req_irqs_lock);
1290
1291        return 0;
1292}
1293/* We must use _sync so that this runs after the first deferred_probe run */
1294late_initcall_sync(acpi_gpio_handle_deferred_request_irqs);
1295
1296static const struct dmi_system_id run_edge_events_on_boot_blacklist[] = {
1297        {
1298                .matches = {
1299                        DMI_MATCH(DMI_SYS_VENDOR, "MINIX"),
1300                        DMI_MATCH(DMI_PRODUCT_NAME, "Z83-4"),
1301                }
1302        },
1303        {} /* Terminating entry */
1304};
1305
1306static int acpi_gpio_setup_params(void)
1307{
1308        if (run_edge_events_on_boot < 0) {
1309                if (dmi_check_system(run_edge_events_on_boot_blacklist))
1310                        run_edge_events_on_boot = 0;
1311                else
1312                        run_edge_events_on_boot = 1;
1313        }
1314
1315        return 0;
1316}
1317
1318/* Directly after dmi_setup() which runs as core_initcall() */
1319postcore_initcall(acpi_gpio_setup_params);
1320