| # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) |
| %YAML 1.2 |
| --- |
| $id: http://devicetree.org/schemas/i2c/i2c-demux-pinctrl.yaml# |
| $schema: http://devicetree.org/meta-schemas/core.yaml# |
| |
| title: Pinctrl-based I2C Bus Demultiplexer |
| |
| maintainers: |
| - Wolfram Sang <wsa+renesas@sang-engineering.com> |
| |
| description: | |
| This binding describes an I2C bus demultiplexer that uses pin multiplexing to |
| route the I2C signals, and represents the pin multiplexing configuration |
| using the pinctrl device tree bindings. This may be used to select one I2C |
| IP core at runtime which may have a better feature set for a given task than |
| another I2C IP core on the SoC. The most simple example is to fall back to |
| GPIO bitbanging if your current runtime configuration hits an errata of the |
| internal IP core. |
| |
| +-------------------------------+ |
| | SoC | |
| | | +-----+ +-----+ |
| | +------------+ | | dev | | dev | |
| | |I2C IP Core1|--\ | +-----+ +-----+ |
| | +------------+ \-------+ | | | |
| | |Pinctrl|--|------+--------+ |
| | +------------+ +-------+ | |
| | |I2C IP Core2|--/ | |
| | +------------+ | |
| | | |
| +-------------------------------+ |
| |
| allOf: |
| - $ref: /schemas/i2c/i2c-controller.yaml# |
| |
| properties: |
| compatible: |
| const: i2c-demux-pinctrl |
| |
| i2c-parent: |
| $ref: /schemas/types.yaml#/definitions/phandle-array |
| items: |
| maxItems: 1 |
| description: |
| List of phandles of I2C masters available for selection. The first one |
| will be used as default. |
| |
| i2c-bus-name: |
| $ref: /schemas/types.yaml#/definitions/string |
| description: |
| The name of this bus. Also needed as pinctrl-name for the I2C parents. |
| |
| required: |
| - compatible |
| - i2c-parent |
| - i2c-bus-name |
| |
| unevaluatedProperties: false |
| |
| examples: |
| - | |
| #include <dt-bindings/gpio/gpio.h> |
| #include <dt-bindings/interrupt-controller/irq.h> |
| |
| gpioi2c2: i2c-9 { |
| #address-cells = <1>; |
| #size-cells = <0>; |
| compatible = "i2c-gpio"; |
| scl-gpios = <&gpio5 5 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>; |
| sda-gpios = <&gpio5 6 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>; |
| i2c-gpio,delay-us = <5>; |
| |
| // The I2C controller must have its status "disabled". The I2C bus |
| // demultiplexer will enable it at runtime when needed. |
| status = "disabled"; |
| }; |
| |
| iic2: i2c@e6520000 { |
| reg = <0xe6520000 0x425>; |
| pinctrl-0 = <&iic2_pins>; |
| // The pinctrl property for the parent I2C controller needs a pinctrl |
| // state with the same name as i2c-bus-name in the I2C bus demultiplexer |
| // node, not "default"! |
| pinctrl-names = "i2c-hdmi"; |
| |
| clock-frequency = <100000>; |
| |
| // The I2C controller must have its status "disabled". The I2C bus |
| // demultiplexer will enable it at runtime when needed. |
| status = "disabled"; |
| }; |
| |
| i2c2: i2c@e6530000 { |
| reg = <0 0xe6530000 0 0x40>; |
| pinctrl-0 = <&i2c2_pins>; |
| // The pinctrl property for the parent I2C controller needs a pinctrl |
| // state with the same name as i2c-bus-name in the I2C bus demultiplexer |
| // node, not "default"! |
| pinctrl-names = "i2c-hdmi"; |
| |
| clock-frequency = <100000>; |
| |
| // The I2C controller must have its status "disabled". The I2C bus |
| // demultiplexer will enable it at runtime when needed. |
| status = "disabled"; |
| }; |
| |
| // Example for a bus to be demuxed. It contains various I2C clients for |
| // HDMI, so the bus is named "i2c-hdmi": |
| i2chdmi: i2c-mux3 { |
| compatible = "i2c-demux-pinctrl"; |
| i2c-parent = <&iic2>, <&i2c2>, <&gpioi2c2>; |
| i2c-bus-name = "i2c-hdmi"; |
| #address-cells = <1>; |
| #size-cells = <0>; |
| |
| ak4643: codec@12 { |
| compatible = "asahi-kasei,ak4643"; |
| #sound-dai-cells = <0>; |
| reg = <0x12>; |
| }; |
| |
| composite-in@20 { |
| compatible = "adi,adv7180"; |
| reg = <0x20>; |
| |
| port { |
| adv7180: endpoint { |
| bus-width = <8>; |
| remote-endpoint = <&vin1ep0>; |
| }; |
| }; |
| }; |
| |
| hdmi@39 { |
| compatible = "adi,adv7511w"; |
| reg = <0x39>; |
| interrupt-parent = <&gpio1>; |
| interrupts = <15 IRQ_TYPE_LEVEL_LOW>; |
| clocks = <&cec_clock>; |
| clock-names = "cec"; |
| |
| avdd-supply = <&fixedregulator1v8>; |
| dvdd-supply = <&fixedregulator1v8>; |
| pvdd-supply = <&fixedregulator1v8>; |
| dvdd-3v-supply = <&fixedregulator3v3>; |
| bgvdd-supply = <&fixedregulator1v8>; |
| |
| adi,input-depth = <8>; |
| adi,input-colorspace = "rgb"; |
| adi,input-clock = "1x"; |
| |
| ports { |
| #address-cells = <1>; |
| #size-cells = <0>; |
| |
| port@0 { |
| reg = <0>; |
| adv7511_in: endpoint { |
| remote-endpoint = <&lvds0_out>; |
| }; |
| }; |
| |
| port@1 { |
| reg = <1>; |
| adv7511_out: endpoint { |
| remote-endpoint = <&hdmi_con_out>; |
| }; |
| }; |
| }; |
| }; |
| }; |