Some (not all) use cases are in dire need of describing the XPCS blocks embedded in the NXP SJA1105 and SJA1110 switches in the device tree. The use case driving this effort is specifying custom 'rx-polarity' or 'tx-polarity' property values. These PCS blocks follow the same bindings as the other instances which are memory-mapped using an APB3 or MCI interface. Since the SJA1105 applies the Documentation/devicetree/bindings/net/ethernet-switch.yaml schema directly on the SPI device OF node, its bindings are incompatible with describing address space regions where sub-devices like the XPCS exist. Namely, ethernet-switch.yaml wants #address-cells and #size-cells = <0> to satisfy the unit-address-less '^(ethernet-)?ports$' child node. But the XPCS sub-devices want their unit address to be the start of their "reg" region in the switch address space, and that requires #address-cells and #size-cells = <1>. If the SPI device OF node had an MFD-style schema, i.e. "(1)" from here: https://lore.kernel.org/netdev/20260109121432.lu2o22iijd4i57qq@skbuf/ things would have been simpler. But that ship has sailed and we need to continue supporting the direction in which the SJA1105 bindings have started already. The retrofit-ready compromise solution is for the ethernet-switch to define a custom "regs" sub-node with #address-cells and #size-cells = <1>, and this will hold any memory-mapped sub-devices, like the XPCS in this case. This solution could have been used for the "nxp,sja1110-base-t1-mdio" and "nxp,sja1110-base-tx-mdio" sub-devices too (although that ship has also sailed), and is further extensible for other SJA1110 sub-devices not yet supported (GPIO controller, cascaded IRQ controller). Document the XPCS integration-specific compatible string, positioning in the switch's "regs" subnode, and the pcs-handle to them. The "type: object" addition in the ethernet-port node is to suppress a dt_binding_check warning that states "node schemas must have a type or $ref". Rob Herring explains why this started being required just now: https://lore.kernel.org/netdev/20251120173012.GA1563834-robh@kernel.org/ Because the regs and ethernet-pcs nodes are optional, I don't want to pollute the example with them. However, I think I can add them to the commit message: compatible = "nxp,sja1105s"; ... regs { #address-cells = <0x01>; #size-cells = <0x01>; ethernet-pcs@0 { compatible = "nxp,sja1105-pcs"; reg = <0x00 0x800000>; reg-names = "direct"; reg-io-width = <0x04>; tx-polarity = ; }; }; compatible = "nxp,sja1110a"; ... regs { #address-cells = <0x01>; #size-cells = <0x01>; ethernet-pcs@705000 { compatible = "nxp,sja1110-pcs"; reg = <0x705000 0x1000>; reg-names = "indirect"; reg-io-width = <0x04>; tx-polarity = ; }; ethernet-pcs@706000 { compatible = "nxp,sja1110-pcs"; reg = <0x706000 0x1000>; reg-names = "indirect"; reg-io-width = <0x04>; tx-polarity = ; }; ethernet-pcs@707000 { compatible = "nxp,sja1110-pcs"; reg = <0x707000 0x1000>; reg-names = "indirect"; reg-io-width = <0x04>; tx-polarity = ; }; ethernet-pcs@708000 { compatible = "nxp,sja1110-pcs"; reg = <0x708000 0x1000>; reg-names = "indirect"; reg-io-width = <0x04>; tx-polarity = ; }; }; Cc: Rob Herring Cc: Krzysztof Kozlowski Cc: Conor Dooley Cc: devicetree@vger.kernel.org Signed-off-by: Vladimir Oltean --- v1->v2: rewrite commit message .../bindings/net/dsa/nxp,sja1105.yaml | 27 +++++++++++++++++++ .../bindings/net/pcs/snps,dw-xpcs.yaml | 8 ++++++ 2 files changed, 35 insertions(+) diff --git a/Documentation/devicetree/bindings/net/dsa/nxp,sja1105.yaml b/Documentation/devicetree/bindings/net/dsa/nxp,sja1105.yaml index 607b7fe8d28e..af86e425cd9a 100644 --- a/Documentation/devicetree/bindings/net/dsa/nxp,sja1105.yaml +++ b/Documentation/devicetree/bindings/net/dsa/nxp,sja1105.yaml @@ -85,11 +85,31 @@ properties: - compatible - reg + regs: + type: object + description: + Optional container node for peripherals in the switch address space other + than the switching IP itself. This node and its children only need to be + described if board-specific properties need to be specified, like SerDes + lane polarity inversion. If absent, default descriptions are used. + additionalProperties: false + + properties: + '#address-cells': + const: 1 + '#size-cells': + const: 1 + + patternProperties: + "^ethernet-pcs@[0-9a-f]+$": + $ref: /schemas/net/pcs/snps,dw-xpcs.yaml# + patternProperties: "^(ethernet-)?ports$": additionalProperties: true patternProperties: "^(ethernet-)?port@[0-9]$": + type: object allOf: - if: properties: @@ -107,6 +127,13 @@ patternProperties: tx-internal-delay-ps: $ref: "#/$defs/internal-delay-ps" + properties: + pcs-handle: + description: + Phandle to a PCS device node from the "regs" container. + Can be skipped if the PCS description is missing - in that case, + the connection is implicit. + required: - compatible - reg diff --git a/Documentation/devicetree/bindings/net/pcs/snps,dw-xpcs.yaml b/Documentation/devicetree/bindings/net/pcs/snps,dw-xpcs.yaml index e77eec9ac9ee..46e4f611f714 100644 --- a/Documentation/devicetree/bindings/net/pcs/snps,dw-xpcs.yaml +++ b/Documentation/devicetree/bindings/net/pcs/snps,dw-xpcs.yaml @@ -25,6 +25,14 @@ description: properties: compatible: oneOf: + - description: + Synopsys DesignWare XPCS in NXP SJA1105 switch (direct APB3 access + via SPI) with custom PMA + const: nxp,sja1105-pcs + - description: + Synopsys DesignWare XPCS in NXP SJA1110 switch (indirect APB3 access + via SPI) with custom PMA + const: nxp,sja1110-pcs - description: Synopsys DesignWare XPCS with none or unknown PMA const: snps,dw-xpcs - description: Synopsys DesignWare XPCS with Consumer Gen1 3G PMA -- 2.34.1