brintos

brintos / linux-shallow public Read only

0
0
Text · 4.1 KiB · b618b5a Raw
136 lines · yaml
1# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause2%YAML 1.23---4$id: http://devicetree.org/schemas/i2c/i2c-arb-gpio-challenge.yaml#5$schema: http://devicetree.org/meta-schemas/core.yaml#6 7title: GPIO-based I2C Arbitration Using a Challenge & Response Mechanism8 9maintainers:10  - Doug Anderson <dianders@chromium.org>11  - Peter Rosin <peda@axentia.se>12 13description: |14  This uses GPIO lines and a challenge & response mechanism to arbitrate who is15  the master of an I2C bus in a multimaster situation.16 17  In many cases using GPIOs to arbitrate is not needed and a design can use the18  standard I2C multi-master rules.  Using GPIOs is generally useful in the case19  where there is a device on the bus that has errata and/or bugs that makes20  standard multimaster mode not feasible.21 22  Note that this scheme works well enough but has some downsides:23   * It is nonstandard (not using standard I2C multimaster)24   * Having two masters on a bus in general makes it relatively hard to debug25     problems (hard to tell if i2c issues were caused by one master, another,26     or some device on the bus).27 28  Algorithm:29  All masters on the bus have a 'bus claim' line which is an output that the30  others can see. These are all active low with pull-ups enabled.  We'll31  describe these lines as:32   * OUR_CLAIM: output from us signaling to other hosts that we want the bus33   * THEIR_CLAIMS: output from others signaling that they want the bus34 35  The basic algorithm is to assert your line when you want the bus, then make36  sure that the other side doesn't want it also.  A detailed explanation is37  best done with an example.38 39  Let's say we want to claim the bus.  We:40  1. Assert OUR_CLAIM.41  2. Waits a little bit for the other sides to notice (slew time, say 1042     microseconds).43  3. Check THEIR_CLAIMS.  If none are asserted then the we have the bus and we44     are done.45  4. Otherwise, wait for a few milliseconds and see if THEIR_CLAIMS are released.46  5. If not, back off, release the claim and wait for a few more milliseconds.47  6. Go back to 1 (until retry time has expired).48 49properties:50  compatible:51    const: i2c-arb-gpio-challenge52 53  i2c-parent:54    $ref: /schemas/types.yaml#/definitions/phandle55    description:56      The I2C bus that this multiplexer's master-side port is connected to.57 58  our-claim-gpios:59    maxItems: 160    description:61      The GPIO that we use to claim the bus.62 63  slew-delay-us:64    default: 1065    description:66      Time to wait for a GPIO to go high.67 68  their-claim-gpios:69    minItems: 170    maxItems: 871    description:72      The GPIOs that the other sides use to claim the bus.  Note that some73      implementations may only support a single other master.74 75  wait-free-us:76    default: 5000077    description:78      We'll give up after this many microseconds.79 80  wait-retry-us:81    default: 300082    description:83      We'll attempt another claim after this many microseconds.84 85  i2c-arb:86    type: object87    $ref: /schemas/i2c/i2c-controller.yaml88    unevaluatedProperties: false89    description:90      I2C arbitration bus node.91 92required:93  - compatible94  - i2c-arb95  - our-claim-gpios96  - their-claim-gpios97 98additionalProperties: false99 100examples:101  - |102    #include <dt-bindings/gpio/gpio.h>103    #include <dt-bindings/interrupt-controller/irq.h>104 105    i2c-arbitrator {106        compatible = "i2c-arb-gpio-challenge";107        i2c-parent = <&i2c_4>;108 109        our-claim-gpios = <&gpf0 3 GPIO_ACTIVE_LOW>;110        their-claim-gpios = <&gpe0 4 GPIO_ACTIVE_LOW>;111        slew-delay-us = <10>;112        wait-retry-us = <3000>;113        wait-free-us = <50000>;114 115        i2c-arb {116            #address-cells = <1>;117            #size-cells = <0>;118 119            sbs-battery@b {120                compatible = "sbs,sbs-battery";121                reg = <0xb>;122                sbs,poll-retry-count = <1>;123            };124 125            embedded-controller@1e {126                compatible = "google,cros-ec-i2c";127                reg = <0x1e>;128                interrupts = <6 IRQ_TYPE_LEVEL_HIGH>;129                interrupt-parent = <&gpx1>;130                pinctrl-names = "default";131                pinctrl-0 = <&ec_irq>;132                wakeup-source;133            };134        };135    };136