Merge tag 'acpi-extra-4.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git...
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 10 May 2017 16:35:42 +0000 (09:35 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 10 May 2017 16:35:42 +0000 (09:35 -0700)
Pull more ACPI updates from Rafael Wysocki:
 "These update the ACPICA code in the kernel to upstream revision
  20170303 which adds a few minor fixes and improvements, update ACPI
  SoC drivers with new device IDs, platform-related information and
  similar, fix the register information in the xpower PMIC driver,
  introduce a concept of "always present" devices to the ACPI device
  enumeration code and use it to fix a problem with one platform, and
  fix a system resume issue related to power resources.

  Specifics:

   - Update the ACPICA code in the kernel to upstream revision 20170303
     which includes:
      * Minor fixes and improvements in the core code (Bob Moore,
        Seunghun Han).
      * Debugger fixes (Colin Ian King, Lv Zheng).
      * Compiler/disassembler improvements (Bob Moore, David Box, Lv
        Zheng).
      * Build-related update (Lv Zheng).

   - Add new device IDs and platform-related information to the ACPI
     drivers for Intel (LPSS) and AMD (APD) SoCs (Hanjun Guo, Hans de
     Goede).

   - Make it possible to quirk ACPI-enumerated devices as "always
     present" on platforms where they are incorrectly reported as not
     present by the AML and add the INT0002 device ID to the list of
     "always present" devices (Hans de Goede).

   - Fix the register information in the xpower PMIC driver and add
     comments to map the registers to symbols used by AML to it (Hans de
     Goede).

   - Move the code turning off unused ACPI power resources during system
     resume to a point after all devices have been resumed to avoid
     issues with power resources that do not behave as expected (Hans de
     Goede)"

* tag 'acpi-extra-4.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: (22 commits)
  ACPI / power: Delay turning off unused power resources after suspend
  ACPI / PMIC: xpower: Fix power_table addresses
  ACPI / LPSS: Call pwm_add_table() for Bay Trail PWM device
  ACPICA: Update version to 20170303
  ACPICA: iasl: add ASL conversion tool
  ACPICA: Local cache support: Allow small cache objects
  ACPICA: Disassembler: Do not unconditionally remove temporary names
  ACPICA: iasl: Fix IORT SMMU GSI disassembling
  ACPICA: Cleanup AML opcode definitions, no functional change
  ACPICA: Debugger: Add interpreter blocking mark for single-step mode
  ACPICA: debugger: fix memory leak on Pathname
  ACPICA: Update for automatic repair code for objects returned by evaluate_object
  ACPICA: Namespace: fix operand cache leak
  ACPICA: Fix several incorrect invocations of ACPICA return macro
  ACPICA: Fix a module for excessive debug output
  ACPICA: Update some function headers, no funtional change
  ACPICA: Disassembler: Enhance resource descriptor detection
  i2c: designware: Add ACPI HID for Hisilicon Hip07/08 I2C controller
  ACPI / APD: Add clock frequency for Hisilicon Hip07/08 I2C controller
  ACPI / bus: Add INT0002 to list of always-present devices
  ...

1  2 
drivers/acpi/acpi_apd.c
drivers/acpi/sleep.c
drivers/i2c/busses/i2c-designware-platdrv.c
include/acpi/acpi_bus.h
include/acpi/actbl2.h

diff --combined drivers/acpi/acpi_apd.c
@@@ -106,6 -106,16 +106,16 @@@ static const struct apd_device_desc vul
        .setup = acpi_apd_setup,
        .fixed_clk_rate = 133000000,
  };
+ static const struct apd_device_desc hip07_i2c_desc = {
+       .setup = acpi_apd_setup,
+       .fixed_clk_rate = 200000000,
+ };
+ static const struct apd_device_desc hip08_i2c_desc = {
+       .setup = acpi_apd_setup,
+       .fixed_clk_rate = 250000000,
+ };
  #endif
  
  #else
@@@ -169,7 -179,8 +179,9 @@@ static const struct acpi_device_id acpi
  #ifdef CONFIG_ARM64
        { "APMC0D0F", APD_ADDR(xgene_i2c_desc) },
        { "BRCM900D", APD_ADDR(vulcan_spi_desc) },
 +      { "CAV900D",  APD_ADDR(vulcan_spi_desc) },
+       { "HISI0A21", APD_ADDR(hip07_i2c_desc) },
+       { "HISI0A22", APD_ADDR(hip08_i2c_desc) },
  #endif
        { }
  };
diff --combined drivers/acpi/sleep.c
@@@ -474,6 -474,7 +474,7 @@@ static void acpi_pm_start(u32 acpi_stat
   */
  static void acpi_pm_end(void)
  {
+       acpi_turn_off_unused_power_resources();
        acpi_scan_lock_release();
        /*
         * This is necessary in case acpi_pm_finish() is not called during a
@@@ -662,40 -663,14 +663,40 @@@ static int acpi_freeze_prepare(void
        acpi_os_wait_events_complete();
        if (acpi_sci_irq_valid())
                enable_irq_wake(acpi_sci_irq);
 +
        return 0;
  }
  
 +static void acpi_freeze_wake(void)
 +{
 +      /*
 +       * If IRQD_WAKEUP_ARMED is not set for the SCI at this point, it means
 +       * that the SCI has triggered while suspended, so cancel the wakeup in
 +       * case it has not been a wakeup event (the GPEs will be checked later).
 +       */
 +      if (acpi_sci_irq_valid() &&
 +          !irqd_is_wakeup_armed(irq_get_irq_data(acpi_sci_irq)))
 +              pm_system_cancel_wakeup();
 +}
 +
 +static void acpi_freeze_sync(void)
 +{
 +      /*
 +       * Process all pending events in case there are any wakeup ones.
 +       *
 +       * The EC driver uses the system workqueue, so that one needs to be
 +       * flushed too.
 +       */
 +      acpi_os_wait_events_complete();
 +      flush_scheduled_work();
 +}
 +
  static void acpi_freeze_restore(void)
  {
        acpi_disable_wakeup_devices(ACPI_STATE_S0);
        if (acpi_sci_irq_valid())
                disable_irq_wake(acpi_sci_irq);
 +
        acpi_enable_all_runtime_gpes();
  }
  
@@@ -707,8 -682,6 +708,8 @@@ static void acpi_freeze_end(void
  static const struct platform_freeze_ops acpi_freeze_ops = {
        .begin = acpi_freeze_begin,
        .prepare = acpi_freeze_prepare,
 +      .wake = acpi_freeze_wake,
 +      .sync = acpi_freeze_sync,
        .restore = acpi_freeze_restore,
        .end = acpi_freeze_end,
  };
@@@ -85,7 -85,8 +85,7 @@@ static void dw_i2c_acpi_params(struct p
  
                *hcnt = (u16)objs[0].integer.value;
                *lcnt = (u16)objs[1].integer.value;
 -              if (sda_hold)
 -                      *sda_hold = (u32)objs[2].integer.value;
 +              *sda_hold = (u32)objs[2].integer.value;
        }
  
        kfree(buf.pointer);
  static int dw_i2c_acpi_configure(struct platform_device *pdev)
  {
        struct dw_i2c_dev *dev = platform_get_drvdata(pdev);
 +      acpi_handle handle = ACPI_HANDLE(&pdev->dev);
        const struct acpi_device_id *id;
 +      struct acpi_device *adev;
 +      const char *uid;
  
        dev->adapter.nr = -1;
        dev->tx_fifo_depth = 32;
        dev->rx_fifo_depth = 32;
  
        /*
 -       * Try to get SDA hold time and *CNT values from an ACPI method if
 -       * it exists for both supported speed modes.
 +       * Try to get SDA hold time and *CNT values from an ACPI method for
 +       * selected speed modes.
         */
 -      dw_i2c_acpi_params(pdev, "SSCN", &dev->ss_hcnt, &dev->ss_lcnt, NULL);
 -      dw_i2c_acpi_params(pdev, "FMCN", &dev->fs_hcnt, &dev->fs_lcnt,
 -                         &dev->sda_hold_time);
 -      dw_i2c_acpi_params(pdev, "FPCN", &dev->fp_hcnt, &dev->fp_lcnt, NULL);
 -      dw_i2c_acpi_params(pdev, "HSCN", &dev->hs_hcnt, &dev->hs_lcnt, NULL);
 +      switch (dev->clk_freq) {
 +      case 100000:
 +              dw_i2c_acpi_params(pdev, "SSCN", &dev->ss_hcnt, &dev->ss_lcnt,
 +                                 &dev->sda_hold_time);
 +              break;
 +      case 1000000:
 +              dw_i2c_acpi_params(pdev, "FPCN", &dev->fp_hcnt, &dev->fp_lcnt,
 +                                 &dev->sda_hold_time);
 +              break;
 +      case 3400000:
 +              dw_i2c_acpi_params(pdev, "HSCN", &dev->hs_hcnt, &dev->hs_lcnt,
 +                                 &dev->sda_hold_time);
 +              break;
 +      case 400000:
 +      default:
 +              dw_i2c_acpi_params(pdev, "FMCN", &dev->fs_hcnt, &dev->fs_lcnt,
 +                                 &dev->sda_hold_time);
 +              break;
 +      }
  
        id = acpi_match_device(pdev->dev.driver->acpi_match_table, &pdev->dev);
        if (id && id->driver_data)
 -              dev->accessor_flags |= (u32)id->driver_data;
 +              dev->flags |= (u32)id->driver_data;
 +
 +      if (acpi_bus_get_device(handle, &adev))
 +              return -ENODEV;
 +
 +      /*
 +       * Cherrytrail I2C7 gets used for the PMIC which gets accessed
 +       * through ACPI opregions during late suspend / early resume
 +       * disable pm for it.
 +       */
 +      uid = adev->pnp.unique_id;
 +      if ((dev->flags & MODEL_CHERRYTRAIL) && !strcmp(uid, "7"))
 +              dev->pm_disabled = true;
  
        return 0;
  }
@@@ -152,11 -124,13 +152,13 @@@ static const struct acpi_device_id dw_i
        { "INT3432", 0 },
        { "INT3433", 0 },
        { "80860F41", 0 },
 -      { "808622C1", 0 },
 +      { "808622C1", MODEL_CHERRYTRAIL },
        { "AMD0010", ACCESS_INTR_MASK },
        { "AMDI0010", ACCESS_INTR_MASK },
        { "AMDI0510", 0 },
        { "APMC0D0F", 0 },
+       { "HISI02A1", 0 },
+       { "HISI02A2", 0 },
        { }
  };
  MODULE_DEVICE_TABLE(acpi, dw_i2c_acpi_match);
@@@ -276,7 -250,7 +278,7 @@@ static int dw_i2c_plat_probe(struct pla
                goto exit_reset;
        }
  
 -      r = i2c_dw_eval_lock_support(dev);
 +      r = i2c_dw_probe_lock_support(dev);
        if (r)
                goto exit_reset;
  
        ACPI_COMPANION_SET(&adap->dev, ACPI_COMPANION(&pdev->dev));
        adap->dev.of_node = pdev->dev.of_node;
  
 -      if (dev->pm_runtime_disabled) {
 +      if (dev->pm_disabled) {
                pm_runtime_forbid(&pdev->dev);
        } else {
                pm_runtime_set_autosuspend_delay(&pdev->dev, 1000);
        return r;
  
  exit_probe:
 -      if (!dev->pm_runtime_disabled)
 +      if (!dev->pm_disabled)
                pm_runtime_disable(&pdev->dev);
  exit_reset:
        if (!IS_ERR_OR_NULL(dev->rst))
@@@ -350,13 -324,11 +352,13 @@@ static int dw_i2c_plat_remove(struct pl
  
        pm_runtime_dont_use_autosuspend(&pdev->dev);
        pm_runtime_put_sync(&pdev->dev);
 -      if (!dev->pm_runtime_disabled)
 +      if (!dev->pm_disabled)
                pm_runtime_disable(&pdev->dev);
        if (!IS_ERR_OR_NULL(dev->rst))
                reset_control_assert(dev->rst);
  
 +      i2c_dw_remove_lock_support(dev);
 +
        return 0;
  }
  
@@@ -402,7 -374,9 +404,7 @@@ static int dw_i2c_plat_resume(struct de
        struct dw_i2c_dev *i_dev = platform_get_drvdata(pdev);
  
        i2c_dw_plat_prepare_clk(i_dev, true);
 -
 -      if (!i_dev->pm_runtime_disabled)
 -              i2c_dw_init(i_dev);
 +      i2c_dw_init(i_dev);
  
        return 0;
  }
diff --combined include/acpi/acpi_bus.h
@@@ -387,7 -387,6 +387,7 @@@ struct acpi_data_node 
        const char *name;
        acpi_handle handle;
        struct fwnode_handle fwnode;
 +      struct fwnode_handle *parent;
        struct acpi_device_data data;
        struct list_head sibling;
        struct kobject kobj;
@@@ -577,7 -576,7 +577,7 @@@ struct acpi_pci_root 
  
  bool acpi_dma_supported(struct acpi_device *adev);
  enum dev_dma_attr acpi_get_dma_attr(struct acpi_device *adev);
 -void acpi_dma_configure(struct device *dev, enum dev_dma_attr attr);
 +int acpi_dma_configure(struct device *dev, enum dev_dma_attr attr);
  void acpi_dma_deconfigure(struct device *dev);
  
  struct acpi_device *acpi_find_child_device(struct acpi_device *parent,
@@@ -588,6 -587,15 +588,15 @@@ struct acpi_pci_root *acpi_pci_find_roo
  int acpi_enable_wakeup_device_power(struct acpi_device *dev, int state);
  int acpi_disable_wakeup_device_power(struct acpi_device *dev);
  
+ #ifdef CONFIG_X86
+ bool acpi_device_always_present(struct acpi_device *adev);
+ #else
+ static inline bool acpi_device_always_present(struct acpi_device *adev)
+ {
+       return false;
+ }
+ #endif
  #ifdef CONFIG_PM
  acpi_status acpi_add_pm_notifier(struct acpi_device *adev, struct device *dev,
                                 void (*work_func)(struct work_struct *work));
diff --combined include/acpi/actbl2.h
@@@ -87,6 -87,7 +87,7 @@@
  #define ACPI_SIG_WDAT           "WDAT"        /* Watchdog Action Table */
  #define ACPI_SIG_WDDT           "WDDT"        /* Watchdog Timer Description Table */
  #define ACPI_SIG_WDRT           "WDRT"        /* Watchdog Resource Table */
+ #define ACPI_SIG_XXXX           "XXXX"        /* Intermediate AML header for ASL/ASL+ converter */
  
  #ifdef ACPI_UNDEFINED_TABLES
  /*
@@@ -783,6 -784,15 +784,15 @@@ struct acpi_iort_smmu 
  #define ACPI_IORT_SMMU_DVM_SUPPORTED    (1)
  #define ACPI_IORT_SMMU_COHERENT_WALK    (1<<1)
  
+ /* Global interrupt format */
+ struct acpi_iort_smmu_gsi {
+       u32 nsg_irpt;
+       u32 nsg_irpt_flags;
+       u32 nsg_cfg_irpt;
+       u32 nsg_cfg_irpt_flags;
+ };
  struct acpi_iort_smmu_v3 {
        u64 base_address;       /* SMMUv3 base address */
        u32 flags;
@@@ -1294,7 -1304,6 +1304,7 @@@ struct acpi_table_tpm2 
  #define ACPI_TPM2_MEMORY_MAPPED                     6
  #define ACPI_TPM2_COMMAND_BUFFER                    7
  #define ACPI_TPM2_COMMAND_BUFFER_WITH_START_METHOD  8
 +#define ACPI_TPM2_COMMAND_BUFFER_WITH_SMC          11
  
  /*******************************************************************************
   *