linux/drivers/gpio/gpiolib-acpi.c
<<
>>
Prefs
   1/*
   2 * ACPI helpers for GPIO API
   3 *
   4 * Copyright (C) 2012, Intel Corporation
   5 * Authors: Mathias Nyman <mathias.nyman@linux.intel.com>
   6 *          Mika Westerberg <mika.westerberg@linux.intel.com>
   7 *
   8 * This program is free software; you can redistribute it and/or modify
   9 * it under the terms of the GNU General Public License version 2 as
  10 * published by the Free Software Foundation.
  11 */
  12
  13#include <linux/errno.h>
  14#include <linux/gpio.h>
  15#include <linux/gpio/consumer.h>
  16#include <linux/gpio/driver.h>
  17#include <linux/export.h>
  18#include <linux/acpi.h>
  19#include <linux/interrupt.h>
  20#include <linux/mutex.h>
  21#include <linux/pinctrl/pinctrl.h>
  22
  23#include "gpiolib.h"
  24
  25struct acpi_gpio_event {
  26        struct list_head node;
  27        acpi_handle handle;
  28        unsigned int pin;
  29        unsigned int irq;
  30        struct gpio_desc *desc;
  31};
  32
  33struct acpi_gpio_connection {
  34        struct list_head node;
  35        unsigned int pin;
  36        struct gpio_desc *desc;
  37};
  38
  39struct acpi_gpio_chip {
  40        /*
  41         * ACPICA requires that the first field of the context parameter
  42         * passed to acpi_install_address_space_handler() is large enough
  43         * to hold struct acpi_connection_info.
  44         */
  45        struct acpi_connection_info conn_info;
  46        struct list_head conns;
  47        struct mutex conn_lock;
  48        struct gpio_chip *chip;
  49        struct list_head events;
  50};
  51
  52static int acpi_gpiochip_find(struct gpio_chip *gc, void *data)
  53{
  54        if (!gc->parent)
  55                return false;
  56
  57        return ACPI_HANDLE(gc->parent) == data;
  58}
  59
  60#ifdef CONFIG_PINCTRL
  61/**
  62 * acpi_gpiochip_pin_to_gpio_offset() - translates ACPI GPIO to Linux GPIO
  63 * @chip: GPIO chip
  64 * @pin: ACPI GPIO pin number from GpioIo/GpioInt resource
  65 *
  66 * Function takes ACPI GpioIo/GpioInt pin number as a parameter and
  67 * translates it to a corresponding offset suitable to be passed to a
  68 * GPIO controller driver.
  69 *
  70 * Typically the returned offset is same as @pin, but if the GPIO
  71 * controller uses pin controller and the mapping is not contiguous the
  72 * offset might be different.
  73 */
  74static int acpi_gpiochip_pin_to_gpio_offset(struct gpio_device *gdev, int pin)
  75{
  76        struct gpio_pin_range *pin_range;
  77
  78        /* If there are no ranges in this chip, use 1:1 mapping */
  79        if (list_empty(&gdev->pin_ranges))
  80                return pin;
  81
  82        list_for_each_entry(pin_range, &gdev->pin_ranges, node) {
  83                const struct pinctrl_gpio_range *range = &pin_range->range;
  84                int i;
  85
  86                if (range->pins) {
  87                        for (i = 0; i < range->npins; i++) {
  88                                if (range->pins[i] == pin)
  89                                        return range->base + i - gdev->base;
  90                        }
  91                } else {
  92                        if (pin >= range->pin_base &&
  93                            pin < range->pin_base + range->npins) {
  94                                unsigned gpio_base;
  95
  96                                gpio_base = range->base - gdev->base;
  97                                return gpio_base + pin - range->pin_base;
  98                        }
  99                }
 100        }
 101
 102        return -EINVAL;
 103}
 104#else
 105static inline int acpi_gpiochip_pin_to_gpio_offset(struct gpio_device *gdev,
 106                                                   int pin)
 107{
 108        return pin;
 109}
 110#endif
 111
 112/**
 113 * acpi_get_gpiod() - Translate ACPI GPIO pin to GPIO descriptor usable with GPIO API
 114 * @path:       ACPI GPIO controller full path name, (e.g. "\\_SB.GPO1")
 115 * @pin:        ACPI GPIO pin number (0-based, controller-relative)
 116 *
 117 * Return: GPIO descriptor to use with Linux generic GPIO API, or ERR_PTR
 118 * error value. Specifically returns %-EPROBE_DEFER if the referenced GPIO
 119 * controller does not have gpiochip registered at the moment. This is to
 120 * support probe deferral.
 121 */
 122static struct gpio_desc *acpi_get_gpiod(char *path, int pin)
 123{
 124        struct gpio_chip *chip;
 125        acpi_handle handle;
 126        acpi_status status;
 127        int offset;
 128
 129        status = acpi_get_handle(NULL, path, &handle);
 130        if (ACPI_FAILURE(status))
 131                return ERR_PTR(-ENODEV);
 132
 133        chip = gpiochip_find(handle, acpi_gpiochip_find);
 134        if (!chip)
 135                return ERR_PTR(-EPROBE_DEFER);
 136
 137        offset = acpi_gpiochip_pin_to_gpio_offset(chip->gpiodev, pin);
 138        if (offset < 0)
 139                return ERR_PTR(offset);
 140
 141        return gpiochip_get_desc(chip, offset);
 142}
 143
 144static irqreturn_t acpi_gpio_irq_handler(int irq, void *data)
 145{
 146        struct acpi_gpio_event *event = data;
 147
 148        acpi_evaluate_object(event->handle, NULL, NULL, NULL);
 149
 150        return IRQ_HANDLED;
 151}
 152
 153static irqreturn_t acpi_gpio_irq_handler_evt(int irq, void *data)
 154{
 155        struct acpi_gpio_event *event = data;
 156
 157        acpi_execute_simple_method(event->handle, NULL, event->pin);
 158
 159        return IRQ_HANDLED;
 160}
 161
 162static void acpi_gpio_chip_dh(acpi_handle handle, void *data)
 163{
 164        /* The address of this function is used as a key. */
 165}
 166
 167static acpi_status acpi_gpiochip_request_interrupt(struct acpi_resource *ares,
 168                                                   void *context)
 169{
 170        struct acpi_gpio_chip *acpi_gpio = context;
 171        struct gpio_chip *chip = acpi_gpio->chip;
 172        struct acpi_resource_gpio *agpio;
 173        acpi_handle handle, evt_handle;
 174        struct acpi_gpio_event *event;
 175        irq_handler_t handler = NULL;
 176        struct gpio_desc *desc;
 177        unsigned long irqflags;
 178        int ret, pin, irq;
 179
 180        if (ares->type != ACPI_RESOURCE_TYPE_GPIO)
 181                return AE_OK;
 182
 183        agpio = &ares->data.gpio;
 184        if (agpio->connection_type != ACPI_RESOURCE_GPIO_TYPE_INT)
 185                return AE_OK;
 186
 187        handle = ACPI_HANDLE(chip->parent);
 188        pin = agpio->pin_table[0];
 189
 190        if (pin <= 255) {
 191                char ev_name[5];
 192                sprintf(ev_name, "_%c%02X",
 193                        agpio->triggering == ACPI_EDGE_SENSITIVE ? 'E' : 'L',
 194                        pin);
 195                if (ACPI_SUCCESS(acpi_get_handle(handle, ev_name, &evt_handle)))
 196                        handler = acpi_gpio_irq_handler;
 197        }
 198        if (!handler) {
 199                if (ACPI_SUCCESS(acpi_get_handle(handle, "_EVT", &evt_handle)))
 200                        handler = acpi_gpio_irq_handler_evt;
 201        }
 202        if (!handler)
 203                return AE_BAD_PARAMETER;
 204
 205        pin = acpi_gpiochip_pin_to_gpio_offset(chip->gpiodev, pin);
 206        if (pin < 0)
 207                return AE_BAD_PARAMETER;
 208
 209        desc = gpiochip_request_own_desc(chip, pin, "ACPI:Event");
 210        if (IS_ERR(desc)) {
 211                dev_err(chip->parent, "Failed to request GPIO\n");
 212                return AE_ERROR;
 213        }
 214
 215        gpiod_direction_input(desc);
 216
 217        ret = gpiochip_lock_as_irq(chip, pin);
 218        if (ret) {
 219                dev_err(chip->parent, "Failed to lock GPIO as interrupt\n");
 220                goto fail_free_desc;
 221        }
 222
 223        irq = gpiod_to_irq(desc);
 224        if (irq < 0) {
 225                dev_err(chip->parent, "Failed to translate GPIO to IRQ\n");
 226                goto fail_unlock_irq;
 227        }
 228
 229        irqflags = IRQF_ONESHOT;
 230        if (agpio->triggering == ACPI_LEVEL_SENSITIVE) {
 231                if (agpio->polarity == ACPI_ACTIVE_HIGH)
 232                        irqflags |= IRQF_TRIGGER_HIGH;
 233                else
 234                        irqflags |= IRQF_TRIGGER_LOW;
 235        } else {
 236                switch (agpio->polarity) {
 237                case ACPI_ACTIVE_HIGH:
 238                        irqflags |= IRQF_TRIGGER_RISING;
 239                        break;
 240                case ACPI_ACTIVE_LOW:
 241                        irqflags |= IRQF_TRIGGER_FALLING;
 242                        break;
 243                default:
 244                        irqflags |= IRQF_TRIGGER_RISING |
 245                                    IRQF_TRIGGER_FALLING;
 246                        break;
 247                }
 248        }
 249
 250        event = kzalloc(sizeof(*event), GFP_KERNEL);
 251        if (!event)
 252                goto fail_unlock_irq;
 253
 254        event->handle = evt_handle;
 255        event->irq = irq;
 256        event->pin = pin;
 257        event->desc = desc;
 258
 259        ret = request_threaded_irq(event->irq, NULL, handler, irqflags,
 260                                   "ACPI:Event", event);
 261        if (ret) {
 262                dev_err(chip->parent,
 263                        "Failed to setup interrupt handler for %d\n",
 264                        event->irq);
 265                goto fail_free_event;
 266        }
 267
 268        list_add_tail(&event->node, &acpi_gpio->events);
 269        return AE_OK;
 270
 271fail_free_event:
 272        kfree(event);
 273fail_unlock_irq:
 274        gpiochip_unlock_as_irq(chip, pin);
 275fail_free_desc:
 276        gpiochip_free_own_desc(desc);
 277
 278        return AE_ERROR;
 279}
 280
 281/**
 282 * acpi_gpiochip_request_interrupts() - Register isr for gpio chip ACPI events
 283 * @chip:      GPIO chip
 284 *
 285 * ACPI5 platforms can use GPIO signaled ACPI events. These GPIO interrupts are
 286 * handled by ACPI event methods which need to be called from the GPIO
 287 * chip's interrupt handler. acpi_gpiochip_request_interrupts finds out which
 288 * gpio pins have acpi event methods and assigns interrupt handlers that calls
 289 * the acpi event methods for those pins.
 290 */
 291void acpi_gpiochip_request_interrupts(struct gpio_chip *chip)
 292{
 293        struct acpi_gpio_chip *acpi_gpio;
 294        acpi_handle handle;
 295        acpi_status status;
 296
 297        if (!chip->parent || !chip->to_irq)
 298                return;
 299
 300        handle = ACPI_HANDLE(chip->parent);
 301        if (!handle)
 302                return;
 303
 304        status = acpi_get_data(handle, acpi_gpio_chip_dh, (void **)&acpi_gpio);
 305        if (ACPI_FAILURE(status))
 306                return;
 307
 308        acpi_walk_resources(handle, "_AEI",
 309                            acpi_gpiochip_request_interrupt, acpi_gpio);
 310}
 311EXPORT_SYMBOL_GPL(acpi_gpiochip_request_interrupts);
 312
 313/**
 314 * acpi_gpiochip_free_interrupts() - Free GPIO ACPI event interrupts.
 315 * @chip:      GPIO chip
 316 *
 317 * Free interrupts associated with GPIO ACPI event method for the given
 318 * GPIO chip.
 319 */
 320void acpi_gpiochip_free_interrupts(struct gpio_chip *chip)
 321{
 322        struct acpi_gpio_chip *acpi_gpio;
 323        struct acpi_gpio_event *event, *ep;
 324        acpi_handle handle;
 325        acpi_status status;
 326
 327        if (!chip->parent || !chip->to_irq)
 328                return;
 329
 330        handle = ACPI_HANDLE(chip->parent);
 331        if (!handle)
 332                return;
 333
 334        status = acpi_get_data(handle, acpi_gpio_chip_dh, (void **)&acpi_gpio);
 335        if (ACPI_FAILURE(status))
 336                return;
 337
 338        list_for_each_entry_safe_reverse(event, ep, &acpi_gpio->events, node) {
 339                struct gpio_desc *desc;
 340
 341                free_irq(event->irq, event);
 342                desc = event->desc;
 343                if (WARN_ON(IS_ERR(desc)))
 344                        continue;
 345                gpiochip_unlock_as_irq(chip, event->pin);
 346                gpiochip_free_own_desc(desc);
 347                list_del(&event->node);
 348                kfree(event);
 349        }
 350}
 351EXPORT_SYMBOL_GPL(acpi_gpiochip_free_interrupts);
 352
 353int acpi_dev_add_driver_gpios(struct acpi_device *adev,
 354                              const struct acpi_gpio_mapping *gpios)
 355{
 356        if (adev && gpios) {
 357                adev->driver_gpios = gpios;
 358                return 0;
 359        }
 360        return -EINVAL;
 361}
 362EXPORT_SYMBOL_GPL(acpi_dev_add_driver_gpios);
 363
 364static bool acpi_get_driver_gpio_data(struct acpi_device *adev,
 365                                      const char *name, int index,
 366                                      struct acpi_reference_args *args)
 367{
 368        const struct acpi_gpio_mapping *gm;
 369
 370        if (!adev->driver_gpios)
 371                return false;
 372
 373        for (gm = adev->driver_gpios; gm->name; gm++)
 374                if (!strcmp(name, gm->name) && gm->data && index < gm->size) {
 375                        const struct acpi_gpio_params *par = gm->data + index;
 376
 377                        args->adev = adev;
 378                        args->args[0] = par->crs_entry_index;
 379                        args->args[1] = par->line_index;
 380                        args->args[2] = par->active_low;
 381                        args->nargs = 3;
 382                        return true;
 383                }
 384
 385        return false;
 386}
 387
 388struct acpi_gpio_lookup {
 389        struct acpi_gpio_info info;
 390        int index;
 391        int pin_index;
 392        bool active_low;
 393        struct acpi_device *adev;
 394        struct gpio_desc *desc;
 395        int n;
 396};
 397
 398static int acpi_find_gpio(struct acpi_resource *ares, void *data)
 399{
 400        struct acpi_gpio_lookup *lookup = data;
 401
 402        if (ares->type != ACPI_RESOURCE_TYPE_GPIO)
 403                return 1;
 404
 405        if (lookup->n++ == lookup->index && !lookup->desc) {
 406                const struct acpi_resource_gpio *agpio = &ares->data.gpio;
 407                int pin_index = lookup->pin_index;
 408
 409                if (pin_index >= agpio->pin_table_length)
 410                        return 1;
 411
 412                lookup->desc = acpi_get_gpiod(agpio->resource_source.string_ptr,
 413                                              agpio->pin_table[pin_index]);
 414                lookup->info.gpioint =
 415                        agpio->connection_type == ACPI_RESOURCE_GPIO_TYPE_INT;
 416
 417                /*
 418                 * ActiveLow is only specified for GpioInt resource. If
 419                 * GpioIo is used then the only way to set the flag is
 420                 * to use _DSD "gpios" property.
 421                 * Note: we expect here:
 422                 * - ACPI_ACTIVE_LOW == GPIO_ACTIVE_LOW
 423                 * - ACPI_ACTIVE_HIGH == GPIO_ACTIVE_HIGH
 424                 */
 425                if (lookup->info.gpioint) {
 426                        lookup->info.polarity = agpio->polarity;
 427                        lookup->info.triggering = agpio->triggering;
 428                }
 429
 430        }
 431
 432        return 1;
 433}
 434
 435static int acpi_gpio_resource_lookup(struct acpi_gpio_lookup *lookup,
 436                                     struct acpi_gpio_info *info)
 437{
 438        struct list_head res_list;
 439        int ret;
 440
 441        INIT_LIST_HEAD(&res_list);
 442
 443        ret = acpi_dev_get_resources(lookup->adev, &res_list, acpi_find_gpio,
 444                                     lookup);
 445        if (ret < 0)
 446                return ret;
 447
 448        acpi_dev_free_resource_list(&res_list);
 449
 450        if (!lookup->desc)
 451                return -ENOENT;
 452
 453        if (info) {
 454                *info = lookup->info;
 455                if (lookup->active_low)
 456                        info->polarity = lookup->active_low;
 457        }
 458        return 0;
 459}
 460
 461static int acpi_gpio_property_lookup(struct fwnode_handle *fwnode,
 462                                     const char *propname, int index,
 463                                     struct acpi_gpio_lookup *lookup)
 464{
 465        struct acpi_reference_args args;
 466        int ret;
 467
 468        memset(&args, 0, sizeof(args));
 469        ret = acpi_node_get_property_reference(fwnode, propname, index, &args);
 470        if (ret) {
 471                struct acpi_device *adev = to_acpi_device_node(fwnode);
 472
 473                if (!adev)
 474                        return ret;
 475
 476                if (!acpi_get_driver_gpio_data(adev, propname, index, &args))
 477                        return ret;
 478        }
 479        /*
 480         * The property was found and resolved, so need to lookup the GPIO based
 481         * on returned args.
 482         */
 483        lookup->adev = args.adev;
 484        if (args.nargs >= 2) {
 485                lookup->index = args.args[0];
 486                lookup->pin_index = args.args[1];
 487                /* 3rd argument, if present is used to specify active_low. */
 488                if (args.nargs >= 3)
 489                        lookup->active_low = !!args.args[2];
 490        }
 491        return 0;
 492}
 493
 494/**
 495 * acpi_get_gpiod_by_index() - get a GPIO descriptor from device resources
 496 * @adev: pointer to a ACPI device to get GPIO from
 497 * @propname: Property name of the GPIO (optional)
 498 * @index: index of GpioIo/GpioInt resource (starting from %0)
 499 * @info: info pointer to fill in (optional)
 500 *
 501 * Function goes through ACPI resources for @adev and based on @index looks
 502 * up a GpioIo/GpioInt resource, translates it to the Linux GPIO descriptor,
 503 * and returns it. @index matches GpioIo/GpioInt resources only so if there
 504 * are total %3 GPIO resources, the index goes from %0 to %2.
 505 *
 506 * If @propname is specified the GPIO is looked using device property. In
 507 * that case @index is used to select the GPIO entry in the property value
 508 * (in case of multiple).
 509 *
 510 * If the GPIO cannot be translated or there is an error an ERR_PTR is
 511 * returned.
 512 *
 513 * Note: if the GPIO resource has multiple entries in the pin list, this
 514 * function only returns the first.
 515 */
 516struct gpio_desc *acpi_get_gpiod_by_index(struct acpi_device *adev,
 517                                          const char *propname, int index,
 518                                          struct acpi_gpio_info *info)
 519{
 520        struct acpi_gpio_lookup lookup;
 521        int ret;
 522
 523        if (!adev)
 524                return ERR_PTR(-ENODEV);
 525
 526        memset(&lookup, 0, sizeof(lookup));
 527        lookup.index = index;
 528
 529        if (propname) {
 530                dev_dbg(&adev->dev, "GPIO: looking up %s\n", propname);
 531
 532                ret = acpi_gpio_property_lookup(acpi_fwnode_handle(adev),
 533                                                propname, index, &lookup);
 534                if (ret)
 535                        return ERR_PTR(ret);
 536
 537                dev_dbg(&adev->dev, "GPIO: _DSD returned %s %d %d %u\n",
 538                        dev_name(&lookup.adev->dev), lookup.index,
 539                        lookup.pin_index, lookup.active_low);
 540        } else {
 541                dev_dbg(&adev->dev, "GPIO: looking up %d in _CRS\n", index);
 542                lookup.adev = adev;
 543        }
 544
 545        ret = acpi_gpio_resource_lookup(&lookup, info);
 546        return ret ? ERR_PTR(ret) : lookup.desc;
 547}
 548
 549/**
 550 * acpi_node_get_gpiod() - get a GPIO descriptor from ACPI resources
 551 * @fwnode: pointer to an ACPI firmware node to get the GPIO information from
 552 * @propname: Property name of the GPIO
 553 * @index: index of GpioIo/GpioInt resource (starting from %0)
 554 * @info: info pointer to fill in (optional)
 555 *
 556 * If @fwnode is an ACPI device object, call %acpi_get_gpiod_by_index() for it.
 557 * Otherwise (ie. it is a data-only non-device object), use the property-based
 558 * GPIO lookup to get to the GPIO resource with the relevant information and use
 559 * that to obtain the GPIO descriptor to return.
 560 */
 561struct gpio_desc *acpi_node_get_gpiod(struct fwnode_handle *fwnode,
 562                                      const char *propname, int index,
 563                                      struct acpi_gpio_info *info)
 564{
 565        struct acpi_gpio_lookup lookup;
 566        struct acpi_device *adev;
 567        int ret;
 568
 569        adev = to_acpi_device_node(fwnode);
 570        if (adev)
 571                return acpi_get_gpiod_by_index(adev, propname, index, info);
 572
 573        if (!is_acpi_data_node(fwnode))
 574                return ERR_PTR(-ENODEV);
 575
 576        if (!propname)
 577                return ERR_PTR(-EINVAL);
 578
 579        memset(&lookup, 0, sizeof(lookup));
 580        lookup.index = index;
 581
 582        ret = acpi_gpio_property_lookup(fwnode, propname, index, &lookup);
 583        if (ret)
 584                return ERR_PTR(ret);
 585
 586        ret = acpi_gpio_resource_lookup(&lookup, info);
 587        return ret ? ERR_PTR(ret) : lookup.desc;
 588}
 589
 590/**
 591 * acpi_dev_gpio_irq_get() - Find GpioInt and translate it to Linux IRQ number
 592 * @adev: pointer to a ACPI device to get IRQ from
 593 * @index: index of GpioInt resource (starting from %0)
 594 *
 595 * If the device has one or more GpioInt resources, this function can be
 596 * used to translate from the GPIO offset in the resource to the Linux IRQ
 597 * number.
 598 *
 599 * Return: Linux IRQ number (>%0) on success, negative errno on failure.
 600 */
 601int acpi_dev_gpio_irq_get(struct acpi_device *adev, int index)
 602{
 603        int idx, i;
 604        unsigned int irq_flags;
 605
 606        for (i = 0, idx = 0; idx <= index; i++) {
 607                struct acpi_gpio_info info;
 608                struct gpio_desc *desc;
 609
 610                desc = acpi_get_gpiod_by_index(adev, NULL, i, &info);
 611                if (IS_ERR(desc))
 612                        break;
 613                if (info.gpioint && idx++ == index) {
 614                        int irq = gpiod_to_irq(desc);
 615
 616                        if (irq < 0)
 617                                return irq;
 618
 619                        irq_flags = acpi_dev_get_irq_type(info.triggering,
 620                                                          info.polarity);
 621
 622                        /* Set type if specified and different than the current one */
 623                        if (irq_flags != IRQ_TYPE_NONE &&
 624                            irq_flags != irq_get_trigger_type(irq))
 625                                irq_set_irq_type(irq, irq_flags);
 626
 627                        return irq;
 628                }
 629
 630        }
 631        return -ENOENT;
 632}
 633EXPORT_SYMBOL_GPL(acpi_dev_gpio_irq_get);
 634
 635static acpi_status
 636acpi_gpio_adr_space_handler(u32 function, acpi_physical_address address,
 637                            u32 bits, u64 *value, void *handler_context,
 638                            void *region_context)
 639{
 640        struct acpi_gpio_chip *achip = region_context;
 641        struct gpio_chip *chip = achip->chip;
 642        struct acpi_resource_gpio *agpio;
 643        struct acpi_resource *ares;
 644        int pin_index = (int)address;
 645        acpi_status status;
 646        bool pull_up;
 647        int length;
 648        int i;
 649
 650        status = acpi_buffer_to_resource(achip->conn_info.connection,
 651                                         achip->conn_info.length, &ares);
 652        if (ACPI_FAILURE(status))
 653                return status;
 654
 655        if (WARN_ON(ares->type != ACPI_RESOURCE_TYPE_GPIO)) {
 656                ACPI_FREE(ares);
 657                return AE_BAD_PARAMETER;
 658        }
 659
 660        agpio = &ares->data.gpio;
 661        pull_up = agpio->pin_config == ACPI_PIN_CONFIG_PULLUP;
 662
 663        if (WARN_ON(agpio->io_restriction == ACPI_IO_RESTRICT_INPUT &&
 664            function == ACPI_WRITE)) {
 665                ACPI_FREE(ares);
 666                return AE_BAD_PARAMETER;
 667        }
 668
 669        length = min(agpio->pin_table_length, (u16)(pin_index + bits));
 670        for (i = pin_index; i < length; ++i) {
 671                int pin = agpio->pin_table[i];
 672                struct acpi_gpio_connection *conn;
 673                struct gpio_desc *desc;
 674                bool found;
 675
 676                pin = acpi_gpiochip_pin_to_gpio_offset(chip->gpiodev, pin);
 677                if (pin < 0) {
 678                        status = AE_BAD_PARAMETER;
 679                        goto out;
 680                }
 681
 682                mutex_lock(&achip->conn_lock);
 683
 684                found = false;
 685                list_for_each_entry(conn, &achip->conns, node) {
 686                        if (conn->pin == pin) {
 687                                found = true;
 688                                desc = conn->desc;
 689                                break;
 690                        }
 691                }
 692
 693                /*
 694                 * The same GPIO can be shared between operation region and
 695                 * event but only if the access here is ACPI_READ. In that
 696                 * case we "borrow" the event GPIO instead.
 697                 */
 698                if (!found && agpio->sharable == ACPI_SHARED &&
 699                     function == ACPI_READ) {
 700                        struct acpi_gpio_event *event;
 701
 702                        list_for_each_entry(event, &achip->events, node) {
 703                                if (event->pin == pin) {
 704                                        desc = event->desc;
 705                                        found = true;
 706                                        break;
 707                                }
 708                        }
 709                }
 710
 711                if (!found) {
 712                        desc = gpiochip_request_own_desc(chip, pin,
 713                                                         "ACPI:OpRegion");
 714                        if (IS_ERR(desc)) {
 715                                status = AE_ERROR;
 716                                mutex_unlock(&achip->conn_lock);
 717                                goto out;
 718                        }
 719
 720                        switch (agpio->io_restriction) {
 721                        case ACPI_IO_RESTRICT_INPUT:
 722                                gpiod_direction_input(desc);
 723                                break;
 724                        case ACPI_IO_RESTRICT_OUTPUT:
 725                                /*
 726                                 * ACPI GPIO resources don't contain an
 727                                 * initial value for the GPIO. Therefore we
 728                                 * deduce that value from the pull field
 729                                 * instead. If the pin is pulled up we
 730                                 * assume default to be high, otherwise
 731                                 * low.
 732                                 */
 733                                gpiod_direction_output(desc, pull_up);
 734                                break;
 735                        default:
 736                                /*
 737                                 * Assume that the BIOS has configured the
 738                                 * direction and pull accordingly.
 739                                 */
 740                                break;
 741                        }
 742
 743                        conn = kzalloc(sizeof(*conn), GFP_KERNEL);
 744                        if (!conn) {
 745                                status = AE_NO_MEMORY;
 746                                gpiochip_free_own_desc(desc);
 747                                mutex_unlock(&achip->conn_lock);
 748                                goto out;
 749                        }
 750
 751                        conn->pin = pin;
 752                        conn->desc = desc;
 753                        list_add_tail(&conn->node, &achip->conns);
 754                }
 755
 756                mutex_unlock(&achip->conn_lock);
 757
 758                if (function == ACPI_WRITE)
 759                        gpiod_set_raw_value_cansleep(desc,
 760                                                     !!((1 << i) & *value));
 761                else
 762                        *value |= (u64)gpiod_get_raw_value_cansleep(desc) << i;
 763        }
 764
 765out:
 766        ACPI_FREE(ares);
 767        return status;
 768}
 769
 770static void acpi_gpiochip_request_regions(struct acpi_gpio_chip *achip)
 771{
 772        struct gpio_chip *chip = achip->chip;
 773        acpi_handle handle = ACPI_HANDLE(chip->parent);
 774        acpi_status status;
 775
 776        INIT_LIST_HEAD(&achip->conns);
 777        mutex_init(&achip->conn_lock);
 778        status = acpi_install_address_space_handler(handle, ACPI_ADR_SPACE_GPIO,
 779                                                    acpi_gpio_adr_space_handler,
 780                                                    NULL, achip);
 781        if (ACPI_FAILURE(status))
 782                dev_err(chip->parent,
 783                        "Failed to install GPIO OpRegion handler\n");
 784}
 785
 786static void acpi_gpiochip_free_regions(struct acpi_gpio_chip *achip)
 787{
 788        struct gpio_chip *chip = achip->chip;
 789        acpi_handle handle = ACPI_HANDLE(chip->parent);
 790        struct acpi_gpio_connection *conn, *tmp;
 791        acpi_status status;
 792
 793        status = acpi_remove_address_space_handler(handle, ACPI_ADR_SPACE_GPIO,
 794                                                   acpi_gpio_adr_space_handler);
 795        if (ACPI_FAILURE(status)) {
 796                dev_err(chip->parent,
 797                        "Failed to remove GPIO OpRegion handler\n");
 798                return;
 799        }
 800
 801        list_for_each_entry_safe_reverse(conn, tmp, &achip->conns, node) {
 802                gpiochip_free_own_desc(conn->desc);
 803                list_del(&conn->node);
 804                kfree(conn);
 805        }
 806}
 807
 808void acpi_gpiochip_add(struct gpio_chip *chip)
 809{
 810        struct acpi_gpio_chip *acpi_gpio;
 811        acpi_handle handle;
 812        acpi_status status;
 813
 814        if (!chip || !chip->parent)
 815                return;
 816
 817        handle = ACPI_HANDLE(chip->parent);
 818        if (!handle)
 819                return;
 820
 821        acpi_gpio = kzalloc(sizeof(*acpi_gpio), GFP_KERNEL);
 822        if (!acpi_gpio) {
 823                dev_err(chip->parent,
 824                        "Failed to allocate memory for ACPI GPIO chip\n");
 825                return;
 826        }
 827
 828        acpi_gpio->chip = chip;
 829        INIT_LIST_HEAD(&acpi_gpio->events);
 830
 831        status = acpi_attach_data(handle, acpi_gpio_chip_dh, acpi_gpio);
 832        if (ACPI_FAILURE(status)) {
 833                dev_err(chip->parent, "Failed to attach ACPI GPIO chip\n");
 834                kfree(acpi_gpio);
 835                return;
 836        }
 837
 838        acpi_gpiochip_request_regions(acpi_gpio);
 839}
 840
 841void acpi_gpiochip_remove(struct gpio_chip *chip)
 842{
 843        struct acpi_gpio_chip *acpi_gpio;
 844        acpi_handle handle;
 845        acpi_status status;
 846
 847        if (!chip || !chip->parent)
 848                return;
 849
 850        handle = ACPI_HANDLE(chip->parent);
 851        if (!handle)
 852                return;
 853
 854        status = acpi_get_data(handle, acpi_gpio_chip_dh, (void **)&acpi_gpio);
 855        if (ACPI_FAILURE(status)) {
 856                dev_warn(chip->parent, "Failed to retrieve ACPI GPIO chip\n");
 857                return;
 858        }
 859
 860        acpi_gpiochip_free_regions(acpi_gpio);
 861
 862        acpi_detach_data(handle, acpi_gpio_chip_dh);
 863        kfree(acpi_gpio);
 864}
 865
 866static unsigned int acpi_gpio_package_count(const union acpi_object *obj)
 867{
 868        const union acpi_object *element = obj->package.elements;
 869        const union acpi_object *end = element + obj->package.count;
 870        unsigned int count = 0;
 871
 872        while (element < end) {
 873                if (element->type == ACPI_TYPE_LOCAL_REFERENCE)
 874                        count++;
 875
 876                element++;
 877        }
 878        return count;
 879}
 880
 881static int acpi_find_gpio_count(struct acpi_resource *ares, void *data)
 882{
 883        unsigned int *count = data;
 884
 885        if (ares->type == ACPI_RESOURCE_TYPE_GPIO)
 886                *count += ares->data.gpio.pin_table_length;
 887
 888        return 1;
 889}
 890
 891/**
 892 * acpi_gpio_count - return the number of GPIOs associated with a
 893 *              device / function or -ENOENT if no GPIO has been
 894 *              assigned to the requested function.
 895 * @dev:        GPIO consumer, can be NULL for system-global GPIOs
 896 * @con_id:     function within the GPIO consumer
 897 */
 898int acpi_gpio_count(struct device *dev, const char *con_id)
 899{
 900        struct acpi_device *adev = ACPI_COMPANION(dev);
 901        const union acpi_object *obj;
 902        const struct acpi_gpio_mapping *gm;
 903        int count = -ENOENT;
 904        int ret;
 905        char propname[32];
 906        unsigned int i;
 907
 908        /* Try first from _DSD */
 909        for (i = 0; i < ARRAY_SIZE(gpio_suffixes); i++) {
 910                if (con_id && strcmp(con_id, "gpios"))
 911                        snprintf(propname, sizeof(propname), "%s-%s",
 912                                 con_id, gpio_suffixes[i]);
 913                else
 914                        snprintf(propname, sizeof(propname), "%s",
 915                                 gpio_suffixes[i]);
 916
 917                ret = acpi_dev_get_property(adev, propname, ACPI_TYPE_ANY,
 918                                            &obj);
 919                if (ret == 0) {
 920                        if (obj->type == ACPI_TYPE_LOCAL_REFERENCE)
 921                                count = 1;
 922                        else if (obj->type == ACPI_TYPE_PACKAGE)
 923                                count = acpi_gpio_package_count(obj);
 924                } else if (adev->driver_gpios) {
 925                        for (gm = adev->driver_gpios; gm->name; gm++)
 926                                if (strcmp(propname, gm->name) == 0) {
 927                                        count = gm->size;
 928                                        break;
 929                                }
 930                }
 931                if (count >= 0)
 932                        break;
 933        }
 934
 935        /* Then from plain _CRS GPIOs */
 936        if (count < 0) {
 937                struct list_head resource_list;
 938                unsigned int crs_count = 0;
 939
 940                INIT_LIST_HEAD(&resource_list);
 941                acpi_dev_get_resources(adev, &resource_list,
 942                                       acpi_find_gpio_count, &crs_count);
 943                acpi_dev_free_resource_list(&resource_list);
 944                if (crs_count > 0)
 945                        count = crs_count;
 946        }
 947        return count;
 948}
 949
 950struct acpi_crs_lookup {
 951        struct list_head node;
 952        struct acpi_device *adev;
 953        const char *con_id;
 954};
 955
 956static DEFINE_MUTEX(acpi_crs_lookup_lock);
 957static LIST_HEAD(acpi_crs_lookup_list);
 958
 959bool acpi_can_fallback_to_crs(struct acpi_device *adev, const char *con_id)
 960{
 961        struct acpi_crs_lookup *l, *lookup = NULL;
 962
 963        /* Never allow fallback if the device has properties */
 964        if (adev->data.properties || adev->driver_gpios)
 965                return false;
 966
 967        mutex_lock(&acpi_crs_lookup_lock);
 968
 969        list_for_each_entry(l, &acpi_crs_lookup_list, node) {
 970                if (l->adev == adev) {
 971                        lookup = l;
 972                        break;
 973                }
 974        }
 975
 976        if (!lookup) {
 977                lookup = kmalloc(sizeof(*lookup), GFP_KERNEL);
 978                if (lookup) {
 979                        lookup->adev = adev;
 980                        lookup->con_id = kstrdup(con_id, GFP_KERNEL);
 981                        list_add_tail(&lookup->node, &acpi_crs_lookup_list);
 982                }
 983        }
 984
 985        mutex_unlock(&acpi_crs_lookup_lock);
 986
 987        return lookup &&
 988                ((!lookup->con_id && !con_id) ||
 989                 (lookup->con_id && con_id &&
 990                  strcmp(lookup->con_id, con_id) == 0));
 991}
 992