Commit e3b85b07 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull i2c updates from Wolfram Sang:
 "I2C has mainly cleanups this time and a few driver improvements.

  Because a lot of developers were on holidays (including myself) it was
  a good timing to apply lots of cleanups which would normally cause
  merge conflicts with other floating patches. Extra thanks go to Andi
  Shyti who backed me up when I was on a four week hiatus. This is also
  the reason that some patches were commited later than ideal"

* tag 'i2c-for-6.6-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux: (67 commits)
  i2c: at91: Use dev_err_probe() instead of dev_err()
  I2C: ali15x3: Do PCI error checks on own line
  i2c: Make return value check more accurate and explicit for devm_pinctrl_get()
  i2c: designware: Add support for recovery when GPIO need pinctrl
  i2c: mlxcpld: Add support for extended transaction length
  i2c: mlxcpld: Allow driver to run on ARM64 architecture
  i2c: nforce2: Do PCI error check on own line
  i2c: sis5595: Do PCI error checks on own line
  i2c: qcom-cci: Fix error checking in cci_probe()
  i2c: muxes: pca954x: Add regulator support
  i2c: muxes: pca954x: Add MAX735x/MAX736x support
  dt-bindings: i2c: Add Maxim MAX735x/MAX736x variants
  dt-bindings: i2c: pca954x: Correct interrupt support
  i2c: pnx: Use devm_platform_get_and_ioremap_resource()
  i2c: pxa: Use devm_platform_get_and_ioremap_resource()
  i2c: s3c2410: Use devm_platform_get_and_ioremap_resource()
  i2c: sh_mobile: Use devm_platform_get_and_ioremap_resource()
  i2c: st: Use devm_platform_get_and_ioremap_resource()
  i2c: qcom-geni: Convert to devm_platform_ioremap_resource()
  i2c: stm32f4: Use devm_platform_get_and_ioremap_resource()
  ...
parents 3c31041e 0ab4bcf0
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -48,6 +48,9 @@ properties:
    default: 16
    enum: [2, 4, 8, 16, 32, 64, 128, 256]

  power-domains:
    maxItems: 1

required:
  - compatible
  - reg
+0 −82
Original line number Diff line number Diff line
GPIO-based I2C Arbitration Using a Challenge & Response Mechanism
=================================================================
This uses GPIO lines and a challenge & response mechanism to arbitrate who is
the master of an I2C bus in a multimaster situation.

In many cases using GPIOs to arbitrate is not needed and a design can use
the standard I2C multi-master rules.  Using GPIOs is generally useful in
the case where there is a device on the bus that has errata and/or bugs
that makes standard multimaster mode not feasible.

Note that this scheme works well enough but has some downsides:
* It is nonstandard (not using standard I2C multimaster)
* Having two masters on a bus in general makes it relatively hard to debug
  problems (hard to tell if i2c issues were caused by one master, another, or
  some device on the bus).


Algorithm:

All masters on the bus have a 'bus claim' line which is an output that the
others can see. These are all active low with pull-ups enabled.  We'll
describe these lines as:

- OUR_CLAIM: output from us signaling to other hosts that we want the bus
- THEIR_CLAIMS: output from others signaling that they want the bus

The basic algorithm is to assert your line when you want the bus, then make
sure that the other side doesn't want it also.  A detailed explanation is best
done with an example.

Let's say we want to claim the bus.  We:
1. Assert OUR_CLAIM.
2. Waits a little bit for the other sides to notice (slew time, say 10
   microseconds).
3. Check THEIR_CLAIMS.  If none are asserted then the we have the bus and we are
   done.
4. Otherwise, wait for a few milliseconds and see if THEIR_CLAIMS are released.
5. If not, back off, release the claim and wait for a few more milliseconds.
6. Go back to 1 (until retry time has expired).


Required properties:
- compatible: i2c-arb-gpio-challenge
- our-claim-gpio: The GPIO that we use to claim the bus.
- their-claim-gpios: The GPIOs that the other sides use to claim the bus.
  Note that some implementations may only support a single other master.
- I2C arbitration bus node. See i2c-arb.txt in this directory.

Optional properties:
- slew-delay-us: microseconds to wait for a GPIO to go high. Default is 10 us.
- wait-retry-us: we'll attempt another claim after this many microseconds.
    Default is 3000 us.
- wait-free-us: we'll give up after this many microseconds. Default is 50000 us.


Example:
	i2c@12ca0000 {
		compatible = "acme,some-i2c-device";
		#address-cells = <1>;
		#size-cells = <0>;
	};

	i2c-arbitrator {
		compatible = "i2c-arb-gpio-challenge";

		i2c-parent = <&{/i2c@12CA0000}>;

		our-claim-gpio = <&gpf0 3 1>;
		their-claim-gpios = <&gpe0 4 1>;
		slew-delay-us = <10>;
		wait-retry-us = <3000>;
		wait-free-us = <50000>;

		i2c-arb {
			#address-cells = <1>;
			#size-cells = <0>;

			i2c@52 {
				// Normal I2C device
			};
		};
	};
+135 −0
Original line number Diff line number Diff line
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
%YAML 1.2
---
$id: http://devicetree.org/schemas/i2c/i2c-arb-gpio-challenge.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#

title: GPIO-based I2C Arbitration Using a Challenge & Response Mechanism

maintainers:
  - Doug Anderson <dianders@chromium.org>
  - Peter Rosin <peda@axentia.se>

description: |
  This uses GPIO lines and a challenge & response mechanism to arbitrate who is
  the master of an I2C bus in a multimaster situation.

  In many cases using GPIOs to arbitrate is not needed and a design can use the
  standard I2C multi-master rules.  Using GPIOs is generally useful in the case
  where there is a device on the bus that has errata and/or bugs that makes
  standard multimaster mode not feasible.

  Note that this scheme works well enough but has some downsides:
   * It is nonstandard (not using standard I2C multimaster)
   * Having two masters on a bus in general makes it relatively hard to debug
     problems (hard to tell if i2c issues were caused by one master, another,
     or some device on the bus).

  Algorithm:
  All masters on the bus have a 'bus claim' line which is an output that the
  others can see. These are all active low with pull-ups enabled.  We'll
  describe these lines as:
   * OUR_CLAIM: output from us signaling to other hosts that we want the bus
   * THEIR_CLAIMS: output from others signaling that they want the bus

  The basic algorithm is to assert your line when you want the bus, then make
  sure that the other side doesn't want it also.  A detailed explanation is
  best done with an example.

  Let's say we want to claim the bus.  We:
  1. Assert OUR_CLAIM.
  2. Waits a little bit for the other sides to notice (slew time, say 10
     microseconds).
  3. Check THEIR_CLAIMS.  If none are asserted then the we have the bus and we
     are done.
  4. Otherwise, wait for a few milliseconds and see if THEIR_CLAIMS are released.
  5. If not, back off, release the claim and wait for a few more milliseconds.
  6. Go back to 1 (until retry time has expired).

properties:
  compatible:
    const: i2c-arb-gpio-challenge

  i2c-parent:
    $ref: /schemas/types.yaml#/definitions/phandle
    description:
      The I2C bus that this multiplexer's master-side port is connected to.

  our-claim-gpios:
    maxItems: 1
    description:
      The GPIO that we use to claim the bus.

  slew-delay-us:
    default: 10
    description:
      Time to wait for a GPIO to go high.

  their-claim-gpios:
    minItems: 1
    maxItems: 8
    description:
      The GPIOs that the other sides use to claim the bus.  Note that some
      implementations may only support a single other master.

  wait-free-us:
    default: 50000
    description:
      We'll give up after this many microseconds.

  wait-retry-us:
    default: 3000
    description:
      We'll attempt another claim after this many microseconds.

  i2c-arb:
    type: object
    $ref: /schemas/i2c/i2c-controller.yaml
    unevaluatedProperties: false
    description:
      I2C arbitration bus node.

required:
  - compatible
  - i2c-arb
  - our-claim-gpios
  - their-claim-gpios

additionalProperties: false

examples:
  - |
    #include <dt-bindings/gpio/gpio.h>
    #include <dt-bindings/interrupt-controller/irq.h>

    i2c-arbitrator {
        compatible = "i2c-arb-gpio-challenge";
        i2c-parent = <&i2c_4>;

        our-claim-gpios = <&gpf0 3 GPIO_ACTIVE_LOW>;
        their-claim-gpios = <&gpe0 4 GPIO_ACTIVE_LOW>;
        slew-delay-us = <10>;
        wait-retry-us = <3000>;
        wait-free-us = <50000>;

        i2c-arb {
            #address-cells = <1>;
            #size-cells = <0>;

            sbs-battery@b {
                compatible = "sbs,sbs-battery";
                reg = <0xb>;
                sbs,poll-retry-count = <1>;
            };

            embedded-controller@1e {
                compatible = "google,cros-ec-i2c";
                reg = <0x1e>;
                interrupts = <6 IRQ_TYPE_LEVEL_HIGH>;
                interrupt-parent = <&gpx1>;
                pinctrl-names = "default";
                pinctrl-0 = <&ec_irq>;
                wakeup-source;
            };
        };
    };
+0 −35
Original line number Diff line number Diff line
Common i2c arbitration bus properties.

- i2c-arb child node

Required properties for the i2c-arb child node:
- #address-cells = <1>;
- #size-cells = <0>;

Optional properties for i2c-arb child node:
- Child nodes conforming to i2c bus binding


Example :

	/*
	   An NXP pca9541 I2C bus master selector at address 0x74
	   with a NXP pca8574 GPIO expander attached.
	 */

	arb@74 {
		compatible = "nxp,pca9541";
		reg = <0x74>;

		i2c-arb {
			#address-cells = <1>;
			#size-cells = <0>;

			gpio@38 {
				compatible = "nxp,pca8574";
				reg = <0x38>;
				#gpio-cells = <2>;
				gpio-controller;
			};
		};
	};
+40 −6
Original line number Diff line number Diff line
@@ -4,21 +4,29 @@
$id: http://devicetree.org/schemas/i2c/i2c-mux-pca954x.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#

title: NXP PCA954x I2C bus switch
title: NXP PCA954x I2C and compatible bus switches

maintainers:
  - Laurent Pinchart <laurent.pinchart@ideasonboard.com>

description:
  The binding supports NXP PCA954x and PCA984x I2C mux/switch devices.

allOf:
  - $ref: /schemas/i2c/i2c-mux.yaml#
  The NXP PCA954x and compatible devices are I2C bus
  multiplexer/switches that share the same functionality
  and register layout.
  The devices usually have 4 or 8 child buses, which are
  attached to the parent bus by using the SMBus "Send Byte"
  command.

properties:
  compatible:
    oneOf:
      - enum:
          - maxim,max7356
          - maxim,max7357
          - maxim,max7358
          - maxim,max7367
          - maxim,max7368
          - maxim,max7369
          - nxp,pca9540
          - nxp,pca9542
          - nxp,pca9543
@@ -59,10 +67,34 @@ properties:
    description: if present, overrides i2c-mux-idle-disconnect
    $ref: /schemas/mux/mux-controller.yaml#/properties/idle-state

  vdd-supply:
    description: A voltage regulator supplying power to the chip. On PCA9846
      the regulator supplies power to VDD2 (core logic) and optionally to VDD1.

required:
  - compatible
  - reg

allOf:
  - $ref: /schemas/i2c/i2c-mux.yaml#
  - if:
      not:
        properties:
          compatible:
            contains:
              enum:
                - maxim,max7367
                - maxim,max7369
                - nxp,pca9542
                - nxp,pca9543
                - nxp,pca9544
                - nxp,pca9545
    then:
      properties:
        interrupts: false
        "#interrupt-cells": false
        interrupt-controller: false

unevaluatedProperties: false

examples:
@@ -74,11 +106,13 @@ examples:
        #size-cells = <0>;

        i2c-mux@74 {
            compatible = "nxp,pca9548";
            compatible = "nxp,pca9545";
            #address-cells = <1>;
            #size-cells = <0>;
            reg = <0x74>;

            vdd-supply = <&p3v3>;

            interrupt-parent = <&ipic>;
            interrupts = <17 IRQ_TYPE_LEVEL_LOW>;
            interrupt-controller;
Loading