[PATCH v6 3/6] dt-bindings: mfd: Add Realtek RTL9300 switch peripherals

Chris Packham posted 6 patches 1 month, 1 week ago
There is a newer version of this series
[PATCH v6 3/6] dt-bindings: mfd: Add Realtek RTL9300 switch peripherals
Posted by Chris Packham 1 month, 1 week ago
Add device tree schema for the Realtek RTL9300 switches. The RTL9300
family is made up of the RTL9301, RTL9302B, RTL9302C and RTL9303. These
have the same SoC differ in the Ethernet switch/SERDES arrangement.

Currently the only supported features are the syscon-reboot and i2c
controllers. The syscon-reboot is needed to be able to reboot the board.
The I2C controllers are slightly unusual because they each own an SCL
pin (GPIO8 for the first controller, GPIO 17 for the second) but have 8
common SDA pins which can be assigned to either controller (but not
both).

Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz>
---

Notes:
    Changes in v6:
    - Drop wildcard compatible
    - Add specific compatibles for the 4 known SoC variants
    - For the i2c part of the binding accept realtek,rtl9301 as a fallback
      for the other compatibles
    - The overall switches will eventually differ because these will have
      different SERDES/port arrangements so they aren't getting the same
      fallback treatment
    Changes in v5:
      I've combined the two series I had in flight so this is the
      combination of adding the switch syscon, the reboot and i2c. It makes
      the changelog a bit meaningless so I've dropped the earlier
      commentary.
    
      As requested I've put a more complete example in the main
      rtl9300-switch.yaml.
    
      I've kept rtl9300-i2c.yaml separate for now but link to it with a $ref
      from rtl9300-switch.yaml to reduce clutter. The example in
      rtl9300-i2c.yaml is technically duplicating part of the example from
      rtl9300-switch.yaml but I feel it's nice to be able to see the example
      next to where the properties are defined.

 .../bindings/i2c/realtek,rtl9301-i2c.yaml     |  99 +++++++++++++++
 .../bindings/mfd/realtek,rtl9301-switch.yaml  | 114 ++++++++++++++++++
 2 files changed, 213 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/i2c/realtek,rtl9301-i2c.yaml
 create mode 100644 Documentation/devicetree/bindings/mfd/realtek,rtl9301-switch.yaml

diff --git a/Documentation/devicetree/bindings/i2c/realtek,rtl9301-i2c.yaml b/Documentation/devicetree/bindings/i2c/realtek,rtl9301-i2c.yaml
new file mode 100644
index 000000000000..446503961e4e
--- /dev/null
+++ b/Documentation/devicetree/bindings/i2c/realtek,rtl9301-i2c.yaml
@@ -0,0 +1,99 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/i2c/realtek,rtl9301-i2c.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Realtek RTL I2C Controller
+
+maintainers:
+  - Chris Packham <chris.packham@alliedtelesis.co.nz>
+
+description:
+  The RTL9300 SoC has two I2C controllers. Each of these has an SCL line (which
+  if not-used for SCL can be a GPIO). There are 8 common SDA lines that can be
+  assigned to either I2C controller.
+
+properties:
+  compatible:
+    oneOf:
+      - items:
+          - enum:
+              - realtek,rtl9302b-i2c
+              - realtek,rtl9302c-i2c
+              - realtek,rtl9303-i2c
+          - const: realtek,rtl9301-i2c
+      - const: realtek,rtl9301-i2c
+
+  reg:
+    description: Register offset and size this I2C controller.
+
+  "#address-cells":
+    const: 1
+
+  "#size-cells":
+    const: 0
+
+patternProperties:
+  '^i2c@[0-7]$':
+    $ref: /schemas/i2c/i2c-controller.yaml
+    unevaluatedProperties: false
+
+    properties:
+      reg:
+        description: The SDA pin associated with the I2C bus.
+        maxItems: 1
+
+    required:
+      - reg
+
+required:
+  - compatible
+  - reg
+
+unevaluatedProperties: false
+
+examples:
+  - |
+    i2c@36c {
+      compatible = "realtek,rtl9301-i2c";
+      reg = <0x36c 0x14>;
+      #address-cells = <1>;
+      #size-cells = <0>;
+
+      i2c@0 {
+        reg = <0>;
+        #address-cells = <1>;
+        #size-cells = <0>;
+        gpio@20 {
+          compatible = "nxp,pca9555";
+          gpio-controller;
+          #gpio-cells = <2>;
+          reg = <0x20>;
+        };
+      };
+
+      i2c@2 {
+        reg = <2>;
+        #address-cells = <1>;
+        #size-cells = <0>;
+        gpio@20 {
+          compatible = "nxp,pca9555";
+          gpio-controller;
+          #gpio-cells = <2>;
+          reg = <0x20>;
+        };
+      };
+    };
+    i2c@388 {
+      compatible = "realtek,rtl9301-i2c";
+      reg = <0x388 0x14>;
+      #address-cells = <1>;
+      #size-cells = <0>;
+
+      i2c@7 {
+        reg = <7>;
+        #address-cells = <1>;
+        #size-cells = <0>;
+      };
+    };
diff --git a/Documentation/devicetree/bindings/mfd/realtek,rtl9301-switch.yaml b/Documentation/devicetree/bindings/mfd/realtek,rtl9301-switch.yaml
new file mode 100644
index 000000000000..f053303ab1e6
--- /dev/null
+++ b/Documentation/devicetree/bindings/mfd/realtek,rtl9301-switch.yaml
@@ -0,0 +1,114 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/mfd/realtek,rtl9301-switch.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Realtek Switch with Internal CPU
+
+maintainers:
+  - Chris Packham <chris.packham@alliedtelesis.co.nz>
+
+description:
+  The RTL9300 is a series of is an Ethernet switches with an integrated CPU. A
+  number of different peripherals are accessed through a common register block,
+  represented here as a syscon node.
+
+properties:
+  compatible:
+    items:
+      - enum:
+          - realtek,rtl9301-switch
+          - realtek,rtl9302b-switch
+          - realtek,rtl9302c-switch
+          - realtek,rtl9303-switch
+      - const: syscon
+      - const: simple-mfd
+
+  reg:
+    maxItems: 1
+
+  '#address-cells':
+    const: 1
+
+  '#size-cells':
+    const: 1
+
+patternProperties:
+  'reboot@[0-9a-f]+$':
+    $ref: /schemas/power/reset/syscon-reboot.yaml#
+
+  'i2c@[0-9a-f]+$':
+    $ref: /schemas/i2c/realtek,rtl9301-i2c.yaml#
+
+required:
+  - compatible
+  - reg
+
+additionalProperties: false
+
+examples:
+  - |
+    ethernet-switch@1b000000 {
+      compatible = "realtek,rtl9301-switch", "syscon", "simple-mfd";
+      reg = <0x1b000000 0x10000>;
+      #address-cells = <1>;
+      #size-cells = <1>;
+
+      reboot@c {
+        compatible = "syscon-reboot";
+        reg = <0x0c 0x4>;
+        value = <0x01>;
+      };
+
+      i2c@36c {
+        compatible = "realtek,rtl9301-i2c";
+        reg = <0x36c 0x14>;
+        #address-cells = <1>;
+        #size-cells = <0>;
+
+        i2c@0 {
+          reg = <0>;
+          #address-cells = <1>;
+          #size-cells = <0>;
+          gpio@20 {
+            compatible = "nxp,pca9555";
+            gpio-controller;
+            #gpio-cells = <2>;
+            reg = <0x20>;
+          };
+        };
+
+        i2c@2 {
+          reg = <2>;
+          #address-cells = <1>;
+          #size-cells = <0>;
+          gpio@20 {
+            compatible = "nxp,pca9555";
+            gpio-controller;
+            #gpio-cells = <2>;
+            reg = <0x20>;
+          };
+        };
+      };
+
+      i2c@388 {
+        compatible = "realtek,rtl9301-i2c";
+        reg = <0x388 0x14>;
+        #address-cells = <1>;
+        #size-cells = <0>;
+
+        i2c@7 {
+          reg = <7>;
+          #address-cells = <1>;
+          #size-cells = <0>;
+          gpio@20 {
+            compatible = "nxp,pca9555";
+            gpio-controller;
+            #gpio-cells = <2>;
+            reg = <0x20>;
+          };
+        };
+      };
+    };
+
-- 
2.47.0
Re: [PATCH v6 3/6] dt-bindings: mfd: Add Realtek RTL9300 switch peripherals
Posted by Krzysztof Kozlowski 1 month, 1 week ago
On Wed, Oct 16, 2024 at 11:59:45AM +1300, Chris Packham wrote:
> +properties:
> +  compatible:
> +    oneOf:
> +      - items:
> +          - enum:
> +              - realtek,rtl9302b-i2c
> +              - realtek,rtl9302c-i2c
> +              - realtek,rtl9303-i2c
> +          - const: realtek,rtl9301-i2c
> +      - const: realtek,rtl9301-i2c
> +
> +  reg:
> +    description: Register offset and size this I2C controller.
> +
> +  "#address-cells":
> +    const: 1
> +
> +  "#size-cells":
> +    const: 0
> +
> +patternProperties:
> +  '^i2c@[0-7]$':
> +    $ref: /schemas/i2c/i2c-controller.yaml
> +    unevaluatedProperties: false
> +
> +    properties:
> +      reg:
> +        description: The SDA pin associated with the I2C bus.
> +        maxItems: 1
> +
> +    required:
> +      - reg
> +
> +required:
> +  - compatible
> +  - reg
> +
> +unevaluatedProperties: false

This has to be: additionalProperties: false

> +
> +examples:
> +  - |
> +    i2c@36c {
> +      compatible = "realtek,rtl9301-i2c";
> +      reg = <0x36c 0x14>;
> +      #address-cells = <1>;
> +      #size-cells = <0>;
> +
> +      i2c@0 {
> +        reg = <0>;
> +        #address-cells = <1>;
> +        #size-cells = <0>;
> +        gpio@20 {
> +          compatible = "nxp,pca9555";
> +          gpio-controller;
> +          #gpio-cells = <2>;
> +          reg = <0x20>;
> +        };
> +      };
> +
> +      i2c@2 {
> +        reg = <2>;
> +        #address-cells = <1>;
> +        #size-cells = <0>;
> +        gpio@20 {
> +          compatible = "nxp,pca9555";
> +          gpio-controller;
> +          #gpio-cells = <2>;
> +          reg = <0x20>;
> +        };
> +      };
> +    };
> +    i2c@388 {
> +      compatible = "realtek,rtl9301-i2c";
> +      reg = <0x388 0x14>;
> +      #address-cells = <1>;
> +      #size-cells = <0>;
> +
> +      i2c@7 {
> +        reg = <7>;
> +        #address-cells = <1>;
> +        #size-cells = <0>;
> +      };
> +    };

Yoy have now multiple same examples. Keep only one, complete in the parent
schema.

> diff --git a/Documentation/devicetree/bindings/mfd/realtek,rtl9301-switch.yaml b/Documentation/devicetree/bindings/mfd/realtek,rtl9301-switch.yaml
> new file mode 100644
> index 000000000000..f053303ab1e6
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/mfd/realtek,rtl9301-switch.yaml
> @@ -0,0 +1,114 @@
> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> +%YAML 1.2

Best regards,
Krzysztof
Re: [PATCH v6 3/6] dt-bindings: mfd: Add Realtek RTL9300 switch peripherals
Posted by Chris Packham 1 month, 1 week ago
On 16/10/24 19:41, Krzysztof Kozlowski wrote:
> On Wed, Oct 16, 2024 at 11:59:45AM +1300, Chris Packham wrote:
>> +properties:
>> +  compatible:
>> +    oneOf:
>> +      - items:
>> +          - enum:
>> +              - realtek,rtl9302b-i2c
>> +              - realtek,rtl9302c-i2c
>> +              - realtek,rtl9303-i2c
>> +          - const: realtek,rtl9301-i2c
>> +      - const: realtek,rtl9301-i2c
>> +
>> +  reg:
>> +    description: Register offset and size this I2C controller.
>> +
>> +  "#address-cells":
>> +    const: 1
>> +
>> +  "#size-cells":
>> +    const: 0
>> +
>> +patternProperties:
>> +  '^i2c@[0-7]$':
>> +    $ref: /schemas/i2c/i2c-controller.yaml
>> +    unevaluatedProperties: false
>> +
>> +    properties:
>> +      reg:
>> +        description: The SDA pin associated with the I2C bus.
>> +        maxItems: 1
>> +
>> +    required:
>> +      - reg
>> +
>> +required:
>> +  - compatible
>> +  - reg
>> +
>> +unevaluatedProperties: false
> This has to be: additionalProperties: false

Hmm, when I do that the dt_binding_check complains

Documentation/devicetree/bindings/mfd/realtek,rtl9301-switch.example.dtb: 
ethernet-switch@1b000000: i2c@36c:i2c@0: '#address-cells', 
'#size-cells', 'gpio@20' do not match any of the regexes: 'pinctrl-[0-9]+'
         from schema $id: 
http://devicetree.org/schemas/mfd/realtek,rtl9301-switch.yaml#
Documentation/devicetree/bindings/mfd/realtek,rtl9301-switch.example.dtb: 
ethernet-switch@1b000000: i2c@36c:i2c@2: '#address-cells', 
'#size-cells', 'gpio@20' do not match any of the regexes: 'pinctrl-[0-9]+'
         from schema $id: 
http://devicetree.org/schemas/mfd/realtek,rtl9301-switch.yaml#
Documentation/devicetree/bindings/mfd/realtek,rtl9301-switch.example.dtb: 
ethernet-switch@1b000000: i2c@388:i2c@7: '#address-cells', 
'#size-cells', 'gpio@20' do not match any of the regexes: 'pinctrl-[0-9]+'
         from schema $id: 
http://devicetree.org/schemas/mfd/realtek,rtl9301-switch.yaml#
Documentation/devicetree/bindings/mfd/realtek,rtl9301-switch.example.dtb: 
i2c@36c: i2c@0: '#address-cells', '#size-cells', 'gpio@20' do not match 
any of the regexes: 'pinctrl-[0-9]+'
         from schema $id: 
http://devicetree.org/schemas/i2c/realtek,rtl9301-i2c.yaml#
Documentation/devicetree/bindings/mfd/realtek,rtl9301-switch.example.dtb: 
i2c@36c: i2c@2: '#address-cells', '#size-cells', 'gpio@20' do not match 
any of the regexes: 'pinctrl-[0-9]+'
         from schema $id: 
http://devicetree.org/schemas/i2c/realtek,rtl9301-i2c.yaml#
Documentation/devicetree/bindings/mfd/realtek,rtl9301-switch.example.dtb: 
i2c@388: i2c@7: '#address-cells', '#size-cells', 'gpio@20' do not match 
any of the regexes: 'pinctrl-[0-9]+'
         from schema $id: 
http://devicetree.org/schemas/i2c/realtek,rtl9301-i2c.yaml#

Those properties should be getting defined via the i2c-controller.yaml 
schema so I must be missing something, I'm just not sure what.

>
>> +
>> +examples:
>> +  - |
>> +    i2c@36c {
>> +      compatible = "realtek,rtl9301-i2c";
>> +      reg = <0x36c 0x14>;
>> +      #address-cells = <1>;
>> +      #size-cells = <0>;
>> +
>> +      i2c@0 {
>> +        reg = <0>;
>> +        #address-cells = <1>;
>> +        #size-cells = <0>;
>> +        gpio@20 {
>> +          compatible = "nxp,pca9555";
>> +          gpio-controller;
>> +          #gpio-cells = <2>;
>> +          reg = <0x20>;
>> +        };
>> +      };
>> +
>> +      i2c@2 {
>> +        reg = <2>;
>> +        #address-cells = <1>;
>> +        #size-cells = <0>;
>> +        gpio@20 {
>> +          compatible = "nxp,pca9555";
>> +          gpio-controller;
>> +          #gpio-cells = <2>;
>> +          reg = <0x20>;
>> +        };
>> +      };
>> +    };
>> +    i2c@388 {
>> +      compatible = "realtek,rtl9301-i2c";
>> +      reg = <0x388 0x14>;
>> +      #address-cells = <1>;
>> +      #size-cells = <0>;
>> +
>> +      i2c@7 {
>> +        reg = <7>;
>> +        #address-cells = <1>;
>> +        #size-cells = <0>;
>> +      };
>> +    };
> Yoy have now multiple same examples. Keep only one, complete in the parent
> schema.

OK. I'll keep one example of a controller with a non-zero channel in the 
i2c binding and leave a more complete example in the mfd.

>> diff --git a/Documentation/devicetree/bindings/mfd/realtek,rtl9301-switch.yaml b/Documentation/devicetree/bindings/mfd/realtek,rtl9301-switch.yaml
>> new file mode 100644
>> index 000000000000..f053303ab1e6
>> --- /dev/null
>> +++ b/Documentation/devicetree/bindings/mfd/realtek,rtl9301-switch.yaml
>> @@ -0,0 +1,114 @@
>> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
>> +%YAML 1.2
> Best regards,
> Krzysztof
>
Re: [PATCH v6 3/6] dt-bindings: mfd: Add Realtek RTL9300 switch peripherals
Posted by Chris Packham 1 month, 1 week ago
On 17/10/24 08:50, Chris Packham wrote:
>
> On 16/10/24 19:41, Krzysztof Kozlowski wrote:
>> On Wed, Oct 16, 2024 at 11:59:45AM +1300, Chris Packham wrote:
>>> +properties:
>>> +  compatible:
>>> +    oneOf:
>>> +      - items:
>>> +          - enum:
>>> +              - realtek,rtl9302b-i2c
>>> +              - realtek,rtl9302c-i2c
>>> +              - realtek,rtl9303-i2c
>>> +          - const: realtek,rtl9301-i2c
>>> +      - const: realtek,rtl9301-i2c
>>> +
>>> +  reg:
>>> +    description: Register offset and size this I2C controller.
>>> +
>>> +  "#address-cells":
>>> +    const: 1
>>> +
>>> +  "#size-cells":
>>> +    const: 0
>>> +
>>> +patternProperties:
>>> +  '^i2c@[0-7]$':
>>> +    $ref: /schemas/i2c/i2c-controller.yaml
>>> +    unevaluatedProperties: false
>>> +
>>> +    properties:
>>> +      reg:
>>> +        description: The SDA pin associated with the I2C bus.
>>> +        maxItems: 1
>>> +
>>> +    required:
>>> +      - reg
>>> +
>>> +required:
>>> +  - compatible
>>> +  - reg
>>> +
>>> +unevaluatedProperties: false
>> This has to be: additionalProperties: false
>
> Hmm, when I do that the dt_binding_check complains
>
> Documentation/devicetree/bindings/mfd/realtek,rtl9301-switch.example.dtb: 
> ethernet-switch@1b000000: i2c@36c:i2c@0: '#address-cells', 
> '#size-cells', 'gpio@20' do not match any of the regexes: 
> 'pinctrl-[0-9]+'
>         from schema $id: 
> http://devicetree.org/schemas/mfd/realtek,rtl9301-switch.yaml#
> Documentation/devicetree/bindings/mfd/realtek,rtl9301-switch.example.dtb: 
> ethernet-switch@1b000000: i2c@36c:i2c@2: '#address-cells', 
> '#size-cells', 'gpio@20' do not match any of the regexes: 
> 'pinctrl-[0-9]+'
>         from schema $id: 
> http://devicetree.org/schemas/mfd/realtek,rtl9301-switch.yaml#
> Documentation/devicetree/bindings/mfd/realtek,rtl9301-switch.example.dtb: 
> ethernet-switch@1b000000: i2c@388:i2c@7: '#address-cells', 
> '#size-cells', 'gpio@20' do not match any of the regexes: 
> 'pinctrl-[0-9]+'
>         from schema $id: 
> http://devicetree.org/schemas/mfd/realtek,rtl9301-switch.yaml#
> Documentation/devicetree/bindings/mfd/realtek,rtl9301-switch.example.dtb: 
> i2c@36c: i2c@0: '#address-cells', '#size-cells', 'gpio@20' do not 
> match any of the regexes: 'pinctrl-[0-9]+'
>         from schema $id: 
> http://devicetree.org/schemas/i2c/realtek,rtl9301-i2c.yaml#
> Documentation/devicetree/bindings/mfd/realtek,rtl9301-switch.example.dtb: 
> i2c@36c: i2c@2: '#address-cells', '#size-cells', 'gpio@20' do not 
> match any of the regexes: 'pinctrl-[0-9]+'
>         from schema $id: 
> http://devicetree.org/schemas/i2c/realtek,rtl9301-i2c.yaml#
> Documentation/devicetree/bindings/mfd/realtek,rtl9301-switch.example.dtb: 
> i2c@388: i2c@7: '#address-cells', '#size-cells', 'gpio@20' do not 
> match any of the regexes: 'pinctrl-[0-9]+'
>         from schema $id: 
> http://devicetree.org/schemas/i2c/realtek,rtl9301-i2c.yaml#
>
> Those properties should be getting defined via the i2c-controller.yaml 
> schema so I must be missing something, I'm just not sure what.

Silly me. I removed the wrong unevaluatedProperties. If I fix up the one 
you actually pointed out it's fine. v7 coming soon.

>
>>
>>> +
>>> +examples:
>>> +  - |
>>> +    i2c@36c {
>>> +      compatible = "realtek,rtl9301-i2c";
>>> +      reg = <0x36c 0x14>;
>>> +      #address-cells = <1>;
>>> +      #size-cells = <0>;
>>> +
>>> +      i2c@0 {
>>> +        reg = <0>;
>>> +        #address-cells = <1>;
>>> +        #size-cells = <0>;
>>> +        gpio@20 {
>>> +          compatible = "nxp,pca9555";
>>> +          gpio-controller;
>>> +          #gpio-cells = <2>;
>>> +          reg = <0x20>;
>>> +        };
>>> +      };
>>> +
>>> +      i2c@2 {
>>> +        reg = <2>;
>>> +        #address-cells = <1>;
>>> +        #size-cells = <0>;
>>> +        gpio@20 {
>>> +          compatible = "nxp,pca9555";
>>> +          gpio-controller;
>>> +          #gpio-cells = <2>;
>>> +          reg = <0x20>;
>>> +        };
>>> +      };
>>> +    };
>>> +    i2c@388 {
>>> +      compatible = "realtek,rtl9301-i2c";
>>> +      reg = <0x388 0x14>;
>>> +      #address-cells = <1>;
>>> +      #size-cells = <0>;
>>> +
>>> +      i2c@7 {
>>> +        reg = <7>;
>>> +        #address-cells = <1>;
>>> +        #size-cells = <0>;
>>> +      };
>>> +    };
>> Yoy have now multiple same examples. Keep only one, complete in the 
>> parent
>> schema.
>
> OK. I'll keep one example of a controller with a non-zero channel in 
> the i2c binding and leave a more complete example in the mfd.
>
>>> diff --git 
>>> a/Documentation/devicetree/bindings/mfd/realtek,rtl9301-switch.yaml 
>>> b/Documentation/devicetree/bindings/mfd/realtek,rtl9301-switch.yaml
>>> new file mode 100644
>>> index 000000000000..f053303ab1e6
>>> --- /dev/null
>>> +++ b/Documentation/devicetree/bindings/mfd/realtek,rtl9301-switch.yaml
>>> @@ -0,0 +1,114 @@
>>> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
>>> +%YAML 1.2
>> Best regards,
>> Krzysztof
>>