Merge branch 'i2c/for-4.9' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 7 Oct 2016 21:12:21 +0000 (14:12 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 7 Oct 2016 21:12:21 +0000 (14:12 -0700)
Pull i2c updates from Wolfram Sang:
 "Here is the 4.9 pull request from I2C including:

   - centralized error messages when registering to the core
   - improved lockdep annotations to prevent false positives
   - DT support for muxes, gates, and arbitrators
   - bus speeds can now be obtained from ACPI
   - i2c-octeon got refactored and now supports ThunderX SoCs, too
   - i2c-tegra and i2c-designware got a bigger bunch of updates
   - a couple of standard driver fixes and improvements"

* 'i2c/for-4.9' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux: (71 commits)
  i2c: axxia: disable clks in case of failure in probe
  i2c: octeon: thunderx: Limit register access retries
  i2c: uniphier-f: fix misdetection of incomplete STOP condition
  gpio: pca953x: variable 'id' was used twice
  i2c: i801: Add support for Kaby Lake PCH-H
  gpio: pca953x: fix an incorrect lockdep warning
  i2c: add a warning to i2c_adapter_depth()
  lockdep: make MAX_LOCKDEP_SUBCLASSES unconditionally visible
  i2c: export i2c_adapter_depth()
  i2c: rk3x: Fix variable 'min_total_ns' unused warning
  i2c: rk3x: Fix sparse warning
  i2c / ACPI: Do not touch an I2C device if it belongs to another adapter
  i2c: octeon: Fix high-level controller status check
  i2c: octeon: Avoid sending STOP during recovery
  i2c: octeon: Fix set SCL recovery function
  i2c: rcar: add support for r8a7796 (R-Car M3-W)
  i2c: imx: make bus recovery through pinctrl optional
  i2c: meson: add gxbb compatible string
  i2c: uniphier-f: set the adapter to master mode when probing
  i2c: uniphier-f: avoid WARN_ON() of clk_disable() in failure path
  ...

1  2 
MAINTAINERS
drivers/gpio/gpio-pca953x.c
drivers/i2c/busses/i2c-bcm-kona.c
drivers/i2c/busses/i2c-cadence.c
drivers/i2c/busses/i2c-designware-core.c
drivers/i2c/busses/i2c-i801.c
drivers/i2c/busses/i2c-rcar.c
drivers/i2c/busses/i2c-rk3x.c
drivers/i2c/busses/i2c-sh_mobile.c
drivers/i2c/muxes/i2c-mux-pca954x.c

diff --cc MAINTAINERS
Simple merge
index 5d059866d17acf4eb397f85adef7481fdde4cdcc,018f39cc19c875df17cf4546a6b8cc86ea939d51..45c8817d068c60649ee9e5648dbf9451f3bf5667
@@@ -759,41 -765,29 +759,43 @@@ static int pca953x_probe(struct i2c_cli
  
        chip->client = client;
  
-       if (id) {
-               chip->driver_data = id->driver_data;
 +      reg = devm_regulator_get(&client->dev, "vcc");
 +      if (IS_ERR(reg)) {
 +              ret = PTR_ERR(reg);
 +              if (ret != -EPROBE_DEFER)
 +                      dev_err(&client->dev, "reg get err: %d\n", ret);
 +              return ret;
 +      }
 +      ret = regulator_enable(reg);
 +      if (ret) {
 +              dev_err(&client->dev, "reg en err: %d\n", ret);
 +              return ret;
 +      }
 +      chip->regulator = reg;
 +
+       if (i2c_id) {
+               chip->driver_data = i2c_id->driver_data;
        } else {
-               const struct acpi_device_id *id;
+               const struct acpi_device_id *acpi_id;
                const struct of_device_id *match;
  
                match = of_match_device(pca953x_dt_ids, &client->dev);
                if (match) {
                        chip->driver_data = (int)(uintptr_t)match->data;
                } else {
-                       id = acpi_match_device(pca953x_acpi_ids, &client->dev);
-                       if (!id) {
+                       acpi_id = acpi_match_device(pca953x_acpi_ids, &client->dev);
 -                      if (!acpi_id)
 -                              return -ENODEV;
++                      if (!acpi_id) {
 +                              ret = -ENODEV;
 +                              goto err_exit;
 +                      }
  
-                       chip->driver_data = id->driver_data;
+                       chip->driver_data = acpi_id->driver_data;
                }
        }
  
 -      chip->chip_type = PCA_CHIP_TYPE(chip->driver_data);
 -
        mutex_init(&chip->i2c_lock);
+       lockdep_set_subclass(&chip->i2c_lock,
+                            i2c_adapter_depth(client->adapter));
  
        /* initialize cached registers from their original values.
         * we can't share this chip with another i2c master.
Simple merge
Simple merge
index fcd973d5131e8f767cbe2af45cfac7bad74aed24,52a603a01ddda659d32f8c348715658fa0d071e4..1fe93c43215cf9e5d26385727e7c4f35a7e2fe89
@@@ -366,18 -400,31 +400,35 @@@ int i2c_dw_init(struct dw_i2c_dev *dev
        dw_writel(dev, lcnt, DW_IC_FS_SCL_LCNT);
        dev_dbg(dev->dev, "Fast-mode HCNT:LCNT = %d:%d\n", hcnt, lcnt);
  
+       if ((dev->master_cfg & DW_IC_CON_SPEED_MASK) ==
+               DW_IC_CON_SPEED_HIGH) {
+               if ((comp_param1 & DW_IC_COMP_PARAM_1_SPEED_MODE_MASK)
+                       != DW_IC_COMP_PARAM_1_SPEED_MODE_HIGH) {
+                       dev_err(dev->dev, "High Speed not supported!\n");
+                       dev->master_cfg &= ~DW_IC_CON_SPEED_MASK;
+                       dev->master_cfg |= DW_IC_CON_SPEED_FAST;
+               } else if (dev->hs_hcnt && dev->hs_lcnt) {
+                       hcnt = dev->hs_hcnt;
+                       lcnt = dev->hs_lcnt;
+                       dw_writel(dev, hcnt, DW_IC_HS_SCL_HCNT);
+                       dw_writel(dev, lcnt, DW_IC_HS_SCL_LCNT);
+                       dev_dbg(dev->dev, "HighSpeed-mode HCNT:LCNT = %d:%d\n",
+                               hcnt, lcnt);
+               }
+       }
        /* Configure SDA Hold Time if required */
 -      if (dev->sda_hold_time) {
 -              reg = dw_readl(dev, DW_IC_COMP_VERSION);
 -              if (reg >= DW_IC_SDA_HOLD_MIN_VERS)
 +      reg = dw_readl(dev, DW_IC_COMP_VERSION);
 +      if (reg >= DW_IC_SDA_HOLD_MIN_VERS) {
 +              if (dev->sda_hold_time) {
                        dw_writel(dev, dev->sda_hold_time, DW_IC_SDA_HOLD);
 -              else
 -                      dev_warn(dev->dev,
 -                              "Hardware too old to adjust SDA hold time.");
 +              } else {
 +                      /* Keep previous hold time setting if no one set it */
 +                      dev->sda_hold_time = dw_readl(dev, DW_IC_SDA_HOLD);
 +              }
 +      } else {
 +              dev_warn(dev->dev,
 +                      "Hardware too old to adjust SDA hold time.\n");
        }
  
        /* Configure Tx/Rx FIFO threshold levels */
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge