[PATCH v2 1/2] dt-bindings: i3c: Add i3c-hub support.
Frank Li
Frank.li at nxp.com
Wed Sep 17 09:59:54 PDT 2025
On Wed, Sep 17, 2025 at 10:20:54PM +0800, Steven Niu wrote:
> Add device tree binding documentation for the i3c hub devices which follows
> the Intel I3C hub specification.
>
> Signed-off-by: Steven Niu <steven.niu.uj at renesas.com>
I am not sure why combined to previous's thread
dt-bindings: i3c-hub: Add Renesas RG3MxxB12A1 I3C HUB
https://lore.kernel.org/linux-i3c/20240217131412.4145506-1-steven.niu.uj@renesas.com/T/#t
>
> ---
> Changes for V2:
> - Group the device device characteristics into groups:
> - control-port
> - target-group-x
> - target-port-x
> ---
> ---
> .../devicetree/bindings/i3c/i3c-hub.yaml | 261 ++++++++++++++++++
> 1 file changed, 261 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/i3c/i3c-hub.yaml
>
> diff --git a/Documentation/devicetree/bindings/i3c/i3c-hub.yaml b/Documentation/devicetree/bindings/i3c/i3c-hub.yaml
> new file mode 100644
> index 000000000000..c5af39b031ef
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/i3c/i3c-hub.yaml
> @@ -0,0 +1,261 @@
> +# SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/i3c/i3c-hub.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: I3C HUB
> +
> +maintainers:
> + - Zbigniew Lukwinski <zbigniew.lukwinski at linux.intel.com>
> + - Steven Niu <steven.niu.uj at renesas.com>
> +
> +description: |
> + The I3C Hub is a family of I2C/I3C 2-to-N Hub devices. An I3C Hub device
> + provides connectivity to up to two control ports, and up to eight target
> + ports. By cascading and duplicating the i3c hub, the user can build a hub
> + network to provide connectivity to a number of devices, with extended reach
> + distance, and running with different level of I2C, I3C, and SMBus protocols.
> +
> + I3C Hub Spec:
> + https://www.intel.com/content/www/us/en/content-details/823670/i3c-hub-device-specification.html
> +
> +allOf:
> + - $ref: i3c.yaml#
> +
> +properties:
> + $nodename:
> + pattern: "^hub at 0,0$"
> +
> + compatible:
> + enum:
> + - renesas,rg3mxx
> +
> + '#address-cells':
> + const: 1
> +
> + '#size-cells':
> + const: 0
> +
> + id-csel:
> + $ref: /schemas/types.yaml#/definitions/uint32
> + description:
> + The input settings of CSEL pin. This can be used to idendify the i3c hub
> + in a hub network with mulitple i3c hub hardware instance.
> + enum: [0, 1, 3]
> +
> + id-cp1:
> + $ref: /schemas/types.yaml#/definitions/uint32
> + description:
> + The input settings of control port 1 SCL & SDA pin. This can be used to
> + idendify the i3c hub in a hub network with mulitple i3c hub hardware
> + instance.
> + enum: [0, 1, 2, 3]
> +
> + id-tpx:
> + $ref: /schemas/types.yaml#/definitions/uint32
> + description:
> + The input settings of target port[n] SCL & SDA pin. This can be used to
> + idendify the i3c hub in a hub network with mulitple i3c hub hardware
> + instance.
> + enum: [0, 1, 2, 3]
I am not clean how id-* use. Can you explain more about it?
> +
> + control-port:
> + description:
> + Control port configuration.
> + $ref: '#/$defs/control-port'
> +
> + target-group-0:
> + description:
> + Target group 0 configuration.
> + $ref: '#/$defs/target-group'
> +
> + target-group-1:
> + description:
> + Target group 1 configuration.
> + $ref: '#/$defs/target-group'
> +
> +patternProperties:
> + "target-port@[0-7]$":
> + type: object
> +
> + description:
> + Child nodes used to configure target port.
> +
> + properties:
> + compatible:
> + oneOf:
> + - items:
> + - enum:
> + - i3c-hub-i3c
> + - i3c-hub-smbus
> + - i3c-hub-auto
just
compatible:
enum:
- i3c-hub-i3c
...
> +
> + reg:
> + description:
> + Target port identifier.
> + enum: [0, 7]
This means only 0 and 7, not 0..7
> +
> + io-internal-pullups-disable:
> + description:
> + Select whether to disable the internl pullups on I3C signals.
> + type:
> + boolean
> +
> + idle-disconnect:
> + description: The target port will be disconnected automatically when
> + there is no bus activity.
> + type: boolean
> +
> + clock-frequency:
> + description:
> + Select the clock frequency of SMBus Agent Tx function.
> + enum: [100000, 200000, 400000, 1000000]
> +
> + device-scan-delay-ms:
> + description:
> + The delay time in milliseconds between target port being enabled and
> + the device scan prodeucre.
> + This attribute is only applicable when the target port is configured
> + as i3c mode.
> +
> + additionalProperties: false
> +
> +required:
> + - dcr
where define dcr?
> + - "#address-cells"
> + - "#size-cells"
> +
> +additionalProperties: false
> +
> +$defs:
> + control-port:
> + type: object
> + description:
> + Child nodes used to configure control port.
> +
> + properties:
> + port-name:
> + description:
> + Name of the control port
> + enum:
> + - CP0
> + - CP1
> +
> + io-microvolt:
> + description:
> + Select the i3c signal voltage level for the control port
> + enum: [1000000, 1100000, 1200000, 1800000]
> +
> + io-strength-ohms:
> + description:
> + Select the io drive strength for control port
> + enum: [20, 30, 40, 50]
> +
> + vio-source:
> + description:
> + Select the source of VIO supply.
> + enum:
> + - external
> + - internal
prevous https://lore.kernel.org/linux-i3c/20240217131412.4145506-1-steven.niu.uj@renesas.com/T/#m037b908a91e7516d96637998f7d719821f0db1d9
use regulator, why change design?
> +
> + required:
> + - port-name
> +
> + target-group:
> + type: object
> +
> + properties:
> + io-microvolt:
> + description:
> + Select the i3c signal voltage level for the control port
> + enum: [1000000, 1100000, 1200000, 1800000]
> +
> + io-strength-ohms:
> + description:
> + Select the io drive strength for control port
> + enum: [20, 30, 40, 50]
> +
> + io-internal-pullups-ohms:
> + description:
> + Select the internal pullup resister value if the internal pullups are
> + enabled for the target port.
> + enum: [250, 500, 1000, 2000]
> +
> + vio-source:
> + description:
> + Select the source of VIO supply.
> + enum:
> + - external
> + - internal
> +
> +
> +examples:
> + - |
> + #include <dt-bindings/interrupt-controller/arm-gic.h>
> +
> + i3c at 0 {
> + reg = <0x0d040000 0x1000>;
needn't reg
i3c {
> + #address-cells = <3>;
> + #size-cells = <0>;
> +
> + hub at 0,4cc00000000 {
> + #address-cells = <1>;
> + #size-cells = <0>;
> +
> + reg = <0x0 0x4cc 0x0>;
> +
> + control-port {
> + port-name = "CP0";
> + io-microvolt = <1000000>;
> + io-strength-ohms = <20>;
> + vio-source = "external";
> + };
> +
> + target-group-0 {
> + io-microvolt = <1000000>;
> + io-strength-ohms = <20>;
> + io-internal-pullups-ohms = <500>;
> + vio-source = "internal";
> + };
> +
> + target-group-1 {
> + io-microvolt = <1800000>;
> + io-strength-ohms = <20>;
> + io-internal-pullups-ohms = <1000>;
> + vio-source = "internal";
> + };
> +
> + target-port at 0 {
> + compatible = "i3c-hub-i3c";
> + reg = <0>;
> +
> + device-scan-delay-ms = <2>;
> + };
> +
> + target-port at 1 {
does target-port at n belong to any target-group-0? look like it should be
under one of target-group-0/1
Frank
> + compatible = "i3c-hub-i3c";
> + reg = <1>;
> + io-internal-pullups-disable;
> + device-scan-delay-ms = <2>;
> + idle-disconnect;
> + };
> +
> + target-port at 2 {
> + compatible = "i3c-hub-smbus";
> + reg = <2>;
> + #address-cells = <1>;
> + #size-cells = <0>;
> + clock-frequency = <100000>;
> + };
> +
> + target-port at 3 {
> + compatible = "i3c-hub-smbus";
> + reg = <3>;
> + #address-cells = <1>;
> + #size-cells = <0>;
> + clock-frequency = <400000>;
> + };
> + };
> + };
> +...
> --
> 2.25.1
>
>
> --
> linux-i3c mailing list
> linux-i3c at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-i3c
More information about the linux-i3c
mailing list