Merge tag 'acpi-4.19-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael...
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 14 Aug 2018 20:39:52 +0000 (13:39 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 14 Aug 2018 20:39:52 +0000 (13:39 -0700)
Pull ACPI updates from Rafael Wysocki:
 "These revert two ACPICA commits that are not needed any more, rework
  the property graphs support in ACPI to be more aligned with the
  analogous DT code, add some new quirks and remove one that isn't
  needed any more, add a special platform driver to enumerate multiple
  I2C devices hooked up to the same device object in the ACPI tables and
  update the battery and button drivers.

  Specifics:

   - Revert two ACPICA commits that are not needed any more (Erik
     Schmauss).

   - Rework property graph support in the ACPI device properties
     framework to make it behave more like the analogous DT code and
     update the documentation of it (Sakari Ailus).

   - Change the default ACPI device status after initialization to
     ACPI_STA_DEFAULT instead of 0 (Hans de Goede).

   - Add a special platform driver for enumerating multiple I2C devices
     hooked up to the same object in the ACPI tables (Hans de Goede).

   - Fix the ACPI battery driver to avoid reporting full capacity on
     systems without support for that and clean it up (Hans de Goede,
     Dmitry Rozhkov, Lucas Rangit Magasweran).

   - Add two system wakeup quirks to the ACPI EC driver (Aaron Ma, Mika
     Westerberg).

   - Add the touchscreen on Dell Venue Pro 7139 to the list of "always
     present" devices to make it work (Tristian Celestin).

   - Revert a special tables handling quirk for Dell XPS 9570 and
     Precision M5530 which is not needed any more (Kai Heng Feng).

   - Add support for a new OEM _OSI string to allow system vendors to
     work around issues with NVidia HDMI audio (Alex Hung).

   - Prevent the ACPI button driver from reporting excessive system
     wakeup events and clean it up (Ravi Chandra Sadineni, Randy
     Dunlap).

   - Clean up two minor code style issues in the ACPI core and GHES
     handling on ARM64 (Dongjiu Geng, John Garry, Tom Todd)"

* tag 'acpi-4.19-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: (34 commits)
  platform/x86: Add ACPI i2c-multi-instantiate pseudo driver
  ACPI / x86: utils: Remove status workaround from acpi_device_always_present()
  ACPI / scan: Create platform device for fwnodes with multiple i2c devices
  ACPI / scan: Initialize status to ACPI_STA_DEFAULT
  ACPI / EC: Add another entry for Thinkpad X1 Carbon 6th
  ACPI: bus: Fix a pointer coding style issue
  arm64 / ACPI: clean the additional checks before calling ghes_notify_sea()
  ACPI / scan: Add static attribute to indirect_io_hosts[]
  ACPI / battery: Do not export energy_full[_design] on devices without full_charge_capacity
  ACPI / EC: Use ec_no_wakeup on ThinkPad X1 Yoga 3rd
  ACPI / battery: get rid of negations in conditions
  ACPI / battery: use specialized print macros
  ACPI / battery: reorder headers alphabetically
  ACPI / battery: drop inclusion of init.h
  ACPI: battery: remove redundant old_present check on insertion
  ACPI: property: graph: Update graph documentation to use generic references
  ACPI: property: graph: Improve graph documentation for port/ep numbering
  ACPI: property: graph: Fix graph documentation
  ACPI: property: Update documentation for hierarchical data extension 1.1
  ACPI: property: Document key numbering for hierarchical data extension refs
  ...

1  2 
MAINTAINERS
drivers/gpio/gpiolib-acpi.c

diff --combined MAINTAINERS
@@@ -367,6 -367,12 +367,12 @@@ L:       linux-acpi@vger.kernel.or
  S:    Maintained
  F:    drivers/acpi/arm64
  
+ ACPI I2C MULTI INSTANTIATE DRIVER
+ M:    Hans de Goede <hdegoede@redhat.com>
+ L:    platform-driver-x86@vger.kernel.org
+ S:    Maintained
+ F:    drivers/platform/x86/i2c-multi-instantiate.c
  ACPI PMIC DRIVERS
  M:    "Rafael J. Wysocki" <rjw@rjwysocki.net>
  M:    Len Brown <lenb@kernel.org>
@@@ -5930,7 -5936,7 +5936,7 @@@ F:      Documentation/dev-tools/gcov.rs
  
  GDB KERNEL DEBUGGING HELPER SCRIPTS
  M:    Jan Kiszka <jan.kiszka@siemens.com>
 -M:    Kieran Bingham <kieran@bingham.xyz>
 +M:    Kieran Bingham <kbingham@kernel.org>
  S:    Supported
  F:    scripts/gdb/
  
@@@ -8317,16 -8323,10 +8323,16 @@@ M:   Jade Alglave <j.alglave@ucl.ac.uk
  M:    Luc Maranget <luc.maranget@inria.fr>
  M:    "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
  R:    Akira Yokosawa <akiyks@gmail.com>
 +R:    Daniel Lustig <dlustig@nvidia.com>
  L:    linux-kernel@vger.kernel.org
 +L:    linux-arch@vger.kernel.org
  S:    Supported
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git
  F:    tools/memory-model/
 +F:    Documentation/atomic_bitops.txt
 +F:    Documentation/atomic_t.txt
 +F:    Documentation/core-api/atomic_ops.rst
 +F:    Documentation/core-api/refcount-vs-atomic.rst
  F:    Documentation/memory-barriers.txt
  
  LINUX SECURITY MODULE (LSM) FRAMEWORK
@@@ -9353,6 -9353,7 +9359,6 @@@ F:      drivers/media/platform/atmel/atmel-i
  F:    devicetree/bindings/media/atmel-isc.txt
  
  MICROCHIP / ATMEL NAND DRIVER
 -M:    Wenyou Yang <wenyou.yang@microchip.com>
  M:    Josh Wu <rainyfeeling@outlook.com>
  L:    linux-mtd@lists.infradead.org
  S:    Supported
@@@ -11263,7 -11264,7 +11269,7 @@@ F:   Documentation/devicetree/bindings/pi
  
  PIN CONTROLLER - INTEL
  M:    Mika Westerberg <mika.westerberg@linux.intel.com>
 -M:    Heikki Krogerus <heikki.krogerus@linux.intel.com>
 +M:    Andy Shevchenko <andriy.shevchenko@linux.intel.com>
  S:    Maintained
  F:    drivers/pinctrl/intel/
  
@@@ -12044,9 -12045,9 +12050,9 @@@ T:   git git://git.kernel.org/pub/scm/lin
  F:    Documentation/RCU/
  X:    Documentation/RCU/torture.txt
  F:    include/linux/rcu*
 -X:    include/linux/srcu.h
 +X:    include/linux/srcu*.h
  F:    kernel/rcu/
 -X:    kernel/torture.c
 +X:    kernel/rcu/srcu*.c
  
  REAL TIME CLOCK (RTC) SUBSYSTEM
  M:    Alessandro Zummo <a.zummo@towertech.it>
@@@ -12407,6 -12408,7 +12413,6 @@@ F:   drivers/pci/hotplug/s390_pci_hpc.
  
  S390 VFIO-CCW DRIVER
  M:    Cornelia Huck <cohuck@redhat.com>
 -M:    Dong Jia Shi <bjsdjshi@linux.ibm.com>
  M:    Halil Pasic <pasic@linux.ibm.com>
  L:    linux-s390@vger.kernel.org
  L:    kvm@vger.kernel.org
@@@ -13082,8 -13084,8 +13088,8 @@@ L:   linux-kernel@vger.kernel.or
  W:    http://www.rdrop.com/users/paulmck/RCU/
  S:    Supported
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git
 -F:    include/linux/srcu.h
 -F:    kernel/rcu/srcu.c
 +F:    include/linux/srcu*.h
 +F:    kernel/rcu/srcu*.c
  
  SERIAL LOW-POWER INTER-CHIP MEDIA BUS (SLIMbus)
  M:    Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
@@@ -14062,13 -14064,6 +14068,13 @@@ M: Laxman Dewangan <ldewangan@nvidia.co
  S:    Supported
  F:    drivers/input/keyboard/tegra-kbc.c
  
 +TEGRA NAND DRIVER
 +M:    Stefan Agner <stefan@agner.ch>
 +M:    Lucas Stach <dev@lynxeye.de>
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/mtd/nvidia-tegra20-nand.txt
 +F:    drivers/mtd/nand/raw/tegra_nand.c
 +
  TEGRA PWM DRIVER
  M:    Thierry Reding <thierry.reding@gmail.com>
  S:    Supported
@@@ -14449,7 -14444,6 +14455,7 @@@ T:   git git://git.kernel.org/pub/scm/lin
  F:    Documentation/RCU/torture.txt
  F:    kernel/torture.c
  F:    kernel/rcu/rcutorture.c
 +F:    kernel/rcu/rcuperf.c
  F:    kernel/locking/locktorture.c
  
  TOSHIBA ACPI EXTRAS DRIVER
@@@ -25,7 -25,6 +25,7 @@@
  
  struct acpi_gpio_event {
        struct list_head node;
 +      struct list_head initial_sync_list;
        acpi_handle handle;
        unsigned int pin;
        unsigned int irq;
@@@ -51,9 -50,6 +51,9 @@@ struct acpi_gpio_chip 
        struct list_head events;
  };
  
 +static LIST_HEAD(acpi_gpio_initial_sync_list);
 +static DEFINE_MUTEX(acpi_gpio_initial_sync_list_lock);
 +
  static int acpi_gpiochip_find(struct gpio_chip *gc, void *data)
  {
        if (!gc->parent)
@@@ -89,21 -85,6 +89,21 @@@ static struct gpio_desc *acpi_get_gpiod
        return gpiochip_get_desc(chip, pin);
  }
  
 +static void acpi_gpio_add_to_initial_sync_list(struct acpi_gpio_event *event)
 +{
 +      mutex_lock(&acpi_gpio_initial_sync_list_lock);
 +      list_add(&event->initial_sync_list, &acpi_gpio_initial_sync_list);
 +      mutex_unlock(&acpi_gpio_initial_sync_list_lock);
 +}
 +
 +static void acpi_gpio_del_from_initial_sync_list(struct acpi_gpio_event *event)
 +{
 +      mutex_lock(&acpi_gpio_initial_sync_list_lock);
 +      if (!list_empty(&event->initial_sync_list))
 +              list_del_init(&event->initial_sync_list);
 +      mutex_unlock(&acpi_gpio_initial_sync_list_lock);
 +}
 +
  static irqreturn_t acpi_gpio_irq_handler(int irq, void *data)
  {
        struct acpi_gpio_event *event = data;
@@@ -155,7 -136,7 +155,7 @@@ static acpi_status acpi_gpiochip_reques
        irq_handler_t handler = NULL;
        struct gpio_desc *desc;
        unsigned long irqflags;
 -      int ret, pin, irq;
 +      int ret, pin, irq, value;
  
        if (!acpi_gpio_get_irq_resource(ares, &agpio))
                return AE_OK;
  
        gpiod_direction_input(desc);
  
 +      value = gpiod_get_value(desc);
 +
        ret = gpiochip_lock_as_irq(chip, pin);
        if (ret) {
                dev_err(chip->parent, "Failed to lock GPIO as interrupt\n");
        event->irq = irq;
        event->pin = pin;
        event->desc = desc;
 +      INIT_LIST_HEAD(&event->initial_sync_list);
  
        ret = request_threaded_irq(event->irq, NULL, handler, irqflags,
                                   "ACPI:Event", event);
                enable_irq_wake(irq);
  
        list_add_tail(&event->node, &acpi_gpio->events);
 +
 +      /*
 +       * Make sure we trigger the initial state of the IRQ when using RISING
 +       * or FALLING.  Note we run the handlers on late_init, the AML code
 +       * may refer to OperationRegions from other (builtin) drivers which
 +       * may be probed after us.
 +       */
 +      if (handler == acpi_gpio_irq_handler &&
 +          (((irqflags & IRQF_TRIGGER_RISING) && value == 1) ||
 +           ((irqflags & IRQF_TRIGGER_FALLING) && value == 0)))
 +              acpi_gpio_add_to_initial_sync_list(event);
 +
        return AE_OK;
  
  fail_free_event:
@@@ -328,8 -294,6 +328,8 @@@ void acpi_gpiochip_free_interrupts(stru
        list_for_each_entry_safe_reverse(event, ep, &acpi_gpio->events, node) {
                struct gpio_desc *desc;
  
 +              acpi_gpio_del_from_initial_sync_list(event);
 +
                if (irqd_is_wakeup_set(irq_get_irq_data(event->irq)))
                        disable_irq_wake(event->irq);
  
@@@ -389,7 -353,7 +389,7 @@@ EXPORT_SYMBOL_GPL(devm_acpi_dev_remove_
  
  static bool acpi_get_driver_gpio_data(struct acpi_device *adev,
                                      const char *name, int index,
-                                     struct acpi_reference_args *args,
+                                     struct fwnode_reference_args *args,
                                      unsigned int *quirks)
  {
        const struct acpi_gpio_mapping *gm;
                if (!strcmp(name, gm->name) && gm->data && index < gm->size) {
                        const struct acpi_gpio_params *par = gm->data + index;
  
-                       args->adev = adev;
+                       args->fwnode = acpi_fwnode_handle(adev);
                        args->args[0] = par->crs_entry_index;
                        args->args[1] = par->line_index;
                        args->args[2] = par->active_low;
@@@ -564,7 -528,7 +564,7 @@@ static int acpi_gpio_property_lookup(st
                                     const char *propname, int index,
                                     struct acpi_gpio_lookup *lookup)
  {
-       struct acpi_reference_args args;
+       struct fwnode_reference_args args;
        unsigned int quirks = 0;
        int ret;
  
         * The property was found and resolved, so need to lookup the GPIO based
         * on returned args.
         */
+       if (!to_acpi_device_node(args.fwnode))
+               return -EINVAL;
        if (args.nargs != 3)
                return -EPROTO;
  
        lookup->pin_index = args.args[1];
        lookup->active_low = !!args.args[2];
  
-       lookup->info.adev = args.adev;
+       lookup->info.adev = to_acpi_device_node(args.fwnode);
        lookup->info.quirks = quirks;
        return 0;
  }
  
@@@ -1194,21 -1161,3 +1197,21 @@@ bool acpi_can_fallback_to_crs(struct ac
  
        return con_id == NULL;
  }
 +
 +/* Sync the initial state of handlers after all builtin drivers have probed */
 +static int acpi_gpio_initial_sync(void)
 +{
 +      struct acpi_gpio_event *event, *ep;
 +
 +      mutex_lock(&acpi_gpio_initial_sync_list_lock);
 +      list_for_each_entry_safe(event, ep, &acpi_gpio_initial_sync_list,
 +                               initial_sync_list) {
 +              acpi_evaluate_object(event->handle, NULL, NULL, NULL);
 +              list_del_init(&event->initial_sync_list);
 +      }
 +      mutex_unlock(&acpi_gpio_initial_sync_list_lock);
 +
 +      return 0;
 +}
 +/* We must use _sync so that this runs after the first deferred_probe run */
 +late_initcall_sync(acpi_gpio_initial_sync);